LyoKICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKICoKICogT01BUCBHUElPIGhhbmRsaW5nIGRlZmluZXMgYW5kIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKgogKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgojaWZuZGVmIF9fQVNNX0FSQ0hfT01BUF9HUElPX0gKI2RlZmluZSBfX0FTTV9BUkNIX09NQVBfR1BJT19ICgojaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNkZWZpbmUgT01BUF9NUFVJT19CQVNFCQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYjUwMDAKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCiNkZWZpbmUgT01BUF9NUFVJT19JTlBVVF9MQVRDSAkJMHgwMAojZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDAyCiNkZWZpbmUgT01BUF9NUFVJT19JT19DTlRMCQkweDA0CiNkZWZpbmUgT01BUF9NUFVJT19LQlJfTEFUQ0gJCTB4MDgKI2RlZmluZSBPTUFQX01QVUlPX0tCQwkJCTB4MGEKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fRVZFTlRfTU9ERQkweDBjCiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVF9FREdFCTB4MGUKI2RlZmluZSBPTUFQX01QVUlPX0tCRF9JTlQJCTB4MTAKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fSU5UCQkweDEyCiNkZWZpbmUgT01BUF9NUFVJT19LQkRfTUFTS0lUCQkweDE0CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX01BU0tJVAkJMHgxNgojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19ERUJPVU5DSU5HCTB4MTgKI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDFhCiNlbHNlCiNkZWZpbmUgT01BUF9NUFVJT19JTlBVVF9MQVRDSAkJMHgwMAojZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDA0CiNkZWZpbmUgT01BUF9NUFVJT19JT19DTlRMCQkweDA4CiNkZWZpbmUgT01BUF9NUFVJT19LQlJfTEFUQ0gJCTB4MTAKI2RlZmluZSBPTUFQX01QVUlPX0tCQwkJCTB4MTQKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fRVZFTlRfTU9ERQkweDE4CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVF9FREdFCTB4MWMKI2RlZmluZSBPTUFQX01QVUlPX0tCRF9JTlQJCTB4MjAKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fSU5UCQkweDI0CiNkZWZpbmUgT01BUF9NUFVJT19LQkRfTUFTS0lUCQkweDI4CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX01BU0tJVAkJMHgyYwojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19ERUJPVU5DSU5HCTB4MzAKI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDM0CiNlbmRpZgoKI2RlZmluZSBPTUFQX01QVUlPKG5yKQkJKE9NQVBfTUFYX0dQSU9fTElORVMgKyAobnIpKQojZGVmaW5lIE9NQVBfR1BJT19JU19NUFVJTyhucikJKChucikgPj0gT01BUF9NQVhfR1BJT19MSU5FUykKCiNkZWZpbmUgT01BUF9HUElPX0lSUShucikJKE9NQVBfR1BJT19JU19NUFVJTyhucikgPyBcCgkJCQkgSUhfTVBVSU9fQkFTRSArICgobnIpICYgMHgwZikgOiBcCgkJCQkgSUhfR1BJT19CQVNFICsgKG5yKSkKCmV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CS8qIENhbGwgZnJvbSBib2FyZCBpbml0IG9ubHkgKi8KZXh0ZXJuIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3Bpbyk7CmV4dGVybiB2b2lkIG9tYXBfZnJlZV9ncGlvKGludCBncGlvKTsKZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oaW50IGdwaW8sIGludCBpc19pbnB1dCk7CmV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSk7CmV4dGVybiBpbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHdyYXBwZXJzIGZvciAibmV3IHN0eWxlIiBHUElPIGNhbGxzLiB0aGUgb2xkIE9NQVAtc3BlY2ZpYyBvbmVzIHNob3VsZAogKiBldmVudHVhbGx5IGJlIHJlbW92ZWQgKGFsb25nIHdpdGggdGhpcyBlcnJuby5oIGluY2x1c2lvbiksIGFuZCBtYXliZQogKiBncGlvcyBzaG91bGQgcHV0IE1QVUlPcyBsYXN0IHRvby4KICovCgojaW5jbHVkZSA8YXNtL2Vycm5vLmg+CgpzdGF0aWMgaW5saW5lIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpCnsKCXJldHVybiBvbWFwX3JlcXVlc3RfZ3BpbyhncGlvKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQp7CglvbWFwX2ZyZWVfZ3BpbyhncGlvKTsKfQoKc3RhdGljIGlubGluZSBpbnQgX19ncGlvX3NldF9kaXJlY3Rpb24odW5zaWduZWQgZ3BpbywgaW50IGlzX2lucHV0KQp7CglpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKCQlpZiAoZ3BpbyA+IE9NQVBfTUFYX0dQSU9fTElORVMpCgkJCXJldHVybiAtRUlOVkFMOwoJfSBlbHNlIHsKCQlpZiAoZ3BpbyA+IChPTUFQX01BWF9HUElPX0xJTkVTICsgMTYgLyogTVBVSU8gKi8pKQoJCQlyZXR1cm4gLUVJTlZBTDsKCX0KCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGdwaW8sIGlzX2lucHV0KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQp7CglyZXR1cm4gX19ncGlvX3NldF9kaXJlY3Rpb24oZ3BpbywgMSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCnsKCW9tYXBfc2V0X2dwaW9fZGF0YW91dChncGlvLCB2YWx1ZSk7CglyZXR1cm4gX19ncGlvX3NldF9kaXJlY3Rpb24oZ3BpbywgMCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCnsKCXJldHVybiBvbWFwX2dldF9ncGlvX2RhdGFpbihncGlvKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKewoJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGdwaW8sIHZhbHVlKTsKfQoKI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4JCS8qIGNhbnNsZWVwIHdyYXBwZXJzICovCgpzdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQp7CglyZXR1cm4gT01BUF9HUElPX0lSUShncGlvKTsKfQoKc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQp7CglpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkgJiYgKGlycSA8IChJSF9NUFVJT19CQVNFICsgMTYpKSkKCQlyZXR1cm4gKGlycSAtIElIX01QVUlPX0JBU0UpICsgT01BUF9NQVhfR1BJT19MSU5FUzsKCXJldHVybiBpcnEgLSBJSF9HUElPX0JBU0U7Cn0KCiNlbmRpZgo=