rn-pdf-reader-js
Version:
PDF reader for Expo
2 lines • 90.7 kB
JavaScript
import { Base64 } from 'js-base64';
const bundle = 'IWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBhPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoYS5leHBvcnRzLGEsYS5leHBvcnRzLG4pLGEubD0hMCxhLmV4cG9ydHN9bi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgYSBpbiBlKW4uZChyLGEsZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxhKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsImEiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPSIiLG4obi5zPTMwKX0oW2Z1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGUuZXhwb3J0cz1uPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9LG4odCl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigzNCkoKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE4KSxhPW4oNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCJvYmplY3QiIT09cih0KSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/YShlKTp0fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiZyKGUsdCl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxOCk7ZnVuY3Rpb24gYSgpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBXZWFrTWFwKXJldHVybiBudWxsO3ZhciBlPW5ldyBXZWFrTWFwO3JldHVybiBhPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTtpZihudWxsPT09ZXx8Im9iamVjdCIhPT1yKGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm57ZGVmYXVsdDplfTt2YXIgdD1hKCk7aWYodCYmdC5oYXMoZSkpcmV0dXJuIHQuZ2V0KGUpO3ZhciBuPXt9LG89T2JqZWN0LmRlZmluZVByb3BlcnR5JiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2Zvcih2YXIgaSBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpKXt2YXIgdT1vP09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKTpudWxsO3UmJih1LmdldHx8dS5zZXQpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGksdSk6bltpXT1lW2ldfXJldHVybiBuLmRlZmF1bHQ9ZSx0JiZ0LnNldChlLG4pLG59fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gZS5leHBvcnRzPW49T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWUuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHQmJm4oZS5wcm90b3R5cGUsdCksciYmbihlLHIpLGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQubG9hZEZyb21GaWxlPXQuaXNDYW5jZWxFeGNlcHRpb249dC5tYWtlUGFnZUNhbGxiYWNrPXQuY2FuY2VsUnVubmluZ1Rhc2s9dC5tYWtlQ2FuY2VsbGFibGU9dC5kaXNwbGF5Q09SU1dhcm5pbmc9dC5lcnJvck9uRGV2PXQud2Fybk9uRGV2PXQuZ2V0UGl4ZWxSYXRpbz10LmNhbGxJZkRlZmluZWQ9dC5kYXRhVVJJdG9VaW50OEFycmF5PXQuaXNEYXRhVVJJPXQuaXNGaWxlPXQuaXNCbG9iPXQuaXNBcnJheUJ1ZmZlcj10LmlzU3RyaW5nPXQuaXNQcm92aWRlZD10LmlzRGVmaW5lZD10LmlzUHJvZHVjdGlvbj10LmlzTG9jYWxGaWxlU3lzdGVtPXQuaXNCcm93c2VyPXZvaWQgMDt2YXIgYT1yKG4oNSkpLG89cihuKDYpKSxpPXIobigyKSksdT1yKG4oOCkpLGM9cihuKDM4KSkscz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdzt0LmlzQnJvd3Nlcj1zO3ZhciBsPXMmJiJmaWxlOiI9PT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7dC5pc0xvY2FsRmlsZVN5c3RlbT1sO3QuaXNQcm9kdWN0aW9uPSEwO3ZhciBmPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lfTt0LmlzRGVmaW5lZD1mO3QuaXNQcm92aWRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZihlKSYmbnVsbCE9PWV9O3ZhciBkPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX07dC5pc1N0cmluZz1kO3QuaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTt0LmlzQmxvYj1mdW5jdGlvbihlKXtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBjaGVjayBpZiBhIHZhcmlhYmxlIGlzIGEgQmxvYiBvbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LiIpO3JldHVybiBlIGluc3RhbmNlb2YgQmxvYn07dC5pc0ZpbGU9ZnVuY3Rpb24oZSl7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gY2hlY2sgaWYgYSB2YXJpYWJsZSBpcyBhIEZpbGUgb24gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudC4iKTtyZXR1cm4gZSBpbnN0YW5jZW9mIEZpbGV9O3ZhciBwPWZ1bmN0aW9uKGUpe3JldHVybiBkKGUpJiYvXmRhdGE6Ly50ZXN0KGUpfTt0LmlzRGF0YVVSST1wO3QuZGF0YVVSSXRvVWludDhBcnJheT1mdW5jdGlvbihlKXtpZighcChlKSl0aHJvdyBuZXcgRXJyb3IoImRhdGFVUkl0b1VpbnQ4QXJyYXkgd2FzIHByb3ZpZGVkIHdpdGggYW4gYXJndW1lbnQgd2hpY2ggaXMgbm90IGEgdmFsaWQgZGF0YSBVUkkuIik7dmFyIHQ7dD1lLnNwbGl0KCIsIilbMF0uaW5kZXhPZigiYmFzZTY0Iik+PTA/YXRvYihlLnNwbGl0KCIsIilbMV0pOnVuZXNjYXBlKGUuc3BsaXQoIiwiKVsxXSk7Zm9yKHZhciBuPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDtyKz0xKW5bcl09dC5jaGFyQ29kZUF0KHIpO3JldHVybiBufTt0LmNhbGxJZkRlZmluZWQ9ZnVuY3Rpb24oZSl7aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtlLmFwcGx5KHZvaWQgMCxuKX19O3QuZ2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiBzJiZ3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MX07dmFyIGg9ZnVuY3Rpb24oZSl7fSx2PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGguYXBwbHkodm9pZCAwLFsid2FybiJdLmNvbmNhdCh0KSl9O3Qud2Fybk9uRGV2PXY7dC5lcnJvck9uRGV2PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGguYXBwbHkodm9pZCAwLFsiZXJyb3IiXS5jb25jYXQodCkpfTt0LmRpc3BsYXlDT1JTV2FybmluZz1mdW5jdGlvbigpe2wmJnYoIkxvYWRpbmcgUERGIGFzIGJhc2U2NCBzdHJpbmdzL1VSTHMgbWlnaHQgbm90IHdvcmsgb24gcHJvdG9jb2xzIG90aGVyIHRoYW4gSFRUUC9IVFRQUy4gT24gR29vZ2xlIENocm9tZSwgeW91IGNhbiB1c2UgLS1hbGxvdy1maWxlLWFjY2Vzcy1mcm9tLWZpbGVzIGZsYWcgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4iKX07dmFyIGc9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLG4pe3ZhciByO3JldHVybigwLGEuZGVmYXVsdCkodGhpcyx0KSwocj0oMCxvLmRlZmF1bHQpKHRoaXMsKDAsaS5kZWZhdWx0KSh0KS5jYWxsKHRoaXMsZSxuKSkpLm5hbWU9IlByb21pc2VDYW5jZWxsZWRFeGNlcHRpb24iLHIubWVzc2FnZT1lLHIudHlwZT1uLHJ9cmV0dXJuKDAsdS5kZWZhdWx0KSh0LGUpLHR9KCgwLGMuZGVmYXVsdCkoRXJyb3IpKTt0Lm1ha2VDYW5jZWxsYWJsZT1mdW5jdGlvbihlKXt2YXIgdD0hMTtyZXR1cm57cHJvbWlzZTpuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtlLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHQ/cihuZXcgZygiUHJvbWlzZSBjYW5jZWxsZWQiKSk6bi5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX0pLChmdW5jdGlvbihlKXtyZXR1cm4gcih0P25ldyBnKCJQcm9taXNlIGNhbmNlbGxlZCIpOmUpfSkpfSkpLGNhbmNlbDpmdW5jdGlvbigpe3Q9ITB9fX07dC5jYW5jZWxSdW5uaW5nVGFzaz1mdW5jdGlvbihlKXtlJiZlLmNhbmNlbCYmZS5jYW5jZWwoKX07dC5tYWtlUGFnZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJ3aWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXdbMl0qdH0sY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXdbM10qdH0sY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm9yaWdpbmFsV2lkdGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3WzJdfSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwib3JpZ2luYWxIZWlnaHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3WzNdfSxjb25maWd1cmFibGU6ITB9KSxlfTt0LmlzQ2FuY2VsRXhjZXB0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iPT09ZS5uYW1lfHwiUHJvbWlzZUNhbmNlbGxlZEV4Y2VwdGlvbiI9PT1lLm5hbWV9O3QubG9hZEZyb21GaWxlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXt2YXIgcj1uZXcgRmlsZVJlYWRlcjtyZXR1cm4gci5vbmxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdChuZXcgVWludDhBcnJheShyLnJlc3VsdCkpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFyZ2V0LmVycm9yLmNvZGUpe2Nhc2UgZS50YXJnZXQuZXJyb3IuTk9UX0ZPVU5EX0VSUjpyZXR1cm4gbihuZXcgRXJyb3IoIkVycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBGaWxlIG5vdCBmb3VuZC4iKSk7Y2FzZSBlLnRhcmdldC5lcnJvci5OT1RfUkVBREFCTEVfRVJSOnJldHVybiBuKG5ldyBFcnJvcigiRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGU6IEZpbGUgbm90IHJlYWRhYmxlLiIpKTtjYXNlIGUudGFyZ2V0LmVycm9yLlNFQ1VSSVRZX0VSUjpyZXR1cm4gbihuZXcgRXJyb3IoIkVycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBTZWN1cml0eSBlcnJvci4iKSk7Y2FzZSBlLnRhcmdldC5lcnJvci5BQk9SVF9FUlI6cmV0dXJuIG4obmV3IEVycm9yKCJFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZTogQWJvcnRlZC4iKSk7ZGVmYXVsdDpyZXR1cm4gbihuZXcgRXJyb3IoIkVycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlLiIpKX19LHIucmVhZEFzQXJyYXlCdWZmZXIoZSksbnVsbH0pKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5pc1JvdGF0ZT10LmlzUmVuZGVyTW9kZT10LmlzUGRmPXQuaXNQYWdlTnVtYmVyPXQuaXNQYWdlSW5kZXg9dC5pc1BhZ2U9dC5pc0xpbmtUYXJnZXQ9dC5pc0xpbmtTZXJ2aWNlPXQuaXNGaWxlPXQuaXNDbGFzc05hbWU9dC5ldmVudHNQcm9wcz12b2lkIDA7dmFyIGE9cihuKDE4KSksbz1yKG4oNDEpKSxpPXIobigzKSksdT1yKG4oNDUpKSxjPW4oMjApLHM9bigxMiksbD1yKG4oMjYpKSxmPSgwLHUuZGVmYXVsdCkoKGZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuW10uY29uY2F0KCgwLG8uZGVmYXVsdCkoYy5tb3VzZUV2ZW50cyksKDAsby5kZWZhdWx0KShjLnRvdWNoRXZlbnRzKSwoMCxvLmRlZmF1bHQpKGMua2V5Ym9hcmRFdmVudHMpKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPWkuZGVmYXVsdC5mdW5jfSkpLGV9KSk7dC5ldmVudHNQcm9wcz1mO3ZhciBkPVtpLmRlZmF1bHQuc3RyaW5nLGkuZGVmYXVsdC5pbnN0YW5jZU9mKEFycmF5QnVmZmVyKSxpLmRlZmF1bHQuc2hhcGUoe2RhdGE6aS5kZWZhdWx0Lm9iamVjdCxodHRwSGVhZGVyczppLmRlZmF1bHQub2JqZWN0LHJhbmdlOmkuZGVmYXVsdC5vYmplY3QsdXJsOmkuZGVmYXVsdC5zdHJpbmcsd2l0aENyZWRlbnRpYWxzOmkuZGVmYXVsdC5ib29sfSldOyJ1bmRlZmluZWQiIT10eXBlb2YgRmlsZSYmZC5wdXNoKGkuZGVmYXVsdC5pbnN0YW5jZU9mKEZpbGUpKSwidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJmQucHVzaChpLmRlZmF1bHQuaW5zdGFuY2VPZihCbG9iKSk7dmFyIHA9aS5kZWZhdWx0Lm9uZU9mVHlwZShbaS5kZWZhdWx0LnN0cmluZyxpLmRlZmF1bHQuYXJyYXlPZihpLmRlZmF1bHQuc3RyaW5nKV0pO3QuaXNDbGFzc05hbWU9cDt2YXIgaD1pLmRlZmF1bHQub25lT2ZUeXBlKGQpO3QuaXNGaWxlPWg7dmFyIHY9aS5kZWZhdWx0Lmluc3RhbmNlT2YobC5kZWZhdWx0KTt0LmlzTGlua1NlcnZpY2U9djt2YXIgZz1pLmRlZmF1bHQub25lT2YoWyJfc2VsZiIsIl9ibGFuayIsIl9wYXJlbnQiLCJfdG9wIl0pO3QuaXNMaW5rVGFyZ2V0PWc7dmFyIG09aS5kZWZhdWx0LnNoYXBlKHtfdHJhbnNwb3J0OmkuZGVmYXVsdC5zaGFwZSh7Zm9udExvYWRlcjppLmRlZmF1bHQub2JqZWN0LmlzUmVxdWlyZWR9KS5pc1JlcXVpcmVkLGNvbW1vbk9ianM6aS5kZWZhdWx0LnNoYXBlKHtfb2JqczppLmRlZmF1bHQub2JqZWN0LmlzUmVxdWlyZWR9KS5pc1JlcXVpcmVkLGdldEFubm90YXRpb25zOmkuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWQsZ2V0VGV4dENvbnRlbnQ6aS5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxnZXRWaWV3cG9ydDppLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLHJlbmRlcjppLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkfSk7dC5pc1BhZ2U9bTt0LmlzUGFnZUluZGV4PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lW3RdLG89ZS5wYWdlTnVtYmVyLGk9ZS5wZGY7aWYoISgwLHMuaXNEZWZpbmVkKShpKSlyZXR1cm4gbnVsbDtpZigoMCxzLmlzRGVmaW5lZCkocikpe2lmKCJudW1iZXIiIT10eXBlb2YgcilyZXR1cm4gbmV3IEVycm9yKCJgIi5jb25jYXQodCwiYCBvZiB0eXBlIGAiKS5jb25jYXQoKDAsYS5kZWZhdWx0KShyKSwiYCBzdXBwbGllZCB0byBgIikuY29uY2F0KG4sImAsIGV4cGVjdGVkIGBudW1iZXJgLiIpKTtpZihyPDApcmV0dXJuIG5ldyBFcnJvcigiRXhwZWN0ZWQgYCIuY29uY2F0KHQsImAgdG8gYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwLiIpKTt2YXIgdT1pLm51bVBhZ2VzO2lmKHIrMT51KXJldHVybiBuZXcgRXJyb3IoIkV4cGVjdGVkIGAiLmNvbmNhdCh0LCJgIHRvIGJlIGxlc3Mgb3IgZXF1YWwgdG8gIikuY29uY2F0KHUtMSwiLiIpKX1lbHNlIGlmKCEoMCxzLmlzRGVmaW5lZCkobykpcmV0dXJuIG5ldyBFcnJvcigiYCIuY29uY2F0KHQsImAgbm90IHN1cHBsaWVkLiBFaXRoZXIgcGFnZUluZGV4IG9yIHBhZ2VOdW1iZXIgbXVzdCBiZSBzdXBwbGllZCB0byBgIikuY29uY2F0KG4sImAuIikpO3JldHVybiBudWxsfTt0LmlzUGFnZU51bWJlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZVt0XSxvPWUucGFnZUluZGV4LGk9ZS5wZGY7aWYoISgwLHMuaXNEZWZpbmVkKShpKSlyZXR1cm4gbnVsbDtpZigoMCxzLmlzRGVmaW5lZCkocikpe2lmKCJudW1iZXIiIT10eXBlb2YgcilyZXR1cm4gbmV3IEVycm9yKCJgIi5jb25jYXQodCwiYCBvZiB0eXBlIGAiKS5jb25jYXQoKDAsYS5kZWZhdWx0KShyKSwiYCBzdXBwbGllZCB0byBgIikuY29uY2F0KG4sImAsIGV4cGVjdGVkIGBudW1iZXJgLiIpKTtpZihyPDEpcmV0dXJuIG5ldyBFcnJvcigiRXhwZWN0ZWQgYCIuY29uY2F0KHQsImAgdG8gYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLiIpKTt2YXIgdT1pLm51bVBhZ2VzO2lmKHI+dSlyZXR1cm4gbmV3IEVycm9yKCJFeHBlY3RlZCBgIi5jb25jYXQodCwiYCB0byBiZSBsZXNzIG9yIGVxdWFsIHRvICIpLmNvbmNhdCh1LCIuIikpfWVsc2UgaWYoISgwLHMuaXNEZWZpbmVkKShvKSlyZXR1cm4gbmV3IEVycm9yKCJgIi5jb25jYXQodCwiYCBub3Qgc3VwcGxpZWQuIEVpdGhlciBwYWdlSW5kZXggb3IgcGFnZU51bWJlciBtdXN0IGJlIHN1cHBsaWVkIHRvIGAiKS5jb25jYXQobiwiYC4iKSk7cmV0dXJuIG51bGx9O3ZhciB5PWkuZGVmYXVsdC5vbmVPZlR5cGUoW2kuZGVmYXVsdC5zaGFwZSh7Z2V0RGVzdGluYXRpb246aS5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxnZXRPdXRsaW5lOmkuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWQsZ2V0UGFnZTppLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLG51bVBhZ2VzOmkuZGVmYXVsdC5udW1iZXIuaXNSZXF1aXJlZH0pLGkuZGVmYXVsdC5ib29sXSk7dC5pc1BkZj15O3ZhciBiPWkuZGVmYXVsdC5vbmVPZihbImNhbnZhcyIsIm5vbmUiLCJzdmciXSk7dC5pc1JlbmRlck1vZGU9Yjt2YXIgdz1pLmRlZmF1bHQub25lT2YoWzAsOTAsMTgwLDI3MF0pO3QuaXNSb3RhdGU9d30sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXtmb3IodmFyIHI9big1NiksYT0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz90OndpbmRvdyxvPVsibW96Iiwid2Via2l0Il0saT0iQW5pbWF0aW9uRnJhbWUiLHU9YVsicmVxdWVzdCIraV0sYz1hWyJjYW5jZWwiK2ldfHxhWyJjYW5jZWxSZXF1ZXN0IitpXSxzPTA7IXUmJnM8by5sZW5ndGg7cysrKXU9YVtvW3NdKyJSZXF1ZXN0IitpXSxjPWFbb1tzXSsiQ2FuY2VsIitpXXx8YVtvW3NdKyJDYW5jZWxSZXF1ZXN0IitpXTtpZighdXx8IWMpe3ZhciBsPTAsZj0wLGQ9W107dT1mdW5jdGlvbihlKXtpZigwPT09ZC5sZW5ndGgpe3ZhciB0PXIoKSxuPU1hdGgubWF4KDAsMWUzLzYwLSh0LWwpKTtsPW4rdCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBlPWQuc2xpY2UoMCk7ZC5sZW5ndGg9MDtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZighZVt0XS5jYW5jZWxsZWQpdHJ5e2VbdF0uY2FsbGJhY2sobCl9Y2F0Y2goZSl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0aHJvdyBlfSksMCl9fSksTWF0aC5yb3VuZChuKSl9cmV0dXJuIGQucHVzaCh7aGFuZGxlOisrZixjYWxsYmFjazplLGNhbmNlbGxlZDohMX0pLGZ9LGM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxkLmxlbmd0aDt0KyspZFt0XS5oYW5kbGU9PT1lJiYoZFt0XS5jYW5jZWxsZWQ9ITApfX1lLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHUuY2FsbChhLGUpfSxlLmV4cG9ydHMuY2FuY2VsPWZ1bmN0aW9uKCl7Yy5hcHBseShhLGFyZ3VtZW50cyl9LGUuZXhwb3J0cy5wb2x5ZmlsbD1mdW5jdGlvbihlKXtlfHwoZT1hKSxlLnJlcXVlc3RBbmltYXRpb25GcmFtZT11LGUuY2FuY2VsQW5pbWF0aW9uRnJhbWU9Y319KS5jYWxsKHRoaXMsbig1NSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dm9pZCAwO3ZhciByPSgwLG4oMCkuY3JlYXRlQ29udGV4dCkobnVsbCk7dC5kZWZhdWx0PXJ9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigzMyl9LGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixyLGEsbyxpKXt0cnl7dmFyIHU9ZVtvXShpKSxjPXUudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgbihlKX11LmRvbmU/dChjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLGEpfWUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLHI9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oYSxvKXt2YXIgaT1lLmFwcGx5KHQscik7ZnVuY3Rpb24gdShlKXtuKGksYSxvLHUsYywibmV4dCIsZSl9ZnVuY3Rpb24gYyhlKXtuKGksYSxvLHUsYywidGhyb3ciLGUpfXUodm9pZCAwKX0pKX19fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZS5leHBvcnRzPW49ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTplLmV4cG9ydHM9bj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LG4odCl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0LHIpe3JldHVybiBlLmV4cG9ydHM9bj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0sbih0LHIpfWUuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dC5mb2N1c0V2ZW50cz10LmtleWJvYXJkRXZlbnRzPXQudG91Y2hFdmVudHM9dC5tb3VzZUV2ZW50cz12b2lkIDA7dmFyIHI9WyJvbkNsaWNrIiwib25Db250ZXh0TWVudSIsIm9uRG91YmxlQ2xpY2siLCJvbkRyYWciLCJvbkRyYWdFbmQiLCJvbkRyYWdFbnRlciIsIm9uRHJhZ0V4aXQiLCJvbkRyYWdMZWF2ZSIsIm9uRHJhZ092ZXIiLCJvbkRyYWdTdGFydCIsIm9uRHJvcCIsIm9uTW91c2VEb3duIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwib25Nb3VzZU1vdmUiLCJvbk1vdXNlT3V0Iiwib25Nb3VzZU92ZXIiLCJvbk1vdXNlVXAiXTt0Lm1vdXNlRXZlbnRzPXI7dmFyIGE9WyJvblRvdWNoQ2FuY2VsIiwib25Ub3VjaEVuZCIsIm9uVG91Y2hNb3ZlIiwib25Ub3VjaFN0YXJ0Il07dC50b3VjaEV2ZW50cz1hO3ZhciBvPVsib25LZXlEb3duIiwib25LZXlQcmVzcyIsIm9uS2V5VXAiXTt0LmtleWJvYXJkRXZlbnRzPW87dmFyIGk9WyJvbkZvY3VzIiwib25CbHVyIl07dC5mb2N1c0V2ZW50cz1pO3ZhciB1PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuW10uY29uY2F0KHIsYSxvLGkpLmZvckVhY2goKGZ1bmN0aW9uKHIpe2Vbcl0mJihuW3JdPWZ1bmN0aW9uKG4pe3JldHVybiB0P2Vbcl0obix0KHIpKTplW3JdKG4pfSl9KSksbn07dC5kZWZhdWx0PXV9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXBkZmpzTGlifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dm9pZCAwO3ZhciByPSgwLG4oMCkuY3JlYXRlQ29udGV4dCkobnVsbCk7dC5kZWZhdWx0PXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGE9T2JqZWN0LmtleXMoT2JqZWN0KG4pKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKGE9YS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkuZW51bWVyYWJsZX0pKSkpLGEuZm9yRWFjaCgoZnVuY3Rpb24odCl7cihlLHQsblt0XSl9KSl9cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBBcnJheT9lLmNvbmNhdCh0KTplfSksW10pLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSkuam9pbigiICIpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBhPXIobigwKSksbz1yKG4oMykpLGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jaGlsZHJlbixuPWUudHlwZTtyZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVhY3QtcGRmX19tZXNzYWdlIHJlYWN0LXBkZl9fbWVzc2FnZS0tIi5jb25jYXQobil9LHQpfTtpLnByb3BUeXBlcz17Y2hpbGRyZW46by5kZWZhdWx0Lm5vZGUsdHlwZTpvLmRlZmF1bHQub25lT2YoWyJlcnJvciIsImxvYWRpbmciLCJuby1kYXRhIl0pLmlzUmVxdWlyZWR9O3ZhciB1PWk7dC5kZWZhdWx0PXV9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD12b2lkIDA7dmFyIHI9bigzNikuUERGTGlua1NlcnZpY2U7dC5kZWZhdWx0PXJ9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVJlYWN0RE9NfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOSksYT1uKDEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBvPWEobigxMCkpLGk9YShuKDMxKSksdT1hKG4oMTgpKSxjPWEobigxNikpLHM9YShuKDIzKSksbD1hKG4oMTcpKSxmPWEobig1KSksZD1hKG4oMTEpKSxwPWEobig2KSksaD1hKG4oMikpLHY9YShuKDgpKSxnPWEobig3KSksbT1hKG4oNCkpLHk9cihuKDApKSxiPWEobigzKSksdz1hKG4oMjApKSx4PWEobigyNCkpLEU9cihuKDIxKSksXz1hKG4oMjIpKSxrPWEobigyNSkpLFA9YShuKDI2KSksUz1hKG4oMzcpKSxSPW4oMTIpLE89bigxMyksTD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIGUsbjsoMCxmLmRlZmF1bHQpKHRoaXMsdCk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkociksbz0wO288cjtvKyspYVtvXT1hcmd1bWVudHNbb107cmV0dXJuIG49KDAscC5kZWZhdWx0KSh0aGlzLChlPSgwLGguZGVmYXVsdCkodCkpLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGEpKSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJzdGF0ZSIse3BkZjpudWxsfSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJ2aWV3ZXIiLHtzY3JvbGxQYWdlSW50b1ZpZXc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYWdlTnVtYmVyLHI9bi5wcm9wcy5vbkl0ZW1DbGljaztpZihyKXIoe3BhZ2VOdW1iZXI6dH0pO2Vsc2V7dmFyIGE9bi5wYWdlc1t0LTFdO2E/YS5zY3JvbGxJbnRvVmlldygpOigwLFIud2Fybk9uRGV2KSgiV2FybmluZzogQW4gaW50ZXJuYWwgbGluayBsZWFkaW5nIHRvIHBhZ2UgIi5jb25jYXQodCwiIHdhcyBjbGlja2VkLCBidXQgbmVpdGhlciA8RG9jdW1lbnQ+IHdhcyBwcm92aWRlZCB3aXRoIG9uSXRlbUNsaWNrIG5vciBpdCB3YXMgYWJsZSB0byBmaW5kIHRoZSBwYWdlIHdpdGhpbiBpdHNlbGYuIEVpdGhlciBwcm92aWRlIG9uSXRlbUNsaWNrIHRvIDxEb2N1bWVudD4gYW5kIGhhbmRsZSBuYXZpZ2F0aW5nIGJ5IHlvdXJzZWxmIG9yIGVuc3VyZSB0aGF0IGFsbCBwYWdlcyBhcmUgcmVuZGVyZWQgd2l0aGluIDxEb2N1bWVudD4uIikpfX19KSwoMCxtLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkoKDAsZy5kZWZhdWx0KShuKSksImxpbmtTZXJ2aWNlIixuZXcgUC5kZWZhdWx0KSwoMCxtLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkoKDAsZy5kZWZhdWx0KShuKSksImxvYWREb2N1bWVudCIsKDAsbC5kZWZhdWx0KShjLmRlZmF1bHQubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LHIsYSxvLGksdSxsLGY7cmV0dXJuIGMuZGVmYXVsdC53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gdD1udWxsLGUucHJldj0xLGUubmV4dD00LG4uZmluZERvY3VtZW50U291cmNlKCk7Y2FzZSA0OnQ9ZS5zZW50LG4ub25Tb3VyY2VTdWNjZXNzKCksZS5uZXh0PTExO2JyZWFrO2Nhc2UgODplLnByZXY9OCxlLnQwPWUuY2F0Y2goMSksbi5vblNvdXJjZUVycm9yKGUudDApO2Nhc2UgMTE6aWYodCl7ZS5uZXh0PTEzO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIik7Y2FzZSAxMzpyZXR1cm4gbi5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGRmP3twZGY6bnVsbH06bnVsbH0pKSxyPW4ucHJvcHMsYT1yLm9wdGlvbnMsbz1yLm9uTG9hZFByb2dyZXNzLGk9ci5vblBhc3N3b3JkLGUucHJldj0xNSwoMCxSLmNhbmNlbFJ1bm5pbmdUYXNrKShuLnJ1bm5pbmdUYXNrKSwodT1FLmRlZmF1bHQuZ2V0RG9jdW1lbnQoKDAscy5kZWZhdWx0KSh7fSx0LGEpKSkub25QYXNzd29yZD1pLG8mJih1Lm9uUHJvZ3Jlc3M9byksbD0oMCxSLm1ha2VDYW5jZWxsYWJsZSkodS5wcm9taXNlKSxuLnJ1bm5pbmdUYXNrPWwsZS5uZXh0PTI0LGwucHJvbWlzZTtjYXNlIDI0OmY9ZS5zZW50LG4uc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBkZiYmZS5wZGYuZmluZ2VycHJpbnQ9PT1mLmZpbmdlcnByaW50P251bGw6e3BkZjpmfX0pLG4ub25Mb2FkU3VjY2VzcyksZS5uZXh0PTMxO2JyZWFrO2Nhc2UgMjg6ZS5wcmV2PTI4LGUudDE9ZS5jYXRjaCgxNSksbi5vbkxvYWRFcnJvcihlLnQxKTtjYXNlIDMxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzLFtbMSw4XSxbMTUsMjhdXSl9KSkpKSwoMCxtLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkoKDAsZy5kZWZhdWx0KShuKSksInNldHVwTGlua1NlcnZpY2UiLChmdW5jdGlvbigpe24ubGlua1NlcnZpY2Uuc2V0Vmlld2VyKG4udmlld2VyKTt2YXIgZT0oMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLmxpbmtTZXJ2aWNlLCJleHRlcm5hbExpbmtUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2goZS5wcm9wcy5leHRlcm5hbExpbmtUYXJnZXQpe2Nhc2UiX3NlbGYiOnJldHVybiAxO2Nhc2UiX2JsYW5rIjpyZXR1cm4gMjtjYXNlIl9wYXJlbnQiOnJldHVybiAzO2Nhc2UiX3RvcCI6cmV0dXJuIDQ7ZGVmYXVsdDpyZXR1cm4gMH19fSl9KSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJvblNvdXJjZVN1Y2Nlc3MiLChmdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMub25Tb3VyY2VTdWNjZXNzOygwLFIuY2FsbElmRGVmaW5lZCkoZSl9KSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJvblNvdXJjZUVycm9yIiwoZnVuY3Rpb24oZSl7aWYoISgwLFIuaXNDYW5jZWxFeGNlcHRpb24pKGUpKXsoMCxSLmVycm9yT25EZXYpKGUpO3ZhciB0PW4ucHJvcHMub25Tb3VyY2VFcnJvcjsoMCxSLmNhbGxJZkRlZmluZWQpKHQsZSl9fSkpLCgwLG0uZGVmYXVsdCkoKDAsZy5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKG4pKSwib25Mb2FkU3VjY2VzcyIsKGZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy5vbkxvYWRTdWNjZXNzLHQ9bi5zdGF0ZS5wZGY7KDAsUi5jYWxsSWZEZWZpbmVkKShlLHQpLG4ucGFnZXM9bmV3IEFycmF5KHQubnVtUGFnZXMpLG4ubGlua1NlcnZpY2Uuc2V0RG9jdW1lbnQodCl9KSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJvbkxvYWRFcnJvciIsKGZ1bmN0aW9uKGUpe2lmKCEoMCxSLmlzQ2FuY2VsRXhjZXB0aW9uKShlKSl7bi5zZXRTdGF0ZSh7cGRmOiExfSksKDAsUi5lcnJvck9uRGV2KShlKTt2YXIgdD1uLnByb3BzLm9uTG9hZEVycm9yOygwLFIuY2FsbElmRGVmaW5lZCkodCxlKX19KSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJmaW5kRG9jdW1lbnRTb3VyY2UiLCgwLGwuZGVmYXVsdCkoYy5kZWZhdWx0Lm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgdCxyLGEsbyxsO3JldHVybiBjLmRlZmF1bHQud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYodD1uLnByb3BzLmZpbGUpe2UubmV4dD0zO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIixudWxsKTtjYXNlIDM6aWYoInN0cmluZyIhPXR5cGVvZiB0KXtlLm5leHQ9OTticmVha31pZighKDAsUi5pc0RhdGFVUkkpKHQpKXtlLm5leHQ9NzticmVha31yZXR1cm4gcj0oMCxSLmRhdGFVUkl0b1VpbnQ4QXJyYXkpKHQpLGUuYWJydXB0KCJyZXR1cm4iLHtkYXRhOnJ9KTtjYXNlIDc6cmV0dXJuKDAsUi5kaXNwbGF5Q09SU1dhcm5pbmcpKCksZS5hYnJ1cHQoInJldHVybiIse3VybDp0fSk7Y2FzZSA5OmlmKCEodCBpbnN0YW5jZW9mIEUuUERGRGF0YVJhbmdlVHJhbnNwb3J0KSl7ZS5uZXh0PTExO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix7cmFuZ2U6dH0pO2Nhc2UgMTE6aWYoISgwLFIuaXNBcnJheUJ1ZmZlcikodCkpe2UubmV4dD0xMzticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIse2RhdGE6dH0pO2Nhc2UgMTM6aWYoIVIuaXNCcm93c2VyKXtlLm5leHQ9MTk7YnJlYWt9aWYoISgwLFIuaXNCbG9iKSh0KSYmISgwLFIuaXNGaWxlKSh0KSl7ZS5uZXh0PTE5O2JyZWFrfXJldHVybiBlLm5leHQ9MTcsKDAsUi5sb2FkRnJvbUZpbGUpKHQpO2Nhc2UgMTc6cmV0dXJuIGUudDA9ZS5zZW50LGUuYWJydXB0KCJyZXR1cm4iLHtkYXRhOmUudDB9KTtjYXNlIDE5OmlmKCJvYmplY3QiPT09KDAsdS5kZWZhdWx0KSh0KSl7ZS5uZXh0PTIxO2JyZWFrfXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZmlsZSwgbmVlZCBlaXRoZXIgVWludDhBcnJheSwgc3RyaW5nIG9yIGEgcGFyYW1ldGVyIG9iamVjdCIpO2Nhc2UgMjE6aWYodC51cmx8fHQuZGF0YXx8dC5yYW5nZSl7ZS5uZXh0PTIzO2JyZWFrfXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmwiKTtjYXNlIDIzOmlmKCJzdHJpbmciIT10eXBlb2YgdC51cmwpe2UubmV4dD0yOTticmVha31pZighKDAsUi5pc0RhdGFVUkkpKHQudXJsKSl7ZS5uZXh0PTI4O2JyZWFrfXJldHVybiBhPXQudXJsLG89KDAsaS5kZWZhdWx0KSh0LFsidXJsIl0pLGw9KDAsUi5kYXRhVVJJdG9VaW50OEFycmF5KShhKSxlLmFicnVwdCgicmV0dXJuIiwoMCxzLmRlZmF1bHQpKHtkYXRhOmx9LG8pKTtjYXNlIDI4OigwLFIuZGlzcGxheUNPUlNXYXJuaW5nKSgpO2Nhc2UgMjk6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHQpO2Nhc2UgMzA6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKSksKDAsbS5kZWZhdWx0KSgoMCxnLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkobikpLCJyZWdpc3RlclBhZ2UiLChmdW5jdGlvbihlLHQpe24ucGFnZXNbZV09dH0pKSwoMCxtLmRlZmF1bHQpKCgwLGcuZGVmYXVsdCkoKDAsZy5kZWZhdWx0KShuKSksInVucmVnaXN0ZXJQYWdlIiwoZnVuY3Rpb24oZSl7ZGVsZXRlIG4ucGFnZXNbZV19KSksbn1yZXR1cm4oMCx2LmRlZmF1bHQpKHQsZSksKDAsZC5kZWZhdWx0KSh0LFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxvYWREb2N1bWVudCgpLHRoaXMuc2V0dXBMaW5rU2VydmljZSgpfX0se2tleToiY29tcG9uZW50RGlkVXBkYXRlIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnByb3BzLmZpbGUhPT1lLmZpbGUmJnRoaXMubG9hZERvY3VtZW50KCl9fSx7a2V5OiJjb21wb25lbnRXaWxsVW5tb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXsoMCxSLmNhbmNlbFJ1bm5pbmdUYXNrKSh0aGlzLnJ1bm5pbmdUYXNrKX19LHtrZXk6InJlbmRlckNoaWxkcmVuIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuY2hpbGRyZW47cmV0dXJuIHkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uZGVmYXVsdC5Qcm92aWRlcix7dmFsdWU6dGhpcy5jaGlsZENvbnRleHR9LGUpfX0se2tleToicmVuZGVyQ29udGVudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmZpbGUsdD10aGlzLnN0YXRlLnBkZjtpZighZSl7dmFyIG49dGhpcy5wcm9wcy5ub0RhdGE7cmV0dXJuIHkuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGsuZGVmYXVsdCx7dHlwZToibm8tZGF0YSJ9LCJmdW5jdGlvbiI9PXR5cGVvZiBuP24oKTpuKX1pZihudWxsPT09dCl7dmFyIHI9dGhpcy5wcm9wcy5sb2FkaW5nO3JldHVybiB5LmRlZmF1bHQuY3JlYXRlRWxlbWVudChrLmRlZmF1bHQse3R5cGU6ImxvYWRpbmcifSwiZnVuY3Rpb24iPT10eXBlb2Ygcj9yKCk6cil9aWYoITE9PT10KXt2YXIgYT10aGlzLnByb3BzLmVycm9yO3JldHVybiB5LmRlZmF1bHQuY3JlYXRlRWxlbWVudChrLmRlZmF1bHQse3R5cGU6ImVycm9yIn0sImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEpfXJldHVybiB0aGlzLnJlbmRlckNoaWxkcmVuKCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuY2xhc3NOYW1lLG49ZS5pbnB1dFJlZjtyZXR1cm4geS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImRpdiIsKDAsby5kZWZhdWx0KSh7Y2xhc3NOYW1lOigwLHguZGVmYXVsdCkoInJlYWN0LXBkZl9fRG9jdW1lbnQiLHQpLHJlZjpufSx0aGlzLmV2ZW50UHJvcHMpLHRoaXMucmVuZGVyQ29udGVudCgpKX19LHtrZXk6ImNoaWxkQ29udGV4dCIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5saW5rU2VydmljZSx0PXRoaXMucmVnaXN0ZXJQYWdlLG49dGhpcy51bnJlZ2lzdGVyUGFnZSxyPXRoaXMucHJvcHMsYT1yLnJlbmRlck1vZGUsbz1yLnJvdGF0ZTtyZXR1cm57bGlua1NlcnZpY2U6ZSxwZGY6dGhpcy5zdGF0ZS5wZGYscmVnaXN0ZXJQYWdlOnQscmVuZGVyTW9kZTphLHJvdGF0ZTpvLHVucmVnaXN0ZXJQYWdlOm59fX0se2tleToiZXZlbnRQcm9wcyIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4oMCx3LmRlZmF1bHQpKHRoaXMucHJvcHMsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3RhdGUucGRmfSkpfX1dKSx0fSh5LlB1cmVDb21wb25lbnQpO3QuZGVmYXVsdD1MLEwuZGVmYXVsdFByb3BzPXtlcnJvcjoiRmFpbGVkIHRvIGxvYWQgUERGIGZpbGUuIixsb2FkaW5nOiJMb2FkaW5nIFBERuKApiIsbm9EYXRhOiJObyBQREYgZmlsZSBzcGVjaWZpZWQuIixvblBhc3N3b3JkOmZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQpe2Nhc2UgUy5kZWZhdWx0Lk5FRURfUEFTU1dPUkQ6ZShwcm9tcHQoIkVudGVyIHRoZSBwYXNzd29yZCB0byBvcGVuIHRoaXMgUERGIGZpbGUuIikpO2JyZWFrO2Nhc2UgUy5kZWZhdWx0LklOQ09SUkVDVF9QQVNTV09SRDplKHByb21wdCgiSW52YWxpZCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4iKSl9fX0sTC5wcm9wVHlwZXM9KDAscy5kZWZhdWx0KSh7Y2hpbGRyZW46Yi5kZWZhdWx0Lm5vZGUsY2xhc3NOYW1lOk8uaXNDbGFzc05hbWUsZXJyb3I6Yi5kZWZhdWx0Lm5vZGUsZmlsZTpSLmlzRmlsZSxpbnB1dFJlZjpiLmRlZmF1bHQuZnVuYyxsb2FkaW5nOmIuZGVmYXVsdC5ub2RlLG5vRGF0YTpiLmRlZmF1bHQubm9kZSxvbkl0ZW1DbGljazpiLmRlZmF1bHQuZnVuYyxvbkxvYWRFcnJvcjpiLmRlZmF1bHQuZnVuYyxvbkxvYWRQcm9ncmVzczpiLmRlZmF1bHQuZnVuYyxvbkxvYWRTdWNjZXNzOmIuZGVmYXVsdC5mdW5jLG9uUGFzc3dvcmQ6Yi5kZWZhdWx0LmZ1bmMsb25Tb3VyY2VFcnJvcjpiLmRlZmF1bHQuZnVuYyxvblNvdXJjZVN1Y2Nlc3M6Yi5kZWZhdWx0LmZ1bmMscm90YXRlOmIuZGVmYXVsdC5udW1iZXJ9LCgwLE8uZXZlbnRzUHJvcHMpKCkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOSksYT1uKDEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9dC5QYWdlSW50ZXJuYWw9dm9pZCAwO3ZhciBvPWEobigyMykpLGk9YShuKDEwKSksdT1hKG4oMTYpKSxjPWEobigxNykpLHM9YShuKDUpKSxsPWEobigxMSkpLGY9YShuKDYpKSxkPWEobigyKSkscD1hKG4oOCkpLGg9YShuKDcpKSx2PWEobig0KSksZz1yKG4oMCkpLG09YShuKDMpKSx5PWEobigyMCkpLGI9YShuKDI0KSksdz1hKG4oMjIpKSx4PWEobigxNSkpLEU9YShuKDI1KSksXz1hKG4oNDYpKSxrPWEobig0NykpLFA9YShuKDQ4KSksUz1hKG4oNTQpKSxSPW4oMTIpLE89bigxMyksTD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIGUsbjsoMCxzLmRlZmF1bHQpKHRoaXMsdCk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkociksbz0wO288cjtvKyspYVtvXT1hcmd1bWVudHNbb107cmV0dXJuIG49KDAsZi5kZWZhdWx0KSh0aGlzLChlPSgwLGQuZGVmYXVsdCkodCkpLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGEpKSksKDAsdi5kZWZhdWx0KSgoMCxoLmRlZmF1bHQpKCgwLGguZGVmYXVsdCkobikpLCJzdGF0ZSIse3BhZ2U6bnVsbH0pLCgwLHYuZGVmYXVsdCkoKDAsaC5kZWZhdWx0KSgoMCxoLmRlZmF1bHQpKG4pKSwib25Mb2FkU3VjY2VzcyIsKGZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUub25Mb2FkU3VjY2VzcyxyPWUucmVnaXN0ZXJQYWdlLGE9bi5zdGF0ZS5wYWdlOygwLFIuY2FsbElmRGVmaW5lZCkodCwoMCxSLm1ha2VQYWdlQ2FsbGJhY2spKGEsbi5zY2FsZSkpLCgwLFIuY2FsbElmRGVmaW5lZCkocixuLnBhZ2VJbmRleCxuLnJlZil9KSksKDAsdi5kZWZhdWx0KSgoMCxoLmRlZmF1bHQpKCgwLGguZGVmYXVsdCkobikpLCJvbkxvYWRFcnJvciIsKGZ1bmN0aW9uKGUpe2lmKCEoMCxSLmlzQ2FuY2VsRXhjZXB0aW9uKShlKSl7KDAsUi5lcnJvck9uRGV2KShlKTt2YXIgdD1uLnByb3BzLm9uTG9hZEVycm9yOygwLFIuY2FsbElmRGVmaW5lZCkodCxlKX19KSksKDAsdi5kZWZhdWx0KSgoMCxoLmRlZmF1bHQpKCgwLGguZGVmYXVsdCkobikpLCJsb2FkUGFnZSIsKDAsYy5kZWZhdWx0KSh1LmRlZmF1bHQubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LHIsYSxvO3JldHVybiB1LmRlZmF1bHQud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYodD1uLnByb3BzLnBkZixyPW4uZ2V0UGFnZU51bWJlcigpKXtlLm5leHQ9NDticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIpO2Nhc2UgNDpyZXR1cm4gbi5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFnZT97cGFnZTpudWxsfTpudWxsfSkpLGUucHJldj01LGE9KDAsUi5tYWtlQ2FuY2VsbGFibGUpKHQuZ2V0UGFnZShyKSksbi5ydW5uaW5nVGFzaz1hLGUubmV4dD0xMCxhLnByb21pc2U7Y2FzZSAxMDpvPWUuc2VudCxuLnNldFN0YXRlKHtwYWdlOm99LG4ub25Mb2FkU3VjY2VzcyksZS5uZXh0PTE4O2JyZWFrO2Nhc2UgMTQ6ZS5wcmV2PTE0LGUudDA9ZS5jYXRjaCg1KSxuLnNldFN0YXRlKHtwYWdlOiExfSksbi5vbkxvYWRFcnJvcihlLnQwKTtjYXNlIDE4OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzLFtbNSwxNF1dKX0pKSkpLG59cmV0dXJuKDAscC5kZWZhdWx0KSh0LGUpLCgwLGwuZGVmYXVsdCkodCxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMucHJvcHMucGRmKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGxvYWQgYSBwYWdlLCBidXQgbm8gZG9jdW1lbnQgd2FzIHNwZWNpZmllZC4iKTt0aGlzLmxvYWRQYWdlKCl9fSx7a2V5OiJjb21wb25lbnREaWRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucHJvcHMucGRmO2lmKGUucGRmJiZ0IT09ZS5wZGZ8fHRoaXMuZ2V0UGFnZU51bWJlcigpIT09dGhpcy5nZXRQYWdlTnVtYmVyKGUpKXt2YXIgbj10aGlzLnByb3BzLnVucmVnaXN0ZXJQYWdlOygwLFIuY2FsbElmRGVmaW5lZCkobix0aGlzLmdldFBhZ2VJbmRleChlKSksdGhpcy5sb2FkUGFnZSgpfX19LHtrZXk6ImNvbXBvbmVudFdpbGxVbm1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMudW5yZWdpc3RlclBhZ2U7KDAsUi5jYWxsSWZEZWZpbmVkKShlLHRoaXMucGFnZUluZGV4KSwoMCxSLmNhbmNlbFJ1bm5pbmdUYXNrKSh0aGlzLnJ1bm5pbmdUYXNrKX19LHtrZXk6ImdldFBhZ2VJbmRleCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5wcm9wcztyZXR1cm4oMCxSLmlzUHJvdmlkZWQpKGUucGFnZU51bWJlcik/ZS5wYWdlTnVtYmVyLTE6KDAsUi5pc1Byb3ZpZGVkKShlLnBhZ2VJbmRleCk/ZS5wYWdlSW5kZXg6bnVsbH19LHtrZXk6ImdldFBhZ2VOdW1iZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMucHJvcHM7cmV0dXJuKDAsUi5pc1Byb3ZpZGVkKShlLnBhZ2VOdW1iZXIpP2UucGFnZU51bWJlcjooMCxSLmlzUHJvdmlkZWQpKGUucGFnZUluZGV4KT9lLnBhZ2VJbmRleCsxOm51bGx9fSx7a2V5OiJyZW5kZXJNYWluTGF5ZXIiLHZhbHVlOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMucHJvcHMucmVuZGVyTW9kZSl7Y2FzZSJub25lIjpyZXR1cm4gbnVsbDtjYXNlInN2ZyI6cmV0dXJuIGcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGsuZGVmYXVsdCx7a2V5OiIiLmNvbmNhdCh0aGlzLnBhZ2VLZXlOb1NjYWxlLCJfc3ZnIil9KTtjYXNlImNhbnZhcyI6ZGVmYXVsdDpyZXR1cm4gZy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5kZWZhdWx0LHtrZXk6IiIuY29uY2F0KHRoaXMucGFnZUtleSwiX2NhbnZhcyIpfSl9fX0se2tleToicmVuZGVyVGV4dExheWVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMucmVuZGVyVGV4dExheWVyO3JldHVybiBlP2cuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFAuZGVmYXVsdCx7a2V5OiIiLmNvbmNhdCh0aGlzLnBhZ2VLZXksIl90ZXh0Iil9KTpudWxsfX0se2tleToicmVuZGVyQW5ub3RhdGlvbkxheWVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMucmVuZGVyQW5ub3RhdGlvbkxheWVyO3JldHVybiBlP2cuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFMuZGVmYXVsdCx7a2V5OiIiLmNvbmNhdCh0aGlzLnBhZ2VLZXksIl9hbm5vdGF0aW9ucyIpfSk6bnVsbH19LHtrZXk6InJlbmRlckNoaWxkcmVuIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuY2hpbGRyZW47cmV0dXJuIGcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHguZGVmYXVsdC5Qcm92aWRlcix7dmFsdWU6dGhpcy5jaGlsZENvbnRleHR9LHRoaXMucmVuZGVyTWFpbkxheWVyKCksdGhpcy5yZW5kZXJUZXh0TGF5ZXIoKSx0aGlzLnJlbmRlckFubm90YXRpb25MYXllcigpLGUpfX0se2tleToicmVuZGVyQ29udGVudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhZ2VOdW1iZXIsdD10aGlzLnByb3BzLnBkZixuPXRoaXMuc3RhdGUucGFnZTtpZighZSl7dmFyIHI9dGhpcy5wcm9wcy5ub0RhdGE7cmV0dXJuIGcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEUuZGVmYXVsdCx7dHlwZToibm8tZGF0YSJ9LCJmdW5jdGlvbiI9PXR5cGVvZiByP3IoKTpyKX1pZihudWxsPT09dHx8bnVsbD09PW4pe3ZhciBhPXRoaXMucHJvcHMubG9hZGluZztyZXR1cm4gZy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRS5kZWZhdWx0LHt0eXBlOiJsb2FkaW5nIn0sImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEpfWlmKCExPT09dHx8ITE9PT1uKXt2YXIgbz10aGlzLnByb3BzLmVycm9yO3JldHVybiBnLmRlZmF1bHQuY3JlYXRlRWxlbWVudChFLmRlZmF1bHQse3R5cGU6ImVycm9yIn0sImZ1bmN0aW9uIj09dHlwZW9mIG8/bygpOm8pfXJldHVybiB0aGlzLnJlbmRlckNoaWxkcmVuKCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucGFnZU51bWJlcixuPXRoaXMucHJvcHMuY2xhc3NOYW1lO3JldHVybiBnLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZGl2IiwoMCxpLmRlZmF1bHQpKHtjbGFzc05hbWU6KDAsYi5kZWZhdWx0KSgicmVhY3QtcGRmX19QYWdlIixuKSxyZWY6ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcy5pbnB1dFJlZjtuJiZuKHQpLGUucmVmPXR9LHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSwiZGF0YS1wYWdlLW51bWJlciI6dH0sdGhpcy5ldmVudFByb3BzKSx0aGlzLnJlbmRlckNvbnRlbnQoKSl9fSx7a2V5OiJjaGlsZENvbnRleHQiLGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGUucGFnZTtpZighZSlyZXR1cm57fTt2YXIgdD10aGlzLnByb3BzO3JldHVybntjdXN0b21UZXh0UmVuZGVyZXI6dC5jdXN0b21UZXh0UmVuZGVyZXIsb25HZXRBbm5vdGF0aW9uc0Vycm9yOnQub25HZXRBbm5vdGF0aW9uc0Vycm9yLG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzOnQub25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3Msb25HZXRUZXh0RXJyb3I6dC5vbkdldFRleHRFcnJvcixvbkdldFRleHRTdWNjZXNzOnQub25HZXRUZXh0U3VjY2VzcyxvblJlbmRlckFubm90YXRpb25MYXllckVycm9yOnQub25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvcixvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3M6dC5vblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3Msb25SZW5kZXJFcnJvcjp0Lm9uUmVuZGVyRXJyb3Isb25SZW5kZXJTdWNjZXNzOnQub25SZW5kZXJTdWNjZXNzLHBhZ2U6ZSxyZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOnQucmVuZGVySW50ZXJhY3RpdmVGb3Jtcyxyb3RhdGU6dGhpcy5yb3RhdGUsc2NhbGU6dGhpcy5zY2FsZX19fSx7a2V5OiJwYWdlSW5kZXgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBhZ2VJbmRleCgpfX0se2tleToicGFnZU51bWJlciIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGFnZU51bWJlcigpfX0se2tleToicm90YXRlIixnZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnJvdGF0ZTtpZigoMCxSLmlzUHJvdmlkZWQpKGUpKXJldHVybiBlO3ZhciB0PXRoaXMuc3RhdGUucGFnZTtyZXR1cm4gdD90LnJvdGF0ZTpudWxsfX0se2tleToic2NhbGUiLGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGUucGFnZTtpZighZSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLnByb3BzLG49dC5zY2FsZSxyPXQud2lkdGgsYT10LmhlaWdodCxvPXRoaXMucm90YXRlLGk9MSx1PW51bGw9PT1uPzE6bjtpZihyfHxhKXt2YXIgYz1lLmdldFZpZXdwb3J0KHtzY2FsZToxLHJvdGF0aW9uOm99KTtpPXI/ci9jLndpZHRoOmEvYy5oZWlnaHR9cmV0dXJuIHUqaX19LHtrZXk6ImV2ZW50UHJvcHMiLGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuKDAseS5kZWZhdWx0KSh0aGlzLnByb3BzLChmdW5jdGlvbigpe3ZhciB0PWUuc3RhdGUucGFnZTtyZXR1cm4gdD8oMCxSLm1ha2VQYWdlQ2FsbGJhY2spKHQsZS5zY2FsZSk6dH0pKX19LHtrZXk6InBhZ2VLZXkiLGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGUucGFnZTtyZXR1cm4iIi5jb25jYXQoZS5wYWdlSW5kZXgsIkAiKS5jb25jYXQodGhpcy5zY2FsZSwiLyIpLmNvbmNhdCh0aGlzLnJvdGF0ZSl9fSx7a2V5OiJwYWdlS2V5Tm9TY2FsZSIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zdGF0ZS5wYWdlO3JldHVybiIiLmNvbmNhdChlLnBhZ2VJbmRleCwiLyIpLmNvbmNhdCh0aGlzLnJvdGF0ZSl9fV0pLHR9KGcuUHVyZUNvbXBvbmVudCk7dC5QYWdlSW50ZXJuYWw9TCxMLmRlZmF1bHRQcm9wcz17ZXJyb3I6IkZhaWxlZCB0byBsb2FkIHRoZSBwYWdlLiIsbG9hZGluZzoiTG9hZGluZyBwYWdl4oCmIixub0RhdGE6Ik5vIHBhZ2Ugc3BlY2lmaWVkLiIscmVuZGVyQW5ub3RhdGlvbkxheWVyOiEwLHJlbmRlckludGVyYWN0aXZlRm9ybXM6ITEscmVuZGVyTW9kZToiY2FudmFzIixyZW5kZXJUZXh0TGF5ZXI6ITAsc2NhbGU6MX0sTC5wcm9wVHlwZXM9KDAsby5kZWZhdWx0KSh7Y2hpbGRyZW46bS5kZWZhdWx0Lm5vZGUsY2xhc3NOYW1lOk8uaXNDbGFzc05hbWUsY3VzdG9tVGV4dFJlbmRlcmVyOm0uZGVmYXVsdC5mdW5jLGVycm9yOm0uZGVmYXVsdC5ub2RlLGhlaWdodDptLmRlZmF1bHQubnVtYmVyLGlucHV0UmVmOm0uZGVmYXVsdC5mdW5jLGxvYWRpbmc6bS5kZWZhdWx0Lm5vZGUsbm9EYXRhOm0uZGVmYXVsdC5ub2RlLG9uR2V0VGV4dEVycm9yOm0uZGVmYXVsdC5mdW5jLG9uR2V0VGV4dFN1Y2Nlc3M6bS5kZWZhdWx0LmZ1bmMsb25Mb2FkRXJyb3I6bS5kZWZhdWx0LmZ1bmMsb25Mb2FkU3VjY2VzczptLmRlZmF1bHQuZnVuYyxvblJlbmRlckVycm9yOm0uZGVmYXVsdC5mdW5jLG9uUmVuZGVyU3VjY2VzczptLmRlZmF1bHQuZnVuYyxwYWdlSW5kZXg6Ty5pc1BhZ2VJbmRleCxwYWdlTnVtYmVyOk8uaXNQYWdlTnVtYmVyLHBkZjpPLmlzUGRmLHJlZ2lzdGVyUGFnZTptLmRlZmF1bHQuZnVuYyxyZW5kZXJBbm5vdGF0aW9uTGF5ZXI6bS5kZWZhdWx0LmJvb2wscmVuZGVySW50ZXJhY3RpdmVGb3JtczptLmRlZmF1bHQuYm9vbCxyZW5kZXJNb2RlOk8uaXNSZW5kZXJNb2RlLHJlbmRlclRleHRMYXllcjptLmRlZmF1bHQuYm9vbCxyb3RhdGU6Ty5pc1JvdGF0ZSxzY2FsZTptLmRlZmF1bHQubnVtYmVyLHVucmVnaXN0ZXJQYWdlOm0uZGVmYXVsdC5mdW5jLHdpZHRoOm0uZGVmYXVsdC5udW1iZXJ9LCgwLE8uZXZlbnRzUHJvcHMpKCkpO3ZhciBUPWcuZGVmYXVsdC5mb3J3YXJkUmVmKChmdW5jdGlvbihlLHQpe3JldHVybiBnLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh3LmRlZmF1bHQuQ29uc3VtZXIsbnVsbCwoZnVuY3Rpb24obil7cmV0dXJuIGcuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEwsKDAsaS5kZWZhdWx0KSh7cmVmOnR9LG4sZSx7cmVuZGVyQW5ub3RhdGlvbkxheWVyOnZvaWQgMCE9PWUucmVuZGVyQW5ub3RhdGlvbkxheWVyP2UucmVuZGVyQW5ub3RhdGlvbkxheWVyOmUucmVuZGVyQW5ub3RhdGlvbnN9KSl9KSl9KSk7dC5kZWZhdWx0PVR9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big2Mil9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDMyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLGEsbz1yKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3IoYT0wO2E8aS5sZW5ndGg7YSsrKW49aVthXSx0LmluZGV4T2Yobik+PTB8fE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYob1tuXT1lW25dKX1yZXR1cm4gb319LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSlyZXR1cm57fTt2YXIgbixyLGE9e30sbz1PYmplY3Qua2V5cyhlKTtmb3Iocj0wO3I8by5sZW5ndGg7cisrKW49b1tyXSx0LmluZGV4T2Yobik+PTB8fChhW25dPWVbbl0pO3JldHVybiBhfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1PYmplY3QucHJvdG90eXBlLG49dC5oYXNPd25Qcm9wZXJ0eSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGE9ci5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLG89ci5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixpPXIudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KGUsdCxuLHIpe3ZhciBhPXQmJnQucHJvdG90eXBlIGluc3RhbmNlb2YgbD90Omwsbz1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlKSxpPW5ldyBFKHJ8fFtdKTtyZXR1cm4gby5faW52b2tlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ic3VzcGVuZGVkU3RhcnQiO3JldHVybiBmdW5jdGlvbihhLG8pe2lmKCJleGVjdXRpbmciPT09cil0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZigiY29tcGxldGVkIj09PXIpe2lmKCJ0aHJvdyI9PT1hKXRocm93IG87cmV0dXJuIGsoKX1mb3Iobi5tZXRob2Q9YSxuLmFyZz1vOzspe3ZhciBpPW4uZGVsZWdhdGU7aWYoaSl7dmFyIHU9YihpLG4pO2lmKHUpe2lmKHU9PT1zKWNvbnRpbnVlO3JldHVybiB1fX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYoInN1c3BlbmRlZFN0YXJ0Ij09PXIpdGhyb3cgcj0iY29tcGxldGVkIixuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlInJldHVybiI9PT1uLm1ldGhvZCYmbi5hYnJ1cHQoInJldHVybiIsbi5hcmcpO3I9ImV4ZWN1dGluZyI7dmFyIGw9YyhlLHQsbik7aWYoIm5vcm1hbCI9PT1sLnR5cGUpe2lmKHI9bi5kb25lPyJjb21wbGV0ZWQiOiJzdXNwZW5kZWRZaWVsZCIsbC5hcmc9PT1zKWNvbnRpbnVlO3JldHVybnt2YWx1ZTpsLmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PWwudHlwZSYmKHI9ImNvbXBsZXRlZCIsbi5tZXRob2Q9InRocm93IixuLmFyZz1sLmFyZyl9fX0oZSxuLGkpLG99ZnVuY3Rpb24gYyhlLHQsbil7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzplLmNhbGwodCxuKX19Y2F0Y2goZSl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6ZX19fWUud3JhcD11O3ZhciBzPXt9O2Z1bmN0aW9uIGwoKXt9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBkKCl7fXZhciBwPXt9O3BbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIGg9T2JqZWN0LmdldFByb3RvdHlwZU9mLHY9aCYmaChoKF8oW10pKSk7diYmdiE9PXQmJm4uY2FsbCh2LGEpJiYocD12KTt2YXIgZz1kLnByb3RvdHlwZT1sLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHApO2Z1bmN0aW9uIG0oZSl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnZva2UodCxlKX19KSl9ZnVuY3Rpb24geShlKXt2YXIgdDt0aGlzLl9pbnZva2U9ZnVuY3Rpb24ocixhKXtmdW5jdGlvbiBvKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG8peyFmdW5jdGlvbiB0KHIsYSxvLGkpe3ZhciB1PWMoZVtyXSxlLGEpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBzPXUuYXJnLGw9cy52YWx1ZTtyZXR1cm4gbCYmIm9iamVjdCI9PXR5cGVvZiBsJiZuLmNhbGwobCwiX19hd2FpdCIpP1Byb21pc2UucmVzb2x2ZShsLl9fYXdhaXQpLnRoZW4oKGZ1bmN0aW9uKGUpe3QoIm5leHQiLGUsbyxpKX0pLChmdW5jdGlvbihlKXt0KCJ0aHJvdyIsZSxvLGkpfSkpOlByb21pc2UucmVzb2x2ZShsKS50aGVuKChmdW5jdGlvbihlKXtzLnZhbHVlPWUsbyhzKX0pLChmdW5jdGlvbihlKXtyZXR1cm4gdCgidGhyb3ciLGUsbyxpKX0pKX1pKHUuYXJnKX0ocixhLHQsbyl9KSl9cmV0dXJuIHQ9dD90LnRoZW4obyxvKTpvKCl9fWZ1bmN0aW9uIGIoZSx0KXt2YXIgbj1lLml0ZXJhdG9yW3QubWV0aG9kXTtpZih2b2lkIDA9PT1uKXtpZih0LmRlbGVnYXRlPW51bGwsInRocm93Ij09PXQubWV0aG9kKXtpZihlLml0ZXJhdG9yLnJldHVybiYmKHQubWV0aG9kPSJyZXR1cm4iLHQuYXJnPXZvaWQgMCxiKGUsdCksInRocm93Ij09PXQubWV0aG9kKSlyZXR1cm4gczt0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKX1yZXR1cm4gc312YXIgcj1jKG4sZS5pdGVyYXRvcix0LmFyZyk7aWYoInRocm93Ij09PXIudHlwZSlyZXR1cm4gdC5tZXRob2Q9InRocm93Iix0LmFyZz1yLmFyZyx0LmRlbGVnYXRlPW51bGwsczt2YXIgYT1yLmFyZztyZXR1cm4gYT9hLmRvbmU/KHRbZS5yZXN1bHROYW1lXT1hLnZhbHVlLHQubmV4dD1lLm5leHRMb2MsInJldHVybiIhPT10Lm1ldGhvZCYmKHQubWV0aG9kPSJuZXh0Iix0LmFyZz12b2lkIDApLHQuZGVsZWdhdGU9bnVsbCxzKTphOih0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksdC5kZWxlZ2F0ZT1udWxsLHMpfWZ1bmN0aW9uIHcoZSl7dmFyIHQ9e3RyeUxvYzplWzBdfTsxIGluIGUmJih0LmNhdGNoTG9jPWVbMV0pLDIgaW4gZSYmKHQuZmluYWxseUxvYz1lWzJdLHQuYWZ0ZXJMb2M9ZVszXSksdGhpcy50cnlFbnRyaWVzLnB1c2godCl9ZnVuY3Rpb24geChlKXt2YXIgdD1lLmNvbXBsZXRpb258fHt9O3QudHlwZT0ibm9ybWFsIixkZWxldGUgdC5hcmcsZS5jb21wbGV0aW9uPXR9ZnVuY3Rpb24gRShlKXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sZS5mb3JFYWNoKHcsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gXyhlKXtpZihlKXt2YXIgdD1lW2FdO2lmKHQpcmV0dXJuIHQuY2FsbChlKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5uZXh0KXJldHVybiBlO2lmKCFpc05hTihlLmxlbmd0aCkpe3ZhciByPS0xLG89ZnVuY3Rpb24gdCgpe2Zvcig7KytyPGUubGVuZ3RoOylpZihuLmNhbGwoZSxyKSlyZXR1cm4gdC52YWx1ZT1lW3JdLHQuZG9uZT0hMSx0O3JldHVybiB0LnZhbHVlPXZvaWQgMCx0LmRvbmU9ITAsdH07cmV0dXJuIG8ubmV4dD1vfX1yZXR1cm57bmV4dDprfX1mdW5jdGlvbiBrKCl7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1yZXR1cm4gZi5wcm90b3R5cGU9Zy5jb25zdHJ1Y3Rvcj1kLGQuY29uc3RydWN0b3I9ZixkW2ldPWYuZGlzcGxheU5hbWU9IkdlbmVyYXRvckZ1bmN0aW9uIixlLmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3I7cmV0dXJuISF0JiYodD09PWZ8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0odC5kaXNwbGF5TmFtZXx8dC5uYW1lKSl9LGUubWFyaz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLGQpOihlLl9fcHJvdG9fXz1kLGkgaW4gZXx8KGVbaV09IkdlbmVyYXRvckZ1bmN0aW9uIikpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZyksZX0sZS5hd3JhcD1mdW5jdGlvbihlKXtyZXR1cm57X19hd2FpdDplfX0sbSh5LnByb3RvdHlwZSkseS5wcm90b3R5cGVbb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5Bc3luY0l0ZXJhdG9yPXksZS5hc3luYz1mdW5jdGlvbih0LG4scixhKXt2YXIgbz1uZXcgeSh1KHQsbixyLGEpKTtyZXR1cm4gZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP286by5uZXh0KCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZT9lLnZhbHVlOm8ubmV4dCgpfSkpfSxtKGcpLGdbaV09IkdlbmVyYXRvciIsZ1thXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxnLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LGUua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2gobik7cmV0dXJuIHQucmV2ZXJzZSgpLGZ1bmN0aW9uIG4oKXtmb3IoO3QubGVuZ3RoOyl7dmFyIHI9dC5wb3AoKTtpZihyIGluIGUpcmV0dXJuIG4udmFsdWU9cixuLmRvbmU9ITEsbn1yZXR1cm4gbi5kb25lPSEwLG59fSxlLnZhbHVlcz1fLEUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFLHJlc2V0OmZ1bmN0aW9uKGUpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PXZvaWQgMCx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz12b2lkIDAsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goeCksIWUpZm9yKHZhciB0IGluIHRoaXMpInQiPT09dC5jaGFyQXQoMCkmJm4uY2FsbCh0aGlzLHQpJiYhaXNOYU4oK3Quc2xpY2UoMSkpJiYodGhpc1t0XT12b2lkIDApfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciBlPXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oZSl7aWYodGhpcy5kb25lKXRocm93IGU7dmFyIHQ9dGhpcztmdW5jdGlvbiByKG4scil7cmV0dXJuIGkudHlwZT0idGhyb3ciLGkuYXJnPWUsdC5uZXh0PW4sciYmKHQubWV0aG9kPSJuZXh0Iix0LmFyZz12b2lkIDApLCEhcn1mb3IodmFyIGE9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2E+PTA7LS1hKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbYV0saT1vLmNvbXBsZXRpb247aWYoInJvb3QiPT09by50cnlMb2MpcmV0dXJuIHIoImVuZCIpO2lmKG8udHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PW4uY2FsbChvLCJjYXRjaExvYyIpLGM9bi5jYWxsKG8sImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8by5jYXRjaExvYylyZXR1cm4gcihvLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8by5maW5hbGx5TG9jKXJldHVybiByKG8uZmluYWxseUxvYyl9ZWxzZSBpZih1KXtpZih0aGlzLnByZXY8by5jYXRjaExvYylyZXR1cm4gcihvLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8by5maW5hbGx5TG9jKXJldHVybiByKG8uZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7cj49MDstLXIpe3ZhciBhPXRoaXMudHJ5RW50cmllc1tyXTtpZihhLnRyeUxvYzw9dGhpcy5wcmV2JiZuLmNhbGwoYSwiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8YS5maW5hbGx5TG9jKXt2YXIgbz1hO2JyZWFrfX1vJiYoImJyZWFrIj09PWV8fCJjb250aW51ZSI9PT1lKSYmby50cnlMb2M8PXQmJnQ8PW8uZmluYWxseUxvYyYmKG89bnVsbCk7dmFyIGk9bz9vLmNvbXBsZXRpb246e307cmV0dXJuIGkudHlwZT1lLGkuYXJnPXQsbz8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1vLmZpbmFsbHlMb2Mscyk6dGhpcy5jb21wbGV0ZShpKX0sY29tcGxldGU6ZnVuY3Rpb24oZSx0KXtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiJicmVhayI9PT1lLnR5cGV8fCJjb250aW51ZSI9PT1lLnR5cGU/dGhpcy5uZXh0PWUuYXJnOiJyZXR1cm4iPT09ZS50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9ZS5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PWUudHlwZSYmdCYmKHRoaXMubmV4dD10KSxzfSxmaW5pc2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIG49dGhpcy50cnlFbnRyaWVzW3RdO2lmKG4uZmluYWxseUxvYz09PWUpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLHgobiksc319LGNhdGNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7dD49MDstLXQpe3ZhciBuPXRoaXMudHJ5RW50cmllc1t0XTtpZihuLnRyeUxvYz09PWUpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgYT1yLmFyZzt4KG4pfXJldHVybiBhfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6XyhlKSxyZXN1bHROYW1lOnQsbmV4dExvYzpufSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPXZvaWQgMCksc319LGV9KGUuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKGUpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM1KTtmdW5jdGlvbiBhKCl7fWZ1bmN0aW9uIG8oKXt9by5yZXNldFdhcm5pbmdDYWNoZT1hLGUuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4sYSxvLGkpe2lmKGkhPT1yKXt2YXIgdT1uZXcgRXJyb3IoIkNhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuIFVzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyB1Lm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHV9fWZ1bmN0aW9uIHQoKXtyZXR1cm4gZX1lLmlzUmVxdWlyZWQ9ZTt2YXIgbj17YXJyYXk6ZSxib29sOmUsZnVuYzplLG51bWJlcjplLG9iamVjdDplLHN0cmluZzplLHN5bWJvbDplLGFueTplLGFycmF5T2Y6dCxlbGVtZW50OmUsZWxlbWVudFR5cGU6ZSxpbnN0YW5jZU9mOnQsbm9kZTplLG9iamVjdE9mOnQsb25lT2Y6dCxvbmVPZlR5cGU6dCxzaGFwZTp0LGV4YWN0OnQsY2hlY2tQcm9wVHlwZXM6byxyZXNldFdhcm5pbmdDYWNoZTphfTtyZXR1cm4gbi5Qcm9wVHlwZXM9bixufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9cGRmanNWaWV3ZXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD12b2lkIDA7dmFyIHI9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07dC5kZWZhdWx0PXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDIpLGE9bigxOSksbz1uKDM5KSxpPW4oNDApO2Z1bmN0aW9uIHUodCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIE1hcD9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gZS5leHBvcnRzPXU9ZnVuY3Rpb24oZSl7aWYobnVsbD09PWV8fCFvKGUpKXJldHVybiBlO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7aWYodm9pZCAwIT09bil7aWYobi5oYXMoZSkpcmV0dXJuIG4uZ2V0KGUpO24uc2V0KGUsdCl9ZnVuY3Rpb24gdCgpe3JldHVybiBpKGUsYXJndW1lbnRzLHIodGhpcykuY29uc3RydWN0b3IpfXJldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxhKHQsZSl9LHUodCl9ZS5leHBvcnRzPXV9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybi0xIT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChlKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIil9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxOSk7ZnVuY3Rpb24gYSgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIG8odCxuLGkpe3JldHVybiBhKCk/ZS5leHBvcnRzPW89UmVmbGVjdC5jb25zdHJ1Y3Q6ZS5leHBvcnRzPW89ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPVtudWxsXTthLnB1c2guYXBwbHkoYSx0KTt2YXIgbz1uZXcoRnVuY3Rpb24uYmluZC5hcHBseShlLGEpKTtyZXR1cm4gbiYmcihvLG4ucHJvdG90eXBlKSxvfSxvLmFwcGx5KG51bGwsYXJndW1lbnRzKX1lLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDIpLGE9big0Myksbz1uKDQ0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fGEoZSl8fG8oKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKEFycmF5Lmlz