LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5BTUUJICAgIDogczNjMjQxMC5oCiAqIFZlcnNpb24gIDogMzEuMy4yMDAzCiAqCiAqIEJhc2VkIG9uIFMzQzI0MTBYIFVzZXIncyBtYW51YWwgUmV2IDEuMQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1MzQzI0MTBfSF9fCiNkZWZpbmUgX19TM0MyNDEwX0hfXwoKI2RlZmluZSBTM0MyNFgwX1VBUlRfQ0hBTk5FTFMJMwojZGVmaW5lIFMzQzI0WDBfU1BJX0NIQU5ORUxTCTIKCi8qIFMzQzI0MTAgb25seSBzdXBwb3J0cyA1MTIgQnl0ZSBIVyBFQ0MgKi8KI2RlZmluZSBTM0MyNDEwX0VDQ1NJWkUJCTUxMgojZGVmaW5lIFMzQzI0MTBfRUNDQllURVMJMwoKZW51bSBzM2MyNHgwX3VhcnRzX25yIHsKCVMzQzI0WDBfVUFSVDAsCglTM0MyNFgwX1VBUlQxLAoJUzNDMjRYMF9VQVJUMgp9OwoKLyogUzNDMjQxMCBkZXZpY2UgYmFzZSBhZGRyZXNzZXMgKi8KI2RlZmluZSBTM0MyNFgwX01FTUNUTF9CQVNFCQkweDQ4MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfSE9TVF9CQVNFCQkweDQ5MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JTlRFUlJVUFRfQkFTRQkJMHg0QTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfRE1BX0JBU0UJCTB4NEIwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0NMT0NLX1BPV0VSX0JBU0UJMHg0QzAwMDAwMAojZGVmaW5lIFMzQzI0WDBfTENEX0JBU0UJCTB4NEQwMDAwMDAKI2RlZmluZSBTM0MyNDEwX05BTkRfQkFTRQkJMHg0RTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfVUFSVF9CQVNFCQkweDUwMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9USU1FUl9CQVNFCQkweDUxMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfREVWSUNFX0JBU0UJCTB4NTIwMDAxNDAKI2RlZmluZSBTM0MyNFgwX1dBVENIRE9HX0JBU0UJCTB4NTMwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0kyQ19CQVNFCQkweDU0MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JMlNfQkFTRQkJMHg1NTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfR1BJT19CQVNFCQkweDU2MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9SVENfQkFTRQkJMHg1NzAwMDAwMAojZGVmaW5lIFMzQzI0MTBfQURDX0JBU0UJCTB4NTgwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1NQSV9CQVNFCQkweDU5MDAwMDAwCiNkZWZpbmUgUzNDMjQxMF9TRElfQkFTRQkJMHg1QTAwMDAwMAoKCi8qIGluY2x1ZGUgY29tbW9uIHN0dWZmICovCiNpbmNsdWRlIDxzM2MyNHgwLmg+CgoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9tZW1jdGwgKnMzYzI0eDBfZ2V0X2Jhc2VfbWVtY3RsKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfbWVtY3RsICopUzNDMjRYMF9NRU1DVExfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3VzYl9ob3N0ICpzM2MyNHgwX2dldF9iYXNlX3VzYl9ob3N0KHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfdXNiX2hvc3QgKilTM0MyNFgwX1VTQl9IT1NUX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9pbnRlcnJ1cHQgKnMzYzI0eDBfZ2V0X2Jhc2VfaW50ZXJydXB0KHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfaW50ZXJydXB0ICopUzNDMjRYMF9JTlRFUlJVUFRfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2RtYXMgKnMzYzI0eDBfZ2V0X2Jhc2VfZG1hcyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2RtYXMgKilTM0MyNFgwX0RNQV9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfY2xvY2tfcG93ZXIgKnMzYzI0eDBfZ2V0X2Jhc2VfY2xvY2tfcG93ZXIodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9jbG9ja19wb3dlciAqKVMzQzI0WDBfQ0xPQ0tfUE9XRVJfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2xjZCAqczNjMjR4MF9nZXRfYmFzZV9sY2Qodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9sY2QgKilTM0MyNFgwX0xDRF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfbmFuZCAqczNjMjQxMF9nZXRfYmFzZV9uYW5kKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0MTBfbmFuZCAqKVMzQzI0MTBfTkFORF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfdWFydAoJKnMzYzI0eDBfZ2V0X2Jhc2VfdWFydChlbnVtIHMzYzI0eDBfdWFydHNfbnIgbikKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF91YXJ0ICopKFMzQzI0WDBfVUFSVF9CQVNFICsgKG4gKiAweDQwMDApKTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3RpbWVycyAqczNjMjR4MF9nZXRfYmFzZV90aW1lcnModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF90aW1lcnMgKilTM0MyNFgwX1RJTUVSX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF91c2JfZGV2aWNlICpzM2MyNHgwX2dldF9iYXNlX3VzYl9kZXZpY2Uodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF91c2JfZGV2aWNlICopUzNDMjRYMF9VU0JfREVWSUNFX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF93YXRjaGRvZyAqczNjMjR4MF9nZXRfYmFzZV93YXRjaGRvZyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3dhdGNoZG9nICopUzNDMjRYMF9XQVRDSERPR19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfaTJjICpzM2MyNHgwX2dldF9iYXNlX2kyYyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2kyYyAqKVMzQzI0WDBfSTJDX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9pMnMgKnMzYzI0eDBfZ2V0X2Jhc2VfaTJzKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfaTJzICopUzNDMjRYMF9JMlNfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2dwaW8gKnMzYzI0eDBfZ2V0X2Jhc2VfZ3Bpbyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2dwaW8gKilTM0MyNFgwX0dQSU9fQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3J0YyAqczNjMjR4MF9nZXRfYmFzZV9ydGModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9ydGMgKilTM0MyNFgwX1JUQ19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfYWRjICpzM2MyNDEwX2dldF9iYXNlX2FkYyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNDEwX2FkYyAqKVMzQzI0MTBfQURDX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9zcGkgKnMzYzI0eDBfZ2V0X2Jhc2Vfc3BpKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfc3BpICopUzNDMjRYMF9TUElfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDEwX3NkaSAqczNjMjQxMF9nZXRfYmFzZV9zZGkodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjQxMF9zZGkgKilTM0MyNDEwX1NESV9CQVNFOwp9CgojZW5kaWYgLypfX1MzQzI0MTBfSF9fKi8K