LyoKICogUlBDIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxLTIwMDIgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19ERUZTX0gKI2RlZmluZSBfX1dJTkVfUlBDX0RFRlNfSAoKLyogaW5mbyBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMDM5OC9kY29tdGV4dGZpZ3MuaHRtICovCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBycGNfdmVyOyAgICAgICAgICAvKiBSUEMgbWFqb3IgdmVyc2lvbiAoNSkgKi8KICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7ICAgIC8qIFJQQyBtaW5vciB2ZXJzaW9uICgwKSAqLwogIHVuc2lnbmVkIGNoYXIgcHR5cGU7ICAgICAgICAgICAgLyogUGFja2V0IHR5cGUgKFBLVF8qKSAqLwogIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CiAgdW5zaWduZWQgY2hhciBkcmVwWzRdOyAgICAgICAgICAvKiBEYXRhIHJlcHJlc2VudGF0aW9uICovCiAgdW5zaWduZWQgc2hvcnQgZnJhZ19sZW47ICAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgaW5jbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBhdXRoX2xlbjsgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGxlbmd0aCAgKi8KICB1bnNpZ25lZCBsb25nIGNhbGxfaWQ7ICAgICAgICAgIC8qIENhbGwgaWRlbnRpZmllci4gKi8KfSBScGNQa3RDb21tb25IZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIHNob3J0IG9wbnVtOwp9IFJwY1BrdFJlcXVlc3RIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgY2FuY2VsX2NvdW50OwogIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7Cn0gUnBjUGt0UmVzcG9uc2VIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgY2FuY2VsX2NvdW50OyAgICAgLyogUmVjZWl2ZWQgY2FuY2VsIGNvdW50ICovCiAgdW5zaWduZWQgY2hhciByZXNlcnZlZDsgICAgICAgICAvKiBGb3JjZSBhbGlnbm1lbnQhICovCiAgdW5zaWduZWQgbG9uZyBzdGF0dXM7ICAgICAgICAgICAvKiBSdW50aW1lIGZhdWx0IGNvZGUgKFJQQ19TVEFUVVMpICovCiAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDI7Cn0gUnBjUGt0RmF1bHRIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgdW5zaWduZWQgY2hhciBudW1fZWxlbWVudHM7ICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgKi8KICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbM107ICAgICAgIC8qIEZvcmNlIGFsaWdubWVudCEgKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBjaGFyIG51bV9zeW50YXhlczsgICAgIC8qIE51bWJlciBvZiBzeW50YXhlcyAqLwogIFJQQ19TWU5UQVhfSURFTlRJRklFUiBhYnN0cmFjdDsKICBSUENfU1lOVEFYX0lERU5USUZJRVIgdHJhbnNmZXI7Cn0gUnBjUGt0QmluZEhkcjsKCiNpbmNsdWRlICJwc2hwYWNrMS5oIgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOyAgLyogTGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW5jbHVkaW5nIG51bGwgdGVybWluYXRvciAqLwogIGNoYXIgc3RyaW5nWzFdOyAgICAgICAgIC8qIFN0cmluZyBkYXRhIGluIHNpbmdsZSBieXRlLCBudWxsIHRlcm1pbmF0ZWQgZm9ybSAqLwp9IFJwY0FkZHJlc3NTdHJpbmc7CiNpbmNsdWRlICJwb3BwYWNrLmgiCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBudW1fcmVzdWx0czsgICAgICAgLyogTnVtYmVyIG9mIHJlc3VsdHMgKi8KICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzNdOyAgICAgICAvKiBGb3JjZSBhbGlnbm1lbnQhICovCiAgc3RydWN0IHsKICAgIHVuc2lnbmVkIHNob3J0IHJlc3VsdDsKICAgIHVuc2lnbmVkIHNob3J0IHJlYXNvbjsKICB9IHJlc3VsdHNbMV07Cn0gUnBjUmVzdWx0czsKCnR5cGVkZWYgc3RydWN0CnsKICBScGNQa3RDb21tb25IZHIgY29tbW9uOwogIHVuc2lnbmVkIHNob3J0IG1heF90c2l6ZTsgICAgICAgLyogTWF4aW11bSB0cmFuc21pc3Npb24gZnJhZ21lbnQgc2l6ZSAqLwogIHVuc2lnbmVkIHNob3J0IG1heF9yc2l6ZTsgICAgICAgLyogTWF4aW11bSByZWNlaXZlIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBsb25nIGFzc29jX2dpZDsgICAgICAgIC8qIEFzc29jaWF0ZWQgZ3JvdXAgaWQgKi8KICAvKiAKICAgKiBGb2xsb3dpbmcgdGhpcyBoZWFkZXIgYXJlIHRoZXNlIGZpZWxkczoKICAgKiAgIFJwY0FkZHJlc3NTdHJpbmcgc2VydmVyX2FkZHJlc3M7CiAgICogICBbMCAtIDMgYnl0ZXMgb2YgcGFkZGluZyBzbyB0aGF0IHJlc3VsdHMgaXMgNC1ieXRlIGFsaWduZWRdCiAgICogICBScGNSZXN1bHRzIHJlc3VsdHM7CiAgICogICBSUENfU1lOVEFYX0lERU5USUZJRVIgdHJhbnNmZXI7CiAgICovCn0gUnBjUGt0QmluZEFja0hkcjsKCnR5cGVkZWYgc3RydWN0CnsKICBScGNQa3RDb21tb25IZHIgY29tbW9uOwogIHVuc2lnbmVkIHNob3J0IHJlamVjdF9yZWFzb247CiAgdW5zaWduZWQgY2hhciBwcm90b2NvbHNfY291bnQ7CiAgc3RydWN0IHsKICAgIHVuc2lnbmVkIGNoYXIgcnBjX3ZlcjsKICAgIHVuc2lnbmVkIGNoYXIgcnBjX3Zlcl9taW5vcjsKICB9IHByb3RvY29sc1sxXTsKfSBScGNQa3RCaW5kTkFja0hkcjsKCi8qIFVuaW9uIHJlcHJlc2VudGluZyBhbGwgcG9zc2libGUgcGFja2V0IGhlYWRlcnMgKi8KdHlwZWRlZiB1bmlvbgp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICBScGNQa3RSZXF1ZXN0SGRyIHJlcXVlc3Q7CiAgUnBjUGt0UmVzcG9uc2VIZHIgcmVzcG9uc2U7CiAgUnBjUGt0RmF1bHRIZHIgZmF1bHQ7CiAgUnBjUGt0QmluZEhkciBiaW5kOwogIFJwY1BrdEJpbmRBY2tIZHIgYmluZF9hY2s7CiAgUnBjUGt0QmluZE5BY2tIZHIgYmluZF9uYWNrOwp9IFJwY1BrdEhkcjsKCnR5cGVkZWYgc3RydWN0CnsKICB1bnNpZ25lZCBjaGFyIGF1dGhfdHlwZTsgICAgICAgLyogYXV0aGVudGljYXRpb24gc2NoZW1lIGluIHVzZSAqLwogIHVuc2lnbmVkIGNoYXIgYXV0aF9sZXZlbDsgICAgICAvKiBSUENfQ19BVVRITl9MRVZFTCogKi8KICB1bnNpZ25lZCBjaGFyIGF1dGhfcGFkX2xlbmd0aDsgLyogbGVuZ3RoIG9mIHBhZGRpbmcgdG8gcmVzdG9yZSBuICUgNCBhbGlnbm1lbnQgKi8KICB1bnNpZ25lZCBjaGFyIGF1dGhfcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogIHVuc2lnbmVkIGxvbmcgYXV0aF9jb250ZXh0X2lkOyAvKiB1bmlxdWUgdmFsdWUgZm9yIHRoZSBhdXRoZW50aWNhdGVkIGNvbm5lY3Rpb24gKi8KfSBScGNBdXRoVmVyaWZpZXI7CgojZGVmaW5lIFJQQ19BVVRIX1ZFUklGSUVSX0xFTihjb21tb25faGRyKSBcCiAgICAoKGNvbW1vbl9oZHIpLT5hdXRoX2xlbiA/IChjb21tb25faGRyKS0+YXV0aF9sZW4gKyBzaXplb2YoUnBjQXV0aFZlcmlmaWVyKSA6IDApCgojZGVmaW5lIFJQQ19WRVJfTUFKT1IgICAgICAgICAgICAgNQojZGVmaW5lIFJQQ19WRVJfTUlOT1IgICAgICAgICAgICAgMAoKI2RlZmluZSBSUENfRkxHX0ZJUlNUICAgICAgICAgICAgIDEKI2RlZmluZSBSUENfRkxHX0xBU1QgICAgICAgICAgICAgIDIKI2RlZmluZSBSUENfRkxHX09CSkVDVF9VVUlEICAgIDB4ODAKCiNkZWZpbmUgUlBDX01JTl9QQUNLRVRfU0laRSAgMHgxMDAwCiNkZWZpbmUgUlBDX01BWF9QQUNLRVRfU0laRSAgMHgxNkQwCgojZGVmaW5lIFBLVF9SRVFVRVNUICAgICAgICAgICAgIDAKI2RlZmluZSBQS1RfUElORyAgICAgICAgICAgICAgICAxCiNkZWZpbmUgUEtUX1JFU1BPTlNFICAgICAgICAgICAgMgojZGVmaW5lIFBLVF9GQVVMVCAgICAgICAgICAgICAgIDMKI2RlZmluZSBQS1RfV09SS0lORyAgICAgICAgICAgICA0CiNkZWZpbmUgUEtUX05PQ0FMTCAgICAgICAgICAgICAgNQojZGVmaW5lIFBLVF9SRUpFQ1QgICAgICAgICAgICAgIDYKI2RlZmluZSBQS1RfQUNLICAgICAgICAgICAgICAgICA3CiNkZWZpbmUgUEtUX0NMX0NBTkNFTCAgICAgICAgICAgOAojZGVmaW5lIFBLVF9GQUNLICAgICAgICAgICAgICAgIDkKI2RlZmluZSBQS1RfQ0FOQ0VMX0FDSyAgICAgICAgIDEwCiNkZWZpbmUgUEtUX0JJTkQgICAgICAgICAgICAgICAxMQojZGVmaW5lIFBLVF9CSU5EX0FDSyAgICAgICAgICAgMTIKI2RlZmluZSBQS1RfQklORF9OQUNLICAgICAgICAgIDEzCiNkZWZpbmUgUEtUX0FMVEVSX0NPTlRFWFQgICAgICAxNAojZGVmaW5lIFBLVF9BTFRFUl9DT05URVhUX1JFU1AgMTUKI2RlZmluZSBQS1RfQVVUSDMgICAgICAgICAgICAgIDE2CiNkZWZpbmUgUEtUX1NIVVRET1dOICAgICAgICAgICAxNwojZGVmaW5lIFBLVF9DT19DQU5DRUwgICAgICAgICAgMTgKI2RlZmluZSBQS1RfT1JQSEFORUQgICAgICAgICAgIDE5CgojZGVmaW5lIFJFU1VMVF9BQ0NFUFQgICAgICAgICAgICAgICAwCiNkZWZpbmUgUkVTVUxUX1VTRVJfUkVKRUNUSU9OICAgICAgIDEKI2RlZmluZSBSRVNVTFRfUFJPVklERVJfUkVKRUNUSU9OICAgMgoKI2RlZmluZSBSRUFTT05fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAojZGVmaW5lIFJFQVNPTl9BQlNUUkFDVF9TWU5UQVhfTk9UX1NVUFBPUlRFRCAgICAxCiNkZWZpbmUgUkVBU09OX1RSQU5TRkVSX1NZTlRBWEVTX05PVF9TVVBQT1JURUQgIDIKI2RlZmluZSBSRUFTT05fTE9DQUxfTElNSVRfRVhDRUVERUQgICAgICAgICAgICAgMwoKI2RlZmluZSBSRUpFQ1RfUkVBU09OX05PVF9TUEVDSUZJRUQgICAgICAgICAgICAwCiNkZWZpbmUgUkVKRUNUX1RFTVBPUkFSWV9DT05HRVNUSU9OICAgICAgICAgICAgMQojZGVmaW5lIFJFSkVDVF9MT0NBTF9MSU1JVF9FWENFRURFRCAgICAgICAgICAgIDIKI2RlZmluZSBSRUpFQ1RfQ0FMTEVEX1BBRERSX1VOS05PV04gICAgICAgICAgICAzIC8qIG5vdCB1c2VkICovCiNkZWZpbmUgUkVKRUNUX1BST1RPQ09MX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCAgNAojZGVmaW5lIFJFSkVDVF9ERUZBVUxUX0NPTlRFWFRfTk9UX1NVUFBPUlRFRCAgIDUgLyogbm90IHVzZWQgKi8KI2RlZmluZSBSRUpFQ1RfVVNFUl9EQVRBX05PVF9SRUFEQUJMRSAgICAgICAgICA2IC8qIG5vdCB1c2VkICovCiNkZWZpbmUgUkVKRUNUX05PX1BTQVBfQVZBSUxBQkxFICAgICAgICAgICAgICAgNyAvKiBub3QgdXNlZCAqLwojZGVmaW5lIFJFSkVDVF9VTktOT1dOX0FVVEhOX1NFUlZJQ0UgICAgICAgICAgIDgKI2RlZmluZSBSRUpFQ1RfSU5WQUxJRF9DSEVDS1NVTSAgICAgICAgICAgICAgICA5CgojZGVmaW5lIE5DQURHX0lQX1VEUCAgIDB4MDgKI2RlZmluZSBOQ0FDTl9JUF9UQ1AgICAweDA3CiNkZWZpbmUgTkNBREdfSVBYICAgICAgMHgwRQojZGVmaW5lIE5DQUNOX1NQWCAgICAgIDB4MEMKI2RlZmluZSBOQ0FDTl9OQl9OQiAgICAweDEyCiNkZWZpbmUgTkNBQ05fTkJfSVBYICAgMHgwRAojZGVmaW5lIE5DQUNOX0RORVRfTlNQIDB4MDQKI2RlZmluZSBOQ0FDTl9IVFRQICAgICAweDFGCgovKiBGcmVlRENFOiBUV1JfQ19GTFJfUFJPVF9JRF9JUCAqLwojZGVmaW5lIFRXUl9JUCAweDA5CgojZW5kaWYgIC8qIF9fV0lORV9SUENfREVGU19IICovCg==