LyoKICogY2FsbGJhY2suYzogQSBnZW5lcmljIGNhbGxiYWNrIG1lY2hhbmlzbSAKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwovKiogQGRlZmdyb3VwIGNhbGxiYWNrIEEgZ2VuZXJpYyBjYWxsYmFjayBtZWNoYW5pc20gCiAqICBAaW5ncm91cCBsaWJyYXJ5CiAqIAogKiAgQHsKICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWZlYXR1cmVzLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmICFkZWZpbmVkKG1pbmd3MzIpICYmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvY2FsbGJhY2suaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihjYWxsYmFja3NfYWxsLCBsaWJuZXRzbm1wKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGNhbGxiYWNrX2NvdW50LCBjYWxsYmFja3NfYWxsKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YoY2FsbGJhY2tfbGlzdCwgY2FsbGJhY2tzX2FsbCkKCi8qCiAqIHRoZSBpbmxpbmUgY2FsbGJhY2sgbWV0aG9kcyB1c2UgbWFqb3IvbWlub3IgdG8gaW5kZXggaW50byBhcnJheXMuCiAqIGFsbCB1c2VycyBpbiB0aGlzIGZ1bmN0aW9uIGRvIHJhbmdlIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZXNlCiAqIGZ1bmN0aW9ucywgc28gaXQgaXMgcmVkdW5kYW50IGZvciB0aGVtIHRvIGNoZWNrIGFnYWluLiBCdXQgaWYgeW91CiAqIHdhbnQgdG8gYmUgcGFyYW5vaWQsIGRlZmluZSB0aGlzIHZhciwgYW5kIGFkZGl0aW9uYWwgcmFuZ2UgY2hlY2tzCiAqIHdpbGwgYmUgcGVyZm9ybWVkLgogKiAjZGVmaW5lIE5FVFNOTVBfUEFSQU5PSURfTEVWRUxfSElHSCAxIAogKi8KCnN0YXRpYyBpbnQgX2NhbGxiYWNrX25lZWRfaW5pdCA9IDE7CnN0YXRpYyBzdHJ1Y3Qgc25tcF9nZW5fY2FsbGJhY2sKICAgICAgICAgICAgICAgKnRoZWNhbGxiYWNrc1tNQVhfQ0FMTEJBQ0tfSURTXVtNQVhfQ0FMTEJBQ0tfU1VCSURTXTsKCiNkZWZpbmUgQ0FMTEJBQ0tfTkFNRV9MT0dHSU5HIDEKI2lmZGVmIENBTExCQUNLX05BTUVfTE9HR0lORwpzdGF0aWMgY29uc3QgY2hhciAqdHlwZXNbTUFYX0NBTExCQUNLX0lEU10gPSB7ICJMSUIiLCAiQVBQIiB9OwpzdGF0aWMgY29uc3QgY2hhciAqbGliW01BWF9DQUxMQkFDS19TVUJJRFNdID0gewogICAgIlBPU1RfUkVBRF9DT05GSUciLCAvKiAwICovCiAgICAiU1RPUkVfREFUQSIsIC8qIDEgKi8KICAgICJTSFVURE9XTiIsIC8qIDIgKi8KICAgICJQT1NUX1BSRU1JQl9SRUFEX0NPTkZJRyIsIC8qIDMgKi8KICAgICJMT0dHSU5HIiwgLyogNCAqLwogICAgIlNFU1NJT05fSU5JVCIsIC8qIDUgKi8KICAgIE5VTEwsIC8qIDYgKi8KICAgIE5VTEwsIC8qIDcgKi8KICAgIE5VTEwsIC8qIDggKi8KICAgIE5VTEwsIC8qIDkgKi8KICAgIE5VTEwsIC8qIDEwICovCiAgICBOVUxMLCAvKiAxMSAqLwogICAgTlVMTCwgLyogMTIgKi8KICAgIE5VTEwsIC8qIDEzICovCiAgICBOVUxMLCAvKiAxNCAqLwogICAgTlVMTCAvKiAxNSAqLwp9OwojZW5kaWYKCi8qCiAqIGV4dHJlbWVseSBzaW1wbGlzdGljIGxvY2tpbmcsIGp1c3QgdG8gZmluZCBwcm9ibGVtcyB3ZXJlIHRoZQogKiBjYWxsYmFjayBsaXN0IGlzIG1vZGlmaWVkIHdoaWxlIGJlaW5nIHRyYXZlcnNlZC4gTm90IGludGVuZGVkCiAqIHRvIGRvIGFueSByZWFsIHByb3RlY3Rpb24sIG9yIGluIGFueSB3YXkgaW1wbHkgdGhhdCB0aGlzIGNvZGUKICogaGFzIGJlZW4gZXZhbHVhdGVkIGZvciB1c2UgaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4KICogSW4gNS4yLCBpdCB3YXMgYSBzaW5nbGUgbG9jay4gRm9yIDUuMywgaXQgaGFzIGJlZW4gdXBkYXRlZCB0bwogKiBhIGxvY2sgcGVyIGNhbGxiYWNrLCBzaW5jZSBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgbWF5IHRyaWdnZXIKICogcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uIG9mIG90aGVyIGNhbGxiYWNrcyAoZWcgQWdlbnRYCiAqIHN1YmFnZW50cyBkbyB0aGlzKS4KICovCiNkZWZpbmUgTE9DS19QRVJfQ0FMTEJBQ0tfU1VCSUQgMQojaWZkZWYgTE9DS19QRVJfQ0FMTEJBQ0tfU1VCSUQKc3RhdGljIGludCBfbG9ja3NbTUFYX0NBTExCQUNLX0lEU11bTUFYX0NBTExCQUNLX1NVQklEU107CiNkZWZpbmUgQ0FMTEJBQ0tfTE9DSyhtYWosbWluKSArK19sb2Nrc1ttYWpdW21pbl0KI2RlZmluZSBDQUxMQkFDS19VTkxPQ0sobWFqLG1pbikgLS1fbG9ja3NbbWFqXVttaW5dCiNkZWZpbmUgQ0FMTEJBQ0tfTE9DS19DT1VOVChtYWosbWluKSBfbG9ja3NbbWFqXVttaW5dCiNlbHNlCnN0YXRpYyBpbnQgX2xvY2s7CiNkZWZpbmUgQ0FMTEJBQ0tfTE9DSyhtYWosbWluKSArK19sb2NrCiNkZWZpbmUgQ0FMTEJBQ0tfVU5MT0NLKG1haixtaW4pIC0tX2xvY2sKI2RlZmluZSBDQUxMQkFDS19MT0NLX0NPVU5UKG1haixtaW4pIF9sb2NrCiNlbmRpZgoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIGludApfY2FsbGJhY2tfbG9jayhpbnQgbWFqb3IsIGludCBtaW5vciwgY29uc3QgY2hhciogd2FybiwgaW50IGRvX2Fzc2VydCkKewogICAgaW50IGxvY2tfaG9sZGVkPTA7CiAgICBzdHJ1Y3QgdGltZXZhbCBsb2NrX3RpbWUgPSB7IDAsIDEwMDAgfTsKCiNpZmRlZiBORVRTTk1QX1BBUkFOT0lEX0xFVkVMX0hJR0gKICAgIGlmIChtYWpvciA+PSBNQVhfQ0FMTEJBQ0tfSURTIHx8IG1pbm9yID49IE1BWF9DQUxMQkFDS19TVUJJRFMpIHsKICAgICAgICBuZXRzbm1wX2Fzc2VydCgiYmFkIGNhbGxiYWNrIGlkIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiNlbmRpZgogICAgCiNpZmRlZiBDQUxMQkFDS19OQU1FX0xPR0dJTkcKICAgIERFQlVHTVNHVEwoKCI5OmNhbGxiYWNrOmxvY2siLCAibG9ja2VkICglcywlcylcbiIsCiAgICAgICAgICAgICAgICB0eXBlc1ttYWpvcl0sIChTTk1QX0NBTExCQUNLX0xJQlJBUlkgPT0gbWFqb3IpID8KICAgICAgICAgICAgICAgIFNOTVBfU1RST1JOVUxMKGxpYlttaW5vcl0pIDogIm51bGwiKSk7CiNlbmRpZgogICAgd2hpbGUgKENBTExCQUNLX0xPQ0tfQ09VTlQobWFqb3IsbWlub3IpID49IDEgJiYgKytsb2NrX2hvbGRlZCA8IDEwMCkKCXNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmbG9ja190aW1lKTsKCiAgICBpZihsb2NrX2hvbGRlZCA+PSAxMDApIHsKICAgICAgICBpZiAoTlVMTCAhPSB3YXJuKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgImxvY2sgaW4gX2NhbGxiYWNrX2xvY2sgc2xlZXBzIG1vcmUgdGhhbiAxMDAgbWlsbGlzZWNvbmRzIGluICVzXG4iLCB3YXJuKTsKICAgICAgICBpZiAoZG9fYXNzZXJ0KQogICAgICAgICAgICBuZXRzbm1wX2Fzc2VydChsb2NrX2hvbGRlZCA8IDEwMCk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgQ0FMTEJBQ0tfTE9DSyhtYWpvcixtaW5vcik7CiAgICByZXR1cm4gMDsKfQoKTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKX2NhbGxiYWNrX3VubG9jayhpbnQgbWFqb3IsIGludCBtaW5vcikKewojaWZkZWYgTkVUU05NUF9QQVJBTk9JRF9MRVZFTF9ISUdICiAgICBpZiAobWFqb3IgPj0gTUFYX0NBTExCQUNLX0lEUyB8fCBtaW5vciA+PSBNQVhfQ0FMTEJBQ0tfU1VCSURTKSB7CiAgICAgICAgbmV0c25tcF9hc3NlcnQoImJhZCBjYWxsYmFjayBpZCIpOwogICAgICAgIHJldHVybjsKICAgIH0KI2VuZGlmCiAgICAKICAgIENBTExCQUNLX1VOTE9DSyhtYWpvcixtaW5vcik7CgojaWZkZWYgQ0FMTEJBQ0tfTkFNRV9MT0dHSU5HCiAgICBERUJVR01TR1RMKCgiOTpjYWxsYmFjazpsb2NrIiwgInVubG9ja2VkICglcywlcylcbiIsCiAgICAgICAgICAgICAgICB0eXBlc1ttYWpvcl0sIChTTk1QX0NBTExCQUNLX0xJQlJBUlkgPT0gbWFqb3IpID8KICAgICAgICAgICAgICAgIFNOTVBfU1RST1JOVUxMKGxpYlttaW5vcl0pIDogIm51bGwiKSk7CiNlbmRpZgp9CgoKLyoKICogdGhlIGNoaWNrZW4uIG9yIHRoZSBlZ2cuICBZb3UgcGljay4gCiAqLwp2b2lkCmluaXRfY2FsbGJhY2tzKHZvaWQpCnsKICAgIC8qCiAgICAgKiAocG9zZXMgYSBwcm9ibGVtIGlmIHlvdSBwdXQgaW5pdF9jYWxsYmFja3MoKSBpbnNpZGUgb2YKICAgICAqIGluaXRfc25tcCgpIGFuZCB0aGVuIHdhbnQgdGhlIGFwcCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGJlZm9yZQogICAgICogaW5pdF9zbm1wKCkgaXMgY2FsbGVkIGluIHRoZSBmaXJzdCBwbGFjZS4gIC0tIFdlcyAKICAgICAqLwogICAgaWYgKDAgPT0gX2NhbGxiYWNrX25lZWRfaW5pdCkKICAgICAgICByZXR1cm47CiAgICAKICAgIF9jYWxsYmFja19uZWVkX2luaXQgPSAwOwogICAgCiAgICBtZW1zZXQodGhlY2FsbGJhY2tzLCAwLCBzaXplb2YodGhlY2FsbGJhY2tzKSk7IAojaWZkZWYgTE9DS19QRVJfQ0FMTEJBQ0tfU1VCSUQKICAgIG1lbXNldChfbG9ja3MsIDAsIHNpemVvZihfbG9ja3MpKTsKI2Vsc2UKICAgIF9sb2NrID0gMDsKI2VuZGlmCiAgICAKICAgIERFQlVHTVNHVEwoKCJjYWxsYmFjayIsICJpbml0aWFsaXplZFxuIikpOwp9CgovKioKICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBnZW5lcmljIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVGhlIG1ham9yIGFuZAogKiBtaW5vciB2YWx1ZXMgYXJlIHVzZWQgdG8gc2V0IHRoZSBuZXdfY2FsbGJhY2sgZnVuY3Rpb24gaW50byBhIGdsb2JhbCAKICogc3RhdGljIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IG9mIHR5cGUgc3RydWN0IHNubXBfZ2VuX2NhbGxiYWNrLiAgCiAqIFRoZSBmdW5jdGlvbiBtYWtlcyBzdXJlIHRvIGFwcGVuZCB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGF0IHRoZSBlbmQKICogb2YgdGhlIGxpbmsgbGlzdCwgc25tcF9nZW5fY2FsbGJhY2stPm5leHQuCiAqCiAqIEBwYXJhbSBtYWpvciBpcyB0aGUgU05NUCBjYWxsYmFjayBtYWpvciB0eXBlIHVzZWQKICogCQktIFNOTVBfQ0FMTEJBQ0tfTElCUkFSWQogKiAgICAgICAgICAgICAgLSBTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OCiAqCiAqIEBwYXJhbSBtaW5vciBpcyB0aGUgU05NUCBjYWxsYmFjayBtaW5vciB0eXBlIHVzZWQKICoJCS0gU05NUF9DQUxMQkFDS19QT1NUX1JFQURfQ09ORklHCiAqCQktIFNOTVBfQ0FMTEJBQ0tfU1RPUkVfREFUQQkgICAgICAgIAogKgkJLSBTTk1QX0NBTExCQUNLX1NIVVRET1dOCQkgICAgICAgIAogKgkJLSBTTk1QX0NBTExCQUNLX1BPU1RfUFJFTUlCX1JFQURfQ09ORklHCQogKgkJLSBTTk1QX0NBTExCQUNLX0xPR0dJTkcJCQkKICoJCS0gU05NUF9DQUxMQkFDS19TRVNTSU9OX0lOSVQJICAgICAgIAogKgogKiBAcGFyYW0gbmV3X2NhbGxiYWNrIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHJlZ2lzdGVyZWQuCiAqCiAqIEBwYXJhbSBhcmcgd2hlbiBub3QgTlVMTCBpcyBhIHZvaWQgcG9pbnRlciB1c2VkIHdoZW5ldmVyIG5ld19jYWxsYmFjayAKICoJZnVuY3Rpb24gaXMgZXhlcmNpc2VkLiBPd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHR3b2RpbWVuc2lvbmFsCiAqICAgICAgdGhlY2FsbGJhY2tzW11bXSBhcnJheS4gVGhlIGZ1bmN0aW9uIGNsZWFyX2NhbGxiYWNrKCkgd2lsbCBkZWFsbG9jYXRlCiAqICAgICAgdGhlIG1lbW9yeSBwb2ludGVkIGF0IGJ5IGNhbGxpbmcgZnJlZSgpLgogKgogKiBAcmV0dXJuIAogKglSZXR1cm5zIFNOTVBFUlJfR0VORVJSIGlmIG1ham9yIGlzID49IE1BWF9DQUxMQkFDS19JRFMgb3IgbWlub3IgaXMgPj0KICoJTUFYX0NBTExCQUNLX1NVQklEUyBvciBhIHNubXBfZ2VuX2NhbGxiYWNrIHBvaW50ZXIgY291bGQgbm90IGJlIAogKglhbGxvY2F0ZWQsIG90aGVyd2lzZSBTTk1QRVJSX1NVQ0NFU1MgaXMgcmV0dXJuZWQuCiAqIAktIFwjZGVmaW5lIE1BWF9DQUxMQkFDS19JRFMgICAgMgogKgktIFwjZGVmaW5lIE1BWF9DQUxMQkFDS19TVUJJRFMgMTYKICoKICogQHNlZSBzbm1wX2NhbGxfY2FsbGJhY2tzCiAqIEBzZWUgc25tcF91bnJlZ2lzdGVyX2NhbGxiYWNrCiAqLwppbnQKc25tcF9yZWdpc3Rlcl9jYWxsYmFjayhpbnQgbWFqb3IsIGludCBtaW5vciwgU05NUENhbGxiYWNrICogbmV3X2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKewogICAgcmV0dXJuIG5ldHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soIG1ham9yLCBtaW5vciwgbmV3X2NhbGxiYWNrLCBhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9DQUxMQkFDS19ERUZBVUxUX1BSSU9SSVRZKTsKfQoKLyoqCiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSBtYWpvciAgICAgICAgTWFqb3IgY2FsbGJhY2sgZXZlbnQgdHlwZS4KICogQHBhcmFtIG1pbm9yICAgICAgICBNaW5vciBjYWxsYmFjayBldmVudCB0eXBlLgogKiBAcGFyYW0gbmV3X2NhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIGJlaW5nIHJlZ2lzdGVyZWQuCiAqIEBwYXJhbSBhcmcgICAgICAgICAgQXJndW1lbnQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCiAqIEBwYXJhbSBwcmlvcml0eSAgICAgSGFuZGxlciBpbnZvY2F0aW9uIHByaW9yaXR5LiBXaGVuIG11bHRpcGxlIGhhbmRsZXJzIGhhdmUKICogICBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBzYW1lIChtYWpvciwgbWlub3IpIGNhbGxiYWNrIGV2ZW50IHR5cGUsIGhhbmRsZXJzCiAqICAgd2l0aCB0aGUgbnVtZXJpY2FsbHkgbG93ZXN0IHByaW9yaXR5IHdpbGwgYmUgaW52b2tlZCBmaXJzdC4gSGFuZGxlcnMgd2l0aAogKiAgIGlkZW50aWNhbCBwcmlvcml0eSBhcmUgaW52b2tlZCBpbiB0aGUgb3JkZXIgdGhleSBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KICoKICogQHNlZSBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrCiAqLwppbnQKbmV0c25tcF9yZWdpc3Rlcl9jYWxsYmFjayhpbnQgbWFqb3IsIGludCBtaW5vciwgU05NUENhbGxiYWNrICogbmV3X2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywgaW50IHByaW9yaXR5KQp7CiAgICBzdHJ1Y3Qgc25tcF9nZW5fY2FsbGJhY2sgKm5ld3NjcCA9IE5VTEwsICpzY3AgPSBOVUxMOwogICAgc3RydWN0IHNubXBfZ2VuX2NhbGxiYWNrICoqcHJldk5leHQgPSAmKHRoZWNhbGxiYWNrc1ttYWpvcl1bbWlub3JdKTsKCiAgICBpZiAobWFqb3IgPj0gTUFYX0NBTExCQUNLX0lEUyB8fCBtaW5vciA+PSBNQVhfQ0FMTEJBQ0tfU1VCSURTKSB7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIGlmIChfY2FsbGJhY2tfbmVlZF9pbml0KQogICAgICAgIGluaXRfY2FsbGJhY2tzKCk7CgogICAgX2NhbGxiYWNrX2xvY2sobWFqb3IsbWlub3IsICJuZXRzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrIiwgMSk7CiAgICAKICAgIGlmICgobmV3c2NwID0gU05NUF9NQUxMT0NfU1RSVUNUKHNubXBfZ2VuX2NhbGxiYWNrKSkgPT0gTlVMTCkgewogICAgICAgIF9jYWxsYmFja191bmxvY2sobWFqb3IsbWlub3IpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0gZWxzZSB7CiAgICAgICAgbmV3c2NwLT5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgICAgIG5ld3NjcC0+c2NfY2xpZW50X2FyZyA9IGFyZzsKICAgICAgICBuZXdzY3AtPnNjX2NhbGxiYWNrID0gbmV3X2NhbGxiYWNrOwogICAgICAgIG5ld3NjcC0+bmV4dCA9IE5VTEw7CgogICAgICAgIGZvciAoc2NwID0gdGhlY2FsbGJhY2tzW21ham9yXVttaW5vcl07IHNjcCAhPSBOVUxMOwogICAgICAgICAgICAgc2NwID0gc2NwLT5uZXh0KSB7CiAgICAgICAgICAgIGlmIChuZXdzY3AtPnByaW9yaXR5IDwgc2NwLT5wcmlvcml0eSkgewogICAgICAgICAgICAgICAgbmV3c2NwLT5uZXh0ID0gc2NwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldk5leHQgPSAmKHNjcC0+bmV4dCk7CiAgICAgICAgfQoKICAgICAgICAqcHJldk5leHQgPSBuZXdzY3A7CgogICAgICAgIERFQlVHTVNHVEwoKCJjYWxsYmFjayIsICJyZWdpc3RlcmVkICglZCwlZCkgYXQgJXAgd2l0aCBwcmlvcml0eSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IsIG5ld3NjcCwgcHJpb3JpdHkpKTsKICAgICAgICBfY2FsbGJhY2tfdW5sb2NrKG1ham9yLG1pbm9yKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfQp9CgovKioKICogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBvZgogKiB0eXBlIG1ham9yIGFuZCBtaW5vci4KICoKICogQHBhcmFtIG1ham9yIGlzIHRoZSBTTk1QIGNhbGxiYWNrIG1ham9yIHR5cGUgdXNlZAogKgogKiBAcGFyYW0gbWlub3IgaXMgdGhlIFNOTVAgY2FsbGJhY2sgbWlub3IgdHlwZSB1c2VkCiAqCiAqIEBwYXJhbSBjYWxsZXJfYXJnIGlzIGEgdm9pZCBwb2ludGVyIHdoaWNoIGlzIHNlbnQgaW4gYXMgdGhlIGNhbGxiYWNrJ3MgCiAqCXNlcnZlcmFyZyBwYXJhbWV0ZXIsIGlmIG5lZWRlZC4KICoKICogQHJldHVybiBSZXR1cm5zIFNOTVBFUlJfR0VORVJSIGlmIG1ham9yIGlzID49IE1BWF9DQUxMQkFDS19JRFMgb3IKICogbWlub3IgaXMgPj0gTUFYX0NBTExCQUNLX1NVQklEUywgb3RoZXJ3aXNlIFNOTVBFUlJfU1VDQ0VTUyBpcyByZXR1cm5lZC4KICoKICogQHNlZSBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrCiAqIEBzZWUgc25tcF91bnJlZ2lzdGVyX2NhbGxiYWNrCiAqLwppbnQKc25tcF9jYWxsX2NhbGxiYWNrcyhpbnQgbWFqb3IsIGludCBtaW5vciwgdm9pZCAqY2FsbGVyX2FyZykKewogICAgc3RydWN0IHNubXBfZ2VuX2NhbGxiYWNrICpzY3A7CiAgICB1bnNpZ25lZCBpbnQgICAgY291bnQgPSAwOwogICAgCiAgICBpZiAobWFqb3IgPj0gTUFYX0NBTExCQUNLX0lEUyB8fCBtaW5vciA+PSBNQVhfQ0FMTEJBQ0tfU1VCSURTKSB7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQogICAgCiAgICBpZiAoX2NhbGxiYWNrX25lZWRfaW5pdCkKICAgICAgICBpbml0X2NhbGxiYWNrcygpOwoKI2lmZGVmIExPQ0tfUEVSX0NBTExCQUNLX1NVQklECiAgICBfY2FsbGJhY2tfbG9jayhtYWpvcixtaW5vciwic25tcF9jYWxsX2NhbGxiYWNrcyIsIDEpOwojZWxzZQogICAgLyoKICAgICAqIE5vdGVzOgogICAgICogLSB0aGlzIGdldHMgaGl0IHRoZSBmaXJzdCB0aW1lIGEgdHJhcCBpcyBzZW50IGFmdGVyIGEgbmV3IHRyYXAKICAgICAqICAgZGVzdGluYXRpb24gaGFzIGJlZW4gYWRkZWQgKHNlc3Npb24gaW5pdCBjYiBkdXJpbmcgc2VuZCB0cmFwIGNiKQogICAgICovCiAgICBfY2FsbGJhY2tfbG9jayhtYWpvcixtaW5vciwgTlVMTCwgMCk7CiNlbmRpZgoKICAgIERFQlVHTVNHVEwoKCJjYWxsYmFjayIsICJTVEFSVCBjYWxsaW5nIGNhbGxiYWNrcyBmb3IgbWFqPSVkIG1pbj0lZFxuIiwKICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vcikpOwoKICAgIC8qCiAgICAgKiBmb3IgZWFjaCByZWdpc3RlcmVkIGNhbGxiYWNrIG9mIHR5cGUgbWFqb3IgYW5kIG1pbm9yIAogICAgICovCiAgICBmb3IgKHNjcCA9IHRoZWNhbGxiYWNrc1ttYWpvcl1bbWlub3JdOyBzY3AgIT0gTlVMTDsgc2NwID0gc2NwLT5uZXh0KSB7CgogICAgICAgIC8qCiAgICAgICAgICogc2tpcCB1bnJlZ2lzdGVyZWQgY2FsbGJhY2tzCiAgICAgICAgICovCiAgICAgICAgaWYoTlVMTCA9PSBzY3AtPnNjX2NhbGxiYWNrKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgREVCVUdNU0dUTCgoImNhbGxiYWNrIiwgImNhbGxpbmcgYSBjYWxsYmFjayBmb3IgbWFqPSVkIG1pbj0lZFxuIiwKICAgICAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IpKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBjYWxsIHRoZW0gCiAgICAgICAgICovCiAgICAgICAgKCooc2NwLT5zY19jYWxsYmFjaykpIChtYWpvciwgbWlub3IsIGNhbGxlcl9hcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPnNjX2NsaWVudF9hcmcpOwogICAgICAgIGNvdW50Kys7CiAgICB9CgogICAgREVCVUdNU0dUTCgoImNhbGxiYWNrIiwKICAgICAgICAgICAgICAgICJFTkQgY2FsbGluZyBjYWxsYmFja3MgZm9yIG1haj0lZCBtaW49JWQgKCVkIGNhbGxlZClcbiIsCiAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IsIGNvdW50KSk7CgogICAgX2NhbGxiYWNrX3VubG9jayhtYWpvcixtaW5vcik7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMTEJBQ0tfQ09VTlQKaW50CnNubXBfY291bnRfY2FsbGJhY2tzKGludCBtYWpvciwgaW50IG1pbm9yKQp7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwogICAgc3RydWN0IHNubXBfZ2VuX2NhbGxiYWNrICpzY3A7CgogICAgaWYgKG1ham9yID49IE1BWF9DQUxMQkFDS19JRFMgfHwgbWlub3IgPj0gTUFYX0NBTExCQUNLX1NVQklEUykgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIAogICAgaWYgKF9jYWxsYmFja19uZWVkX2luaXQpCiAgICAgICAgaW5pdF9jYWxsYmFja3MoKTsKCiAgICBmb3IgKHNjcCA9IHRoZWNhbGxiYWNrc1ttYWpvcl1bbWlub3JdOyBzY3AgIT0gTlVMTDsgc2NwID0gc2NwLT5uZXh0KSB7CiAgICAgICAgY291bnQrKzsKICAgIH0KCiAgICByZXR1cm4gY291bnQ7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMTEJBQ0tfQ09VTlQgKi8KCmludApzbm1wX2NhbGxiYWNrX2F2YWlsYWJsZShpbnQgbWFqb3IsIGludCBtaW5vcikKewogICAgaWYgKG1ham9yID49IE1BWF9DQUxMQkFDS19JRFMgfHwgbWlub3IgPj0gTUFYX0NBTExCQUNLX1NVQklEUykgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIAogICAgaWYgKF9jYWxsYmFja19uZWVkX2luaXQpCiAgICAgICAgaW5pdF9jYWxsYmFja3MoKTsKCiAgICBpZiAodGhlY2FsbGJhY2tzW21ham9yXVttaW5vcl0gIT0gTlVMTCkgewogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwp9CgovKioKICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyBhIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiBnaXZlbiBhIG1ham9yCiAqIGFuZCBtaW5vciB0eXBlLgogKgogKiBOb3RlOiBubyBib3VuZCBjaGVja2luZyBvbiBtYWpvciBhbmQgbWlub3IuCiAqCiAqIEBwYXJhbSBtYWpvciBpcyB0aGUgU05NUCBjYWxsYmFjayBtYWpvciB0eXBlIHVzZWQKICoKICogQHBhcmFtIG1pbm9yIGlzIHRoZSBTTk1QIGNhbGxiYWNrIG1pbm9yIHR5cGUgdXNlZAogKgogKiBAcGFyYW0gdGFyZ2V0IGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdW5yZWdpc3RlcmVkLgogKgogKiBAcGFyYW0gYXJnIGlzIGEgdm9pZCBwb2ludGVyIHVzZWQgZm9yIGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgcmVnaXN0ZXJlZCAKICoJY2FsbGJhY2sncyBzY19jbGllbnRfYXJnIHZhcmlhYmxlLgogKgogKiBAcGFyYW0gbWF0Y2hhcmdzIGlzIGFuIGludGVnZXIgdXNlZCB0byBieXBhc3MgdGhlIGNvbXBhcmlzb24gb2YgYXJnIGFuZCB0aGUKICoJY2FsbGJhY2sncyBzY19jbGllbnRfYXJnIHZhcmlhYmxlIG9ubHkgd2hlbiBtYXRjaGFyZ3MgaXMgc2V0IHRvIDAuCiAqCiAqCiAqIEByZXR1cm4KICogICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjYWxsYmFja3MgdGhhdCB3ZXJlIHVucmVnaXN0ZXJlZC4KICoKICogQHNlZSBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrCiAqIEBzZWUgc25tcF9jYWxsX2NhbGxiYWNrcwogKi8KCmludApzbm1wX3VucmVnaXN0ZXJfY2FsbGJhY2soaW50IG1ham9yLCBpbnQgbWlub3IsIFNOTVBDYWxsYmFjayAqIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywgaW50IG1hdGNoYXJncykKewogICAgc3RydWN0IHNubXBfZ2VuX2NhbGxiYWNrICpzY3AgPSB0aGVjYWxsYmFja3NbbWFqb3JdW21pbm9yXTsKICAgIHN0cnVjdCBzbm1wX2dlbl9jYWxsYmFjayAqKnByZXZOZXh0ID0gJih0aGVjYWxsYmFja3NbbWFqb3JdW21pbm9yXSk7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwoKICAgIGlmIChtYWpvciA+PSBNQVhfQ0FMTEJBQ0tfSURTIHx8IG1pbm9yID49IE1BWF9DQUxMQkFDS19TVUJJRFMpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIGlmIChfY2FsbGJhY2tfbmVlZF9pbml0KQogICAgICAgIGluaXRfY2FsbGJhY2tzKCk7CgojaWZkZWYgTE9DS19QRVJfQ0FMTEJBQ0tfU1VCSUQKICAgIF9jYWxsYmFja19sb2NrKG1ham9yLG1pbm9yLCJzbm1wX3VucmVnaXN0ZXJfY2FsbGJhY2siLCAxKTsKI2Vsc2UKICAgIC8qCiAgICAgKiBOb3RlczsKICAgICAqIC0gdGhpcyBnZXRzIGhpdCBhdCBzaHV0ZG93biwgZHVyaW5nIGNsZWFudXAuIE5vIGVhc3kgZml4LgogICAgICovCiAgICBfY2FsbGJhY2tfbG9jayhtYWpvcixtaW5vciwic25tcF91bnJlZ2lzdGVyX2NhbGxiYWNrIiwgMCk7CiNlbmRpZgoKICAgIHdoaWxlIChzY3AgIT0gTlVMTCkgewogICAgICAgIGlmICgoc2NwLT5zY19jYWxsYmFjayA9PSB0YXJnZXQpICYmCiAgICAgICAgICAgICghbWF0Y2hhcmdzIHx8IChzY3AtPnNjX2NsaWVudF9hcmcgPT0gYXJnKSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImNhbGxiYWNrIiwgInVucmVnaXN0ZXJpbmcgKCVkLCVkKSBhdCAlcFxuIiwgbWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yLCBzY3ApKTsKICAgICAgICAgICAgaWYoMSA9PSBDQUxMQkFDS19MT0NLX0NPVU5UKG1ham9yLG1pbm9yKSkgewogICAgICAgICAgICAgICAgKnByZXZOZXh0ID0gc2NwLT5uZXh0OwogICAgICAgICAgICAgICAgU05NUF9GUkVFKHNjcCk7CiAgICAgICAgICAgICAgICBzY3AgPSAqcHJldk5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzY3AtPnNjX2NhbGxiYWNrID0gTlVMTDsKICAgICAgICAgICAgICAgIC8qKiBzZXQgY2xlYW51cCBmbGFnPyAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJldk5leHQgPSAmKHNjcC0+bmV4dCk7CiAgICAgICAgICAgIHNjcCA9IHNjcC0+bmV4dDsKICAgICAgICB9CiAgICB9CgogICAgX2NhbGxiYWNrX3VubG9jayhtYWpvcixtaW5vcik7CiAgICByZXR1cm4gY291bnQ7Cn0KCi8qKgogKiBmaW5kIGFuZCBjbGVhciBjbGllbnQgYXJncyB0aGF0IG1hdGNoIHB0cgogKgogKiBAcGFyYW0gcHRyICBwb2ludGVyIHRvIHNlYXJjaCBmb3IKICogQHBhcmFtIGkgICAgY2FsbGJhY2sgaWQgdG8gc3RhcnQgYXQKICogQHBhcmFtIGogICAgY2FsbGJhY2sgc3ViaWQgdG8gc3RhcnQgYXQKICovCmludApuZXRzbm1wX2NhbGxiYWNrX2NsZWFyX2NsaWVudF9hcmcodm9pZCAqcHRyLCBpbnQgaSwgaW50IGopCnsKICAgIHN0cnVjdCBzbm1wX2dlbl9jYWxsYmFjayAqc2NwID0gTlVMTDsKICAgIGludCByYyA9IDA7CgogICAgLyoKICAgICAqIGRvbid0IGluaXQgaSBhbmQgaiBiZWZvcmUgbG9vcCwgc2luY2UgdGhlIGNhbGxlciBzcGVjaWZpZWQKICAgICAqIHRoZSBzdGFydGluZyBwb2ludCBleHBsaWNpdGx5LiBCdXQgKmFmdGVyKiB0aGUgaSBsb29wIGhhcwogICAgICogZmluaXNoZWQgZXhlY3V0aW5nIG9uY2UsIGluaXQgaiB0byAwIGZvciB0aGUgbmV4dCBwYXNzCiAgICAgKiB0aHJvdWdoIHRoZSBzdWJpZHMuCiAgICAgKi8KICAgIGZvciAoOyBpIDwgTUFYX0NBTExCQUNLX0lEUzsgaSsrLGo9MCkgewogICAgICAgIGZvciAoOyBqIDwgTUFYX0NBTExCQUNLX1NVQklEUzsgaisrKSB7CiAgICAgICAgICAgIHNjcCA9IHRoZWNhbGxiYWNrc1tpXVtqXTsgCiAgICAgICAgICAgIHdoaWxlIChzY3AgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IHNjcC0+c2NfY2FsbGJhY2spICYmCiAgICAgICAgICAgICAgICAgICAgKHNjcC0+c2NfY2xpZW50X2FyZyAhPSBOVUxMKSAmJgogICAgICAgICAgICAgICAgICAgIChzY3AtPnNjX2NsaWVudF9hcmcgPT0gcHRyKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCI5OmNhbGxiYWNrIiwgIiAgY2xlYXJpbmcgJXAgYXQgWyVkLCVkXVxuIiwgcHRyLCBpLCBqKSk7CiAgICAgICAgICAgICAgICAgICAgc2NwLT5zY19jbGllbnRfYXJnID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICArK3JjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2NwID0gc2NwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgwICE9IHJjKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImNhbGxiYWNrIiwgInJlbW92ZWQgJWQgY2xpZW50IGFyZ3NcbiIsIHJjKSk7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9Cgp2b2lkCmNsZWFyX2NhbGxiYWNrKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBpID0gMCwgaiA9IDA7CiAgICBzdHJ1Y3Qgc25tcF9nZW5fY2FsbGJhY2sgKnNjcCA9IE5VTEw7CgogICAgaWYgKF9jYWxsYmFja19uZWVkX2luaXQpCiAgICAgICAgaW5pdF9jYWxsYmFja3MoKTsKCiAgICBERUJVR01TR1RMKCgiY2FsbGJhY2siLCAiY2xlYXIgY2FsbGJhY2tcbiIpKTsKICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0FMTEJBQ0tfSURTOyBpKyspIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0NBTExCQUNLX1NVQklEUzsgaisrKSB7CiAgICAgICAgICAgIF9jYWxsYmFja19sb2NrKGksaiwgImNsZWFyX2NhbGxiYWNrIiwgMSk7CiAgICAgICAgICAgIHNjcCA9IHRoZWNhbGxiYWNrc1tpXVtqXTsKICAgICAgICAgICAgd2hpbGUgKHNjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB0aGVjYWxsYmFja3NbaV1bal0gPSBzY3AtPm5leHQ7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYSBjbGllbnQgYXJnLCBjaGVjayBmb3IgZHVwbGljYXRlcwogICAgICAgICAgICAgICAgICogYW5kIHRoZW4gZnJlZSBpdC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IHNjcC0+c2NfY2FsbGJhY2spICYmCiAgICAgICAgICAgICAgICAgICAgKHNjcC0+c2NfY2xpZW50X2FyZyAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgIHZvaWQgKnRtcF9hcmc7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBzYXZlIHRoZSBjbGllbnQgYXJnLCB0aGVuIHNldCBpdCB0byBudWxsIHNvIHRoYXQgaXQKICAgICAgICAgICAgICAgICAgICAgKiB3b24ndCBsb29rIGxpa2UgYSBkdXBsaWNhdGUsIHRoZW4gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKICAgICAgICAgICAgICAgICAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBpLGogKGVhcmxpZXIgZHVwcyBzaG91bGQgaGF2ZQogICAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgYmVlbiBmb3VuZCkgYW5kIGZyZWUgdGhlIHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdG1wX2FyZyA9IHNjcC0+c2NfY2xpZW50X2FyZzsKICAgICAgICAgICAgICAgICAgICBzY3AtPnNjX2NsaWVudF9hcmcgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCI5OmNhbGxiYWNrIiwgIiAgZnJlZWluZyAlcCBhdCBbJWQsJWRdXG4iLCB0bXBfYXJnLCBpLCBqKSk7CiAgICAgICAgICAgICAgICAgICAgKHZvaWQpbmV0c25tcF9jYWxsYmFja19jbGVhcl9jbGllbnRfYXJnKHRtcF9hcmcsIGksIGopOwogICAgICAgICAgICAgICAgICAgIGZyZWUodG1wX2FyZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoc2NwKTsKICAgICAgICAgICAgICAgIHNjcCA9IHRoZWNhbGxiYWNrc1tpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY2FsbGJhY2tfdW5sb2NrKGksaik7CiAgICAgICAgfQogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMTEJBQ0tfTElTVApzdHJ1Y3Qgc25tcF9nZW5fY2FsbGJhY2sgKgpzbm1wX2NhbGxiYWNrX2xpc3QoaW50IG1ham9yLCBpbnQgbWlub3IpCnsKICAgIGlmIChfY2FsbGJhY2tfbmVlZF9pbml0KQogICAgICAgIGluaXRfY2FsbGJhY2tzKCk7CgogICAgcmV0dXJuICh0aGVjYWxsYmFja3NbbWFqb3JdW21pbm9yXSk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMTEJBQ0tfTElTVCAqLwovKiogIEB9ICovCg==