Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyB0aGluZy9jb21tYW5kcy5jIC0tIHRoaW5nIGRlc2NyaXB0aW9uCi8vCi8vICRJZDogY29tbWFuZHMuYyA5NTE0IDIwMTYtMDItMjMgMjA6MzM6MDlaIEdsb2luc29uICQKLy8KLy8gQXVzIFJlZ2VuYm9nZW4gTVVETGliCi8vIGF1cyBHdWVsZGVubGFuZC9XdW5kZXJsYW5kIE1VRGxpYiAoTW9yZ2VuZ3JhdWVuIE1VRGxpYikKLy8KLy8gUF9DT01NQU5EUyBkYXRhLXN0cnVjdHVyZToKLy8KLy8gQWRkQ21kKHZlcmIsZnVuMSwxKTsKLy8gQWRkQ21kKHZlcmIrc3luMWF8c3luMWImc3luMmF8c3luMmJ8c3luMmMsZnVuMiwKLy8JICAgZXJyb3IxX25vdGlmeXxlcnJvcjJfbm90aWZ5XmVycm9yMl93cml0ZSk7Ci8vIC0tPgovLyAoW3ZlcmI6KHtmdW4xLGZ1bjJ9KTsJCQkJCS8vIGZ1bnMKLy8JICAoezEsKHtlcnJvcjFfbm90aWZ5LCBlcnJvcjJfd3JpdGVeZXJyb3IyX3NheSwgMX0pfSk7ICAvLyBmbGFncwovLyAgICAgICAgKHswLCh7KHtzeW4xYSxzeW4xYn0pLCh7c3luMmEsc3luMmIsc3luMmN9KX0pfSk7CS8vIHJ1bGVzCi8vICAgICAgICAwXSkJCQkJCQkJLy8gSURzCi8vCi8vIFJ1bGVzOiAoezxSZWdlbHNhdHogZnVlciBmdW4xPiwgKHs8MS4gU3lub255bWdydXBwZT4sCi8vCQkJCSAgICAgPDIuIFN5bm9ueW1ncnVwcGUsIC4uLn0pLCAuLi59KQovLyBGbGFnczogKHs8RmxhZyBmdWVyIGZ1bjE+LCAoezxGZWhsZXJtZWxkdW5nIDEuIFN5bm9ueW1ncnVwcGU+LCAuLi4gLAovLwkJCQlbLCBJbmRleCBmdWVyIHdyaXRlIGFuc3RhdHQgbm90aWZ5X2ZhaWxdfSksCi8vCSAgICAuLi4gfSkKLy8gSURzOiAgIDAgb2RlciAoezxJRCBmdWVyIGZ1bjE+fSkgb2RlciAoezAsIDxJRCBmdWVyIGZ1bjI+fSkgLi4uCi8vCi8vIElERUE6IHNhdmUgbm8gMHMgaW4gcnVsZXMvZmxhZ3MgaWYgcG9zc2libGUgKGFzIGluIElEcykKLy8gICAgICAgKGFkcmVzc2luZyBlc3BlY2lhbGx5IG9sZC1zdHlsZS1BZGRDbWQtTVVEcykKI3ByYWdtYSBzdHJpY3RfdHlwZXMKI3ByYWdtYSBzYXZlX3R5cGVzCiNwcmFnbWEgcmFuZ2VfY2hlY2sKI3ByYWdtYSBub19jbG9uZQojcHJhZ21hIHBlZGFudGljCgojaW5jbHVkZSA8bW92aW5nLmg+CiNpbmNsdWRlIDx0aGluZy9sYW5ndWFnZS5oPgojaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KI2luY2x1ZGUgPGRlZmluZXMuaD4KI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CgojZGVmaW5lIE5FRURfUFJPVE9UWVBFUwojaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgojaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KI2luY2x1ZGUgPHRoaW5nL2NvbW1hbmRzLmg+CiN1bmRlZiBORUVEX1BST1RPVFlQRVMKCiNpZmRlZiBEQkcKI3VuZGVmIERCRwojZW5kaWYKI2RlZmluZSBEQkcoeCkgcHJpbnRmKCJPYmplY3QgJU8gdG1wc3RyPSVzXG4iLCBleHBsb2RlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCIjIilbMV0sIHgpOwoKcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhZGRlZF9jbWRzOwoKcHJvdGVjdGVkIGludCBfY21kX3N5bnRheGhlbHAoc3RyaW5nIHN0ciwgc3RyaW5nICphcmdzKQp7CiAgbWFwcGluZ3xjbG9zdXJlIHJlc3RyOwogIG1peGVkIGhlbHAgPSBRdWVyeVByb3AoUF9TWU5UQVhfSEVMUCk7CiAgaWYgKHBvaW50ZXJwKGhlbHApKQogIHsKICAgIHJlc3RyID0gaGVscFsxXTsKICAgIGhlbHAgPSBoZWxwWzBdOwogIH0KICAvLyBSZXN0cmlrdGlvbmVuIHZvciBkZW0gQW56ZWlnZW4gcHJ1ZWZlbi4KICBpZiAobWFwcGluZ3AocmVzdHIpKQogIHsKICAgIHN0cmluZyByZXMgPSAiL3N0ZC9yZXN0cmljdGlvbl9jaGVja2VyIi0+Y2hlY2tfcmVzdHJpY3Rpb25zKFBMLHJlc3RyKTsKICAgIGlmIChyZXMpCiAgICB7CiAgICAgIFBMLT5SZWNlaXZlTXNnKCJGdWVyICIgKyBuYW1lKFdFTiwxKSArICIgZGFyZnN0IER1ICIKICAgICAgICAgICAgICAgICAgICAgImRpZSBTeW50YXhoaWxmZSAobm9jaCkgbmljaHQgbGVzZW46XG4iCiAgICAgICAgICAgICAgICAgICAgICsgcmVzLAogICAgICAgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0JTX0xFQVZFX0xGUywKICAgICAgICAgICAgICAgICAgICAgInN5bnRheGhpbGZlIiwwLHRoaXNfb2JqZWN0KCkpOwogICAgICByZXR1cm4gMTsKICAgIH0KICB9CiAgZWxzZSBpZiAoY2xvc3VyZXAocmVzdHIpKQogIHsKICAgIHN0cmluZyByZXMgPSBmdW5jYWxsKHJlc3RyLCBNRSk7CiAgICBpZiAocmVzKQogICAgewogICAgICBpZiAoaW50cChyZXMpKQogICAgICAgIFBMLT5SZWNlaXZlTXNnKCJGdWVyICIgKyBuYW1lKFdFTiwxKSArICIgZGFyZnN0IER1ICIKICAgICAgICAgICAgICAgICAgICAgICAiZGllIFN5bnRheGhpbGZlIChub2NoKSBuaWNodCBsZXNlbi4iLAogICAgICAgICAgICAgICAgICAgICAgIE1UX05PVElGSUNBVElPTnxNU0dfQlNfTEVBVkVfTEZTLAogICAgICAgICAgICAgICAgICAgICAgICJzeW50YXhoaWxmZSIsMCx0aGlzX29iamVjdCgpKTsKICAgICAgZWxzZSBpZiAoc3RyaW5ncChyZXMpKQogICAgICAgIFBMLT5SZWNlaXZlTXNnKHJlcywKICAgICAgICAgICAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0JTX0xFQVZFX0xGUywKICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4aGlsZmUiLDAsdGhpc19vYmplY3QoKSk7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgaWYgKHN0cmluZ3AoaGVscCkpCiAgewogICAgaGVscCA9ICJGdWVyICIgKyBuYW1lKFdFTiwxKSArICIgZ2lidCBlcyBmb2xnZW5kZSBTeW50YXhoaWxmZTpcbiIKICAgICAgICAgICArIGhlbHA7CiAgfQogIGVsc2UgaWYgKGNsb3N1cmVwKGhlbHApKQogIHsKICAgIGhlbHAgPSBmdW5jYWxsKGhlbHAsIHRoaXNfb2JqZWN0KCkpOwogIH0KICBlbHNlCiAgewogICAgLy8gd2VubiBkYXMgT2JqZWt0IGtlaW5lIFN5bnRheGhpbGZlIGhhdCwgYnJhdWNodCBlcyBkYXMgS29tbWFuZG8gYXVjaAogICAgLy8gbmljaHQuCiAgICBub3RpZnlfZmFpbCgiRnVlciAiICsgbmFtZShXRU4sMSkKICAgICAgICAgICAgICAgICsgIiBnaWJ0IGVzIGtlaW5lIFN5bnRheGhpbGZlLlxuIik7CiAgICBSZW1vdmVDbWQoMCwwLCAiX2NtZF9zeW50YXhoZWxwIik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHN0cmluZ3AoaGVscCkgJiYgc2l6ZW9mKGhlbHApKQogICAgUEwtPlJlY2VpdmVNc2coaGVscCwgTVRfTk9USUZJQ0FUSU9OfE1TR19CU19MRUFWRV9MRlMsCiAgICAgICAgICAgICAgICAgICAic3ludGF4aGlsZmUiLDAsdGhpc19vYmplY3QoKSk7CgogIHJldHVybiAxOwp9Cgpwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQp7CiAgQWRkQ21kKCJzeW50YXhoaWxmZSZASUQiLCAjJ19jbWRfc3ludGF4aGVscCwKICAgICAgICAgIkZ1ZXIgV0FTIG1vZWNodGVzdCBEdSBlaW5lIFN5bnRheGhpbGZlP1xuIiwKICAgICAgICAgIl9jbWRfc3ludGF4aGVscCIpOwp9Cgpwcm90ZWN0ZWQgdm9pZCBjcmVhdGVfc3VwZXIoKSB7CiAgc2V0X25leHRfcmVzZXQoLTEpOwp9Cgp2YXJhcmdzIHZvaWQgQWRkQ21kKG1peGVkIGNtZCwgbWl4ZWQgZnVuYywgbWl4ZWQgZmxhZywgbWl4ZWQgY21kaWQpIHsKIGludCBpLGo7CiBjbG9zdXJlIGNsOwogbWl4ZWQgKnJ1bGU7CgogLy8gcG90ZW50aWVsbGUgQWRkQ21kIG1pdCBSZWdlbD8KIGlmKHN0cmluZ3AoY21kKSkgewogIC8vIGVpbmUgUmVnZWw/IC0gYXVmc3BsaXR0ZW4KICBpZigoaT1tZW1iZXIoY21kLCcmJykpPjApIHsKICAgLy8gLi4uIGluIEFycmF5IG1pdCBWZXJrbnVlcGZ1bmdzZWxlbWVudGVuCiAgIHJ1bGU9ZXhwbG9kZShjbWRbKGkrMSkuLl0sIiYiKTsKICAgaj1zaXplb2YocnVsZSk7CiAgIC8vIC4uLiBpbiBBcnJheSBtaXQgQXJyYXlzIG1pdCBBbHRlcm5hdGl2ZWxlbWVudGVuOgogICAvLyAicHxxJnJ8cyIgLT4gKHsgKHsicCIsInEifSksICh7InIiLCJzIn19IH0pCiAgIHdoaWxlKGotLSkKICAgIHJ1bGVbal09ZXhwbG9kZShydWxlW2pdLCJ8Iik7CgogICAvLyBSZWdlbG4gdm9uIEtvbW1hbmRvdmVyYmVuIGFic2NobmVpZGVuCiAgIGNtZD1jbWRbMC4uKGktMSldOwogIH0KICAvLyBLb21tYW5kb3ZlcmJlbiBleHRyYWhpZXJlbgogIGNtZD1leHBsb2RlKGNtZCwifCIpOwoKICAvLyBTYXR6IHZvbiBSZWdlbG4gZXhpc3RpZXJ0OiBBdWZzcGxpdHRlbiB2b24gRmVobGVybWVsZHVuZ2VuCiAgaWYocnVsZSkKICAgaWYoc3RyaW5ncChmbGFnKSkgewogICAgbWl4ZWQgKmZhaWw7CiAgICAvLyBpbiBlaW5mYWNoZXMgQXJyYXkgbWl0IGpld2VpbGlnZW4gRmVobGVybWVsZHVuZ2VuCiAgICBmYWlsPWV4cGxvZGUoZmxhZywifCIpOwogICAgaj0wOwogICAgaT1zaXplb2YoZmFpbCk7CiAgICB3aGlsZShqPGkpIHsKICAgICAvLyB3cml0ZSAtIEZlaGxlcm1lbGR1bmcgZW50ZGVja3QgLSBQb3NpdGlvbiBnZ2YuIGVpbnRyYWdlbgogICAgIGlmKG1lbWJlcihmYWlsW2pdLCdeJyk+PTAgJiYgIWludHAoZmFpbFs8MV0pKQogICAgICBmYWlsKz0oe2p9KTsKICAgICBpZihtZW1iZXIoZmFpbFtqXSwnQCcpPj0wKSB7CiAgICAgIGludCBzOwogICAgICBmbGFnPXJlZ2V4cGxvZGUoZmFpbFtqXSwgIkBXRVtBLVNVXSpbMC05XSIpOwogICAgICBzPXNpemVvZihmbGFnKTsKICAgICAgd2hpbGUoKHMtPTIpPjApIHsKICAgICAgIGludCB0bXBpbnQ7CiAgICAgICB0bXBpbnQ9ZmxhZ1tzXVs8MV0tJzEnOwogICAgICAgaWYodG1waW50PDAgfHwgdG1waW50PmopCiAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKICAgICAgICAgIkFkZENtZDogZXJyb3ItbWVzc2FnZSAlZCBjb250YWlucyBvdXQtb2YtYm91bmRzIEBXRXh4LXJ1bGUuXG4iLGorMSkpOwogICAgICB9CiAgICAgfQogICAgIGorKzsKICAgIH0KICAgIC8vICJXYXM/fFdpZSBkYXM/IiAtPiAoeyJXYXM/IiwiV2llIGRhcz8ifSkKICAgIC8vICJXYXM/fFdpZSBkYXM/XnxXb21pdCBkYXM/fFdvcmF1ZiBkYXM/XkBXRVIxIG1hY2h0IHdhcy4iIC0+CiAgICAvLyAgKHsiV2FzPyIsCiAgICAvLyAgICAiV2llIGRhcz9eV29taXQgZGFzPyIsCiAgICAvLwkgICJXb3JhdWYgZGFzP15AV0VSMSBtYWNodCB3YXMuIiwxfSkKICAgIGZsYWc9c2l6ZW9mKGZhaWwpOwogICAgaWYoZmxhZyAmJiBmbGFnPHNpemVvZihydWxlKSkKICAgICByYWlzZV9lcnJvcigKICAgICAgIkFkZENtZDogbnVtYmVyIG9mIGVycm9yLW1lc3NhZ2VzIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZiBydWxlcy5cbiIpOwogICAgZmxhZz1mYWlsOyAvLyB1ZWJlcnNjaHJlaWJlbiBtaXQgZGVuIHBhcnNlZnJldW5kbGljaGVuIEZvcm1hdAogIH0gZWxzZSBpZihmbGFnKQogICByYWlzZV9lcnJvcigiQWRkQ21kOiBydWxlcyBleGlzdCBidXQgZmxhZ3MgYXJlIG5vdCBhbiBlcnJvci1zdHJpbmcuXG4iKTsKIH0gLy8gZW5kIGlmKHN0cmluZ3AoY21kKSkgLi4uIGtlaW4gUmVnZWxzdHJpbmcgdm9yaGFuZGVuCgogLy8ga2VpbiBLb21tYW5kb2FycmF5IGdld2VzZW4gbm9jaCBlcnpldWd0PwogaWYoIXBvaW50ZXJwKGNtZCkpCiAgIHJhaXNlX2Vycm9yKCJBZGRDbWQ6IG1pc3Npbmcgc3RyaW5nL3BvaW50ZXItcGFyYW1ldGVyIGZvciBjb21tYW5kLlxuIik7CgogLy8gQ2xvc3VyZSBhdXMgZWluZW0gU3RyaW5nIGVyemV1Z2VuLCB3ZW5uIG1vZWdsaWNoIHVuZCBzaWNoZXIKIC8vIChmdW5jdGlvbl9leGlzdHMoKSBmaWx0ZXJ0IHVubm9ldGlnZXJ3ZWlzZSBhdWNoIHJlaW5lICJzdGF0aWMiIGZ1bnMsCiAvLyAgZGllIGdlbmF1ZSBQcnVlZnVuZyB1ZWJlciBmdW5jdGlvbmxpc3QoKSBrb3N0ZXQgamVkb2NoIHp1dmllbCkKIGlmKHN0cmluZ3AoZnVuYykgJiYKICAgICghZXh0ZXJuX2NhbGwoKSB8fCBmdW5jdGlvbl9leGlzdHMoZnVuYyx0aGlzX29iamVjdCgpKSkgJiYKICAgIGNsb3N1cmVwKGNsPXN5bWJvbF9mdW5jdGlvbihmdW5jLHRoaXNfb2JqZWN0KCkpKSkKICBmdW5jPWNsOwoKIC8vIGplZGVzIGVpbnplbG5lIFZlcmIgbWl0IHNlaW5lbiBSZWdlbG4gdW5kIEZ1bmt0aW9uZW4gZWludHJhZ2VuCiBpPXNpemVvZihjbWQpOwogaWYoIWFkZGVkX2NtZHMpIGFkZGVkX2NtZHM9bV9hbGxvY2F0ZShpLDQpOwogd2hpbGUoaS0tKSB7CiAgc3RyaW5nIHN0cjsKICBzdHI9Y21kW2ldOwogIGlmKCFmdW5jKQogICBpZihleHRlcm5fY2FsbCgpKSBmdW5jPXByZXZpb3VzX29iamVjdCgpOwogICBlbHNlIGZ1bmM9dGhpc19vYmplY3QoKTsKICBpZighbWVtYmVyKGFkZGVkX2NtZHMsc3RyKSkKICAgYWRkZWRfY21kcys9KFtzdHI6YWxsb2NhdGUoMCk7YWxsb2NhdGUoMCk7YWxsb2NhdGUoMCk7MF0pOwogIC8vIGV4aXN0aWVyZW5kZXMgVmVyYiBlcmdhZW56ZW4KICBhZGRlZF9jbWRzW3N0ciwwXSs9KHtmdW5jfSk7CiAgYWRkZWRfY21kc1tzdHIsMV0rPSh7ZmxhZ30pOwogIGFkZGVkX2NtZHNbc3RyLDJdKz0oe3J1bGV9KTsKICAvLyBnZ2YuIGlkIGluIGRhcyBJRC1NYXBwaW5nIGVpbnRyYWdlbgogIGlmKGNtZGlkKSB7CiAgIG1peGVkICp0bXA7CiAgIGo9c2l6ZW9mKChzdHJpbmcqKWFkZGVkX2NtZHNbc3RyLDBdKTsKICAgdG1wPWFkZGVkX2NtZHNbc3RyLDNdfHxhbGxvY2F0ZShqKTsKICAgaWYoc2l6ZW9mKHRtcCk8aikgdG1wKz1hbGxvY2F0ZShqLXNpemVvZih0bXApKTsKICAgdG1wWzwxXT1jbWRpZDsKICAgYWRkZWRfY21kc1tzdHIsM109dG1wOwogIH0KIH0KfQoKLy8gQXVzd2VydHVuZyBmdWVyIGVpbiBWZXJiIGxvZXNjaGVuCnZhcmFyZ3MgaW50IFJlbW92ZUNtZChtaXhlZCBjbWQsIGludCBkZWxfbm9ydWxlLCBtaXhlZCBvbmx5aWQpIHsKIGludCByZXQ7CgogLy8gRmFsbHMgTWFnaWVyIGRhcyBSZW1vdmVDbWQgZmFsc2NoIG51dHplbiAoei5CLiBhbmFsb2cgenUgQWRkQ21kKQogLy8gd2lyZCBkYXMgUmVnZWxzeXN0ZW0gdmVyd2lycnQuIERhIGRhcyBkZWxfbm9ydWxlIG51ciBpbnQgc2VpbiBkYXJmLAogLy8gZ2lidCBlcyBoaWVyIGVpbmUgZ3V0ZSBDaGFuY2UgZGVuIEZlaGxlciBhYndhZXJ0c2tvbXBhdGliZWwgenUgZW50LQogLy8gZGVja2VuLiBEYW1pdCBTcGllbGVyIGRlbiBGZWhsZXIgbmljaHQgbWl0YmVrb21tZW4sIHdpcmQgaGllciBhdWYKIC8vIGVpbiByYWlzZV9lcnJvciB2ZXJ6aWNodGV0LCB1bmQgc3RhdHQgZGVzc2VuIGluIGVpbiBMb2dmaWxlIGdlLQogLy8gc2NocmllYmVuLgogaWYgKCFpbnRwKGRlbF9ub3J1bGUpKQogewogICBsb2dfZmlsZSgiUkVNT1ZFX0NNRCIsCiAgICAgc3ByaW50ZigiXG4tLSAlcyAtLVxuSWxsZWdhbCBSZW1vdmVDb21tYW5kKCkgaW4gT2JqZWN0IFslT106XG4gJU9cbiIsCiAgICAgICBkdGltZSh0aW1lKCkpLCB0aGlzX29iamVjdCgpLCBjbWQpKTsKICAgZGVsX25vcnVsZT0wOwogICBvbmx5aWQ9MDsKIH0KIAogaWYoIWFkZGVkX2NtZHMgfHwgKCFjbWQgJiYgIWRlbF9ub3J1bGUgJiYgIW9ubHlpZCkpCiAgYWRkZWRfY21kcz0obWFwcGluZykwOyAKIGVsc2UgewogIGludCBpLCBqOwogIG1peGVkICpydWxlLCAqZmxhZywgKmZ1biwgKmRlbHJ1bGUsICppZHM7CgogIGlmKHN0cmluZ3AoY21kKSkgewogICAvLyBSZWdlbG4gZW50ZGVja3QgLSBaZXJsZWdlbiAod2llIEFkZENtZCkKICAgaWYoKGk9bWVtYmVyKGNtZCwnJicpKT4wKSB7CiAgICBkZWxydWxlPWV4cGxvZGUoY21kWyhpKzEpLi5dLCImIik7CiAgICBqPXNpemVvZihkZWxydWxlKTsKICAgIHdoaWxlKGotLSkKICAgICBkZWxydWxlW2pdPWV4cGxvZGUoZGVscnVsZVtqXSwifCIpOwogICAgY21kPWNtZFswLi4oaS0xKV07CiAgIH0KICAgY21kPWV4cGxvZGUoY21kLCJ8Iik7CiAgfSBlbHNlIGlmKGRlbF9ub3J1bGUgfHwgb25seWlkKSBjbWQ9bV9pbmRpY2VzKGFkZGVkX2NtZHMpOwoKICBpZighcG9pbnRlcnAoY21kKSkKICAgcmFpc2VfZXJyb3IoIlJlbW92ZUNtZDogbWlzc2luZyBzdHJpbmcvcG9pbnRlci1wYXJhbWV0ZXIuXG4iKTsKICBpPXNpemVvZihjbWQpOwoKICB3aGlsZShpLS0pIHsKICAgLy8ga2VpbmUgUmVnZWxuIGRhIHVuZCBSZWdlbG4gbG9lc2NoZW4gZXJsYXVidDogYWxsZXMgbG9lc2NoZW4KICAgaWYoIWRlbHJ1bGUgJiYgIWRlbF9ub3J1bGUgJiYgIW9ubHlpZCkgbV9kZWxldGUoYWRkZWRfY21kcyxjbWRbaV0pOwogICBlbHNlIGlmKG1fY29udGFpbnMoJmZ1biwgJmZsYWcsICZydWxlLCAmaWRzLCBhZGRlZF9jbWRzLCBjbWRbaV0pKSB7CiAgICBqPXNpemVvZihmdW4pOwogICAgd2hpbGUoai0tKSB7CiAgICAgaW50IGs7CiAgICAgLy8gREJHKHJ1bGVbal0pOwogICAgCS8vIFJlZ2VsbiBuaWNodCBs9nNjaGVuIHVuZCBSZWdlbD8KICAgICBpZighKGRlbF9ub3J1bGUgJiYgcG9pbnRlcnAocnVsZVtqXSkpICYmCiAgICAgICAgLy8gbnVyIGJlc3RpbW10ZSBJRCBs9nNjaGVuIHVuZCBJRCBwYXNzdCBuaWNodD8KICAgICAgICAhKG9ubHlpZCAmJiAoIXBvaW50ZXJwKGlkcykgfHwgc2l6ZW9mKGlkcyk8PWogfHwgaWRzW2pdIT1vbmx5aWQpKSAmJgogICAgICAgIC8vIEz2c2NocmVnZWwgZXhpc3RpZXJ0IHVuZCBwYXNzdCBuaWNodCBhdWYgUmVnZWw/CiAgICAgICAgIShkZWxydWxlICYmIChrPXNpemVvZihydWxlW2pdKSkhPXNpemVvZihkZWxydWxlKSkpIHsKICAgICAgLy8gcGFydGllbGxlcyBUZXN0ZW4gZWluZXIgTPZzY2hyZWdlbCAuLi4KICAgICAgaWYoZGVscnVsZSkgewogICAgICAgd2hpbGUoay0tKQogICAgICAgIGlmKCFzaXplb2YocnVsZVtqXVtrXSZkZWxydWxlW2tdKSkgYnJlYWs7CiAgICAgICBpZihrPj0wKSBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBhbGxlcyBrb3JyZWt0OiBM9nNjaGVuIQogICAgICAvLyAoQXJyYXliZXJlaWNoIGR1cmNoIGxlZXJlcyBBcnJheSBsb2VzY2hlbikKICAgICAgZmxhZ1tqLi5qXSAgPSBhbGxvY2F0ZSgwKTsKICAgICAgZnVuW2ouLmpdICAgPSBhbGxvY2F0ZSgwKTsKICAgICAgcnVsZVtqLi5qXSAgPSBhbGxvY2F0ZSgwKTsKICAgICAgaWYoaWRzKSB7CiAgICAgICBpZHNbai4ual0gPSBhbGxvY2F0ZSgwKTsKICAgICAgIGlmKCFzaXplb2YoaWRzLWFsbG9jYXRlKDEpKSkgaWRzPShtaXhlZCopMDsKICAgICAgfQogICAgICByZXQrKzsKICAgICB9CiAgICB9IC8vIGVuZCB3aGlsZShqLS0pIHsKICAgfQogICAvLyBGdW5rdGlvbnMvUmVnZWxsaXN0ZSB1cGRhdGUgb2RlciBnZ2YuIEtvbW1hbmRvIHZvZWxsaWcgbG9lc2NoZW4KICAgaWYoc2l6ZW9mKHJ1bGUpKSB7CiAgICBhZGRlZF9jbWRzW2NtZFtpXSwwXT1mdW47CiAgICBhZGRlZF9jbWRzW2NtZFtpXSwxXT1mbGFnOwogICAgYWRkZWRfY21kc1tjbWRbaV0sMl09cnVsZTsKICAgIGFkZGVkX2NtZHNbY21kW2ldLDNdPWlkczsKICAgfSBlbHNlIG1fZGVsZXRlKGFkZGVkX2NtZHMsY21kW2ldKTsKICB9CiAgaWYoIXNpemVvZihhZGRlZF9jbWRzKSkgYWRkZWRfY21kcz0obWFwcGluZykwOwogfQogcmV0dXJuIHJldDsKfQoKLy8gQXVzZnVlaHJlbiBzYW10IGdlcGFyc3RlbSBJbnB1dHN0cmluZyB1bmQgZ2V0cmlnZ2VydGVuIFBhcnNlcmVyZ2Vibmlzc2VuCnN0YXRpYyBpbnQgX2V4ZWN1dGUobWl4ZWQgZnVuLCBzdHJpbmcgc3RyLCBtaXhlZCAqcGFyc2VkKSB7CiBpZihjbG9zdXJlcChmdW4pKQogIHJldHVybiAoKGludClmdW5jYWxsKGZ1bixzdHIsJnBhcnNlZCkpOwogaWYoc3RyaW5ncChmdW4pKQogIHJldHVybiAoKGludCljYWxsX290aGVyKHRoaXNfb2JqZWN0KCksZnVuLHN0ciwmcGFyc2VkKSk7CiByZXR1cm4gMDsKfQoKI2RlZmluZSBDSEVDS19QUkVTRU5UICAgICAxCiNkZWZpbmUgQ0hFQ0tfSUQgICAgICAgICAgMgojZGVmaW5lIENIRUNLX1BVVEdFVE5PTkUgIDQKI2RlZmluZSBDSEVDS19QVVRHRVREUk9QICA4CiNkZWZpbmUgQ0hFQ0tfUFVUR0VUVEFLRSAgMTYKI2RlZmluZSBDSEVDS19QVVRHRVQgICAgICAoQ0hFQ0tfUFVUR0VUTk9ORXxDSEVDS19QVVRHRVREUk9QfENIRUNLX1BVVEdFVFRBS0UpCgovLyBXZXJ0IGZ1ZXIgRmVobHNjaGxhZywgRmFsbGJhY2stV2VydCBkZXIgYmVudXR6dGVuIHdoaWxlLS0gLSBTY2hsZWlmZW4KI2RlZmluZSBOT01BVENIRk9VTkQgICAgICAtMQoKLy8gUmVnZWxuIGZ1ZXIgZWluIChudW4gdW53aWNodGlnZXMpIFZlcmIgdHJpZ2dlcm4Kc3RhdGljIGludCBfcHJvY2Vzc19jb21tYW5kKHN0cmluZyBzdHIsIHN0cmluZyAqbm9wYXJzZXN0ciwKCQkJICAgICBtaXhlZCBmdW4sIG1peGVkIGZsYWcsIG1peGVkIHJ1bGUpIHsKIG1peGVkICpwYXJzZWQsICpvYmptYXRjaGVzOwoKIC8vIGVpbmUgUmVnZWwgLi4uIGF1c3dlcnRlbiAuLi4KIGlmKHBvaW50ZXJwKHJ1bGUpKSB7CiAgaW50IG5ydWw7CiAgcGFyc2VkPW9iam1hdGNoZXM9YWxsb2NhdGUoMCk7CiAgaW50IGxhc3RtYXRjaHBvcz1OT01BVENIRk9VTkQ7CgogIC8vIEFiZ2xlaWNoZW4gZGVyIGdlc3BsaXR0ZXRlbiBFaW5nYWJlIG1pdCBSZWdlbG46CiAgLy8gdm9yd2FlcnRzIGR1cmNoIGRpZSBTeW5vbnltZ3J1cHBlbgogIGludCBycz1zaXplb2YocnVsZSk7CiAgd2hpbGUobnJ1bDxycykgewogICBpbnQgbWF0Y2hwb3M7CiAgIHN0cmluZyAqc3lub255bTsKICAgbWl4ZWQgbWF0Y2hzdHI7CgogICBtYXRjaHBvcz1OT01BVENIRk9VTkQ7CiAgIG1hdGNoc3RyPTA7CgogICAvLyBTeW5vbnltZSBleHRyYWhpZXJlbgogICBpbnQgbnJzeW5vbnltcz1zaXplb2Yoc3lub255bT1ydWxlW25ydWxdKTsKCiAgIC8vIGVnYWwgd2llIGR1cmNoIFN5bm9ueW1lIGJpcyBNYXRjaCAtIEFiZ2xlaWNoIG1pdCBFaW5nYWJlCiAgIHdoaWxlKG5yc3lub255bXMtLSkgewogICAgaW50IHRtcHBvcyA9IG1lbWJlcihub3BhcnNlc3RyLHN5bm9ueW1bbnJzeW5vbnltc10pOwogICAgLy8gaXN0IFN5bm9ueW0gaW0gRWluZ2FiZXN0cmluZyB1bmQga29tbXQgc3BhZXRlciBhbHMgdm9yaGVyaWdlcyBTeW5vbnltPwogICAgaWYodG1wcG9zPj0wICYmIHRtcHBvcz5sYXN0bWF0Y2hwb3MpIHsKICAgICAvLyBFcmZvbGc6IG1lcmtlbiBkZXIgUG9zaXRpb24gaW0gRWluZ2FiZXN0cmluZyB1bmQgZGVuIG1hdGNoZW5kZW4gU3RyaW5nCiAgICAgbWF0Y2hwb3M9dG1wcG9zOwogICAgIG1hdGNoc3RyPW5vcGFyc2VzdHJbdG1wcG9zXTsKICAgICBicmVhazsKICAgIH0KICAgfQoKICAgLy8ga2VpbiBNYXRjaCBkdXJjaCBTeW5vbnltZT8gUHJ1ZWZlIGRpZSBALVNwZXppYWx2YXJpYWJsZW4uCiAgIGlmKG1hdGNocG9zID09IE5PTUFUQ0hGT1VORCkgewogICAgaW50IGNoZWNrX3ByZXNlbnQ7CiAgICAvLyBpc3QgQWJwcnVlZmVuIHZvbiBJRC9QUkVTRU5UIGluIGRlciBTeW5vbnltZ3J1cHBlIHZlcmxhbmd0CiAgICAvLyBiZWkgcHJlc2VudCgpL2ZpbmRfb2JzIGdsZWljaCBWb3JhdXNzZXR6dW5nIGd1ZWx0aWdlciBUUCBtaXRwcnVmZW4KICAgIGlmKG1lbWJlcihzeW5vbnltLCJASUQiKT49MCkgY2hlY2tfcHJlc2VudD1DSEVDS19JRDsKICAgIGlmKHRoaXNfcGxheWVyKCkpIHsKICAgICBpZihtZW1iZXIoc3lub255bSwiQFBSRVNFTlQiKT49MCkgY2hlY2tfcHJlc2VudHw9Q0hFQ0tfUFJFU0VOVDsKICAgICBlbHNlIGlmKG1lbWJlcihzeW5vbnltLCJAUFVUX0dFVF9OT05FIik+PTApCgkJY2hlY2tfcHJlc2VudHw9Q0hFQ0tfUFVUR0VUTk9ORTsKICAgICBlbHNlIGlmKG1lbWJlcihzeW5vbnltLCJAUFVUX0dFVF9UQUtFIik+PTApCgkJY2hlY2tfcHJlc2VudHw9Q0hFQ0tfUFVUR0VURFJPUDsKICAgICBlbHNlIGlmKG1lbWJlcihzeW5vbnltLCJAUFVUX0dFVF9EUk9QIik+PTApCgkJY2hlY2tfcHJlc2VudHw9Q0hFQ0tfUFVUR0VUVEFLRTsKICAgIH0KCiAgICBpZihjaGVja19wcmVzZW50KSB7CiAgICAgLy8gd2lyIGZhbmdlbiBoaW50ZXIgZGVtIGxldHp0ZW4gTWF0Y2ggYW4KICAgICBpbnQgcV9zdGFydD1sYXN0bWF0Y2hwb3MrMTsKICAgICBpbnQgcl9lbmQ9c2l6ZW9mKG5vcGFyc2VzdHIpLTE7CgogICAgIGludCByYW5nZTsKICAgICB3aGlsZSgocmFuZ2U9cl9lbmQtcV9zdGFydCk+PTApIHsKICAgICAgbWl4ZWQgdG1wb2JqOwoKICAgICAgLy8gd2llIHdlaXQgd29sbGVuIHdpciB6dXL8Y2tnZWhlbj8KICAgICAgaWYocmFuZ2UpCiAgICAgICAgaWYoIShjaGVja19wcmVzZW50JkNIRUNLX1BVVEdFVCkpCiAgICAgICAgICByYW5nZT1yYW5nZT4yPzI6cmFuZ2U7IC8vIDMgRnJhZ21lbnRlIGZ1ZXIgQElEL0BQUkVTRU5UIChBZHZlcmIvTnIpCiAgICAgICAgZWxzZSBpZihyYW5nZT40KQogICAgICAgICAgcmFuZ2U9NDsgICAgICAgICAgICAgICAvLyA1IEZyYWdtZW50ZSBmdWVyIEBQVVRfWFhYIAoKICAgICAgLy8gdW5kIGpldHp0IGRpZSBTdWJzdHJpbmdzIHBydWVmZW4KICAgICAgd2hpbGUocmFuZ2U+PTAgJiYgIW1hdGNoc3RyKSB7CiAgICAgICBzdHJpbmcgdG1wc3RyOwoKICAgICAgIC8vIHp1IHBydWVmZW5kZW4gU3RyaW5nIGF1cyBkZW4gVGVpbGVuIHp1c2FtbWVuc2V0emVuCiAgICAgICBpZihyYW5nZSkgdG1wc3RyPWltcGxvZGUobm9wYXJzZXN0cltxX3N0YXJ0Li4ocV9zdGFydCtyYW5nZSldLCIgIik7CiAgICAgICBlbHNlIHRtcHN0cj1ub3BhcnNlc3RyW3Ffc3RhcnRdOwoKICAgICAgIC8vREJHKHRtcHN0cik7CiAgICAgICBpZihjaGVja19wcmVzZW50JkNIRUNLX1BSRVNFTlQgJiYJCQkvLyBQUkVTRU5UID8KICAgICAgICAgICgodG1wb2JqPXByZXNlbnQodG1wc3RyLHRoaXNfcGxheWVyKCkpKSB8fAogICAgICAgICAgICh0bXBvYmo9cHJlc2VudCh0bXBzdHIsZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpKSkpCiAgICAgICAgbWF0Y2hzdHI9dG1wb2JqOwogICAgICAgZWxzZSBpZihjaGVja19wcmVzZW50JkNIRUNLX0lEICYmIGlkKHRtcHN0cikpCS8vIElEID8KICAgICAgICBtYXRjaHN0cj10aGlzX29iamVjdCgpOwogICAgICAgZWxzZSBpZigoY2hlY2tfcHJlc2VudCZDSEVDS19QVVRHRVQpICYmCS8vIFBVVF9HRVRfPz8/ID8KICAgICAgICAgICAgICAgKHRtcG9iaj0ob2JqZWN0KikKICAgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+ZmluZF9vYnModG1wc3RyLAogICAgICAgICAgICAgICAgICAgICAgKFtDSEVDS19QVVRHRVROT05FOlBVVF9HRVRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUFVUR0VURFJPUDpQVVRfR0VUX1RBS0UsCiAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1BVVEdFVFRBS0U6UFVUX0dFVF9EUk9QXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDSEVDS19QVVRHRVQmY2hlY2tfcHJlc2VudF0pKSAmJgogICAgICAgICAgICAgICBzaXplb2YodG1wb2JqKSkgewogICAgICAgIGlmKHNpemVvZih0bXBvYmopPT0xKSBtYXRjaHN0cj10bXBvYmpbMF07CiAgICAgICAgZWxzZSB7CS8vIEFycmF5cyB3ZXJkZW4gendpc2NoZW5nZXNwZWljaGVydCAuLi4KICAgICAgICAgb2JqbWF0Y2hlcys9KHtzaXplb2YocGFyc2VkKSx0bXBvYmp9KTsKICAgICAgICAgbWF0Y2hzdHI9dG1wc3RyOwogICAgICAgIH0KICAgICAgIH0gZWxzZSB7IC8vIGRpZXNlciBTdWJzdHJpbmcgaGF0IG5pY2h0IGdlbWF0Y2h0CiAgICAgICAgLy8gYWIgd2VuaWdlciBhbHMgMyBUZWlsZW4gaXN0IGRhcyBOaWNodG1hdGNoaW5nIGVpbmVzIFN1YnN0cmluZ3MgbWl0CiAgICAgICAgLy8gYmVlbmRlbmRlbSBOdW1lcmFsIEtyaXRlcml1bSBmdWVyIEFiYnJ1Y2ggKCJvYmpla3QgMiIgc29sbCBtYXRjaGVuKQogICAgICAgIHN0cmluZyBudW1lcmFsY2hlY2s7CiAgICAgICAgaWYocmFuZ2UgJiYgcmFuZ2U8PTIgJiYKICAgICAgICAgICBzaXplb2YobnVtZXJhbGNoZWNrPW5vcGFyc2VzdHJbcV9zdGFydCtyYW5nZV0pICYmCiAgICAgICAgICAgdG9fc3RyaW5nKHRvX2ludChudW1lcmFsY2hlY2spKT09bnVtZXJhbGNoZWNrKQogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIFN1YnN0cmluZ2xhZW5nZSB2ZXJrdWVyemVuIHVuZCB3ZWl0ZXIKICAgICAgICByYW5nZS0tOwogICAgICAgfQogICAgICB9CgogICAgICAvLyBNYXRjaCBnZWZ1bmRlbiEKICAgICAgaWYobWF0Y2hzdHIpIHsKICAgICAgIG1hdGNocG9zPXJhbmdlK3Ffc3RhcnQ7CiAgICAgICAvLyBEQkcobWF0Y2hwb3MpOwogICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcV9zdGFydCsrOwogICAgIH0gLy8gZW5kIHdoaWxlCiAgICB9CiAgIH0KCiAgIC8vIEZlaGxlcm1lbGR1bmcgZnVlciBkaWVzZSBmZWhsZ2VzY2hsYWdlbmUgU3lub255bWdydXBwZSBzZXR6ZW4KICAgaWYobWF0Y2hwb3MgPT0gTk9NQVRDSEZPVU5EKSB7CiAgICAvLyBGZWhsZXJtZWxkdW5nZW4gdW5kIGVpbiBFaW50cmFnIGFuIGRlciBGZWhsZXJzdGVsbGU/CiAgICBpZihwb2ludGVycChmbGFnKSAmJiBzaXplb2YoZmxhZyk+bnJ1bCkgewoKICAgICBtYXRjaHN0cj1mbGFnW25ydWxdOwoKICAgICBpZihzdHJpbmdwKG1hdGNoc3RyKSAmJiBzaXplb2YobWF0Y2hzdHIpKSB7CiAgICAgIGlmKG1lbWJlcihtYXRjaHN0ciwnQCcpPj0wKSB7CiAgICAgICBtYXRjaHN0cj1yZXBsYWNlX3BlcnNvbmFsKCZtYXRjaHN0ciwoe3RoaXNfcGxheWVyKCl9KStwYXJzZWQsMSk7CiAgICAgICBzdHJpbmcgc3RhbW09KChxdWVyeV92ZXJiKClbPDFdXidlJyk/cXVlcnlfdmVyYigpOnF1ZXJ5X3ZlcmIoKVswLi48Ml0pOwogICAgICAgbWF0Y2hzdHI9cmVncmVwbGFjZShtYXRjaHN0ciwiQFZFUkIiLGNhcGl0YWxpemUoc3RhbW0pLDEpOwogICAgICAgbWF0Y2hzdHI9cmVncmVwbGFjZShtYXRjaHN0ciwiQHZlcmIiLHN0YW1tLDEpOwogICAgICB9CgogICAgICAvLyBpc3QgRmVobGVybWVsZHVuZyBlaW4gV1JJVEU/CiAgICAgIC8vIGRhbm4gcmV0dXJuIDEgIQogICAgICBpZihpbnRwKGZsYWdbPDFdKSAmJiBmbGFnWzwxXTw9bnJ1bCkgewogICAgICAgaWYobWVtYmVyKG1hdGNoc3RyLCdeJyk+PTApIHsKICAgICAgICBtYXRjaHN0cj1leHBsb2RlKG1hdGNoc3RyLCJeIik7CiAgICAgICAgd3JpdGUoY2FwaXRhbGl6ZShicmVha19zdHJpbmcobWF0Y2hzdHJbMF0sNzgsMCwxKSkpOwogICAgICAgIGlmKHNpemVvZihtYXRjaHN0clsxXSkpCiAgICAgICAgIHNheShjYXBpdGFsaXplKGJyZWFrX3N0cmluZyhtYXRjaHN0clsxXSw3OCwwLDEpKSwoe3RoaXNfcGxheWVyKCl9KSApOwogICAgICAgfSBlbHNlIHdyaXRlKGNhcGl0YWxpemUoYnJlYWtfc3RyaW5nKG1hdGNoc3RyLDc4LDAsMSkpKTsKICAgICAgIHJldHVybiAxOwogICAgICB9IGVsc2Ugbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShicmVha19zdHJpbmcobWF0Y2hzdHIsNzgsMCwxKSkpOwogICAgIH0KICAgIH0KICAgIHJldHVybiAwOwogICB9CgogICAvLyBVcGRhdGVuIGRlciBIaWxmc3ZhcmlhYmxlbgogICBwYXJzZWQrPSh7bWF0Y2hzdHJ9KTsKICAgbGFzdG1hdGNocG9zPW1hdGNocG9zOwogICBucnVsKys7CiAgfSAvLyBlbmQgd2hpbGUobnJ1bDxycykgLi4uIEVyZm9sZyAuLi4gYWIgenVtIG5hZWNoc3RlbiBSZWdlbHRlaWwKIH0KCiAvLyBBcnJheXMgZGVyIEAtT2JqZWN0bWF0Y2hlcyBpbiBQYXJhbWV0ZXIgZnVlciBNZXRob2RlIHJlc3Vic3RpdHVpZXJlbgogaW50IG9ianNpemU7CiBpZigob2Jqc2l6ZT1zaXplb2Yob2JqbWF0Y2hlcykpKQogIHdoaWxlKChvYmpzaXplLT0yKT49MCkKICAgcGFyc2VkW29iam1hdGNoZXNbb2Jqc2l6ZV1dPW9iam1hdGNoZXNbb2Jqc2l6ZSsxXTsKCiAvLyBlcmZvbGdyZWljaCBNZXRob2RlIGdlZnVuZGVuL2VpbmUgUmVnZWwgYmlzIHp1bSBFbmRlIGR1cmNoZ2VwYXJzdDoKIHJldHVybihfZXhlY3V0ZSgmZnVuLCZzdHIsJnBhcnNlZCkpOwp9CgovLyBBdXN3ZXJ0dW5nIC0gYWRkX2FjdGlvbi1GdW4gCnB1YmxpYyBpbnQgX2NsKHN0cmluZyBzdHIpIHsKIGludCBuaW5kZXg7CiBzdHJpbmcgKmtleXM7CiBtaXhlZCAqZmxhZzsKIC8vIFZlcmIgZXhpc3RpZXJ0LCBLb21tYW5kb3MgYXVjaCwgRWludHJhZyBmdWVyIFZlcmIgZ2VmdW5kZW4KIGlmKG1hcHBpbmdwKGFkZGVkX2NtZHMpICYmIHF1ZXJ5X3ZlcmIoKSkgewogIG1peGVkICpmdW4sICpydWxlLCAqaWRzOwoKICAvLyBpc3QgZGFzIFZlcmIgZWluIEtleSBpbSBLb21tYW5kb21hcHBpbmc/CiAgaWYobV9jb250YWlucygmZnVuLCAmZmxhZywgJnJ1bGUsICZpZHMsIGFkZGVkX2NtZHMsIHF1ZXJ5X3ZlcmIoKSkpIHsKICAgc3RyaW5nICpub3BhcnNlc3RyOwogICBuaW5kZXg9c2l6ZW9mKGZ1bik7CiAgIG5vcGFyc2VzdHI9ZXhwbG9kZSgoc3RyfHwiIiksIiAiKS0oeyIifSk7CiAgIC8vIGRhbm4gbWF0Y2hlIHVuZ2VwYXJzdGVuIElucHV0IGdlZ2VuIGV0d2FpZ2UgUmVnZWxuCiAgIC8vIC0tIG5pY2h0IGFlbmRlcm46IG5ldWUgS29tbWFuZG9zIHNvbGxlbiBhbHRlICJ1ZWJlcnNjaHJlaWJlbiIga29lbm5lbgogICB3aGlsZShuaW5kZXgtLSkKICAgIGlmKF9wcm9jZXNzX2NvbW1hbmQoJnN0ciwgbm9wYXJzZXN0ciwKCQkgICAgICAgZnVuW25pbmRleF0sIGZsYWdbbmluZGV4XSwgcnVsZVtuaW5kZXhdKSkKICAgIHsKICAgICAgR2l2ZUVQKEVQX0NNRCwgcXVlcnlfdmVyYigpKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgfQoKICAvLyBrZWluZSBSZWdlbCBwYXNzdGUsIHVuc2NoYXJmZSBBdXN3ZXJ0dW5nIGF1ZiBhbGxlCiAgLy8gQWRkQ21kdmVyYmVuIGF1c2RlaG5lbgogIGtleXM9bV9pbmRpY2VzKGFkZGVkX2NtZHMpOwogIG5pbmRleD1zaXplb2Yoa2V5cyk7CiAgd2hpbGUobmluZGV4LS0pCiAgIGlmKCFzdHJzdHIocXVlcnlfdmVyYigpLGtleXNbbmluZGV4XSkgJiYKICAgICAgbWVtYmVyKChmbGFnPWFkZGVkX2NtZHNba2V5c1tuaW5kZXhdLDFdKSwxKT49MCkgewogICAgaW50IGkscmV0OwogICAgaT1zaXplb2YoZmxhZyk7CiAgICAvLyBSZWloZW5mb2xnZSBuaWNodCBhZW5kZXJuICEKICAgIHdoaWxlKGktLSkKICAgICAgaWYoZmxhZ1tpXT09MSkgewogICAgICAgIG1peGVkICpleGVjID0gYWRkZWRfY21kc1trZXlzW25pbmRleF0sMF07CiAgICAgICAgaWYoIXBvaW50ZXJwKGV4ZWMpIHx8IHNpemVvZihleGVjKTw9aSkKICAgICAgICAgIGNhdGNoKHJhaXNlX2Vycm9yKAogICAgICAgICAgICAiQWRkQ21kLUF1c3dlcnR1bmc6IENhdGNoQWxsLUtvbW1hbmRvIFwiIitrZXlzW25pbmRleF0rIlwiIgogICAgICAgICAgICAiIHd1cmRlIHdhZWhyZW5kIGRlciBBdXNmdWVocnVuZyB2ZXJhZW5kZXJ0IG9kZXIgZ2Vsb2VzY2h0LiAiCiAgICAgICAgICAgICJLbGFydGV4dDogRGFzIGlzdCBzY2hsZWNodC4gU3VjaHQgZWluIFJlbW92ZUNtZD8gIik7CiAgICAgICAgICAgIHB1Ymxpc2gpOwogICAgICAgIGVsc2UgaWYoX2V4ZWN1dGUoZXhlY1tpXSxzdHIsMCkpIHsKICAgICAgICAgIEdpdmVFUChFUF9DTUQsIHF1ZXJ5X3ZlcmIoKSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgIH0KICAgfQogfQogcmV0dXJuIDA7Cn0KCnZvaWQgaW5pdCgpIHsKIGFkZF9hY3Rpb24oIl9jbCIsIiIsMSk7Cn0KCgpzdGF0aWMgdm9pZCBfY2hlY2tfY29weV9jb21tYW5kcyhzdHJpbmcgaW5kLCBtaXhlZCAqZnVuLAoJCQkJICBtaXhlZCAqZmxhZywgbWl4ZWQgKnJ1bGUpIHsKIGlmKHBvaW50ZXJwKGZ1bikpIGFkZGVkX2NtZHNbaW5kLDBdPWZ1bithbGxvY2F0ZSgwKTsKIGVsc2UgYWRkZWRfY21kc1tpbmQsMF09KHtmdW59KTsKIGlmKHBvaW50ZXJwKGZsYWcpKSBhZGRlZF9jbWRzW2luZCwxXT1mbGFnK2FsbG9jYXRlKDApOwogZWxzZSBpZihmbGFnKSBhZGRlZF9jbWRzW2luZCwxXT0oe2ZsYWd9KTsKIGVsc2UgYWRkZWRfY21kc1tpbmQsMV09YWxsb2NhdGUoc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkpOwogaWYocG9pbnRlcnAocnVsZSkpIGFkZGVkX2NtZHNbaW5kLDJdPXJ1bGUrYWxsb2NhdGUoMCk7CiBlbHNlIGFkZGVkX2NtZHNbaW5kLDJdPWFsbG9jYXRlKHNpemVvZihhZGRlZF9jbWRzW2luZF0pKTsKCiBpZihzaXplb2YoYWRkZWRfY21kc1tpbmRdKSE9c2l6ZW9mKGFkZGVkX2NtZHNbaW5kLDFdKSB8fAogICAgc2l6ZW9mKGFkZGVkX2NtZHNbaW5kXSkhPXNpemVvZihhZGRlZF9jbWRzW2luZCwyXSkpIHsKICBhZGRlZF9jbWRzPShtYXBwaW5nKTA7CiAgcmFpc2VfZXJyb3IoIlNldFByb3AoUF9DT01NQU5EUyk6IGNvcnJ1cHQgY29tbWFuZHMtbWFwcGluZy5cbiIpOwogfQp9CgpzdGF0aWMgbWFwcGluZyBfc2V0X2NvbW1hbmRzKG1hcHBpbmcgY29tbWFuZHMpIHsKIGlmKCFjb21tYW5kcykgYWRkZWRfY21kcz0obWFwcGluZykwOwogZWxzZSBpZihtYXBwaW5ncChjb21tYW5kcykpIHsKICBhZGRlZF9jbWRzPW1fYWxsb2NhdGUoc2l6ZW9mKGNvbW1hbmRzKSw0KTsKICB3YWxrX21hcHBpbmcoY29tbWFuZHMsIydfY2hlY2tfY29weV9jb21tYW5kcyk7CiB9CiBpZiAobWFwcGluZ3AoYWRkZWRfY21kcykpCiAgIHJldHVybihkZWVwX2NvcHkoYWRkZWRfY21kcykpOwogZWxzZQogICByZXR1cm4gKG1hcHBpbmcpMDsKfQoKc3RhdGljIG1hcHBpbmcgX3F1ZXJ5X2NvbW1hbmRzKCkgewogaWYgKG1hcHBpbmdwKGFkZGVkX2NtZHMpKQogICByZXR1cm4oZGVlcF9jb3B5KGFkZGVkX2NtZHMpKTsKIGVsc2UKICAgcmV0dXJuIChtYXBwaW5nKTA7Cn0KCg==