LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgX19FTEZfXwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgImRvc21vZC5oIgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIF9faW5saW5lX18gaW50IHZtODZwbHVzKCBpbnQgZnVuYywgc3RydWN0IHZtODZwbHVzX3N0cnVjdCAqcHRyICkKewogICAgaW50IHJlczsKI2lmZGVmIF9fUElDX18KICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCAicHVzaGwgJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZsICUyLCUlZWJ4XG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ICQweDgwXG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wbCAlJWVieCIKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOwojZWxzZQogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MCIKICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImIiIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbmRpZiAgLyogX19QSUNfXyAqLwogICAgaWYgKHJlcyA+PSAwKSByZXR1cm4gcmVzOwogICAgZXJybm8gPSAtcmVzOwogICAgcmV0dXJuIC0xOwp9Cgp2b2lkIHNldF90aW1lcihzdHJ1Y3QgdGltZXZhbCp0aW0pCnsKIHN0cnVjdCBpdGltZXJ2YWwgY3VyOwoKIGN1ci5pdF9pbnRlcnZhbD0qdGltOwogY3VyLml0X3ZhbHVlPSp0aW07CiBzZXRpdGltZXIoSVRJTUVSX1JFQUwsJmN1cixOVUxMKTsKfQoKdm9sYXRpbGUgaW50IHNpZ19wZW5kLHNpZ19mYXRhbD0wOwp2b2lkKmltZzsKc3RydWN0IHZtODZwbHVzX3N0cnVjdCBWTTg2OwoKdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnKQp7CiBpZiAoc2lnX3BlbmQpIGZwcmludGYoc3RkZXJyLCJET1NNT0QgcHJldmlvdXMgc2lnbmFsICVkIGxvc3RcbiIsc2lnX3BlbmQpOwogc2lnX3BlbmQ9c2lnOwogc2lnbmFsKHNpZyxzaWdfaGFuZGxlcik7Cn0KCnZvaWQgYmFkX2hhbmRsZXIoaW50IHNpZykKewogZnByaW50ZihzdGRlcnIsIkRPU01PRCBjYXVnaHQgZmF0YWwgc2lnbmFsICVkXG4iLHNpZyk7CiBmcHJpbnRmKHN0ZGVyciwiKExhc3Qga25vd24gVk04NiBDUzpJUCB3YXMgJTA0eDolMDRseClcbiIsVk04Ni5yZWdzLmNzLFZNODYucmVncy5laXApOwogc2lnX3BlbmQ9c2lnOyBzaWdfZmF0YWwrKzsKIHNpZ25hbChzaWcsYmFkX2hhbmRsZXIpOwp9CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyKiphcmd2KQp7CiBpbnQgbWZkPW9wZW4oYXJndlswXSxPX1JEV1IpOwogc3RydWN0IHRpbWV2YWwgdGltOwogaW50IGZ1bmMscmV0Owogb2ZmX3QgZm9mcz0wOwogcGlkX3QgcHBpZD1nZXRwcGlkKCk7CiAKLyogZnByaW50ZihzdGRlcnIsIm1haW4gaXMgYXQgJTA4bHgsIGZpbGUgaXMgJXMsIGZkPSVkXG4iLCh1bnNpZ25lZCBsb25nKSZtYWluLGFyZ3ZbMF0sbWZkKTsgKi8KIGlmIChtZmQ8MCkgcmV0dXJuIDE7Ci8qIE1hcCBpbiBvdXIgRE9TIGltYWdlIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlICovCiBpZiAoYXJndlsxXSkgewogIC8qIFVscmljaCBXZWlnYW5kIHN1Z2dlc3RlZCBtYXBwaW5nIGluIHRoZSBET1MgaW1hZ2UgZGlyZWN0bHkgZnJvbSB0aGUgV2luZQogICAgIGFkZHJlc3Mgc3BhY2UgKi8KICBmb2ZzPWF0b2woYXJndlsxXSk7CiAgLyogbGludXggY3VycmVudGx5IG9ubHkgYWxsb3dzIG1hcHBpbmcgYSBwcm9jZXNzIG1lbW9yeSBpZiBpdCdzIGJlaW5nIHB0cmFjZWQgKi8KICAvKiBMaW51cyBkb2Vzbid0IGxpa2UgaXQsIHNvIHRoaXMgcHJvYmFibHkgd29uJ3Qgd29yayBpbiB0aGUgZnV0dXJlICovCiAgLyogaXQgZG9lc24ndCBldmVuIHdvcmsgZm9yIG1lIHJpZ2h0IG5vdyAqLwogIGtpbGwocHBpZCxTSUdTVE9QKTsKICBwdHJhY2UoUFRSQUNFX0FUVEFDSCxwcGlkLDAsMCk7CiAgd2FpdHBpZChwcGlkLE5VTEwsMCk7CiB9CiBpbWc9bW1hcChOVUxMLDB4MTEwMDAwLFBST1RfRVhFQ3xQUk9UX1JFQUR8UFJPVF9XUklURSxNQVBfRklYRUR8TUFQX1NIQVJFRCxtZmQsZm9mcyk7CiBpZiAoYXJndlsxXSkgewogIHB0cmFjZShQVFJBQ0VfREVUQUNILHBwaWQsMCwwKTsKICBraWxsKHBwaWQsU0lHQ09OVCk7CiB9CiBpZiAoaW1nPT0odm9pZCopLTEpIHsKICBmcHJpbnRmKHN0ZGVyciwiRE9TIG1lbW9yeSBtYXAgZmFpbGVkLCBlcnJvcj0lc1xuIixzdHJlcnJvcihlcnJubykpOwogIGZwcmludGYoc3RkZXJyLCJpbiBhdHRlbXB0IHRvIG1hcCAlcywgb2Zmc2V0ICUwOGxYLCBsZW5ndGggMTEwMDAwLCB0byBvZmZzZXQgMFxuIixhcmd2WzBdLGZvZnMpOwogIHJldHVybiAxOwogfQovKiBpbml0aWFsaXplIHNpZ25hbHMgYW5kIHN5c3RlbSB0aW1lciAqLwogc2lnbmFsKFNJR0hVUCxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHSU5ULHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdVU1IxLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdVU1IyLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdBTFJNLHNpZ19oYW5kbGVyKTsKCiBzaWduYWwoU0lHUVVJVCxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHSUxMLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdCVVMsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0ZQRSxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHU0VHVixiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHVEVSTSxiYWRfaGFuZGxlcik7CiNpZiAwCiB0aW0udHZfc2VjPTA7IHRpbS50dl91c2VjPTU0OTI1Owogc2V0X3RpbWVyKCZ0aW0pOwojZW5kaWYKLyogcmVwb3J0IGJhY2sgdG8gdGhlIG1haW4gcHJvZ3JhbSB0aGF0IHdlJ3JlIHJlYWR5ICovCiByZXQ9MTsgLyogZG9zbW9kIHByb3RvY29sIHJldmlzaW9uIDEgKi8KIHdyaXRlKDEsJnJldCxzaXplb2YocmV0KSk7Ci8qIGNvbnRleHQgZXhjaGFuZ2UgbG9vcCAqLwogZG8gewogIGlmIChyZWFkKDAsJmZ1bmMsc2l6ZW9mKGZ1bmMpKSE9c2l6ZW9mKGZ1bmMpKSByZXR1cm4gMTsKICBpZiAoZnVuYzwwKSBicmVhazsKICBzd2l0Y2ggKGZ1bmMpIHsKICAgY2FzZSBET1NNT0RfU0VUX1RJTUVSOgogICAgaWYgKHJlYWQoMCwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHJldHVybiAxOwogICAgc2V0X3RpbWVyKCZ0aW0pOwogICAgLyogbm8gcmVzcG9uc2UgKi8KICAgIGJyZWFrOwogICBjYXNlIERPU01PRF9FTlRFUjoKICAgZGVmYXVsdDoKICAgIGlmIChyZWFkKDAsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIGlmIChzaWdfcGVuZCkgcmV0PURPU01PRF9TSUdOQUw7IGVsc2UKICAgICByZXQ9dm04NnBsdXMoZnVuYywmVk04Nik7CiAgICBpZiAod3JpdGUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogICAgaWYgKHdyaXRlKDEsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIHN3aXRjaCAocmV0JjB4ZmYpIHsKICAgICBjYXNlIERPU01PRF9TSUdOQUw6CiAgICAgIHJldD1zaWdfcGVuZDsgc2lnX3BlbmQ9MDsKICAgICAgaWYgKHdyaXRlKDEsJnJldCxzaXplb2YocmV0KSkhPXNpemVvZihyZXQpKSByZXR1cm4gMTsKICAgICAgaWYgKHNpZ19mYXRhbCkgcmV0dXJuIDE7CiAgICAgIGJyZWFrOwogICAgfQogIH0KIH0gd2hpbGUgKDEpOwogcmV0dXJuIDA7Cn0KCiNlbHNlIC8qICFsaW51eC1pMzg2ICovCmludCBtYWluKHZvaWQpIHtyZXR1cm4gMTt9CiNlbmRpZgo=