LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAJCQkJCQkJCQkgICAgICovCi8qIGkyYy5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBpMmMtYnVzIGludGVyZmFjZQkJCSAgICAgKi8KLyogCQkJCQkJCQkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQKICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKLyogJElkOiBpMmMuaCx2IDEuNjggMjAwMy8wMS8yMSAwODowODoxNiBrbWFsa2tpIEV4cCAkICovCgojaWZuZGVmIF9MSU5VWF9JMkNfSAojZGVmaW5lIF9MSU5VWF9JMkNfSAoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIGZvciBzdHJ1Y3QgZGV2aWNlICovCiNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CgovKiAtLS0gRm9yIGkyYy1pc2EgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZXh0ZXJuIHZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKZXh0ZXJuIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19hZGFwdGVyX2RyaXZlcjsKZXh0ZXJuIHN0cnVjdCBjbGFzcyBpMmNfYWRhcHRlcl9jbGFzczsKZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpMmNfYnVzX3R5cGU7CgovKiAtLS0gR2VuZXJhbCBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwoKc3RydWN0IGkyY19tc2c7CnN0cnVjdCBpMmNfYWxnb3JpdGhtOwpzdHJ1Y3QgaTJjX2FkYXB0ZXI7CnN0cnVjdCBpMmNfY2xpZW50OwpzdHJ1Y3QgaTJjX2RyaXZlcjsKdW5pb24gaTJjX3NtYnVzX2RhdGE7CgovKgogKiBUaGUgbWFzdGVyIHJvdXRpbmVzIGFyZSB0aGUgb25lcyBub3JtYWxseSB1c2VkIHRvIHRyYW5zbWl0IGRhdGEgdG8gZGV2aWNlcwogKiBvbiBhIGJ1cyAob3IgcmVhZCBmcm9tIHRoZW0pLiBBcGFydCBmcm9tIHR3byBiYXNpYyB0cmFuc2ZlciBmdW5jdGlvbnMgdG8gCiAqIHRyYW5zbWl0IG9uZSBtZXNzYWdlIGF0IGEgdGltZSwgYSBtb3JlIGNvbXBsZXggdmVyc2lvbiBjYW4gYmUgdXNlZCB0byAKICogdHJhbnNtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtZXNzYWdlcyB3aXRob3V0IGludGVycnVwdGlvbi4KICovCmV4dGVybiBpbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICosY29uc3QgY2hhciogLGludCk7CmV4dGVybiBpbnQgaTJjX21hc3Rlcl9yZWN2KHN0cnVjdCBpMmNfY2xpZW50ICosY2hhciogLGludCk7CgovKiBUcmFuc2ZlciBudW0gbWVzc2FnZXMuCiAqLwpleHRlcm4gaW50IGkyY190cmFuc2ZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKTsKCi8qCiAqIFNvbWUgYWRhcHRlciB0eXBlcyAoaS5lLiBQQ0YgODU4NCBiYXNlZCBvbmVzKSBtYXkgc3VwcG9ydCBzbGF2ZSBiZWhhdml1b3IuIAogKiBUaGlzIGlzIG5vdCB0ZXN0ZWQvaW1wbGVtZW50ZWQgeWV0IGFuZCB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgogKi8KZXh0ZXJuIGludCBpMmNfc2xhdmVfc2VuZChzdHJ1Y3QgaTJjX2NsaWVudCAqLGNoYXIqLGludCk7CmV4dGVybiBpbnQgaTJjX3NsYXZlX3JlY3Yoc3RydWN0IGkyY19jbGllbnQgKixjaGFyKixpbnQpOwoKCgovKiBUaGlzIGlzIHRoZSB2ZXJ5IGdlbmVyYWxpemVkIFNNQnVzIGFjY2VzcyByb3V0aW5lLiBZb3UgcHJvYmFibHkgZG8gbm90CiAgIHdhbnQgdG8gdXNlIHRoaXMsIHRob3VnaDsgb25lIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgbWF5IGJlIG11Y2ggZWFzaWVyLAogICBhbmQgcHJvYmFibHkganVzdCBhcyBmYXN0LiAKICAgTm90ZSB0aGF0IHdlIHVzZSBpMmNfYWRhcHRlciBoZXJlLCBiZWNhdXNlIHlvdSBkbyBub3QgbmVlZCBhIHNwZWNpZmljCiAgIHNtYnVzIGFkYXB0ZXIgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLiAqLwpleHRlcm4gczMyIGkyY19zbWJ1c194ZmVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyLCB1MTYgYWRkciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsIGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpOwoKLyogTm93IGZvbGxvdyB0aGUgJ25pY2UnIGFjY2VzcyByb3V0aW5lcy4gVGhlc2UgYWxzbyBkb2N1bWVudCB0aGUgY2FsbGluZwogICBjb252ZW50aW9ucyBvZiBzbWJ1c19hY2Nlc3MuICovCgpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9xdWljayhzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQpOwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LCB1OCB2YWx1ZSk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LCB1OCBjb21tYW5kKTsKZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgdTggdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggY29tbWFuZCk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSk7Ci8qIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCAqLwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAoJCQkJICAgICAgdTggY29tbWFuZCwgdTggbGVuZ3RoLAoJCQkJICAgICAgdTggKnZhbHVlcyk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCgkJCQkJIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpOwoKLyoKICogQSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBvbmUgb3IgbW9yZSBwaHlzaWNhbCBkZXZpY2VzIHByZXNlbnQgb24KICogSTJDIGFkYXB0ZXJzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYWRhcHRlcgogKiBldmVudHMuCiAqLwoKc3RydWN0IGkyY19kcml2ZXIgewoJc3RydWN0IG1vZHVsZSAqb3duZXI7CgljaGFyIG5hbWVbMzJdOwoJaW50IGlkOwoJdW5zaWduZWQgaW50IGNsYXNzOwoJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogZGl2Liwgc2VlIGJlbG93CQkqLwoKCS8qIE5vdGlmaWVzIHRoZSBkcml2ZXIgdGhhdCBhIG5ldyBidXMgaGFzIGFwcGVhcmVkLiBUaGlzIHJvdXRpbmUKCSAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gdGVzdCBpZiB0aGUgYnVzIG1lZXRzIGl0cyBjb25kaXRpb25zCgkgKiAmIHNlZWsgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgY2hpcChzKSBpdCBzdXBwb3J0cy4gSWYgZm91bmQsIGl0IAoJICogcmVnaXN0ZXJzIHRoZSBjbGllbnQocykgdGhhdCBhcmUgb24gdGhlIGJ1cyB0byB0aGUgaTJjIGFkbWluLiB2aWEKCSAqIGkyY19hdHRhY2hfY2xpZW50LgoJICovCglpbnQgKCphdHRhY2hfYWRhcHRlcikoc3RydWN0IGkyY19hZGFwdGVyICopOwoJaW50ICgqZGV0YWNoX2FkYXB0ZXIpKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKCgkvKiB0ZWxscyB0aGUgZHJpdmVyIHRoYXQgYSBjbGllbnQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCAmIGdpdmVzIGl0IAoJICogdGhlIGNoYW5jZSB0byByZW1vdmUgaXRzIHByaXZhdGUgZGF0YS4gQWxzbywgaWYgdGhlIGNsaWVudCBzdHJ1Y3QKCSAqIGhhcyBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGluIHRoZSBmdW5jdGlvbiBhYm92ZSwKCSAqIGl0IG11c3QgYmUgZnJlZWQgaGVyZS4KCSAqLwoJaW50ICgqZGV0YWNoX2NsaWVudCkoc3RydWN0IGkyY19jbGllbnQgKik7CgkKCS8qIGEgaW9jdGwgbGlrZSBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKCSAqIHdpdGggdGhlIGRldmljZS4KCSAqLwoJaW50ICgqY29tbWFuZCkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCx1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwoKCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKfTsKI2RlZmluZSB0b19pMmNfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2RyaXZlciwgZHJpdmVyKQoKI2RlZmluZSBJMkNfTkFNRV9TSVpFCTUwCgovKgogKiBpMmNfY2xpZW50IGlkZW50aWZpZXMgYSBzaW5nbGUgZGV2aWNlIChpLmUuIGNoaXApIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFuIAogKiBpMmMgYnVzLiBUaGUgYmVoYXZpb3VyIGlzIGRlZmluZWQgYnkgdGhlIHJvdXRpbmVzIG9mIHRoZSBkcml2ZXIuIFRoaXMKICogZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgZm9yIGxvb2t1cCAmIG90aGVyIGFkbWluLiBmdW5jdGlvbnMuCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudCB7Cgl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBkaXYuLCBzZWUgYmVsb3cJCSovCgl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogY2hpcCBhZGRyZXNzIC0gTk9URTogN2JpdCAJKi8KCQkJCQkvKiBhZGRyZXNzZXMgYXJlIHN0b3JlZCBpbiB0aGUJKi8KCQkJCQkvKiBfTE9XRVJfIDcgYml0cwkJKi8KCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsJLyogdGhlIGFkYXB0ZXIgd2Ugc2l0IG9uCSovCglzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyOwkvKiBhbmQgb3VyIGFjY2VzcyByb3V0aW5lcwkqLwoJaW50IHVzYWdlX2NvdW50OwkJLyogSG93IG1hbnkgYWNjZXNzZXMgY3VycmVudGx5ICAqLwoJCQkJCS8qIHRvIHRoZSBjbGllbnQJCSovCglzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHRoZSBkZXZpY2Ugc3RydWN0dXJlCQkqLwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwoJc3RydWN0IGNvbXBsZXRpb24gcmVsZWFzZWQ7Cn07CiNkZWZpbmUgdG9faTJjX2NsaWVudChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19jbGllbnQsIGRldikKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGkyY19jbGllbnQgKmtvYmpfdG9faTJjX2NsaWVudChzdHJ1Y3Qga29iamVjdCAqa29iaikKewoJcmV0dXJuIHRvX2kyY19jbGllbnQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKfQoKc3RhdGljIGlubGluZSB2b2lkICppMmNfZ2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYpCnsKCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYsIHZvaWQgKmRhdGEpCnsKCWRldl9zZXRfZHJ2ZGF0YSAoJmRldi0+ZGV2LCBkYXRhKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBmb3IgdGhvc2Ugd2hvIGxpa2UgdG8gaW1wbGVtZW50IG5ldyBidXMgZHJpdmVyczoKICogaTJjX2FsZ29yaXRobSBpcyB0aGUgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgb2YgaGFyZHdhcmUgc29sdXRpb25zIHdoaWNoIGNhbgogKiBiZSBhZGRyZXNzZWQgdXNpbmcgdGhlIHNhbWUgYnVzIGFsZ29yaXRobXMgLSBpLmUuIGJpdC1iYW5naW5nIG9yIHRoZSBQQ0Y4NTg0CiAqIHRvIG5hbWUgdHdvIG9mIHRoZSBtb3N0IGNvbW1vbi4KICovCnN0cnVjdCBpMmNfYWxnb3JpdGhtIHsKCS8qIElmIGFuIGFkYXB0ZXIgYWxnb3JpdGhtIGNhbid0IGRvIEkyQy1sZXZlbCBhY2Nlc3MsIHNldCBtYXN0ZXJfeGZlcgoJICAgdG8gTlVMTC4gSWYgYW4gYWRhcHRlciBhbGdvcml0aG0gY2FuIGRvIFNNQnVzIGFjY2Vzcywgc2V0IAoJICAgc21idXNfeGZlci4gSWYgc2V0IHRvIE5VTEwsIHRoZSBTTUJ1cyBwcm90b2NvbCBpcyBzaW11bGF0ZWQKCSAgIHVzaW5nIGNvbW1vbiBJMkMgbWVzc2FnZXMgKi8KCWludCAoKm1hc3Rlcl94ZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZ3MsIAoJICAgICAgICAgICAgICAgICAgIGludCBudW0pOwoJaW50ICgqc21idXNfeGZlcikgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsIAoJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCgkgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSk7CgoJLyogLS0tIHRoZXNlIG9wdGlvbmFsL2Z1dHVyZSB1c2UgZm9yIHNvbWUgYWRhcHRlciB0eXBlcy4qLwoJaW50ICgqc2xhdmVfc2VuZCkoc3RydWN0IGkyY19hZGFwdGVyICosY2hhciosaW50KTsKCWludCAoKnNsYXZlX3JlY3YpKHN0cnVjdCBpMmNfYWRhcHRlciAqLGNoYXIqLGludCk7CgoJLyogLS0tIGlvY3RsIGxpa2UgY2FsbCB0byBzZXQgZGl2LiBwYXJhbWV0ZXJzLiAqLwoJaW50ICgqYWxnb19jb250cm9sKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKCgkvKiBUbyBkZXRlcm1pbmUgd2hhdCB0aGUgYWRhcHRlciBzdXBwb3J0cyAqLwoJdTMyICgqZnVuY3Rpb25hbGl0eSkgKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKfTsKCi8qCiAqIGkyY19hZGFwdGVyIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSBhIHBoeXNpY2FsIGkyYyBidXMgYWxvbmcKICogd2l0aCB0aGUgYWNjZXNzIGFsZ29yaXRobXMgbmVjZXNzYXJ5IHRvIGFjY2VzcyBpdC4KICovCnN0cnVjdCBpMmNfYWRhcHRlciB7CglzdHJ1Y3QgbW9kdWxlICpvd25lcjsKCXVuc2lnbmVkIGludCBpZDsKCXVuc2lnbmVkIGludCBjbGFzczsKCXN0cnVjdCBpMmNfYWxnb3JpdGhtICphbGdvOy8qIHRoZSBhbGdvcml0aG0gdG8gYWNjZXNzIHRoZSBidXMJKi8KCXZvaWQgKmFsZ29fZGF0YTsKCgkvKiAtLS0gYWRtaW5pc3RyYXRpb24gc3R1ZmYuICovCglpbnQgKCpjbGllbnRfcmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoJaW50ICgqY2xpZW50X3VucmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoKCS8qIGRhdGEgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGZvciBhbGwgZGV2aWNlcwkqLwoJc3RydWN0IHNlbWFwaG9yZSBidXNfbG9jazsKCXN0cnVjdCBzZW1hcGhvcmUgY2xpc3RfbG9jazsKCglpbnQgdGltZW91dDsKCWludCByZXRyaWVzOwoJc3RydWN0IGRldmljZSBkZXY7CQkvKiB0aGUgYWRhcHRlciBkZXZpY2UgKi8KCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OwkvKiB0aGUgY2xhc3MgZGV2aWNlICovCgojaWZkZWYgQ09ORklHX1BST0NfRlMgCgkvKiBObyBuZWVkIHRvIHNldCB0aGlzIHdoZW4geW91IGluaXRpYWxpemUgdGhlIGFkYXB0ZXIgICAgICAgICAgKi8KCWludCBpbm9kZTsKI2VuZGlmIC8qIGRlZiBDT05GSUdfUFJPQ19GUyAqLwoKCWludCBucjsKCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50czsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKCWNoYXIgbmFtZVtJMkNfTkFNRV9TSVpFXTsKCXN0cnVjdCBjb21wbGV0aW9uIGRldl9yZWxlYXNlZDsKCXN0cnVjdCBjb21wbGV0aW9uIGNsYXNzX2Rldl9yZWxlYXNlZDsKfTsKI2RlZmluZSBkZXZfdG9faTJjX2FkYXB0ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBpMmNfYWRhcHRlciwgZGV2KQojZGVmaW5lIGNsYXNzX2Rldl90b19pMmNfYWRhcHRlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19hZGFwdGVyLCBjbGFzc19kZXYpCgpzdGF0aWMgaW5saW5lIHZvaWQgKmkyY19nZXRfYWRhcGRhdGEgKHN0cnVjdCBpMmNfYWRhcHRlciAqZGV2KQp7CglyZXR1cm4gZGV2X2dldF9kcnZkYXRhICgmZGV2LT5kZXYpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgaTJjX3NldF9hZGFwZGF0YSAoc3RydWN0IGkyY19hZGFwdGVyICpkZXYsIHZvaWQgKmRhdGEpCnsKCWRldl9zZXRfZHJ2ZGF0YSAoJmRldi0+ZGV2LCBkYXRhKTsKfQoKLypmbGFncyBmb3IgdGhlIGRyaXZlciBzdHJ1Y3Q6ICovCiNkZWZpbmUgSTJDX0RGX05PVElGWQkweDAxCQkvKiBub3RpZnkgb24gYnVzIChkZS9hKXR0YWNoZXMgCSovCiNpZiAwCi8qIHRoaXMgZmxhZyBpcyBnb25lIC0tIHRoZXJlIGlzIGEgKG9wdGlvbmFsKSBkcml2ZXItPmRldGFjaF9hZGFwdGVyCiAqIGNhbGxiYWNrIG5vdyB3aGljaCBjYW4gYmUgdXNlZCBpbnN0ZWFkICovCiMgZGVmaW5lIEkyQ19ERl9EVU1NWQkweDAyCiNlbmRpZgoKLypmbGFncyBmb3IgdGhlIGNsaWVudCBzdHJ1Y3Q6ICovCiNkZWZpbmUgSTJDX0NMSUVOVF9BTExPV19VU0UJCTB4MDEJLyogQ2xpZW50IGFsbG93cyBhY2Nlc3MgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX0FMTE9XX01VTFRJUExFX1VTRSAJMHgwMiAgCS8qIEFsbG93IG11bHRpcGxlIGFjY2Vzcy1sb2NrcyAqLwoJCQkJCQkvKiBvbiBhbiBpMmNfY2xpZW50ICovCiNkZWZpbmUgSTJDX0NMSUVOVF9QRUMgIDB4MDQJCQkvKiBVc2UgUGFja2V0IEVycm9yIENoZWNraW5nICovCiNkZWZpbmUgSTJDX0NMSUVOVF9URU4JMHgxMAkJCS8qIHdlIGhhdmUgYSB0ZW4gYml0IGNoaXAgYWRkcmVzcwkqLwoJCQkJCQkvKiBNdXN0IGVxdWFsIEkyQ19NX1RFTiBiZWxvdyAqLwoKLyogaTJjIGFkYXB0ZXIgY2xhc3NlcyAoYml0bWFzaykgKi8KI2RlZmluZSBJMkNfQ0xBU1NfSFdNT04JCSgxPDwwKQkvKiBsbV9zZW5zb3JzLCAuLi4gKi8KI2RlZmluZSBJMkNfQ0xBU1NfVFZfQU5BTE9HCSgxPDwxKQkvKiBidHR2ICsgZnJpZW5kcyAqLwojZGVmaW5lIEkyQ19DTEFTU19UVl9ESUdJVEFMCSgxPDwyKQkvKiBkdmIgY2FyZHMgKi8KI2RlZmluZSBJMkNfQ0xBU1NfRERDCQkoMTw8MykJLyogaTJjLW1hdHJveGZiID8gKi8KI2RlZmluZSBJMkNfQ0xBU1NfQ0FNX0FOQUxPRwkoMTw8NCkJLyogY2FtZXJhIHdpdGggYW5hbG9nIENDRCAqLwojZGVmaW5lIEkyQ19DTEFTU19DQU1fRElHSVRBTAkoMTw8NSkJLyogbW9zdCB3ZWJjYW1zICovCiNkZWZpbmUgSTJDX0NMQVNTX1NPVU5ECQkoMTw8NikJLyogc291bmQgZGV2aWNlcyAqLwojZGVmaW5lIEkyQ19DTEFTU19BTEwJCShVSU5UX01BWCkgLyogYWxsIG9mIHRoZSBhYm92ZSAqLwoKLyogaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgaXMgdGhlIHN0cnVjdCBmb3IgaG9sZGluZyBkZWZhdWx0IGNsaWVudAogKiBhZGRyZXNzZXMgZm9yIGEgZHJpdmVyIGFuZCBmb3IgdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgb24gdGhlCiAqIGNvbW1hbmQgbGluZQogKi8Kc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIHsKCXVuc2lnbmVkIHNob3J0ICpub3JtYWxfaTJjOwoJdW5zaWduZWQgc2hvcnQgKnByb2JlOwoJdW5zaWduZWQgc2hvcnQgKmlnbm9yZTsKCXVuc2lnbmVkIHNob3J0ICoqZm9yY2VzOwp9OwoKLyogSW50ZXJuYWwgbnVtYmVycyB0byB0ZXJtaW5hdGUgbGlzdHMgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX0VORAkJMHhmZmZlVQoKLyogVGhlIG51bWJlcnMgdG8gdXNlIHRvIHNldCBJMkMgYnVzIGFkZHJlc3MgKi8KI2RlZmluZSBBTllfSTJDX0JVUwkJMHhmZmZmCiNkZWZpbmUgQU5ZX0kyQ19JU0FfQlVTCQk5MTkxCgoKLyogLS0tLS0gZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IGkyYy5vICovCgovKiBhZG1pbmlzdHJhdGlvbi4uLgogKi8KZXh0ZXJuIGludCBpMmNfYWRkX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICopOwpleHRlcm4gaW50IGkyY19kZWxfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CgpleHRlcm4gaW50IGkyY19hZGRfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICopOwpleHRlcm4gaW50IGkyY19kZWxfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICopOwoKZXh0ZXJuIGludCBpMmNfYXR0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKZXh0ZXJuIGludCBpMmNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKCi8qIE5ldyBmdW5jdGlvbjogVGhpcyBpcyB0byBnZXQgYW4gaTJjX2NsaWVudC1zdHJ1Y3QgZm9yIGNvbnRyb2xsaW5nIHRoZSAKICAgY2xpZW50IGVpdGhlciBieSB1c2luZyBpMmNfY29udHJvbC1mdW5jdGlvbiBvciBoYXZpbmcgdGhlIAogICBjbGllbnQtbW9kdWxlIGV4cG9ydCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBpMmNfY2xpZW50CiAgIC1zdHJ1Y3QuICovCmV4dGVybiBzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2dldF9jbGllbnQoaW50IGRyaXZlcl9pZCwgaW50IGFkYXB0ZXJfaWQsIAoJCQkJCXN0cnVjdCBpMmNfY2xpZW50ICpwcmV2KTsKCi8qIFNob3VsZCBiZSB1c2VkIHdpdGggbmV3IGZ1bmN0aW9uCiAgIGV4dGVybiBzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2dldF9jbGllbnQoaW50LGludCxzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKICAgdG8gbWFrZSBzdXJlIHRoYXQgY2xpZW50LXN0cnVjdCBpcyB2YWxpZCBhbmQgdGhhdCBpdCBpcyBva2F5IHRvIGFjY2VzcwogICB0aGUgaTJjLWNsaWVudC4gCiAgIHJldHVybnMgLUVBQ0NFUyBpZiBjbGllbnQgZG9lc24ndCBhbGxvdyB1c2UgKGRlZmF1bHQpCiAgIHJldHVybnMgLUVCVVNZIGlmIGNsaWVudCBkb2Vzbid0IGFsbG93IG11bHRpcGxlIHVzZSAoZGVmYXVsdCkgYW5kIAogICB1c2FnZV9jb3VudCA+MCAqLwpleHRlcm4gaW50IGkyY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwpleHRlcm4gaW50IGkyY19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKCi8qIGNhbGwgdGhlIGkyY19jbGllbnQtPmNvbW1hbmQoKSBvZiBhbGwgYXR0YWNoZWQgY2xpZW50cyB3aXRoCiAqIHRoZSBnaXZlbiBhcmd1bWVudHMgKi8KZXh0ZXJuIHZvaWQgaTJjX2NsaWVudHNfY29tbWFuZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCgkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwoKLyogcmV0dXJucyAtRUJVU1kgaWYgYWRkcmVzcyBoYXMgYmVlbiB0YWtlbiwgMCBpZiBub3QuIE5vdGUgdGhhdCB0aGUgb25seQogICBvdGhlciBwbGFjZSBhdCB3aGljaCB0aGlzIGlzIGNhbGxlZCBpcyB3aXRoaW4gaTJjX2F0dGFjaF9jbGllbnQ7IHNvCiAgIHlvdSBjYW4gY2hlYXQgYnkgc2ltcGx5IG5vdCByZWdpc3RlcmluZy4gTm90IHJlY29tbWVuZGVkLCBvZiBjb3Vyc2UhICovCmV4dGVybiBpbnQgaTJjX2NoZWNrX2FkZHIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpOwoKLyogRGV0ZWN0IGZ1bmN0aW9uLiBJdCBpdGVyYXRlcyBvdmVyIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgaXRzZWxmLgogKiBJdCB3aWxsIG9ubHkgY2FsbCBmb3VuZF9wcm9jIGlmIHNvbWUgY2xpZW50IGlzIGNvbm5lY3RlZCBhdCB0aGUKICogc3BlY2lmaWMgYWRkcmVzcyAodW5sZXNzIGEgJ2ZvcmNlJyBtYXRjaGVkKTsKICovCmV4dGVybiBpbnQgaTJjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgCgkJc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhICphZGRyZXNzX2RhdGEsCgkJaW50ICgqZm91bmRfcHJvYykgKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCkpOwoKLyogQW4gaW9jdGwgbGlrZSBjYWxsIHRvIHNldCBkaXYuIHBhcmFtZXRlcnMgb2YgdGhlIGFkYXB0ZXIuCiAqLwpleHRlcm4gaW50IGkyY19jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICosdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKCmV4dGVybiBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyY19nZXRfYWRhcHRlcihpbnQgaWQpOwpleHRlcm4gdm9pZCBpMmNfcHV0X2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKCgovKiBSZXR1cm4gdGhlIGZ1bmN0aW9uYWxpdHkgbWFzayAqLwpzdGF0aWMgaW5saW5lIHUzMiBpMmNfZ2V0X2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglyZXR1cm4gYWRhcC0+YWxnby0+ZnVuY3Rpb25hbGl0eShhZGFwKTsKfQoKLyogUmV0dXJuIDEgaWYgYWRhcHRlciBzdXBwb3J0cyBldmVyeXRoaW5nIHdlIG5lZWQsIDAgaWYgbm90LiAqLwpzdGF0aWMgaW5saW5lIGludCBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHUzMiBmdW5jKQp7CglyZXR1cm4gKGZ1bmMgJiBpMmNfZ2V0X2Z1bmN0aW9uYWxpdHkoYWRhcCkpID09IGZ1bmM7Cn0KCi8qIFJldHVybiBpZCBudW1iZXIgZm9yIGEgc3BlY2lmaWMgYWRhcHRlciAqLwpzdGF0aWMgaW5saW5lIGludCBpMmNfYWRhcHRlcl9pZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiBhZGFwLT5ucjsKfQoKLyoKICogSTJDIE1lc3NhZ2UgLSB1c2VkIGZvciBwdXJlIGkyYyB0cmFuc2FjdGlvbiwgYWxzbyBmcm9tIC9kZXYgaW50ZXJmYWNlCiAqLwpzdHJ1Y3QgaTJjX21zZyB7CglfX3UxNiBhZGRyOwkvKiBzbGF2ZSBhZGRyZXNzCQkJKi8KIAlfX3UxNiBmbGFnczsJCQojZGVmaW5lIEkyQ19NX1RFTgkweDEwCS8qIHdlIGhhdmUgYSB0ZW4gYml0IGNoaXAgYWRkcmVzcwkqLwojZGVmaW5lIEkyQ19NX1JECTB4MDEKI2RlZmluZSBJMkNfTV9OT1NUQVJUCTB4NDAwMAojZGVmaW5lIEkyQ19NX1JFVl9ESVJfQUREUgkweDIwMDAKI2RlZmluZSBJMkNfTV9JR05PUkVfTkFLCTB4MTAwMAojZGVmaW5lIEkyQ19NX05PX1JEX0FDSwkJMHgwODAwCiAJX191MTYgbGVuOwkJLyogbXNnIGxlbmd0aAkJCQkqLwogCV9fdTggKmJ1ZjsJCS8qIHBvaW50ZXIgdG8gbXNnIGRhdGEJCQkqLwp9OwoKLyogVG8gZGV0ZXJtaW5lIHdoYXQgZnVuY3Rpb25hbGl0eSBpcyBwcmVzZW50ICovCgojZGVmaW5lIEkyQ19GVU5DX0kyQwkJCTB4MDAwMDAwMDEKI2RlZmluZSBJMkNfRlVOQ18xMEJJVF9BRERSCQkweDAwMDAwMDAyCiNkZWZpbmUgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcJMHgwMDAwMDAwNCAvKiBJMkNfTV97UkVWX0RJUl9BRERSLE5PU1RBUlQsLi59ICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfSFdQRUNfQ0FMQwkweDAwMDAwMDA4IC8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBX1BFQyAgMHgwMDAwMDgwMCAvKiBTTUJ1cyAyLjAgKi8gCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBX1BFQyAweDAwMDAxMDAwIC8qIFNNQnVzIDIuMCAqLyAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTExfUEVDCTB4MDAwMDIwMDAgLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMX1BFQyAweDAwMDA0MDAwIC8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BST0NfQ0FMTAkweDAwMDA4MDAwIC8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1FVSUNLCQkweDAwMDEwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURQkweDAwMDIwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUJMHgwMDA0MDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQQkweDAwMDgwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQQkweDAwMTAwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBCTB4MDAyMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBCTB4MDA0MDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMCTB4MDA4MDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBCTB4MDEwMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSAweDAyMDAwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLCTB4MDQwMDAwMDAgLyogSTJDLWxpa2UgYmxvY2sgeGZlciAgKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sJMHgwODAwMDAwMCAvKiB3LyAxLWJ5dGUgcmVnLiBhZGRyLiAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLXzIJIDB4MTAwMDAwMDAgLyogSTJDLWxpa2UgYmxvY2sgeGZlciAgKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0tfMiAweDIwMDAwMDAwIC8qIHcvIDItYnl0ZSByZWcuIGFkZHIuICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBX1BFQyAgMHg0MDAwMDAwMCAvKiBTTUJ1cyAyLjAgKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBX1BFQyAweDgwMDAwMDAwIC8qIFNNQnVzIDIuMCAqLwoKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFIChJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgKEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSAoSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQSAoSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEEpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLIChJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DSyB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSykKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0tfMiAoSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0tfMiB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLXzIpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQV9QRUMgKEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQV9QRUMgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEFfUEVDKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQV9QRUMgIChJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQV9QRUMgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX1dPUkRfREFUQV9QRUMpCgojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9QRUMJCUkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9QRUMJCUkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBX1BFQwlJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQV9QRUMJSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQllURV9QRUMJCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEFfUEVDCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEKCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfRU1VTCAoSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfQllURSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTCB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEFfUEVDIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykKCi8qIAogKiBEYXRhIGZvciBTTUJ1cyBNZXNzYWdlcyAKICovCiNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX01BWAkzMgkvKiBBcyBzcGVjaWZpZWQgaW4gU01CdXMgc3RhbmRhcmQgKi8JCiNkZWZpbmUgSTJDX1NNQlVTX0kyQ19CTE9DS19NQVgJMzIJLyogTm90IHNwZWNpZmllZCBidXQgd2UgdXNlIHNhbWUgc3RydWN0dXJlICovCnVuaW9uIGkyY19zbWJ1c19kYXRhIHsKCV9fdTggYnl0ZTsKCV9fdTE2IHdvcmQ7CglfX3U4IGJsb2NrW0kyQ19TTUJVU19CTE9DS19NQVggKyAzXTsgLyogYmxvY2tbMF0gaXMgdXNlZCBmb3IgbGVuZ3RoICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIG1vcmUgZm9yIHJlYWQgbGVuZ3RoIGluIGJsb2NrIHByb2Nlc3MgY2FsbCAqLwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgb25lIG1vcmUgZm9yIFBFQyAqLwp9OwoKLyogc21idXNfYWNjZXNzIHJlYWQgb3Igd3JpdGUgbWFya2VycyAqLwojZGVmaW5lIEkyQ19TTUJVU19SRUFECTEKI2RlZmluZSBJMkNfU01CVVNfV1JJVEUJMAoKLyogU01CdXMgdHJhbnNhY3Rpb24gdHlwZXMgKHNpemUgcGFyYW1ldGVyIGluIHRoZSBhYm92ZSBmdW5jdGlvbnMpIAogICBOb3RlOiB0aGVzZSBubyBsb25nZXIgY29ycmVzcG9uZCB0byB0aGUgKGFyYml0cmFyeSkgUElJWDQgaW50ZXJuYWwgY29kZXMhICovCiNkZWZpbmUgSTJDX1NNQlVTX1FVSUNLCQkgICAgMAojZGVmaW5lIEkyQ19TTUJVU19CWVRFCQkgICAgMQojZGVmaW5lIEkyQ19TTUJVU19CWVRFX0RBVEEJICAgIDIgCiNkZWZpbmUgSTJDX1NNQlVTX1dPUkRfREFUQQkgICAgMwojZGVmaW5lIEkyQ19TTUJVU19QUk9DX0NBTEwJICAgIDQKI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfREFUQQkgICAgNQojZGVmaW5lIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSAgICA2CiNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCAgIDcJCS8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQyAgICA4CQkvKiBTTUJ1cyAyLjAgKi8KI2RlZmluZSBJMkNfU01CVVNfUFJPQ19DQUxMX1BFQyAgICAgOQkJLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTF9QRUMgIDEwCS8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19TTUJVU19XT1JEX0RBVEFfUEVDCSAgIDExCQkvKiBTTUJ1cyAyLjAgKi8KCgovKiAtLS0tLSBjb21tYW5kcyBmb3IgdGhlIGlvY3RsIGxpa2UgaTJjX2NvbW1hbmQgY2FsbDoKICogbm90ZSB0aGF0IGFkZGl0aW9uYWwgY2FsbHMgYXJlIGRlZmluZWQgaW4gdGhlIGFsZ29yaXRobSBhbmQgaHcgCiAqCWRlcGVuZGVudCBsYXllcnMgLSB0aGVzZSBjYW4gYmUgbGlzdGVkIGhlcmUsIG9yIHNlZSB0aGUgCiAqCWNvcnJlc3BvbmRpbmcgaGVhZGVyIGZpbGVzLgogKi8KCQkJCS8qIC0+IGJpdC1hZGFwdGVyIHNwZWNpZmljIGlvY3RscwkqLwojZGVmaW5lIEkyQ19SRVRSSUVTCTB4MDcwMQkvKiBudW1iZXIgb2YgdGltZXMgYSBkZXZpY2UgYWRkcmVzcyAgICAgICovCgkJCQkvKiBzaG91bGQgYmUgcG9sbGVkIHdoZW4gbm90ICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2tub3dsZWRnaW5nIAkJCSovCiNkZWZpbmUgSTJDX1RJTUVPVVQJMHgwNzAyCS8qIHNldCB0aW1lb3V0IC0gY2FsbCB3aXRoIGludCAJCSovCgoKLyogdGhpcyBpcyBmb3IgaTJjLWRldi5jCSovCiNkZWZpbmUgSTJDX1NMQVZFCTB4MDcwMwkvKiBDaGFuZ2Ugc2xhdmUgYWRkcmVzcwkJCSovCgkJCQkvKiBBdHRuLjogU2xhdmUgYWRkcmVzcyBpcyA3IG9yIDEwIGJpdHMgKi8KI2RlZmluZSBJMkNfU0xBVkVfRk9SQ0UJMHgwNzA2CS8qIENoYW5nZSBzbGF2ZSBhZGRyZXNzCQkJKi8KCQkJCS8qIEF0dG4uOiBTbGF2ZSBhZGRyZXNzIGlzIDcgb3IgMTAgYml0cyAqLwoJCQkJLyogVGhpcyBjaGFuZ2VzIHRoZSBhZGRyZXNzLCBldmVuIGlmIGl0ICovCgkJCQkvKiBpcyBhbHJlYWR5IHRha2VuIQkJCSovCiNkZWZpbmUgSTJDX1RFTkJJVAkweDA3MDQJLyogMCBmb3IgNyBiaXQgYWRkcnMsICE9IDAgZm9yIDEwIGJpdAkqLwoKI2RlZmluZSBJMkNfRlVOQ1MJMHgwNzA1CS8qIEdldCB0aGUgYWRhcHRlciBmdW5jdGlvbmFsaXR5ICovCiNkZWZpbmUgSTJDX1JEV1IJMHgwNzA3CS8qIENvbWJpbmVkIFIvVyB0cmFuc2ZlciAob25lIHN0b3Agb25seSkqLwojZGVmaW5lIEkyQ19QRUMJCTB4MDcwOAkvKiAhPSAwIGZvciBTTUJ1cyBQRUMgICAgICAgICAgICAgICAgICAgKi8KCiNkZWZpbmUgSTJDX1NNQlVTCTB4MDcyMAkvKiBTTUJ1cy1sZXZlbCBhY2Nlc3MgKi8KCi8qIC4uLiBhbGdvLWJpdC5jIHJlY29nbml6ZXMgKi8KI2RlZmluZSBJMkNfVURFTEFZCTB4MDcwNQkvKiBzZXQgZGVsYXkgaW4gbWljcm9zZWNzIGJldHdlZW4gZWFjaAkqLwoJCQkJLyogd3JpdHRlbiBieXRlIChleGNlcHQgYWRkcmVzcykJKi8KI2RlZmluZSBJMkNfTURFTEFZCTB4MDcwNgkvKiBtaWxsaXNlYyBkZWxheSBiZXR3ZWVuIHdyaXR0ZW4gYnl0ZXMgKi8KCi8qIC0tLS0tIEkyQy1ERVY6IGNoYXIgZGV2aWNlIGludGVyZmFjZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIEkyQ19NQUpPUgk4OQkJLyogRGV2aWNlIG1ham9yIG51bWJlcgkJKi8KCi8qIFRoZXNlIGRlZmluZXMgYXJlIHVzZWQgZm9yIHByb2JpbmcgaTJjIGNsaWVudCBhZGRyZXNzZXMgKi8KLyogVGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uIGxpc3RzICovCiNkZWZpbmUgSTJDX0NMSUVOVF9NQVhfT1BUUyA0OAoKLyogRGVmYXVsdCBmaWxsIG9mIG1hbnkgdmFyaWFibGVzICovCiNkZWZpbmUgSTJDX0NMSUVOVF9ERUZBVUxUUyB7STJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH0KCi8qIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0gY3JlYXRlcyBhIG1vZHVsZSBwYXJhbWV0ZXIsIGFuZCBwdXRzIGl0IGluIHRoZQogICBtb2R1bGUgaGVhZGVyICovCgojZGVmaW5lIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0odmFyLGRlc2MpIFwKICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmFyW0kyQ19DTElFTlRfTUFYX09QVFNdID0gSTJDX0NMSUVOVF9ERUZBVUxUUzsgXAogIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmFyIyNfbnVtOyBcCiAgbW9kdWxlX3BhcmFtX2FycmF5KHZhciwgc2hvcnQsICZ2YXIjI19udW0sIDApOyBcCiAgTU9EVUxFX1BBUk1fREVTQyh2YXIsZGVzYykKCiNkZWZpbmUgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShuYW1lKQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2VfIyNuYW1lLAkJCQkJXAoJCSAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgd2hpY2ggYXJlICIJXAoJCSAgICAgICAidW5xdWVzdGlvbmFibHkgYXNzdW1lZCB0byBjb250YWluIGEgYCIJCVwKCQkgICAgICAgIyBuYW1lICInIGNoaXAiKQoKCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0ocHJvYmUsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBzY2FuICIJXAoJCSAgICAgICAiYWRkaXRpb25hbGx5Iik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oaWdub3JlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgbm90IHRvICIJXAoJCSAgICAgICAic2NhbiIpOwkJCQkJCVwKc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CQkJXAoJLm5vcm1hbF9pMmMJPSBub3JtYWxfaTJjLAkJCQkJXAoJLnByb2JlCQk9IHByb2JlLAkJCQkJXAoJLmlnbm9yZQkJPSBpZ25vcmUsCQkJCQlcCgkuZm9yY2VzCQk9IGZvcmNlcywJCQkJCVwKfQoKLyogVGhlc2UgYXJlIHRoZSBvbmVzIHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIG93biBkcml2ZXJzLiBQaWNrIHRoZSBvbmUKICAgd2hpY2ggbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGRldmljZXMgdGhlIGRyaXZlciBkaWZmZXJlbmNpYXRlcyBiZXR3ZWVuLiAqLwojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EIFwKICBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCBcCiAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gYm9sZGx5IGFzc3VtZSAiIFwKICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7CQkJCVwKCQkJZm9yY2UsCQkJCQkJXAoJCQlOVUxMCQkJCQkJXAoJCX07CQkJCQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzEoY2hpcDEpCQkJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEgfTsJCQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLCBOVUxMIH07CVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzIoY2hpcDEsIGNoaXAyKQkJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyIH07CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBOVUxMIH07CQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF8zKGNoaXAxLCBjaGlwMiwgY2hpcDMpCQkJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMgfTsJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBOVUxMIH07CQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzQoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQpCQkJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0IH07CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgTlVMTH07CQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF81KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSkJCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUgfTsJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBmb3JjZV8jI2NoaXA1LAlcCgkJCQkgICAgTlVMTCB9OwkJCQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF82KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYpCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2IH07CVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgZm9yY2VfIyNjaGlwNSwJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDYsIE5VTEwgfTsJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzcoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwgY2hpcDcpIFwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LAlcCgkgICAgIGNoaXA3IH07CQkJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA3KTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA2LCBmb3JjZV8jI2NoaXA3LAlcCgkJCQkgICAgTlVMTCB9OwkJCQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF84KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsIGNoaXA3LCBjaGlwOCkgXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsCVwKCSAgICAgY2hpcDcsIGNoaXA4IH07CQkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDcpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA4KTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA2LCBmb3JjZV8jI2NoaXA3LAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwOCwgTlVMTCB9OwkJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNlbmRpZiAvKiBfTElOVVhfSTJDX0ggKi8K