LyoKICogUlBDIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxLTIwMDIgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19ERUZTX0gKI2RlZmluZSBfX1dJTkVfUlBDX0RFRlNfSAoKLyogaW5mbyBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMDM5OC9kY29tdGV4dGZpZ3MuaHRtICovCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBycGNfdmVyOyAgICAgICAgICAvKiBSUEMgbWFqb3IgdmVyc2lvbiAoNSkgKi8KICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7ICAgIC8qIFJQQyBtaW5vciB2ZXJzaW9uICgwKSAqLwogIHVuc2lnbmVkIGNoYXIgcHR5cGU7ICAgICAgICAgICAgLyogUGFja2V0IHR5cGUgKFBLVF8qKSAqLwogIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CiAgdW5zaWduZWQgY2hhciBkcmVwWzRdOyAgICAgICAgICAvKiBEYXRhIHJlcHJlc2VudGF0aW9uICovCiAgdW5zaWduZWQgc2hvcnQgZnJhZ19sZW47ICAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgaW5jbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBhdXRoX2xlbjsgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGxlbmd0aCAgKi8KICB1bnNpZ25lZCBsb25nIGNhbGxfaWQ7ICAgICAgICAgIC8qIENhbGwgaWRlbnRpZmllci4gKi8KfSBScGNQa3RDb21tb25IZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIHNob3J0IG9wbnVtOwp9IFJwY1BrdFJlcXVlc3RIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgY2FuY2VsX2NvdW50OwogIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7Cn0gUnBjUGt0UmVzcG9uc2VIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBsb25nIGFsbG9jX2hpbnQ7ICAgICAgIC8qIERhdGEgc2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgaGVhZGVyIGFuZCB0YWlsLiAqLwogIHVuc2lnbmVkIHNob3J0IGNvbnRleHRfaWQ7ICAgICAgLyogUHJlc2VudGF0aW9uIGNvbnRleHQgaWRlbnRpZmllciAqLwogIHVuc2lnbmVkIGNoYXIgYWxlcnRfY291bnQ7ICAgICAgLyogUGVuZGluZyBhbGVydCBjb3VudCAqLwogIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1szXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHVuc2lnbmVkIGxvbmcgc3RhdHVzOyAgICAgICAgICAgLyogUnVudGltZSBmYXVsdCBjb2RlIChSUENfU1RBVFVTKSAqLwogIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Cn0gUnBjUGt0RmF1bHRIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgdW5zaWduZWQgY2hhciBudW1fZWxlbWVudHM7ICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgKi8KICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbM107ICAgICAgIC8qIEZvcmNlIGFsaWdubWVudCEgKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBjaGFyIG51bV9zeW50YXhlczsgICAgIC8qIE51bWJlciBvZiBzeW50YXhlcyAqLwogIFJQQ19TWU5UQVhfSURFTlRJRklFUiBhYnN0cmFjdDsKICBSUENfU1lOVEFYX0lERU5USUZJRVIgdHJhbnNmZXI7Cn0gUnBjUGt0QmluZEhkcjsKCiNpbmNsdWRlICJwc2hwYWNrMS5oIgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOyAgLyogTGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW5jbHVkaW5nIG51bGwgdGVybWluYXRvciAqLwogIGNoYXIgc3RyaW5nWzFdOyAgICAgICAgIC8qIFN0cmluZyBkYXRhIGluIHNpbmdsZSBieXRlLCBudWxsIHRlcm1pbmF0ZWQgZm9ybSAqLwp9IFJwY0FkZHJlc3NTdHJpbmc7CiNpbmNsdWRlICJwb3BwYWNrLmgiCgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBwYWRkaW5nMVsyXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHVuc2lnbmVkIGNoYXIgbnVtX3Jlc3VsdHM7ICAgICAgIC8qIE51bWJlciBvZiByZXN1bHRzICovCiAgdW5zaWduZWQgY2hhciBwYWRkaW5nMlszXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CiAgICB1bnNpZ25lZCBzaG9ydCByZWFzb247CiAgfSByZXN1bHRzWzFdOwp9IFJwY1Jlc3VsdHM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgLyogCiAgICogRm9sbG93aW5nIHRoaXMgaGVhZGVyIGFyZSB0aGVzZSBmaWVsZHM6CiAgICogICBScGNBZGRyZXNzU3RyaW5nIHNlcnZlcl9hZGRyZXNzOwogICAqICAgUnBjUmVzdWx0cyByZXN1bHRzOwogICAqICAgUlBDX1NZTlRBWF9JREVOVElGSUVSIHRyYW5zZmVyOwogICAqLwp9IFJwY1BrdEJpbmRBY2tIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCByZWplY3RfcmVhc29uOwogIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2xzX2NvdW50OwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXI7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7CiAgfSBwcm90b2NvbHNbMV07Cn0gUnBjUGt0QmluZE5BY2tIZHI7CgovKiBVbmlvbiByZXByZXNlbnRpbmcgYWxsIHBvc3NpYmxlIHBhY2tldCBoZWFkZXJzICovCnR5cGVkZWYgdW5pb24KewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgUnBjUGt0UmVxdWVzdEhkciByZXF1ZXN0OwogIFJwY1BrdFJlc3BvbnNlSGRyIHJlc3BvbnNlOwogIFJwY1BrdEZhdWx0SGRyIGZhdWx0OwogIFJwY1BrdEJpbmRIZHIgYmluZDsKICBScGNQa3RCaW5kQWNrSGRyIGJpbmRfYWNrOwogIFJwY1BrdEJpbmROQWNrSGRyIGJpbmRfbmFjazsKfSBScGNQa3RIZHI7CgojZGVmaW5lIFJQQ19WRVJfTUFKT1IgICAgICAgICAgICAgNQojZGVmaW5lIFJQQ19WRVJfTUlOT1IgICAgICAgICAgICAgMAoKI2RlZmluZSBSUENfRkxHX0ZJUlNUICAgICAgICAgICAgIDEKI2RlZmluZSBSUENfRkxHX0xBU1QgICAgICAgICAgICAgIDIKI2RlZmluZSBSUENfRkxHX09CSkVDVF9VVUlEICAgIDB4ODAKCiNkZWZpbmUgUlBDX01JTl9QQUNLRVRfU0laRSAgMHgxMDAwCiNkZWZpbmUgUlBDX01BWF9QQUNLRVRfU0laRSAgMHgxNkQwCgojZGVmaW5lIFBLVF9SRVFVRVNUICAgICAgICAgICAgIDAKI2RlZmluZSBQS1RfUElORyAgICAgICAgICAgICAgICAxCiNkZWZpbmUgUEtUX1JFU1BPTlNFICAgICAgICAgICAgMgojZGVmaW5lIFBLVF9GQVVMVCAgICAgICAgICAgICAgIDMKI2RlZmluZSBQS1RfV09SS0lORyAgICAgICAgICAgICA0CiNkZWZpbmUgUEtUX05PQ0FMTCAgICAgICAgICAgICAgNQojZGVmaW5lIFBLVF9SRUpFQ1QgICAgICAgICAgICAgIDYKI2RlZmluZSBQS1RfQUNLICAgICAgICAgICAgICAgICA3CiNkZWZpbmUgUEtUX0NMX0NBTkNFTCAgICAgICAgICAgOAojZGVmaW5lIFBLVF9GQUNLICAgICAgICAgICAgICAgIDkKI2RlZmluZSBQS1RfQ0FOQ0VMX0FDSyAgICAgICAgIDEwCiNkZWZpbmUgUEtUX0JJTkQgICAgICAgICAgICAgICAxMQojZGVmaW5lIFBLVF9CSU5EX0FDSyAgICAgICAgICAgMTIKI2RlZmluZSBQS1RfQklORF9OQUNLICAgICAgICAgIDEzCiNkZWZpbmUgUEtUX0FMVEVSX0NPTlRFWFQgICAgICAxNAojZGVmaW5lIFBLVF9BTFRFUl9DT05URVhUX1JFU1AgMTUKI2RlZmluZSBQS1RfU0hVVERPV04gICAgICAgICAgIDE3CiNkZWZpbmUgUEtUX0NPX0NBTkNFTCAgICAgICAgICAxOAojZGVmaW5lIFBLVF9PUlBIQU5FRCAgICAgICAgICAgMTkKCiNkZWZpbmUgUkVTVUxUX0FDQ0VQVCAgICAgICAgICAgMAoKI2RlZmluZSBOT19SRUFTT04gICAgICAgICAgICAgICAwCgojZGVmaW5lIE5DQURHX0lQX1VEUCAgIDB4MDgKI2RlZmluZSBOQ0FDTl9JUF9UQ1AgICAweDA3CiNkZWZpbmUgTkNBREdfSVBYICAgICAgMHgwRQojZGVmaW5lIE5DQUNOX1NQWCAgICAgIDB4MEMKI2RlZmluZSBOQ0FDTl9OQl9OQiAgICAweDEyCiNkZWZpbmUgTkNBQ05fTkJfSVBYICAgMHgwRAojZGVmaW5lIE5DQUNOX0RORVRfTlNQIDB4MDQKI2RlZmluZSBOQ0FDTl9IVFRQICAgICAweDFGCgovKiBGcmVlRENFOiBUV1JfQ19GTFJfUFJPVF9JRF9JUCAqLwojZGVmaW5lIFRXUl9JUCAweDA5CgojZW5kaWYgIC8qIF9fV0lORV9SUENfREVGU19IICovCg==