LyoKICogV1BBIFN1cHBsaWNhbnQgLSBkcml2ZXIgaW50ZXJhY3Rpb24gd2l0aCBUSSBzdGF0aW9uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECiAqIGxpY2Vuc2UuCiAqCiAqLwoKLyogQ29weXJpZ2h0IKkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIChPY3QgMjAwNSkKICogVEhJUyBDT0RFL1BST0dSQU0gSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKICogRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVERUQgQlVUIE5PVCBMSU1JVEVEIFRPICwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAKICogVGhpcyBwcm9ncmFtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaXRzIG9yaWdpbmFsIG9wZXJhdGlvbiBieSBUZXhhcyAKICogSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBUaGVzZSBjaGFuZ2VzIGFyZSBjb3ZlcmVkIHVuZGVyIHZlcnNpb24gMiAKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBkYXRlZCBKdW5lIDE5OTEuCiAqCiAqIENvcHlyaWdodCCpIEdvb2dsZSBJbmMgKEZlYiAyMDA4KQoqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZuZGVmIF9EUklWRVJfVElfSF8KI2RlZmluZSBfRFJJVkVSX1RJX0hfCgojaW5jbHVkZSAid3BhLmgiCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIm9zRG90MTEuaCIKI2luY2x1ZGUgIjgwMl8xMURlZnMuaCIKI2luY2x1ZGUgIlRJX0FkYXB0ZXJBcGlDLmgiCiNpbmNsdWRlICJ0aWlvY3RsLmgiCiNpbmNsdWRlICJzaGxpc3QuaCIKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBUSVdMQU5fRFJWX05BTUUgICAgICAgICAidGl3bGFuMCIKI2RlZmluZSBUS0lQX0tFWV9MRU5HVEggICAgICAgICAzMgojZGVmaW5lIEFFU19LRVlfTEVOR1RIICAgICAgICAgIDE2CiNkZWZpbmUgV0VQX0tFWV9MRU5HVEhfNDAgICAgICAgNQojZGVmaW5lIFdFUF9LRVlfTEVOR1RIXzEwNCAgICAgIDEzCgojZGVmaW5lIFRJTUFDMlNUUihhKSAoYSlbMF0sIChhKVsxXSwgKGEpWzJdLCAoYSlbM10sIChhKVs0XSwgKGEpWzVdCiNkZWZpbmUgVElNQUNTVFIgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgoKdHlwZWRlZiBlbnVtIF9USVdMQU5fS0VZX0ZMQUdTCnsKICAgICAgICBUSVdMQU5fS0VZX0ZMQUdTX1RSQU5TTUlUICAgICAgID0gMHg4MDAwMDAwMCwgICAgICAgICAgIC8qIFVzZWQgd2hlbmV2ZXIga2V5IHNob3VsZCBiZSBpbW1pZGlhdGVseSB1c2VkIGZvciBUWCAqLwogICAgICAgIFRJV0xBTl9LRVlfRkxBR1NfUEFJUldJU0UgICAgICAgPSAweDQwMDAwMDAwLCAgICAgICAgICAgLyogVXNlZCB0byBpbmRpY2F0ZSBwYWlyd2lzZSBrZXkgKi8KICAgICAgICBUSVdMQU5fS0VZX0ZMQUdTX1NFVF9LRVlfUlNDICAgID0gMHgyMDAwMDAwMCwgICAgICAgICAgIC8qIFVzZWQgdG8gc2V0IFJTQyAocmVjZWl2ZSBzZXF1ZW5jZSBjb3VudGVyKSB0byBkcml2ZXIgKi8KICAgICAgICBUSVdMQU5fS0VZX0ZMQUdTX0FVVEhFTlRJQ0FUT1IgID0gMHgxMDAwMDAwMCAgICAgICAgICAgIC8qIE5vdCB1c2VkIGN1cnJlbnRseSAqLwp9IFRJV0xBTl9LRVlfRkxBR1M7CgojZGVmaW5lIE5PX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAwCiNkZWZpbmUgTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1MgICAgIDEKI2RlZmluZSBCTE9DS19ESVNBU1NPQyAgICAgICAgICAgICAgICAgICAgMgojZGVmaW5lIE5PX0JMT0NLX1dQUyAgICAgICAgICAgICAgICAgICAgICAzCgojaWZuZGVmIFdQQV9PVUkKLyogeyAweDAwLCAweDUwLCAweGYyLCAweDAxIH0gKi8KI2RlZmluZSBXUEFfT1VJICJceDAwXHg1MFx4ZjJceDAxIgojZW5kaWYKCiNkZWZpbmUgTlVNQkVSX1NDQU5fQ0hBTk5FTFNfRkNDICAgICAgICAxMQojZGVmaW5lIE5VTUJFUl9TQ0FOX0NIQU5ORUxTX0VUU0kgICAgICAgMTMKI2RlZmluZSBOVU1CRVJfU0NBTl9DSEFOTkVMU19NS0sxICAgICAgIDE0CgojaWZuZGVmIEVUSEVSTkVUX0hEUl9MRU4KI2RlZmluZSBFVEhFUk5FVF9IRFJfTEVOICAgICAgICAxNAojZW5kaWYKCiNkZWZpbmUgV1BBX09QVElPTlNfRElTQUJMRSAgICAgMAojZGVmaW5lIFdQQV9PUFRJT05TX0VOQUJMRSAgICAgIDMKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKHgseSkgICAgICAgICAgICAgICAgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQojZW5kaWYKCi8qIFRJIHN0YXRpb24gY29udHJvbCBzdHJ1Y3R1cmUgKi8Kc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSB7CiAgICBVSU5UOCBvd25fYWRkcltFVEhfQUxFTl07ICAgICAgICAgIC8qIE1BQyBhZGRyZXNzIG9mIFdMQU4gaW50ZXJmYWNlICovCiAgICB2b2lkICpoV3BhU3VwcGxpY2FudDsgICAgICAgICAgICAgIC8qIEhhbmRsZSB0byB3cGFfc3VwcGxpY2FudCAqLwogICAgVElfSEFORExFIGhEcml2ZXI7ICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgdG8gc2VsZiAqLwogICAgVElfSEFORExFIGhFdmVudHNbSVBDX0VWRU5UX01BWF07ICAvKiBFdmVudCBoYW5kbGVzIC0gbmVlZGVkIHRvIHJlZ2lzdGVyIHRvIGRyaXZlciBldmVudHMgKi8KICAgIGludCBrZXlfbWdtdDsgICAgICAgICAgICAgICAgICAgICAgLyogS2V5IE1hbmFnZW1lbnQ6IDgwMl8xWC9QU0svTk9ORS84MDJfMVhfTk9fV1BBL1dQQV9OT05FICovCiAgICBpbnQgcHJvdG87ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb3RvY29sIChXUEEvV1BBMi9SU04pICovCiAgICBpbnQgZW5jcnlwdGlvbjsgICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHRpb24gdHlwZSAqLwogICAgaW50IGF1dGhfYWxnOyAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBBbGc6IE9wZW4sIFNoYXJlZCBvciBMRUFQICovCiAgICBpbnQgZHJpdmVyX2lzX2xvYWRlZDsgICAgICAgICAgICAgIC8qIFRSVUUvRkFMU0UgZmxhZyBpZiBkcml2ZXIgaXMgYWxyZWFkeSBsb2FkZWQgYW5kIGNhbiBiZSBhY2Nlc3NlZCAqLwogICAgaW50IHNjYW5fdHlwZTsgICAgICAgICAgICAgICAgICAgICAvKiBTQ0FOX1RZUEVfTk9STUFMX0FDVElWRSBvciAgU0NBTl9UWVBFX05PUk1BTF9QQVNTSVZFICovCiAgICBpbnQgc2Nhbl9jaGFubmVsczsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBhbGxvd2VkIHNjYW4gY2hhbm5lbHMgKi8KICAgIHVuc2lnbmVkIGxpbmtfc3BlZWQ7ICAgICAgICAgICAgICAgLyogTGluayBTcGVlZCAqLwogICAgdW5zaWduZWQgYnRjb2V4X21vZGU7ICAgICAgICAgICAgICAvKiBCdENvZXggTW9kZSAqLwogICAgaW50IGJ0Y29leF9zY2FuOyAgICAgICAgICAgICAgICAgICAvKiBCdENvZXggU2NhbiAqLwogICAgdW5zaWduZWQgcnRzX3RocmVzaG9sZDsgICAgICAgICAgICAvKiBSVFMgVGhyZXNob2xkICovCiAgICBpbnQgbGFzdF9zY2FuOyAgICAgICAgICAgICAgICAgICAgIC8qIExhc3Qgc2NhbiB0eXBlICovCiAgICBpbnQgZm9yY2VfbWVyZ2VfZmxhZzsgICAgICAgICAgICAgIC8qIEZvcmNlIHNjYW4gcmVzdWx0cyBtZXJnZSAqLwogICAgU0hMSVNUIHNjYW5fbWVyZ2VfbGlzdDsgICAgICAgICAgICAvKiBQcmV2aW91cyBzY2FuIGxpc3QgKi8KICAgIGludCBkcml2ZXJFdmVudHNTb2NrZXQ7CiAgICBpbnQgYmxvY2tfZGlzYXNzb2NfZXZlbnRzOwogICAgaW50IGJsb2NrX2Rpc2Fzc29jX3ByZXY7Cn07CgovKiBleHRlcm5hbCBzeW1ib2xzIGZyb20gY29tbW9uLmMgLSB3aWxsIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgY2hhbmdlIGRlYnVnIGxldmVsIGJ5IElPQ1RMcyAqLwpleHRlcm4gaW50IHdwYV9kZWJ1Z19sZXZlbDsKZXh0ZXJuIGludCB3cGFfZGVidWdfc2hvd19rZXlzOwpleHRlcm4gaW50IHdwYV9kZWJ1Z190aW1lc3RhbXA7CiNlbmRpZiAvKiBfRFJJVkVSX1RJX0hfICovCg==