LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5BTUUJICAgIDogczNjMjQxMC5oCiAqIFZlcnNpb24gIDogMzEuMy4yMDAzCiAqCiAqIEJhc2VkIG9uIFMzQzI0MTBYIFVzZXIncyBtYW51YWwgUmV2IDEuMQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1MzQzI0MTBfSF9fCiNkZWZpbmUgX19TM0MyNDEwX0hfXwoKI2RlZmluZSBTM0MyNFgwX1VBUlRfQ0hBTk5FTFMJMwojZGVmaW5lIFMzQzI0WDBfU1BJX0NIQU5ORUxTCTIKCi8qIFMzQzI0MTAgb25seSBzdXBwb3J0cyA1MTIgQnl0ZSBIVyBFQ0MgKi8KI2RlZmluZSBTM0MyNDEwX0VDQ1NJWkUJCTUxMgojZGVmaW5lIFMzQzI0MTBfRUNDQllURVMJMwoKdHlwZWRlZiBlbnVtIHsKCVMzQzI0WDBfVUFSVDAsCglTM0MyNFgwX1VBUlQxLAoJUzNDMjRYMF9VQVJUMgp9IFMzQzI0WDBfVUFSVFNfTlI7CgovKiBTM0MyNDEwIGRldmljZSBiYXNlIGFkZHJlc3NlcyAqLwojZGVmaW5lIFMzQzI0WDBfTUVNQ1RMX0JBU0UJCTB4NDgwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1VTQl9IT1NUX0JBU0UJCTB4NDkwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0lOVEVSUlVQVF9CQVNFCQkweDRBMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9ETUFfQkFTRQkJMHg0QjAwMDAwMAojZGVmaW5lIFMzQzI0WDBfQ0xPQ0tfUE9XRVJfQkFTRQkweDRDMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9MQ0RfQkFTRQkJMHg0RDAwMDAwMAojZGVmaW5lIFMzQzI0MTBfTkFORF9CQVNFCQkweDRFMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VQVJUX0JBU0UJCTB4NTAwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1RJTUVSX0JBU0UJCTB4NTEwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1VTQl9ERVZJQ0VfQkFTRQkJMHg1MjAwMDE0MAojZGVmaW5lIFMzQzI0WDBfV0FUQ0hET0dfQkFTRQkJMHg1MzAwMDAwMAojZGVmaW5lIFMzQzI0WDBfSTJDX0JBU0UJCTB4NTQwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0kyU19CQVNFCQkweDU1MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9HUElPX0JBU0UJCTB4NTYwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1JUQ19CQVNFCQkweDU3MDAwMDAwCiNkZWZpbmUgUzNDMjQxMF9BRENfQkFTRQkJMHg1ODAwMDAwMAojZGVmaW5lIFMzQzI0WDBfU1BJX0JBU0UJCTB4NTkwMDAwMDAKI2RlZmluZSBTM0MyNDEwX1NESV9CQVNFCQkweDVBMDAwMDAwCgoKLyogaW5jbHVkZSBjb21tb24gc3R1ZmYgKi8KI2luY2x1ZGUgPHMzYzI0eDAuaD4KCgpzdGF0aWMgaW5saW5lIFMzQzI0WDBfTUVNQ1RMICogUzNDMjRYMF9HZXRCYXNlX01FTUNUTCh2b2lkKQp7CglyZXR1cm4gKFMzQzI0WDBfTUVNQ1RMICogY29uc3QpUzNDMjRYMF9NRU1DVExfQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0WDBfVVNCX0hPU1QgKiBTM0MyNFgwX0dldEJhc2VfVVNCX0hPU1Qodm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX1VTQl9IT1NUICogY29uc3QpUzNDMjRYMF9VU0JfSE9TVF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9JTlRFUlJVUFQgKiBTM0MyNFgwX0dldEJhc2VfSU5URVJSVVBUKHZvaWQpCnsKCXJldHVybiAoUzNDMjRYMF9JTlRFUlJVUFQgKiBjb25zdClTM0MyNFgwX0lOVEVSUlVQVF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9ETUFTICogUzNDMjRYMF9HZXRCYXNlX0RNQVModm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX0RNQVMgKiBjb25zdClTM0MyNFgwX0RNQV9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9DTE9DS19QT1dFUiAqIFMzQzI0WDBfR2V0QmFzZV9DTE9DS19QT1dFUih2b2lkKQp7CglyZXR1cm4gKFMzQzI0WDBfQ0xPQ0tfUE9XRVIgKiBjb25zdClTM0MyNFgwX0NMT0NLX1BPV0VSX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBTM0MyNFgwX0xDRCAqIFMzQzI0WDBfR2V0QmFzZV9MQ0Qodm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX0xDRCAqIGNvbnN0KVMzQzI0WDBfTENEX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBTM0MyNDEwX05BTkQgKiBTM0MyNDEwX0dldEJhc2VfTkFORCh2b2lkKQp7CglyZXR1cm4gKFMzQzI0MTBfTkFORCAqIGNvbnN0KVMzQzI0MTBfTkFORF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9VQVJUICogUzNDMjRYMF9HZXRCYXNlX1VBUlQoUzNDMjRYMF9VQVJUU19OUiBucikKewoJcmV0dXJuIChTM0MyNFgwX1VBUlQgKiBjb25zdCkoUzNDMjRYMF9VQVJUX0JBU0UgKyAobnIgKiAweDQwMDApKTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0WDBfVElNRVJTICogUzNDMjRYMF9HZXRCYXNlX1RJTUVSUyh2b2lkKQp7CglyZXR1cm4gKFMzQzI0WDBfVElNRVJTICogY29uc3QpUzNDMjRYMF9USU1FUl9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9VU0JfREVWSUNFICogUzNDMjRYMF9HZXRCYXNlX1VTQl9ERVZJQ0Uodm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX1VTQl9ERVZJQ0UgKiBjb25zdClTM0MyNFgwX1VTQl9ERVZJQ0VfQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0WDBfV0FUQ0hET0cgKiBTM0MyNFgwX0dldEJhc2VfV0FUQ0hET0codm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX1dBVENIRE9HICogY29uc3QpUzNDMjRYMF9XQVRDSERPR19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9JMkMgKiBTM0MyNFgwX0dldEJhc2VfSTJDKHZvaWQpCnsKCXJldHVybiAoUzNDMjRYMF9JMkMgKiBjb25zdClTM0MyNFgwX0kyQ19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9JMlMgKiBTM0MyNFgwX0dldEJhc2VfSTJTKHZvaWQpCnsKCXJldHVybiAoUzNDMjRYMF9JMlMgKiBjb25zdClTM0MyNFgwX0kyU19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgUzNDMjRYMF9HUElPICogUzNDMjRYMF9HZXRCYXNlX0dQSU8odm9pZCkKewoJcmV0dXJuIChTM0MyNFgwX0dQSU8gKiBjb25zdClTM0MyNFgwX0dQSU9fQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0WDBfUlRDICogUzNDMjRYMF9HZXRCYXNlX1JUQyh2b2lkKQp7CglyZXR1cm4gKFMzQzI0WDBfUlRDICogY29uc3QpUzNDMjRYMF9SVENfQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0MTBfQURDICogUzNDMjQxMF9HZXRCYXNlX0FEQyh2b2lkKQp7CglyZXR1cm4gKFMzQzI0MTBfQURDICogY29uc3QpUzNDMjQxMF9BRENfQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0WDBfU1BJICogUzNDMjRYMF9HZXRCYXNlX1NQSSh2b2lkKQp7CglyZXR1cm4gKFMzQzI0WDBfU1BJICogY29uc3QpUzNDMjRYMF9TUElfQkFTRTsKfQpzdGF0aWMgaW5saW5lIFMzQzI0MTBfU0RJICogUzNDMjQxMF9HZXRCYXNlX1NESSh2b2lkKQp7CglyZXR1cm4gKFMzQzI0MTBfU0RJICogY29uc3QpUzNDMjQxMF9TRElfQkFTRTsKfQoKCi8qIElTUiAqLwojZGVmaW5lIHBJU1JfUkVTRVQJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4MCkpCiNkZWZpbmUgcElTUl9VTkRFRgkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg0KSkKI2RlZmluZSBwSVNSX1NXSQkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg4KSkKI2RlZmluZSBwSVNSX1BBQk9SVAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHhDKSkKI2RlZmluZSBwSVNSX0RBQk9SVAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgxMCkpCiNkZWZpbmUgcElTUl9SRVNFUlZFRAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgxNCkpCiNkZWZpbmUgcElTUl9JUlEJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4MTgpKQojZGVmaW5lIHBJU1JfRklRCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDFDKSkKCiNkZWZpbmUgcElTUl9FSU5UMAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgyMCkpCiNkZWZpbmUgcElTUl9FSU5UMQkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgyNCkpCiNkZWZpbmUgcElTUl9FSU5UMgkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgyOCkpCiNkZWZpbmUgcElTUl9FSU5UMwkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHgyQykpCiNkZWZpbmUgcElTUl9FSU5UNF83CQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDMwKSkKI2RlZmluZSBwSVNSX0VJTlQ4XzIzCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDM0KSkKI2RlZmluZSBwSVNSX0JBVF9GTFQJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4M0MpKQojZGVmaW5lIHBJU1JfVElDSwkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg0MCkpCiNkZWZpbmUgcElTUl9XRFQJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4NDQpKQojZGVmaW5lIHBJU1JfVElNRVIwCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDQ4KSkKI2RlZmluZSBwSVNSX1RJTUVSMQkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg0QykpCiNkZWZpbmUgcElTUl9USU1FUjIJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4NTApKQojZGVmaW5lIHBJU1JfVElNRVIzCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDU0KSkKI2RlZmluZSBwSVNSX1RJTUVSNAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg1OCkpCiNkZWZpbmUgcElTUl9VQVJUMgkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg1QykpCiNkZWZpbmUgcElTUl9OT1RVU0VECQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDYwKSkKI2RlZmluZSBwSVNSX0RNQTAJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4NjQpKQojZGVmaW5lIHBJU1JfRE1BMQkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg2OCkpCiNkZWZpbmUgcElTUl9ETUEyCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDZDKSkKI2RlZmluZSBwSVNSX0RNQTMJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4NzApKQojZGVmaW5lIHBJU1JfU0RJCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDc0KSkKI2RlZmluZSBwSVNSX1NQSTAJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4NzgpKQojZGVmaW5lIHBJU1JfVUFSVDEJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4N0MpKQojZGVmaW5lIHBJU1JfVVNCRAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg4NCkpCiNkZWZpbmUgcElTUl9VU0JICQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDg4KSkKI2RlZmluZSBwSVNSX0lJQwkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg4QykpCiNkZWZpbmUgcElTUl9VQVJUMAkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg5MCkpCiNkZWZpbmUgcElTUl9TUEkxCQkoKih1bnNpZ25lZCAqKShfSVNSX1NUQVJUQUREUkVTUysweDk0KSkKI2RlZmluZSBwSVNSX1JUQwkJKCoodW5zaWduZWQgKikoX0lTUl9TVEFSVEFERFJFU1MrMHg5OCkpCiNkZWZpbmUgcElTUl9BREMJCSgqKHVuc2lnbmVkICopKF9JU1JfU1RBUlRBRERSRVNTKzB4QTApKQoKCi8qIFBFTkRJTkcgQklUICovCiNkZWZpbmUgQklUX0VJTlQwCQkoMHgxKQojZGVmaW5lIEJJVF9FSU5UMQkJKDB4MTw8MSkKI2RlZmluZSBCSVRfRUlOVDIJCSgweDE8PDIpCiNkZWZpbmUgQklUX0VJTlQzCQkoMHgxPDwzKQojZGVmaW5lIEJJVF9FSU5UNF83CQkoMHgxPDw0KQojZGVmaW5lIEJJVF9FSU5UOF8yMwkJKDB4MTw8NSkKI2RlZmluZSBCSVRfQkFUX0ZMVAkJKDB4MTw8NykKI2RlZmluZSBCSVRfVElDSwkJKDB4MTw8OCkKI2RlZmluZSBCSVRfV0RUCQkJKDB4MTw8OSkKI2RlZmluZSBCSVRfVElNRVIwCQkoMHgxPDwxMCkKI2RlZmluZSBCSVRfVElNRVIxCQkoMHgxPDwxMSkKI2RlZmluZSBCSVRfVElNRVIyCQkoMHgxPDwxMikKI2RlZmluZSBCSVRfVElNRVIzCQkoMHgxPDwxMykKI2RlZmluZSBCSVRfVElNRVI0CQkoMHgxPDwxNCkKI2RlZmluZSBCSVRfVUFSVDIJCSgweDE8PDE1KQojZGVmaW5lIEJJVF9MQ0QJCQkoMHgxPDwxNikKI2RlZmluZSBCSVRfRE1BMAkJKDB4MTw8MTcpCiNkZWZpbmUgQklUX0RNQTEJCSgweDE8PDE4KQojZGVmaW5lIEJJVF9ETUEyCQkoMHgxPDwxOSkKI2RlZmluZSBCSVRfRE1BMwkJKDB4MTw8MjApCiNkZWZpbmUgQklUX1NESQkJCSgweDE8PDIxKQojZGVmaW5lIEJJVF9TUEkwCQkoMHgxPDwyMikKI2RlZmluZSBCSVRfVUFSVDEJCSgweDE8PDIzKQojZGVmaW5lIEJJVF9VU0JECQkoMHgxPDwyNSkKI2RlZmluZSBCSVRfVVNCSAkJKDB4MTw8MjYpCiNkZWZpbmUgQklUX0lJQwkJCSgweDE8PDI3KQojZGVmaW5lIEJJVF9VQVJUMAkJKDB4MTw8MjgpCiNkZWZpbmUgQklUX1NQSTEJCSgweDE8PDI5KQojZGVmaW5lIEJJVF9SVEMJCQkoMHgxPDwzMCkKI2RlZmluZSBCSVRfQURDCQkJKDB4MTw8MzEpCiNkZWZpbmUgQklUX0FMTE1TSwkJKDB4RkZGRkZGRkYpCgojZGVmaW5lIENsZWFyUGVuZGluZyhiaXQpIHtcCgkJIHJTUkNQTkQgPSBiaXQ7XAoJCSBySU5UUE5EID0gYml0O1wKCQkgcklOVFBORDtcCgkJIH0KLyogV2FpdCB1bnRpbCBySU5UUE5EIGlzIGNoYW5nZWQgZm9yIHRoZSBjYXNlIHRoYXQgdGhlIElTUiBpcyB2ZXJ5IHNob3J0LiAqLwojZW5kaWYgLypfX1MzQzI0MTBfSF9fKi8K