LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gc3lzdGVtIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaHJfc3lzdGVtLmMKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSAiaG9zdC5oIgojaW5jbHVkZSAiaG9zdF9yZXMuaCIKI2luY2x1ZGUgImhyX3N5c3RlbS5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIEhBVkVfU1lTX1BST0NfSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJzeXMvcHJvYy5oIgojZW5kaWYKI2lmbmRlZiBtaW5ndzMyCiNpZiBIQVZFX1VUTVBYX0gKI2luY2x1ZGUgPHV0bXB4Lmg+CiNlbHNlCiNpbmNsdWRlIDx1dG1wLmg+CiNlbmRpZgojZW5kaWYgLyogbWluZ3czMiAqLwojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDxsbS5oPgojZW5kaWYKCiNpZmRlZiBsaW51eAojaWZkZWYgSEFWRV9MSU5VWF9UQVNLU19ICiNpbmNsdWRlIDxsaW51eC90YXNrcy5oPgojZWxzZQovKgogKiBJZiB0aGlzIGZpbGUgZG9lc24ndCBleGlzdCwgdGhlbiB0aGVyZSBpcyBubyBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIKICogb2YgcHJvY2Vzc2VzLCBzbyByZXR1cm4gMCBmb3IgaHJTeXN0ZW1NYXhQcm9jZXNzZXMuICAKICovCiNkZWZpbmUgTlJfVEFTS1MJMAojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQojaW5jbHVkZSA8c3lzL3BzdGF0Lmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoc29sYXJpczIpCiNpbmNsdWRlIDxrc3RhdC5oPgojaW5jbHVkZSA8c3lzL3Zhci5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvb3BlbnByb21pby5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TWVNDVExfSAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCiNpZiAhZGVmaW5lZChVVE1QX0ZJTEUpICYmIGRlZmluZWQoX1BBVEhfVVRNUCkKI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAojZW5kaWYKCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAp2b2lkICAgICAgICAgICAgc2V0dXRlbnQodm9pZCk7CnZvaWQgICAgICAgICAgICBlbmR1dGVudCh2b2lkKTsKc3RydWN0IHV0bXAgICAgKmdldHV0ZW50KHZvaWQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcihpbnQgYWN0aW9uLCB1X2NoYXIgKiB2YXJfdmFsLCB1X2NoYXIgdmFyX3ZhbF90eXBlLCBzaXplX3QgdmFyX3ZhbF9sZW4sIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbik7CnN0YXRpYyBpbnQgZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICpwYXJhbWV0ZXIsIGNoYXIgKm91dHB1dCk7CnN0YXRpYyBsb25nICAgICBnZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKHZvaWQpOwojZW5kaWYKc3RhdGljIGludCAgICAgIGdldF9sb2FkX2Rldih2b2lkKTsKc3RhdGljIGludCAgICAgIGNvdW50X3VzZXJzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY291bnRfcHJvY2Vzc2VzKHZvaWQpOwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbml0aWFsaXNhdGlvbiAmIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2RlZmluZQlIUlNZU19VUFRJTUUJCTEKI2RlZmluZQlIUlNZU19EQVRFCQkyCiNkZWZpbmUJSFJTWVNfTE9BRF9ERVYJCTMKI2RlZmluZQlIUlNZU19MT0FEX1BBUkFNCTQKI2RlZmluZQlIUlNZU19VU0VSUwkJNQojZGVmaW5lCUhSU1lTX1BST0NTCQk2CiNkZWZpbmUJSFJTWVNfTUFYUFJPQ1MJCTcKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgUk9OTFksIHZhcl9ocnN5cywgMSwgezF9fSwKICAgIHtIUlNZU19EQVRFLCBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHszfX0sCiAgICB7SFJTWVNfTE9BRF9QQVJBTSwgQVNOX09DVEVUX1NUUiwgUldSSVRFLCB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgUk9OTFksIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7Nn19LAogICAge0hSU1lTX01BWFBST0NTLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZWxzZQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgUk9OTFksIHZhcl9ocnN5cywgMSwgezF9fSwKICAgIHtIUlNZU19EQVRFLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7Mn19LAogICAge0hSU1lTX0xPQURfREVWLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHs1fX0sCiAgICB7SFJTWVNfUFJPQ1MsIEFTTl9HQVVHRSwgUk9OTFksIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICBocnN5c3RlbV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAxIH07CgoKdm9pZAppbml0X2hyX3N5c3RlbSh2b2lkKQp7CiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N5c3RlbSIsIGhyc3lzdGVtX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGhyc3lzdGVtX3ZhcmlhYmxlc19vaWQpOwp9IC8qIGVuZCBpbml0X2hyX3N5c3RlbSAqLwoKLyoKICogaGVhZGVyX2hyc3lzKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqLwoKaW50CmhlYWRlcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTWVNfTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zeXN0ZW0iLCAidmFyX2hyc3lzOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3lzdGVtIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N5c3RlbSIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTWVNfTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nKTsgICAgLyogZGVmYXVsdCB0byAnbG9uZycgcmVzdWx0cyAqLwogICAgcmV0dXJuIChNQVRDSF9TVUNDRUVERUQpOwp9IC8qIGVuZCBoZWFkZXJfaHJzeXMgKi8KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgU3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgp1X2NoYXIgICAgICAgICAqCnZhcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMjldOyAvKiBwZXIgTUlCLCBtYXggc2l6ZSBpcyAxMjggKi8KI2lmIGRlZmluZWQoc29sYXJpczIpCiAgICAvKiBtYXggc2l6ZSBvZiBudnJhbSBwcm9wZXJ0eSAqLwogICAgY2hhciBib290cGFyYW1bODE5Ml07CiNlbmRpZgogICAgdGltZV90ICAgICAgICAgIG5vdzsKI2lmZGVmIGxpbnV4CiAgICBGSUxFICAgICAgICAgICAqZnA7CiNlbmRpZgojaWYgTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAmJiBkZWZpbmVkKENUTF9LRVJOKSAmJiBkZWZpbmVkKEtFUk5fTUFYUFJPQykKICAgIHN0YXRpYyBpbnQgICAgICBtYXhwcm9jX21pYltdID0geyBDVExfS0VSTiwgS0VSTl9NQVhQUk9DIH07CiAgICBzaXplX3QgICAgICAgICAgYnVmX3NpemU7CiNlbmRpZgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IHBzdF9zdGF0aWMgcHN0X2J1ZjsKI2VuZGlmCgogICAgaWYgKGhlYWRlcl9ocnN5cyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSA9PQogICAgICAgIE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBIUlNZU19VUFRJTUU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBnZXRfdXB0aW1lKCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfREFURToKI2lmIGRlZmluZWQoSEFWRV9NS1RJTUUpICYmIGRlZmluZWQoSEFWRV9TVElNRSkKICAgICAgICAqd3JpdGVfbWV0aG9kPW5zX3NldF90aW1lOwojZW5kaWYKICAgICAgICAodm9pZCAqKSB0aW1lKCZub3cpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGRhdGVfbl90aW1lKCZub3csIHZhcl9sZW4pOwogICAgY2FzZSBIUlNZU19MT0FEX0RFVjoKICAgICAgICBsb25nX3JldHVybiA9IGdldF9sb2FkX2RldigpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX0xPQURfUEFSQU06CiNpZmRlZiBsaW51eAogICAgICAgIGlmKChmcCA9IGZvcGVuKCIvcHJvYy9jbWRsaW5lIiwgInIiKSkgIT0gTlVMTCkgewogICAgICAgICAgICBmZ2V0cyhzdHJpbmcsIHNpemVvZihzdHJpbmcpLCBmcCk7CiAgICAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgICAgICp3cml0ZV9tZXRob2Q9c2V0X3NvbGFyaXNfYm9vdGNvbW1hbmRfcGFyYW1ldGVyOwogICAgICAgIGlmICggZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcigiYm9vdC1jb21tYW5kIixib290cGFyYW0pICkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ1bmFibGUgdG8gbG9va3VwIGJvb3QtY29tbWFuZCBmcm9tIGVlcHJvbVxuIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBzdHJsY3B5KHN0cmluZyxib290cGFyYW0sc2l6ZW9mKHN0cmluZykpOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICJhc2sgRGF2ZSIpOyAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICBjYXNlIEhSU1lTX1VTRVJTOgogICAgICAgIGxvbmdfcmV0dXJuID0gY291bnRfdXNlcnMoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19QUk9DUzoKI2lmIFVTSU5HX0hPU1RfSFJfU1dSVU5fTU9EVUxFCiAgICAgICAgbG9uZ19yZXR1cm4gPSBjb3VudF9wcm9jZXNzZXMoKTsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfTUFYUFJPQ1M6CiNpZiBkZWZpbmVkKE5SX1RBU0tTKQogICAgICAgIGxvbmdfcmV0dXJuID0gTlJfVEFTS1M7IC8qIDxsaW51eC90YXNrcy5oPiAqLwojZWxpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICYmIGRlZmluZWQoQ1RMX0tFUk4pICYmIGRlZmluZWQoS0VSTl9NQVhQUk9DKQoJewoJICAgIGludCBucHJvYyA9IDA7CgoJICAgIGJ1Zl9zaXplID0gc2l6ZW9mKG5wcm9jKTsKCSAgICBpZiAoc3lzY3RsKG1heHByb2NfbWliLCAyLCAmbnByb2MsICZidWZfc2l6ZSwgTlVMTCwgMCkgPCAwKQoJCXJldHVybiBOVUxMOwoJICAgIGxvbmdfcmV0dXJuID0gbnByb2M7Cgl9CiNlbGlmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBwc3RhdF9nZXRzdGF0aWMoJnBzdF9idWYsIHNpemVvZihzdHJ1Y3QgcHN0X3N0YXRpYyksIDEsIDApOwogICAgICAgIGxvbmdfcmV0dXJuID0gcHN0X2J1Zi5tYXhfcHJvYzsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgICAgICBsb25nX3JldHVybiA9IGdldF9tYXhfc29sYXJpc19wcm9jZXNzZXMoKTsKICAgICAgICBpZiAobG9uZ19yZXR1cm4gPT0gLTEpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwojZWxpZiBkZWZpbmVkKE5QUk9DX1NZTUJPTCkKCXsKCSAgICBpbnQgbnByb2MgPSAwOwoKCSAgICBhdXRvX25saXN0KE5QUk9DX1NZTUJPTCwgKGNoYXIgKikgJm5wcm9jLCBzaXplb2YobnByb2MpKTsKCSAgICBsb25nX3JldHVybiA9IG5wcm9jOwoJfQojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2hyc3lzXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0gLyogZW5kIHZhcl9ocnN5cyAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQoKLyogZnVuY3Rpb25zIGZvciBtYWxsb2MgYW5kIGZyZWVpbmcgb3BlbnByb21pbyBzdHJ1Y3R1cmUgKi8Kc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKQp7CiAgICBzdHJ1Y3Qgb3BlbnByb21pbyAqb3A7CiAgICBvcD1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcGVucHJvbWlvKSArIHNpemUpOwogICAgaWYob3AgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBtYWxsb2MgbWVtb3J5XG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBtZW1zZXQob3AsIDAsIHNpemVvZihzdHJ1Y3Qgb3BlbnByb21pbykrc2l6ZSk7CiAgICBvcC0+b3Byb21fc2l6ZT1zaXplOwoKICAgIHJldHVybiBvcDsKfQoKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApIHsKICAgIGZyZWUob3ApOwp9CgpzdGF0aWMgaW50CnNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcihpbnQgYWN0aW9uLAogICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pIHsKCiAgICBzdGF0aWMgY2hhciBvbGRfdmFsdWVbMTAyNF0sKnBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsKICAgIGludCBzdGF0dXM9MDsKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgICAgIC8qIGNoZWNrIHR5cGUgKi8KICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBzZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXIgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBSRVNFUlZFMjogewogICAgICAgICAgICAvKiBjcmVhdGUgY29weSBvZiBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgaWYoc3RhdFApIHsKICAgICAgICAgICAgICAgIGludCBvbGRfdmFsX2xlbj1zdHJsZW4oc3RhdFApOwogICAgICAgICAgICAgICAgaWYob2xkX3ZhbF9sZW4gPj0gc2l6ZW9mKG9sZF92YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT0oY2hhciAqKW1hbGxvYyhvbGRfdmFsX2xlbisxKTsKICAgICAgICAgICAgICAgICAgICBpZihwX29sZF92YWx1ZT09TlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ1bmFibGUgdG8gbWFsbG9jIG1lbW9yeVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0cmxjcHkocF9vbGRfdmFsdWUsc3RhdFAsb2xkX3ZhbF9sZW4rMSk7CiAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgICAgcF9vbGRfdmFsdWU9TlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgQUNUSU9OOiB7CiAgICAgICAgICAgIHN0YXR1cz1zZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLChjaGFyICopdmFyX3ZhbCx2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIFVORE86IHsKICAgICAgICAgICAgLyogcmV2ZXJ0IHRvIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpZihwX29sZF92YWx1ZSkgeyAKICAgICAgICAgICAgICAgIHN0YXR1cz1zZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLChjaGFyICopcF9vbGRfdmFsdWUsc3RybGVuKHBfb2xkX3ZhbHVlKSk7CiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1vbGRfdmFsdWU7IAogICAgICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBGUkVFOgogICAgICAgIGNhc2UgQ09NTUlUOgogICAgICAgICAgICAvKiBmcmVlIG1lbW9yeSBpZiBuZWNlc3NhcnkgKi8KICAgICAgICAgICAgaWYocF9vbGRfdmFsdWUgIT0gIG9sZF92YWx1ZSkgewogICAgICAgICAgICAgICAgZnJlZShwX29sZF92YWx1ZSk7CiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1vbGRfdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKc3RhdGljIGludCBzZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4pIHsKCiAgICBpbnQgc3RhdHVzPTA7CiAgICBjaGFyIGJ1ZmZlclsxMDI0XSwqcGJ1ZmZlcj1idWZmZXI7CiAgICAKICAgIGlmKCBzdHJsZW4oa2V5KStzdHJsZW4odmFsdWUpKzE2ID4gc2l6ZW9mKGJ1ZmZlcikgKSB7CiAgICAgICAgcGJ1ZmZlcj0oY2hhciAqKW1hbGxvYyhzdHJsZW4oa2V5KStzdHJsZW4odmFsdWUpKzE2KTsKICAgIH0gCgogICAgCiAgICBzcHJpbnRmKHBidWZmZXIsICJlZXByb20gJXM9XCIlLipzXCJcbiIsIGtleSwgdmFyX3ZhbF9sZW4sIHZhbHVlKTsKCiAgICBzdGF0dXM9c3lzdGVtKHBidWZmZXIpOwoKICAgIGlmKHBidWZmZXIhPWJ1ZmZlcikgZnJlZShwYnVmZmVyKTsKICAgIHJldHVybiBzdGF0dXM7Cn0KCnN0YXRpYyBpbnQgZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICpwYXJhbWV0ZXIsIGNoYXIgKm91dGJ1ZmZlcikgewoKICAgIGludCBmZD0wLHN0YXR1cz0wOwogICAgc3RydWN0IG9wZW5wcm9taW8gKm9wZW5wcm9taW5mbz1OVUxMOwoKICAgIGZkPW9wZW4oIi9kZXYvb3BlbnByb20iLE9fUkRPTkxZKTsKICAgIGlmICggZmQgPT0gLTEgKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCIvZGV2L29wZW5wcm9tIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgb3BlbnByb21pbmZvID0gb3BfbWFsbG9jKDgxOTIpOwogICAgaWYoIW9wZW5wcm9taW5mbykgcmV0dXJuIDE7CgogICAgc3RyY3B5KG9wZW5wcm9taW5mby0+b3Byb21fYXJyYXkscGFyYW1ldGVyKTsKCiAgICBzdGF0dXM9aW9jdGwoZmQsT1BST01HRVRPUFQsb3BlbnByb21pbmZvKTsKICAgIGlmICggc3RhdHVzID09IC0xICkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcigiL2Rldi9vcGVucHJvbSIpOwogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBvcF9mcmVlKG9wZW5wcm9taW5mbyk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBzdHJjcHkob3V0YnVmZmVyLG9wZW5wcm9taW5mby0+b3Byb21fYXJyYXkpOwoKICAgIG9wX2ZyZWUob3BlbnByb21pbmZvKTsKCiAgICAvKiBjbG9zZSBmaWxlICovCiAgICBjbG9zZShmZCk7CgogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgbG9uZyBnZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKHZvaWQpIHsKCiAgICBrc3RhdF9jdGxfdCAqa3NjPU5VTEw7CiAgICBrc3RhdF90ICprcz1OVUxMOwogICAgc3RydWN0IHZhciB2OwogICAgc3RhdGljIGxvbmcgbWF4cHJvY3M9LTE7CgogICAgLyogYXNzdW1lIG9ubHkgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgb25jZSwgc2luY2UgL2V0Yy9zeXN0ZW0gbXVzdCBiZSBtb2RpZmllZCAqLwogICAgaWYgKG1heHByb2NzID09IC0xKSB7CiAgICAgICAgaWYgKCAoa3NjPWtzdGF0X29wZW4oKSkgIT0gTlVMTCAmJiAKICAgICAgICAgICAgIChrcz1rc3RhdF9sb29rdXAoa3NjLCAidW5peCIsIDAsICJ2YXIiKSkgIT0gTlVMTCAmJiAKICAgICAgICAgICAgIChrc3RhdF9yZWFkKGtzYywga3MsICZ2KSAhPSAtMSkpIHsKCiAgICAgICAgICAgIG1heHByb2NzPXYudl9wcm9jOwogICAgICAgIH0KICAgICAgICBpZihrc2MpIHsKICAgICAgICAgICAga3N0YXRfY2xvc2Uoa3NjKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1heHByb2NzOwp9CgojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfTUtUSU1FKSAmJiBkZWZpbmVkKEhBVkVfU1RJTUUpCmludApuc19zZXRfdGltZShpbnQgYWN0aW9uLAogICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKCiAgICBzdGF0aWMgdGltZV90IG9sZHRpbWU9MDsKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgICAgIC8qIGNoZWNrIHR5cGUgKi8KICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBuc19zZXRfdGltZSBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSA4ICYmIHZhcl92YWxfbGVuIT0xMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwid3JpdGUgdG8gbnNfc2V0X3RpbWUgbm90IGEgcHJvcGVyIGxlbmd0aFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRlJFRToKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQUNUSU9OOiB7CiAgICAgICAgICAgIGxvbmcgc3RhdHVzPTA7CiAgICAgICAgICAgIHRpbWVfdCBzZWNvbmRzPTA7CiAgICAgICAgICAgIHN0cnVjdCB0bSBuZXd0aW1ldG07CiAgICAgICAgICAgIGludCBob3Vyc19mcm9tX3V0Yz0gMDsKICAgICAgICAgICAgaW50IG1pbnV0ZXNfZnJvbV91dGM9IDA7CgogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPT0gMTEpIHsKICAgICAgICAgICAgICAgIC8qIHRpbWV6b25lIGluZm9yYW1hdGlvbiB3YXMgcHJlc2VudCAqLwogICAgICAgICAgICAgICAgaG91cnNfZnJvbV91dGM9KGludCl2YXJfdmFsWzldOwogICAgICAgICAgICAgICAgbWludXRlc19mcm9tX3V0Yz0oaW50KXZhcl92YWxbMTBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXd0aW1ldG0udG1fc2VjPShpbnQpdmFyX3ZhbFs2XTs7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9taW49KGludCl2YXJfdmFsWzVdOwogICAgICAgICAgICBuZXd0aW1ldG0udG1faG91cj0oaW50KXZhcl92YWxbNF07CgogICAgICAgICAgICBuZXd0aW1ldG0udG1fbW9uPShpbnQpdmFyX3ZhbFsyXS0xOwogICAgICAgICAgICBuZXd0aW1ldG0udG1feWVhcj0yNTYqKGludCl2YXJfdmFsWzBdKyhpbnQpdmFyX3ZhbFsxXS0xOTAwOwogICAgICAgICAgICBuZXd0aW1ldG0udG1fbWRheT0oaW50KXZhcl92YWxbM107CgogICAgICAgICAgICAvKiBkZXRlcm1pbmUgaWYgZGF5IGxpZ2h0IHNhdmluZ3MgdGltZSBpbiBlZmZlY3QgRFNUICovCiAgICAgICAgICAgIGlmICggKCBob3Vyc19mcm9tX3V0Yyo2MCo2MCttaW51dGVzX2Zyb21fdXRjKjYwICkgPT0gYWJzKHRpbWV6b25lKSApIHsKICAgICAgICAgICAgICAgIG5ld3RpbWV0bS50bV9pc2RzdD0wOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV3dGltZXRtLnRtX2lzZHN0PTE7CiAgICAgICAgICAgIH0gCgogICAgICAgICAgICAvKiBjcmVhdGUgY29weSBvZiBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgb2xkdGltZT10aW1lKE5VTEwpOwoKICAgICAgICAgICAgc2Vjb25kcz1ta3RpbWUoJm5ld3RpbWV0bSk7CiAgICAgICAgICAgIGlmKHNlY29uZHMgPT0gKHRpbWVfdCktMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBjb252ZXJ0IHRpbWUgdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0dXM9c3RpbWUoJnNlY29uZHMpOwogICAgICAgICAgICBpZihzdGF0dXMhPTApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmFibGUgdG8gc2V0IHRpbWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBVTkRPOiB7CiAgICAgICAgICAgIC8qIHJldmVydCB0byBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgaW50IHN0YXR1cz0wOwogICAgICAgICAgICBpZihvbGR0aW1lICE9IDApIHsKICAgICAgICAgICAgICAgIHN0YXR1cz1zdGltZSgmb2xkdGltZSk7CiAgICAgICAgICAgICAgICBvbGR0aW1lPTA7ICAgIAogICAgICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBzZXQgdGltZVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgQ09NTUlUOiB7CiAgICAgICAgICAgIG9sZHRpbWU9MDsgICAgCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CiNlbmRpZgoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgUmV0dXJuIHRoZSBEZXZpY2VJbmRleCBjb3JyZXNwb25kaW5nCiAgICAgICAgICAgICAgICAgKiAgIHRvIHRoZSBib290IGRldmljZQogICAgICAgICAgICAgICAgICovCnN0YXRpYyBpbnQKZ2V0X2xvYWRfZGV2KHZvaWQpCnsKICAgIHJldHVybiAoSFJERVZfRElTSyA8PCBIUkRFVl9UWVBFX1NISUZUKTsgICAgLyogWFhYICovCn0gLyogZW5kIGdldF9sb2FkX2RldiAqLwoKc3RhdGljIGludApjb3VudF91c2Vycyh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgdG90YWwgPSAwOwojaWZuZGVmIFdJTjMyCiNpZiBIQVZFX1VUTVBYX0gKI2RlZmluZSBzZXR1dGVudCBzZXR1dHhlbnQKI2RlZmluZSBwdXR1dGxpbmUgcHV0dXR4bGluZQojZGVmaW5lIGdldHV0ZW50IGdldHV0eGVudAojZGVmaW5lIGVuZHV0ZW50IGVuZHV0eGVudAogICAgc3RydWN0IHV0bXB4ICAgKnV0bXBfcDsKI2Vsc2UKICAgIHN0cnVjdCB1dG1wICAgICp1dG1wX3A7CiNlbmRpZgoKICAgIHNldHV0ZW50KCk7CiAgICB3aGlsZSAoKHV0bXBfcCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKI2lmbmRlZiBVVE1QX0hBU19OT19UWVBFCiAgICAgICAgaWYgKHV0bXBfcC0+dXRfdHlwZSAhPSBVU0VSX1BST0NFU1MpCiAgICAgICAgICAgIGNvbnRpbnVlOwojZW5kaWYKI2lmbmRlZiBVVE1QX0hBU19OT19QSUQKICAgICAgICAgICAgLyogVGhpcyBibG9jayBvZiBjb2RlIGZpeGVzIHpvbWJpZSB1c2VyIFBJRHMgaW4gdGhlCiAgICAgICAgICAgICAgIHV0bXAvdXRtcHggZmlsZSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBjb3VudGVkIGFzIGEKICAgICAgICAgICAgICAgY3VycmVudCB1c2VyICovCiAgICAgICAgICAgIGlmIChraWxsKHV0bXBfcC0+dXRfcGlkLCAwKSA9PSAtMSAmJiBlcnJubyA9PSBFU1JDSCkgewogICAgICAgICAgICAgICAgdXRtcF9wLT51dF90eXBlID0gREVBRF9QUk9DRVNTOwogICAgICAgICAgICAgICAgcHV0dXRsaW5lKHV0bXBfcCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgKyt0b3RhbDsKICAgIH0KICAgIGVuZHV0ZW50KCk7CiNlbHNlIC8qIFdJTjMyICovCiAgIC8qIAogICAgKiBUT0RPIC0gRXJyb3IgY2hlY2tpbmcuCiAgICAqLwoJTFBXS1NUQV9JTkZPXzEwMiB3a2luZm87CglORVRfQVBJX1NUQVRVUyBuc3RhdHVzOwoJCgluc3RhdHVzID0gTmV0V2tzdGFHZXRJbmZvKE5VTEwsIDEwMiwgKExQQllURSopJndraW5mbyk7CglpZiAobnN0YXR1cyAhPSBORVJSX1N1Y2Nlc3MpIHsKCQlyZXR1cm4gMDsKCX0KCXRvdGFsID0gKGludCl3a2luZm8tPndraTEwMl9sb2dnZWRfb25fdXNlcnM7CgoJTmV0QXBpQnVmZmVyRnJlZSh3a2luZm8pOwkKI2VuZGlmIC8qIFdJTjMyICovCiAgICByZXR1cm4gdG90YWw7Cn0KCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAoKc3RhdGljIEZJTEUgICAgKnV0bXBfZmlsZTsKc3RhdGljIHN0cnVjdCB1dG1wIHV0bXBfcmVjOwoKdm9pZApzZXR1dGVudCh2b2lkKQp7CiAgICBpZiAodXRtcF9maWxlKQogICAgICAgIGZjbG9zZSh1dG1wX2ZpbGUpOwogICAgdXRtcF9maWxlID0gZm9wZW4oVVRNUF9GSUxFLCAiciIpOwp9Cgp2b2lkCmVuZHV0ZW50KHZvaWQpCnsKICAgIGlmICh1dG1wX2ZpbGUpIHsKICAgICAgICBmY2xvc2UodXRtcF9maWxlKTsKICAgICAgICB1dG1wX2ZpbGUgPSBOVUxMOwogICAgfQp9CgpzdHJ1Y3QgdXRtcCAgICAqCmdldHV0ZW50KHZvaWQpCnsKICAgIGlmICghdXRtcF9maWxlKQogICAgICAgIHJldHVybiBOVUxMOwogICAgd2hpbGUgKGZyZWFkKCZ1dG1wX3JlYywgc2l6ZW9mKHV0bXBfcmVjKSwgMSwgdXRtcF9maWxlKSA9PSAxKQogICAgICAgIGlmICgqdXRtcF9yZWMudXRfbmFtZSAmJiAqdXRtcF9yZWMudXRfbGluZSkKICAgICAgICAgICAgcmV0dXJuICZ1dG1wX3JlYzsKICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwo=