I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vdGltZXIuaD4KCiNpbmNsdWRlICJjcHUuaCIKCi8qCiAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCiAqLwpzdGF0aWMgdm9pZCBfX2NwdWluaXQgZG9fY3lyaXhfZGV2aWQodW5zaWduZWQgY2hhciAqZGlyMCwgdW5zaWduZWQgY2hhciAqZGlyMSkKewoJdW5zaWduZWQgY2hhciBjY3IyLCBjY3IzOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQoJLyogd2UgdGVzdCBmb3IgREVWSUQgYnkgY2hlY2tpbmcgd2hldGhlciBDQ1IzIGlzIHdyaXRhYmxlICovCglsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMgXiAweDgwKTsKCWdldEN4ODYoMHhjMCk7ICAgLyogZHVtbXkgdG8gY2hhbmdlIGJ1cyAqLwoKCWlmIChnZXRDeDg2KENYODZfQ0NSMykgPT0gY2NyMykgeyAgICAgICAvKiBubyBERVZJRCByZWdzLiAqLwoJCWNjcjIgPSBnZXRDeDg2KENYODZfQ0NSMik7CgkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIgXiAweDA0KTsKCQlnZXRDeDg2KDB4YzApOyAgLyogZHVtbXkgKi8KCgkJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IyKSA9PSBjY3IyKSAvKiBvbGQgQ3g0ODZTTEMvRExDICovCgkJCSpkaXIwID0gMHhmZDsKCQllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN4NDg2UyBBIHN0ZXAgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIpOwoJCQkqZGlyMCA9IDB4ZmU7CgkJfQoJfQoJZWxzZSB7CgkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgLyogcmVzdG9yZSBDQ1IzICovCgoJCS8qIHJlYWQgRElSMCBhbmQgRElSMSBDUFUgcmVnaXN0ZXJzICovCgkJKmRpcjAgPSBnZXRDeDg2KENYODZfRElSMCk7CgkJKmRpcjEgPSBnZXRDeDg2KENYODZfRElSMSk7Cgl9Cglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cn0KCi8qCiAqIEN4ODZfZGlyMF9tc2IgaXMgYSBIQUNLIG5lZWRlZCBieSBjaGVja19jeDY4Nl9jcHVpZC9zbG9wIGluIGJ1Z3MuaCBpbgogKiBvcmRlciB0byBpZGVudGlmeSB0aGUgQ3lyaXggQ1BVIG1vZGVsIGFmdGVyIHdlJ3JlIG91dCBvZiBzZXR1cC5jCiAqCiAqIEFjdHVhbGx5IHNpbmNlIGJ1Z3MuaCBkb2Vzbid0IGV2ZW4gcmVmZXJlbmNlIHRoaXMgcGVyaGFwcyBzb21lb25lIHNob3VsZAogKiBmaXggdGhlIGRvY3VtZW50YXRpb24gPz8/CiAqLwpzdGF0aWMgdW5zaWduZWQgY2hhciBDeDg2X2RpcjBfbXNiIF9fY3B1aW5pdGRhdGEgPSAwOwoKc3RhdGljIGNoYXIgQ3g4Nl9tb2RlbFtdWzldIF9fY3B1aW5pdGRhdGEgPSB7CgkiQ3g0ODYiLCAiQ3g0ODYiLCAiNXg4NiAiLCAiNng4NiIsICJNZWRpYUdYICIsICI2eDg2TVggIiwKCSJNIElJICIsICJVbmtub3duIgp9OwpzdGF0aWMgY2hhciBDeDQ4Nl9uYW1lW11bNV0gX19jcHVpbml0ZGF0YSA9IHsKCSJTTEMiLCAiRExDIiwgIlNMQzIiLCAiRExDMiIsICJTUngiLCAiRFJ4IiwKCSJTUngyIiwgIkRSeDIiCn07CnN0YXRpYyBjaGFyIEN4NDg2U19uYW1lW11bNF0gX19jcHVpbml0ZGF0YSA9IHsKCSJTIiwgIlMyIiwgIlNlIiwgIlMyZSIKfTsKc3RhdGljIGNoYXIgQ3g0ODZEX25hbWVbXVs0XSBfX2NwdWluaXRkYXRhID0gewoJIkRYIiwgIkRYMiIsICI/IiwgIj8iLCAiPyIsICJEWDQiCn07CnN0YXRpYyBjaGFyIEN4ODZfY2JbXSBfX2NwdWluaXRkYXRhID0gIj8uNXggQ29yZS9CdXMgQ2xvY2siOwpzdGF0aWMgY2hhciBjeXJpeF9tb2RlbF9tdWx0MVtdIF9fY3B1aW5pdGRhdGEgPSAiMTI/PzQzIjsKc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDJbXSBfX2NwdWluaXRkYXRhID0gIjEyMjMzNDQ1IjsKCi8qCiAqIFJlc2V0IHRoZSBzbG93LWxvb3AgKFNMT1ApIGJpdCBvbiB0aGUgNjg2KEwpIHdoaWNoIGlzIHNldCBieSBzb21lIG9sZAogKiBCSU9TZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBET1MgZ2FtZXMuICBUaGlzIG1ha2VzIHRoZSB1ZGVsYXkgbG9vcAogKiB3b3JrIGNvcnJlY3RseSwgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlLgogKgogKiBGSVhNRTogb3VyIG5ld2VyIHVkZWxheSB1c2VzIHRoZSB0c2MuIFdlIGRvbid0IG5lZWQgdG8gZnJvYiB3aXRoIFNMT1AKICovCgpleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCkgX19pbml0OwoKc3RhdGljIHZvaWQgX19jcHVpbml0IGNoZWNrX2N4Njg2X3Nsb3Aoc3RydWN0IGNwdWluZm9feDg2ICpjKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglpZiAoQ3g4Nl9kaXIwX21zYiA9PSAzKSB7CgkJdW5zaWduZWQgY2hhciBjY3IzLCBjY3I1OwoKCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgkJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCgkJY2NyNSA9IGdldEN4ODYoQ1g4Nl9DQ1I1KTsKCQlpZiAoY2NyNSAmIDIpCgkJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3I1ICYgMHhmZCk7ICAvKiByZXNldCBTTE9QICovCgkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBNQVBFTiAqLwoJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCgkJaWYgKGNjcjUgJiAyKSB7IC8qIHBvc3NpYmxlIHdyb25nIGNhbGlicmF0aW9uIGRvbmUgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjYWxpYnJhdGluZyBkZWxheSBsb29wIHdpdGggU0xPUCBiaXQgcmVzZXRcbiIpOwoJCQljYWxpYnJhdGVfZGVsYXkoKTsKCQkJYy0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwoJCX0KCX0KfQoKCnN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXRfY3g4Nl9yZW9yZGVyKHZvaWQpCnsKCXU4IGNjcjM7CgoJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIE1lbW9yeSBhY2Nlc3MgcmVvcmRlciBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOoCAqLwoKCS8qIExvYWQvU3RvcmUgU2VyaWFsaXplIHRvIG1lbSBhY2Nlc3MgZGlzYWJsZSAoPXJlb3JkZXIgaXQpoCAqLwoJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSAmIH4weDgwKTsKCS8qIHNldCBsb2FkL3N0b3JlIHNlcmlhbGl6ZSBmcm9tIDFHQiB0byA0R0IgKi8KCWNjcjMgfD0gMHhlMDsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsKfQoKc3RhdGljIHZvaWQgX19jcHVpbml0IHNldF9jeDg2X21lbXdiKHZvaWQpCnsKCXUzMiBjcjA7CgoJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIE1lbW9yeS1Xcml0ZS1iYWNrIG1vZGUgb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOwoKCS8qIENDUjIgYml0IDI6IHVubG9jayBOVyBiaXQgKi8KCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgJiB+MHgwNCk7CgkvKiBzZXQgJ05vdCBXcml0ZS10aHJvdWdoJyAqLwoJY3IwID0gMHgyMDAwMDAwMDsKCXdyaXRlX2NyMChyZWFkX2NyMCgpIHwgY3IwKTsKCS8qIENDUjIgYml0IDI6IGxvY2sgTlcgYml0IGFuZCBzZXQgV1QxICovCglzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpIHwgMHgxNCApOwp9CgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgc2V0X2N4ODZfaW5jKHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgY2NyMzsKCglwcmludGsoS0VSTl9JTkZPICJFbmFibGUgSW5jcmVtZW50b3Igb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOwoKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU6gICovCgkvKiBQQ1IxIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KCS8qIEluY3JlbWVudG9yIG9uLCB3aGF0ZXZlciB0aGF0IGlzICovCglzZXRDeDg2KENYODZfUENSMSwgZ2V0Q3g4NihDWDg2X1BDUjEpIHwgMHgwMik7CgkvKiBQQ1IwIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KCS8qIEluY3JlbWVudG9yIE1hcmdpbiAxMCAqLwoJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSB8IDB4MDQpOyAKCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsJLyogZGlzYWJsZSBNQVBFTiAqLwp9CgovKgogKglDb25maWd1cmUgbGF0ZXIgTWVkaWFHWCBhbmQvb3IgR2VvZGUgcHJvY2Vzc29yLgogKi8KCnN0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZW9kZV9jb25maWd1cmUodm9pZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXU4IGNjcjMsIGNjcjQ7Cglsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgoJLyogU3VzcGVuZCBvbiBoYWx0IHBvd2VyIHNhdmluZyBhbmQgZW5hYmxlICNTVVNQIHBpbiAqLwoJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4ODgpOwoKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOwkvKiBFbmFibGUgKi8KCQoJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKCWNjcjQgfD0gMHgzODsJCS8qIEZQVSBmYXN0LCBEVEUgY2FjaGUsIE1lbSBieXBhc3MgKi8KCQoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwoJCglzZXRfY3g4Nl9tZW13YigpOwoJc2V0X2N4ODZfcmVvcmRlcigpOwkKCXNldF9jeDg2X2luYygpOwoJCglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cn0KCgojaWZkZWYgQ09ORklHX1BDSQpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19jcHVpbml0ZGF0YSBjeXJpeF81NXgwW10gPSB7Cgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwKSB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkgfSwKCXsgfSwKfTsKI2VuZGlmCgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCnsKCXVuc2lnbmVkIGNoYXIgZGlyMCwgZGlyMF9tc24sIGRpcjBfbHNuLCBkaXIxID0gMDsKCWNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKCWNvbnN0IGNoYXIgKnAgPSBOVUxMOwoKCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CgkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KCWNsZWFyX2JpdCgwKjMyKzMxLCBjLT54ODZfY2FwYWJpbGl0eSk7CgoJLyogQ3lyaXggdXNlZCBiaXQgMjQgaW4gZXh0ZW5kZWQgKEFNRCkgQ1BVSUQgZm9yIEN5cml4IE1NWCBleHRlbnNpb25zICovCglpZiAoIHRlc3RfYml0KDEqMzIrMjQsIGMtPng4Nl9jYXBhYmlsaXR5KSApIHsKCQljbGVhcl9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1hNTVgsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCX0KCglkb19jeXJpeF9kZXZpZCgmZGlyMCwgJmRpcjEpOwoKCWNoZWNrX2N4Njg2X3Nsb3AoYyk7CgoJQ3g4Nl9kaXIwX21zYiA9IGRpcjBfbXNuID0gZGlyMCA+PiA0OyAvKiBpZGVudGlmaWVzIENQVSAiZmFtaWx5IiAgICovCglkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KCgkvKiBjb21tb24gY2FzZSBzdGVwIG51bWJlci9yZXYgLS0gZXhjZXB0aW9ucyBoYW5kbGVkIGJlbG93ICovCgljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CgljLT54ODZfbWFzayA9IGRpcjEgJiAweGY7CgoJLyogTm93IGNvb2s7IHRoZSBvcmlnaW5hbCByZWNpcGUgaXMgYnkgQ2hhbm5pbmcgQ29ybiwgZnJvbSBDeXJpeC4KCSAqIFdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBlYWNoIGdlbmVyYXRpb246IHdlIHdvcmsgb3V0CgkgKiB0aGUgbW9kZWwsIG11bHRpcGxpZXIgYW5kIHN0ZXBwaW5nLiAgQmxhY2sgbWFnaWMgaW5jbHVkZWQsCgkgKiB0byBtYWtlIHRoZSBzaWxpY29uIHN0ZXAvcmV2IG51bWJlcnMgbWF0Y2ggdGhlIHByaW50ZWQgb25lcy4KCSAqLwoJIAoJc3dpdGNoIChkaXIwX21zbikgewoJCXVuc2lnbmVkIGNoYXIgdG1wOwoKCWNhc2UgMDogLyogQ3g0ODZTTEMvRExDL1NSeC9EUnggKi8KCQlwID0gQ3g0ODZfbmFtZVtkaXIwX2xzbiAmIDddOwoJCWJyZWFrOwoKCWNhc2UgMTogLyogQ3g0ODZTL0RYL0RYMi9EWDQgKi8KCQlwID0gKGRpcjBfbHNuICYgOCkgPyBDeDQ4NkRfbmFtZVtkaXIwX2xzbiAmIDVdCgkJCTogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKCQlicmVhazsKCgljYXNlIDI6IC8qIDV4ODYgKi8KCQlDeDg2X2NiWzJdID0gY3lyaXhfbW9kZWxfbXVsdDFbZGlyMF9sc24gJiA1XTsKCQlwID0gQ3g4Nl9jYisyOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogNng4Ni82eDg2TCAqLwoJCUN4ODZfY2JbMV0gPSAnICc7CgkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CgkJaWYgKGRpcjEgPiAweDIxKSB7IC8qIDY4NkwgKi8KCQkJQ3g4Nl9jYlswXSA9ICdMJzsKCQkJcCA9IEN4ODZfY2I7CgkJCShjLT54ODZfbW9kZWwpKys7CgkJfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLwoJCQlwID0gQ3g4Nl9jYisxOwoJCS8qIEVtdWxhdGUgTVRSUnMgdXNpbmcgQ3lyaXgncyBBUlJzLiAqLwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CgkJLyogNng4NidzIGNvbnRhaW4gdGhpcyBidWcgKi8KCQljLT5jb21hX2J1ZyA9IDE7CgkJYnJlYWs7CgoJY2FzZSA0OiAvKiBNZWRpYUdYL0dYbSBvciBHZW9kZSBHWE0vR1hMVi9HWDEgKi8KI2lmZGVmIENPTkZJR19QQ0kKCQkvKiBJdCBpc24ndCByZWFsbHkgYSBQQ0kgcXVpcmsgZGlyZWN0bHksIGJ1dCB0aGUgY3VyZSBpcyB0aGUKCQkgICBzYW1lLiBUaGUgTWVkaWFHWCBoYXMgZGVlcCBtYWdpYyBTTU0gc3R1ZmYgdGhhdCBoYW5kbGVzIHRoZQoJCSAgIFNCIGVtdWxhdGlvbi4gSXQgdGhvd3MgYXdheSB0aGUgZmlmbyBvbiBkaXNhYmxlX2RtYSgpIHdoaWNoCgkJICAgaXMgd3JvbmcgYW5kIHJ1aW5zIHRoZSBhdWRpby4gCgoJCSAgIEJ1ZzI6IFZTQTEgaGFzIGEgd3JhcCBidWcgc28gdGhhdCB1c2luZyBtYXhpbXVtIHNpemVkIERNQSAKCQkgICBjYXVzZXMgYmFkIHRoaW5ncy4gQWNjb3JkaW5nIHRvIE5hdFNlbWkgVlNBMiBoYXMgYW5vdGhlcgoJCSAgIGJ1ZyB0byBkbyB3aXRoICdobHQnLiBJJ3ZlIG5vdCBzZWVuIGFueSBib2FyZHMgdXNpbmcgVlNBMgoJCSAgIGFuZCBYIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IGl0IGVpdGhlciBzbyB3aG8gY2FyZXMgOCkuCgkJICAgVlNBMSB3ZSB3b3JrIGFyb3VuZCBob3dldmVyLgoJCSovCgoJCXByaW50ayhLRVJOX0lORk8gIldvcmtpbmcgYXJvdW5kIEN5cml4IE1lZGlhR1ggdmlydHVhbCBETUEgYnVncy5cbiIpOwoJCWlzYV9kbWFfYnJpZGdlX2J1Z2d5ID0gMjsKCgoJCS8qCgkJICogIFRoZSA1NTEwLzU1MjAgY29tcGFuaW9uIGNoaXBzIGhhdmUgYSBmdW5reSBQSVQuCgkJICovICAKCQlpZiAocGNpX2Rldl9wcmVzZW50KGN5cml4XzU1eDApKQoJCQlwaXRfbGF0Y2hfYnVnZ3kgPSAxOwojZW5kaWYKCQljLT54ODZfY2FjaGVfc2l6ZT0xNjsJLyogWWVwIDE2SyBpbnRlZ3JhdGVkIGNhY2hlIHRoYXRzIGl0ICovCgoJCS8qIEdYbSBzdXBwb3J0cyBleHRlbmRlZCBjcHVpZCBsZXZlbHMgJ2FsYScgQU1EICovCgkJaWYgKGMtPmNwdWlkX2xldmVsID09IDIpIHsKCQkJLyogRW5hYmxlIGN4TU1YIGV4dGVuc2lvbnMgKEdYMSBEYXRhc2hlZXQgNTQpICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1I3LCBnZXRDeDg2KENYODZfQ0NSNyl8MSk7CgkJCQoJCQkvKiBHWGx2L0dYbS9HWDEgKi8KCQkJaWYoKGRpcjEgPj0gMHg1MCAmJiBkaXIxIDw9IDB4NTQpIHx8IGRpcjEgPj0gMHg2MykKCQkJCWdlb2RlX2NvbmZpZ3VyZSgpOwoJCQlnZXRfbW9kZWxfbmFtZShjKTsgIC8qIGdldCBDUFUgbWFya2V0aW5nIG5hbWUgKi8KCQkJcmV0dXJuOwoJCX0KCQllbHNlIHsgIC8qIE1lZGlhR1ggKi8KCQkJQ3g4Nl9jYlsyXSA9IChkaXIwX2xzbiAmIDEpID8gJzMnIDogJzQnOwoJCQlwID0gQ3g4Nl9jYisyOwoJCQljLT54ODZfbW9kZWwgPSAoZGlyMSAmIDB4MjApID8gMSA6IDI7CgkJfQoJCWJyZWFrOwoKICAgICAgICBjYXNlIDU6IC8qIDZ4ODZNWC9NIElJICovCgkJaWYgKGRpcjEgPiA3KQoJCXsKCQkJZGlyMF9tc24rKzsgIC8qIE0gSUkgKi8KCQkJLyogRW5hYmxlIE1NWCBleHRlbnNpb25zIChBcHAgbm90ZSAxMDgpICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1I3LCBnZXRDeDg2KENYODZfQ0NSNyl8MSk7CgkJfQoJCWVsc2UKCQl7CgkJCWMtPmNvbWFfYnVnID0gMTsgICAgICAvKiA2eDg2TVgsIGl0IGhhcyB0aGUgYnVnLiAqLwoJCX0KCQl0bXAgPSAoIShkaXIwX2xzbiAmIDcpIHx8IGRpcjBfbHNuICYgMSkgPyAyIDogMDsKCQlDeDg2X2NiW3RtcF0gPSBjeXJpeF9tb2RlbF9tdWx0MltkaXIwX2xzbiAmIDddOwoJCXAgPSBDeDg2X2NiK3RtcDsKICAgICAgICAJaWYgKCgoZGlyMSAmIDB4MGYpID4gNCkgfHwgKChkaXIxICYgMHhmMCkgPT0gMHgyMCkpCgkJCShjLT54ODZfbW9kZWwpKys7CgkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCgkJc2V0X2JpdChYODZfRkVBVFVSRV9DWVJJWF9BUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCQlicmVhazsKCgljYXNlIDB4ZjogIC8qIEN5cml4IDQ4NiB3aXRob3V0IERFVklEIHJlZ2lzdGVycyAqLwoJCXN3aXRjaCAoZGlyMF9sc24pIHsKCQljYXNlIDB4ZDogIC8qIGVpdGhlciBhIDQ4NlNMQyBvciBETEMgdy9vIERFVklEICovCgkJCWRpcjBfbXNuID0gMDsKCQkJcCA9IEN4NDg2X25hbWVbKGMtPmhhcmRfbWF0aCkgPyAxIDogMF07CgkJCWJyZWFrOwoKCQljYXNlIDB4ZTogIC8qIGEgNDg2UyBBIHN0ZXAgKi8KCQkJZGlyMF9tc24gPSAwOwoJCQlwID0gQ3g0ODZTX25hbWVbMF07CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCglkZWZhdWx0OiAgLyogdW5rbm93biAoc2hvdWxkbid0IGhhcHBlbiwgd2Uga25vdyBldmVyeW9uZSA7LSkgKi8KCQlkaXIwX21zbiA9IDc7CgkJYnJlYWs7Cgl9CglzdHJjcHkoYnVmLCBDeDg2X21vZGVsW2RpcjBfbXNuICYgN10pOwoJaWYgKHApIHN0cmNhdChidWYsIHApOwoJcmV0dXJuOwp9CgovKgogKiBIYW5kbGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBicmFuZGVkIHByb2Nlc3NvcnMKICovCnN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X25zYyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCnsKCS8qIFRoZXJlIG1heSBiZSBHWDEgcHJvY2Vzc29ycyBpbiB0aGUgd2lsZCB0aGF0IGFyZSBicmFuZGVkCgkgKiBOU0MgYW5kIG5vdCBDeXJpeC4KCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyB0aGUgR1ggcHJvY2Vzc29yLCBhbmQga2lja3MgZXZlcnkKCSAqIHRoaW5nIGVsc2UgdG8gdGhlIEN5cml4IGluaXQgZnVuY3Rpb24gYWJvdmUgLSB0aGF0IHNob3VsZAoJICogY292ZXIgYW55IHByb2Nlc3NvcnMgdGhhdCBtaWdodCBoYXZlIGJlZW4gYnJhbmRlZCBkaWZmZXJlbnRseQoJICogYWZ0ZXIgTlNDIGFjcXVpcmVkIEN5cml4LgoJICoKCSAqIElmIHRoaXMgYnJlYWtzIHlvdXIgR1gxIGhvcnJpYmx5LCBwbGVhc2UgZS1tYWlsCgkgKiBpbmZvLWxpbnV4QGxkY21haWwuYW1kLmNvbSB0byB0ZWxsIHVzLgoJICovCgoJLyogSGFuZGxlIHRoZSBHWCAoRm9ybWFsbHkga25vd24gYXMgdGhlIEdYMikgKi8KCglpZiAoYy0+eDg2ID09IDUgJiYgYy0+eDg2X21vZGVsID09IDUpCgkJZGlzcGxheV9jYWNoZWluZm8oYyk7CgllbHNlCgkJaW5pdF9jeXJpeChjKTsKfQoKLyoKICogQ3lyaXggQ1BVcyB3aXRob3V0IGNwdWlkIG9yIHdpdGggY3B1aWQgbm90IHlldCBlbmFibGVkIGNhbiBiZSBkZXRlY3RlZAogKiBieSB0aGUgZmFjdCB0aGF0IHRoZXkgcHJlc2VydmUgdGhlIGZsYWdzIGFjcm9zcyB0aGUgZGl2aXNpb24gb2YgNS8yLgogKiBQSUkgYW5kIFBQcm8gZXhoaWJpdCB0aGlzIGJlaGF2aW9yIHRvbywgYnV0IHRoZXkgaGF2ZSBjcHVpZCBhdmFpbGFibGUuCiAqLwogCi8qCiAqIFBlcmZvcm0gdGhlIEN5cml4IDUvMiB0ZXN0LiBBIEN5cml4IHdvbid0IGNoYW5nZQogKiB0aGUgZmxhZ3MsIHdoaWxlIG90aGVyIDQ4NiBjaGlwcyB3aWxsLgogKi8Kc3RhdGljIGlubGluZSBpbnQgdGVzdF9jeXJpeF81MmRpdih2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgdGVzdDsKCglfX2FzbV9fIF9fdm9sYXRpbGVfXygKCSAgICAgInNhaGZcblx0IgkJLyogY2xlYXIgZmxhZ3MgKCVlYXggPSAweDAwMDUpICovCgkgICAgICJkaXYgJWIyXG5cdCIJLyogZGl2aWRlIDUgYnkgMiAqLwoJICAgICAibGFoZiIJCS8qIHN0b3JlIGZsYWdzIGludG8gJWFoICovCgkgICAgIDogIj1hIiAodGVzdCkKCSAgICAgOiAiMCIgKDUpLCAicSIgKDIpCgkgICAgIDogImNjIik7CgoJLyogQUggaXMgMHgwMiBvbiBDeXJpeCBhZnRlciB0aGUgZGl2aWRlLi4gKi8KCXJldHVybiAodW5zaWduZWQgY2hhcikgKHRlc3QgPj4gOCkgPT0gMHgwMjsKfQoKc3RhdGljIHZvaWQgX19jcHVpbml0IGN5cml4X2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCnsKCS8qIERldGVjdCBDeXJpeCB3aXRoIGRpc2FibGVkIENQVUlEICovCglpZiAoIGMtPng4NiA9PSA0ICYmIHRlc3RfY3lyaXhfNTJkaXYoKSApIHsKCQl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjE7CgkJCgkJc3RyY3B5KGMtPng4Nl92ZW5kb3JfaWQsICJDeXJpeEluc3RlYWQiKTsKCSAgICAgICAgYy0+eDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfQ1lSSVg7CgkgICAgICAgIAoJICAgICAgICAvKiBBY3R1YWxseSBlbmFibGUgY3B1aWQgb24gdGhlIG9sZGVyIGN5cml4ICovCgkgICAgCgkgICAgCS8qIFJldHJpZXZlIENQVSByZXZpc2lvbnMgKi8KCSAgICAJCgkJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKCgkJZGlyMD4+PTQ7CQkKCQkKCQkvKiBDaGVjayBpdCBpcyBhbiBhZmZlY3RlZCBtb2RlbCAqLwoJCQogICAJICAgICAgICBpZiAoZGlyMCA9PSA1IHx8IGRpcjAgPT0gMykKICAgCSAgICAgICAgewoJCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjQ7CgkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIENQVUlEIG9uIEN5cml4IHByb2Nlc3Nvci5cbiIpOwoJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgkJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CgkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTiAgKi8KCQkJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKCQkJc2V0Q3g4NihDWDg2X0NDUjQsIGNjcjQgfCAweDgwKTsgICAgICAgICAgLyogZW5hYmxlIGNwdWlkICAqLwoJCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIE1BUEVOICovCgkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCQl9Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjeXJpeF9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CgkuY192ZW5kb3IJPSAiQ3lyaXgiLAoJLmNfaWRlbnQgCT0geyAiQ3lyaXhJbnN0ZWFkIiB9LAoJLmNfaW5pdAkJPSBpbml0X2N5cml4LAoJLmNfaWRlbnRpZnkJPSBjeXJpeF9pZGVudGlmeSwKfTsKCmludCBfX2luaXQgY3lyaXhfaW5pdF9jcHUodm9pZCkKewoJY3B1X2RldnNbWDg2X1ZFTkRPUl9DWVJJWF0gPSAmY3lyaXhfY3B1X2RldjsKCXJldHVybiAwOwp9CgovL2Vhcmx5X2FyY2hfaW5pdGNhbGwoY3lyaXhfaW5pdF9jcHUpOwoKc3RhdGljIGludCBfX2luaXQgY3lyaXhfZXhpdF9jcHUodm9pZCkKewoJY3B1X2RldnNbWDg2X1ZFTkRPUl9DWVJJWF0gPSBOVUxMOwoJcmV0dXJuIDA7Cn0KCmxhdGVfaW5pdGNhbGwoY3lyaXhfZXhpdF9jcHUpOwoKc3RhdGljIHN0cnVjdCBjcHVfZGV2IG5zY19jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CgkuY192ZW5kb3IJPSAiTlNDIiwKCS5jX2lkZW50IAk9IHsgIkdlb2RlIGJ5IE5TQyIgfSwKCS5jX2luaXQJCT0gaW5pdF9uc2MsCn07CgppbnQgX19pbml0IG5zY19pbml0X2NwdSh2b2lkKQp7CgljcHVfZGV2c1tYODZfVkVORE9SX05TQ10gPSAmbnNjX2NwdV9kZXY7CglyZXR1cm4gMDsKfQoKLy9lYXJseV9hcmNoX2luaXRjYWxsKG5zY19pbml0X2NwdSk7CgpzdGF0aWMgaW50IF9faW5pdCBuc2NfZXhpdF9jcHUodm9pZCkKewoJY3B1X2RldnNbWDg2X1ZFTkRPUl9OU0NdID0gTlVMTDsKCXJldHVybiAwOwp9CgpsYXRlX2luaXRjYWxsKG5zY19leGl0X2NwdSk7Cg==