@mce/gif 0.24.3 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,22 @@
1
+ import { Encoder } from "modern-gif";
2
+ //#region src/encode.ts
3
+ /**
4
+ * 编码逻辑单独成模块,由 plugin 的导出 handle 通过 `await import('./encode')` 动态加载,
5
+ * 使 modern-gif 与内联 worker 落到独立异步 chunk —— 注册 gif 插件时不付出体积,
6
+ * 仅在真正导出 GIF 时才加载(与 @mce/mp4 的按需策略一致)。
7
+ */
8
+ function createGifEncoder(config) {
9
+ let { workerUrl } = config;
10
+ if (!workerUrl) try {
11
+ workerUrl = new URL("data:text/javascript;base64,dmFyIGplPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxRZT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgSmU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFNlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFllPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZXQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgVD1NYXRoLnBvdyxkZT0oQixJLGspPT5JIGluIEI/amUoQixJLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTprfSk6QltJXT1rLE89KEIsSSk9Pntmb3IodmFyIGsgaW4gSXx8KEk9e30pKVllLmNhbGwoSSxrKSYmZGUoQixrLElba10pO2lmKFNlKWZvcih2YXIgayBvZiBTZShJKSlldC5jYWxsKEksaykmJmRlKEIsayxJW2tdKTtyZXR1cm4gQn0sUj0oQixJKT0+UWUoQixKZShJKSk7dmFyIHk9KEIsSSxrKT0+ZGUoQix0eXBlb2YgSSE9InN5bWJvbCI/SSsiIjpJLGspO3ZhciBHPShCLEksayk9Pm5ldyBQcm9taXNlKChaLHopPT57dmFyIGo9RT0+e3RyeXtxKGsubmV4dChFKSl9Y2F0Y2goRil7eihGKX19LFE9RT0+e3RyeXtxKGsudGhyb3coRSkpfWNhdGNoKEYpe3ooRil9fSxxPUU9PkUuZG9uZT9aKEUudmFsdWUpOlByb21pc2UucmVzb2x2ZShFLnZhbHVlKS50aGVuKGosUSk7cSgoaz1rLmFwcGx5KEIsSSkpLm5leHQoKSl9KTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gQihoKXtjb25zdCBlPW5ldyBNYXAse3dvcmtlclVybDp0fT1oO2xldHt3b3JrZXJOdW1iZXI6cj0xfT1oO2NvbnN0IGM9Wy4uLkFycmF5LmZyb20oe2xlbmd0aDp0P3I6MH0pXS5tYXAoKCk9Pnt0cnl7Y29uc3QgaT1uZXcgV29ya2VyKHQpO3JldHVybiBpLm9ubWVzc2FnZT1hLGl9Y2F0Y2goaSl7cmV0dXJuIGNvbnNvbGUud2FybihpKSxudWxsfX0pLmZpbHRlcihCb29sZWFuKTtyPWMubGVuZ3RoO2Z1bmN0aW9uIGEoaSl7dmFyIGw7Y29uc3R7aWQ6byxkYXRhOmR9PWkuZGF0YTsobD1lLmdldChvKSk9PW51bGx8fGwoZCksZS5kZWxldGUobyl9Y29uc3Qgcz1mdW5jdGlvbigpe2xldCBpPTA7cmV0dXJuIG89PmNbKG8hPW51bGw/bzppKyspJXJdfSgpO3JldHVybntjYWxsOmZ1bmN0aW9uKCl7bGV0IGk9MDtyZXR1cm4obyxkLGwsZik9Pm5ldyBQcm9taXNlKHU9Pntjb25zdCBnPXMoZik7aWYoIWcpcmV0dXJuIHUodm9pZCAwKTtlLnNldChpLHUpLGcucG9zdE1lc3NhZ2Uoe2lkOmkrKyx0eXBlOm8sZGF0YTpkfSx7dHJhbnNmZXI6bH0pfSl9KCl9fWNvbnN0IEk9IkdJRiIsaz1bIjg3YSIsIjg5YSJdLFo9NDQsej0zMyxqPTI1NSxRPTExLHE9MjU0LEU9MjQ5LEY9NCxJZT0xLGtlPTEsZmU9NTk7ZnVuY3Rpb24gdWUoaCl7Y29uc3QgZT1uZXcgVWludDhBcnJheShoLnJlZHVjZSgodCxyKT0+dCtyLmJ5dGVMZW5ndGgsMCkpO3JldHVybiBoLnJlZHVjZSgodCxyKT0+KGUuc2V0KHIsdCksdCtyLmJ5dGVMZW5ndGgpLDApLGV9ZnVuY3Rpb24gZWUoaCxlLHQpe2xldCByO2lmKEFycmF5QnVmZmVyLmlzVmlldyhoKSlyPWguYnVmZmVyO2Vsc2UgaWYoaCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXI9aDtlbHNle2NvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikse3dpZHRoOmEsaGVpZ2h0OnN9PXR8fHt9LG49Yy5nZXRDb250ZXh0KCIyZCIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjYW52YXMgY29udGV4dDJkIik7Yy53aWR0aD1hIT1udWxsP2E6IndpZHRoImluIGg/dHlwZW9mIGgud2lkdGg9PSJudW1iZXIiP2gud2lkdGg6aC53aWR0aC5iYXNlVmFsLnZhbHVlOjAsYy5oZWlnaHQ9cyE9bnVsbD9zOiJoZWlnaHQiaW4gaD90eXBlb2YgaC5oZWlnaHQ9PSJudW1iZXIiP2guaGVpZ2h0OmguaGVpZ2h0LmJhc2VWYWwudmFsdWU6MCxuLmRyYXdJbWFnZShoLDAsMCxjLndpZHRoLGMuaGVpZ2h0KSxyPW4uZ2V0SW1hZ2VEYXRhKDAsMCxjLndpZHRoLGMuaGVpZ2h0KS5kYXRhLmJ1ZmZlcn1zd2l0Y2goZSl7Y2FzZSJ1aW50OEFycmF5IjpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocik7Y2FzZSJ1aW50OENsYW1wZWRBcnJheSI6cmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShyKTtjYXNlImRhdGFWaWV3IjpyZXR1cm4gbmV3IERhdGFWaWV3KHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0Iil9fWZ1bmN0aW9uIEJlKGgpe2NvbnN0IGU9bmV3IEltYWdlO3JldHVybiBlLmRlY29kaW5nPSJzeW5jIixlLmxvYWRpbmc9ImVhZ2VyIixlLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGUuc3JjPWgsZX1mdW5jdGlvbiBUZShoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pntjb25zdCByPUJlKGgpO3Iub25sb2FkPSgpPT5lKHIpLHIub25lcnJvcj10fSl9Y2xhc3MgQWV7Y29uc3RydWN0b3IoZSl7eSh0aGlzLCJfdmlldyIpO3kodGhpcywib2Zmc2V0IiwwKTt0aGlzLl92aWV3PWVlKGUsImRhdGFWaWV3Iil9cmVhZEJ5dGUoKXtyZXR1cm4gdGhpcy5fdmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCsrKX1yZWFkQnl0ZXMoZSl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDplfSkubWFwKCgpPT50aGlzLnJlYWRCeXRlKCkpfXJlYWRTdHJpbmcoZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4udGhpcy5yZWFkQnl0ZXMoZSkpfXJlYWRVbnNpZ25lZCgpe3JldHVyblt0aGlzLl92aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCwhMCksdGhpcy5vZmZzZXQrPTJdWzBdfXJlYWRCaXRzKCl7cmV0dXJuIHRoaXMuX3ZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQrKykudG9TdHJpbmcoMikucGFkU3RhcnQoOCwiMCIpLnNwbGl0KCIiKS5tYXAoTnVtYmVyKX1yZWFkQ29sb3JUYWJsZShlKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOmV9LCgpPT5BcnJheS5mcm9tKHRoaXMucmVhZEJ5dGVzKDMpKSl9cmVhZFN1YkJsb2NrKCl7Y29uc3QgZT1bXTtmb3IoOzspe2NvbnN0IHQ9dGhpcy5yZWFkQnl0ZSgpO2lmKHQ9PT0wJiZ0aGlzLl92aWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KSE9PTApYnJlYWs7ZS5wdXNoKHQpfXJldHVybiBlfX1mdW5jdGlvbiBFZShoKXtjb25zdCBlPXt9LHQ9bmV3IEFlKGgpLHI9KCk9Pih7aW5kZXg6MCxkZWxheToxMDAsZGlzcG9zYWw6MH0pLGM9dC5yZWFkU3RyaW5nKDMpLGE9dC5yZWFkU3RyaW5nKDMpO2lmKGMhPT1JfHwhay5pbmNsdWRlcyhhKSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgaXMgbm90IGEgODdhLzg5YSBHSUYgZGF0YS4iKTtlLnZlcnNpb249YSxlLndpZHRoPXQucmVhZFVuc2lnbmVkKCksZS5oZWlnaHQ9dC5yZWFkVW5zaWduZWQoKTtjb25zdCBzPXQucmVhZEJpdHMoKTtlLmdsb2JhbENvbG9yVGFibGU9ISFzWzBdLGUuY29sb3JSZXNvbHVUaW9uPU51bWJlci5wYXJzZUludChzLnNsaWNlKDEsNCkuam9pbigiIiksMikrMSxlLmNvbG9yVGFibGVTb3J0ZWQ9ISFzWzRdO2NvbnN0IG49TnVtYmVyLnBhcnNlSW50KHMuc2xpY2UoNSw4KS5qb2luKCIiKSwyKTtlLmNvbG9yVGFibGVTaXplPVQoMixuKzEpLGUuYmFja2dyb3VuZENvbG9ySW5kZXg9dC5yZWFkQnl0ZSgpLGUucGl4ZWxBc3BlY3RSYXRpbz10LnJlYWRCeXRlKCksZS5nbG9iYWxDb2xvclRhYmxlJiYoZS5jb2xvclRhYmxlU2l6ZT9lLmNvbG9yVGFibGU9dC5yZWFkQ29sb3JUYWJsZShlLmNvbG9yVGFibGVTaXplKTp0LnJlYWRTdWJCbG9jaygpKSxlLmZyYW1lcz1bXTtsZXQgaT1yKCk7Y29uc3Qgbz1bXSxkPVtdO2Zvcig7Oyl7Y29uc3QgbD10LnJlYWRCeXRlKCk7aWYoby5wdXNoKGwpLGw9PT1aKXtpLmxlZnQ9dC5yZWFkVW5zaWduZWQoKSxpLnRvcD10LnJlYWRVbnNpZ25lZCgpLGkud2lkdGg9dC5yZWFkVW5zaWduZWQoKSxpLmhlaWdodD10LnJlYWRVbnNpZ25lZCgpO2NvbnN0IGY9dC5yZWFkQml0cygpO2kubG9jYWxDb2xvclRhYmxlPSEhZlswXSxpLmludGVybGFjZWQ9ISFmWzFdLGkuY29sb3JUYWJsZVNvcnRlZD0hIWZbMl0saS5yZXNlcnZlZD1OdW1iZXIucGFyc2VJbnQoZi5zbGljZSgzLDUpLmpvaW4oIiIpLDIpO2NvbnN0IHU9TnVtYmVyLnBhcnNlSW50KGYuc2xpY2UoNSw4KS5qb2luKCIiKSwyKTtmb3IoaS5jb2xvclRhYmxlU2l6ZT1UKDIsdSsxKSxpLmxvY2FsQ29sb3JUYWJsZSYmKGkuY29sb3JUYWJsZT10LnJlYWRDb2xvclRhYmxlKGkuY29sb3JUYWJsZVNpemUpKSxpLmx6d01pbkNvZGVTaXplPXQucmVhZEJ5dGUoKSxpLmRhdGFQb3NpdGlvbnM9W107Oyl7Y29uc3QgZz10LnJlYWRCeXRlKCk7aWYoZz09PTApYnJlYWs7Y29uc3Qgdz10Lm9mZnNldDtpLmRhdGFQb3NpdGlvbnMucHVzaChbdyxnXSksdC5vZmZzZXQ9dytnfWUuZnJhbWVzLnB1c2goaSksaT1yKCksaS5pbmRleD1lLmZyYW1lcy5sZW5ndGg7Y29udGludWV9aWYobD09PXope2NvbnN0IGY9dC5yZWFkQnl0ZSgpO2lmKGQucHVzaChmKSxmPT09ail7aWYodC5yZWFkQnl0ZSgpIT09USljb250aW51ZTtjb25zdCB1PXtpZGVudGlmaWVyOnQucmVhZFN0cmluZyg4KSxjb2RlOnQucmVhZFN0cmluZygzKSxkYXRhOltdfTtgJHt1LmlkZW50aWZpZXJ9JHt1LmNvZGV9YD09Ik5FVFNDQVBFMi4wIiYmdC5yZWFkQnl0ZSgpPT09MyYmKGUubG9vcGVkPSEhdC5yZWFkQnl0ZSgpLGUubG9vcENvdW50PXQucmVhZFVuc2lnbmVkKCkpLHUuZGF0YT10LnJlYWRTdWJCbG9jaygpLGkuYXBwbGljYXRpb249dTtjb250aW51ZX1pZihmPT09cSl7aS5jb21tZW50PXQucmVhZFN1YkJsb2NrKCkubWFwKHU9PlN0cmluZy5mcm9tQ2hhckNvZGUodSkpLmpvaW4oIiIpO2NvbnRpbnVlfWlmKGY9PT1FKXtpZih0LnJlYWRCeXRlKCkhPT1GKWNvbnRpbnVlO2NvbnN0IHU9dC5yZWFkQml0cygpLGc9e3Jlc2VydmVkOk51bWJlci5wYXJzZUludCh1LnNsaWNlKDAsMykuam9pbigiIiksMiksZGlzcG9zYWw6TnVtYmVyLnBhcnNlSW50KHUuc2xpY2UoMyw2KS5qb2luKCIiKSwyKSx1c2VySW5wdXQ6ISF1WzZdLHRyYW5zcGFyZW50OiEhdVs3XSxkZWxheVRpbWU6dC5yZWFkVW5zaWduZWQoKSx0cmFuc3BhcmVudEluZGV4OnQucmVhZEJ5dGUoKX07dC5yZWFkU3ViQmxvY2soKSxpLmdyYXBoaWNDb250cm9sPWcsaS5kaXNwb3NhbD1nLmRpc3Bvc2FsLGkuZGVsYXk9KGcuZGVsYXlUaW1lfHwxMCkqMTA7Y29udGludWV9aWYoZj09PUllKXtpZih0LnJlYWRCeXRlKCkhPT1rZSljb250aW51ZTtpLnBsYWluVGV4dD17bGVmdDp0LnJlYWRVbnNpZ25lZCgpLHRvcDp0LnJlYWRVbnNpZ25lZCgpLHdpZHRoOnQucmVhZFVuc2lnbmVkKCksaGVpZ2h0OnQucmVhZFVuc2lnbmVkKCksY2VsbFdpZHRoOnQucmVhZEJ5dGUoKSxjZWxsSGVpZ2h0OnQucmVhZEJ5dGUoKSxjb2xvckluZGV4OnQucmVhZEJ5dGUoKSxiYWNrZ3JvdW5kQ29sb3JJbmRleDp0LnJlYWRCeXRlKCksZGF0YTp0LnJlYWRTdWJCbG9jaygpfTtjb250aW51ZX1jb25zb2xlLndhcm4oYFVua25vd24gZXh0ZW5zaW9uIGJsb2NrOiAweCR7Zi50b1N0cmluZygxNil9YCxvLnNsaWNlKDAsby5sZW5ndGgtMSkubWFwKHU9PmAweCR7dS50b1N0cmluZygxNil9YCksZC5zbGljZSgwLGQubGVuZ3RoLTEpLm1hcCh1PT5gMHgke3UudG9TdHJpbmcoMTYpfWApKTtjb250aW51ZX1pZihsPT09ZmUpYnJlYWs7Y29uc29sZS53YXJuKGBVbmtub3duIGJsb2NrOiAweCR7bC50b1N0cmluZygxNil9YCxvLnNsaWNlKDAsby5sZW5ndGgtMSkubWFwKGY9PmAweCR7Zi50b1N0cmluZygxNil9YCksZC5zbGljZSgwLGQubGVuZ3RoLTEpLm1hcChmPT5gMHgke2YudG9TdHJpbmcoMTYpfWApKX1yZXR1cm4gZX1mdW5jdGlvbiBVZShoLGUpe2NvbnN0IHQ9QXJyYXkuZnJvbSh7bGVuZ3RoOmgubGVuZ3RofSkscj1oLmxlbmd0aC9lLGM9WzAsNCwyLDFdLGE9WzgsOCw0LDJdO2xldCBzPTA7Zm9yKGxldCBuPTA7bjw0O24rKylmb3IobGV0IGk9Y1tuXTtpPHI7aSs9YVtuXSl0LnNwbGljZS5hcHBseSh0LFtpKmUsZV0uY29uY2F0KGguc2xpY2UocyplLChzKzEpKmUpKSkscysrO3JldHVybiB0fWZ1bmN0aW9uIHZlKGgsZSx0KXtjb25zdCBhPXQ7bGV0IHMsbixpLG8sZCxsLGY7Y29uc3QgdT1BcnJheS5mcm9tKHtsZW5ndGg6dH0pLGc9QXJyYXkuZnJvbSh7bGVuZ3RoOjQwOTZ9KSx3PUFycmF5LmZyb20oe2xlbmd0aDo0MDk2fSkscD1BcnJheS5mcm9tKHtsZW5ndGg6NDA5N30pLEM9aCx4PTE8PEMsYj14KzE7Zm9yKHM9eCsyLGQ9LTEsaT1DKzEsbj0oMTw8aSktMSxsPTA7bDx4O2wrKylnW2xdPTAsd1tsXT1sO2xldCBtLFMsQSxVLEwsSDtmb3IobT1TPUE9VT1MPUg9MCxmPTA7ZjxhOyl7aWYoVT09PTApe2lmKFM8aSl7bSs9ZVtIXTw8UyxTKz04LEgrKztjb250aW51ZX1pZihsPW0mbixtPj49aSxTLT1pLGw+c3x8bD09PWIpYnJlYWs7aWYobD09PXgpe2k9QysxLG49KDE8PGkpLTEscz14KzIsZD0tMTtjb250aW51ZX1pZihkPT09LTEpe3BbVSsrXT13W2xdLGQ9bCxBPWw7Y29udGludWV9Zm9yKG89bCxsPT09cyYmKHBbVSsrXT1BLGw9ZCk7bD54OylwW1UrK109d1tsXSxsPWdbbF07QT13W2xdJjI1NSxwW1UrK109QSxzPDQwOTYmJihnW3NdPWQsd1tzXT1BLHMrKywhKHMmbikmJnM8NDA5NiYmKGkrKyxuKz1zKSksZD1vfVUtLSx1W0wrK109cFtVXSxmKyt9Zm9yKGY9TDtmPGE7ZisrKXVbZl09MDtyZXR1cm4gdX1mdW5jdGlvbiBOZShoLGUpe2NvbnN0IHQ9ZWUoaCwidWludDhBcnJheSIpLHtnaWY6cj1FZShoKSxyYW5nZTpjfT17fSx7d2lkdGg6YSxoZWlnaHQ6cyxjb2xvclRhYmxlOm4sZnJhbWVzOml9PXIsbz1jP2kuc2xpY2UoY1swXSxjWzFdKzEpOmksZD1vLnNvbWUoZz0+Zy5kaXNwb3NhbD09PTMpO2xldCBsPW5ldyBVaW50OENsYW1wZWRBcnJheShhKnMqNCksZix1PWwuc2xpY2UoKTtyZXR1cm4gby5tYXAoZz0+e3ZhciBDZTtjb25zdHtsZWZ0OncsdG9wOnAsd2lkdGg6QyxoZWlnaHQ6eCxpbnRlcmxhY2VkOmIsbG9jYWxDb2xvclRhYmxlOm0sY29sb3JUYWJsZTpTLGx6d01pbkNvZGVTaXplOkEsZGF0YVBvc2l0aW9uczpVLGdyYXBoaWNDb250cm9sOkwsZGVsYXk6SCxkaXNwb3NhbDp5ZX09Zyx4ZT1mPT1udWxsP3ZvaWQgMDpmLmRpc3Bvc2FsLHFlPXAreCx7dHJhbnNwYXJlbnQ6SGUsdHJhbnNwYXJlbnRJbmRleDpLZX09TCE9bnVsbD9MOnt9LGFlPW0/UzpuLEdlPUhlP0tlOi0xLFplPXVlKFUubWFwKChbTixXXSk9PnQuc3ViYXJyYXkoTixOK1cpKSk7bGV0IGxlPXZlKEEsWmUsQyp4KTtpZihiJiYobGU9VWUobGUsQykpLHhlPT09MylsPXUuc2xpY2UoKTtlbHNlIGlmKHhlPT09Mil7Y29uc3R7bGVmdDpOLHRvcDpXLHdpZHRoOmNlLGhlaWdodDpYfT1mLFk9VytYO2ZvcihsZXQgTT1XO008WTtNKyspe2NvbnN0IGhlPU0qYStOO2ZvcihsZXQgSz0wO0s8Y2U7SysrKXtjb25zdCBWPShoZStLKSo0O2xbVl09bFtWKzFdPWxbVisyXT1sW1YrM109MH19fWZvcihsZXQgTj1wO048cWU7TisrKXtjb25zdCBXPU4qYSt3LGNlPShOLXApKkM7Zm9yKGxldCBYPTA7WDxDO1grKyl7Y29uc3QgWT1sZVtjZStYXSxNPShXK1gpKjQ7aWYoWSE9PUdlKXtjb25zdFtoZSxLLFZdPShDZT1hZT09bnVsbD92b2lkIDA6YWVbWV0pIT1udWxsP0NlOlswLDAsMF07bFtNXT1oZSxsW00rMV09SyxsW00rMl09VixsW00rM109MjU1fX19cmV0dXJuIGQmJnllIT09MSYmeWUhPT0zJiYodT1sLnNsaWNlKCkpLGY9Zyx7d2lkdGg6YSxoZWlnaHQ6cyxkZWxheTpILGRhdGE6bC5zbGljZSgpfX0pfWNvbnN0IE9lPXR5cGVvZiB3aW5kb3c8InUiLF89NjU1MzUsUD1fKl8sTWU9NTExLHRlPVswLDIwLDQwLDYwLDgwLDk5LDExOSwxMzksMTU5LDE3OSwxOTksMjE5LDI0MSwyNjQsMjg4LDMxMywzNDAsMzY3LDM5Niw0MjcsNDU4LDQ5MSw1MjYsNTYyLDU5OSw2MzcsNjc3LDcxOCw3NjEsODA1LDg1MSw4OTgsOTQ3LDk5NywxMDQ4LDExMDEsMTE1NiwxMjEyLDEyNzAsMTMzMCwxMzkxLDE0NTMsMTUxNywxNTgzLDE2NTEsMTcyMCwxNzkwLDE4NjMsMTkzNywyMDEzLDIwOTAsMjE3MCwyMjUwLDIzMzMsMjQxOCwyNTA0LDI1OTIsMjY4MSwyNzczLDI4NjYsMjk2MSwzMDU4LDMxNTcsMzI1OCwzMzYwLDM0NjQsMzU3MCwzNjc4LDM3ODgsMzkwMCw0MDE0LDQxMjksNDI0Nyw0MzY2LDQ0ODgsNDYxMSw0NzM2LDQ4NjQsNDk5Myw1MTI0LDUyNTcsNTM5Miw1NTMwLDU2NjksNTgxMCw1OTUzLDYwOTksNjI0Niw2Mzk1LDY1NDcsNjcwMCw2ODU2LDcwMTQsNzE3NCw3MzM1LDc1MDAsNzY2Niw3ODM0LDgwMDQsODE3Nyw4MzUyLDg1MjgsODcwOCw4ODg5LDkwNzIsOTI1OCw5NDQ1LDk2MzUsOTgyOCwxMDAyMiwxMDIxOSwxMDQxNywxMDYxOSwxMDgyMiwxMTAyOCwxMTIzNSwxMTQ0NiwxMTY1OCwxMTg3MywxMjA5MCwxMjMwOSwxMjUzMCwxMjc1NCwxMjk4MCwxMzIwOSwxMzQ0MCwxMzY3MywxMzkwOSwxNDE0NiwxNDM4NywxNDYyOSwxNDg3NCwxNTEyMiwxNTM3MSwxNTYyMywxNTg3OCwxNjEzNSwxNjM5NCwxNjY1NiwxNjkyMCwxNzE4NywxNzQ1NiwxNzcyNywxODAwMSwxODI3NywxODU1NiwxODgzNywxOTEyMSwxOTQwNywxOTY5NiwxOTk4NywyMDI4MSwyMDU3NywyMDg3NiwyMTE3NywyMTQ4MSwyMTc4NywyMjA5NiwyMjQwNywyMjcyMSwyMzAzOCwyMzM1NywyMzY3OCwyNDAwMiwyNDMyOSwyNDY1OCwyNDk5MCwyNTMyNSwyNTY2MiwyNjAwMSwyNjM0NCwyNjY4OCwyNzAzNiwyNzM4NiwyNzczOSwyODA5NCwyODQ1MiwyODgxMywyOTE3NiwyOTU0MiwyOTkxMSwzMDI4MiwzMDY1NiwzMTAzMywzMTQxMiwzMTc5NCwzMjE3OSwzMjU2NywzMjk1NywzMzM1MCwzMzc0NSwzNDE0MywzNDU0NCwzNDk0OCwzNTM1NSwzNTc2NCwzNjE3NiwzNjU5MSwzNzAwOCwzNzQyOSwzNzg1MiwzODI3OCwzODcwNiwzOTEzOCwzOTU3Miw0MDAwOSw0MDQ0OSw0MDg5MSw0MTMzNyw0MTc4NSw0MjIzNiw0MjY5MCw0MzE0Nyw0MzYwNiw0NDA2OSw0NDUzNCw0NTAwMiw0NTQ3Myw0NTk0Nyw0NjQyMyw0NjkwMyw0NzM4NSw0Nzg3MSw0ODM1OSw0ODg1MCw0OTM0NCw0OTg0MSw1MDM0MSw1MDg0NCw1MTM0OSw1MTg1OCw1MjM2OSw1Mjg4NCw1MzQwMSw1MzkyMSw1NDQ0NSw1NDk3MSw1NTUwMCw1NjAzMiw1NjU2Nyw1NzEwNSw1NzY0Niw1ODE5MCw1ODczNyw1OTI4Nyw1OTg0MCw2MDM5Niw2MDk1NSw2MTUxNyw2MjA4Miw2MjY1MCw2MzIyMSw2Mzc5NSw2NDM3Miw2NDk1Miw2NTUzNV0sZ2U9WzAsNiwxMywxOCwyMiwyNSwyOCwzMSwzNCwzNiwzOCw0MCw0Miw0NCw0Niw0OCw1MCw1MSw1Myw1NCw1Niw1Nyw1OSw2MCw2MSw2Miw2NCw2NSw2Niw2Nyw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5MSw5Miw5Myw5NCw5NSw5NSw5Niw5Nyw5OCw5OCw5OSwxMDAsMTAxLDEwMSwxMDIsMTAzLDEwMywxMDQsMTA1LDEwNiwxMDYsMTA3LDEwOCwxMDgsMTA5LDExMCwxMTAsMTExLDExMSwxMTIsMTEzLDExMywxMTQsMTE1LDExNSwxMTYsMTE2LDExNywxMTgsMTE4LDExOSwxMTksMTIwLDEyMSwxMjEsMTIyLDEyMiwxMjMsMTIzLDEyNCwxMjUsMTI1LDEyNiwxMjYsMTI3LDEyNywxMjgsMTI4LDEyOSwxMjksMTMwLDEzMCwxMzEsMTMyLDEzMiwxMzMsMTMzLDEzNCwxMzQsMTM1LDEzNSwxMzYsMTM2LDEzNywxMzcsMTM4LDEzOCwxMzksMTM5LDE0MCwxNDAsMTQwLDE0MSwxNDEsMTQyLDE0MiwxNDMsMTQzLDE0NCwxNDQsMTQ1LDE0NSwxNDYsMTQ2LDE0NywxNDcsMTQ3LDE0OCwxNDgsMTQ5LDE0OSwxNTAsMTUwLDE1MSwxNTEsMTUxLDE1MiwxNTIsMTUzLDE1MywxNTQsMTU0LDE1NCwxNTUsMTU1LDE1NiwxNTYsMTU2LDE1NywxNTcsMTU4LDE1OCwxNTksMTU5LDE1OSwxNjAsMTYwLDE2MSwxNjEsMTYxLDE2MiwxNjIsMTYzLDE2MywxNjMsMTY0LDE2NCwxNjUsMTY1LDE2NSwxNjYsMTY2LDE2NiwxNjcsMTY3LDE2OCwxNjgsMTY4LDE2OSwxNjksMTY5LDE3MCwxNzAsMTcxLDE3MSwxNzEsMTcyLDE3MiwxNzIsMTczLDE3MywxNzQsMTc0LDE3NCwxNzUsMTc1LDE3NSwxNzYsMTc2LDE3NiwxNzcsMTc3LDE3NywxNzgsMTc4LDE3OSwxNzksMTc5LDE4MCwxODAsMTgwLDE4MSwxODEsMTgxLDE4MiwxODIsMTgyLDE4MywxODMsMTgzLDE4NCwxODQsMTg0LDE4NSwxODUsMTg1LDE4NiwxODYsMTg2LDE4NywxODcsMTg3LDE4OCwxODgsMTg4LDE4OSwxODksMTg5LDE5MCwxOTAsMTkwLDE5MSwxOTEsMTkxLDE5MiwxOTIsMTkyLDE5MywxOTMsMTkzLDE5MywxOTQsMTk0LDE5NCwxOTUsMTk1LDE5NSwxOTYsMTk2LDE5NiwxOTcsMTk3LDE5NywxOTgsMTk4LDE5OCwxOTgsMTk5LDE5OSwxOTksMjAwLDIwMCwyMDAsMjAxLDIwMSwyMDEsMjAxLDIwMiwyMDIsMjAyLDIwMywyMDMsMjAzLDIwNCwyMDQsMjA0LDIwNCwyMDUsMjA1LDIwNSwyMDYsMjA2LDIwNiwyMDYsMjA3LDIwNywyMDcsMjA4LDIwOCwyMDgsMjA4LDIwOSwyMDksMjA5LDIxMCwyMTAsMjEwLDIxMCwyMTEsMjExLDIxMSwyMTIsMjEyLDIxMiwyMTIsMjEzLDIxMywyMTMsMjE0LDIxNCwyMTQsMjE0LDIxNSwyMTUsMjE1LDIxNSwyMTYsMjE2LDIxNiwyMTcsMjE3LDIxNywyMTcsMjE4LDIxOCwyMTgsMjE4LDIxOSwyMTksMjE5LDIyMCwyMjAsMjIwLDIyMCwyMjEsMjIxLDIyMSwyMjEsMjIyLDIyMiwyMjIsMjIyLDIyMywyMjMsMjIzLDIyNCwyMjQsMjI0LDIyNCwyMjUsMjI1LDIyNSwyMjUsMjI2LDIyNiwyMjYsMjI2LDIyNywyMjcsMjI3LDIyNywyMjgsMjI4LDIyOCwyMjgsMjI5LDIyOSwyMjksMjI5LDIzMCwyMzAsMjMwLDIzMCwyMzEsMjMxLDIzMSwyMzEsMjMyLDIzMiwyMzIsMjMyLDIzMywyMzMsMjMzLDIzMywyMzQsMjM0LDIzNCwyMzQsMjM1LDIzNSwyMzUsMjM1LDIzNiwyMzYsMjM2LDIzNiwyMzcsMjM3LDIzNywyMzcsMjM4LDIzOCwyMzgsMjM4LDIzOSwyMzksMjM5LDIzOSwyMzksMjQwLDI0MCwyNDAsMjQwLDI0MSwyNDEsMjQxLDI0MSwyNDIsMjQyLDI0MiwyNDIsMjQzLDI0MywyNDMsMjQzLDI0MywyNDQsMjQ0LDI0NCwyNDQsMjQ1LDI0NSwyNDUsMjQ1LDI0NiwyNDYsMjQ2LDI0NiwyNDYsMjQ3LDI0NywyNDcsMjQ3LDI0OCwyNDgsMjQ4LDI0OCwyNDksMjQ5LDI0OSwyNDksMjQ5LDI1MCwyNTAsMjUwLDI1MCwyNTEsMjUxLDI1MSwyNTEsMjUxLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1NCwyNTQsMjU0LDI1NCwyNTUsMjU1LDI1NV07ZnVuY3Rpb24gcmUoaCl7bGV0IGU7aWYoaDw9MClyZXR1cm4gMDtpZihoPj1fKXJldHVybiBfO2U9aCooaCooaCstMTQ0MTA3KS9fKzEzMjExNCkvXysxNDM3OTtmb3IobGV0IHQ9MDt0PDI7dCsrKXtjb25zdCByPWUqZSplLGM9aCsoMipyK1AvMikvUDtlPShlKigyKmgrKHIrUC8yKS9QKStjLzIpL2N9cmV0dXJuIGV9ZnVuY3Rpb24gdihoLGUpe3JldHVybihoXmUpPDA/KGgtZS8yKS9lOihoK2UvMikvZX1mdW5jdGlvbiB3ZShoLGUsdCxyLGM9ITAsYT1bMjU1LDI1NSwyNTVdKXtpZighYyl7ci89MjU1O2NvbnN0IHM9MS1yO2g9aCpyK3MqYVswXSYyNTUsZT1lKnIrcyphWzFdJjI1NSx0PXQqcitzKmFbMl0mMjU1fXJldHVybntyOmgsZzplLGI6dH19ZnVuY3Rpb24gbmUoaCxlLHQpe3JldHVybiBoPDwxNnxlPDw4fHR9ZnVuY3Rpb24gcGUoaCxlLHQpe2g9dGVbaF0sZT10ZVtlXSx0PXRlW3RdO2NvbnN0IHI9KDI3MDE1KmgrMzUxNDkqZSszMzcyKnQrXy8yKS9fLGM9KDEzODg3KmgrNDQ2MTAqZSs3MDM4KnQrXy8yKS9fLGE9KDU3ODcqaCsxODQ2MiplKzQxMjg2KnQrXy8yKS9fLHM9cmUociksbj1yZShjKSxpPXJlKGEpO3JldHVybntsOnYoMTM3OTIqcys1MjAxMCpuLTI2NyppLF8pLGE6digxMjk2Mjgqcy0xNTkxNTgqbisyOTUzMCppLF8pLGI6digxNjk4KnMrNTEyOTkqbi01Mjk5NyppLF8pfX1mdW5jdGlvbiBpZShoKXtpZihoPD0wKXJldHVybiAwO2lmKGg+PV8pcmV0dXJuIDI1NTt7Y29uc3QgZT1oKk1lLHQ9fn4oZS9fKSxyPWUlXyxjPWdlW3RdLGE9Z2VbdCsxXTtyZXR1cm4ociooYS1jKStfLzIpL18rY319ZnVuY3Rpb24gUmUoaCl7Y29uc3QgZT1oLmwrdigyNTk3NCpoLmEsXykrdigxNDE0MypoLmIsXyksdD1oLmwrdigtNjkxOCpoLmEsXykrdigtNDE4NSpoLmIsXykscj1oLmwrdigtNTg2NCpoLmEsXykrdigtODQ2MzgqaC5iLF8pLGM9VChlLDMpL1AsYT1UKHQsMykvUCxzPVQociwzKS9QLG49fn5pZSgoMjY3MTY5KmMrLTIxNjc3MSphKzE1MTM3KnMrXy8yKS9fKSxpPX5+aWUoKC04MzEyNypjKzE3MTAzMCphKy0yMjM2OCpzK18vMikvXyksbz1+fmllKCgtMjc1KmMrLTQ2MDk5KmErMTExOTA5KnMrXy8yKS9fKTtyZXR1cm57cjpuLGc6aSxiOm99fWZ1bmN0aW9uIFBlKGgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57Y29uc3QgdD1uZXcgSW1hZ2U7dC5kZWNvZGluZz0ic3luYyIsdC5sb2FkaW5nPSJlYWdlciIsdC5jcm9zc09yaWdpbj0iYW5vbnltb3VzIix0Lm9ubG9hZD0oKT0+ZSh0KSx0Lm9uZXJyb3I9KCk9PmUodCksdC5zcmM9aH0pfWNsYXNzIEp7Y29uc3RydWN0b3IoKXt0aGlzLnJlYWRhYmxlPW5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6ZT0+dGhpcy5fcnNDb250cm9sZXI9ZX0pLHRoaXMud3JpdGFibGU9bmV3IFdyaXRhYmxlU3RyZWFtKHt3cml0ZTplPT5HKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgcixjLGEscztsZXQgdDtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjp7Y29uc3Qgbj15aWVsZCBQZShlKSxpPUouY3R4MmQsbz1pLmNhbnZhcztpLmNsZWFyUmVjdCgwLDAsby53aWR0aCxvLmhlaWdodCksby53aWR0aD1uLndpZHRoLG8uaGVpZ2h0PW4uaGVpZ2h0LGkuZHJhd0ltYWdlKG4sMCwwLG8ud2lkdGgsby5oZWlnaHQpLHQ9aS5nZXRJbWFnZURhdGEoMCwwLG8ud2lkdGgsby5oZWlnaHQpLmRhdGE7YnJlYWt9ZGVmYXVsdDppZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdD1uZXcgVWludDhDbGFtcGVkQXJyYXkoZS5idWZmZXIpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXQ9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGUpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSlpZihBcnJheS5pc0FycmF5KGVbMF0pKXtjb25zdCBuPVtdO2ZvcihsZXQgaT1lLmxlbmd0aCxvPTA7bzxpO28rKyluLnB1c2goKHI9ZVtvXVswXSkhPW51bGw/cjowLChjPWVbb11bMV0pIT1udWxsP2M6MCwoYT1lW29dWzJdKSE9bnVsbD9hOjAsKHM9ZVtvXVszXSkhPW51bGw/czoyNTUpO3Q9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG4pfWVsc2UgdD1uZXcgVWludDhDbGFtcGVkQXJyYXkoZSk7ZWxzZXtjb25zdCBuPUouY3R4MmQsaT1uLmNhbnZhcztuLmNsZWFyUmVjdCgwLDAsaS53aWR0aCxpLmhlaWdodCksaS53aWR0aD10eXBlb2YgZS53aWR0aD09Im51bWJlciI/ZS53aWR0aDplLndpZHRoLmJhc2VWYWwudmFsdWUsaS5oZWlnaHQ9dHlwZW9mIGUuaGVpZ2h0PT0ibnVtYmVyIj9lLmhlaWdodDplLmhlaWdodC5iYXNlVmFsLnZhbHVlLG4uZHJhd0ltYWdlKGUsMCwwLGkud2lkdGgsaS5oZWlnaHQpLHQ9bi5nZXRJbWFnZURhdGEoMCwwLGkud2lkdGgsaS5oZWlnaHQpLmRhdGF9YnJlYWt9dGhpcy5fcnNDb250cm9sZXIuZW5xdWV1ZSh0KX0pLGNsb3NlOigpPT57dGhpcy5fcnNDb250cm9sZXIuY2xvc2UoKX19KX1zdGF0aWMgZ2V0IGN0eDJkKCl7aWYoIXRoaXMuX2N0eDJkKXtpZighT2UpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gZ2V0IEltYWdlVG9QaXhlbHMuY3R4MmQsIG5vdCBpbiBicm93c2VyLiIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgSW1hZ2VUb1BpeGVscy5jdHgyZCwgZ2V0Q29udGV4dCgnMmQnKSByZXR1cm4gbnVsbC4iKTt0aGlzLl9jdHgyZD1lfXJldHVybiB0aGlzLl9jdHgyZH19Y2xhc3Mgb2V7Y29uc3RydWN0b3IoZSl7dGhpcy5tYXhDb2xvcnM9ZSx0aGlzLnJlYWRhYmxlPW5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6dD0+dGhpcy5fcnNDb250cm9sZXI9dH0pLHRoaXMud3JpdGFibGU9bmV3IFdyaXRhYmxlU3RyZWFtKHt3cml0ZTp0PT57dGhpcy5fcnNDb250cm9sZXIuZW5xdWV1ZSh0aGlzLl9ib3hlc1RvUXVhbnRpemVkQ29sb3JzKHRoaXMuX2NvbG9yc1RvQm94ZXModCkpKX0sY2xvc2U6KCk9Pnt0aGlzLl9yc0NvbnRyb2xlci5jbG9zZSgpfX0pfXN0YXRpYyBjcmVhdGVTb3J0ZXIoZSl7Y29uc3QgdD1lWzBdLHI9ZVsxXSxjPWVbMl07cmV0dXJuKGEscyk9PmEubGFiW3RdLXMubGFiW3RdfHxhLmxhYltyXS1zLmxhYltyXXx8YS5sYWJbY10tcy5sYWJbY119X2NvbG9yc1RvQm94ZXMoZSl7bGV0IHQ9e3N0YXJ0OjAsZW5kOmUubGVuZ3RoLTEsc29ydGVkOm51bGwsY291bnQ6MCxzY29yZTowLHdlaWdodDowLHNvcnQ6ImxhYiIsYXZnOntsOjAsYTowLGI6MH19O2NvbnN0IHI9W3RdO2xldCBjPTE7Y29uc3QgYT0obyxkLGwpPT5vPj1kP2Q+PWw/ImxhYiI6bz49bD8ibGJhIjoiYmxhIjpvPj1sPyJhbGIiOmQ+PWw/ImFibCI6ImJhbCIscz1vPT57Y29uc3R7c3RhcnQ6ZCxlbmQ6bH09bztvLmNvdW50PWwtZCsxLG8ud2VpZ2h0PTA7Y29uc3QgZj17bDowLGE6MCxiOjB9O2ZvcihsZXQgZz1kO2c8PWw7ZysrKXtjb25zdCB3PWVbZ107Zi5sKz13LmxhYi5sKncuY291bnQsZi5hKz13LmxhYi5hKncuY291bnQsZi5iKz13LmxhYi5iKncuY291bnQsby53ZWlnaHQrPXcuY291bnR9by5hdmcubD1mLmwvby53ZWlnaHQsby5hdmcuYT1mLmEvby53ZWlnaHQsby5hdmcuYj1mLmIvby53ZWlnaHQ7Y29uc3QgdT17bDowLGE6MCxiOjB9O2ZvcihsZXQgZz1kO2c8PWw7ZysrKXtjb25zdCB3PWVbZ107dS5sKz1UKHcubGFiLmwtby5hdmcubCwyKSp3LmNvdW50LHUuYSs9VCh3LmxhYi5hLW8uYXZnLmEsMikqdy5jb3VudCx1LmIrPVQody5sYWIuYi1vLmF2Zy5iLDIpKncuY291bnR9by5zb3J0PWEodS5sLHUuYSx1LmIpLG8uc2NvcmU9TWF0aC5tYXgodS5sLHUuYSx1LmIpfSxuPShvLGQpPT57Y29uc3QgbD17c3RhcnQ6ZCsxLGVuZDpvLmVuZCxzb3J0ZWQ6by5zb3J0ZWQsY291bnQ6MCxzY29yZTowLHdlaWdodDowLHNvcnQ6ImxhYiIsYXZnOntsOjAsYTowLGI6MH19O3MobCksby5lbmQtPWwuY291bnQscyhvKSxyLnB1c2gobCksYysrfSxpPSgpPT57bGV0IG89LTEsZD0tMTtpZihjPT09dGhpcy5tYXhDb2xvcnMpcmV0dXJuLTE7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3QgZj1yW2xdO2YuY291bnQ+PTImJmYuc2NvcmU+ZCYmKG89bCxkPWYuc2NvcmUpfXJldHVybiBvfTtmb3Iocyh0KTt0JiZ0LmNvdW50PjE7KXtjb25zdHtzdGFydDpvLGVuZDpkLHNvcnQ6bCxzb3J0ZWQ6Zn09dDtpZihsIT09Zil7Y29uc3QgQz1lLnNsaWNlKG8sZCsxKS5zb3J0KG9lLmNyZWF0ZVNvcnRlcihsKSk7Zm9yKGxldCB4PUMubGVuZ3RoLGI9MDtiPHg7YisrKWVbbytiXT1DW2JdO3Quc29ydGVkPWx9Y29uc3QgdT10LndlaWdodCsxPj4xO2xldCBnPW8sdz0wO2Zvcig7ZzxkLTEmJih3Kz1lW2ddLmNvdW50LCEodz51KSk7ZysrKTtuKHQsZyk7Y29uc3QgcD1pKCk7dD1wPj0wP3JbcF06bnVsbH1yZXR1cm4gcn1fYm94ZXNUb1F1YW50aXplZENvbG9ycyhlKXtjb25zdCB0PWUucmVkdWNlKChyLGMpPT5yK2Mud2VpZ2h0LDApO3JldHVybiBlLm1hcChyPT57Y29uc3R7cjpjLGc6YSxiOnN9PVJlKHIuYXZnKTtyZXR1cm57cmdiSW50Om5lKGMsYSxzKSxyZ2I6e3I6YyxnOmEsYjpzfSxoZXg6YCMke2MudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX0ke2EudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX0ke3MudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX1gLGxhYjpyLmF2Zyxjb3VudDpyLndlaWdodCxwZXJjZW50YWdlOnIud2VpZ2h0L3R9fSkuc29ydCgocixjKT0+ci5yZ2JJbnQtYy5yZ2JJbnQpfX1jbGFzcyAkZXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5zdGF0c01vZGU9ZSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT10LHRoaXMudGludD1yLHRoaXMuX2NvbG9ycz1bXSx0aGlzLl9jYWNoZT1uZXcgTWFwLHRoaXMucmVhZGFibGU9bmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDpjPT50aGlzLl9yc0NvbnRyb2xlcj1jfSksdGhpcy53cml0YWJsZT1uZXcgV3JpdGFibGVTdHJlYW0oe3dyaXRlOmM9Pntmb3IobGV0IGE9Yy5sZW5ndGgscz0wO3M8YTtzKz00KXtsZXQgbj1jW3NdLGk9Y1tzKzFdLG89Y1tzKzJdO2NvbnN0IGQ9Y1tzKzNdO2lmKHRoaXMuc3RhdHNNb2RlPT09ImRpZmYiJiZ0aGlzLl9wcmV2aW91c1BpeGVscyYmbj09PXRoaXMuX3ByZXZpb3VzUGl4ZWxzW3NdJiZpPT09dGhpcy5fcHJldmlvdXNQaXhlbHNbcysxXSYmbz09PXRoaXMuX3ByZXZpb3VzUGl4ZWxzW3MrMl0mJmQ9PT10aGlzLl9wcmV2aW91c1BpeGVsc1tzKzNdKWNvbnRpbnVlOyh7cjpuLGc6aSxiOm99PXdlKG4saSxvLGQsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy50aW50KSk7Y29uc3QgbD1uZShuLGksbyksZj17cmdiSW50OmwsbGFiOnBlKG4saSxvKSxjb3VudDoxfSx1PWwlMzI3Njg7bGV0IGc9dGhpcy5fY2FjaGUuZ2V0KHUpO2d8fHRoaXMuX2NhY2hlLnNldCh1LGc9bmV3IE1hcCk7bGV0IHc9Zy5nZXQobCk7aWYodyE9PXZvaWQgMCl7dGhpcy5fY29sb3JzW3ddLmNvdW50Kys7Y29udGludWV9dz10aGlzLl9jb2xvcnMucHVzaChmKS0xLGcuc2V0KGwsdyl9dGhpcy5zdGF0c01vZGU9PT0iZGlmZiImJih0aGlzLl9wcmV2aW91c1BpeGVscz1jKX0sY2xvc2U6KCk9Pnt0aGlzLl9yc0NvbnRyb2xlci5lbnF1ZXVlKHRoaXMuX2NvbG9ycy5zbGljZSgpKSx0aGlzLl9yc0NvbnRyb2xlci5jbG9zZSgpLHRoaXMuX2NvbG9ycy5sZW5ndGg9MCx0aGlzLl9jYWNoZS5jbGVhcigpLHRoaXMuX3ByZXZpb3VzUGl4ZWxzPXZvaWQgMH19KX19Y2xhc3MgYmV7Y29uc3RydWN0b3IoZT1bXSx0PSExLHI9WzI1NSwyNTUsMjU1XSl7dGhpcy5fcHJlbXVsdGlwbGllZEFscGhhPXQsdGhpcy5fdGludD1yLHRoaXMuX2NhY2hlPW5ldyBNYXAsdGhpcy5fY29sb3JNYXA9W10sZS5sZW5ndGgmJnRoaXMuc2V0dXAoZSl9c2V0dXAoZSl7ZT1lLnNvcnQoKHMsbik9PnMucmdiSW50LW4ucmdiSW50KSx0aGlzLl9jYWNoZS5jbGVhcigpO2NvbnN0IHQ9W10scj1uZXcgTWFwO2ZvcihsZXQgcz0tMSxuPWUubGVuZ3RoLGk9MDtpPG47aSsrKXtjb25zdHtyZ2JJbnQ6b309ZVtpXTtpZihvPT09cyl7ci5zZXQoaSwhMCk7Y29udGludWV9cz1vfWEoe21pbjpbLTY1NTM1LC02NTUzNSwtNjU1MzVdLG1heDpbNjU1MzUsNjU1MzUsNjU1MzVdfSksdGhpcy5fY29sb3JNYXA9dDtmdW5jdGlvbiBjKHMpe2NvbnN0IG49e21pbjpbNjU1MzUsNjU1MzUsNjU1MzVdLG1heDpbLTY1NTM1LC02NTUzNSwtNjU1MzVdfSxpPVtdO2ZvcihsZXQgZz1lLmxlbmd0aCx3PTA7dzxnO3crKyl7Y29uc3R7bGFiOnB9PWVbd107ci5oYXModyl8fHAubDxzLm1pblswXXx8cC5hPHMubWluWzFdfHxwLmI8cy5taW5bMl18fHAubD5zLm1heFswXXx8cC5hPnMubWF4WzFdfHxwLmI+cy5tYXhbMl18fChwLmw8bi5taW5bMF0mJihuLm1pblswXT1wLmwpLHAuYTxuLm1pblsxXSYmKG4ubWluWzFdPXAuYSkscC5iPG4ubWluWzJdJiYobi5taW5bMl09cC5iKSxwLmw+bi5tYXhbMF0mJihuLm1heFswXT1wLmwpLHAuYT5uLm1heFsxXSYmKG4ubWF4WzFdPXAuYSkscC5iPm4ubWF4WzJdJiYobi5tYXhbMl09cC5iKSxpLnB1c2goe2xhYjpwLGluZGV4Ond9KSl9bGV0IG89ImwiLGQ9MDtpZighaS5sZW5ndGgpcmV0dXJue2luZGV4Oi0xLGxvbmdlc3Q6byxsb25nZXN0SW5kZXg6ZH07Y29uc3QgbD1uLm1heFswXS1uLm1pblswXSxmPW4ubWF4WzFdLW4ubWluWzFdLHU9bi5tYXhbMl0tbi5taW5bMl07cmV0dXJuIHU+PWwmJnU+PWYmJihvPSJiIixkPTIpLGY+PWwmJmY+PXUmJihvPSJhIixkPTEpLGw+PWYmJmw+PXUmJihvPSJsIixkPTApLHtpbmRleDppLnNvcnQoKGcsdyk9PmcubGFiW29dLXcubGFiW29dKVtpLmxlbmd0aD4+MV0uaW5kZXgsbG9uZ2VzdDpvLGxvbmdlc3RJbmRleDpkfX1mdW5jdGlvbiBhKHMpe2NvbnN0e2luZGV4Om4sbG9uZ2VzdDppLGxvbmdlc3RJbmRleDpvfT1jKHMpO2lmKG48MClyZXR1cm4tMTtyLnNldChuLCEwKTtjb25zdHtsYWI6ZH09ZVtuXSxsPXtsZWZ0OjAscmlnaHQ6MCxsb25nZXN0OmksbGFiOmQsaW5kZXg6bn0sZj10LnB1c2gobCktMSx1PXttYXg6Wy4uLnMubWF4XSxtaW46Wy4uLnMubWluXX0sZz17bWF4OlsuLi5zLm1heF0sbWluOlsuLi5zLm1pbl19O3UubWF4W29dPWRbaV0sZy5taW5bb109TWF0aC5taW4oZFtpXSsxLDY1NTM1KTtjb25zdCB3PWEodSk7bGV0IHA9LTE7cmV0dXJuIGcubWluW29dPD1nLm1heFtvXSYmKHA9YShnKSksbC5sZWZ0PXcsbC5yaWdodD1wLGZ9fV9jb2xvcm1hcE5lYXJlc3ROb2RlKGUsdCxyKXtjb25zdHtsZWZ0OmMscmlnaHQ6YSxsb25nZXN0OnMsbGFiOm4saW5kZXg6aX09dGhpcy5fY29sb3JNYXBbZV0sbz1NYXRoLm1pbihUKHQubC1uLmwsMikrVCh0LmEtbi5hLDIpK1QodC5iLW4uYiwyKSw0Mjk0OTY3Mjk0KTtvPHIuZGlzdCYmKHIuaW5kZXg9aSxyLmRpc3Q9byk7bGV0IGQsbDtpZihjIT09LTF8fGEhPT0tMSl7Y29uc3QgZj10W3NdLW5bc107Zjw9MD8oZD1jLGw9YSk6KGQ9YSxsPWMpLGQhPT0tMSYmdGhpcy5fY29sb3JtYXBOZWFyZXN0Tm9kZShkLHQsciksbCE9PS0xJiZUKGYsMik8ci5kaXN0JiZ0aGlzLl9jb2xvcm1hcE5lYXJlc3ROb2RlKGwsdCxyKX19ZmluZE5lYXJlc3RJbmRleChlLHQscixjPTI1NSl7KHtyOmUsZzp0LGI6cn09d2UoZSx0LHIsYyx0aGlzLl9wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5fdGludCkpO2NvbnN0IGE9bmUoZSx0LHIpLHM9YSUzMjc2ODtsZXQgbj10aGlzLl9jYWNoZS5nZXQocyk7bnx8dGhpcy5fY2FjaGUuc2V0KHMsbj1uZXcgTWFwKTtsZXQgaT1uLmdldChhKTtpZihpIT09dm9pZCAwKXJldHVybiBpO2NvbnN0IG89e2Rpc3Q6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsaW5kZXg6LTF9O3JldHVybiB0aGlzLl9jb2xvcm1hcE5lYXJlc3ROb2RlKDAscGUoZSx0LHIpLG8pLGk9by5pbmRleCxuLnNldChhLGkpLGl9fWNsYXNzIERle2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuY29sb3JzPVtdLHRoaXMuY29uZmlnPXRoaXMuX3Jlc29sdmVPcHRpb25zKGUpLHRoaXMuX3N0cmVhbT10aGlzLl9jcmVhdGVTdHJlYW0oKX1fcmVzb2x2ZU9wdGlvbnMoZSl7Y29uc3R7bWF4Q29sb3JzOnQ9MjU2LHN0YXRzTW9kZTpyPSJmdWxsIixhbGdvcml0aG06Yz0ibWVkaWFuLWN1dCIscHJlbXVsdGlwbGllZEFscGhhOmE9ITEsdGludDpzPVsyNTUsMjU1LDI1NV0sc2FtcGxlczpuPVtdfT1lO3JldHVybnttYXhDb2xvcnM6dCxzdGF0c01vZGU6cixhbGdvcml0aG06YyxwcmVtdWx0aXBsaWVkQWxwaGE6YSx0aW50OnMsc2FtcGxlczpufX1fY3JlYXRlU3RyZWFtKCl7bGV0IGU7c3dpdGNoKHRoaXMuY29uZmlnLmFsZ29yaXRobSl7Y2FzZSJtZWRpYW4tY3V0IjpkZWZhdWx0OmU9bmV3IG9lKHRoaXMuY29uZmlnLm1heENvbG9ycyk7YnJlYWt9cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6dD0+e3RoaXMuX3N0cmVhbUNvbnRyb2xlcj10LHRoaXMuY29uZmlnLnNhbXBsZXMuZm9yRWFjaChyPT50LmVucXVldWUocikpfX0pLnBpcGVUaHJvdWdoKG5ldyBKKS5waXBlVGhyb3VnaChuZXcgJGUodGhpcy5jb25maWcuc3RhdHNNb2RlLHRoaXMuY29uZmlnLnByZW11bHRpcGxpZWRBbHBoYSx0aGlzLmNvbmZpZy50aW50KSkucGlwZVRocm91Z2goZSl9YWRkU2FtcGxlKGUpe3RoaXMuX3N0cmVhbUNvbnRyb2xlci5lbnF1ZXVlKGUpfWdlbmVyYXRlKCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLl9zdHJlYW1Db250cm9sZXIuY2xvc2UoKSx0aGlzLl9zdHJlYW0ucGlwZVRvKG5ldyBXcml0YWJsZVN0cmVhbSh7d3JpdGU6dD0+e3RoaXMuY29sb3JzPXQsdGhpcy5maW5kZXI9bmV3IGJlKHQsdGhpcy5jb25maWcucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuY29uZmlnLnRpbnQpLHRoaXMuX3N0cmVhbT10aGlzLl9jcmVhdGVTdHJlYW0oKSxlKHQpfX0pKX0pfW1hdGNoKGUpe3ZhciB0O2xldCByO2lmKHR5cGVvZiBlPT0ibnVtYmVyIilyPVtlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LGUmMjU1XTtlbHNlIGlmKHR5cGVvZiBlPT0ic3RyaW5nIil7Y29uc3Qgcz1lLnJlcGxhY2UoL14jLywiIik7cj1bYCR7c1swXX0ke3NbMV19YCxgJHtzWzJdfSR7c1szXX1gLGAke3NbNF19JHtzWzVdfWBdLm1hcChuPT5wYXJzZUludChuLDE2KSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXI9ZTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIGZvcm1hdCIpO2NvbnN0IGM9KHQ9dGhpcy5maW5kZXIpPT1udWxsP3ZvaWQgMDp0LmZpbmROZWFyZXN0SW5kZXgoclswXSxyWzFdLHJbMl0sclszXSk7aWYoYz09PXZvaWQgMHx8YzwwKXJldHVybjtjb25zdCBhPXRoaXMuY29sb3JzW2NdO2lmKGEpcmV0dXJue2NvbG9yOmEsaW5kZXg6Y319dG9Db2xvcnMoKXtyZXR1cm4gdGhpcy5jb2xvcnMuc2xpY2UoKX10b0hleENvbG9ycygpe3JldHVybiB0aGlzLmNvbG9ycy5tYXAoZT0+ZS5oZXgpfXRvUmdiQ29sb3JzKCl7cmV0dXJuIHRoaXMuY29sb3JzLm1hcChlPT5lLnJnYil9dG9SZ2JJbnRDb2xvcnMoKXtyZXR1cm4gdGhpcy5jb2xvcnMubWFwKGU9PmUucmdiSW50KX10b0xhYkNvbG9ycygpe3JldHVybiB0aGlzLmNvbG9ycy5tYXAoZT0+ZS5sYWIpfXRvVWludDhBcnJheShlPXRoaXMuY29sb3JzLmxlbmd0aCo0KXt2YXIgYTt2YXIgdDtsZXQgcjtjb25zdCBjPW5ldyBVaW50OENsYW1wZWRBcnJheShlKTtmb3IobGV0IHM9MDtzPGU7cysrKXtjb25zdCBuPXMqNCxpPShhPSh0PXRoaXMuY29sb3JzW3NdKT09bnVsbD92b2lkIDA6dC5yZ2IpIT1udWxsP2E6cjtpJiYoY1tuXT1pLnIsY1tuKzFdPWkuZyxjW24rMl09aS5iLGNbbiszXT0yNTUscj1pKX1yZXR1cm4gY31jbGVhcigpe3RoaXMuY29sb3JzLmxlbmd0aD0wLHRoaXMuX3N0cmVhbT10aGlzLl9jcmVhdGVTdHJlYW0oKX19Y29uc3QgRD1jbGFzcyBEe2NvbnN0cnVjdG9yKGU9ITApe3RoaXMuaXNEZWJ1Zz1lfXRpbWUoZSl7dGhpcy5pc0RlYnVnJiZjb25zb2xlLnRpbWUoYCR7RC5wcmVmaXh9ICR7ZX1gKX10aW1lRW5kKGUpe3RoaXMuaXNEZWJ1ZyYmY29uc29sZS50aW1lRW5kKGAke0QucHJlZml4fSAke2V9YCl9ZGVidWcoLi4uZSl7dGhpcy5pc0RlYnVnJiZjb25zb2xlLmRlYnVnKEQucHJlZml4LC4uLmUpfXdhcm4oLi4uZSl7dGhpcy5pc0RlYnVnJiZjb25zb2xlLndhcm4oRC5wcmVmaXgsLi4uZSl9fTt5KEQsInByZWZpeCIsIlttb2Rlcm4tZ2lmXSIpO2xldCBzZT1EO2NsYXNzIExle2NvbnN0cnVjdG9yKGUpe3kodGhpcywiX3JzQ29udHJvbGVyIik7eSh0aGlzLCJfZnJhbWVzIixbXSk7eSh0aGlzLCJyZWFkYWJsZSIsbmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDplPT50aGlzLl9yc0NvbnRyb2xlcj1lfSkpO3kodGhpcywid3JpdGFibGUiLG5ldyBXcml0YWJsZVN0cmVhbSh7d3JpdGU6ZT0+e3RoaXMuX2ZyYW1lcy5wdXNoKGUpfSxjbG9zZTooKT0+e2NvbnN0IGU9dGhpcy5fY29uZmlnLmJhY2tncm91bmRDb2xvckluZGV4O2xldCB0O3RoaXMuX2ZyYW1lcy5mb3JFYWNoKChyLGMpPT57dmFyIEMseDtjb25zdHt3aWR0aDphPTEsaGVpZ2h0OnM9MSxkYXRhOm59PXIsaT1yLnRyYW5zcGFyZW50fHwoKHg9KEM9dGhpcy5fZnJhbWVzW2MrMV0pPT1udWxsP3ZvaWQgMDpDLnRyYW5zcGFyZW50KSE9bnVsbD94OiEwKTtsZXQgbz0wLGQ9MCxsPWEtMSxmPXMtMSx1O2lmKGkpe2Zvcig7ZDxmOyl7bGV0IGI9ITA7Zm9yKGxldCBtPTA7bTxhO20rKylpZihuW2EqZCttXSE9PWUpe2I9ITE7YnJlYWt9aWYoIWIpYnJlYWs7ZCsrfWZvcig7Zj5kOyl7bGV0IGI9ITA7Zm9yKGxldCBtPTA7bTxhO20rKylpZihuW2EqZittXSE9PWUpe2I9ITE7YnJlYWt9aWYoIWIpYnJlYWs7Zi0tfWZvcig7bzxsOyl7bGV0IGI9ITA7Zm9yKGxldCBtPWQ7bTxmO20rKylpZihuW2EqbStvXSE9PWUpe2I9ITE7YnJlYWt9aWYoIWIpYnJlYWs7bysrfWZvcig7bD5vOyl7bGV0IGI9ITA7Zm9yKGxldCBtPWQ7bTxmO20rKylpZihuW2EqbStsXSE9PWUpe2I9ITE7YnJlYWt9aWYoIWIpYnJlYWs7bC0tfX1lbHNle2lmKHQpe2Zvcig7ZDxmOyl7bGV0IGI9ITA7Zm9yKGxldCBtPTA7bTxhO20rKyl7Y29uc3QgUz1hKmQrbTtpZihuW1NdIT09dFtTXSl7Yj0hMTticmVha319aWYoIWIpYnJlYWs7ZCsrfWZvcig7Zj5kOyl7bGV0IGI9ITA7Zm9yKGxldCBtPTA7bTxhO20rKyl7Y29uc3QgUz1hKmYrbTtpZihuW1NdIT09dFtTXSl7Yj0hMTticmVha319aWYoIWIpYnJlYWs7Zi0tfWlmKGQ9PT1mKW89bDtlbHNle2Zvcig7bzxsOyl7bGV0IGI9ITA7Zm9yKGxldCBtPWQ7bTw9ZjttKyspe2NvbnN0IFM9bSphK287aWYobltTXSE9PXRbU10pe2I9ITE7YnJlYWt9fWlmKCFiKWJyZWFrO28rK31mb3IoO2w+bzspe2xldCBiPSEwO2ZvcihsZXQgbT1kO208PWY7bSsrKXtjb25zdCBTPW0qYStsO2lmKG5bU10hPT10W1NdKXtiPSExO2JyZWFrfX1pZighYilicmVhaztsLS19fX11PXQsdD1ufWNvbnN0IGc9bCsxLW8sdz1mKzEtZCxwPW5ldyBVaW50OENsYW1wZWRBcnJheShnKncpO2ZvcihsZXQgYj0wO2I8dztiKyspZm9yKGxldCBtPTA7bTxnO20rKyl7Y29uc3QgUz1iKmcrbSxBPShkK2IpKmErKG8rbSk7aWYoIWkmJnUmJm5bQV09PT11W0FdKXtwW1NdPWU7Y29udGludWV9cFtTXT1uW0FdfXRoaXMuX3JzQ29udHJvbGVyLmVucXVldWUoUihPKHt9LHIpLHtsZWZ0Om8sdG9wOmQsd2lkdGg6ZyxoZWlnaHQ6dyxkaXNwb3NhbDppPzI6MSxkYXRhOnAsZ3JhcGhpY0NvbnRyb2w6UihPKHt9LHIuZ3JhcGhpY0NvbnRyb2wpLHt0cmFuc3BhcmVudDohMCx0cmFuc3BhcmVudEluZGV4OmV9KX0pKX0pLHRoaXMuX3JzQ29udHJvbGVyLmNsb3NlKCl9fSkpO3RoaXMuX2NvbmZpZz1lfX1jbGFzcyBtZXtjb25zdHJ1Y3RvcihlPTQwOTYpe3kodGhpcywiX2NodW5rcyIpO3kodGhpcywiX2NodW5rSW5kZXgiLDApO3kodGhpcywiX2NodW5rT2Zmc2V0IiwwKTt0aGlzLl9jaHVua0J5dGVMZW5ndGg9ZSx0aGlzLl9jaHVua3M9W3RoaXMuX2NyZWF0ZUNodW5rKCldfWdldCBjdXJzb3IoKXtyZXR1cm5bdGhpcy5fY2h1bmtJbmRleCx0aGlzLl9jaHVua09mZnNldF19X2NyZWF0ZUNodW5rKCl7cmV0dXJuIG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5fY2h1bmtCeXRlTGVuZ3RoKSl9d3JpdGVCeXRlKGUsdCl7dD90aGlzLl9jaHVua3NbdFswXV0uc2V0VWludDgodFsxXSxlKToodGhpcy5fY2h1bmtPZmZzZXQ+PXRoaXMuX2NodW5rQnl0ZUxlbmd0aCYmKHRoaXMuX2NodW5rc1srK3RoaXMuX2NodW5rSW5kZXhdPXRoaXMuX2NyZWF0ZUNodW5rKCksdGhpcy5fY2h1bmtPZmZzZXQ9MCksdGhpcy5fY2h1bmtzW3RoaXMuX2NodW5rSW5kZXhdLnNldFVpbnQ4KHRoaXMuX2NodW5rT2Zmc2V0KyssZSkpfXdyaXRlQnl0ZXMoZSl7ZS5mb3JFYWNoKHQ9PnRoaXMud3JpdGVCeXRlKHQpKX13cml0ZVN0cmluZyhlKXtlLnNwbGl0KCIiKS5mb3JFYWNoKHQ9Pnt0aGlzLndyaXRlQnl0ZSh0LmNoYXJDb2RlQXQoMCkpfSl9d3JpdGVVbnNpZ25lZChlKXt0aGlzLndyaXRlQnl0ZXMoW2UmMjU1LGU+PjgmMjU1XSl9Y2FsY3VsYXRlRGlzdGFuY2UoZSl7cmV0dXJuIHRoaXMuX2NodW5rSW5kZXgqdGhpcy5fY2h1bmtCeXRlTGVuZ3RoK3RoaXMuX2NodW5rT2Zmc2V0LShlWzBdKnRoaXMuX2NodW5rQnl0ZUxlbmd0aCtlWzFdKX10b1VpbnQ4QXJyYXkoKXt0aGlzLl9jaHVua3NbdGhpcy5fY2h1bmtJbmRleF09bmV3IERhdGFWaWV3KHRoaXMuX2NodW5rc1t0aGlzLl9jaHVua0luZGV4XS5idWZmZXIuc2xpY2UoMCx0aGlzLl9jaHVua09mZnNldCkpO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5fY2h1bmtzLnJlZHVjZSgocixjKT0+citjLmJ5dGVMZW5ndGgsMCkpO2xldCB0PTA7cmV0dXJuIHRoaXMuX2NodW5rcy5mb3JFYWNoKHI9PntlLnNldChuZXcgVWludDhBcnJheShyLmJ1ZmZlciksdCksdCs9ci5ieXRlTGVuZ3RofSksdGhpcy5fY2h1bmtzPVt0aGlzLl9jcmVhdGVDaHVuaygpXSx0aGlzLl9jaHVua0luZGV4PTAsdGhpcy5fY2h1bmtPZmZzZXQ9MCxlfX1jbGFzcyB6ZXtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsIl9yc0NvbnRyb2xlciIpO3kodGhpcywiX2ZyYW1lcyIsW10pO3kodGhpcywicmVhZGFibGUiLG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6ZT0+dGhpcy5fcnNDb250cm9sZXI9ZX0pKTt5KHRoaXMsIndyaXRhYmxlIixuZXcgV3JpdGFibGVTdHJlYW0oe3dyaXRlOmU9Pnt0aGlzLl9mcmFtZXMucHVzaChlKX0sY2xvc2U6KCk9Pntjb25zdCBlPXRoaXMuX2VuY29kZUhlYWRlcigpLHQ9dWUodGhpcy5fZnJhbWVzKSxyPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoK3QuYnl0ZUxlbmd0aCsxKTtyLnNldChlKSxyLnNldCh0LGUuYnl0ZUxlbmd0aCkscltyLmxlbmd0aC0xXT1mZSx0aGlzLl9yc0NvbnRyb2xlci5lbnF1ZXVlKHIpLHRoaXMuX3JzQ29udHJvbGVyLmNsb3NlKCksdGhpcy5fZnJhbWVzLmxlbmd0aD0wfX0pKTt0aGlzLl9jb25maWc9ZX1fZW5jb2RlSGVhZGVyKCl7dmFyIGMsYSxzO2NvbnN0IGU9Tyh7dmVyc2lvbjoiODlhIixsb29wZWQ6ITAsbG9vcENvdW50OjAscGl4ZWxBc3BlY3RSYXRpbzowfSx0aGlzLl9jb25maWcpO2lmKGUud2lkdGg8PTB8fGUud2lkdGg+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJXaWR0aCBpbnZhbGlkLiIpO2lmKGUuaGVpZ2h0PD0wfHxlLmhlaWdodD42NTUzNSl0aHJvdyBuZXcgRXJyb3IoIkhlaWdodCBpbnZhbGlkLiIpO2xldCB0PTA7aWYoKGM9ZS5jb2xvclRhYmxlKSE9bnVsbCYmYy5sZW5ndGgpe2xldCBuPWUuY29sb3JUYWJsZS5sZW5ndGg7aWYobjwyfHxuPjI1Nnx8biZuLTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbG9yIHRhYmxlIGxlbmd0aCwgbXVzdCBiZSBwb3dlciBvZiAyIGFuZCAyIC4uIDI1Ni4iKTtmb3IoO24+Pj0xOykrK3Q7aWYobj0xPDx0LGUuY29sb3JUYWJsZVNpemU9LS10LGUuYmFja2dyb3VuZENvbG9ySW5kZXg+PW4pdGhyb3cgbmV3IEVycm9yKCJCYWNrZ3JvdW5kIGluZGV4IG91dCBvZiByYW5nZS4iKTtpZihlLmJhY2tncm91bmRDb2xvckluZGV4PT09MCl0aHJvdyBuZXcgRXJyb3IoIkJhY2tncm91bmQgaW5kZXggZXhwbGljaXRseSBwYXNzZWQgYXMgMC4iKX1jb25zdCByPW5ldyBtZTtyZXR1cm4gci53cml0ZVN0cmluZyhJKSxyLndyaXRlU3RyaW5nKGUudmVyc2lvbiksci53cml0ZVVuc2lnbmVkKGUud2lkdGgpLHIud3JpdGVVbnNpZ25lZChlLmhlaWdodCksci53cml0ZUJ5dGUoTnVtYmVyLnBhcnNlSW50KGAke2UuY29sb3JUYWJsZVNpemU/MTowfTExMTAke2UuY29sb3JUYWJsZVNpemUudG9TdHJpbmcoMikucGFkU3RhcnQoMywiMCIpfWAsMikpLHIud3JpdGVCeXRlKGUuYmFja2dyb3VuZENvbG9ySW5kZXgpLHIud3JpdGVCeXRlKGUucGl4ZWxBc3BlY3RSYXRpbyksci53cml0ZUJ5dGVzKChzPShhPWUuY29sb3JUYWJsZSk9PW51bGw/dm9pZCAwOmEuZmxhdCgpKSE9bnVsbD9zOltdKSxlLmxvb3BlZCYmKHIud3JpdGVCeXRlKHopLHIud3JpdGVCeXRlKGopLHIud3JpdGVCeXRlKFEpLHIud3JpdGVTdHJpbmcoIk5FVFNDQVBFMi4wIiksci53cml0ZUJ5dGUoMyksci53cml0ZUJ5dGUoMSksci53cml0ZVVuc2lnbmVkKGUubG9vcENvdW50KSxyLndyaXRlQnl0ZSgwKSksci50b1VpbnQ4QXJyYXkoKX19ZnVuY3Rpb24gRmUoaCxlLHQpe3Qud3JpdGVCeXRlKGgpO2xldCByPXQuY3Vyc29yO3Qud3JpdGVCeXRlKDApO2NvbnN0IGM9MTw8aCxhPWMtMSxzPWMrMTtsZXQgbj1zKzEsaT1oKzEsbz0wLGQ9MDtmdW5jdGlvbiBsKHgpe2Zvcig7bz49eDspdC53cml0ZUJ5dGUoZCYyNTUpLGQ+Pj04LG8tPTgsdC5jYWxjdWxhdGVEaXN0YW5jZShyKT09PTI1NiYmKHQud3JpdGVCeXRlKDI1NSxyKSxyPXQuY3Vyc29yLHQud3JpdGVCeXRlKDApKX1mdW5jdGlvbiBmKHgpe2R8PXg8PG8sbys9aSxsKDgpfWxldCB1PWVbMF0mYSxnPXt9LHcscCxDO2YoYyk7Zm9yKGxldCB4PWUubGVuZ3RoLGI9MTtiPHg7KytiKWlmKEM9ZVtiXSZhLHc9dTw8OHxDLHA9Z1t3XSxwPT09dm9pZCAwKXtmb3IoZHw9dTw8byxvKz1pO28+PTg7KXQud3JpdGVCeXRlKGQmMjU1KSxkPj49OCxvLT04LHQuY2FsY3VsYXRlRGlzdGFuY2Uocik9PT0yNTYmJih0LndyaXRlQnl0ZSgyNTUscikscj10LmN1cnNvcix0LndyaXRlQnl0ZSgwKSk7bj09PTQwOTY/KGYoYyksbj1zKzEsaT1oKzEsZz17fSk6KG4+PTE8PGkmJisraSxnW3ddPW4rKyksdT1DfWVsc2UgdT1wO2YodSksZihzKSxsKDEpLHQuY2FsY3VsYXRlRGlzdGFuY2Uocik9PT0xP3Qud3JpdGVCeXRlKDAscik6KHQud3JpdGVCeXRlKHQuY2FsY3VsYXRlRGlzdGFuY2UociktMSxyKSx0LndyaXRlQnl0ZSgwKSl9Y2xhc3MgV2V7Y29uc3RydWN0b3IoZSl7eSh0aGlzLCJfcnNDb250cm9sZXIiKTt5KHRoaXMsInJlYWRhYmxlIixuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OmU9PnRoaXMuX3JzQ29udHJvbGVyPWV9KSk7eSh0aGlzLCJ3cml0YWJsZSIsbmV3IFdyaXRhYmxlU3RyZWFtKHt3cml0ZTplPT57dmFyIGcsdyxwO2NvbnN0IHQ9bmV3IG1lLHtsZWZ0OnI9MCx0b3A6Yz0wLHdpZHRoOmE9MCxoZWlnaHQ6cz0wLGRlbGF5Om49MTAwLGNvbG9yVGFibGU6aX09ZTtsZXR7ZGlzcG9zYWw6bz0wfT1lO2NvbnN0IGQ9KGc9ZS5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOmcudHJhbnNwYXJlbnQ7bGV0IGw9KHA9KHc9ZS5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOncudHJhbnNwYXJlbnRJbmRleCkhPW51bGw/cDoyNTU7aWYocjwwfHxyPjY1NTM1KXRocm93IG5ldyBFcnJvcigiTGVmdCBpbnZhbGlkLiIpO2lmKGM8MHx8Yz42NTUzNSl0aHJvdyBuZXcgRXJyb3IoIlRvcCBpbnZhbGlkLiIpO2lmKGE8PTB8fGE+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJXaWR0aCBpbnZhbGlkLiIpO2lmKHM8PTB8fHM+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJIZWlnaHQgaW52YWxpZC4iKTtsZXQgZj04LHU9aT9pLmxlbmd0aDowO2lmKHUpe2lmKHU8Mnx8dT4yNTZ8fHUmdS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciB0YWJsZSBsZW5ndGgsIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgMiAuLiAyNTYuIik7Zm9yKDt1Pj49MTspKytmfXQud3JpdGVCeXRlKHopLHQud3JpdGVCeXRlKEUpLHQud3JpdGVCeXRlKEYpLGQ/b3x8KG89Mik6bD0wLHQud3JpdGVCeXRlKE51bWJlci5wYXJzZUludChgMDAwJHtOdW1iZXIobyY3KS50b1N0cmluZygyKS5wYWRTdGFydCgzLCIwIil9MCR7ZD8xOjB9YCwyKSksdC53cml0ZVVuc2lnbmVkKG4vMTApLHQud3JpdGVCeXRlKGwpLHQud3JpdGVCeXRlKDApLHQud3JpdGVCeXRlKFopLHQud3JpdGVVbnNpZ25lZChyKSx0LndyaXRlVW5zaWduZWQoYyksdC53cml0ZVVuc2lnbmVkKGEpLHQud3JpdGVVbnNpZ25lZChzKSxpIT1udWxsJiZpLmxlbmd0aD8odC53cml0ZUJ5dGUoTnVtYmVyLnBhcnNlSW50KGAxMDAwMCR7KGYtMSkudG9TdHJpbmcoMikucGFkU3RhcnQoMywiMCIpfWAsMikpLHQud3JpdGVCeXRlcyhpLmZsYXQoKSkpOnQud3JpdGVCeXRlKDApLEZlKGYsZS5kYXRhLHQpLHRoaXMuX3JzQ29udHJvbGVyLmVucXVldWUodC50b1VpbnQ4QXJyYXkoKSl9LGNsb3NlOigpPT50aGlzLl9yc0NvbnRyb2xlci5jbG9zZSgpfSkpO3RoaXMuX2NvbmZpZz1lfX1jb25zdCBfZT17ImZsb3lkLXN0ZWluYmVyZyI6W1s3LzE2LDEsMF0sWzMvMTYsLTEsMV0sWzUvMTYsMCwxXSxbMS8xNiwxLDFdXSxhdGtpbnNvbjpbWzEvOCwxLDBdLFsxLzgsMiwwXSxbMS84LC0xLDFdLFsxLzgsMCwxXSxbMS84LDEsMV0sWzEvOCwwLDJdXSxzdHVja2k6W1s4LzQyLDEsMF0sWzQvNDIsMiwwXSxbMi80MiwtMiwxXSxbNC80MiwtMSwxXSxbOC80MiwwLDFdLFs0LzQyLDEsMV0sWzIvNDIsMiwxXSxbMS80MiwtMiwyXSxbMi80MiwtMSwyXSxbNC80MiwwLDJdLFsyLzQyLDEsMl0sWzEvNDIsMiwyXV19O2NsYXNzIFhle2NvbnN0cnVjdG9yKGUsdCl7eSh0aGlzLCJfcnNDb250cm9sZXIiKTt5KHRoaXMsIl9maW5kZXIiKTt5KHRoaXMsIl9jb2xvcnMiKTt5KHRoaXMsInJlYWRhYmxlIixuZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0OmU9PnRoaXMuX3JzQ29udHJvbGVyPWV9KSk7eSh0aGlzLCJ3cml0YWJsZSIsbmV3IFdyaXRhYmxlU3RyZWFtKHt3cml0ZTplPT57Y29uc3QgdD10aGlzLl9jb25maWcuYmFja2dyb3VuZENvbG9ySW5kZXgscj1lLmRhdGE7aWYoZS53aWR0aCYmZS5oZWlnaHQmJih0aGlzLl9jb25maWcuZGl0aGVyfHx0aGlzLl9jb25maWcuZGl0aGVyVHJhbnNwYXJlbmN5KSl7Y29uc3Qgcz0obixpLG8pPT4oaSplLndpZHRoK24pKjQrbztpZih0aGlzLl9jb25maWcuZGl0aGVyKXtjb25zdCBuPV9lW3RoaXMuX2NvbmZpZy5kaXRoZXJdO2ZvcihsZXQgaT0wO2k8ZS5oZWlnaHQ7aSsrKWZvcihsZXQgbz0wO288ZS53aWR0aDtvKyspe2NvbnN0IGQ9cyhvLGksMCksbD17cjpyW2RdLGc6cltkKzFdLGI6cltkKzJdfSxmPXRoaXMuX2NvbG9yc1t0aGlzLl9maW5kZXIuZmluZE5lYXJlc3RJbmRleChsLnIsbC5nLGwuYix0aGlzLl9jb25maWcucHJlbXVsdGlwbGllZEFscGhhP3JbZCszXToyNTUpXS5yZ2IsdT17cjpsLnItZi5yLGc6bC5nLWYuZyxiOmwuYi1mLmJ9O3JbZF09Zi5yLHJbZCsxXT1mLmcscltkKzJdPWYuYjtmb3IoY29uc3RbZyx3LHBdb2Ygbil7Y29uc3QgQz13PDA/byt3Pj0wOm8rdzxlLndpZHRoLHg9cDwwP2krcD49MDppK3A8ZS5oZWlnaHQ7aWYoQyYmeCl7Y29uc3QgYj1zKG8rdyxpK3AsMCk7cltiXSs9dS5yKmcscltiKzFdKz11LmcqZyxyW2IrMl0rPXUuYipnfX19fWlmKHRoaXMuX2NvbmZpZy5kaXRoZXJUcmFuc3BhcmVuY3kpe2NvbnN0IG49X2VbdGhpcy5fY29uZmlnLmRpdGhlclRyYW5zcGFyZW5jeV07Zm9yKGxldCBpPTA7aTxlLmhlaWdodDtpKyspZm9yKGxldCBvPTA7bzxlLndpZHRoO28rKyl7Y29uc3QgZD1zKG8saSwzKSxsPXJbZF0sZj1sPDEyOD8wOjI1NSx1PWwtZjtyW2RdPWY7Zm9yKGNvbnN0W2csdyxwXW9mIG4pe2NvbnN0IEM9dzwwP28rdz49MDpvK3c8ZS53aWR0aCx4PXA8MD9pK3A+PTA6aStwPGUuaGVpZ2h0O2lmKEMmJngpe2NvbnN0IGI9cyhvK3csaStwLDMpO3JbYl0rPXUqZ319fX19bGV0IGM9ITE7Y29uc3QgYT1uZXcgVWludDhDbGFtcGVkQXJyYXkoci5sZW5ndGgvNCk7Zm9yKGxldCBzPXIubGVuZ3RoLG49MDtuPHM7bis9NClyW24rM109PT0wPyhhW24vNF09dCxjPSEwKTphW24vNF09dGhpcy5fZmluZGVyLmZpbmROZWFyZXN0SW5kZXgocltuXSxyW24rMV0scltuKzJdLHJbbiszXSk7dGhpcy5fcnNDb250cm9sZXIuZW5xdWV1ZShSKE8oe30sZSkse2RhdGE6YSx0cmFuc3BhcmVudDpjfSkpfSxjbG9zZTooKT0+e3RoaXMuX3JzQ29udHJvbGVyLmNsb3NlKCl9fSkpO3RoaXMuX2NvbmZpZz1lLHRoaXMuX2ZpbmRlcj1uZXcgYmUodCxlLnByZW11bHRpcGxpZWRBbHBoYSxlLnRpbnQpLHRoaXMuX2NvbG9ycz10fX1jbGFzcyBWZXtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsIl9sb2dnZXIiKTt5KHRoaXMsIl9wYWxldHRlIik7eSh0aGlzLCJfY29uZmlnIik7eSh0aGlzLCJfZW5jb2RpbmdGcmFtZXMiLFtdKTt5KHRoaXMsIl9lbmNvZGVVVUlEIiwwKTt5KHRoaXMsIl93b3JrZXIiKTt2YXIgdDt0aGlzLl9sb2dnZXI9bmV3IHNlKCEhZS5kZWJ1ZyksdGhpcy5fY29uZmlnPXRoaXMuX3Jlc29sdmVPcHRpb25zKGUpLHRoaXMuX3BhbGV0dGU9bmV3IERlKHttYXhDb2xvcnM6dGhpcy5fY29uZmlnLm1heENvbG9ycyxwcmVtdWx0aXBsaWVkQWxwaGE6dGhpcy5fY29uZmlnLnByZW11bHRpcGxpZWRBbHBoYSx0aW50OnRoaXMuX2NvbmZpZy50aW50fSksdGhpcy5fY29uZmlnLndvcmtlclVybD8odGhpcy5fd29ya2VyPUIoe3dvcmtlclVybDp0aGlzLl9jb25maWcud29ya2VyVXJsfSksdGhpcy5fd29ya2VyLmNhbGwoImVuY29kZXI6aW5pdCIsZSkpOih0PXRoaXMuX2NvbmZpZy5mcmFtZXMpPT1udWxsfHx0LmZvckVhY2gocj0+dGhpcy5lbmNvZGUocikpfV9yZXNvbHZlT3B0aW9ucyhlKXtbIndpZHRoIiwiaGVpZ2h0Il0uZm9yRWFjaChuPT57dHlwZW9mIGVbbl0hPSJ1bmRlZmluZWQiJiZNYXRoLmZsb29yKGVbbl0pIT09ZVtuXSYmKGNvbnNvbGUud2FybihgJHtufSBjYW5ub3QgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXJgKSxlW25dPU1hdGguZmxvb3IoZVtuXSkpfSk7Y29uc3R7Y29sb3JUYWJsZVNpemU6dD0yNTYsYmFja2dyb3VuZENvbG9ySW5kZXg6cj10LTEsbWF4Q29sb3JzOmM9dC0xLHByZW11bHRpcGxpZWRBbHBoYTphPSExLHRpbnQ6cz1bMjU1LDI1NSwyNTVdfT1lO3JldHVybiBSKE8oe30sZSkse2NvbG9yVGFibGVTaXplOnQsYmFja2dyb3VuZENvbG9ySW5kZXg6cixtYXhDb2xvcnM6YyxwcmVtdWx0aXBsaWVkQWxwaGE6YSx0aW50OnN9KX1lbmNvZGUoZSl7cmV0dXJuIEcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2lmKHRoaXMuX3dvcmtlcil7bGV0IHM7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhlLmRhdGEpP3M9W2UuZGF0YS5idWZmZXJdOmUuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYocz1bZS5kYXRhXSksdGhpcy5fd29ya2VyLmNhbGwoImVuY29kZXI6ZW5jb2RlIixlLHMpfWNvbnN0IHQ9dGhpcy5fZW5jb2RlVVVJRDt0aGlzLl9lbmNvZGVVVUlEKys7Y29uc3R7d2lkdGg6cj10aGlzLl9jb25maWcud2lkdGgsaGVpZ2h0OmM9dGhpcy5fY29uZmlnLmhlaWdodH09ZTtsZXR7ZGF0YTphfT1lO3RyeXt0aGlzLl9sb2dnZXIudGltZShgcGFsZXR0ZTpzYW1wbGUtJHt0fWApLGE9dHlwZW9mIGE9PSJzdHJpbmciP3lpZWxkIFRlKGEpOmEsYT1lZShhLCJ1aW50OENsYW1wZWRBcnJheSIse3dpZHRoOnIsaGVpZ2h0OmN9KSx0aGlzLl9lbmNvZGluZ0ZyYW1lcy5wdXNoKFIoTyh7fSxlKSx7d2lkdGg6cixoZWlnaHQ6YyxkYXRhOmF9KSksdGhpcy5fcGFsZXR0ZS5hZGRTYW1wbGUoYSl9ZmluYWxseXt0aGlzLl9sb2dnZXIudGltZUVuZChgcGFsZXR0ZTpzYW1wbGUtJHt0fWApfX0pfWZsdXNoKGUpe3JldHVybiBHKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZih0aGlzLl93b3JrZXIpcmV0dXJuIHRoaXMuX3dvcmtlci5jYWxsKCJlbmNvZGVyOmZsdXNoIixlKTt0aGlzLl9sb2dnZXIudGltZSgicGFsZXR0ZTpnZW5lcmF0ZSIpO2NvbnN0IHQ9eWllbGQgdGhpcy5fcGFsZXR0ZS5nZW5lcmF0ZSgpO3RoaXMuX2xvZ2dlci50aW1lRW5kKCJwYWxldHRlOmdlbmVyYXRlIik7Y29uc3Qgcj10Lm1hcChhPT5bYS5yZ2IucixhLnJnYi5nLGEucmdiLmJdKTtmb3IoO3IubGVuZ3RoPHRoaXMuX2NvbmZpZy5jb2xvclRhYmxlU2l6ZTspci5wdXNoKFswLDAsMF0pO3RoaXMuX2xvZ2dlci5kZWJ1ZygicGFsZXR0ZTptYXhDb2xvcnMiLHRoaXMuX2NvbmZpZy5tYXhDb2xvcnMpLHRoaXMuX2xvZ2dlci5pc0RlYnVnJiZjb25zb2xlLmRlYnVnKHQubWFwKCgpPT4iJWMgIikuam9pbigiIiksLi4udC5tYXAoYT0+YG1hcmdpbjogMXB4OyBiYWNrZ3JvdW5kOiAke2EuaGV4fWApKSx0aGlzLl9sb2dnZXIudGltZSgiZW5jb2RlIik7Y29uc3QgYz15aWVsZCBuZXcgUHJvbWlzZShhPT57bmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDpzPT57dGhpcy5fZW5jb2RpbmdGcmFtZXMuZm9yRWFjaChuPT57cy5lbnF1ZXVlKG4pfSkscy5jbG9zZSgpfX0pLnBpcGVUaHJvdWdoKG5ldyBYZSh0aGlzLl9jb25maWcsdCkpLnBpcGVUaHJvdWdoKG5ldyBMZSh0aGlzLl9jb25maWcpKS5waXBlVGhyb3VnaChuZXcgV2UodGhpcy5fY29uZmlnKSkucGlwZVRocm91Z2gobmV3IHplKFIoTyh7fSx0aGlzLl9jb25maWcpLHtjb2xvclRhYmxlOnJ9KSkpLnBpcGVUbyhuZXcgV3JpdGFibGVTdHJlYW0oe3dyaXRlOnM9PmEocyl9KSl9KTtzd2l0Y2godGhpcy5fbG9nZ2VyLnRpbWVFbmQoImVuY29kZSIpLHRoaXMuX2VuY29kaW5nRnJhbWVzPVtdLHRoaXMuX2VuY29kZVVVSUQ9MCxlKXtjYXNlImJsb2IiOnJldHVybiBuZXcgQmxvYihbYy5idWZmZXJdLHt0eXBlOiJpbWFnZS9naWYifSk7Y2FzZSJhcnJheUJ1ZmZlciI6ZGVmYXVsdDpyZXR1cm4gYy5idWZmZXJ9fSl9fWxldCAkO3NlbGYub25tZXNzYWdlPWg9PkcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOmUsdHlwZTp0LGRhdGE6cn09aC5kYXRhO3N3aXRjaCh0KXtjYXNlImVuY29kZXI6aW5pdCI6cmV0dXJuICQ9bmV3IFZlKFIoTyh7fSxyKSx7d29ya2VyVXJsOnZvaWQgMH0pKSxzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6dCxkYXRhOiEwfSk7Y2FzZSJlbmNvZGVyOmVuY29kZSI6cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTp0LGRhdGE6eWllbGQgJD09bnVsbD92b2lkIDA6JC5lbmNvZGUocil9KTtjYXNlImVuY29kZXI6Zmx1c2giOnJldHVybiBzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6dCxkYXRhOnlpZWxkICQ9PW51bGw/dm9pZCAwOiQuZmx1c2gocil9KTtjYXNlImZyYW1lczpkZWNvZGUiOntjb25zdCBjPU5lKHIpO3JldHVybiBzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6dCxkYXRhOmN9LGMubWFwKGE9PmEuZGF0YS5idWZmZXIpKX19fSl9KSgpOwo=", "" + import.meta.url).href;
12
+ } catch {
13
+ workerUrl = void 0;
14
+ }
15
+ return new Encoder({
16
+ width: config.width,
17
+ height: config.height,
18
+ workerUrl
19
+ });
20
+ }
21
+ //#endregion
22
+ export { createGifEncoder };
@@ -0,0 +1,11 @@
1
+ import { Encoder } from 'modern-gif';
2
+ /**
3
+ * 编码逻辑单独成模块,由 plugin 的导出 handle 通过 `await import('./encode')` 动态加载,
4
+ * 使 modern-gif 与内联 worker 落到独立异步 chunk —— 注册 gif 插件时不付出体积,
5
+ * 仅在真正导出 GIF 时才加载(与 @mce/mp4 的按需策略一致)。
6
+ */
7
+ export declare function createGifEncoder(config: {
8
+ width: number;
9
+ height: number;
10
+ workerUrl?: string;
11
+ }): Encoder;
package/dist/index.js CHANGED
@@ -1,12 +1,10 @@
1
1
  import { definePlugin } from "mce";
2
2
  import { render } from "modern-canvas";
3
- import { Encoder } from "modern-gif";
4
3
  //#region src/plugin.ts
5
4
  function plugin() {
6
5
  return definePlugin((editor, options) => {
7
- const { assets, fonts, to, runExclusiveRender } = editor;
6
+ const { fonts, to, runExclusiveRender } = editor;
8
7
  const gifWorkerUrl = options.gifWorkerUrl;
9
- assets.gifWorkerUrl = gifWorkerUrl;
10
8
  return {
11
9
  name: "mce:gif",
12
10
  messages: {
@@ -16,13 +14,14 @@ function plugin() {
16
14
  exporters: [{
17
15
  name: "gif",
18
16
  saveAs: true,
19
- handle: async (options) => {
20
- const { onProgress, ...restOptions } = options;
17
+ handle: async (exportOptions) => {
18
+ const { onProgress, ...restOptions } = exportOptions;
21
19
  const data = to("json", restOptions);
22
20
  const { startTime, endTime } = data.meta;
23
21
  const width = Math.floor(data.style.width);
24
22
  const height = Math.floor(data.style.height);
25
- const encoder = new Encoder({
23
+ const { createGifEncoder } = await import("./encode-CgtJBzpo.js");
24
+ const encoder = createGifEncoder({
26
25
  width,
27
26
  height,
28
27
  workerUrl: gifWorkerUrl
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mce/gif",
3
3
  "type": "module",
4
- "version": "0.24.3",
4
+ "version": "0.25.0",
5
5
  "description": "GIF plugin for mce",
6
6
  "author": "wxm",
7
7
  "license": "MIT",
@@ -49,7 +49,7 @@
49
49
  "modern-gif": "^2.1.0"
50
50
  },
51
51
  "devDependencies": {
52
- "mce": "0.24.3"
52
+ "mce": "0.25.0"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "mce": "^0"