LyoKKiogYXRhcmlpbnRzLmggLS0gQXRhcmkgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMKKioKKiogQ29weXJpZ2h0IDE5OTQgYnkgQmqUcm4gQnJhdWVsCioqCioqIDUvMi85NCBSb21hbiBIb2RlazoKKiogICBUVCBpbnRlcnJ1cHQgZGVmaW5pdGlvbnMgYWRkZWQuCioqCioqIDEyLzAyLzk2OiAoUm9tYW4pCioqICAgQWRhcHRlZCB0byBuZXcgaW50IGhhbmRsaW5nIHNjaGVtZSAoc2VlIGF0YWludHMuYyk7IHJldmlzZWQgbnVtYmVyaW5nCioqCioqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCioqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCioqIGZvciBtb3JlIGRldGFpbHMuCioqCiovCgojaWZuZGVmIF9MSU5VWF9BVEFSSUlOVFNfSF8KI2RlZmluZSBfTElOVVhfQVRBUklJTlRTX0hfCgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KCi8qCioqIEF0YXJpIEludGVycnVwdCBzb3VyY2VzLgoqKgoqLwoKI2RlZmluZSBTVE1GUF9TT1VSQ0VfQkFTRSAgOAojZGVmaW5lIFRUTUZQX1NPVVJDRV9CQVNFICAyNAojZGVmaW5lIFNDQ19TT1VSQ0VfQkFTRSAgICA0MAojZGVmaW5lIFZNRV9TT1VSQ0VfQkFTRSAgICA1NgojZGVmaW5lIFZNRV9NQVhfU09VUkNFUyAgICAxNgoKI2RlZmluZSBOVU1fQVRBUklfU09VUkNFUyAgIChWTUVfU09VUkNFX0JBU0UrVk1FX01BWF9TT1VSQ0VTLVNUTUZQX1NPVVJDRV9CQVNFKQoKLyogY29udmVydCB2ZWN0b3IgbnVtYmVyIHRvIGludCBzb3VyY2UgbnVtYmVyICovCiNkZWZpbmUgSVJRX1ZFQ1RPUl9UT19TT1VSQ0UodikJKCh2KSAtICgodikgPCAweDIwID8gMHgxOCA6ICgweDQwLTgpKSkKCi8qIGNvbnZlcnQgaXJxX2hhbmRsZXIgaW5kZXggdG8gdmVjdG9yIG51bWJlciAqLwojZGVmaW5lIElSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpCSgoaSkgKyAoKGkpIDwgOCA/IDB4MTggOiAoMHg0MC04KSkpCgovKiBpbnRlcnJ1cHQgc2VydmljZSB0eXBlcyAqLwojZGVmaW5lIElSUV9UWVBFX1NMT1cgICAgIDAKI2RlZmluZSBJUlFfVFlQRV9GQVNUICAgICAxCiNkZWZpbmUgSVJRX1RZUEVfUFJJTyAgICAgMgoKLyogU1QtTUZQIGludGVycnVwdHMgKi8KI2RlZmluZSBJUlFfTUZQX0JVU1kgICAgICAoOCkKI2RlZmluZSBJUlFfTUZQX0RDRCAgICAgICAoOSkKI2RlZmluZSBJUlFfTUZQX0NUUwkgICgxMCkKI2RlZmluZSBJUlFfTUZQX0dQVQkgICgxMSkKI2RlZmluZSBJUlFfTUZQX1RJTUQgICAgICAoMTIpCiNkZWZpbmUgSVJRX01GUF9USU1DCSAgKDEzKQojZGVmaW5lIElSUV9NRlBfQUNJQQkgICgxNCkKI2RlZmluZSBJUlFfTUZQX0ZEQyAgICAgICAoMTUpCiNkZWZpbmUgSVJRX01GUF9BQ1NJICAgICAgSVJRX01GUF9GREMKI2RlZmluZSBJUlFfTUZQX0ZTQ1NJICAgICBJUlFfTUZQX0ZEQwojZGVmaW5lIElSUV9NRlBfSURFICAgICAgIElSUV9NRlBfRkRDCiNkZWZpbmUgSVJRX01GUF9USU1CICAgICAgKDE2KQojZGVmaW5lIElSUV9NRlBfU0VSRVJSICAgICgxNykKI2RlZmluZSBJUlFfTUZQX1NFUkVNUFQgICAoMTgpCiNkZWZpbmUgSVJRX01GUF9SRUNFUlIgICAgKDE5KQojZGVmaW5lIElSUV9NRlBfUkVDRlVMTCAgICgyMCkKI2RlZmluZSBJUlFfTUZQX1RJTUEgICAgICAoMjEpCiNkZWZpbmUgSVJRX01GUF9SSSAgICAgICAgKDIyKQojZGVmaW5lIElSUV9NRlBfTU1EICAgICAgICgyMykKCi8qIFRULU1GUCBpbnRlcnJ1cHRzICovCiNkZWZpbmUgSVJRX1RUX01GUF9JTzAgICAgICAgKDI0KQojZGVmaW5lIElSUV9UVF9NRlBfSU8xICAgICAgICgyNSkKI2RlZmluZSBJUlFfVFRfTUZQX1NDQwkgICAgICgyNikKI2RlZmluZSBJUlFfVFRfTUZQX1JJCSAgICAgKDI3KQojZGVmaW5lIElSUV9UVF9NRlBfVElNRCAgICAgICgyOCkKI2RlZmluZSBJUlFfVFRfTUZQX1RJTUMJICAgICAoMjkpCiNkZWZpbmUgSVJRX1RUX01GUF9EUlZSRFkgICAgKDMwKQojZGVmaW5lIElSUV9UVF9NRlBfU0NTSURNQSAgICgzMSkKI2RlZmluZSBJUlFfVFRfTUZQX1RJTUIgICAgICAoMzIpCiNkZWZpbmUgSVJRX1RUX01GUF9TRVJFUlIgICAgKDMzKQojZGVmaW5lIElSUV9UVF9NRlBfU0VSRU1QVCAgICgzNCkKI2RlZmluZSBJUlFfVFRfTUZQX1JFQ0VSUiAgICAoMzUpCiNkZWZpbmUgSVJRX1RUX01GUF9SRUNGVUxMICAgKDM2KQojZGVmaW5lIElSUV9UVF9NRlBfVElNQSAgICAgICgzNykKI2RlZmluZSBJUlFfVFRfTUZQX1JUQyAgICAgICAoMzgpCiNkZWZpbmUgSVJRX1RUX01GUF9TQ1NJICAgICAgKDM5KQoKLyogU0NDIGludGVycnVwdHMgKi8KI2RlZmluZSBJUlFfU0NDQl9UWAkgICAgICg0MCkKI2RlZmluZSBJUlFfU0NDQl9TVEFUCSAgICAgKDQyKQojZGVmaW5lIElSUV9TQ0NCX1JYCSAgICAgKDQ0KQojZGVmaW5lIElSUV9TQ0NCX1NQQ09ORAkgICAgICg0NikKI2RlZmluZSBJUlFfU0NDQV9UWAkgICAgICg0OCkKI2RlZmluZSBJUlFfU0NDQV9TVEFUCSAgICAgKDUwKQojZGVmaW5lIElSUV9TQ0NBX1JYCSAgICAgKDUyKQojZGVmaW5lIElSUV9TQ0NBX1NQQ09ORAkgICAgICg1NCkKCgojZGVmaW5lIElOVF9DTEsgICAyNDU3NgkgICAgLyogQ0xLIHdoaWxlIGludF9jbGsgPTIuNDU2TUh6IGFuZCBkaXZpZGUgPSAxMDAgKi8KI2RlZmluZSBJTlRfVElDS1MgMjQ2CSAgICAvKiB0byBtYWtlIHNjaGVkX3RpbWUgPSA5OS45MDIuLi4gSFogKi8KCgojZGVmaW5lIE1GUF9FTkFCTEUJMAojZGVmaW5lIE1GUF9QRU5ESU5HCTEKI2RlZmluZSBNRlBfU0VSVklDRQkyCiNkZWZpbmUgTUZQX01BU0sJMwoKLyogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNldHRpbmcvY2xlYXJpbmcgYml0cyBpbiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBvZgogKiB0aGUgTUZQLiAndHlwZScgc2hvdWxkIGJlIGNvbnN0YW50LCBpZiAnaXJxJyBpcyBjb25zdGFudCwgdG9vLCBjb2RlIHNpemUgaXMKICogcmVkdWNlZC4gc2V0X21mcF9iaXQoKSBpcyBub25zZW5zZSBmb3IgUEVORElORyBhbmQgU0VSVklDRSByZWdpc3RlcnMuICovCgpzdGF0aWMgaW5saW5lIGludCBnZXRfbWZwX2JpdCggdW5zaWduZWQgaXJxLCBpbnQgdHlwZSApCgp7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKCgltYXNrID0gMSA8PCAoaXJxICYgNyk7CglyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKwoJCSAgKChpcnEgJiA4KSA+PiAyKSArICgoKGlycS04KSAmIDE2KSA8PCAzKTsKCXJldHVybiggKnJlZyAmIG1hc2sgKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHNldF9tZnBfYml0KCB1bnNpZ25lZCBpcnEsIGludCB0eXBlICkKCnsJdW5zaWduZWQgY2hhcgltYXNrLCAqcmVnOwoKCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKCXJlZyA9ICh1bnNpZ25lZCBjaGFyICopJm1mcC5pbnRfZW5fYSArIHR5cGUqNCArCgkJICAoKGlycSAmIDgpID4+IDIpICsgKCgoaXJxLTgpICYgMTYpIDw8IDMpOwoJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAib3JiICUwLCUxIgoJCQkgICAgICA6IDogImRpIiAobWFzayksICJtIiAoKnJlZykgOiAibWVtb3J5IiApOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbWZwX2JpdCggdW5zaWduZWQgaXJxLCBpbnQgdHlwZSApCgp7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKCgltYXNrID0gfigxIDw8IChpcnEgJiA3KSk7CglyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKwoJCSAgKChpcnEgJiA4KSA+PiAyKSArICgoKGlycS04KSAmIDE2KSA8PCAzKTsKCWlmICh0eXBlID09IE1GUF9QRU5ESU5HIHx8IHR5cGUgPT0gTUZQX1NFUlZJQ0UpCgkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92ZWIgJTAsJTEiCgkJCQkgICAgICA6IDogImRpIiAobWFzayksICJtIiAoKnJlZykgOiAibWVtb3J5IiApOwoJZWxzZQoJCV9fYXNtX18gX192b2xhdGlsZV9fICggImFuZGIgJTAsJTEiCgkJCQkgICAgICA6IDogImRpIiAobWFzayksICJtIiAoKnJlZykgOiAibWVtb3J5IiApOwp9CgovKgogKiB7ZW4sZGlzfWFibGVfaXJxIGhhdmUgdGhlIHVzdWFsIHNlbWFudGljcyBvZiB0ZW1wb3JhcnkgYmxvY2tpbmcgdGhlCiAqIGludGVycnVwdCwgYnV0IG5vdCBsb29zaW5nIHJlcXVlc3RzIHRoYXQgaGFwcGVuIGJldHdlZW4gZGlzYWJsaW5nIGFuZAogKiBlbmFibGluZy4gVGhpcyBpcyBkb25lIHdpdGggdGhlIE1GUCBtYXNrIHJlZ2lzdGVycy4KICovCgpzdGF0aWMgaW5saW5lIHZvaWQgYXRhcmlfZW5hYmxlX2lycSggdW5zaWduZWQgaXJxICkKCnsKCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm47CglzZXRfbWZwX2JpdCggaXJxLCBNRlBfTUFTSyApOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgYXRhcmlfZGlzYWJsZV9pcnEoIHVuc2lnbmVkIGlycSApCgp7CglpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuOwoJY2xlYXJfbWZwX2JpdCggaXJxLCBNRlBfTUFTSyApOwp9CgovKgogKiBJbiBvcHBvc2l0ZSB0byB7ZW4sZGlzfWFibGVfaXJxLCByZXF1ZXN0cyBiZXR3ZWVuIHR1cm57b2ZmLG9ufV9pcnEgYXJlIG5vdAogKiAic3RvcmVkIgogKi8KCnN0YXRpYyBpbmxpbmUgdm9pZCBhdGFyaV90dXJub25faXJxKCB1bnNpZ25lZCBpcnEgKQoKewoJaWYgKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpIHJldHVybjsKCXNldF9tZnBfYml0KCBpcnEsIE1GUF9FTkFCTEUgKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX3R1cm5vZmZfaXJxKCB1bnNpZ25lZCBpcnEgKQoKewoJaWYgKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpIHJldHVybjsKCWNsZWFyX21mcF9iaXQoIGlycSwgTUZQX0VOQUJMRSApOwoJY2xlYXJfbWZwX2JpdCggaXJxLCBNRlBfUEVORElORyApOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgYXRhcmlfY2xlYXJfcGVuZGluZ19pcnEoIHVuc2lnbmVkIGlycSApCgp7CglpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuOwoJY2xlYXJfbWZwX2JpdCggaXJxLCBNRlBfUEVORElORyApOwp9CgpzdGF0aWMgaW5saW5lIGludCBhdGFyaV9pcnFfcGVuZGluZyggdW5zaWduZWQgaXJxICkKCnsKCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm4oIDAgKTsKCXJldHVybiggZ2V0X21mcF9iaXQoIGlycSwgTUZQX1BFTkRJTkcgKSApOwp9Cgp1bnNpZ25lZCBsb25nIGF0YXJpX3JlZ2lzdGVyX3ZtZV9pbnQoIHZvaWQgKTsKdm9pZCBhdGFyaV91bnJlZ2lzdGVyX3ZtZV9pbnQoIHVuc2lnbmVkIGxvbmcgKTsKCiNlbmRpZiAvKiBsaW51eC9hdGFyaWludHMuaCAqLwo=