LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAJCQkJCQkJCQkgICAgICovCi8qIGkyYy5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBpMmMtYnVzIGludGVyZmFjZQkJCSAgICAgKi8KLyogCQkJCQkJCQkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQKICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKI2lmbmRlZiBfTElOVVhfSTJDX0gKI2RlZmluZSBfTElOVVhfSTJDX0gKCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIGZvciBzdHJ1Y3QgZGV2aWNlICovCiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgY29tcGxldGlvbiAqLwojaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgoKLyogLS0tIEZvciBpMmMtaXNhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmV4dGVybiB2b2lkIGkyY19hZGFwdGVyX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldik7CmV4dGVybiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpMmNfYWRhcHRlcl9kcml2ZXI7CmV4dGVybiBzdHJ1Y3QgY2xhc3MgaTJjX2FkYXB0ZXJfY2xhc3M7CmV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlOwoKLyogLS0tIEdlbmVyYWwgb3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCnN0cnVjdCBpMmNfbXNnOwpzdHJ1Y3QgaTJjX2FsZ29yaXRobTsKc3RydWN0IGkyY19hZGFwdGVyOwpzdHJ1Y3QgaTJjX2NsaWVudDsKc3RydWN0IGkyY19kcml2ZXI7CnVuaW9uIGkyY19zbWJ1c19kYXRhOwoKLyoKICogVGhlIG1hc3RlciByb3V0aW5lcyBhcmUgdGhlIG9uZXMgbm9ybWFsbHkgdXNlZCB0byB0cmFuc21pdCBkYXRhIHRvIGRldmljZXMKICogb24gYSBidXMgKG9yIHJlYWQgZnJvbSB0aGVtKS4gQXBhcnQgZnJvbSB0d28gYmFzaWMgdHJhbnNmZXIgZnVuY3Rpb25zIHRvIAogKiB0cmFuc21pdCBvbmUgbWVzc2FnZSBhdCBhIHRpbWUsIGEgbW9yZSBjb21wbGV4IHZlcnNpb24gY2FuIGJlIHVzZWQgdG8gCiAqIHRyYW5zbWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgbWVzc2FnZXMgd2l0aG91dCBpbnRlcnJ1cHRpb24uCiAqLwpleHRlcm4gaW50IGkyY19tYXN0ZXJfc2VuZChzdHJ1Y3QgaTJjX2NsaWVudCAqLGNvbnN0IGNoYXIqICxpbnQpOwpleHRlcm4gaW50IGkyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgaTJjX2NsaWVudCAqLGNoYXIqICxpbnQpOwoKLyogVHJhbnNmZXIgbnVtIG1lc3NhZ2VzLgogKi8KZXh0ZXJuIGludCBpMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSk7CgovKgogKiBTb21lIGFkYXB0ZXIgdHlwZXMgKGkuZS4gUENGIDg1ODQgYmFzZWQgb25lcykgbWF5IHN1cHBvcnQgc2xhdmUgYmVoYXZpdW9yLiAKICogVGhpcyBpcyBub3QgdGVzdGVkL2ltcGxlbWVudGVkIHlldCBhbmQgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KICovCmV4dGVybiBpbnQgaTJjX3NsYXZlX3NlbmQoc3RydWN0IGkyY19jbGllbnQgKixjaGFyKixpbnQpOwpleHRlcm4gaW50IGkyY19zbGF2ZV9yZWN2KHN0cnVjdCBpMmNfY2xpZW50ICosY2hhciosaW50KTsKCgoKLyogVGhpcyBpcyB0aGUgdmVyeSBnZW5lcmFsaXplZCBTTUJ1cyBhY2Nlc3Mgcm91dGluZS4gWW91IHByb2JhYmx5IGRvIG5vdAogICB3YW50IHRvIHVzZSB0aGlzLCB0aG91Z2g7IG9uZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IG1heSBiZSBtdWNoIGVhc2llciwKICAgYW5kIHByb2JhYmx5IGp1c3QgYXMgZmFzdC4gCiAgIE5vdGUgdGhhdCB3ZSB1c2UgaTJjX2FkYXB0ZXIgaGVyZSwgYmVjYXVzZSB5b3UgZG8gbm90IG5lZWQgYSBzcGVjaWZpYwogICBzbWJ1cyBhZGFwdGVyIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4gKi8KZXh0ZXJuIHMzMiBpMmNfc21idXNfeGZlciAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKTsKCi8qIE5vdyBmb2xsb3cgdGhlICduaWNlJyBhY2Nlc3Mgcm91dGluZXMuIFRoZXNlIGFsc28gZG9jdW1lbnQgdGhlIGNhbGxpbmcKICAgY29udmVudGlvbnMgb2Ygc21idXNfYWNjZXNzLiAqLwoKZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfcXVpY2soc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsIHU4IHZhbHVlKTsKZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KTsKZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggY29tbWFuZCk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHU4IHZhbHVlKTsKZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsIHU4IGNvbW1hbmQpOwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAoJCQkJICAgICAgdTggY29tbWFuZCwgdTggbGVuZ3RoLAoJCQkJICAgICAgdTggKnZhbHVlcyk7Ci8qIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzICovCmV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCgkJCQkJIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpOwoKLyoKICogQSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBvbmUgb3IgbW9yZSBwaHlzaWNhbCBkZXZpY2VzIHByZXNlbnQgb24KICogSTJDIGFkYXB0ZXJzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYWRhcHRlcgogKiBldmVudHMuCiAqLwoKc3RydWN0IGkyY19kcml2ZXIgewoJc3RydWN0IG1vZHVsZSAqb3duZXI7CgljaGFyIG5hbWVbMzJdOwoJaW50IGlkOwoJdW5zaWduZWQgaW50IGNsYXNzOwoJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogZGl2Liwgc2VlIGJlbG93CQkqLwoKCS8qIE5vdGlmaWVzIHRoZSBkcml2ZXIgdGhhdCBhIG5ldyBidXMgaGFzIGFwcGVhcmVkLiBUaGlzIHJvdXRpbmUKCSAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gdGVzdCBpZiB0aGUgYnVzIG1lZXRzIGl0cyBjb25kaXRpb25zCgkgKiAmIHNlZWsgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgY2hpcChzKSBpdCBzdXBwb3J0cy4gSWYgZm91bmQsIGl0IAoJICogcmVnaXN0ZXJzIHRoZSBjbGllbnQocykgdGhhdCBhcmUgb24gdGhlIGJ1cyB0byB0aGUgaTJjIGFkbWluLiB2aWEKCSAqIGkyY19hdHRhY2hfY2xpZW50LgoJICovCglpbnQgKCphdHRhY2hfYWRhcHRlcikoc3RydWN0IGkyY19hZGFwdGVyICopOwoJaW50ICgqZGV0YWNoX2FkYXB0ZXIpKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKCgkvKiB0ZWxscyB0aGUgZHJpdmVyIHRoYXQgYSBjbGllbnQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCAmIGdpdmVzIGl0IAoJICogdGhlIGNoYW5jZSB0byByZW1vdmUgaXRzIHByaXZhdGUgZGF0YS4gQWxzbywgaWYgdGhlIGNsaWVudCBzdHJ1Y3QKCSAqIGhhcyBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGluIHRoZSBmdW5jdGlvbiBhYm92ZSwKCSAqIGl0IG11c3QgYmUgZnJlZWQgaGVyZS4KCSAqLwoJaW50ICgqZGV0YWNoX2NsaWVudCkoc3RydWN0IGkyY19jbGllbnQgKik7CgkKCS8qIGEgaW9jdGwgbGlrZSBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKCSAqIHdpdGggdGhlIGRldmljZS4KCSAqLwoJaW50ICgqY29tbWFuZCkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCx1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwoKCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKfTsKI2RlZmluZSB0b19pMmNfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2RyaXZlciwgZHJpdmVyKQoKI2RlZmluZSBJMkNfTkFNRV9TSVpFCTUwCgovKgogKiBpMmNfY2xpZW50IGlkZW50aWZpZXMgYSBzaW5nbGUgZGV2aWNlIChpLmUuIGNoaXApIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFuIAogKiBpMmMgYnVzLiBUaGUgYmVoYXZpb3VyIGlzIGRlZmluZWQgYnkgdGhlIHJvdXRpbmVzIG9mIHRoZSBkcml2ZXIuIFRoaXMKICogZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgZm9yIGxvb2t1cCAmIG90aGVyIGFkbWluLiBmdW5jdGlvbnMuCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudCB7Cgl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBkaXYuLCBzZWUgYmVsb3cJCSovCgl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogY2hpcCBhZGRyZXNzIC0gTk9URTogN2JpdCAJKi8KCQkJCQkvKiBhZGRyZXNzZXMgYXJlIHN0b3JlZCBpbiB0aGUJKi8KCQkJCQkvKiBfTE9XRVJfIDcgYml0cwkJKi8KCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsJLyogdGhlIGFkYXB0ZXIgd2Ugc2l0IG9uCSovCglzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyOwkvKiBhbmQgb3VyIGFjY2VzcyByb3V0aW5lcwkqLwoJaW50IHVzYWdlX2NvdW50OwkJLyogSG93IG1hbnkgYWNjZXNzZXMgY3VycmVudGx5ICAqLwoJCQkJCS8qIHRvIHRoZSBjbGllbnQJCSovCglzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHRoZSBkZXZpY2Ugc3RydWN0dXJlCQkqLwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwoJc3RydWN0IGNvbXBsZXRpb24gcmVsZWFzZWQ7Cn07CiNkZWZpbmUgdG9faTJjX2NsaWVudChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19jbGllbnQsIGRldikKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGkyY19jbGllbnQgKmtvYmpfdG9faTJjX2NsaWVudChzdHJ1Y3Qga29iamVjdCAqa29iaikKewoJcmV0dXJuIHRvX2kyY19jbGllbnQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKfQoKc3RhdGljIGlubGluZSB2b2lkICppMmNfZ2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYpCnsKCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYsIHZvaWQgKmRhdGEpCnsKCWRldl9zZXRfZHJ2ZGF0YSAoJmRldi0+ZGV2LCBkYXRhKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBmb3IgdGhvc2Ugd2hvIGxpa2UgdG8gaW1wbGVtZW50IG5ldyBidXMgZHJpdmVyczoKICogaTJjX2FsZ29yaXRobSBpcyB0aGUgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgb2YgaGFyZHdhcmUgc29sdXRpb25zIHdoaWNoIGNhbgogKiBiZSBhZGRyZXNzZWQgdXNpbmcgdGhlIHNhbWUgYnVzIGFsZ29yaXRobXMgLSBpLmUuIGJpdC1iYW5naW5nIG9yIHRoZSBQQ0Y4NTg0CiAqIHRvIG5hbWUgdHdvIG9mIHRoZSBtb3N0IGNvbW1vbi4KICovCnN0cnVjdCBpMmNfYWxnb3JpdGhtIHsKCS8qIElmIGFuIGFkYXB0ZXIgYWxnb3JpdGhtIGNhbid0IGRvIEkyQy1sZXZlbCBhY2Nlc3MsIHNldCBtYXN0ZXJfeGZlcgoJICAgdG8gTlVMTC4gSWYgYW4gYWRhcHRlciBhbGdvcml0aG0gY2FuIGRvIFNNQnVzIGFjY2Vzcywgc2V0IAoJICAgc21idXNfeGZlci4gSWYgc2V0IHRvIE5VTEwsIHRoZSBTTUJ1cyBwcm90b2NvbCBpcyBzaW11bGF0ZWQKCSAgIHVzaW5nIGNvbW1vbiBJMkMgbWVzc2FnZXMgKi8KCWludCAoKm1hc3Rlcl94ZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZ3MsIAoJICAgICAgICAgICAgICAgICAgIGludCBudW0pOwoJaW50ICgqc21idXNfeGZlcikgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsIAoJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCgkgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSk7CgoJLyogLS0tIHRoZXNlIG9wdGlvbmFsL2Z1dHVyZSB1c2UgZm9yIHNvbWUgYWRhcHRlciB0eXBlcy4qLwoJaW50ICgqc2xhdmVfc2VuZCkoc3RydWN0IGkyY19hZGFwdGVyICosY2hhciosaW50KTsKCWludCAoKnNsYXZlX3JlY3YpKHN0cnVjdCBpMmNfYWRhcHRlciAqLGNoYXIqLGludCk7CgoJLyogLS0tIGlvY3RsIGxpa2UgY2FsbCB0byBzZXQgZGl2LiBwYXJhbWV0ZXJzLiAqLwoJaW50ICgqYWxnb19jb250cm9sKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKCgkvKiBUbyBkZXRlcm1pbmUgd2hhdCB0aGUgYWRhcHRlciBzdXBwb3J0cyAqLwoJdTMyICgqZnVuY3Rpb25hbGl0eSkgKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKfTsKCi8qCiAqIGkyY19hZGFwdGVyIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSBhIHBoeXNpY2FsIGkyYyBidXMgYWxvbmcKICogd2l0aCB0aGUgYWNjZXNzIGFsZ29yaXRobXMgbmVjZXNzYXJ5IHRvIGFjY2VzcyBpdC4KICovCnN0cnVjdCBpMmNfYWRhcHRlciB7CglzdHJ1Y3QgbW9kdWxlICpvd25lcjsKCXVuc2lnbmVkIGludCBpZDsKCXVuc2lnbmVkIGludCBjbGFzczsKCXN0cnVjdCBpMmNfYWxnb3JpdGhtICphbGdvOy8qIHRoZSBhbGdvcml0aG0gdG8gYWNjZXNzIHRoZSBidXMJKi8KCXZvaWQgKmFsZ29fZGF0YTsKCgkvKiAtLS0gYWRtaW5pc3RyYXRpb24gc3R1ZmYuICovCglpbnQgKCpjbGllbnRfcmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoJaW50ICgqY2xpZW50X3VucmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoKCS8qIGRhdGEgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGZvciBhbGwgZGV2aWNlcwkqLwoJc3RydWN0IHNlbWFwaG9yZSBidXNfbG9jazsKCXN0cnVjdCBzZW1hcGhvcmUgY2xpc3RfbG9jazsKCglpbnQgdGltZW91dDsKCWludCByZXRyaWVzOwoJc3RydWN0IGRldmljZSBkZXY7CQkvKiB0aGUgYWRhcHRlciBkZXZpY2UgKi8KCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OwkvKiB0aGUgY2xhc3MgZGV2aWNlICovCgoJaW50IG5yOwoJc3RydWN0IGxpc3RfaGVhZCBjbGllbnRzOwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwoJc3RydWN0IGNvbXBsZXRpb24gZGV2X3JlbGVhc2VkOwoJc3RydWN0IGNvbXBsZXRpb24gY2xhc3NfZGV2X3JlbGVhc2VkOwp9OwojZGVmaW5lIGRldl90b19pMmNfYWRhcHRlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19hZGFwdGVyLCBkZXYpCiNkZWZpbmUgY2xhc3NfZGV2X3RvX2kyY19hZGFwdGVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIsIGNsYXNzX2RldikKCnN0YXRpYyBpbmxpbmUgdm9pZCAqaTJjX2dldF9hZGFwZGF0YSAoc3RydWN0IGkyY19hZGFwdGVyICpkZXYpCnsKCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc2V0X2FkYXBkYXRhIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRldiwgdm9pZCAqZGF0YSkKewoJZGV2X3NldF9kcnZkYXRhICgmZGV2LT5kZXYsIGRhdGEpOwp9CgovKmZsYWdzIGZvciB0aGUgZHJpdmVyIHN0cnVjdDogKi8KI2RlZmluZSBJMkNfREZfTk9USUZZCTB4MDEJCS8qIG5vdGlmeSBvbiBidXMgKGRlL2EpdHRhY2hlcyAJKi8KI2lmIDAKLyogdGhpcyBmbGFnIGlzIGdvbmUgLS0gdGhlcmUgaXMgYSAob3B0aW9uYWwpIGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIKICogY2FsbGJhY2sgbm93IHdoaWNoIGNhbiBiZSB1c2VkIGluc3RlYWQgKi8KIyBkZWZpbmUgSTJDX0RGX0RVTU1ZCTB4MDIKI2VuZGlmCgovKmZsYWdzIGZvciB0aGUgY2xpZW50IHN0cnVjdDogKi8KI2RlZmluZSBJMkNfQ0xJRU5UX0FMTE9XX1VTRQkJMHgwMQkvKiBDbGllbnQgYWxsb3dzIGFjY2VzcyAqLwojZGVmaW5lIEkyQ19DTElFTlRfQUxMT1dfTVVMVElQTEVfVVNFIAkweDAyICAJLyogQWxsb3cgbXVsdGlwbGUgYWNjZXNzLWxvY2tzICovCgkJCQkJCS8qIG9uIGFuIGkyY19jbGllbnQgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX1BFQyAgMHgwNAkJCS8qIFVzZSBQYWNrZXQgRXJyb3IgQ2hlY2tpbmcgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX1RFTgkweDEwCQkJLyogd2UgaGF2ZSBhIHRlbiBiaXQgY2hpcCBhZGRyZXNzCSovCgkJCQkJCS8qIE11c3QgZXF1YWwgSTJDX01fVEVOIGJlbG93ICovCgovKiBpMmMgYWRhcHRlciBjbGFzc2VzIChiaXRtYXNrKSAqLwojZGVmaW5lIEkyQ19DTEFTU19IV01PTgkJKDE8PDApCS8qIGxtX3NlbnNvcnMsIC4uLiAqLwojZGVmaW5lIEkyQ19DTEFTU19UVl9BTkFMT0cJKDE8PDEpCS8qIGJ0dHYgKyBmcmllbmRzICovCiNkZWZpbmUgSTJDX0NMQVNTX1RWX0RJR0lUQUwJKDE8PDIpCS8qIGR2YiBjYXJkcyAqLwojZGVmaW5lIEkyQ19DTEFTU19EREMJCSgxPDwzKQkvKiBpMmMtbWF0cm94ZmIgPyAqLwojZGVmaW5lIEkyQ19DTEFTU19DQU1fQU5BTE9HCSgxPDw0KQkvKiBjYW1lcmEgd2l0aCBhbmFsb2cgQ0NEICovCiNkZWZpbmUgSTJDX0NMQVNTX0NBTV9ESUdJVEFMCSgxPDw1KQkvKiBtb3N0IHdlYmNhbXMgKi8KI2RlZmluZSBJMkNfQ0xBU1NfU09VTkQJCSgxPDw2KQkvKiBzb3VuZCBkZXZpY2VzICovCiNkZWZpbmUgSTJDX0NMQVNTX0FMTAkJKFVJTlRfTUFYKSAvKiBhbGwgb2YgdGhlIGFib3ZlICovCgovKiBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBpcyB0aGUgc3RydWN0IGZvciBob2xkaW5nIGRlZmF1bHQgY2xpZW50CiAqIGFkZHJlc3NlcyBmb3IgYSBkcml2ZXIgYW5kIGZvciB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCBvbiB0aGUKICogY29tbWFuZCBsaW5lCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgewoJdW5zaWduZWQgc2hvcnQgKm5vcm1hbF9pMmM7Cgl1bnNpZ25lZCBzaG9ydCAqcHJvYmU7Cgl1bnNpZ25lZCBzaG9ydCAqaWdub3JlOwoJdW5zaWduZWQgc2hvcnQgKipmb3JjZXM7Cn07CgovKiBJbnRlcm5hbCBudW1iZXJzIHRvIHRlcm1pbmF0ZSBsaXN0cyAqLwojZGVmaW5lIEkyQ19DTElFTlRfRU5ECQkweGZmZmVVCgovKiBUaGUgbnVtYmVycyB0byB1c2UgdG8gc2V0IEkyQyBidXMgYWRkcmVzcyAqLwojZGVmaW5lIEFOWV9JMkNfQlVTCQkweGZmZmYKI2RlZmluZSBBTllfSTJDX0lTQV9CVVMJCTkxOTEKCgovKiAtLS0tLSBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgaTJjLm8gKi8KCi8qIGFkbWluaXN0cmF0aW9uLi4uCiAqLwpleHRlcm4gaW50IGkyY19hZGRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CmV4dGVybiBpbnQgaTJjX2RlbF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKCmV4dGVybiBpbnQgaTJjX2FkZF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CmV4dGVybiBpbnQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CgpleHRlcm4gaW50IGkyY19hdHRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwpleHRlcm4gaW50IGkyY19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwoKLyogTmV3IGZ1bmN0aW9uOiBUaGlzIGlzIHRvIGdldCBhbiBpMmNfY2xpZW50LXN0cnVjdCBmb3IgY29udHJvbGxpbmcgdGhlIAogICBjbGllbnQgZWl0aGVyIGJ5IHVzaW5nIGkyY19jb250cm9sLWZ1bmN0aW9uIG9yIGhhdmluZyB0aGUgCiAgIGNsaWVudC1tb2R1bGUgZXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGkyY19jbGllbnQKICAgLXN0cnVjdC4gKi8KZXh0ZXJuIHN0cnVjdCBpMmNfY2xpZW50ICppMmNfZ2V0X2NsaWVudChpbnQgZHJpdmVyX2lkLCBpbnQgYWRhcHRlcl9pZCwgCgkJCQkJc3RydWN0IGkyY19jbGllbnQgKnByZXYpOwoKLyogU2hvdWxkIGJlIHVzZWQgd2l0aCBuZXcgZnVuY3Rpb24KICAgZXh0ZXJuIHN0cnVjdCBpMmNfY2xpZW50ICppMmNfZ2V0X2NsaWVudChpbnQsaW50LHN0cnVjdCBpMmNfY2xpZW50ICopOwogICB0byBtYWtlIHN1cmUgdGhhdCBjbGllbnQtc3RydWN0IGlzIHZhbGlkIGFuZCB0aGF0IGl0IGlzIG9rYXkgdG8gYWNjZXNzCiAgIHRoZSBpMmMtY2xpZW50LiAKICAgcmV0dXJucyAtRUFDQ0VTIGlmIGNsaWVudCBkb2Vzbid0IGFsbG93IHVzZSAoZGVmYXVsdCkKICAgcmV0dXJucyAtRUJVU1kgaWYgY2xpZW50IGRvZXNuJ3QgYWxsb3cgbXVsdGlwbGUgdXNlIChkZWZhdWx0KSBhbmQgCiAgIHVzYWdlX2NvdW50ID4wICovCmV4dGVybiBpbnQgaTJjX3VzZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKik7CmV4dGVybiBpbnQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwoKLyogY2FsbCB0aGUgaTJjX2NsaWVudC0+Y29tbWFuZCgpIG9mIGFsbCBhdHRhY2hlZCBjbGllbnRzIHdpdGgKICogdGhlIGdpdmVuIGFyZ3VtZW50cyAqLwpleHRlcm4gdm9pZCBpMmNfY2xpZW50c19jb21tYW5kKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKCQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CgovKiByZXR1cm5zIC1FQlVTWSBpZiBhZGRyZXNzIGhhcyBiZWVuIHRha2VuLCAwIGlmIG5vdC4gTm90ZSB0aGF0IHRoZSBvbmx5CiAgIG90aGVyIHBsYWNlIGF0IHdoaWNoIHRoaXMgaXMgY2FsbGVkIGlzIHdpdGhpbiBpMmNfYXR0YWNoX2NsaWVudDsgc28KICAgeW91IGNhbiBjaGVhdCBieSBzaW1wbHkgbm90IHJlZ2lzdGVyaW5nLiBOb3QgcmVjb21tZW5kZWQsIG9mIGNvdXJzZSEgKi8KZXh0ZXJuIGludCBpMmNfY2hlY2tfYWRkciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcik7CgovKiBEZXRlY3QgZnVuY3Rpb24uIEl0IGl0ZXJhdGVzIG92ZXIgYWxsIHBvc3NpYmxlIGFkZHJlc3NlcyBpdHNlbGYuCiAqIEl0IHdpbGwgb25seSBjYWxsIGZvdW5kX3Byb2MgaWYgc29tZSBjbGllbnQgaXMgY29ubmVjdGVkIGF0IHRoZQogKiBzcGVjaWZpYyBhZGRyZXNzICh1bmxlc3MgYSAnZm9yY2UnIG1hdGNoZWQpOwogKi8KZXh0ZXJuIGludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKCQlzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgKmFkZHJlc3NfZGF0YSwKCQlpbnQgKCpmb3VuZF9wcm9jKSAoc3RydWN0IGkyY19hZGFwdGVyICosIGludCwgaW50KSk7CgovKiBBbiBpb2N0bCBsaWtlIGNhbGwgdG8gc2V0IGRpdi4gcGFyYW1ldGVycyBvZiB0aGUgYWRhcHRlci4KICovCmV4dGVybiBpbnQgaTJjX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKix1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwoKZXh0ZXJuIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2dldF9hZGFwdGVyKGludCBpZCk7CmV4dGVybiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApOwoKCi8qIFJldHVybiB0aGUgZnVuY3Rpb25hbGl0eSBtYXNrICovCnN0YXRpYyBpbmxpbmUgdTMyIGkyY19nZXRfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiBhZGFwLT5hbGdvLT5mdW5jdGlvbmFsaXR5KGFkYXApOwp9CgovKiBSZXR1cm4gMSBpZiBhZGFwdGVyIHN1cHBvcnRzIGV2ZXJ5dGhpbmcgd2UgbmVlZCwgMCBpZiBub3QuICovCnN0YXRpYyBpbmxpbmUgaW50IGkyY19jaGVja19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTMyIGZ1bmMpCnsKCXJldHVybiAoZnVuYyAmIGkyY19nZXRfZnVuY3Rpb25hbGl0eShhZGFwKSkgPT0gZnVuYzsKfQoKLyogUmV0dXJuIGlkIG51bWJlciBmb3IgYSBzcGVjaWZpYyBhZGFwdGVyICovCnN0YXRpYyBpbmxpbmUgaW50IGkyY19hZGFwdGVyX2lkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJcmV0dXJuIGFkYXAtPm5yOwp9CgovKgogKiBJMkMgTWVzc2FnZSAtIHVzZWQgZm9yIHB1cmUgaTJjIHRyYW5zYWN0aW9uLCBhbHNvIGZyb20gL2RldiBpbnRlcmZhY2UKICovCnN0cnVjdCBpMmNfbXNnIHsKCV9fdTE2IGFkZHI7CS8qIHNsYXZlIGFkZHJlc3MJCQkqLwogCV9fdTE2IGZsYWdzOwkJCiNkZWZpbmUgSTJDX01fVEVOCTB4MTAJLyogd2UgaGF2ZSBhIHRlbiBiaXQgY2hpcCBhZGRyZXNzCSovCiNkZWZpbmUgSTJDX01fUkQJMHgwMQojZGVmaW5lIEkyQ19NX05PU1RBUlQJMHg0MDAwCiNkZWZpbmUgSTJDX01fUkVWX0RJUl9BRERSCTB4MjAwMAojZGVmaW5lIEkyQ19NX0lHTk9SRV9OQUsJMHgxMDAwCiNkZWZpbmUgSTJDX01fTk9fUkRfQUNLCQkweDA4MDAKIAlfX3UxNiBsZW47CQkvKiBtc2cgbGVuZ3RoCQkJCSovCiAJX191OCAqYnVmOwkJLyogcG9pbnRlciB0byBtc2cgZGF0YQkJCSovCn07CgovKiBUbyBkZXRlcm1pbmUgd2hhdCBmdW5jdGlvbmFsaXR5IGlzIHByZXNlbnQgKi8KCiNkZWZpbmUgSTJDX0ZVTkNfSTJDCQkJMHgwMDAwMDAwMQojZGVmaW5lIEkyQ19GVU5DXzEwQklUX0FERFIJCTB4MDAwMDAwMDIKI2RlZmluZSBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORwkweDAwMDAwMDA0IC8qIEkyQ19NX3tSRVZfRElSX0FERFIsTk9TVEFSVCwuLn0gKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19IV1BFQ19DQUxDCTB4MDAwMDAwMDggLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMCTB4MDAwMDgwMDAgLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUVVJQ0sJCTB4MDAwMTAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFCTB4MDAwMjAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURQkweDAwMDQwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCTB4MDAwODAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBCTB4MDAxMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEJMHgwMDIwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEJMHgwMDQwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEwJMHgwMDgwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEJMHgwMTAwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIDB4MDIwMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0sJMHgwNDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSwkweDA4MDAwMDAwIC8qIHcvIDEtYnl0ZSByZWcuIGFkZHIuICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0tfMgkgMHgxMDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DS18yIDB4MjAwMDAwMDAgLyogdy8gMi1ieXRlIHJlZy4gYWRkci4gKi8KCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQllURSAoSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIChJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgKEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEEgKEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSyAoSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0sgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0spCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLXzIgKEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLXzIgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DS18yKQoKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19FTVVMIChJMkNfRlVOQ19TTUJVU19RVUlDSyB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKQoKLyogCiAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzIAogKi8KI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfTUFYCTMyCS8qIEFzIHNwZWNpZmllZCBpbiBTTUJ1cyBzdGFuZGFyZCAqLwkKdW5pb24gaTJjX3NtYnVzX2RhdGEgewoJX191OCBieXRlOwoJX191MTYgd29yZDsKCV9fdTggYmxvY2tbSTJDX1NNQlVTX0JMT0NLX01BWCArIDJdOyAvKiBibG9ja1swXSBpcyB1c2VkIGZvciBsZW5ndGggKi8KCSAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG9uZSBtb3JlIGZvciB1c2VyLXNwYWNlIGNvbXBhdGliaWxpdHkgKi8KfTsKCi8qIHNtYnVzX2FjY2VzcyByZWFkIG9yIHdyaXRlIG1hcmtlcnMgKi8KI2RlZmluZSBJMkNfU01CVVNfUkVBRAkxCiNkZWZpbmUgSTJDX1NNQlVTX1dSSVRFCTAKCi8qIFNNQnVzIHRyYW5zYWN0aW9uIHR5cGVzIChzaXplIHBhcmFtZXRlciBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zKSAKICAgTm90ZTogdGhlc2Ugbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gdGhlIChhcmJpdHJhcnkpIFBJSVg0IGludGVybmFsIGNvZGVzISAqLwojZGVmaW5lIEkyQ19TTUJVU19RVUlDSwkJICAgIDAKI2RlZmluZSBJMkNfU01CVVNfQllURQkJICAgIDEKI2RlZmluZSBJMkNfU01CVVNfQllURV9EQVRBCSAgICAyIAojZGVmaW5lIEkyQ19TTUJVU19XT1JEX0RBVEEJICAgIDMKI2RlZmluZSBJMkNfU01CVVNfUFJPQ19DQUxMCSAgICA0CiNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX0RBVEEJICAgIDUKI2RlZmluZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEgICAgNgojZGVmaW5lIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEwgICA3CQkvKiBTTUJ1cyAyLjAgKi8KCgovKiAtLS0tLSBjb21tYW5kcyBmb3IgdGhlIGlvY3RsIGxpa2UgaTJjX2NvbW1hbmQgY2FsbDoKICogbm90ZSB0aGF0IGFkZGl0aW9uYWwgY2FsbHMgYXJlIGRlZmluZWQgaW4gdGhlIGFsZ29yaXRobSBhbmQgaHcgCiAqCWRlcGVuZGVudCBsYXllcnMgLSB0aGVzZSBjYW4gYmUgbGlzdGVkIGhlcmUsIG9yIHNlZSB0aGUgCiAqCWNvcnJlc3BvbmRpbmcgaGVhZGVyIGZpbGVzLgogKi8KCQkJCS8qIC0+IGJpdC1hZGFwdGVyIHNwZWNpZmljIGlvY3RscwkqLwojZGVmaW5lIEkyQ19SRVRSSUVTCTB4MDcwMQkvKiBudW1iZXIgb2YgdGltZXMgYSBkZXZpY2UgYWRkcmVzcyAgICAgICovCgkJCQkvKiBzaG91bGQgYmUgcG9sbGVkIHdoZW4gbm90ICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2tub3dsZWRnaW5nIAkJCSovCiNkZWZpbmUgSTJDX1RJTUVPVVQJMHgwNzAyCS8qIHNldCB0aW1lb3V0IC0gY2FsbCB3aXRoIGludCAJCSovCgoKLyogdGhpcyBpcyBmb3IgaTJjLWRldi5jCSovCiNkZWZpbmUgSTJDX1NMQVZFCTB4MDcwMwkvKiBDaGFuZ2Ugc2xhdmUgYWRkcmVzcwkJCSovCgkJCQkvKiBBdHRuLjogU2xhdmUgYWRkcmVzcyBpcyA3IG9yIDEwIGJpdHMgKi8KI2RlZmluZSBJMkNfU0xBVkVfRk9SQ0UJMHgwNzA2CS8qIENoYW5nZSBzbGF2ZSBhZGRyZXNzCQkJKi8KCQkJCS8qIEF0dG4uOiBTbGF2ZSBhZGRyZXNzIGlzIDcgb3IgMTAgYml0cyAqLwoJCQkJLyogVGhpcyBjaGFuZ2VzIHRoZSBhZGRyZXNzLCBldmVuIGlmIGl0ICovCgkJCQkvKiBpcyBhbHJlYWR5IHRha2VuIQkJCSovCiNkZWZpbmUgSTJDX1RFTkJJVAkweDA3MDQJLyogMCBmb3IgNyBiaXQgYWRkcnMsICE9IDAgZm9yIDEwIGJpdAkqLwoKI2RlZmluZSBJMkNfRlVOQ1MJMHgwNzA1CS8qIEdldCB0aGUgYWRhcHRlciBmdW5jdGlvbmFsaXR5ICovCiNkZWZpbmUgSTJDX1JEV1IJMHgwNzA3CS8qIENvbWJpbmVkIFIvVyB0cmFuc2ZlciAob25lIHN0b3Agb25seSkqLwojZGVmaW5lIEkyQ19QRUMJCTB4MDcwOAkvKiAhPSAwIGZvciBTTUJ1cyBQRUMgICAgICAgICAgICAgICAgICAgKi8KCiNkZWZpbmUgSTJDX1NNQlVTCTB4MDcyMAkvKiBTTUJ1cy1sZXZlbCBhY2Nlc3MgKi8KCi8qIC0tLS0tIEkyQy1ERVY6IGNoYXIgZGV2aWNlIGludGVyZmFjZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIEkyQ19NQUpPUgk4OQkJLyogRGV2aWNlIG1ham9yIG51bWJlcgkJKi8KCi8qIFRoZXNlIGRlZmluZXMgYXJlIHVzZWQgZm9yIHByb2JpbmcgaTJjIGNsaWVudCBhZGRyZXNzZXMgKi8KLyogVGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uIGxpc3RzICovCiNkZWZpbmUgSTJDX0NMSUVOVF9NQVhfT1BUUyA0OAoKLyogRGVmYXVsdCBmaWxsIG9mIG1hbnkgdmFyaWFibGVzICovCiNkZWZpbmUgSTJDX0NMSUVOVF9ERUZBVUxUUyB7STJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH0KCi8qIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0gY3JlYXRlcyBhIG1vZHVsZSBwYXJhbWV0ZXIsIGFuZCBwdXRzIGl0IGluIHRoZQogICBtb2R1bGUgaGVhZGVyICovCgojZGVmaW5lIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0odmFyLGRlc2MpIFwKICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmFyW0kyQ19DTElFTlRfTUFYX09QVFNdID0gSTJDX0NMSUVOVF9ERUZBVUxUUzsgXAogIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmFyIyNfbnVtOyBcCiAgbW9kdWxlX3BhcmFtX2FycmF5KHZhciwgc2hvcnQsICZ2YXIjI19udW0sIDApOyBcCiAgTU9EVUxFX1BBUk1fREVTQyh2YXIsZGVzYykKCiNkZWZpbmUgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShuYW1lKQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2VfIyNuYW1lLAkJCQkJXAoJCSAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgd2hpY2ggYXJlICIJXAoJCSAgICAgICAidW5xdWVzdGlvbmFibHkgYXNzdW1lZCB0byBjb250YWluIGEgYCIJCVwKCQkgICAgICAgIyBuYW1lICInIGNoaXAiKQoKCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0ocHJvYmUsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBzY2FuICIJXAoJCSAgICAgICAiYWRkaXRpb25hbGx5Iik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oaWdub3JlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgbm90IHRvICIJXAoJCSAgICAgICAic2NhbiIpOwkJCQkJCVwKc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CQkJXAoJLm5vcm1hbF9pMmMJPSBub3JtYWxfaTJjLAkJCQkJXAoJLnByb2JlCQk9IHByb2JlLAkJCQkJXAoJLmlnbm9yZQkJPSBpZ25vcmUsCQkJCQlcCgkuZm9yY2VzCQk9IGZvcmNlcywJCQkJCVwKfQoKLyogVGhlc2UgYXJlIHRoZSBvbmVzIHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIG93biBkcml2ZXJzLiBQaWNrIHRoZSBvbmUKICAgd2hpY2ggbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGRldmljZXMgdGhlIGRyaXZlciBkaWZmZXJlbmNpYXRlcyBiZXR3ZWVuLiAqLwojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EIFwKICBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCBcCiAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gYm9sZGx5IGFzc3VtZSAiIFwKICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7CQkJCVwKCQkJZm9yY2UsCQkJCQkJXAoJCQlOVUxMCQkJCQkJXAoJCX07CQkJCQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzEoY2hpcDEpCQkJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEgfTsJCQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLCBOVUxMIH07CVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzIoY2hpcDEsIGNoaXAyKQkJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyIH07CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBOVUxMIH07CQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF8zKGNoaXAxLCBjaGlwMiwgY2hpcDMpCQkJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMgfTsJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBOVUxMIH07CQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzQoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQpCQkJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0IH07CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgTlVMTH07CQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF81KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSkJCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUgfTsJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBmb3JjZV8jI2NoaXA1LAlcCgkJCQkgICAgTlVMTCB9OwkJCQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF82KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYpCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2IH07CVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgZm9yY2VfIyNjaGlwNSwJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDYsIE5VTEwgfTsJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzcoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwgY2hpcDcpIFwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LAlcCgkgICAgIGNoaXA3IH07CQkJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA3KTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA2LCBmb3JjZV8jI2NoaXA3LAlcCgkJCQkgICAgTlVMTCB9OwkJCQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF84KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsIGNoaXA3LCBjaGlwOCkgXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsCVwKCSAgICAgY2hpcDcsIGNoaXA4IH07CQkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDcpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA4KTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA2LCBmb3JjZV8jI2NoaXA3LAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwOCwgTlVMTCB9OwkJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNlbmRpZiAvKiBfTElOVVhfSTJDX0ggKi8K