diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 34911b72..0950deff 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -2,7 +2,6 @@ "table-editor-obsidian", "dataview", "find-unlinked-files", - "obsidian-emoji-toolbar", "templater-obsidian", "obsidian-markdown-formatting-assistant-plugin", "obsidian-metatable", @@ -16,7 +15,6 @@ "obsidian-dynamic-toc", "obsidian-tasks-plugin", "obsidian-dice-roller", - "music-code-blocks", "obsidian-pocket", "emoji-shortcodes" ] \ No newline at end of file diff --git a/.obsidian/plugins/find-unlinked-files/main.js b/.obsidian/plugins/find-unlinked-files/main.js index 5fa9e5a3..dd3dd2f3 100644 --- a/.obsidian/plugins/find-unlinked-files/main.js +++ b/.obsidian/plugins/find-unlinked-files/main.js @@ -622,9 +622,9 @@ var FindUnlinkedFilesPlugin = /** @class */ (function (_super) { var outFile; var files = this.app.vault.getMarkdownFiles(); var withoutFiles = files.filter(function (file) { - var _a, _b; + var _a; if (new Utils(_this.app, file.path, [], [], _this.settings.withoutTagsDirectoriesToIgnore, _this.settings.withoutTagsFilesToIgnore, true).isValid()) { - return ((_b = (_a = _this.app.metadataCache.getFileCache(file).tags) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) <= 0; + return ((_a = obsidian.getAllTags(_this.app.metadataCache.getFileCache(file)).length) !== null && _a !== void 0 ? _a : 0) <= 0; } else { return false; @@ -703,4 +703,4 @@ var FindUnlinkedFilesPlugin = /** @class */ (function (_super) { }(obsidian.Plugin)); module.exports = FindUnlinkedFilesPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9kZWxldGVGaWxlc01vZGFsLnRzIiwic3JjL3NldHRpbmdzVGFiLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBBcHAsIE1vZGFsLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IGNsYXNzIERlbGV0ZUZpbGVzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdGZpbGVzVG9EZWxldGU6IFRGaWxlW107XG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBmaWxlc1RvRGVsZXRlOiBURmlsZVtdKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLmZpbGVzVG9EZWxldGUgPSBmaWxlc1RvRGVsZXRlO1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCwgdGl0bGVFbCB9ID0gdGhpcztcblx0XHR0aXRsZUVsLnNldFRleHQoJ01vdmUgJyArIHRoaXMuZmlsZXNUb0RlbGV0ZS5sZW5ndGggKyAnIGZpbGVzIHRvIHN5c3RlbSB0cmFzaD8nKTtcblx0XHRjb250ZW50RWxcblx0XHRcdC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IFwiQ2FuY2VsXCIgfSlcblx0XHRcdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblx0XHRjb250ZW50RWxcblx0XHRcdC5zZXRBdHRyKFwibWFyZ2luXCIsIFwiYXV0b1wiKTtcblxuXHRcdGNvbnRlbnRFbFxuXHRcdFx0LmNyZWF0ZUVsKFwiYnV0dG9uXCIsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjbHM6IFwibW9kLWN0YVwiLFxuXHRcdFx0XHRcdHRleHQ6IFwiQ29uZmlybVwiXG5cdFx0XHRcdH0pXG5cdFx0XHQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCBmaWxlIG9mIHRoaXMuZmlsZXNUb0RlbGV0ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLnZhdWx0LnRyYXNoKGZpbGUsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdH0pO1xuXG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBwLCBub3JtYWxpemVQYXRoLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEZpbmRVbmxpbmtlZEZpbGVzUGx1Z2luLCB7IFNldHRpbmdzIH0gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcGx1Z2luOiBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbjtcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbiwgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuICAgIGZvcm1hdFBhdGgocGF0aDogc3RyaW5nLCBhZGREaXJlY3RvcnlTbGFzaDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIHBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgpO1xuICAgICAgICBpZiAoYWRkRGlyZWN0b3J5U2xhc2gpXG4gICAgICAgICAgICByZXR1cm4gcGF0aCArIFwiL1wiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUgfSk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoNFwiLCB7IHRleHQ6IFwiU2V0dGluZ3MgZm9yIGZpbmQgdW5saW5rZWQgZmlsZXNcIiB9KTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3V0cHV0IGZpbGUgbmFtZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2V0IG5hbWUgb2Ygb3V0cHV0IGZpbGUgKHdpdGhvdXQgZmlsZSBleHRlbnNpb24pLiBNYWtlIHN1cmUgbm8gZmlsZSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuISBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgdGhlIGRlZmF1bHQgbmFtZSBpcyBzZXQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KGNiID0+IGNiLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mub3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy5vdXRwdXRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH0pLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGlzYWJsZSB3b3JraW5nIGxpbmtzJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdJbmRlbnQgbGluZXMgdG8gZGlzYWJsZSB0aGUgbGluayBhbmQgdG8gY2xlYW4gdXAgdGhlIGdyYXBoIHZpZXcnKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PiBjYi5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVdvcmtpbmdMaW5rcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlV29ya2luZ0xpbmtzKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIklnbm9yZSBvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3Rvcmllc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJFbmFibGUgdG8gaWdub3JlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3Rvcmllcy4gRGlzYWJsZSB0byBvbmx5IGluY2x1ZGUgZmlsZXMgaW4gdGhlIGdpdmVuIGZpbGV0eXBlc1wiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PlxuICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZURpcmVjdG9yaWVzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlRGlyZWN0b3JpZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpcmVjdG9yaWVzXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkFkZCBlYWNoIGRpcmVjdG9yeSBwYXRoIGluIGEgbmV3IGxpbmVcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9TdWJkaXJlY3RvcnlcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlyZWN0b3JpZXNUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlyZWN0b3JpZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJGaWxlcyB0byBpZ25vcmUuXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISlcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9maWxlLm1kXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkxpbmtzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiBmaWxlIGFzIGxpbmsuIEFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISkuIFNldCBpdCB0byBgKmAgdG8gaWdub3JlIGZpbGVzIHdpdGggbGlua3MuXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvZmlsZS5tZFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5saW5rc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubGlua3NUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJJZ25vcmUgb3IgaW5jbHVkZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBmaWxldHlwZXNcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRW5hYmxlIHRvIGlnbm9yZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBmaWxldHlwZXMuIERpc2FibGUgdG8gb25seSBpbmNsdWRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGZpbGV0eXBlc1wiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PlxuICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZUZpbGVUeXBlcylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZUZpbGVUeXBlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkZpbGUgdHlwZXNcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRWZmZWN0IGRlcGVuZHMgb24gdG9nZ2xlIGFib3ZlXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJkb2N4LHR4dFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlVHlwZXNUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb25zID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZVR5cGVzVG9JZ25vcmUgPSBleHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJUYWdzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiB0YWcuIEFkZCBlYWNoIHRhZyBzZXBhcmF0ZWQgYnkgY29tbWEgKHdpdGhvdXQgYCNgKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidG9kbyx1bmZpbmlzaGVkXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudGFnc1RvSWdub3JlID0gdGFncztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXR5cGVzIHRvIGRlbGV0ZSBwZXIgY29tbWFuZC4gU2VlIFJFQURNRS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQWRkIGVhY2ggZmlsZXR5cGUgc2VwYXJhdGVkIGJ5IGNvbW1hLiBcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcImpwZyxwbmdcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZVR5cGVzVG9EZWxldGUuam9pbihcIixcIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVUeXBlc1RvRGVsZXRlID0gZXh0ZW5zaW9ucztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG5cbiAgICAgICAgLy8vIFNldHRpbmdzIGZvciBmaW5kIHVucmVzb2x2ZWRMaW5rc1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImg0XCIsIHsgdGV4dDogXCJTZXR0aW5ncyBmb3IgZmluZCB1bnJlc29sdmVkIGxpbmtzXCIgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3V0cHV0IGZpbGUgbmFtZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2V0IG5hbWUgb2Ygb3V0cHV0IGZpbGUgKHdpdGhvdXQgZmlsZSBleHRlbnNpb24pLiBNYWtlIHN1cmUgbm8gZmlsZSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuISBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgdGhlIGRlZmF1bHQgbmFtZSBpcyBzZXQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KGNiID0+IGNiLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH0pLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc091dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpcmVjdG9yaWVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIGluIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBBZGQgZWFjaCBkaXJlY3RvcnkgcGF0aCBpbiBhIG5ldyBsaW5lXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvU3ViZGlyZWN0b3J5XCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmUgPSBwYXRocztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgbGlua3MgaW4gdGhlIHNwZWNpZmllZCBmaWxlLiBBZGQgZWFjaCBmaWxlIHBhdGggaW4gYSBuZXcgbGluZSAod2l0aCBmaWxlIGV4dGVuc2lvbiEpXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvZmlsZS5tZFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJMaW5rcyB0byBpZ25vcmUuXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIklnbm9yZSBmaWxlcywgd2hpY2ggY29udGFpbiB0aGUgZ2l2ZW4gZmlsZSBhcyBsaW5rLiBBZGQgZWFjaCBmaWxlIHBhdGggaW4gYSBuZXcgbGluZSAod2l0aCBmaWxlIGV4dGVuc2lvbiEpLiBTZXQgaXQgdG8gYCpgIHRvIGlnbm9yZSBmaWxlcyB3aXRoIGxpbmtzLlwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L2ZpbGUubWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0xpbmtzVG9JZ25vcmUgPSBwYXRocztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXR5cGVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIHdpdGggdGhlIHNwZWNpZmllZCBmaWxldHlwZS4gQWRkIGVhY2ggZmlsZXR5cGUgc2VwYXJhdGVkIGJ5IGNvbW1hXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJkb2N4LHR4dFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb25zID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZVR5cGVzVG9JZ25vcmUgPSBleHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJUYWdzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIGluIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiB0YWcuIEFkZCBlYWNoIHRhZyBzZXBhcmF0ZWQgYnkgY29tbWEgKHdpdGhvdXQgYCNgKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidG9kbyx1bmZpbmlzaGVkXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc1RhZ3NUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlID0gdGFncztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDRcIiwgeyB0ZXh0OiBcIlNldHRpbmdzIGZvciBmaW5kIGZpbGVzIHdpdGhvdXQgdGFnc1wiIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ091dHB1dCBmaWxlIG5hbWUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1NldCBuYW1lIG9mIG91dHB1dCBmaWxlICh3aXRob3V0IGZpbGUgZXh0ZW5zaW9uKS4gTWFrZSBzdXJlIG5vIGZpbGUgZXhpc3RzIHdpdGggdGhpcyBuYW1lIGJlY2F1c2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiEgSWYgdGhlIG5hbWUgaXMgZW1wdHksIHRoZSBkZWZhdWx0IG5hbWUgaXMgc2V0LicpXG4gICAgICAgICAgICAuYWRkVGV4dChjYiA9PiBjYi5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzT3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy53aXRob3V0VGFnc091dHB1dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzT3V0cHV0RmlsZU5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9KS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53aXRob3V0VGFnc091dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkZpbGVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIHRoZSBzcGVjaWZpYyBmaWxlcy4gQWRkIGVhY2ggZmlsZSBwYXRoIGluIGEgbmV3IGxpbmUgKHdpdGggZmlsZSBleHRlbnNpb24hKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L2ZpbGUubWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Mud2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mud2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlyZWN0b3JpZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gQWRkIGVhY2ggZGlyZWN0b3J5IHBhdGggaW4gYSBuZXcgbGluZVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L1N1YmRpcmVjdG9yeVwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53aXRob3V0VGFnc0RpcmVjdG9yaWVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQXBwLCBDYWNoZWRNZXRhZGF0YSwgZ2V0QWxsVGFncywgaXRlcmF0ZUNhY2hlUmVmcyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMge1xuICAgIHByaXZhdGUgZmlsZUNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBmb3IgdGhlIGdpdmVuIHNldHRpbmdzLiBJcyB1c2VkIGZvciBgRmluZCB1bmxpbmtlZCBmaWxlc2AgYW5kIGBGaW5kIHVucmVzb2x2ZWQgbGlua3NgXG4gICAgICogQHBhcmFtIGFwcCBcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggXG4gICAgICogQHBhcmFtIHRhZ3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gbGlua3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZGlyZWN0b3JpZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZmlsZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gaWdub3JlRGlyZWN0b3JpZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhcHA6IEFwcCxcbiAgICAgICAgcHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHRhZ3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgbGlua3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZmlsZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgaWdub3JlRGlyZWN0b3JpZXM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICkge1xuICAgICAgICB0aGlzLmZpbGVDYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1RhZ3NUb0lnbm9yZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGFncyA9IGdldEFsbFRhZ3ModGhpcy5maWxlQ2FjaGUpO1xuICAgICAgICByZXR1cm4gdGFncz8uZmluZCgodGFnKSA9PiB0aGlzLnRhZ3NUb0lnbm9yZS5jb250YWlucyh0YWcuc3Vic3RyaW5nKDEpKSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBoYXNMaW5rc1RvSWdub3JlKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMuZmlsZUNhY2hlPy5lbWJlZHMgIT0gbnVsbCB8fCB0aGlzLmZpbGVDYWNoZT8ubGlua3MgIT0gbnVsbCkgJiYgdGhpcy5saW5rc1RvSWdub3JlWzBdID09IFwiKlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVyYXRlQ2FjaGVSZWZzKHRoaXMuZmlsZUNhY2hlLCBjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChjYi5saW5rLCB0aGlzLmZpbGVQYXRoKT8ucGF0aDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmtzVG9JZ25vcmUuY29udGFpbnMobGluayk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tEaXJlY3RvcnkoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5kaXJlY3Rvcmllc1RvSWdub3JlLmZpbmQoKHZhbHVlKSA9PiB0aGlzLmZpbGVQYXRoLnN0YXJ0c1dpdGgodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAhPSAwKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICFjb250YWlucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWxlVG9JZ25vcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzVG9JZ25vcmUuY29udGFpbnModGhpcy5maWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNUYWdzVG9JZ25vcmUoKSAmJiAhdGhpcy5oYXNMaW5rc1RvSWdub3JlKCkgJiYgIXRoaXMuY2hlY2tEaXJlY3RvcnkoKSAmJiAhdGhpcy5pc0ZpbGVUb0lnbm9yZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0aGUgdGV4dCB0byB0aGUgZmlsZSBhbmQgb3BlbnMgdGhlIGZpbGUgaW4gYSBuZXcgcGFuZSBpZiBpdCBpcyBub3Qgb3BlbmVkIHlldFxuICAgICAqIEBwYXJhbSBhcHAgXG4gICAgICogQHBhcmFtIG91dHB1dEZpbGVOYW1lIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlXG4gICAgICogQHBhcmFtIHRleHQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdyaXRlQW5kT3BlbkZpbGUoYXBwOiBBcHAsIG91dHB1dEZpbGVOYW1lOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci53cml0ZShvdXRwdXRGaWxlTmFtZSwgdGV4dCk7XG5cbiAgICAgICAgbGV0IGZpbGVJc0FscmVhZHlPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKGxlYWYgPT4ge1xuICAgICAgICAgICAgaWYgKGxlYWYuZ2V0RGlzcGxheVRleHQoKSAhPSBcIlwiICYmIG91dHB1dEZpbGVOYW1lLnN0YXJ0c1dpdGgobGVhZi5nZXREaXNwbGF5VGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIGZpbGVJc0FscmVhZHlPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaWxlSXNBbHJlYWR5T3BlbmVkKVxuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQob3V0cHV0RmlsZU5hbWUsIFwiL1wiLCB0cnVlKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgZ2V0TGlua3BhdGgsIGl0ZXJhdGVDYWNoZVJlZnMsIE5vdGljZSwgUGx1Z2luLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgRGVsZXRlRmlsZXNNb2RhbCB9IGZyb20gJy4vZGVsZXRlRmlsZXNNb2RhbCc7XHJcbmltcG9ydCB7IFNldHRpbmdzVGFiIH0gZnJvbSAnLi9zZXR0aW5nc1RhYic7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuXHRvdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG5cdGRpc2FibGVXb3JraW5nTGlua3M6IGJvb2xlYW47XHJcblx0ZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdGxpbmtzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdHRhZ3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9EZWxldGU6IHN0cmluZ1tdO1xyXG5cdGlnbm9yZUZpbGVUeXBlczogYm9vbGVhbjtcclxuXHRpZ25vcmVEaXJlY3RvcmllczogYm9vbGVhbjtcclxuXHR1bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG5cdHdpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0d2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR3aXRob3V0VGFnc091dHB1dEZpbGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XHJcblx0b3V0cHV0RmlsZU5hbWU6IFwidW5saW5rZWQgZmlsZXMgb3V0cHV0XCIsXHJcblx0ZGlzYWJsZVdvcmtpbmdMaW5rczogZmFsc2UsXHJcblx0ZGlyZWN0b3JpZXNUb0lnbm9yZTogW10sXHJcblx0ZmlsZXNUb0lnbm9yZTogW10sXHJcblx0ZmlsZVR5cGVzVG9JZ25vcmU6IFtdLFxyXG5cdGxpbmtzVG9JZ25vcmU6IFtdLFxyXG5cdHRhZ3NUb0lnbm9yZTogW10sXHJcblx0ZmlsZVR5cGVzVG9EZWxldGU6IFtdLFxyXG5cdGlnbm9yZUZpbGVUeXBlczogdHJ1ZSxcclxuXHRpZ25vcmVEaXJlY3RvcmllczogdHJ1ZSxcclxuXHR1bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTogXCJ1bnJlc29sdmVkIGxpbmtzIG91dHB1dFwiLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmU6IFtdLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0ZpbGVzVG9JZ25vcmU6IFtdLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0ZpbGVUeXBlc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NMaW5rc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NUYWdzVG9JZ25vcmU6IFtdLFxyXG5cdHdpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZTogW10sXHJcblx0d2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlOiBbXSxcclxuXHR3aXRob3V0VGFnc091dHB1dEZpbGVOYW1lOiBcImZpbGVzIHdpdGhvdXQgdGFnc1wiXHJcbn07XHJcbmludGVyZmFjZSBVbnJlc29sdmVkTGluayB7XHJcblx0bGluazogc3RyaW5nO1xyXG5cdGZpbGVzOiBzdHJpbmdbXTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkaW5nICcgKyB0aGlzLm1hbmlmZXN0Lm5hbWUgKyBcIiBwbHVnaW5cIik7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdmaW5kLXVubGlua2VkLWZpbGVzJyxcclxuXHRcdFx0bmFtZTogJ0ZpbmQgdW5saW5rZWQgZmlsZXMnLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5maW5kVW5saW5rZWRGaWxlcygpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2ZpbmQtdW5yZXNvbHZlZC1saW5rJyxcclxuXHRcdFx0bmFtZTogJ0ZpbmQgdW5yZXNvbHZlZCBsaW5rcycsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLmZpbmRVbnJlc29sdmVkTGlua3MoKSxcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwiZGVsZXRlLXVubGlua2VkLWZpbGVzXCIsXHJcblx0XHRcdG5hbWU6IFwiRGVsZXRlIHVubGlua2VkIGZpbGVzIHdpdGggY2VydGFpbiBleHRlbnNpb24uIFNlZSBSRUFETUVcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuZGVsZXRlVW5saW5rZWRGaWxlcygpXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImZpbmQtZmlsZXMtd2l0aG91dC10YWdzXCIsXHJcblx0XHRcdG5hbWU6IFwiRmluZCBmaWxlcyB3aXRob3V0IHRhZ3NcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuZmluZEZpbGVzV2l0aG91dFRhZ3MoKVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzLCBERUZBVUxUX1NFVFRJTkdTKSk7XHJcblx0fVxyXG5cdGZpbmRVbmxpbmtlZEZpbGVzKCkge1xyXG5cdFx0Y29uc3Qgb3V0RmlsZU5hbWUgPSB0aGlzLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lICsgXCIubWRcIjtcclxuXHRcdGxldCBvdXRGaWxlOiBURmlsZTtcclxuXHRcdGNvbnN0IGZpbGVzID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZXMoKTtcclxuXHRcdGNvbnN0IG1hcmtkb3duRmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRsZXQgbGlua3M6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdFx0bWFya2Rvd25GaWxlcy5mb3JFYWNoKChtYXJrRmlsZTogVEZpbGUpID0+IHtcclxuXHRcdFx0aWYgKG1hcmtGaWxlLnBhdGggPT0gb3V0RmlsZU5hbWUpIHtcclxuXHRcdFx0XHRvdXRGaWxlID0gbWFya0ZpbGU7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9IGl0ZXJhdGVDYWNoZVJlZnModGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUobWFya0ZpbGUpLCBjYiA9PiB7XHJcblx0XHRcdFx0bGV0IHR4dCA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZ2V0TGlua3BhdGgoY2IubGluayksIG1hcmtGaWxlLnBhdGgpO1xyXG5cdFx0XHRcdGlmICh0eHQgIT0gbnVsbClcclxuXHRcdFx0XHRcdGxpbmtzLnB1c2godHh0LnBhdGgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0Y29uc3Qgbm90TGlua2VkRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IHRoaXMuaXNWYWxpZChmaWxlLCBsaW5rcykpO1xyXG5cdFx0bm90TGlua2VkRmlsZXMucmVtb3ZlKG91dEZpbGUpO1xyXG5cclxuXHJcblx0XHRsZXQgdGV4dCA9IFwiXCI7XHJcblx0XHRsZXQgcHJlZml4OiBzdHJpbmc7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kaXNhYmxlV29ya2luZ0xpbmtzKVxyXG5cdFx0XHRwcmVmaXggPSBcIlx0XCI7XHJcblx0XHRlbHNlXHJcblx0XHRcdHByZWZpeCA9IFwiXCI7XHJcblx0XHRub3RMaW5rZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XHJcblx0XHRcdHRleHQgKz0gcHJlZml4ICsgXCItIFtbXCIgKyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KGZpbGUsIFwiL1wiKSArIFwiXV1cXG5cIjtcclxuXHRcdH0pO1xyXG5cdFx0VXRpbHMud3JpdGVBbmRPcGVuRmlsZSh0aGlzLmFwcCwgb3V0RmlsZU5hbWUsIHRleHQpO1xyXG5cclxuXHR9XHJcblx0YXN5bmMgZGVsZXRlVW5saW5rZWRGaWxlcygpIHtcclxuXHRcdGlmICghYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSArIFwiLm1kXCIpKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoXCJDYW4ndCBmaW5kIGZpbGUgLSBQbGVhc2UgcnVuIHRoZSBgRmluZCB1bmxpbmtlZCBmaWxlcycgY29tbWFuZCBiZWZvcmVcIik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGxpbmtzID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lICsgXCIubWRcIik/LmxpbmtzID8/IFtdO1xyXG5cdFx0Y29uc3QgZmlsZXNUb0RlbGV0ZTogVEZpbGVbXSA9IFtdO1xyXG5cdFx0bGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xyXG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rLmxpbmssIFwiL1wiKTtcclxuXHRcdFx0aWYgKCFmaWxlKVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZmlsZVR5cGVzVG9EZWxldGUuY29udGFpbnMoZmlsZS5leHRlbnNpb24pKSB7XHJcblx0XHRcdFx0ZmlsZXNUb0RlbGV0ZS5wdXNoKGZpbGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGlmIChmaWxlc1RvRGVsZXRlLmxlbmd0aCA+IDApXHJcblx0XHRcdG5ldyBEZWxldGVGaWxlc01vZGFsKHRoaXMuYXBwLCBmaWxlc1RvRGVsZXRlKS5vcGVuKCk7XHJcblx0fVxyXG5cdGZpbmRVbnJlc29sdmVkTGlua3MoKSB7XHJcblx0XHRjb25zdCBvdXRGaWxlTmFtZSA9IHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUgKyBcIi5tZFwiO1xyXG5cdFx0Y29uc3QgbGlua3M6IFVucmVzb2x2ZWRMaW5rW10gPSBbXTtcclxuXHRcdGNvbnN0IHVucmVzb2x2ZWRMaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUudW5yZXNvbHZlZExpbmtzO1xyXG5cclxuXHRcdGZvciAobGV0IGZpbGVQYXRoIGluIHVucmVzb2x2ZWRMaW5rcykge1xyXG5cdFx0XHRpZiAoZmlsZVBhdGggPT0gdGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZSArIFwiLm1kXCIpIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBmaWxlUGF0aC5zdWJzdHJpbmcoZmlsZVBhdGgubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcblxyXG5cdFx0XHRjb25zdCB1dGlscyA9IG5ldyBVdGlscyhcclxuXHRcdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0XHRmaWxlUGF0aCxcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc1RhZ3NUb0lnbm9yZSxcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0xpbmtzVG9JZ25vcmUsXHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlLFxyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZXNUb0lnbm9yZVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoIXV0aWxzLmlzVmFsaWQoKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgaW4gdW5yZXNvbHZlZExpbmtzW2ZpbGVQYXRoXSkge1xyXG5cdFx0XHRcdGNvbnN0IGxpbmtGaWxlVHlwZSA9IGxpbmsuc3Vic3RyaW5nKGxpbmsubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2cobGlua0ZpbGVUeXBlKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZVR5cGVzVG9JZ25vcmUuY29udGFpbnMobGlua0ZpbGVUeXBlKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGxldCBmb3JtYXR0ZWRGaWxlUGF0aCA9IGZpbGVQYXRoO1xyXG5cdFx0XHRcdGlmIChmaWxlVHlwZSA9PSBcIm1kXCIpIHtcclxuXHRcdFx0XHRcdGZvcm1hdHRlZEZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKDAsIGZpbGVQYXRoLmxhc3RJbmRleE9mKFwiLm1kXCIpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgdW5yZXNvbHZlZExpbms6IFVucmVzb2x2ZWRMaW5rID0geyBmaWxlczogW2Zvcm1hdHRlZEZpbGVQYXRoXSwgbGluazogbGluayB9O1xyXG5cdFx0XHRcdGlmIChsaW5rcy5jb250YWlucyh1bnJlc29sdmVkTGluaykpXHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRjb25zdCBkdXBsaWNhdGlvbiA9IGxpbmtzLmZpbmQoKGUpID0+IGUubGluayA9PSBsaW5rKTtcclxuXHRcdFx0XHRpZiAoZHVwbGljYXRpb24pIHtcclxuXHRcdFx0XHRcdGR1cGxpY2F0aW9uLmZpbGVzLnB1c2goZm9ybWF0dGVkRmlsZVBhdGgpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRsaW5rcy5wdXNoKHVucmVzb2x2ZWRMaW5rKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFV0aWxzLndyaXRlQW5kT3BlbkZpbGUoXHJcblx0XHRcdHRoaXMuYXBwLFxyXG5cdFx0XHRvdXRGaWxlTmFtZSxcclxuXHRcdFx0W1xyXG5cdFx0XHRcdFwiRG9uJ3QgZm9yZ2V0IHRoYXQgY3JlYXRpbmcgdGhlIGZpbGUgZnJvbSBoZXJlIG1heSBjcmVhdGUgdGhlIGZpbGUgaW4gdGhlIHdyb25nIGRpcmVjdG9yeSFcIixcclxuXHRcdFx0XHQuLi5saW5rcy5tYXAoKGUpID0+IGAtIFtbJHtlLmxpbmt9XV0gaW4gW1ske2UuZmlsZXMuam9pbihcIl1dLCBbW1wiKX1dXWApXHJcblx0XHRcdF0uam9pbihcIlxcblwiKSk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmluZEZpbGVzV2l0aG91dFRhZ3MoKSB7XHJcblx0XHRjb25zdCBvdXRGaWxlTmFtZSA9IHRoaXMuc2V0dGluZ3Mud2l0aG91dFRhZ3NPdXRwdXRGaWxlTmFtZSArIFwiLm1kXCI7XHJcblx0XHRsZXQgb3V0RmlsZTogVEZpbGU7XHJcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHRcdGxldCB3aXRob3V0RmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IHtcclxuXHRcdFx0aWYgKG5ldyBVdGlscyh0aGlzLmFwcCwgZmlsZS5wYXRoLCBbXSwgW10sIHRoaXMuc2V0dGluZ3Mud2l0aG91dFRhZ3NEaXJlY3Rvcmllc1RvSWdub3JlLCB0aGlzLnNldHRpbmdzLndpdGhvdXRUYWdzRmlsZXNUb0lnbm9yZSwgdHJ1ZSkuaXNWYWxpZCgpKSB7XHJcblx0XHRcdFx0cmV0dXJuICh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKS50YWdzPy5sZW5ndGggPz8gMCkgPD0gMDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0d2l0aG91dEZpbGVzLnJlbW92ZShvdXRGaWxlKTtcclxuXHJcblxyXG5cdFx0bGV0IHByZWZpeDogc3RyaW5nO1xyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGlzYWJsZVdvcmtpbmdMaW5rcylcclxuXHRcdFx0cHJlZml4ID0gXCJcdFwiO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHRwcmVmaXggPSBcIlwiO1xyXG5cdFx0Y29uc3QgdGV4dCA9IHdpdGhvdXRGaWxlcy5tYXAoKGZpbGUpID0+IGAke3ByZWZpeH0tIFtbJHtmaWxlLnBhdGh9XV1gKS5qb2luKFwiXFxuXCIpO1xyXG5cdFx0VXRpbHMud3JpdGVBbmRPcGVuRmlsZSh0aGlzLmFwcCwgb3V0RmlsZU5hbWUsIHRleHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGluIGFuIHVubGlua2VkIGZpbGVcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZmlsZSBmaWxlIHRvIGNoZWNrXHJcblx0ICogQHBhcmFtIGxpbmtzIGFsbCBsaW5rcyBpbiB0aGUgdmF1bHRcclxuXHQgKi9cclxuXHRpc1ZhbGlkKGZpbGU6IFRGaWxlLCBsaW5rczogc3RyaW5nW10pOiBib29sZWFuIHtcclxuXHRcdGlmIChsaW5rcy5jb250YWlucyhmaWxlLnBhdGgpKVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0Ly9maWxldHlwZXMgdG8gaWdub3JlIGJ5IGRlZmF1bHRcclxuXHRcdGlmIChmaWxlLmV4dGVuc2lvbiA9PSBcImNzc1wiKVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZmlsZVR5cGVzVG9JZ25vcmVbMF0gIT09IFwiXCIpIHtcclxuXHRcdFx0Y29uc3QgY29udGFpbnNGaWxlVHlwZSA9IHRoaXMuc2V0dGluZ3MuZmlsZVR5cGVzVG9JZ25vcmUuY29udGFpbnMoZmlsZS5leHRlbnNpb24pO1xyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5pZ25vcmVGaWxlVHlwZXMpIHtcclxuXHRcdFx0XHRpZiAoY29udGFpbnNGaWxlVHlwZSkgcmV0dXJuO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmICghY29udGFpbnNGaWxlVHlwZSkgcmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoXHJcblx0XHRcdHRoaXMuYXBwLFxyXG5cdFx0XHRmaWxlLnBhdGgsXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MudGFnc1RvSWdub3JlLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmxpbmtzVG9JZ25vcmUsXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuZGlyZWN0b3JpZXNUb0lnbm9yZSxcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5maWxlc1RvSWdub3JlLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmlnbm9yZURpcmVjdG9yaWVzXHJcblx0XHQpO1xyXG5cdFx0aWYgKCF1dGlscy5pc1ZhbGlkKCkpXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygndW5sb2FkaW5nICcgKyB0aGlzLm1hbmlmZXN0Lm5hbWUgKyBcIiBwbHVnaW5cIik7XHJcblx0fVxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdH1cclxufVxyXG4iXSwibmFtZXMiOlsiTW9kYWwiLCJub3JtYWxpemVQYXRoIiwiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiLCJnZXRBbGxUYWdzIiwiaXRlcmF0ZUNhY2hlUmVmcyIsImdldExpbmtwYXRoIiwiTm90aWNlIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQzdDLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsK0JBQStCLENBQUMsQ0FBQztBQUNsRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcs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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9kZWxldGVGaWxlc01vZGFsLnRzIiwic3JjL3NldHRpbmdzVGFiLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBBcHAsIE1vZGFsLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IGNsYXNzIERlbGV0ZUZpbGVzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdGZpbGVzVG9EZWxldGU6IFRGaWxlW107XG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBmaWxlc1RvRGVsZXRlOiBURmlsZVtdKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLmZpbGVzVG9EZWxldGUgPSBmaWxlc1RvRGVsZXRlO1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCwgdGl0bGVFbCB9ID0gdGhpcztcblx0XHR0aXRsZUVsLnNldFRleHQoJ01vdmUgJyArIHRoaXMuZmlsZXNUb0RlbGV0ZS5sZW5ndGggKyAnIGZpbGVzIHRvIHN5c3RlbSB0cmFzaD8nKTtcblx0XHRjb250ZW50RWxcblx0XHRcdC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IFwiQ2FuY2VsXCIgfSlcblx0XHRcdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblx0XHRjb250ZW50RWxcblx0XHRcdC5zZXRBdHRyKFwibWFyZ2luXCIsIFwiYXV0b1wiKTtcblxuXHRcdGNvbnRlbnRFbFxuXHRcdFx0LmNyZWF0ZUVsKFwiYnV0dG9uXCIsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjbHM6IFwibW9kLWN0YVwiLFxuXHRcdFx0XHRcdHRleHQ6IFwiQ29uZmlybVwiXG5cdFx0XHRcdH0pXG5cdFx0XHQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCBmaWxlIG9mIHRoaXMuZmlsZXNUb0RlbGV0ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLnZhdWx0LnRyYXNoKGZpbGUsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdH0pO1xuXG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBwLCBub3JtYWxpemVQYXRoLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEZpbmRVbmxpbmtlZEZpbGVzUGx1Z2luLCB7IFNldHRpbmdzIH0gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcGx1Z2luOiBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbjtcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbiwgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuICAgIGZvcm1hdFBhdGgocGF0aDogc3RyaW5nLCBhZGREaXJlY3RvcnlTbGFzaDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIHBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgpO1xuICAgICAgICBpZiAoYWRkRGlyZWN0b3J5U2xhc2gpXG4gICAgICAgICAgICByZXR1cm4gcGF0aCArIFwiL1wiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUgfSk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoNFwiLCB7IHRleHQ6IFwiU2V0dGluZ3MgZm9yIGZpbmQgdW5saW5rZWQgZmlsZXNcIiB9KTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3V0cHV0IGZpbGUgbmFtZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2V0IG5hbWUgb2Ygb3V0cHV0IGZpbGUgKHdpdGhvdXQgZmlsZSBleHRlbnNpb24pLiBNYWtlIHN1cmUgbm8gZmlsZSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuISBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgdGhlIGRlZmF1bHQgbmFtZSBpcyBzZXQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KGNiID0+IGNiLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mub3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy5vdXRwdXRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH0pLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGlzYWJsZSB3b3JraW5nIGxpbmtzJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdJbmRlbnQgbGluZXMgdG8gZGlzYWJsZSB0aGUgbGluayBhbmQgdG8gY2xlYW4gdXAgdGhlIGdyYXBoIHZpZXcnKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PiBjYi5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVdvcmtpbmdMaW5rcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlV29ya2luZ0xpbmtzKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIklnbm9yZSBvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3Rvcmllc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJFbmFibGUgdG8gaWdub3JlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3Rvcmllcy4gRGlzYWJsZSB0byBvbmx5IGluY2x1ZGUgZmlsZXMgaW4gdGhlIGdpdmVuIGZpbGV0eXBlc1wiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PlxuICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZURpcmVjdG9yaWVzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlRGlyZWN0b3JpZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpcmVjdG9yaWVzXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkFkZCBlYWNoIGRpcmVjdG9yeSBwYXRoIGluIGEgbmV3IGxpbmVcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9TdWJkaXJlY3RvcnlcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlyZWN0b3JpZXNUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlyZWN0b3JpZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJGaWxlcyB0byBpZ25vcmUuXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISlcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9maWxlLm1kXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkxpbmtzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiBmaWxlIGFzIGxpbmsuIEFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISkuIFNldCBpdCB0byBgKmAgdG8gaWdub3JlIGZpbGVzIHdpdGggbGlua3MuXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvZmlsZS5tZFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5saW5rc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubGlua3NUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJJZ25vcmUgb3IgaW5jbHVkZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBmaWxldHlwZXNcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRW5hYmxlIHRvIGlnbm9yZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBmaWxldHlwZXMuIERpc2FibGUgdG8gb25seSBpbmNsdWRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGZpbGV0eXBlc1wiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZShjYiA9PlxuICAgICAgICAgICAgICAgIGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZUZpbGVUeXBlcylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmlnbm9yZUZpbGVUeXBlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkZpbGUgdHlwZXNcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRWZmZWN0IGRlcGVuZHMgb24gdG9nZ2xlIGFib3ZlXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJkb2N4LHR4dFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlVHlwZXNUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb25zID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZVR5cGVzVG9JZ25vcmUgPSBleHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJUYWdzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiB0YWcuIEFkZCBlYWNoIHRhZyBzZXBhcmF0ZWQgYnkgY29tbWEgKHdpdGhvdXQgYCNgKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidG9kbyx1bmZpbmlzaGVkXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudGFnc1RvSWdub3JlID0gdGFncztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXR5cGVzIHRvIGRlbGV0ZSBwZXIgY29tbWFuZC4gU2VlIFJFQURNRS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQWRkIGVhY2ggZmlsZXR5cGUgc2VwYXJhdGVkIGJ5IGNvbW1hLiBcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcImpwZyxwbmdcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZVR5cGVzVG9EZWxldGUuam9pbihcIixcIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVUeXBlc1RvRGVsZXRlID0gZXh0ZW5zaW9ucztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG5cbiAgICAgICAgLy8vIFNldHRpbmdzIGZvciBmaW5kIHVucmVzb2x2ZWRMaW5rc1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImg0XCIsIHsgdGV4dDogXCJTZXR0aW5ncyBmb3IgZmluZCB1bnJlc29sdmVkIGxpbmtzXCIgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3V0cHV0IGZpbGUgbmFtZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2V0IG5hbWUgb2Ygb3V0cHV0IGZpbGUgKHdpdGhvdXQgZmlsZSBleHRlbnNpb24pLiBNYWtlIHN1cmUgbm8gZmlsZSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuISBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgdGhlIGRlZmF1bHQgbmFtZSBpcyBzZXQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KGNiID0+IGNiLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH0pLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc091dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpcmVjdG9yaWVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIGluIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBBZGQgZWFjaCBkaXJlY3RvcnkgcGF0aCBpbiBhIG5ldyBsaW5lXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvU3ViZGlyZWN0b3J5XCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmUgPSBwYXRocztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgbGlua3MgaW4gdGhlIHNwZWNpZmllZCBmaWxlLiBBZGQgZWFjaCBmaWxlIHBhdGggaW4gYSBuZXcgbGluZSAod2l0aCBmaWxlIGV4dGVuc2lvbiEpXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvZmlsZS5tZFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJMaW5rcyB0byBpZ25vcmUuXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIklnbm9yZSBmaWxlcywgd2hpY2ggY29udGFpbiB0aGUgZ2l2ZW4gZmlsZSBhcyBsaW5rLiBBZGQgZWFjaCBmaWxlIHBhdGggaW4gYSBuZXcgbGluZSAod2l0aCBmaWxlIGV4dGVuc2lvbiEpLiBTZXQgaXQgdG8gYCpgIHRvIGlnbm9yZSBmaWxlcyB3aXRoIGxpbmtzLlwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L2ZpbGUubWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0xpbmtzVG9JZ25vcmUgPSBwYXRocztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZXR5cGVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIHdpdGggdGhlIHNwZWNpZmllZCBmaWxldHlwZS4gQWRkIGVhY2ggZmlsZXR5cGUgc2VwYXJhdGVkIGJ5IGNvbW1hXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJkb2N4LHR4dFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb25zID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZVR5cGVzVG9JZ25vcmUgPSBleHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJUYWdzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGxpbmtzIGluIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiB0YWcuIEFkZCBlYWNoIHRhZyBzZXBhcmF0ZWQgYnkgY29tbWEgKHdpdGhvdXQgYCNgKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidG9kbyx1bmZpbmlzaGVkXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc1RhZ3NUb0lnbm9yZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlID0gdGFncztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDRcIiwgeyB0ZXh0OiBcIlNldHRpbmdzIGZvciBmaW5kIGZpbGVzIHdpdGhvdXQgdGFnc1wiIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ091dHB1dCBmaWxlIG5hbWUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1NldCBuYW1lIG9mIG91dHB1dCBmaWxlICh3aXRob3V0IGZpbGUgZXh0ZW5zaW9uKS4gTWFrZSBzdXJlIG5vIGZpbGUgZXhpc3RzIHdpdGggdGhpcyBuYW1lIGJlY2F1c2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiEgSWYgdGhlIG5hbWUgaXMgZW1wdHksIHRoZSBkZWZhdWx0IG5hbWUgaXMgc2V0LicpXG4gICAgICAgICAgICAuYWRkVGV4dChjYiA9PiBjYi5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzT3V0cHV0RmlsZU5hbWUgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncy53aXRob3V0VGFnc091dHB1dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzT3V0cHV0RmlsZU5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9KS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53aXRob3V0VGFnc091dHB1dEZpbGVOYW1lKSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkZpbGVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIHRoZSBzcGVjaWZpYyBmaWxlcy4gQWRkIGVhY2ggZmlsZSBwYXRoIGluIGEgbmV3IGxpbmUgKHdpdGggZmlsZSBleHRlbnNpb24hKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L2ZpbGUubWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Mud2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mud2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlyZWN0b3JpZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gQWRkIGVhY2ggZGlyZWN0b3J5IHBhdGggaW4gYSBuZXcgbGluZVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L1N1YmRpcmVjdG9yeVwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53aXRob3V0VGFnc0RpcmVjdG9yaWVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQXBwLCBDYWNoZWRNZXRhZGF0YSwgZ2V0QWxsVGFncywgaXRlcmF0ZUNhY2hlUmVmcyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMge1xuICAgIHByaXZhdGUgZmlsZUNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBmb3IgdGhlIGdpdmVuIHNldHRpbmdzLiBJcyB1c2VkIGZvciBgRmluZCB1bmxpbmtlZCBmaWxlc2AgYW5kIGBGaW5kIHVucmVzb2x2ZWQgbGlua3NgXG4gICAgICogQHBhcmFtIGFwcCBcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggXG4gICAgICogQHBhcmFtIHRhZ3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gbGlua3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZGlyZWN0b3JpZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZmlsZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gaWdub3JlRGlyZWN0b3JpZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhcHA6IEFwcCxcbiAgICAgICAgcHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHRhZ3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgbGlua3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZmlsZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgaWdub3JlRGlyZWN0b3JpZXM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICkge1xuICAgICAgICB0aGlzLmZpbGVDYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1RhZ3NUb0lnbm9yZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGFncyA9IGdldEFsbFRhZ3ModGhpcy5maWxlQ2FjaGUpO1xuICAgICAgICByZXR1cm4gdGFncz8uZmluZCgodGFnKSA9PiB0aGlzLnRhZ3NUb0lnbm9yZS5jb250YWlucyh0YWcuc3Vic3RyaW5nKDEpKSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBoYXNMaW5rc1RvSWdub3JlKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMuZmlsZUNhY2hlPy5lbWJlZHMgIT0gbnVsbCB8fCB0aGlzLmZpbGVDYWNoZT8ubGlua3MgIT0gbnVsbCkgJiYgdGhpcy5saW5rc1RvSWdub3JlWzBdID09IFwiKlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVyYXRlQ2FjaGVSZWZzKHRoaXMuZmlsZUNhY2hlLCBjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChjYi5saW5rLCB0aGlzLmZpbGVQYXRoKT8ucGF0aDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmtzVG9JZ25vcmUuY29udGFpbnMobGluayk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tEaXJlY3RvcnkoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5kaXJlY3Rvcmllc1RvSWdub3JlLmZpbmQoKHZhbHVlKSA9PiB0aGlzLmZpbGVQYXRoLnN0YXJ0c1dpdGgodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAhPSAwKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICFjb250YWlucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWxlVG9JZ25vcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzVG9JZ25vcmUuY29udGFpbnModGhpcy5maWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNUYWdzVG9JZ25vcmUoKSAmJiAhdGhpcy5oYXNMaW5rc1RvSWdub3JlKCkgJiYgIXRoaXMuY2hlY2tEaXJlY3RvcnkoKSAmJiAhdGhpcy5pc0ZpbGVUb0lnbm9yZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0aGUgdGV4dCB0byB0aGUgZmlsZSBhbmQgb3BlbnMgdGhlIGZpbGUgaW4gYSBuZXcgcGFuZSBpZiBpdCBpcyBub3Qgb3BlbmVkIHlldFxuICAgICAqIEBwYXJhbSBhcHAgXG4gICAgICogQHBhcmFtIG91dHB1dEZpbGVOYW1lIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlXG4gICAgICogQHBhcmFtIHRleHQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdyaXRlQW5kT3BlbkZpbGUoYXBwOiBBcHAsIG91dHB1dEZpbGVOYW1lOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci53cml0ZShvdXRwdXRGaWxlTmFtZSwgdGV4dCk7XG5cbiAgICAgICAgbGV0IGZpbGVJc0FscmVhZHlPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKGxlYWYgPT4ge1xuICAgICAgICAgICAgaWYgKGxlYWYuZ2V0RGlzcGxheVRleHQoKSAhPSBcIlwiICYmIG91dHB1dEZpbGVOYW1lLnN0YXJ0c1dpdGgobGVhZi5nZXREaXNwbGF5VGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIGZpbGVJc0FscmVhZHlPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaWxlSXNBbHJlYWR5T3BlbmVkKVxuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQob3V0cHV0RmlsZU5hbWUsIFwiL1wiLCB0cnVlKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgZ2V0QWxsVGFncywgZ2V0TGlua3BhdGgsIGl0ZXJhdGVDYWNoZVJlZnMsIE5vdGljZSwgUGx1Z2luLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgRGVsZXRlRmlsZXNNb2RhbCB9IGZyb20gJy4vZGVsZXRlRmlsZXNNb2RhbCc7XHJcbmltcG9ydCB7IFNldHRpbmdzVGFiIH0gZnJvbSAnLi9zZXR0aW5nc1RhYic7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuXHRvdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG5cdGRpc2FibGVXb3JraW5nTGlua3M6IGJvb2xlYW47XHJcblx0ZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdGxpbmtzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdHRhZ3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9EZWxldGU6IHN0cmluZ1tdO1xyXG5cdGlnbm9yZUZpbGVUeXBlczogYm9vbGVhbjtcclxuXHRpZ25vcmVEaXJlY3RvcmllczogYm9vbGVhbjtcclxuXHR1bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG5cdHdpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0d2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR3aXRob3V0VGFnc091dHB1dEZpbGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XHJcblx0b3V0cHV0RmlsZU5hbWU6IFwidW5saW5rZWQgZmlsZXMgb3V0cHV0XCIsXHJcblx0ZGlzYWJsZVdvcmtpbmdMaW5rczogZmFsc2UsXHJcblx0ZGlyZWN0b3JpZXNUb0lnbm9yZTogW10sXHJcblx0ZmlsZXNUb0lnbm9yZTogW10sXHJcblx0ZmlsZVR5cGVzVG9JZ25vcmU6IFtdLFxyXG5cdGxpbmtzVG9JZ25vcmU6IFtdLFxyXG5cdHRhZ3NUb0lnbm9yZTogW10sXHJcblx0ZmlsZVR5cGVzVG9EZWxldGU6IFtdLFxyXG5cdGlnbm9yZUZpbGVUeXBlczogdHJ1ZSxcclxuXHRpZ25vcmVEaXJlY3RvcmllczogdHJ1ZSxcclxuXHR1bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTogXCJ1bnJlc29sdmVkIGxpbmtzIG91dHB1dFwiLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0RpcmVjdG9yaWVzVG9JZ25vcmU6IFtdLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0ZpbGVzVG9JZ25vcmU6IFtdLFxyXG5cdHVucmVzb2x2ZWRMaW5rc0ZpbGVUeXBlc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NMaW5rc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NUYWdzVG9JZ25vcmU6IFtdLFxyXG5cdHdpdGhvdXRUYWdzRGlyZWN0b3JpZXNUb0lnbm9yZTogW10sXHJcblx0d2l0aG91dFRhZ3NGaWxlc1RvSWdub3JlOiBbXSxcclxuXHR3aXRob3V0VGFnc091dHB1dEZpbGVOYW1lOiBcImZpbGVzIHdpdGhvdXQgdGFnc1wiXHJcbn07XHJcbmludGVyZmFjZSBVbnJlc29sdmVkTGluayB7XHJcblx0bGluazogc3RyaW5nO1xyXG5cdGZpbGVzOiBzdHJpbmdbXTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaW5kVW5saW5rZWRGaWxlc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkaW5nICcgKyB0aGlzLm1hbmlmZXN0Lm5hbWUgKyBcIiBwbHVnaW5cIik7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdmaW5kLXVubGlua2VkLWZpbGVzJyxcclxuXHRcdFx0bmFtZTogJ0ZpbmQgdW5saW5rZWQgZmlsZXMnLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5maW5kVW5saW5rZWRGaWxlcygpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2ZpbmQtdW5yZXNvbHZlZC1saW5rJyxcclxuXHRcdFx0bmFtZTogJ0ZpbmQgdW5yZXNvbHZlZCBsaW5rcycsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLmZpbmRVbnJlc29sdmVkTGlua3MoKSxcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwiZGVsZXRlLXVubGlua2VkLWZpbGVzXCIsXHJcblx0XHRcdG5hbWU6IFwiRGVsZXRlIHVubGlua2VkIGZpbGVzIHdpdGggY2VydGFpbiBleHRlbnNpb24uIFNlZSBSRUFETUVcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuZGVsZXRlVW5saW5rZWRGaWxlcygpXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImZpbmQtZmlsZXMtd2l0aG91dC10YWdzXCIsXHJcblx0XHRcdG5hbWU6IFwiRmluZCBmaWxlcyB3aXRob3V0IHRhZ3NcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuZmluZEZpbGVzV2l0aG91dFRhZ3MoKVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzLCBERUZBVUxUX1NFVFRJTkdTKSk7XHJcblx0fVxyXG5cdGZpbmRVbmxpbmtlZEZpbGVzKCkge1xyXG5cdFx0Y29uc3Qgb3V0RmlsZU5hbWUgPSB0aGlzLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lICsgXCIubWRcIjtcclxuXHRcdGxldCBvdXRGaWxlOiBURmlsZTtcclxuXHRcdGNvbnN0IGZpbGVzID0gdGhpcy5hcHAudmF1bHQuZ2V0RmlsZXMoKTtcclxuXHRcdGNvbnN0IG1hcmtkb3duRmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRsZXQgbGlua3M6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdFx0bWFya2Rvd25GaWxlcy5mb3JFYWNoKChtYXJrRmlsZTogVEZpbGUpID0+IHtcclxuXHRcdFx0aWYgKG1hcmtGaWxlLnBhdGggPT0gb3V0RmlsZU5hbWUpIHtcclxuXHRcdFx0XHRvdXRGaWxlID0gbWFya0ZpbGU7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9IGl0ZXJhdGVDYWNoZVJlZnModGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUobWFya0ZpbGUpLCBjYiA9PiB7XHJcblx0XHRcdFx0bGV0IHR4dCA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZ2V0TGlua3BhdGgoY2IubGluayksIG1hcmtGaWxlLnBhdGgpO1xyXG5cdFx0XHRcdGlmICh0eHQgIT0gbnVsbClcclxuXHRcdFx0XHRcdGxpbmtzLnB1c2godHh0LnBhdGgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0Y29uc3Qgbm90TGlua2VkRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IHRoaXMuaXNWYWxpZChmaWxlLCBsaW5rcykpO1xyXG5cdFx0bm90TGlua2VkRmlsZXMucmVtb3ZlKG91dEZpbGUpO1xyXG5cclxuXHJcblx0XHRsZXQgdGV4dCA9IFwiXCI7XHJcblx0XHRsZXQgcHJlZml4OiBzdHJpbmc7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kaXNhYmxlV29ya2luZ0xpbmtzKVxyXG5cdFx0XHRwcmVmaXggPSBcIlx0XCI7XHJcblx0XHRlbHNlXHJcblx0XHRcdHByZWZpeCA9IFwiXCI7XHJcblx0XHRub3RMaW5rZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XHJcblx0XHRcdHRleHQgKz0gcHJlZml4ICsgXCItIFtbXCIgKyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KGZpbGUsIFwiL1wiKSArIFwiXV1cXG5cIjtcclxuXHRcdH0pO1xyXG5cdFx0VXRpbHMud3JpdGVBbmRPcGVuRmlsZSh0aGlzLmFwcCwgb3V0RmlsZU5hbWUsIHRleHQpO1xyXG5cclxuXHR9XHJcblx0YXN5bmMgZGVsZXRlVW5saW5rZWRGaWxlcygpIHtcclxuXHRcdGlmICghYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSArIFwiLm1kXCIpKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoXCJDYW4ndCBmaW5kIGZpbGUgLSBQbGVhc2UgcnVuIHRoZSBgRmluZCB1bmxpbmtlZCBmaWxlcycgY29tbWFuZCBiZWZvcmVcIik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGxpbmtzID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lICsgXCIubWRcIik/LmxpbmtzID8/IFtdO1xyXG5cdFx0Y29uc3QgZmlsZXNUb0RlbGV0ZTogVEZpbGVbXSA9IFtdO1xyXG5cdFx0bGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xyXG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rLmxpbmssIFwiL1wiKTtcclxuXHRcdFx0aWYgKCFmaWxlKVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZmlsZVR5cGVzVG9EZWxldGUuY29udGFpbnMoZmlsZS5leHRlbnNpb24pKSB7XHJcblx0XHRcdFx0ZmlsZXNUb0RlbGV0ZS5wdXNoKGZpbGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGlmIChmaWxlc1RvRGVsZXRlLmxlbmd0aCA+IDApXHJcblx0XHRcdG5ldyBEZWxldGVGaWxlc01vZGFsKHRoaXMuYXBwLCBmaWxlc1RvRGVsZXRlKS5vcGVuKCk7XHJcblx0fVxyXG5cdGZpbmRVbnJlc29sdmVkTGlua3MoKSB7XHJcblx0XHRjb25zdCBvdXRGaWxlTmFtZSA9IHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUgKyBcIi5tZFwiO1xyXG5cdFx0Y29uc3QgbGlua3M6IFVucmVzb2x2ZWRMaW5rW10gPSBbXTtcclxuXHRcdGNvbnN0IHVucmVzb2x2ZWRMaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUudW5yZXNvbHZlZExpbmtzO1xyXG5cclxuXHRcdGZvciAobGV0IGZpbGVQYXRoIGluIHVucmVzb2x2ZWRMaW5rcykge1xyXG5cdFx0XHRpZiAoZmlsZVBhdGggPT0gdGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZSArIFwiLm1kXCIpIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBmaWxlUGF0aC5zdWJzdHJpbmcoZmlsZVBhdGgubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcblxyXG5cdFx0XHRjb25zdCB1dGlscyA9IG5ldyBVdGlscyhcclxuXHRcdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0XHRmaWxlUGF0aCxcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc1RhZ3NUb0lnbm9yZSxcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0xpbmtzVG9JZ25vcmUsXHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlLFxyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZXNUb0lnbm9yZVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoIXV0aWxzLmlzVmFsaWQoKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgaW4gdW5yZXNvbHZlZExpbmtzW2ZpbGVQYXRoXSkge1xyXG5cdFx0XHRcdGNvbnN0IGxpbmtGaWxlVHlwZSA9IGxpbmsuc3Vic3RyaW5nKGxpbmsubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2cobGlua0ZpbGVUeXBlKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRmlsZVR5cGVzVG9JZ25vcmUuY29udGFpbnMobGlua0ZpbGVUeXBlKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGxldCBmb3JtYXR0ZWRGaWxlUGF0aCA9IGZpbGVQYXRoO1xyXG5cdFx0XHRcdGlmIChmaWxlVHlwZSA9PSBcIm1kXCIpIHtcclxuXHRcdFx0XHRcdGZvcm1hdHRlZEZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKDAsIGZpbGVQYXRoLmxhc3RJbmRleE9mKFwiLm1kXCIpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgdW5yZXNvbHZlZExpbms6IFVucmVzb2x2ZWRMaW5rID0geyBmaWxlczogW2Zvcm1hdHRlZEZpbGVQYXRoXSwgbGluazogbGluayB9O1xyXG5cdFx0XHRcdGlmIChsaW5rcy5jb250YWlucyh1bnJlc29sdmVkTGluaykpXHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRjb25zdCBkdXBsaWNhdGlvbiA9IGxpbmtzLmZpbmQoKGUpID0+IGUubGluayA9PSBsaW5rKTtcclxuXHRcdFx0XHRpZiAoZHVwbGljYXRpb24pIHtcclxuXHRcdFx0XHRcdGR1cGxpY2F0aW9uLmZpbGVzLnB1c2goZm9ybWF0dGVkRmlsZVBhdGgpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRsaW5rcy5wdXNoKHVucmVzb2x2ZWRMaW5rKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdFV0aWxzLndyaXRlQW5kT3BlbkZpbGUoXHJcblx0XHRcdHRoaXMuYXBwLFxyXG5cdFx0XHRvdXRGaWxlTmFtZSxcclxuXHRcdFx0W1xyXG5cdFx0XHRcdFwiRG9uJ3QgZm9yZ2V0IHRoYXQgY3JlYXRpbmcgdGhlIGZpbGUgZnJvbSBoZXJlIG1heSBjcmVhdGUgdGhlIGZpbGUgaW4gdGhlIHdyb25nIGRpcmVjdG9yeSFcIixcclxuXHRcdFx0XHQuLi5saW5rcy5tYXAoKGUpID0+IGAtIFtbJHtlLmxpbmt9XV0gaW4gW1ske2UuZmlsZXMuam9pbihcIl1dLCBbW1wiKX1dXWApXHJcblx0XHRcdF0uam9pbihcIlxcblwiKSk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmluZEZpbGVzV2l0aG91dFRhZ3MoKSB7XHJcblx0XHRjb25zdCBvdXRGaWxlTmFtZSA9IHRoaXMuc2V0dGluZ3Mud2l0aG91dFRhZ3NPdXRwdXRGaWxlTmFtZSArIFwiLm1kXCI7XHJcblx0XHRsZXQgb3V0RmlsZTogVEZpbGU7XHJcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHRcdGxldCB3aXRob3V0RmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IHtcclxuXHRcdFx0aWYgKG5ldyBVdGlscyh0aGlzLmFwcCwgZmlsZS5wYXRoLCBbXSwgW10sIHRoaXMuc2V0dGluZ3Mud2l0aG91dFRhZ3NEaXJlY3Rvcmllc1RvSWdub3JlLCB0aGlzLnNldHRpbmdzLndpdGhvdXRUYWdzRmlsZXNUb0lnbm9yZSwgdHJ1ZSkuaXNWYWxpZCgpKSB7XHJcblx0XHRcdFx0cmV0dXJuIChnZXRBbGxUYWdzKHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpKS5sZW5ndGggPz8gMCkgPD0gMDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdHdpdGhvdXRGaWxlcy5yZW1vdmUob3V0RmlsZSk7XHJcblxyXG5cclxuXHRcdGxldCBwcmVmaXg6IHN0cmluZztcclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRpc2FibGVXb3JraW5nTGlua3MpXHJcblx0XHRcdHByZWZpeCA9IFwiXHRcIjtcclxuXHRcdGVsc2VcclxuXHRcdFx0cHJlZml4ID0gXCJcIjtcclxuXHRcdGNvbnN0IHRleHQgPSB3aXRob3V0RmlsZXMubWFwKChmaWxlKSA9PiBgJHtwcmVmaXh9LSBbWyR7ZmlsZS5wYXRofV1dYCkuam9pbihcIlxcblwiKTtcclxuXHRcdFV0aWxzLndyaXRlQW5kT3BlbkZpbGUodGhpcy5hcHAsIG91dEZpbGVOYW1lLCB0ZXh0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpbiBhbiB1bmxpbmtlZCBmaWxlXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGZpbGUgZmlsZSB0byBjaGVja1xyXG5cdCAqIEBwYXJhbSBsaW5rcyBhbGwgbGlua3MgaW4gdGhlIHZhdWx0XHJcblx0ICovXHJcblx0aXNWYWxpZChmaWxlOiBURmlsZSwgbGlua3M6IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcblx0XHRpZiAobGlua3MuY29udGFpbnMoZmlsZS5wYXRoKSlcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdC8vZmlsZXR5cGVzIHRvIGlnbm9yZSBieSBkZWZhdWx0XHJcblx0XHRpZiAoZmlsZS5leHRlbnNpb24gPT0gXCJjc3NcIilcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmZpbGVUeXBlc1RvSWdub3JlWzBdICE9PSBcIlwiKSB7XHJcblx0XHRcdGNvbnN0IGNvbnRhaW5zRmlsZVR5cGUgPSB0aGlzLnNldHRpbmdzLmZpbGVUeXBlc1RvSWdub3JlLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKTtcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuaWdub3JlRmlsZVR5cGVzKSB7XHJcblx0XHRcdFx0aWYgKGNvbnRhaW5zRmlsZVR5cGUpIHJldHVybjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoIWNvbnRhaW5zRmlsZVR5cGUpIHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKFxyXG5cdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0ZmlsZS5wYXRoLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLnRhZ3NUb0lnbm9yZSxcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5saW5rc1RvSWdub3JlLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmRpcmVjdG9yaWVzVG9JZ25vcmUsXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuZmlsZXNUb0lnbm9yZSxcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5pZ25vcmVEaXJlY3Rvcmllc1xyXG5cdFx0KTtcclxuXHRcdGlmICghdXRpbHMuaXNWYWxpZCgpKVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coJ3VubG9hZGluZyAnICsgdGhpcy5tYW5pZmVzdC5uYW1lICsgXCIgcGx1Z2luXCIpO1xyXG5cdH1cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIl0sIm5hbWVzIjpbIk1vZGFsIiwibm9ybWFsaXplUGF0aCIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIiwiZ2V0QWxsVGFncyIsIml0ZXJhdGVDYWNoZVJlZnMiLCJnZXRMaW5rcGF0aCIsIk5vdGljZSIsIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUM3QyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7QUFDbEcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBdUNEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDMUcsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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 diff --git a/.obsidian/plugins/find-unlinked-files/manifest.json b/.obsidian/plugins/find-unlinked-files/manifest.json index df2bbf36..a9cbdc81 100644 --- a/.obsidian/plugins/find-unlinked-files/manifest.json +++ b/.obsidian/plugins/find-unlinked-files/manifest.json @@ -1,7 +1,7 @@ { "id": "find-unlinked-files", "name": "Find unlinked files and unresolved links", - "version": "1.3.0", + "version": "1.3.1", "description": "Find files that are not linked anywhere and would otherwise be lost in your vault. In other words: files with no backlinks.", "author": "Vinzent", "authorUrl": "https://github.com/Vinzent03", diff --git a/.obsidian/plugins/music-code-blocks/main.js b/.obsidian/plugins/music-code-blocks/main.js deleted file mode 100644 index 1f0a9527..00000000 --- a/.obsidian/plugins/music-code-blocks/main.js +++ /dev/null @@ -1,17653 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var version = '5.12.0'; - -var version_1 = version; - -// Copyright (C) 2014-2018 Gregory Dyke (gregdyke at gmail dot com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var spacing = {}; - -spacing.FONTEM = 360; -spacing.FONTSIZE = 30; -spacing.STEP = spacing.FONTSIZE*93/720; -spacing.SPACE = 10; -spacing.TOPNOTE = 15; -spacing.STAVEHEIGHT = 100; -spacing.INDENT = 50; - -var abc_spacing = spacing; - -// abc_parse.js: parses a string representing ABC Music Notation into a usable internal structure. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var parseCommon = {}; - -parseCommon.clone = function(source) { - var destination = {}; - for (var property in source) - if (source.hasOwnProperty(property)) - destination[property] = source[property]; - return destination; -}; - -parseCommon.cloneArray = function(source) { - var destination = []; - for (var i = 0; i < source.length; i++) { - destination.push(parseCommon.clone(source[i])); - } - return destination; -}; - -parseCommon.cloneHashOfHash = function(source) { - var destination = {}; - for (var property in source) - if (source.hasOwnProperty(property)) - destination[property] = parseCommon.clone(source[property]); - return destination; -}; - -parseCommon.cloneHashOfArrayOfHash = function(source) { - var destination = {}; - for (var property in source) - if (source.hasOwnProperty(property)) - destination[property] = parseCommon.cloneArray(source[property]); - return destination; -}; - -parseCommon.gsub = function(source, pattern, replacement) { - return source.split(pattern).join(replacement); -}; - -parseCommon.strip = function(str) { - return str.replace(/^\s+/, '').replace(/\s+$/, ''); -}; - -parseCommon.startsWith = function(str, pattern) { - return str.indexOf(pattern) === 0; -}; - -parseCommon.endsWith = function(str, pattern) { - var d = str.length - pattern.length; - return d >= 0 && str.lastIndexOf(pattern) === d; -}; - -parseCommon.each = function(arr, iterator, context) { - for (var i = 0, length = arr.length; i < length; i++) - iterator.apply(context, [arr[i],i]); -}; - -parseCommon.last = function(arr) { - if (arr.length === 0) - return null; - return arr[arr.length-1]; -}; - -parseCommon.compact = function(arr) { - var output = []; - for (var i = 0; i < arr.length; i++) { - if (arr[i]) - output.push(arr[i]); - } - return output; -}; - -parseCommon.detect = function(arr, iterator) { - for (var i = 0; i < arr.length; i++) { - if (iterator(arr[i])) - return true; - } - return false; -}; - -// The following is a polyfill for Object.remove for IE9, IE10, and IE11. -// from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md -(function (arr) { - arr.forEach(function (item) { - if (item.hasOwnProperty('remove')) { - return; - } - Object.defineProperty(item, 'remove', { - configurable: true, - enumerable: true, - writable: true, - value: function remove() { - if (this.parentNode !== null) - this.parentNode.removeChild(this); - } - }); - }); -})([Element.prototype, CharacterData.prototype, DocumentType.prototype]); - -var abc_common = parseCommon; - -var TimingCallbacks = function(target, params) { - var self = this; - if (!params) params = {}; - self.qpm = params.qpm ? parseInt(params.qpm, 10) : null; - if (!self.qpm) { - var tempo = target.metaText ? target.metaText.tempo : null; - self.qpm = target.getBpm(tempo); - } - self.extraMeasuresAtBeginning = params.extraMeasuresAtBeginning ? parseInt(params.extraMeasuresAtBeginning, 10) : 0; - self.beatCallback = params.beatCallback; // This is called for each beat. - self.eventCallback = params.eventCallback; // This is called for each note or rest encountered. - self.lineEndCallback = params.lineEndCallback; // This is called when the end of a line is approaching. - self.lineEndAnticipation = params.lineEndAnticipation ? parseInt(params.lineEndAnticipation, 10) : 0; // How many milliseconds before the end should the call happen. - self.beatSubdivisions = params.beatSubdivisions ? parseInt(params.beatSubdivisions, 10) : 1; // how many callbacks per beat is desired. - - self.replaceTarget = function(newTarget) { - newTarget.setTiming(self.qpm, self.extraMeasuresAtBeginning); - if (newTarget.noteTimings.length === 0) - newTarget.setTiming(0,0); - if (self.lineEndCallback) { - self.lineEndTimings = getLineEndTimings(newTarget.noteTimings, self.lineEndAnticipation); - } - self.noteTimings = newTarget.noteTimings; - }; - - self.replaceTarget(target); - if (self.noteTimings.length === 0) - return; - - // noteTimings contains an array of events sorted by time. Events that happen at the same time are in the same element of the array. - self.noteTimings = target.noteTimings; - self.millisecondsPerBeat = 1000 / (self.qpm / 60) / self.beatSubdivisions; - self.lastMoment = self.noteTimings[self.noteTimings.length-1].milliseconds; - self.totalBeats = Math.round(self.lastMoment / self.millisecondsPerBeat); - - self.startTime = null; - self.currentBeat = 0; - self.currentEvent = 0; - self.isPaused = false; - self.isRunning = false; - self.pausedTime = null; - self.justUnpaused = false; - - self.newSeekPercent = 0; - self.justSeeked = false; - - function setCurrentLocation(timestamp) { - // First find the relative amount to move: that is, the difference between the current percentage and the passed in percent. - var currentPercent = (timestamp - self.startTime) / self.lastMoment; - var percentDifference = currentPercent - self.newSeekPercent; - var timeDifference = self.lastMoment * percentDifference; - self.startTime = self.startTime + timeDifference; - - var currentTime = timestamp - self.startTime; - currentTime += 50; // Add a little slop because this function isn't called exactly. - - var oldBeat = self.currentBeat; - self.currentBeat = Math.floor(currentTime / self.millisecondsPerBeat); - if (self.beatCallback && oldBeat !== self.currentBeat) // If the movement caused the beat to change, then immediately report it to the client. - self.beatCallback(self.currentBeat / self.beatSubdivisions, self.totalBeats / self.beatSubdivisions, self.lastMoment); - - self.currentEvent = 0; - while (self.noteTimings.length > self.currentEvent && self.noteTimings[self.currentEvent].milliseconds < currentTime) { - self.currentEvent++; - } - if (self.eventCallback && self.currentEvent > 0 && self.noteTimings[self.currentEvent - 1].type === 'event') - self.eventCallback(self.noteTimings[self.currentEvent - 1]); - - // console.log("currentPercent="+currentPercent+ - // " newSeekPercent="+self.newSeekPercent+ - // " percentDifference="+percentDifference+ - // " timeDifference=",timeDifference+ - // " currentBeat="+self.currentBeat+ - // " currentEvent="+self.currentEvent); - } - - self.doTiming = function (timestamp) { - if (!self.startTime) { - self.startTime = timestamp; - } else if (self.justUnpaused) { - // Add the amount we paused to the start time to get the right place. - var timePaused = (timestamp - self.pausedTime); - self.startTime += timePaused; - } - self.justUnpaused = false; - - if (self.justSeeked) { - setCurrentLocation(timestamp); - self.justSeeked = false; - } - if (self.isPaused) { - self.pausedTime = timestamp; - } else if (self.isRunning) { - var currentTime = timestamp - self.startTime; - currentTime += 50; // Add a little slop because this function isn't called exactly. - while (self.noteTimings.length > self.currentEvent && self.noteTimings[self.currentEvent].milliseconds < currentTime) { - if (self.eventCallback && self.noteTimings[self.currentEvent].type === 'event') - self.eventCallback(self.noteTimings[self.currentEvent]); - self.currentEvent++; - } - if (currentTime < self.lastMoment) { - requestAnimationFrame(self.doTiming); - if (self.currentBeat * self.millisecondsPerBeat < currentTime) { - if (self.beatCallback) - self.beatCallback(self.currentBeat / self.beatSubdivisions, self.totalBeats / self.beatSubdivisions, self.lastMoment); - self.currentBeat++; - } - } else if (self.currentBeat <= self.totalBeats) { - // Because of timing issues (for instance, if the browser tab isn't active), the beat callbacks might not have happened when they are supposed to. To keep the client programs from having to deal with that, this will keep calling the loop until all of them have been sent. - if (self.beatCallback) { - self.beatCallback(self.currentBeat / self.beatSubdivisions, self.totalBeats / self.beatSubdivisions, self.lastMoment); - self.currentBeat++; - requestAnimationFrame(self.doTiming); - } - } - - if (self.lineEndCallback && self.lineEndTimings.length && self.lineEndTimings[0].milliseconds <= currentTime) { - self.lineEndCallback(self.lineEndTimings[0]); - self.lineEndTimings.shift(); - } - - if (currentTime >= self.lastMoment && self.eventCallback) - self.eventCallback(null); - } - }; - - self.start = function() { - self.isRunning = true; - if (self.isPaused) { - self.isPaused = false; - self.justUnpaused = true; - } - requestAnimationFrame(self.doTiming); - }; - self.pause = function() { - self.isPaused = true; - self.isRunning = false; - }; - self.reset = function() { - self.currentBeat = 0; - self.currentEvent = 0; - self.startTime = null; - self.pausedTime = null; - if (self.lineEndCallback) { - self.lineEndTimings = getLineEndTimings(self.noteTimings, self.lineEndAnticipation); - } - }; - self.stop = function() { - self.pause(); - self.reset(); - }; - self.setProgress = function(percent) { - // this is passed a value between 0 and 1. - // the effect of this function is to move startTime so that the callbacks happen correctly for the new seek. - if (percent < 0) percent = 0; - if (percent > 1) percent = 1; - - self.newSeekPercent = percent; - self.justSeeked = true; - requestAnimationFrame(self.doTiming); - }; -}; - -function getLineEndTimings(timings, anticipation) { - // Returns an array of milliseconds to call the lineEndCallback. - // This figures out the timing of the beginning of each line and subtracts the anticipation from it. - var callbackTimes = []; - var lastTop = null; - for (var i = 0; i < timings.length; i++) { - var timing = timings[i]; - if (timing.top !== lastTop) { - callbackTimes.push({ milliseconds: timing.milliseconds - anticipation, top: timing.top, bottom: timing.top+timing.height }); - lastTop = timing.top; - } - } - return callbackTimes; -} - -var abc_timing_callbacks = TimingCallbacks; - -// abc_animation.js: handles animating the music in real time. -// Copyright (C) 2014-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - -var animation = {}; - -(function() { - - var timer; - var cursor; - animation.startAnimation = function(paper, tune, options) { - //options.bpm - //options.showCursor - //options.hideCurrentMeasure - //options.hideFinishedMeasures - if (timer) { - timer.stop(); - timer = undefined; - } - - if (options.showCursor) { - cursor = paper.querySelector('.abcjs-cursor'); - if (!cursor) { - cursor = document.createElement('DIV'); - cursor.className = 'abcjs-cursor cursor'; - cursor.style.position = 'absolute'; - - paper.appendChild(cursor); - paper.style.position = 'relative'; - } - } - - function hideMeasures(elements) { - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (!element.classList.contains('abcjs-bar')) - element.style.display = "none"; - } - } - - var lastMeasure; - function disappearMeasuresAfter(selector) { - if (lastMeasure) { - var elements = paper.querySelectorAll(lastMeasure); - hideMeasures(elements); - } - lastMeasure = selector; - } - - function disappearMeasuresBefore(selector) { - var elements = paper.querySelectorAll(selector); - hideMeasures(elements); - } - - function measureCallback(selector) { - if (options.hideCurrentMeasure) { - disappearMeasuresBefore(selector); - } else if (options.hideFinishedMeasures) { - disappearMeasuresAfter(selector); - } - } - - function getLineAndMeasure(element) { - return '.abcjs-l' + element.line + '.abcjs-m' + element.measureNumber; - } - - function setCursor(range) { - if (range) { - if (range.measureStart) { - var selector = getLineAndMeasure(range); - if (selector) - measureCallback(selector); - } - if (cursor) { - cursor.style.left = range.left + "px"; - cursor.style.top = range.top + "px"; - cursor.style.width = range.width + "px"; - cursor.style.height = range.height + "px"; - } - } else { - timer.stop(); - timer = undefined; - } - } - - timer = new abc_timing_callbacks(tune, { - qpm: options.bpm, - eventCallback: setCursor - }); - timer.start(); - }; - - animation.pauseAnimation = function(pause) { - if (timer) { - if (pause) - timer.pause(); - else - timer.start(); - } - }; - - animation.stopAnimation = function() { - if (timer) { - timer.stop(); - timer = undefined; - } - }; - -})(); - -var abc_animation = animation; - -/*global window */ - - - -var parseDirective = {}; - -(function() { - var tokenizer; - var warn; - var multilineVars; - var tune; - parseDirective.initialize = function(tokenizer_, warn_, multilineVars_, tune_) { - tokenizer = tokenizer_; - warn = warn_; - multilineVars = multilineVars_; - tune = tune_; - initializeFonts(); - }; - - function initializeFonts() { - multilineVars.annotationfont = { face: "Helvetica", size: 12, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.gchordfont = { face: "Helvetica", size: 12, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.historyfont = { face: "\"Times New Roman\"", size: 16, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.infofont = { face: "\"Times New Roman\"", size: 14, weight: "normal", style: "italic", decoration: "none" }; - multilineVars.measurefont = { face: "\"Times New Roman\"", size: 14, weight: "normal", style: "italic", decoration: "none" }; - multilineVars.partsfont = { face: "\"Times New Roman\"", size: 15, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.repeatfont = { face: "\"Times New Roman\"", size: 13, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.textfont = { face: "\"Times New Roman\"", size: 16, weight: "normal", style: "normal", decoration: "none" }; - multilineVars.tripletfont = {face: "Times", size: 11, weight: "normal", style: "italic", decoration: "none"}; - multilineVars.vocalfont = { face: "\"Times New Roman\"", size: 13, weight: "bold", style: "normal", decoration: "none" }; - multilineVars.wordsfont = { face: "\"Times New Roman\"", size: 16, weight: "normal", style: "normal", decoration: "none" }; - - // These fonts are global for the entire tune. - tune.formatting.composerfont = { face: "\"Times New Roman\"", size: 14, weight: "normal", style: "italic", decoration: "none" }; - tune.formatting.subtitlefont = { face: "\"Times New Roman\"", size: 16, weight: "normal", style: "normal", decoration: "none" }; - tune.formatting.tempofont = { face: "\"Times New Roman\"", size: 15, weight: "bold", style: "normal", decoration: "none" }; - tune.formatting.titlefont = { face: "\"Times New Roman\"", size: 20, weight: "normal", style: "normal", decoration: "none" }; - tune.formatting.footerfont = { face: "\"Times New Roman\"", size: 12, weight: "normal", style: "normal", decoration: "none" }; - tune.formatting.headerfont = { face: "\"Times New Roman\"", size: 12, weight: "normal", style: "normal", decoration: "none" }; - tune.formatting.voicefont = { face: "\"Times New Roman\"", size: 13, weight: "bold", style: "normal", decoration: "none" }; - - // these are the default fonts for these element types. In the printer, these fonts might change as the tune progresses. - tune.formatting.annotationfont = multilineVars.annotationfont; - tune.formatting.gchordfont = multilineVars.gchordfont; - tune.formatting.historyfont = multilineVars.historyfont; - tune.formatting.infofont = multilineVars.infofont; - tune.formatting.measurefont = multilineVars.measurefont; - tune.formatting.partsfont = multilineVars.partsfont; - tune.formatting.repeatfont = multilineVars.repeatfont; - tune.formatting.textfont = multilineVars.textfont; - tune.formatting.tripletfont = multilineVars.tripletfont; - tune.formatting.vocalfont = multilineVars.vocalfont; - tune.formatting.wordsfont = multilineVars.wordsfont; - } - - var fontTypeCanHaveBox = { gchordfont: true, measurefont: true, partsfont: true }; - - var fontTranslation = function(fontFace) { - // This translates Postscript fonts for a web alternative. - // Note that the postscript fonts contain italic and bold info in them, so what is returned is a hash. - - switch (fontFace) { - case "Arial-Italic": - return { face: "Arial", weight: "normal", style: "italic", decoration: "none" }; - case "Arial-Bold": - return { face: "Arial", weight: "bold", style: "normal", decoration: "none" }; - case "Bookman-Demi": - return { face: "Bookman,serif", weight: "bold", style: "normal", decoration: "none" }; - case "Bookman-DemiItalic": - return { face: "Bookman,serif", weight: "bold", style: "italic", decoration: "none" }; - case "Bookman-Light": - return { face: "Bookman,serif", weight: "normal", style: "normal", decoration: "none" }; - case "Bookman-LightItalic": - return { face: "Bookman,serif", weight: "normal", style: "italic", decoration: "none" }; - case "Courier": - return { face: "\"Courier New\"", weight: "normal", style: "normal", decoration: "none" }; - case "Courier-Oblique": - return { face: "\"Courier New\"", weight: "normal", style: "italic", decoration: "none" }; - case "Courier-Bold": - return { face: "\"Courier New\"", weight: "bold", style: "normal", decoration: "none" }; - case "Courier-BoldOblique": - return { face: "\"Courier New\"", weight: "bold", style: "italic", decoration: "none" }; - case "AvantGarde-Book": - return { face: "AvantGarde,Arial", weight: "normal", style: "normal", decoration: "none" }; - case "AvantGarde-BookOblique": - return { face: "AvantGarde,Arial", weight: "normal", style: "italic", decoration: "none" }; - case "AvantGarde-Demi": - case "Avant-Garde-Demi": - return { face: "AvantGarde,Arial", weight: "bold", style: "normal", decoration: "none" }; - case "AvantGarde-DemiOblique": - return { face: "AvantGarde,Arial", weight: "bold", style: "italic", decoration: "none" }; - case "Helvetica-Oblique": - return { face: "Helvetica", weight: "normal", style: "italic", decoration: "none" }; - case "Helvetica-Bold": - return { face: "Helvetica", weight: "bold", style: "normal", decoration: "none" }; - case "Helvetica-BoldOblique": - return { face: "Helvetica", weight: "bold", style: "italic", decoration: "none" }; - case "Helvetica-Narrow": - return { face: "\"Helvetica Narrow\",Helvetica", weight: "normal", style: "normal", decoration: "none" }; - case "Helvetica-Narrow-Oblique": - return { face: "\"Helvetica Narrow\",Helvetica", weight: "normal", style: "italic", decoration: "none" }; - case "Helvetica-Narrow-Bold": - return { face: "\"Helvetica Narrow\",Helvetica", weight: "bold", style: "normal", decoration: "none" }; - case "Helvetica-Narrow-BoldOblique": - return { face: "\"Helvetica Narrow\",Helvetica", weight: "bold", style: "italic", decoration: "none" }; - case "Palatino-Roman": - return { face: "Palatino", weight: "normal", style: "normal", decoration: "none" }; - case "Palatino-Italic": - return { face: "Palatino", weight: "normal", style: "italic", decoration: "none" }; - case "Palatino-Bold": - return { face: "Palatino", weight: "bold", style: "normal", decoration: "none" }; - case "Palatino-BoldItalic": - return { face: "Palatino", weight: "bold", style: "italic", decoration: "none" }; - case "NewCenturySchlbk-Roman": - return { face: "\"New Century\",serif", weight: "normal", style: "normal", decoration: "none" }; - case "NewCenturySchlbk-Italic": - return { face: "\"New Century\",serif", weight: "normal", style: "italic", decoration: "none" }; - case "NewCenturySchlbk-Bold": - return { face: "\"New Century\",serif", weight: "bold", style: "normal", decoration: "none" }; - case "NewCenturySchlbk-BoldItalic": - return { face: "\"New Century\",serif", weight: "bold", style: "italic", decoration: "none" }; - case "Times": - case "Times-Roman": - case "Times-Narrow": - case "Times-Courier": - case "Times-New-Roman": - return { face: "\"Times New Roman\"", weight: "normal", style: "normal", decoration: "none" }; - case "Times-Italic": - case "Times-Italics": - return { face: "\"Times New Roman\"", weight: "normal", style: "italic", decoration: "none" }; - case "Times-Bold": - return { face: "\"Times New Roman\"", weight: "bold", style: "normal", decoration: "none" }; - case "Times-BoldItalic": - return { face: "\"Times New Roman\"", weight: "bold", style: "italic", decoration: "none" }; - case "ZapfChancery-MediumItalic": - return { face: "\"Zapf Chancery\",cursive,serif", weight: "normal", style: "normal", decoration: "none" }; - default: - return null; - } - }; - - var getFontParameter = function(tokens, currentSetting, str, position, cmd) { - // Every font parameter has the following format: - // - // Where: - // face: either a standard web font name, or a postscript font, enumerated in fontTranslation. This could also be an * or be missing if the face shouldn't change. - // utf8: This is optional, and specifies utf8. That's all that is supported so the field is just silently ignored. - // size: The size, in pixels. This may be omitted if the size is not changing. - // modifiers: zero or more of "bold", "italic", "underline" - // box: Only applies to the measure numbers, gchords, and the parts. If present, then a box is drawn around the characters. - // If face is present, then all the modifiers are cleared. If face is absent, then the modifiers are illegal. - // The face can be a single word, a set of words separated by hyphens, or a quoted string. - // - // So, in practicality, there are three types of font definitions: a number only, an asterisk and a number only, or the full definition (with an optional size). - function processNumberOnly() { - var size = parseInt(tokens[0].token); - tokens.shift(); - if (!currentSetting) { - warn("Can't set just the size of the font since there is no default value.", str, position); - return { face: "\"Times New Roman\"", weight: "normal", style: "normal", decoration: "none", size: size}; - } - if (tokens.length === 0) { - return { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size}; - } - if (tokens.length === 1 && tokens[0].token === "box" && fontTypeCanHaveBox[cmd]) - return { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size, box: true}; - warn("Extra parameters in font definition.", str, position); - return { face: currentSetting.face, weight: currentSetting.weight, style: currentSetting.style, decoration: currentSetting.decoration, size: size}; - } - - // format 1: asterisk and number only - if (tokens[0].token === '*') { - tokens.shift(); - if (tokens[0].type === 'number') - return processNumberOnly(); - else { - warn("Expected font size number after *.", str, position); - } - } - - // format 2: number only - if (tokens[0].type === 'number') { - return processNumberOnly(); - } - - // format 3: whole definition - var face = []; - var size; - var weight = "normal"; - var style = "normal"; - var decoration = "none"; - var box = false; - var state = 'face'; - var hyphenLast = false; - while (tokens.length) { - var currToken = tokens.shift(); - var word = currToken.token.toLowerCase(); - switch (state) { - case 'face': - if (hyphenLast || (word !== 'utf' && currToken.type !== 'number' && word !== "bold" && word !== "italic" && word !== "underline" && word !== "box")) { - if (face.length > 0 && currToken.token === '-') { - hyphenLast = true; - face[face.length-1] = face[face.length-1] + currToken.token; - } - else { - if (hyphenLast) { - hyphenLast = false; - face[face.length-1] = face[face.length-1] + currToken.token; - } else - face.push(currToken.token); - } - } else { - if (currToken.type === 'number') { - if (size) { - warn("Font size specified twice in font definition.", str, position); - } else { - size = currToken.token; - } - state = 'modifier'; - } else if (word === "bold") - weight = "bold"; - else if (word === "italic") - style = "italic"; - else if (word === "underline") - decoration = "underline"; - else if (word === "box") { - if (fontTypeCanHaveBox[cmd]) - box = true; - else - warn("This font style doesn't support \"box\"", str, position); - state = "finished"; - } else if (word === "utf") { - currToken = tokens.shift(); // this gets rid of the "8" after "utf" - state = "size"; - } else - warn("Unknown parameter " + currToken.token + " in font definition.", str, position); - } - break; - case "size": - if (currToken.type === 'number') { - if (size) { - warn("Font size specified twice in font definition.", str, position); - } else { - size = currToken.token; - } - } else { - warn("Expected font size in font definition.", str, position); - } - state = 'modifier'; - break; - case "modifier": - if (word === "bold") - weight = "bold"; - else if (word === "italic") - style = "italic"; - else if (word === "underline") - decoration = "underline"; - else if (word === "box") { - if (fontTypeCanHaveBox[cmd]) - box = true; - else - warn("This font style doesn't support \"box\"", str, position); - state = "finished"; - } else - warn("Unknown parameter " + currToken.token + " in font definition.", str, position); - break; - case "finished": - warn("Extra characters found after \"box\" in font definition.", str, position); - break; - } - } - - if (size === undefined) { - if (!currentSetting) { - warn("Must specify the size of the font since there is no default value.", str, position); - size = 12; - } else - size = currentSetting.size; - } else - size = parseFloat(size); - - face = face.join(' '); - var psFont = fontTranslation(face); - var font = {}; - if (psFont) { - font.face = psFont.face; - font.weight = psFont.weight; - font.style = psFont.style; - font.decoration = psFont.decoration; - font.size = size; - if (box) - font.box = true; - return font; - } - font.face = face; - font.weight = weight; - font.style = style; - font.decoration = decoration; - font.size = size; - if (box) - font.box = true; - return font; - }; - - var getChangingFont = function(cmd, tokens, str) { - if (tokens.length === 0) - return "Directive \"" + cmd + "\" requires a font as a parameter."; - multilineVars[cmd] = getFontParameter(tokens, multilineVars[cmd], str, 0, cmd); - if (multilineVars.is_in_header) // If the font appears in the header, then it becomes the default font. - tune.formatting[cmd] = multilineVars[cmd]; - return null; - }; - var getGlobalFont = function(cmd, tokens, str) { - if (tokens.length === 0) - return "Directive \"" + cmd + "\" requires a font as a parameter."; - tune.formatting[cmd] = getFontParameter(tokens, tune.formatting[cmd], str, 0, cmd); - return null; - }; - - var setScale = function(cmd, tokens) { - var scratch = ""; - abc_common.each(tokens, function(tok) { - scratch += tok.token; - }); - var num = parseFloat(scratch); - if (isNaN(num) || num === 0) - return "Directive \"" + cmd + "\" requires a number as a parameter."; - tune.formatting.scale = num; - - }; - - var getRequiredMeasurement = function(cmd, tokens) { - var points = tokenizer.getMeasurement(tokens); - if (points.used === 0 || tokens.length !== 0) - return { error: "Directive \"" + cmd + "\" requires a measurement as a parameter."}; - return points.value; - }; - var oneParameterMeasurement = function(cmd, tokens) { - var points = tokenizer.getMeasurement(tokens); - if (points.used === 0 || tokens.length !== 0) - return "Directive \"" + cmd + "\" requires a measurement as a parameter."; - tune.formatting[cmd] = points.value; - return null; - }; - - var addMultilineVar = function(key, cmd, tokens, min, max) { - if (tokens.length !== 1 || tokens[0].type !== 'number') - return "Directive \"" + cmd + "\" requires a number as a parameter."; - var i = tokens[0].intt; - if (min !== undefined && i < min) - return "Directive \"" + cmd + "\" requires a number greater than or equal to " + min + " as a parameter."; - if (max !== undefined && i > max) - return "Directive \"" + cmd + "\" requires a number less than or equal to " + max + " as a parameter."; - multilineVars[key] = i; - return null; - }; - - var addMultilineVarBool = function(key, cmd, tokens) { - if (tokens.length === 1 && (tokens[0].token === 'true' || tokens[0].token === 'false')) { - multilineVars[key] = tokens[0].token === 'true'; - return null; - } - var str = addMultilineVar(key, cmd, tokens, 0, 1); - if (str !== null) return str; - multilineVars[key] = (multilineVars[key] === 1); - return null; - }; - - var addMultilineVarOneParamChoice = function(key, cmd, tokens, choices) { - if (tokens.length !== 1) - return "Directive \"" + cmd + "\" requires one of [ " + choices.join(", ") + " ] as a parameter."; - var choice = tokens[0].token; - var found = false; - for (var i = 0; !found && i < choices.length; i++) { - if (choices[i] === choice) - found = true; - } - if (!found) - return "Directive \"" + cmd + "\" requires one of [ " + choices.join(", ") + " ] as a parameter."; - multilineVars[key] = choice; - return null; - }; - - var midiCmdParam0 = [ - "nobarlines", - "barlines", - "beataccents", - "nobeataccents", - "droneon", - "droneoff", - "drumon", - "drumoff", - "fermatafixed", - "fermataproportional", - "gchordon", - "gchordoff", - "controlcombo", - "temperamentnormal", - "noportamento" - ]; - var midiCmdParam1String = [ - "gchord", - "ptstress", - "beatstring" - ]; - var midiCmdParam1Integer = [ - "bassvol", - "chordvol", - "c", - "channel", - "beatmod", - "deltaloudness", - "drumbars", - "gracedivider", - "makechordchannels", - "randomchordattack", - "chordattack", - "stressmodel", - "transpose", - "rtranspose", - "vol", - "volinc" - ]; - var midiCmdParam1Integer1OptionalInteger = [ - "program" - ]; - var midiCmdParam2Integer = [ - "ratio", - "snt", - "bendvelocity", - "pitchbend", - "control", - "temperamentlinear" - ]; - var midiCmdParam4Integer = [ - "beat" - ]; - var midiCmdParam5Integer = [ - "drone" - ]; - var midiCmdParam1String1Integer = [ - "portamento" - ]; - var midiCmdParamFraction = [ - "expand", - "grace", - "trim" - ]; - var midiCmdParam1StringVariableIntegers = [ - "drum", - "chordname" - ]; - - var parseMidiCommand = function(midi, tune, restOfString) { - var midi_cmd = midi.shift().token; - var midi_params = []; - if (midiCmdParam0.indexOf(midi_cmd) >= 0) { - // NO PARAMETERS - if (midi.length !== 0) - warn("Unexpected parameter in MIDI " + midi_cmd, restOfString, 0); - } else if (midiCmdParam1String.indexOf(midi_cmd) >= 0) { - // ONE STRING PARAMETER - if (midi.length !== 1) - warn("Expected one parameter in MIDI " + midi_cmd, restOfString, 0); - else - midi_params.push(midi[0].token); - } else if (midiCmdParam1Integer.indexOf(midi_cmd) >= 0) { - // ONE INT PARAMETER - if (midi.length !== 1) - warn("Expected one parameter in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number") - warn("Expected one integer parameter in MIDI " + midi_cmd, restOfString, 0); - else - midi_params.push(midi[0].intt); - } else if (midiCmdParam1Integer1OptionalInteger.indexOf(midi_cmd) >= 0) { - // ONE INT PARAMETER, ONE OPTIONAL PARAMETER - if (midi.length !== 1 && midi.length !== 2) - warn("Expected one or two parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number") - warn("Expected integer parameter in MIDI " + midi_cmd, restOfString, 0); - else if (midi.length === 2 && midi[1].type !== "number") - warn("Expected integer parameter in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].intt); - if (midi.length === 2) - midi_params.push(midi[1].intt); - } - } else if (midiCmdParam2Integer.indexOf(midi_cmd) >= 0) { - // TWO INT PARAMETERS - if (midi.length !== 2) - warn("Expected two parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number" || midi[1].type !== "number") - warn("Expected two integer parameters in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].intt); - midi_params.push(midi[1].intt); - } - } else if (midiCmdParam1String1Integer.indexOf(midi_cmd) >= 0) { - // ONE STRING PARAMETER, ONE INT PARAMETER - if (midi.length !== 2) - warn("Expected two parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "alpha" || midi[1].type !== "number") - warn("Expected one string and one integer parameters in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].token); - midi_params.push(midi[1].intt); - } - } else if (midi_cmd === 'drummap') { - // BUILD AN OBJECT OF ABC NOTE => MIDI NOTE - if (midi.length === 2 && midi[0].type === 'alpha' && midi[1].type === 'number') { - if (!tune.formatting) tune.formatting = {}; - if (!tune.formatting.midi) tune.formatting.midi = {}; - if (!tune.formatting.midi.drummap) tune.formatting.midi.drummap = {}; - tune.formatting.midi.drummap[midi[0].token] = midi[1].intt; - midi_params = tune.formatting.midi.drummap; - } else if (midi.length === 3 && midi[0].type === 'punct' && midi[1].type === 'alpha' && midi[2].type === 'number') { - if (!tune.formatting) tune.formatting = {}; - if (!tune.formatting.midi) tune.formatting.midi = {}; - if (!tune.formatting.midi.drummap) tune.formatting.midi.drummap = {}; - tune.formatting.midi.drummap[midi[0].token+midi[1].token] = midi[2].intt; - midi_params = tune.formatting.midi.drummap; - } else { - warn("Expected one note name and one integer parameter in MIDI " + midi_cmd, restOfString, 0); - } - } else if (midiCmdParamFraction.indexOf(midi_cmd) >= 0) { - // ONE FRACTION PARAMETER - if (midi.length !== 3) - warn("Expected fraction parameter in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number" || midi[1].token !== "/" || midi[2].type !== "number") - warn("Expected fraction parameter in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].intt); - midi_params.push(midi[2].intt); - } - } else if (midiCmdParam4Integer.indexOf(midi_cmd) >= 0) { - // FOUR INT PARAMETERS - if (midi.length !== 4) - warn("Expected four parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number" || midi[1].type !== "number" || midi[2].type !== "number" || midi[3].type !== "number") - warn("Expected four integer parameters in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].intt); - midi_params.push(midi[1].intt); - midi_params.push(midi[2].intt); - midi_params.push(midi[3].intt); - } - } else if (midiCmdParam5Integer.indexOf(midi_cmd) >= 0) { - // FIVE INT PARAMETERS - if (midi.length !== 5) - warn("Expected five parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number" || midi[1].type !== "number" || midi[2].type !== "number" || midi[3].type !== "number" || midi[4].type !== "number") - warn("Expected five integer parameters in MIDI " + midi_cmd, restOfString, 0); - else { - midi_params.push(midi[0].intt); - midi_params.push(midi[1].intt); - midi_params.push(midi[2].intt); - midi_params.push(midi[3].intt); - midi_params.push(midi[4].intt); - } - } else if (midiCmdParam1Integer1OptionalInteger.indexOf(midi_cmd) >= 0) { - // ONE INT PARAMETER, ONE OPTIONAL OCTAVE PARAMETER - if (midi.length !== 1 || midi.length !== 4) - warn("Expected one or two parameters in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "number") - warn("Expected integer parameter in MIDI " + midi_cmd, restOfString, 0); - else if (midi.length === 4) { - if (midi[1].token !== "octave") - warn("Expected octave parameter in MIDI " + midi_cmd, restOfString, 0); - if (midi[2].token !== "=") - warn("Expected octave parameter in MIDI " + midi_cmd, restOfString, 0); - if (midi[3].type !== "number") - warn("Expected integer parameter for octave in MIDI " + midi_cmd, restOfString, 0); - } else { - midi_params.push(midi[0].intt); - if (midi.length === 4) - midi_params.push(midi[3].intt); - } - } else if (midiCmdParam1StringVariableIntegers.indexOf(midi_cmd) >= 0) { - // ONE STRING, VARIABLE INT PARAMETERS - if (midi.length < 2) - warn("Expected string parameter and at least one integer parameter in MIDI " + midi_cmd, restOfString, 0); - else if (midi[0].type !== "alpha") - warn("Expected string parameter and at least one integer parameter in MIDI " + midi_cmd, restOfString, 0); - else { - var p = midi.shift(); - midi_params.push(p.token); - while (midi.length > 0) { - p = midi.shift(); - if (p.type !== "number") - warn("Expected integer parameter in MIDI " + midi_cmd, restOfString, 0); - midi_params.push(p.intt); - } - } - } - - if (tune.hasBeginMusic()) - tune.appendElement('midi', -1, -1, { cmd: midi_cmd, params: midi_params }); - else { - if (tune.formatting['midi'] === undefined) - tune.formatting['midi'] = {}; - tune.formatting['midi'][midi_cmd] = midi_params; - } - }; - - parseDirective.parseFontChangeLine = function(textstr) { - var textParts = textstr.split('$'); - if (textParts.length > 1 && multilineVars.setfont) { - var textarr = [ { text: textParts[0] }]; - for (var i = 1; i < textParts.length; i++) { - if (textParts[i].charAt(0) === '0') - textarr.push({ text: textParts[i].substring(1) }); - else if (textParts[i].charAt(0) === '1' && multilineVars.setfont[1]) - textarr.push({font: multilineVars.setfont[1], text: textParts[i].substring(1) }); - else if (textParts[i].charAt(0) === '2' && multilineVars.setfont[2]) - textarr.push({font: multilineVars.setfont[2], text: textParts[i].substring(1) }); - else if (textParts[i].charAt(0) === '3' && multilineVars.setfont[3]) - textarr.push({font: multilineVars.setfont[3], text: textParts[i].substring(1) }); - else if (textParts[i].charAt(0) === '4' && multilineVars.setfont[4]) - textarr.push({font: multilineVars.setfont[4], text: textParts[i].substring(1) }); - else - textarr[textarr.length-1].text += '$' + textParts[i]; - } - if (textarr.length > 1) - return textarr; - } - return textstr; - }; - - var positionChoices = [ 'auto', 'above', 'below', 'hidden' ]; - parseDirective.addDirective = function(str) { - var tokens = tokenizer.tokenize(str, 0, str.length); // 3 or more % in a row, or just spaces after %% is just a comment - if (tokens.length === 0 || tokens[0].type !== 'alpha') return null; - var restOfString = str.substring(str.indexOf(tokens[0].token)+tokens[0].token.length); - restOfString = tokenizer.stripComment(restOfString); - var cmd = tokens.shift().token.toLowerCase(); - var scratch = ""; - switch (cmd) - { - // The following directives were added to abc_parser_lint, but haven't been implemented here. - // Most of them are direct translations from the directives that will be parsed in. See abcm2ps's format.txt for info on each of these. - // alignbars: { type: "number", optional: true }, - // aligncomposer: { type: "string", Enum: [ 'left', 'center','right' ], optional: true }, - // bstemdown: { type: "boolean", optional: true }, - // continueall: { type: "boolean", optional: true }, - // dynalign: { type: "boolean", optional: true }, - // exprabove: { type: "boolean", optional: true }, - // exprbelow: { type: "boolean", optional: true }, - // gchordbox: { type: "boolean", optional: true }, - // graceslurs: { type: "boolean", optional: true }, - // gracespacebefore: { type: "number", optional: true }, - // gracespaceinside: { type: "number", optional: true }, - // gracespaceafter: { type: "number", optional: true }, - // infospace: { type: "number", optional: true }, - // lineskipfac: { type: "number", optional: true }, - // maxshrink: { type: "number", optional: true }, - // maxstaffsep: { type: "number", optional: true }, - // maxsysstaffsep: { type: "number", optional: true }, - // notespacingfactor: { type: "number", optional: true }, - // parskipfac: { type: "number", optional: true }, - // slurheight: { type: "number", optional: true }, - // splittune: { type: "boolean", optional: true }, - // squarebreve: { type: "boolean", optional: true }, - // stemheight: { type: "number", optional: true }, - // straightflags: { type: "boolean", optional: true }, - // stretchstaff: { type: "boolean", optional: true }, - // titleformat: { type: "string", optional: true }, - case "bagpipes":tune.formatting.bagpipes = true;break; - case "flatbeams":tune.formatting.flatbeams = true;break; - case "landscape":multilineVars.landscape = true;break; - case "papersize":multilineVars.papersize = restOfString;break; - case "slurgraces":tune.formatting.slurgraces = true;break; - case "stretchlast":tune.formatting.stretchlast = true;break; - case "titlecaps":multilineVars.titlecaps = true;break; - case "titleleft":tune.formatting.titleleft = true;break; - case "measurebox":tune.formatting.measurebox = true;break; - - case "vocal": return addMultilineVarOneParamChoice("vocalPosition", cmd, tokens, positionChoices); - case "dynamic": return addMultilineVarOneParamChoice("dynamicPosition", cmd, tokens, positionChoices); - case "gchord": return addMultilineVarOneParamChoice("chordPosition", cmd, tokens, positionChoices); - case "ornament": return addMultilineVarOneParamChoice("ornamentPosition", cmd, tokens, positionChoices); - case "volume": return addMultilineVarOneParamChoice("volumePosition", cmd, tokens, positionChoices); - - case "botmargin": - case "botspace": - case "composerspace": - case "indent": - case "leftmargin": - case "linesep": - case "musicspace": - case "partsspace": - case "pageheight": - case "pagewidth": - case "rightmargin": - case "staffsep": - case "staffwidth": - case "subtitlespace": - case "sysstaffsep": - case "systemsep": - case "textspace": - case "titlespace": - case "topmargin": - case "topspace": - case "vocalspace": - case "wordsspace": - return oneParameterMeasurement(cmd, tokens); - case "voicescale": - if (tokens.length !== 1 || tokens[0].type !== 'number') - return "voicescale requires one float as a parameter"; - var voiceScale = tokens.shift(); - if (multilineVars.currentVoice) { - multilineVars.currentVoice.scale = voiceScale.floatt; - tune.changeVoiceScale(multilineVars.currentVoice.scale); - } - return null; - case "vskip": - var vskip = getRequiredMeasurement(cmd, tokens); - if (vskip.error) - return vskip.error; - tune.addSpacing(vskip); - return null; - case "scale": - setScale(cmd, tokens); - break; - case "sep": - if (tokens.length === 0) - tune.addSeparator(); - else { - var points = tokenizer.getMeasurement(tokens); - if (points.used === 0) - return "Directive \"" + cmd + "\" requires 3 numbers: space above, space below, length of line"; - var spaceAbove = points.value; - - points = tokenizer.getMeasurement(tokens); - if (points.used === 0) - return "Directive \"" + cmd + "\" requires 3 numbers: space above, space below, length of line"; - var spaceBelow = points.value; - - points = tokenizer.getMeasurement(tokens); - if (points.used === 0 || tokens.length !== 0) - return "Directive \"" + cmd + "\" requires 3 numbers: space above, space below, length of line"; - var lenLine = points.value; - tune.addSeparator(spaceAbove, spaceBelow, lenLine); - } - break; - case "barsperstaff": - scratch = addMultilineVar('barsperstaff', cmd, tokens); - if (scratch !== null) return scratch; - break; - case "staffnonote": - // The sense of the boolean is opposite here. "0" means true. - if (tokens.length !== 1) - return "Directive staffnonote requires one parameter: 0 or 1"; - if (tokens[0].token === '0') - multilineVars.staffnonote = true; - else if (tokens[0].token === '1') - multilineVars.staffnonote = false; - else - return "Directive staffnonote requires one parameter: 0 or 1 (received " + tokens[0].token + ')'; - break; - case "printtempo": - scratch = addMultilineVarBool('printTempo', cmd, tokens); - if (scratch !== null) return scratch; - break; - case "partsbox": - scratch = addMultilineVarBool('partsBox', cmd, tokens); - if (scratch !== null) return scratch; - multilineVars.partsfont.box = multilineVars.partsBox; - break; - case "freegchord": - scratch = addMultilineVarBool('freegchord', cmd, tokens); - if (scratch !== null) return scratch; - break; - case "measurenb": - case "barnumbers": - scratch = addMultilineVar('barNumbers', cmd, tokens); - if (scratch !== null) return scratch; - break; - case "setbarnb": - if (tokens.length !== 1 || tokens[0].type !== 'number') { - return 'Directive setbarnb requires a number as a parameter.'; - } - multilineVars.currBarNumber = tune.setBarNumberImmediate(tokens[0].intt); - break; - case "begintext": - multilineVars.inTextBlock = true; - break; - case "continueall": - multilineVars.continueall = true; - break; - case "beginps": - multilineVars.inPsBlock = true; - warn("Postscript ignored", str, 0); - break; - case "deco": - if (restOfString.length > 0) - multilineVars.ignoredDecorations.push(restOfString.substring(0, restOfString.indexOf(' '))); - warn("Decoration redefinition ignored", str, 0); - break; - case "text": - var textstr = tokenizer.translateString(restOfString); - tune.addText(parseDirective.parseFontChangeLine(textstr)); - break; - case "center": - var centerstr = tokenizer.translateString(restOfString); - tune.addCentered(parseDirective.parseFontChangeLine(centerstr)); - break; - case "font": - // don't need to do anything for this; it is a useless directive - break; - case "setfont": - var sfTokens = tokenizer.tokenize(restOfString, 0, restOfString.length); -// var sfDone = false; - if (sfTokens.length >= 4) { - if (sfTokens[0].token === '-' && sfTokens[1].type === 'number') { - var sfNum = parseInt(sfTokens[1].token); - if (sfNum >= 1 && sfNum <= 4) { - if (!multilineVars.setfont) - multilineVars.setfont = []; - sfTokens.shift(); - sfTokens.shift(); - multilineVars.setfont[sfNum] = getFontParameter(sfTokens, multilineVars.setfont[sfNum], str, 0, 'setfont'); -// var sfSize = sfTokens.pop(); -// if (sfSize.type === 'number') { -// sfSize = parseInt(sfSize.token); -// var sfFontName = ''; -// for (var sfi = 2; sfi < sfTokens.length; sfi++) -// sfFontName += sfTokens[sfi].token; -// multilineVars.setfont[sfNum] = { face: sfFontName, size: sfSize }; -// sfDone = true; -// } - } - } - } -// if (!sfDone) -// return "Bad parameters: " + cmd; - break; - case "gchordfont": - case "partsfont": - case "tripletfont": - case "vocalfont": - case "textfont": - case "annotationfont": - case "historyfont": - case "infofont": - case "measurefont": - case "repeatfont": - case "wordsfont": - return getChangingFont(cmd, tokens, str); - case "composerfont": - case "subtitlefont": - case "tempofont": - case "titlefont": - case "voicefont": - case "footerfont": - case "headerfont": - return getGlobalFont(cmd, tokens, str); - case "barlabelfont": - case "barnumberfont": - case "barnumfont": - return getChangingFont("measurefont", tokens, str); - case "staves": - case "score": - multilineVars.score_is_present = true; - var addVoice = function(id, newStaff, bracket, brace, continueBar) { - if (newStaff || multilineVars.staves.length === 0) { - multilineVars.staves.push({index: multilineVars.staves.length, numVoices: 0}); - } - var staff = abc_common.last(multilineVars.staves); - if (bracket !== undefined) staff.bracket = bracket; - if (brace !== undefined) staff.brace = brace; - if (continueBar) staff.connectBarLines = 'end'; - if (multilineVars.voices[id] === undefined) { - multilineVars.voices[id] = {staffNum: staff.index, index: staff.numVoices}; - staff.numVoices++; - } - }; - - var openParen = false; - var openBracket = false; - var openBrace = false; - var justOpenParen = false; - var justOpenBracket = false; - var justOpenBrace = false; - var continueBar = false; - var lastVoice; - var addContinueBar = function() { - continueBar = true; - if (lastVoice) { - var ty = 'start'; - if (lastVoice.staffNum > 0) { - if (multilineVars.staves[lastVoice.staffNum-1].connectBarLines === 'start' || - multilineVars.staves[lastVoice.staffNum-1].connectBarLines === 'continue') - ty = 'continue'; - } - multilineVars.staves[lastVoice.staffNum].connectBarLines = ty; - } - }; - while (tokens.length) { - var t = tokens.shift(); - switch (t.token) { - case '(': - if (openParen) warn("Can't nest parenthesis in %%score", str, t.start); - else {openParen = true;justOpenParen = true;} - break; - case ')': - if (!openParen || justOpenParen) warn("Unexpected close parenthesis in %%score", str, t.start); - else openParen = false; - break; - case '[': - if (openBracket) warn("Can't nest brackets in %%score", str, t.start); - else {openBracket = true;justOpenBracket = true;} - break; - case ']': - if (!openBracket || justOpenBracket) warn("Unexpected close bracket in %%score", str, t.start); - else {openBracket = false;multilineVars.staves[lastVoice.staffNum].bracket = 'end';} - break; - case '{': - if (openBrace ) warn("Can't nest braces in %%score", str, t.start); - else {openBrace = true;justOpenBrace = true;} - break; - case '}': - if (!openBrace || justOpenBrace) warn("Unexpected close brace in %%score", str, t.start); - else {openBrace = false;multilineVars.staves[lastVoice.staffNum].brace = 'end';} - break; - case '|': - addContinueBar(); - break; - default: - var vc = ""; - while (t.type === 'alpha' || t.type === 'number') { - vc += t.token; - if (t.continueId) - t = tokens.shift(); - else - break; - } - var newStaff = !openParen || justOpenParen; - var bracket = justOpenBracket ? 'start' : openBracket ? 'continue' : undefined; - var brace = justOpenBrace ? 'start' : openBrace ? 'continue' : undefined; - addVoice(vc, newStaff, bracket, brace, continueBar); - justOpenParen = false; - justOpenBracket = false; - justOpenBrace = false; - continueBar = false; - lastVoice = multilineVars.voices[vc]; - if (cmd === 'staves') - addContinueBar(); - break; - } - } - break; - - case "newpage": - var pgNum = tokenizer.getInt(restOfString); - tune.addNewPage(pgNum.digits === 0 ? -1 : pgNum.value); - break; - - case "abc": - var arr = restOfString.split(' '); - switch (arr[0]) { - case "-copyright": - case "-creator": - case "-edited-by": - case "-version": - case "-charset": - var subCmd = arr.shift(); - tune.addMetaText(cmd+subCmd, arr.join(' ')); - break; - default: - return "Unknown directive: " + cmd+arr[0]; - } - break; - case "header": - case "footer": - var footerStr = tokenizer.getMeat(restOfString, 0, restOfString.length); - footerStr = restOfString.substring(footerStr.start, footerStr.end); - if (footerStr.charAt(0) === '"' && footerStr.charAt(footerStr.length-1) === '"' ) - footerStr = footerStr.substring(1, footerStr.length-1); - var footerArr = footerStr.split('\t'); - var footer = {}; - if (footerArr.length === 1) - footer = { left: "", center: footerArr[0], right: "" }; - else if (footerArr.length === 2) - footer = { left: footerArr[0], center: footerArr[1], right: "" }; - else - footer = { left: footerArr[0], center: footerArr[1], right: footerArr[2] }; - if (footerArr.length > 3) - warn("Too many tabs in " + cmd + ": " + footerArr.length + " found.", restOfString, 0); - - tune.addMetaTextObj(cmd, footer); - break; - - case "midi": - var midi = tokenizer.tokenize(restOfString, 0, restOfString.length, true); - if (midi.length > 0 && midi[0].token === '=') - midi.shift(); - if (midi.length === 0) - warn("Expected midi command", restOfString, 0); - else - parseMidiCommand(midi, tune, restOfString); - break; - - case "map": - case "percmap": - case "playtempo": - case "auquality": - case "continuous": - case "nobarcheck": - // TODO-PER: Actually handle the parameters of these - tune.formatting[cmd] = restOfString; - break; - default: - return "Unknown directive: " + cmd; - } - return null; - }; - parseDirective.globalFormatting = function(formatHash) { - for (var cmd in formatHash) { - if (formatHash.hasOwnProperty(cmd)) { - var value = ''+formatHash[cmd]; - var tokens = tokenizer.tokenize(value, 0, value.length); - var scratch; - switch (cmd) { - case "titlefont": - case "gchordfont": - case "composerfont": - case "footerfont": - case "headerfont": - case "historyfont": - case "infofont": - case "measurefont": - case "partsfont": - case "repeatfont": - case "subtitlefont": - case "tempofont": - case "textfont": - case "voicefont": - case "tripletfont": - case "vocalfont": - case "wordsfont": - case "annotationfont": - getChangingFont(cmd, tokens, value); - break; - case "scale": - setScale(cmd, tokens); - break; - case "partsbox": - scratch = addMultilineVarBool('partsBox', cmd, tokens); - if (scratch !== null) warn(scratch); - multilineVars.partsfont.box = multilineVars.partsBox; - break; - case "freegchord": - scratch = addMultilineVarBool('freegchord', cmd, tokens); - if (scratch !== null) warn(scratch); - default: - warn("Formatting directive unrecognized: ", cmd, 0); - } - } - } - }; -})(); - -var abc_parse_directive = parseDirective; - -// abc_transpose.js: Handles the automatic transposition of key signatures, chord symbols, and notes. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var transpose = {}; - -var keyIndex = { - 'C': 0, - 'C#': 1, - 'Db': 1, - 'D': 2, - 'D#': 3, - 'Eb': 3, - 'E': 4, - 'F': 5, - 'F#': 6, - 'Gb': 6, - 'G': 7, - 'G#': 8, - 'Ab': 8, - 'A': 9, - 'A#': 10, - 'Bb': 10, - 'B': 11 -}; -var newKey = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'F#', 'G', 'Ab', 'A', 'Bb', 'B']; -var newKeyMinor = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'Bb', 'B']; - -transpose.keySignature = function(multilineVars, keys, keyName, root, acc, localTranspose) { - if (!localTranspose) localTranspose = 0; - multilineVars.localTransposeVerticalMovement = 0; - multilineVars.localTransposePreferFlats = false; - var k = keys[keyName]; - if (!k) return multilineVars.key; // If the key isn't in the list, it is non-standard. We won't attempt to transpose it. - multilineVars.localTranspose = (multilineVars.globalTranspose ? multilineVars.globalTranspose : 0) + localTranspose; - - if (!multilineVars.localTranspose) - return { accidentals: k, root: root, acc: acc }; - multilineVars.globalTransposeOrigKeySig = k; - if (multilineVars.localTranspose % 12 === 0) { - multilineVars.localTransposeVerticalMovement = (multilineVars.localTranspose / 12) * 7; - return { accidentals: k, root: root, acc: acc }; - } - - var baseKey = keyName[0]; - if (keyName[1] === 'b' || keyName[1] === '#') { - baseKey += keyName[1]; - keyName = keyName.substr(2); - } else - keyName = keyName.substr(1); - var index = keyIndex[baseKey] + multilineVars.localTranspose; - while (index < 0) index += 12; - if (index > 11) index = index % 12; - var newKeyName = (keyName[0] === 'm' ? newKeyMinor[index] : newKey[index]); - var transposedKey = newKeyName + keyName; - var newKeySig = keys[transposedKey]; - if (newKeySig.length > 0 && newKeySig[0].acc === 'flat') - multilineVars.localTransposePreferFlats = true; - var distance = transposedKey.charCodeAt(0) - baseKey.charCodeAt(0); - if (multilineVars.localTranspose > 0) { - if (distance < 0) - distance += 7; - else if (distance === 0) { - // There's a funny thing that happens when the key changes only an accidental's distance, for instance, from Ab to A. - // If the distance is positive (we are raising pitch), and the change is higher (that is, Ab -> A), then raise an octave. - // This test is easier because we know the keys are not equal (or we wouldn't get this far), so if the base key is a flat key, then - // the transposed key must be higher. Likewise, if the transposed key is sharp, then the base key must be lower. And one - // of those two things must be true because they are not both natural. - if (baseKey[1] === '#' || transposedKey[1] === 'b') - distance += 7; - } - } else if (multilineVars.localTranspose < 0) { - if (distance > 0) - distance -= 7; - else if (distance === 0) { - // There's a funny thing that happens when the key changes only an accidental's distance, for instance, from Ab to A. - // If the distance is negative (we are dropping pitch), and the change is lower (that is, A -> Ab), then drop an octave. - if (baseKey[1] === 'b' || transposedKey[1] === '#') - distance -= 7; - } - } - - if (multilineVars.localTranspose > 0) - multilineVars.localTransposeVerticalMovement = distance + Math.floor(multilineVars.localTranspose / 12) * 7; - else - multilineVars.localTransposeVerticalMovement = distance + Math.ceil(multilineVars.localTranspose / 12) * 7; - return { accidentals: newKeySig, root: newKeyName[0], acc: newKeyName.length > 1 ? newKeyName[1] : "" }; -}; - -var sharpChords = [ 'C', 'C♯', 'D', "D♯", 'E', 'F', "F♯", 'G', 'G♯', 'A', 'A♯', 'B']; -var flatChords = [ 'C', 'D♭', 'D', 'E♭', 'E', 'F', 'G♭', 'G', 'A♭', 'A', 'B♭', 'B']; -var sharpChordsFree = [ 'C', 'C#', 'D', "D#", 'E', 'F', "F#", 'G', 'G#', 'A', 'A#', 'B']; -var flatChordsFree = [ 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B']; - -transpose.chordName = function(multilineVars, chord) { - if (multilineVars.localTranspose && (multilineVars.localTranspose % 12 !== 0)) { // The chords are the same if it is an exact octave change. - var transposeFactor = multilineVars.localTranspose; - while (transposeFactor < 0) transposeFactor += 12; - if (transposeFactor > 11) transposeFactor = transposeFactor % 12; - if (multilineVars.freegchord) { - chord = chord.replace(/Cb/g, "`~11`"); - chord = chord.replace(/Db/g, "`~1`"); - chord = chord.replace(/Eb/g, "`~3`"); - chord = chord.replace(/Fb/g, "`~4`"); - chord = chord.replace(/Gb/g, "`~6`"); - chord = chord.replace(/Ab/g, "`~8`"); - chord = chord.replace(/Bb/g, "`~10`"); - chord = chord.replace(/C#/g, "`~1`"); - chord = chord.replace(/D#/g, "`~3`"); - chord = chord.replace(/E#/g, "`~5`"); - chord = chord.replace(/F#/g, "`~6`"); - chord = chord.replace(/G#/g, "`~8`"); - chord = chord.replace(/A#/g, "`~10`"); - chord = chord.replace(/B#/g, "`~0`"); - } else { - chord = chord.replace(/C♭/g, "`~11`"); - chord = chord.replace(/D♭/g, "`~1`"); - chord = chord.replace(/E♭/g, "`~3`"); - chord = chord.replace(/F♭/g, "`~4`"); - chord = chord.replace(/G♭/g, "`~6`"); - chord = chord.replace(/A♭/g, "`~8`"); - chord = chord.replace(/B♭/g, "`~10`"); - chord = chord.replace(/C♯/g, "`~1`"); - chord = chord.replace(/D♯/g, "`~3`"); - chord = chord.replace(/E♯/g, "`~5`"); - chord = chord.replace(/F♯/g, "`~6`"); - chord = chord.replace(/G♯/g, "`~8`"); - chord = chord.replace(/A♯/g, "`~10`"); - chord = chord.replace(/B♯/g, "`~0`"); - } - chord = chord.replace(/C/g, "`~0`"); - chord = chord.replace(/D/g, "`~2`"); - chord = chord.replace(/E/g, "`~4`"); - chord = chord.replace(/F/g, "`~5`"); - chord = chord.replace(/G/g, "`~7`"); - chord = chord.replace(/A/g, "`~9`"); - chord = chord.replace(/B/g, "`~11`"); - var arr = chord.split("`"); - for (var i = 0; i < arr.length; i++) { - if (arr[i][0] === '~') { - var chordNum = parseInt(arr[i].substr(1),10); - chordNum += transposeFactor; - if (chordNum > 11) chordNum -= 12; - if (multilineVars.freegchord) - arr[i] = multilineVars.localTransposePreferFlats ? flatChordsFree[chordNum] : sharpChordsFree[chordNum]; - else - arr[i] = multilineVars.localTransposePreferFlats ? flatChords[chordNum] : sharpChords[chordNum]; - } - } - chord = arr.join(""); - } - return chord; -}; - -var pitchToLetter = [ 'c', 'd', 'e', 'f', 'g', 'a', 'b' ]; -function accidentalChange(origPitch, newPitch, accidental, origKeySig, newKeySig) { - var origPitchLetter = pitchToLetter[(origPitch + 49) % 7]; // Make sure it is a positive pitch before normalizing. - var origAccidental = 0; - for (var i = 0; i < origKeySig.length; i++) { - if (origKeySig[i].note.toLowerCase() === origPitchLetter) - origAccidental = accidentals[origKeySig[i].acc]; - } - - var currentAccidental = accidentals[accidental]; - var delta = currentAccidental - origAccidental; - - var newPitchLetter = pitchToLetter[(newPitch + 49) % 7]; // Make sure it is a positive pitch before normalizing. - var newAccidental = 0; - for (var j = 0; j < newKeySig.accidentals.length; j++) { - if (newKeySig.accidentals[j].note.toLowerCase() === newPitchLetter) - newAccidental = accidentals[newKeySig.accidentals[j].acc]; - } - var calcAccidental = delta + newAccidental; - if (calcAccidental < -2) { - newPitch--; - calcAccidental += (newPitchLetter === 'c' || newPitchLetter === 'f') ? 1 : 2; - } - if (calcAccidental > 2) { - newPitch++; - calcAccidental -= (newPitchLetter === 'b' || newPitchLetter === 'e') ? 1 : 2; - } - return [newPitch, calcAccidental]; -} - -var accidentals = { - dblflat: -2, - flat: -1, - natural: 0, - sharp: 1, - dblsharp: 2 -}; -var accidentals2 = { - "-2": "dblflat", - "-1": "flat", - "0": "natural", - "1": "sharp", - "2": "dblsharp" -}; -transpose.note = function(multilineVars, el) { - // the "el" that is passed in has el.accidental, and el.pitch. "pitch" is the vertical position (0=middle C) - // localTranspose is the number of half steps - // localTransposeVerticalMovement is the vertical distance to move. - if (!multilineVars.localTranspose) - return; - var origPitch = el.pitch; - el.pitch = el.pitch + multilineVars.localTransposeVerticalMovement; - - if (el.accidental) { - var ret = accidentalChange(origPitch, el.pitch, el.accidental, multilineVars.globalTransposeOrigKeySig, multilineVars.targetKey); - el.pitch = ret[0]; - el.accidental = accidentals2[ret[1]]; - } - -}; - -var abc_transpose = transpose; - -/*global window */ - - - - - -var parseKeyVoice = {}; - -(function() { - var tokenizer; - var warn; - var multilineVars; - var tune; - parseKeyVoice.initialize = function(tokenizer_, warn_, multilineVars_, tune_) { - tokenizer = tokenizer_; - warn = warn_; - multilineVars = multilineVars_; - tune = tune_; - }; - - parseKeyVoice.standardKey = function(keyName, root, acc, localTranspose) { - var key1sharp = {acc: 'sharp', note: 'f'}; - var key2sharp = {acc: 'sharp', note: 'c'}; - var key3sharp = {acc: 'sharp', note: 'g'}; - var key4sharp = {acc: 'sharp', note: 'd'}; - var key5sharp = {acc: 'sharp', note: 'A'}; - var key6sharp = {acc: 'sharp', note: 'e'}; - var key7sharp = {acc: 'sharp', note: 'B'}; - var key1flat = {acc: 'flat', note: 'B'}; - var key2flat = {acc: 'flat', note: 'e'}; - var key3flat = {acc: 'flat', note: 'A'}; - var key4flat = {acc: 'flat', note: 'd'}; - var key5flat = {acc: 'flat', note: 'G'}; - var key6flat = {acc: 'flat', note: 'c'}; - var key7flat = {acc: 'flat', note: 'F'}; - - var keys = { - 'C#': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'A#m': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'G#Mix': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'D#Dor': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'E#Phr': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'F#Lyd': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - 'B#Loc': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ], - - 'F#': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'D#m': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'C#Mix': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'G#Dor': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'A#Phr': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'BLyd': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - 'E#Loc': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp ], - - 'B': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'G#m': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'F#Mix': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'C#Dor': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'D#Phr': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'ELyd': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - 'A#Loc': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp ], - - 'E': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'C#m': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'BMix': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'F#Dor': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'G#Phr': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'ALyd': [ key1sharp, key2sharp, key3sharp, key4sharp ], - 'D#Loc': [ key1sharp, key2sharp, key3sharp, key4sharp ], - - 'A': [ key1sharp, key2sharp, key3sharp ], - 'F#m': [ key1sharp, key2sharp, key3sharp ], - 'EMix': [ key1sharp, key2sharp, key3sharp ], - 'BDor': [ key1sharp, key2sharp, key3sharp ], - 'C#Phr': [ key1sharp, key2sharp, key3sharp ], - 'DLyd': [ key1sharp, key2sharp, key3sharp ], - 'G#Loc': [ key1sharp, key2sharp, key3sharp ], - - 'D': [ key1sharp, key2sharp ], - 'Bm': [ key1sharp, key2sharp ], - 'AMix': [ key1sharp, key2sharp ], - 'EDor': [ key1sharp, key2sharp ], - 'F#Phr': [ key1sharp, key2sharp ], - 'GLyd': [ key1sharp, key2sharp ], - 'C#Loc': [ key1sharp, key2sharp ], - - 'G': [ key1sharp ], - 'Em': [ key1sharp ], - 'DMix': [ key1sharp ], - 'ADor': [ key1sharp ], - 'BPhr': [ key1sharp ], - 'CLyd': [ key1sharp ], - 'F#Loc': [ key1sharp ], - - 'C': [], - 'Am': [], - 'GMix': [], - 'DDor': [], - 'EPhr': [], - 'FLyd': [], - 'BLoc': [], - - 'F': [ key1flat ], - 'Dm': [ key1flat ], - 'CMix': [ key1flat ], - 'GDor': [ key1flat ], - 'APhr': [ key1flat ], - 'BbLyd': [ key1flat ], - 'ELoc': [ key1flat ], - - 'Bb': [ key1flat, key2flat ], - 'Gm': [ key1flat, key2flat ], - 'FMix': [ key1flat, key2flat ], - 'CDor': [ key1flat, key2flat ], - 'DPhr': [ key1flat, key2flat ], - 'EbLyd': [ key1flat, key2flat ], - 'ALoc': [ key1flat, key2flat ], - - 'Eb': [ key1flat, key2flat, key3flat ], - 'Cm': [ key1flat, key2flat, key3flat ], - 'BbMix': [ key1flat, key2flat, key3flat ], - 'FDor': [ key1flat, key2flat, key3flat ], - 'GPhr': [ key1flat, key2flat, key3flat ], - 'AbLyd': [ key1flat, key2flat, key3flat ], - 'DLoc': [ key1flat, key2flat, key3flat ], - - 'Ab': [ key1flat, key2flat, key3flat, key4flat ], - 'Fm': [ key1flat, key2flat, key3flat, key4flat ], - 'EbMix': [ key1flat, key2flat, key3flat, key4flat ], - 'BbDor': [ key1flat, key2flat, key3flat, key4flat ], - 'CPhr': [ key1flat, key2flat, key3flat, key4flat ], - 'DbLyd': [ key1flat, key2flat, key3flat, key4flat ], - 'GLoc': [ key1flat, key2flat, key3flat, key4flat ], - - 'Db': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'Bbm': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'AbMix': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'EbDor': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'FPhr': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'GbLyd': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - 'CLoc': [ key1flat, key2flat, key3flat, key4flat, key5flat ], - - 'Gb': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'Ebm': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'DbMix': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'AbDor': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'BbPhr': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'CbLyd': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - 'FLoc': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat ], - - 'Cb': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'Abm': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'GbMix': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'DbDor': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'EbPhr': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'FbLyd': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - 'BbLoc': [ key1flat, key2flat, key3flat, key4flat, key5flat, key6flat, key7flat ], - - // The following are not in the 2.0 spec, but seem normal enough. - // TODO-PER: These SOUND the same as what's written, but they aren't right - 'A#': [ key1flat, key2flat ], - 'B#': [], - 'D#': [ key1flat, key2flat, key3flat ], - 'E#': [ key1flat ], - 'G#': [ key1flat, key2flat, key3flat, key4flat ], - 'Gbm': [ key1sharp, key2sharp, key3sharp, key4sharp, key5sharp, key6sharp, key7sharp ] - }; - - return abc_transpose.keySignature(multilineVars, keys, keyName, root, acc, localTranspose); - }; - - var clefLines = { - 'treble': { clef: 'treble', pitch: 4, mid: 0 }, - 'treble+8': { clef: 'treble+8', pitch: 4, mid: 0 }, - 'treble-8': { clef: 'treble-8', pitch: 4, mid: 0 }, - 'treble^8': { clef: 'treble+8', pitch: 4, mid: 0 }, - 'treble_8': { clef: 'treble-8', pitch: 4, mid: 0 }, - 'treble1': { clef: 'treble', pitch: 2, mid: 2 }, - 'treble2': { clef: 'treble', pitch: 4, mid: 0 }, - 'treble3': { clef: 'treble', pitch: 6, mid: -2 }, - 'treble4': { clef: 'treble', pitch: 8, mid: -4 }, - 'treble5': { clef: 'treble', pitch: 10, mid: -6 }, - 'perc': { clef: 'perc', pitch: 6, mid: 0 }, - 'none': { clef: 'none', mid: 0 }, - 'bass': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass+8': { clef: 'bass+8', pitch: 8, mid: -12 }, - 'bass-8': { clef: 'bass-8', pitch: 8, mid: -12 }, - 'bass^8': { clef: 'bass+8', pitch: 8, mid: -12 }, - 'bass_8': { clef: 'bass-8', pitch: 8, mid: -12 }, - 'bass+16': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass-16': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass^16': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass_16': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass1': { clef: 'bass', pitch: 2, mid: -6 }, - 'bass2': { clef: 'bass', pitch: 4, mid: -8 }, - 'bass3': { clef: 'bass', pitch: 6, mid: -10 }, - 'bass4': { clef: 'bass', pitch: 8, mid: -12 }, - 'bass5': { clef: 'bass', pitch: 10, mid: -14 }, - 'tenor': { clef: 'alto', pitch: 8, mid: -8 }, - 'tenor1': { clef: 'alto', pitch: 2, mid: -2 }, - 'tenor2': { clef: 'alto', pitch: 4, mid: -4 }, - 'tenor3': { clef: 'alto', pitch: 6, mid: -6 }, - 'tenor4': { clef: 'alto', pitch: 8, mid: -8 }, - 'tenor5': { clef: 'alto', pitch: 10, mid: -10 }, - 'alto': { clef: 'alto', pitch: 6, mid: -6 }, - 'alto1': { clef: 'alto', pitch: 2, mid: -2 }, - 'alto2': { clef: 'alto', pitch: 4, mid: -4 }, - 'alto3': { clef: 'alto', pitch: 6, mid: -6 }, - 'alto4': { clef: 'alto', pitch: 8, mid: -8 }, - 'alto5': { clef: 'alto', pitch: 10, mid: -10 }, - 'alto+8': { clef: 'alto+8', pitch: 6, mid: -6 }, - 'alto-8': { clef: 'alto-8', pitch: 6, mid: -6 }, - 'alto^8': { clef: 'alto+8', pitch: 6, mid: -6 }, - 'alto_8': { clef: 'alto-8', pitch: 6, mid: -6 } - }; - - var calcMiddle = function(clef, oct) { - var value = clefLines[clef]; - var mid = value ? value.mid : 0; - return mid+oct; - }; - - parseKeyVoice.fixClef = function(clef) { - var value = clefLines[clef.type]; - if (value) { - clef.clefPos = value.pitch; - clef.type = value.clef; - } - }; - - parseKeyVoice.deepCopyKey = function(key) { - var ret = { accidentals: [], root: key.root, acc: key.acc, mode: key.mode }; - abc_common.each(key.accidentals, function(k) { - ret.accidentals.push(abc_common.clone(k)); - }); - return ret; - }; - - var pitches = {A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11}; - - parseKeyVoice.addPosToKey = function(clef, key) { - // Shift the key signature from the treble positions to whatever position is needed for the clef. - // This may put the key signature unnaturally high or low, so if it does, then shift it. - var mid = clef.verticalPos; - abc_common.each(key.accidentals, function(acc) { - var pitch = pitches[acc.note]; - pitch = pitch - mid; - acc.verticalPos = pitch; - }); - if (key.impliedNaturals) - abc_common.each(key.impliedNaturals, function(acc) { - var pitch = pitches[acc.note]; - pitch = pitch - mid; - acc.verticalPos = pitch; - }); - - if (mid < -10) { - abc_common.each(key.accidentals, function(acc) { - acc.verticalPos -= 7; - if (acc.verticalPos >= 11 || (acc.verticalPos === 10 && acc.acc === 'flat')) - acc.verticalPos -= 7; - if (acc.note === 'A' && acc.acc === 'sharp' ) - acc.verticalPos -=7; - if ((acc.note === 'G' || acc.note === 'F') && acc.acc === 'flat' ) - acc.verticalPos -=7; - }); - if (key.impliedNaturals) - abc_common.each(key.impliedNaturals, function(acc) { - acc.verticalPos -= 7; - if (acc.verticalPos >= 11 || (acc.verticalPos === 10 && acc.acc === 'flat')) - acc.verticalPos -= 7; - if (acc.note === 'A' && acc.acc === 'sharp' ) - acc.verticalPos -=7; - if ((acc.note === 'G' || acc.note === 'F') && acc.acc === 'flat' ) - acc.verticalPos -=7; - }); - } else if (mid < -4) { - abc_common.each(key.accidentals, function(acc) { - acc.verticalPos -= 7; - if (mid === -8 && (acc.note === 'f' || acc.note === 'g') && acc.acc === 'sharp' ) - acc.verticalPos -=7; - }); - if (key.impliedNaturals) - abc_common.each(key.impliedNaturals, function(acc) { - acc.verticalPos -= 7; - if (mid === -8 && (acc.note === 'f' || acc.note === 'g') && acc.acc === 'sharp' ) - acc.verticalPos -=7; - }); - } else if (mid >= 7) { - abc_common.each(key.accidentals, function(acc) { - acc.verticalPos += 7; - }); - if (key.impliedNaturals) - abc_common.each(key.impliedNaturals, function(acc) { - acc.verticalPos += 7; - }); - } - }; - - parseKeyVoice.fixKey = function(clef, key) { - var fixedKey = abc_common.clone(key); - parseKeyVoice.addPosToKey(clef, fixedKey); - return fixedKey; - }; - - var parseMiddle = function(str) { - var i = 0; - var p = str.charAt(i++); - if (p === '^' || p === '_') - p = str.charAt(i++); - var mid = pitches[p]; - if (mid === undefined) - mid = 6; // If a legal middle note wasn't received, just ignore it. - for ( ; i < str.length; i++) { - if (str.charAt(i) === ',') mid -= 7; - else if (str.charAt(i) === "'") mid += 7; - else break; - } - return { mid: mid - 6, str: str.substring(i) }; // We get the note in the middle of the staff. We want the note that appears as the first ledger line below the staff. - }; - - var normalizeAccidentals = function(accs) { - for (var i = 0; i < accs.length; i++) { - if (accs[i].note === 'b') - accs[i].note = 'B'; - else if (accs[i].note === 'a') - accs[i].note = 'A'; - else if (accs[i].note === 'F') - accs[i].note = 'f'; - else if (accs[i].note === 'E') - accs[i].note = 'e'; - else if (accs[i].note === 'D') - accs[i].note = 'd'; - else if (accs[i].note === 'C') - accs[i].note = 'c'; - else if (accs[i].note === 'G' && accs[i].acc === 'sharp') - accs[i].note = 'g'; - else if (accs[i].note === 'g' && accs[i].acc === 'flat') - accs[i].note = 'G'; - } - }; - - parseKeyVoice.parseKey = function(str) // (and clef) - { - // returns: - // { foundClef: true, foundKey: true } - // Side effects: - // calls warn() when there is a syntax error - // sets these members of multilineVars: - // clef - // key - // style - // - // The format is: - // K: [⟨key⟩] [⟨modifiers⟩*] - // modifiers are any of the following in any order: - // [⟨clef⟩] [middle=⟨pitch⟩] [transpose=[-]⟨number⟩] [stafflines=⟨number⟩] [staffscale=⟨number⟩][style=⟨style⟩] - // key is none|HP|Hp|⟨specified_key⟩ - // clef is [clef=] [⟨clef type⟩] [⟨line number⟩] [+8|-8] - // specified_key is ⟨pitch⟩[#|b][mode(first three chars are significant)][accidentals*] - if (str.length === 0) { - // an empty K: field is the same as K:none - str = 'none'; - } - var tokens = tokenizer.tokenize(str, 0, str.length); - var ret = {}; - - // first the key - switch (tokens[0].token) { - case 'HP': - abc_parse_directive.addDirective("bagpipes"); - multilineVars.key = { root: "HP", accidentals: [], acc: "", mode: "" }; - ret.foundKey = true; - tokens.shift(); - break; - case 'Hp': - abc_parse_directive.addDirective("bagpipes"); - multilineVars.key = { root: "Hp", accidentals: [{acc: 'natural', note: 'g'}, {acc: 'sharp', note: 'f'}, {acc: 'sharp', note: 'c'}], acc: "", mode: "" }; - ret.foundKey = true; - tokens.shift(); - break; - case 'none': - // we got the none key - that's the same as C to us - multilineVars.key = { root: "none", accidentals: [], acc: "", mode: "" }; - ret.foundKey = true; - tokens.shift(); - break; - default: - var retPitch = tokenizer.getKeyPitch(tokens[0].token); - if (retPitch.len > 0) { - ret.foundKey = true; - var acc = ""; - var mode = ""; - // The accidental and mode might be attached to the pitch, so we might want to just remove the first character. - if (tokens[0].token.length > 1) - tokens[0].token = tokens[0].token.substring(1); - else - tokens.shift(); - var key = retPitch.token; - // We got a pitch to start with, so we might also have an accidental and a mode - if (tokens.length > 0) { - var retAcc = tokenizer.getSharpFlat(tokens[0].token); - if (retAcc.len > 0) { - if (tokens[0].token.length > 1) - tokens[0].token = tokens[0].token.substring(1); - else - tokens.shift(); - key += retAcc.token; - acc = retAcc.token; - } - if (tokens.length > 0) { - var retMode = tokenizer.getMode(tokens[0].token); - if (retMode.len > 0) { - tokens.shift(); - key += retMode.token; - mode = retMode.token; - } - } - // Be sure that the key specified is in the list: not all keys are physically possible, like Cbmin. - if (parseKeyVoice.standardKey(key, retPitch.token, acc, 0) === undefined) { - warn("Unsupported key signature: " + key, str, 0); - return ret; - } - } - // We need to do a deep copy because we are going to modify it - var oldKey = parseKeyVoice.deepCopyKey(multilineVars.key); - //TODO-PER: HACK! To get the local transpose to work, the transposition is done for each line. This caused the global transposition variable to be factored in twice, so, instead of rewriting that right now, I'm just subtracting one of them here. - var keyCompensate = multilineVars.globalTranspose ? -multilineVars.globalTranspose : 0; - multilineVars.key = parseKeyVoice.deepCopyKey(parseKeyVoice.standardKey(key, retPitch.token, acc, keyCompensate)); - multilineVars.key.mode = mode; - if (oldKey) { - // Add natural in all places that the old key had an accidental. - var kk; - for (var k = 0; k < multilineVars.key.accidentals.length; k++) { - for (kk = 0; kk < oldKey.accidentals.length; kk++) { - if (oldKey.accidentals[kk].note && multilineVars.key.accidentals[k].note.toLowerCase() === oldKey.accidentals[kk].note.toLowerCase()) - oldKey.accidentals[kk].note = null; - } - } - for (kk = 0; kk < oldKey.accidentals.length; kk++) { - if (oldKey.accidentals[kk].note) { - if (!multilineVars.key.impliedNaturals) - multilineVars.key.impliedNaturals = []; - multilineVars.key.impliedNaturals.push({ acc: 'natural', note: oldKey.accidentals[kk].note }); - } - } - } - } - break; - } - - // There are two special cases of deprecated syntax. Ignore them if they occur - if (tokens.length === 0) return ret; - if (tokens[0].token === 'exp') tokens.shift(); - if (tokens.length === 0) return ret; - if (tokens[0].token === 'oct') tokens.shift(); - - // now see if there are extra accidentals - if (tokens.length === 0) return ret; - var accs = tokenizer.getKeyAccidentals2(tokens); - if (accs.warn) - warn(accs.warn, str, 0); - // If we have extra accidentals, first replace ones that are of the same pitch before adding them to the end. - if (accs.accs) { - if (!ret.foundKey) { // if there are only extra accidentals, make sure this is set. - ret.foundKey = true; - multilineVars.key = { root: "none", acc: "", mode: "", accidentals: [] }; - } - normalizeAccidentals(accs.accs); - for (var i = 0; i < accs.accs.length; i++) { - var found = false; - for (var j = 0; j < multilineVars.key.accidentals.length && !found; j++) { - if (multilineVars.key.accidentals[j].note === accs.accs[i].note) { - found = true; - if (multilineVars.key.accidentals[j].acc !== accs.accs[i].acc) { - // If the accidental is different, then replace it. If it is the same, then the declaration was redundant, so just ignore it. - multilineVars.key.accidentals[j].acc = accs.accs[i].acc; - if (!multilineVars.key.explicitAccidentals) - multilineVars.key.explicitAccidentals = []; - multilineVars.key.explicitAccidentals.push(accs.accs[i]); - } - } - } - if (!found) { - if (!multilineVars.key.explicitAccidentals) - multilineVars.key.explicitAccidentals = []; - multilineVars.key.explicitAccidentals.push(accs.accs[i]); - multilineVars.key.accidentals.push(accs.accs[i]); - if (multilineVars.key.impliedNaturals) { - for (var kkk = 0; kkk < multilineVars.key.impliedNaturals.length; kkk++) { - if (multilineVars.key.impliedNaturals[kkk].note === accs.accs[i].note) - multilineVars.key.impliedNaturals.splice(kkk, 1); - } - } - } - } - } - - // Now see if any optional parameters are present. They have the form "key=value", except that "clef=" is optional - var token; - while (tokens.length > 0) { - switch (tokens[0].token) { - case "m": - case "middle": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after middle", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after middle", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after middle=", str, 0); return ret; } - var pitch = tokenizer.getPitchFromTokens(tokens); - if (pitch.warn) - warn(pitch.warn, str, 0); - if (pitch.position) - multilineVars.clef.verticalPos = pitch.position - 6; // we get the position from the middle line, but want to offset it to the first ledger line. - break; - case "transpose": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after transpose", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after transpose", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after transpose=", str, 0); return ret; } - if (tokens[0].type !== 'number') { warn("Expected number after transpose", str, tokens[0].start); break; } - multilineVars.clef.transpose = tokens[0].intt; - tokens.shift(); - break; - case "stafflines": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after stafflines", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after stafflines", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after stafflines=", str, 0); return ret; } - if (tokens[0].type !== 'number') { warn("Expected number after stafflines", str, tokens[0].start); break; } - multilineVars.clef.stafflines = tokens[0].intt; - tokens.shift(); - break; - case "staffscale": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after staffscale", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after staffscale", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after staffscale=", str, 0); return ret; } - if (tokens[0].type !== 'number') { warn("Expected number after staffscale", str, tokens[0].start); break; } - multilineVars.clef.staffscale = tokens[0].floatt; - tokens.shift(); - break; - case "style": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after style", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after style", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after style=", str, 0); return ret; } - switch (tokens[0].token) { - case "normal": - case "harmonic": - case "rhythm": - case "x": - multilineVars.style = tokens[0].token; - tokens.shift(); - break; - default: - warn("error parsing style element: " + tokens[0].token, str, tokens[0].start); - break; - } - break; - case "clef": - tokens.shift(); - if (tokens.length === 0) { warn("Expected = after clef", str, 0); return ret; } - token = tokens.shift(); - if (token.token !== "=") { warn("Expected = after clef", str, token.start); break; } - if (tokens.length === 0) { warn("Expected parameter after clef=", str, 0); return ret; } - //break; yes, we want to fall through. That allows "clef=" to be optional. - case "treble": - case "bass": - case "alto": - case "tenor": - case "perc": - // clef is [clef=] [⟨clef type⟩] [⟨line number⟩] [+8|-8] - var clef = tokens.shift(); - switch (clef.token) { - case 'treble': - case 'tenor': - case 'alto': - case 'bass': - case 'perc': - case 'none': - break; - case 'C': clef.token = 'alto'; break; - case 'F': clef.token = 'bass'; break; - case 'G': clef.token = 'treble'; break; - case 'c': clef.token = 'alto'; break; - case 'f': clef.token = 'bass'; break; - case 'g': clef.token = 'treble'; break; - default: - warn("Expected clef name. Found " + clef.token, str, clef.start); - break; - } - if (tokens.length > 0 && tokens[0].type === 'number') { - clef.token += tokens[0].token; - tokens.shift(); - } - if (tokens.length > 1 && (tokens[0].token === '-' || tokens[0].token === '+' || tokens[0].token === '^' || tokens[0].token === '_') && tokens[1].token === '8') { - clef.token += tokens[0].token + tokens[1].token; - tokens.shift(); - tokens.shift(); - } - multilineVars.clef = {type: clef.token, verticalPos: calcMiddle(clef.token, 0)}; - if (multilineVars.currentVoice && multilineVars.currentVoice.transpose !== undefined) - multilineVars.clef.transpose = multilineVars.currentVoice.transpose; - ret.foundClef = true; - break; - default: - warn("Unknown parameter: " + tokens[0].token, str, tokens[0].start); - tokens.shift(); - } - } - return ret; - }; - - var setCurrentVoice = function(id) { - multilineVars.currentVoice = multilineVars.voices[id]; - tune.setCurrentVoice(multilineVars.currentVoice.staffNum, multilineVars.currentVoice.index); - }; - - parseKeyVoice.parseVoice = function(line, i, e) { - //First truncate the string to the first non-space character after V: through either the - //end of the line or a % character. Then remove trailing spaces, too. - var ret = tokenizer.getMeat(line, i, e); - var start = ret.start; - var end = ret.end; - //The first thing on the line is the ID. It can be any non-space string and terminates at the - //first space. - var id = tokenizer.getToken(line, start, end); - if (id.length === 0) { - warn("Expected a voice id", line, start); - return; - } - var isNew = false; - if (multilineVars.voices[id] === undefined) { - multilineVars.voices[id] = {}; - isNew = true; - if (multilineVars.score_is_present) - warn("Can't have an unknown V: id when the %score directive is present", line, start); - } - start += id.length; - start += tokenizer.eatWhiteSpace(line, start); - - var staffInfo = {startStaff: isNew}; - var addNextTokenToStaffInfo = function(name) { - var attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected value for " + name + " in voice: " + attr.warn, line, start); - else if (attr.token.length === 0 && line.charAt(start) !== '"') - warn("Expected value for " + name + " in voice", line, start); - else - staffInfo[name] = attr.token; - start += attr.len; - }; - var addNextTokenToVoiceInfo = function(id, name, type) { - var attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected value for " + name + " in voice: " + attr.warn, line, start); - else if (attr.token.length === 0 && line.charAt(start) !== '"') - warn("Expected value for " + name + " in voice", line, start); - else { - if (type === 'number') - attr.token = parseFloat(attr.token); - multilineVars.voices[id][name] = attr.token; - } - start += attr.len; - }; - var getNextToken = function(name, type) { - var attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected value for " + name + " in voice: " + attr.warn, line, start); - else if (attr.token.length === 0 && line.charAt(start) !== '"') - warn("Expected value for " + name + " in voice", line, start); - else { - if (type === 'number') - attr.token = parseFloat(attr.token); - return attr.token; - } - start += attr.len; - }; - var addNextNoteTokenToVoiceInfo = function(id, name) { - var noteToTransposition = { - "_B": 2, - "_E": 9, - "_b": -10, - "_e": -3 - }; - var attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected one of (_B, _E, _b, _e) for " + name + " in voice: " + attr.warn, line, start); - else if (attr.token.length === 0 && line.charAt(start) !== '"') - warn("Expected one of (_B, _E, _b, _e) for " + name + " in voice", line, start); - else { - var t = noteToTransposition[attr.token]; - if (!t) - warn("Expected one of (_B, _E, _b, _e) for " + name + " in voice", line, start); - else - multilineVars.voices[id][name] = t; - } - start += attr.len; - }; - - //Then the following items can occur in any order: - while (start < end) { - var token = tokenizer.getVoiceToken(line, start, end); - start += token.len; - - if (token.warn) { - warn("Error parsing voice: " + token.warn, line, start); - } else { - var attr = null; - switch (token.token) { - case 'clef': - case 'cl': - addNextTokenToStaffInfo('clef'); - // TODO-PER: check for a legal clef; do octavizing - var oct = 0; - // for (var ii = 0; ii < staffInfo.clef.length; ii++) { - // if (staffInfo.clef[ii] === ',') oct -= 7; - // else if (staffInfo.clef[ii] === "'") oct += 7; - // } - if (staffInfo.clef !== undefined) { - staffInfo.clef = staffInfo.clef.replace(/[',]/g, ""); //'//comment for emacs formatting of regexp - if (staffInfo.clef.indexOf('+16') !== -1) { - oct += 14; - staffInfo.clef = staffInfo.clef.replace('+16', ''); - } - staffInfo.verticalPos = calcMiddle(staffInfo.clef, oct); - } - break; - case 'treble': - case 'bass': - case 'tenor': - case 'alto': - case 'perc': - case 'none': - case 'treble\'': - case 'bass\'': - case 'tenor\'': - case 'alto\'': - case 'none\'': - case 'treble\'\'': - case 'bass\'\'': - case 'tenor\'\'': - case 'alto\'\'': - case 'none\'\'': - case 'treble,': - case 'bass,': - case 'tenor,': - case 'alto,': - case 'none,': - case 'treble,,': - case 'bass,,': - case 'tenor,,': - case 'alto,,': - case 'none,,': - // TODO-PER: handle the octave indicators on the clef by changing the middle property - var oct2 = 0; - // for (var iii = 0; iii < token.token.length; iii++) { - // if (token.token[iii] === ',') oct2 -= 7; - // else if (token.token[iii] === "'") oct2 += 7; - // } - staffInfo.clef = token.token.replace(/[',]/g, ""); //'//comment for emacs formatting of regexp - staffInfo.verticalPos = calcMiddle(staffInfo.clef, oct2); - multilineVars.voices[id].clef = token.token; - break; - case 'staves': - case 'stave': - case 'stv': - addNextTokenToStaffInfo('staves'); - break; - case 'brace': - case 'brc': - addNextTokenToStaffInfo('brace'); - break; - case 'bracket': - case 'brk': - addNextTokenToStaffInfo('bracket'); - break; - case 'name': - case 'nm': - addNextTokenToStaffInfo('name'); - break; - case 'subname': - case 'sname': - case 'snm': - addNextTokenToStaffInfo('subname'); - break; - case 'merge': - staffInfo.startStaff = false; - break; - case 'stem': - case 'stems': - attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected value for stems in voice: " + attr.warn, line, start); - else if (attr.token === 'up' || attr.token === 'down') - multilineVars.voices[id].stem = attr.token; - else - warn("Expected up or down for voice stem", line, start); - start += attr.len; - break; - case 'up': - case 'down': - multilineVars.voices[id].stem = token.token; - break; - case 'middle': - case 'm': - addNextTokenToStaffInfo('verticalPos'); - staffInfo.verticalPos = parseMiddle(staffInfo.verticalPos).mid; - break; - case 'gchords': - case 'gch': - multilineVars.voices[id].suppressChords = true; - // gchords can stand on its own, or it could be gchords=0. - attr = tokenizer.getVoiceToken(line, start, end); - if (attr.token === "0") - start = start + attr.len; - break; - case 'space': - case 'spc': - addNextTokenToStaffInfo('spacing'); - break; - case 'scale': - addNextTokenToVoiceInfo(id, 'scale', 'number'); - break; - case 'score': - addNextNoteTokenToVoiceInfo(id, 'scoreTranspose'); - break; - case 'transpose': - addNextTokenToVoiceInfo(id, 'transpose', 'number'); - break; - case 'stafflines': - addNextTokenToVoiceInfo(id, 'stafflines', 'number'); - break; - case 'staffscale': - // TODO-PER: This is passed to the engraver, but the engraver ignores it. - addNextTokenToVoiceInfo(id, 'staffscale', 'number'); - break; - case 'octave': - // TODO-PER: This is accepted, but not implemented, yet. - addNextTokenToVoiceInfo(id, 'octave', 'number'); - break; - case 'volume': - // TODO-PER: This is accepted, but not implemented, yet. - addNextTokenToVoiceInfo(id, 'volume', 'number'); - break; - case 'cue': - // TODO-PER: This is accepted, but not implemented, yet. - var cue = getNextToken('cue', 'string'); - if (cue === 'on') - multilineVars.voices[id].scale = 0.6; - else multilineVars.voices[id].scale = 1; - break; - case "style": - attr = tokenizer.getVoiceToken(line, start, end); - if (attr.warn !== undefined) - warn("Expected value for style in voice: " + attr.warn, line, start); - else if (attr.token === 'normal' || attr.token === 'harmonic' || attr.token === 'rhythm' || attr.token === 'x') - multilineVars.voices[id].style = attr.token; - else - warn("Expected one of [normal, harmonic, rhythm, x] for voice style", line, start); - start += attr.len; - break; - // default: - // Use this to find V: usages that aren't handled. - // console.log("parse voice", token, tune.metaText.title); - } - } - start += tokenizer.eatWhiteSpace(line, start); - } - - // now we've filled up staffInfo, figure out what to do with this voice - // TODO-PER: It is unclear from the standard and the examples what to do with brace, bracket, and staves, so they are ignored for now. - if (staffInfo.startStaff || multilineVars.staves.length === 0) { - multilineVars.staves.push({index: multilineVars.staves.length, meter: multilineVars.origMeter}); - if (!multilineVars.score_is_present) - multilineVars.staves[multilineVars.staves.length-1].numVoices = 0; - } - if (multilineVars.voices[id].staffNum === undefined) { - // store where to write this for quick access later. - multilineVars.voices[id].staffNum = multilineVars.staves.length-1; - var vi = 0; - for(var v in multilineVars.voices) { - if(multilineVars.voices.hasOwnProperty(v)) { - if (multilineVars.voices[v].staffNum === multilineVars.voices[id].staffNum) - vi++; - } - } - multilineVars.voices[id].index = vi-1; - } - var s = multilineVars.staves[multilineVars.voices[id].staffNum]; - if (!multilineVars.score_is_present) - s.numVoices++; - if (staffInfo.clef) s.clef = {type: staffInfo.clef, verticalPos: staffInfo.verticalPos}; - if (staffInfo.spacing) s.spacing_below_offset = staffInfo.spacing; - if (staffInfo.verticalPos) s.verticalPos = staffInfo.verticalPos; - - if (staffInfo.name) {if (s.name) s.name.push(staffInfo.name); else s.name = [ staffInfo.name ];} - if (staffInfo.subname) {if (s.subname) s.subname.push(staffInfo.subname); else s.subname = [ staffInfo.subname ];} - - setCurrentVoice(id); - }; - -})(); - -var abc_parse_key_voice = parseKeyVoice; - -// abc_parse_header.js: parses a the header fields from a string representing ABC Music Notation into a usable internal structure. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/*global window */ - - - - - -var ParseHeader = function(tokenizer, warn, multilineVars, tune) { - this.reset = function(tokenizer, warn, multilineVars, tune) { - abc_parse_key_voice.initialize(tokenizer, warn, multilineVars, tune); - abc_parse_directive.initialize(tokenizer, warn, multilineVars, tune); - }; - this.reset(tokenizer, warn, multilineVars, tune); - - this.setTitle = function(title) { - if (multilineVars.hasMainTitle) - tune.addSubtitle(tokenizer.translateString(tokenizer.stripComment(title))); // display secondary title - else - { - var titleStr = tokenizer.translateString(tokenizer.theReverser(tokenizer.stripComment(title))); - if (multilineVars.titlecaps) - titleStr = titleStr.toUpperCase(); - tune.addMetaText("title", titleStr); - multilineVars.hasMainTitle = true; - } - }; - - this.setMeter = function(line) { - line = tokenizer.stripComment(line); - if (line === 'C') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'common_time'}; - } else if (line === 'C|') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'cut_time'}; - } else if (line === 'o') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'tempus_perfectum'}; - } else if (line === 'c') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'tempus_imperfectum'}; - } else if (line === 'o.') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'tempus_perfectum_prolatio'}; - } else if (line === 'c.') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return {type: 'tempus_imperfectum_prolatio'}; - } else if (line.length === 0 || line.toLowerCase() === 'none') { - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = 0.125; - multilineVars.havent_set_length = false; - } - return null; - } - else - { - var tokens = tokenizer.tokenize(line, 0, line.length); - // the form is [open_paren] decimal [ plus|dot decimal ]... [close_paren] slash decimal [plus same_as_before] - try { - var parseNum = function() { - // handles this much: [open_paren] decimal [ plus|dot decimal ]... [close_paren] - var ret = {value: 0, num: ""}; - - var tok = tokens.shift(); - if (tok.token === '(') - tok = tokens.shift(); - while (1) { - if (tok.type !== 'number') throw "Expected top number of meter"; - ret.value += parseInt(tok.token); - ret.num += tok.token; - if (tokens.length === 0 || tokens[0].token === '/') return ret; - tok = tokens.shift(); - if (tok.token === ')') { - if (tokens.length === 0 || tokens[0].token === '/') return ret; - throw "Unexpected paren in meter"; - } - if (tok.token !== '.' && tok.token !== '+') throw "Expected top number of meter"; - ret.num += tok.token; - if (tokens.length === 0) throw "Expected top number of meter"; - tok = tokens.shift(); - } - return ret; // just to suppress warning - }; - - var parseFraction = function() { - // handles this much: parseNum slash decimal - var ret = parseNum(); - if (tokens.length === 0) return ret; - var tok = tokens.shift(); - if (tok.token !== '/') throw "Expected slash in meter"; - tok = tokens.shift(); - if (tok.type !== 'number') throw "Expected bottom number of meter"; - ret.den = tok.token; - ret.value = ret.value / parseInt(ret.den); - return ret; - }; - - if (tokens.length === 0) throw "Expected meter definition in M: line"; - var meter = {type: 'specified', value: [ ]}; - var totalLength = 0; - while (1) { - var ret = parseFraction(); - totalLength += ret.value; - var mv = { num: ret.num }; - if (ret.den !== undefined) - mv.den = ret.den; - meter.value.push(mv); - if (tokens.length === 0) break; - //var tok = tokens.shift(); - //if (tok.token !== '+') throw "Extra characters in M: line"; - } - - if (multilineVars.havent_set_length === true) { - multilineVars.default_length = totalLength < 0.75 ? 0.0625 : 0.125; - multilineVars.havent_set_length = false; - } - return meter; - } catch (e) { - warn(e, line, 0); - } - } - return null; - }; - - this.calcTempo = function(relTempo) { - var dur = 1/4; - if (multilineVars.meter && multilineVars.meter.type === 'specified') { - dur = 1 / parseInt(multilineVars.meter.value[0].den); - } else if (multilineVars.origMeter && multilineVars.origMeter.type === 'specified') { - dur = 1 / parseInt(multilineVars.origMeter.value[0].den); - } - //var dur = multilineVars.default_length ? multilineVars.default_length : 1; - for (var i = 0; i < relTempo.duration; i++) - relTempo.duration[i] = dur * relTempo.duration[i]; - return relTempo; - }; - - this.resolveTempo = function() { - if (multilineVars.tempo) { // If there's a tempo waiting to be resolved - this.calcTempo(multilineVars.tempo); - tune.metaText.tempo = multilineVars.tempo; - delete multilineVars.tempo; - } - }; - - this.addUserDefinition = function(line, start, end) { - var equals = line.indexOf('=', start); - if (equals === -1) { - warn("Need an = in a macro definition", line, start); - return; - } - - var before = abc_common.strip(line.substring(start, equals)); - var after = abc_common.strip(line.substring(equals+1)); - - if (before.length !== 1) { - warn("Macro definitions can only be one character", line, start); - return; - } - var legalChars = "HIJKLMNOPQRSTUVWXYhijklmnopqrstuvw~"; - if (legalChars.indexOf(before) === -1) { - warn("Macro definitions must be H-Y, h-w, or tilde", line, start); - return; - } - if (after.length === 0) { - warn("Missing macro definition", line, start); - return; - } - if (multilineVars.macros === undefined) - multilineVars.macros = {}; - multilineVars.macros[before] = after; - }; - - this.setDefaultLength = function(line, start, end) { - var len = abc_common.gsub(line.substring(start, end), " ", ""); - var len_arr = len.split('/'); - if (len_arr.length === 2) { - var n = parseInt(len_arr[0]); - var d = parseInt(len_arr[1]); - if (d > 0) { - multilineVars.default_length = n / d; // a whole note is 1 - multilineVars.havent_set_length = false; - } - } else if (len_arr.length === 1 && len_arr[0] === '1') { - multilineVars.default_length = 1; - multilineVars.havent_set_length = false; - } - }; - - - var tempoString = { - - larghissimo: 20, - adagissimo: 24, - sostenuto: 28, - grave: 32, - largo: 40, - lento: 50, - larghetto: 60, - adagio: 68, - adagietto: 74, - andante: 80, - andantino: 88, - "marcia moderato": 84, - "andante moderato": 100, - moderato: 112, - allegretto: 116, - "allegro moderato": 120, - allegro: 126, - animato: 132, - agitato: 140, - veloce: 148, - "mosso vivo": 156, - vivace: 164, - vivacissimo: 172, - allegrissimo: 176, - presto: 184, - prestissimo: 210, - }; - - this.setTempo = function(line, start, end) { - //Q - tempo; can be used to specify the notes per minute, e.g. If - //the meter denominator is a 4 note then Q:120 or Q:C=120 - //is 120 quarter notes per minute. Similarly Q:C3=40 would be 40 - //dotted half notes per minute. An absolute tempo may also be - //set, e.g. Q:1/8=120 is 120 eighth notes per minute, - //irrespective of the meter's denominator. - // - // This is either a number, "C=number", "Cnumber=number", or fraction [fraction...]=number - // It depends on the M: field, which may either not be present, or may appear after this. - // If M: is not present, an eighth note is used. - // That means that this field can't be calculated until the end, if it is the first three types, since we don't know if we'll see an M: field. - // So, if it is the fourth type, set it here, otherwise, save the info in the multilineVars. - // The temporary variables we keep are the duration and the bpm. In the first two forms, the duration is 1. - // In addition, a quoted string may both precede and follow. If a quoted string is present, then the duration part is optional. - try { - var tokens = tokenizer.tokenize(line, start, end); - - if (tokens.length === 0) throw "Missing parameter in Q: field"; - - var tempo = {}; - var delaySet = true; - var token = tokens.shift(); - if (token.type === 'quote') { - tempo.preString = token.token; - token = tokens.shift(); - if (tokens.length === 0) { // It's ok to just get a string for the tempo - // If the string is a well-known tempo, put in the bpm - if (tempoString[tempo.preString.toLowerCase()]) { - tempo.bpm = tempoString[tempo.preString.toLowerCase()]; - tempo.suppressBpm = true; - } - return {type: 'immediate', tempo: tempo}; - } - } - if (token.type === 'alpha' && token.token === 'C') { // either type 2 or type 3 - if (tokens.length === 0) throw "Missing tempo after C in Q: field"; - token = tokens.shift(); - if (token.type === 'punct' && token.token === '=') { - // This is a type 2 format. The duration is an implied 1 - if (tokens.length === 0) throw "Missing tempo after = in Q: field"; - token = tokens.shift(); - if (token.type !== 'number') throw "Expected number after = in Q: field"; - tempo.duration = [1]; - tempo.bpm = parseInt(token.token); - } else if (token.type === 'number') { - // This is a type 3 format. - tempo.duration = [parseInt(token.token)]; - if (tokens.length === 0) throw "Missing = after duration in Q: field"; - token = tokens.shift(); - if (token.type !== 'punct' || token.token !== '=') throw "Expected = after duration in Q: field"; - if (tokens.length === 0) throw "Missing tempo after = in Q: field"; - token = tokens.shift(); - if (token.type !== 'number') throw "Expected number after = in Q: field"; - tempo.bpm = parseInt(token.token); - } else throw "Expected number or equal after C in Q: field"; - - } else if (token.type === 'number') { // either type 1 or type 4 - var num = parseInt(token.token); - if (tokens.length === 0 || tokens[0].type === 'quote') { - // This is type 1 - tempo.duration = [1]; - tempo.bpm = num; - } else { // This is type 4 - delaySet = false; - token = tokens.shift(); - if (token.type !== 'punct' && token.token !== '/') throw "Expected fraction in Q: field"; - token = tokens.shift(); - if (token.type !== 'number') throw "Expected fraction in Q: field"; - var den = parseInt(token.token); - tempo.duration = [num/den]; - // We got the first fraction, keep getting more as long as we find them. - while (tokens.length > 0 && tokens[0].token !== '=' && tokens[0].type !== 'quote') { - token = tokens.shift(); - if (token.type !== 'number') throw "Expected fraction in Q: field"; - num = parseInt(token.token); - token = tokens.shift(); - if (token.type !== 'punct' && token.token !== '/') throw "Expected fraction in Q: field"; - token = tokens.shift(); - if (token.type !== 'number') throw "Expected fraction in Q: field"; - den = parseInt(token.token); - tempo.duration.push(num/den); - } - token = tokens.shift(); - if (token.type !== 'punct' && token.token !== '=') throw "Expected = in Q: field"; - token = tokens.shift(); - if (token.type !== 'number') throw "Expected tempo in Q: field"; - tempo.bpm = parseInt(token.token); - } - } else throw "Unknown value in Q: field"; - if (tokens.length !== 0) { - token = tokens.shift(); - if (token.type === 'quote') { - tempo.postString = token.token; - token = tokens.shift(); - } - if (tokens.length !== 0) throw "Unexpected string at end of Q: field"; - } - if (multilineVars.printTempo === false) - tempo.suppress = true; - return {type: delaySet?'delaySet':'immediate', tempo: tempo}; - } catch (msg) { - warn(msg, line, start); - return {type: 'none'}; - } - }; - - this.letter_to_inline_header = function(line, i) - { - var ws = tokenizer.eatWhiteSpace(line, i); - i +=ws; - if (line.length >= i+5 && line.charAt(i) === '[' && line.charAt(i+2) === ':') { - var e = line.indexOf(']', i); - var startChar = multilineVars.iChar + i; - var endChar = multilineVars.iChar + e + 1; - switch(line.substring(i, i+3)) - { - case "[I:": - var err = abc_parse_directive.addDirective(line.substring(i+3, e)); - if (err) warn(err, line, i); - return [ e-i+1+ws ]; - case "[M:": - var meter = this.setMeter(line.substring(i+3, e)); - if (tune.hasBeginMusic() && meter) - tune.appendStartingElement('meter', startChar, endChar, meter); - else - multilineVars.meter = meter; - return [ e-i+1+ws ]; - case "[K:": - var result = abc_parse_key_voice.parseKey(line.substring(i+3, e)); - if (result.foundClef && tune.hasBeginMusic()) - tune.appendStartingElement('clef', startChar, endChar, multilineVars.clef); - if (result.foundKey && tune.hasBeginMusic()) - tune.appendStartingElement('key', startChar, endChar, abc_parse_key_voice.fixKey(multilineVars.clef, multilineVars.key)); - return [ e-i+1+ws ]; - case "[P:": - if (tune.lines.length <= tune.lineNum) - multilineVars.partForNextLine = { title: line.substring(i+3, e), startChar: startChar, endChar: endChar }; - else - tune.appendElement('part', startChar, endChar, {title: line.substring(i+3, e)}); - return [ e-i+1+ws ]; - case "[L:": - this.setDefaultLength(line, i+3, e); - return [ e-i+1+ws ]; - case "[Q:": - if (e > 0) { - var tempo = this.setTempo(line, i+3, e); - if (tempo.type === 'delaySet') tune.appendElement('tempo', startChar, endChar, this.calcTempo(tempo.tempo)); - else if (tempo.type === 'immediate') tune.appendElement('tempo', startChar, endChar, tempo.tempo); - return [ e-i+1+ws, line.charAt(i+1), line.substring(i+3, e)]; - } - break; - case "[V:": - if (e > 0) { - abc_parse_key_voice.parseVoice(line, i+3, e); - //startNewLine(); - return [ e-i+1+ws, line.charAt(i+1), line.substring(i+3, e)]; - } - break; - // TODO: complain about unhandled header - } - } - return [ 0 ]; - }; - - this.letter_to_body_header = function(line, i) - { - if (line.length >= i+3) { - switch(line.substring(i, i+2)) - { - case "I:": - var err = abc_parse_directive.addDirective(line.substring(i+2)); - if (err) warn(err, line, i); - return [ line.length ]; - case "M:": - var meter = this.setMeter(line.substring(i+2)); - if (tune.hasBeginMusic() && meter) - tune.appendStartingElement('meter', multilineVars.iChar + i, multilineVars.iChar + line.length, meter); - return [ line.length ]; - case "K:": - var result = abc_parse_key_voice.parseKey(line.substring(i+2)); - if (result.foundClef && tune.hasBeginMusic()) - tune.appendStartingElement('clef', multilineVars.iChar + i, multilineVars.iChar + line.length, multilineVars.clef); - if (result.foundKey && tune.hasBeginMusic()) - tune.appendStartingElement('key', multilineVars.iChar + i, multilineVars.iChar + line.length, abc_parse_key_voice.fixKey(multilineVars.clef, multilineVars.key)); - return [ line.length ]; - case "P:": - if (tune.hasBeginMusic()) - tune.appendElement('part', multilineVars.iChar + i, multilineVars.iChar + line.length, {title: line.substring(i+2)}); - return [ line.length ]; - case "L:": - this.setDefaultLength(line, i+2, line.length); - return [ line.length ]; - case "Q:": - var e = line.indexOf('\x12', i+2); - if (e === -1) e = line.length; - var tempo = this.setTempo(line, i+2, e); - if (tempo.type === 'delaySet') tune.appendElement('tempo', multilineVars.iChar + i, multilineVars.iChar + line.length, this.calcTempo(tempo.tempo)); - else if (tempo.type === 'immediate') tune.appendElement('tempo', multilineVars.iChar + i, multilineVars.iChar + line.length, tempo.tempo); - return [ e, line.charAt(i), abc_common.strip(line.substring(i+2))]; - case "V:": - abc_parse_key_voice.parseVoice(line, i+2, line.length); -// startNewLine(); - return [ line.length, line.charAt(i), abc_common.strip(line.substring(i+2))]; - // TODO: complain about unhandled header - } - } - return [ 0 ]; - }; - - var metaTextHeaders = { - A: 'author', - B: 'book', - C: 'composer', - D: 'discography', - F: 'url', - G: 'group', - I: 'instruction', - N: 'notes', - O: 'origin', - R: 'rhythm', - S: 'source', - W: 'unalignedWords', - Z: 'transcription' - }; - - this.parseHeader = function(line) { - if (abc_common.startsWith(line, '%%')) { - var err = abc_parse_directive.addDirective(line.substring(2)); - if (err) warn(err, line, 2); - return {}; - } - var i = line.indexOf('%'); - if (i >= 0) - line = line.substring(0, i); - line = line.replace(/\s+$/, ''); - - if (line.length === 0) - return {}; - - if (line.length >= 2) { - if (line.charAt(1) === ':') { - var nextLine = ""; - if (line.indexOf('\x12') >= 0 && line.charAt(0) !== 'w') { // w: is the only header field that can have a continuation. - nextLine = line.substring(line.indexOf('\x12')+1); - line = line.substring(0, line.indexOf('\x12')); //This handles a continuation mark on a header field - } - var field = metaTextHeaders[line.charAt(0)]; - if (field !== undefined) { - if (field === 'unalignedWords') - tune.addMetaTextArray(field, abc_parse_directive.parseFontChangeLine(tokenizer.translateString(tokenizer.stripComment(line.substring(2))))); - else - tune.addMetaText(field, tokenizer.translateString(tokenizer.stripComment(line.substring(2)))); - return {}; - } else { - var startChar = multilineVars.iChar; - var endChar = startChar + line.length; - switch(line.charAt(0)) - { - case 'H': - tune.addMetaText("history", tokenizer.translateString(tokenizer.stripComment(line.substring(2)))); - multilineVars.is_in_history = true; - break; - case 'K': - // since the key is the last thing that can happen in the header, we can resolve the tempo now - this.resolveTempo(); - var result = abc_parse_key_voice.parseKey(line.substring(2)); - if (!multilineVars.is_in_header && tune.hasBeginMusic()) { - if (result.foundClef) - tune.appendStartingElement('clef', startChar, endChar, multilineVars.clef); - if (result.foundKey) - tune.appendStartingElement('key', startChar, endChar, abc_parse_key_voice.fixKey(multilineVars.clef, multilineVars.key)); - } - multilineVars.is_in_header = false; // The first key signifies the end of the header. - break; - case 'L': - this.setDefaultLength(line, 2, line.length); - break; - case 'M': - multilineVars.origMeter = multilineVars.meter = this.setMeter(line.substring(2)); - break; - case 'P': - // TODO-PER: There is more to do with parts, but the writer doesn't care. - if (multilineVars.is_in_header) - tune.addMetaText("partOrder", tokenizer.translateString(tokenizer.stripComment(line.substring(2)))); - else - multilineVars.partForNextLine = { title: tokenizer.translateString(tokenizer.stripComment(line.substring(2))), startChar: startChar, endChar: endChar}; - break; - case 'Q': - var tempo = this.setTempo(line, 2, line.length); - if (tempo.type === 'delaySet') multilineVars.tempo = tempo.tempo; - else if (tempo.type === 'immediate') tune.metaText.tempo = tempo.tempo; - break; - case 'T': - this.setTitle(line.substring(2)); - break; - case 'U': - this.addUserDefinition(line, 2, line.length); - break; - case 'V': - abc_parse_key_voice.parseVoice(line, 2, line.length); - if (!multilineVars.is_in_header) - return {newline: true}; - break; - case 's': - return {symbols: true}; - case 'w': - return {words: true}; - case 'X': - break; - case 'E': - case 'm': - warn("Ignored header", line, 0); - break; - default: - // It wasn't a recognized header value, so parse it as music. - if (nextLine.length) - nextLine = "\x12" + nextLine; - //parseRegularMusicLine(line+nextLine); - //nextLine = ""; - return {regular: true, str: line+nextLine}; - } - } - if (nextLine.length > 0) - return {recurse: true, str: nextLine}; - return {}; - } - } - - // If we got this far, we have a regular line of mulsic - return {regular: true, str: line}; - }; -}; - -var abc_parse_header = ParseHeader; - -// abc_tokenizer.js: tokenizes an ABC Music Notation string to support abc_parse. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -// this is a series of functions that get a particular element out of the passed stream. -// the return is the number of characters consumed, so 0 means that the element wasn't found. -// also returned is the element found. This may be a different length because spaces may be consumed that aren't part of the string. -// The return structure for most calls is { len: num_chars_consumed, token: str } -var Tokenizer = function() { - this.skipWhiteSpace = function(str) { - for (var i = 0; i < str.length; i++) { - if (!this.isWhiteSpace(str.charAt(i))) - return i; - } - return str.length; // It must have been all white space - }; - var finished = function(str, i) { - return i >= str.length; - }; - this.eatWhiteSpace = function(line, index) { - for (var i = index; i < line.length; i++) { - if (!this.isWhiteSpace(line.charAt(i))) - return i-index; - } - return i-index; - }; - - // This just gets the basic pitch letter, ignoring leading spaces, and normalizing it to a capital - this.getKeyPitch = function(str) { - var i = this.skipWhiteSpace(str); - if (finished(str, i)) - return {len: 0}; - switch (str.charAt(i)) { - case 'A':return {len: i+1, token: 'A'}; - case 'B':return {len: i+1, token: 'B'}; - case 'C':return {len: i+1, token: 'C'}; - case 'D':return {len: i+1, token: 'D'}; - case 'E':return {len: i+1, token: 'E'}; - case 'F':return {len: i+1, token: 'F'}; - case 'G':return {len: i+1, token: 'G'}; -// case 'a':return {len: i+1, token: 'A'}; -// case 'b':return {len: i+1, token: 'B'}; -// case 'c':return {len: i+1, token: 'C'}; -// case 'd':return {len: i+1, token: 'D'}; -// case 'e':return {len: i+1, token: 'E'}; -// case 'f':return {len: i+1, token: 'F'}; -// case 'g':return {len: i+1, token: 'G'}; - } - return {len: 0}; - }; - - // This just gets the basic accidental, ignoring leading spaces, and only the ones that appear in a key - this.getSharpFlat = function(str) { - if (str === 'bass') - return {len: 0}; - switch (str.charAt(0)) { - case '#':return {len: 1, token: '#'}; - case 'b':return {len: 1, token: 'b'}; - } - return {len: 0}; - }; - - this.getMode = function(str) { - var skipAlpha = function(str, start) { - // This returns the index of the next non-alphabetic char, or the entire length of the string if not found. - while (start < str.length && ((str.charAt(start) >= 'a' && str.charAt(start) <= 'z') || (str.charAt(start) >= 'A' && str.charAt(start) <= 'Z'))) - start++; - return start; - }; - - var i = this.skipWhiteSpace(str); - if (finished(str, i)) - return {len: 0}; - var firstThree = str.substring(i,i+3).toLowerCase(); - if (firstThree.length > 1 && firstThree.charAt(1) === ' ' || firstThree.charAt(1) === '^' || firstThree.charAt(1) === '_' || firstThree.charAt(1) === '=') firstThree = firstThree.charAt(0); // This will handle the case of 'm' - switch (firstThree) { - case 'mix':return {len: skipAlpha(str, i), token: 'Mix'}; - case 'dor':return {len: skipAlpha(str, i), token: 'Dor'}; - case 'phr':return {len: skipAlpha(str, i), token: 'Phr'}; - case 'lyd':return {len: skipAlpha(str, i), token: 'Lyd'}; - case 'loc':return {len: skipAlpha(str, i), token: 'Loc'}; - case 'aeo':return {len: skipAlpha(str, i), token: 'm'}; - case 'maj':return {len: skipAlpha(str, i), token: ''}; - case 'ion':return {len: skipAlpha(str, i), token: ''}; - case 'min':return {len: skipAlpha(str, i), token: 'm'}; - case 'm':return {len: skipAlpha(str, i), token: 'm'}; - } - return {len: 0}; - }; - - this.getClef = function(str, bExplicitOnly) { - var strOrig = str; - var i = this.skipWhiteSpace(str); - if (finished(str, i)) - return {len: 0}; - // The word 'clef' is optional, but if it appears, a clef MUST appear - var needsClef = false; - var strClef = str.substring(i); - if (abc_common.startsWith(strClef, 'clef=')) { - needsClef = true; - strClef = strClef.substring(5); - i += 5; - } - if (strClef.length === 0 && needsClef) - return {len: i+5, warn: "No clef specified: " + strOrig}; - - var j = this.skipWhiteSpace(strClef); - if (finished(strClef, j)) - return {len: 0}; - if (j > 0) { - i += j; - strClef = strClef.substring(j); - } - var name = null; - if (abc_common.startsWith(strClef, 'treble')) - name = 'treble'; - else if (abc_common.startsWith(strClef, 'bass3')) - name = 'bass3'; - else if (abc_common.startsWith(strClef, 'bass')) - name = 'bass'; - else if (abc_common.startsWith(strClef, 'tenor')) - name = 'tenor'; - else if (abc_common.startsWith(strClef, 'alto2')) - name = 'alto2'; - else if (abc_common.startsWith(strClef, 'alto1')) - name = 'alto1'; - else if (abc_common.startsWith(strClef, 'alto')) - name = 'alto'; - else if (!bExplicitOnly && (needsClef && abc_common.startsWith(strClef, 'none'))) - name = 'none'; - else if (abc_common.startsWith(strClef, 'perc')) - name = 'perc'; - else if (!bExplicitOnly && (needsClef && abc_common.startsWith(strClef, 'C'))) - name = 'tenor'; - else if (!bExplicitOnly && (needsClef && abc_common.startsWith(strClef, 'F'))) - name = 'bass'; - else if (!bExplicitOnly && (needsClef && abc_common.startsWith(strClef, 'G'))) - name = 'treble'; - else - return {len: i+5, warn: "Unknown clef specified: " + strOrig}; - - strClef = strClef.substring(name.length); - j = this.isMatch(strClef, '+8'); - if (j > 0) - name += "+8"; - else { - j = this.isMatch(strClef, '-8'); - if (j > 0) - name += "-8"; - } - return {len: i+name.length, token: name, explicit: needsClef}; - }; - - // This returns one of the legal bar lines - // This is called alot and there is no obvious tokenable items, so this is broken apart. - this.getBarLine = function(line, i) { - switch (line.charAt(i)) { - case ']': - ++i; - switch (line.charAt(i)) { - case '|': return {len: 2, token: "bar_thick_thin"}; - case '[': - ++i; - if ((line.charAt(i) >= '1' && line.charAt(i) <= '9') || line.charAt(i) === '"') - return {len: 2, token: "bar_invisible"}; - return {len: 1, warn: "Unknown bar symbol"}; - default: - return {len: 1, token: "bar_invisible"}; - } - case ':': - ++i; - switch (line.charAt(i)) { - case ':': return {len: 2, token: "bar_dbl_repeat"}; - case '|': // :| - ++i; - switch (line.charAt(i)) { - case ']': // :|] - ++i; - switch (line.charAt(i)) { - case '|': // :|]| - ++i; - if (line.charAt(i) === ':') return {len: 5, token: "bar_dbl_repeat"}; - return {len: 3, token: "bar_right_repeat"}; - default: - return {len: 3, token: "bar_right_repeat"}; - } - case '|': // :|| - ++i; - if (line.charAt(i) === ':') return {len: 4, token: "bar_dbl_repeat"}; - return {len: 3, token: "bar_right_repeat"}; - default: - return {len: 2, token: "bar_right_repeat"}; - } - default: - return {len: 1, warn: "Unknown bar symbol"}; - } - case '[': // [ - ++i; - if (line.charAt(i) === '|') { // [| - ++i; - switch (line.charAt(i)) { - case ':': return {len: 3, token: "bar_left_repeat"}; - case ']': return {len: 3, token: "bar_invisible"}; - default: return {len: 2, token: "bar_thick_thin"}; - } - } else { - if ((line.charAt(i) >= '1' && line.charAt(i) <= '9') || line.charAt(i) === '"') - return {len: 1, token: "bar_invisible"}; - return {len: 0}; - } - case '|': // | - ++i; - switch (line.charAt(i)) { - case ']': return {len: 2, token: "bar_thin_thick"}; - case '|': // || - ++i; - if (line.charAt(i) === ':') return {len: 3, token: "bar_left_repeat"}; - return {len: 2, token: "bar_thin_thin"}; - case ':': // |: - var colons = 0; - while (line.charAt(i+colons) === ':') colons++; - return { len: 1+colons, token: "bar_left_repeat"}; - default: return {len: 1, token: "bar_thin"}; - } - } - return {len: 0}; - }; - - // this returns all the characters in the string that match one of the characters in the legalChars string - this.getTokenOf = function(str, legalChars) { - for (var i = 0; i < str.length; i++) { - if (legalChars.indexOf(str.charAt(i)) < 0) - return {len: i, token: str.substring(0, i)}; - } - return {len: i, token: str}; - }; - - this.getToken = function(str, start, end) { - // This returns the next set of chars that doesn't contain spaces - var i = start; - while (i < end && !this.isWhiteSpace(str.charAt(i))) - i++; - return str.substring(start, i); - }; - - // This just sees if the next token is the word passed in, with possible leading spaces - this.isMatch = function(str, match) { - var i = this.skipWhiteSpace(str); - if (finished(str, i)) - return 0; - if (abc_common.startsWith(str.substring(i), match)) - return i+match.length; - return 0; - }; - - this.getPitchFromTokens = function(tokens) { - var ret = { }; - var pitches = {A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11}; - ret.position = pitches[tokens[0].token]; - if (ret.position === undefined) - return { warn: "Pitch expected. Found: " + tokens[0].token }; - tokens.shift(); - while (tokens.length) { - switch (tokens[0].token) { - case ',': ret.position -= 7; tokens.shift(); break; - case '\'': ret.position += 7; tokens.shift(); break; - default: return ret; - } - } - return ret; - }; - - this.getKeyAccidentals2 = function(tokens) { - var accs; - // find and strip off all accidentals in the token list - while (tokens.length > 0) { - var acc; - if (tokens[0].token === '^') { - acc = 'sharp'; - tokens.shift(); - if (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc}; - switch (tokens[0].token) { - case '^': acc = 'dblsharp'; tokens.shift(); break; - case '/': acc = 'quartersharp'; tokens.shift(); break; - } - } else if (tokens[0].token === '=') { - acc = 'natural'; - tokens.shift(); - } else if (tokens[0].token === '_') { - acc = 'flat'; - tokens.shift(); - if (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc}; - switch (tokens[0].token) { - case '_': acc = 'dblflat'; tokens.shift(); break; - case '/': acc = 'quarterflat'; tokens.shift(); break; - } - } else { - // Not an accidental, we'll assume that a later parse will recognize it. - return { accs: accs }; - } - if (tokens.length === 0) return {accs: accs, warn: 'Expected note name after ' + acc}; - switch (tokens[0].token.charAt(0)) - { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - if (accs === undefined) - accs = []; - accs.push({ acc: acc, note: tokens[0].token.charAt(0) }); - if (tokens[0].token.length === 1) - tokens.shift(); - else - tokens[0].token = tokens[0].token.substring(1); - break; - default: - return {accs: accs, warn: 'Expected note name after ' + acc + ' Found: ' + tokens[0].token }; - } - } - return { accs: accs }; - }; - - // This gets an accidental marking for the key signature. It has the accidental then the pitch letter. - this.getKeyAccidental = function(str) { - var accTranslation = { - '^': 'sharp', - '^^': 'dblsharp', - '=': 'natural', - '_': 'flat', - '__': 'dblflat', - '_/': 'quarterflat', - '^/': 'quartersharp' - }; - var i = this.skipWhiteSpace(str); - if (finished(str, i)) - return {len: 0}; - var acc = null; - switch (str.charAt(i)) - { - case '^': - case '_': - case '=': - acc = str.charAt(i); - break; - default:return {len: 0}; - } - i++; - if (finished(str, i)) - return {len: 1, warn: 'Expected note name after accidental'}; - switch (str.charAt(i)) - { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - return {len: i+1, token: {acc: accTranslation[acc], note: str.charAt(i)}}; - case '^': - case '_': - case '/': - acc += str.charAt(i); - i++; - if (finished(str, i)) - return {len: 2, warn: 'Expected note name after accidental'}; - switch (str.charAt(i)) - { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - return {len: i+1, token: {acc: accTranslation[acc], note: str.charAt(i)}}; - default: - return {len: 2, warn: 'Expected note name after accidental'}; - } - break; - default: - return {len: 1, warn: 'Expected note name after accidental'}; - } - }; - - this.isWhiteSpace = function(ch) { - return ch === ' ' || ch === '\t' || ch === '\x12'; - }; - - this.getMeat = function(line, start, end) { - // This removes any comments starting with '%' and trims the ends of the string so that there are no leading or trailing spaces. - // it returns just the start and end characters that contain the meat. - var comment = line.indexOf('%', start); - if (comment >= 0 && comment < end) - end = comment; - while (start < end && (line.charAt(start) === ' ' || line.charAt(start) === '\t' || line.charAt(start) === '\x12')) - start++; - while (start < end && (line.charAt(end-1) === ' ' || line.charAt(end-1) === '\t' || line.charAt(end-1) === '\x12')) - end--; - return {start: start, end: end}; - }; - - var isLetter = function(ch) { - return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); - }; - - var isNumber = function(ch) { - return (ch >= '0' && ch <= '9'); - }; - - this.tokenize = function(line, start, end, alphaUntilWhiteSpace) { - // this returns all the tokens inside the passed string. A token is a punctuation mark, a string of digits, a string of letters. - // Quoted strings are one token. - // If there is a minus sign next to a number, then it is included in the number. - // If there is a period immediately after a number, with a number immediately following, then a float is returned. - // The type of token is returned: quote, alpha, number, punct - // If alphaUntilWhiteSpace is true, then the behavior of the alpha token changes. - - var ret = this.getMeat(line, start, end); - start = ret.start; - end = ret.end; - var tokens = []; - var i; - while (start < end) { - if (line.charAt(start) === '"') { - i = start+1; - while (i < end && line.charAt(i) !== '"') i++; - tokens.push({ type: 'quote', token: line.substring(start+1, i), start: start+1, end: i}); - i++; - } else if (isLetter(line.charAt(start))) { - i = start+1; - if (alphaUntilWhiteSpace) - while (i < end && !this.isWhiteSpace(line.charAt(i))) i++; - else - while (i < end && isLetter(line.charAt(i))) i++; - tokens.push({ type: 'alpha', token: line.substring(start, i), continueId: isNumber(line.charAt(i)), start: start, end: i}); - start = i + 1; - } else if (line.charAt(start) === '.' && isNumber(line.charAt(i+1))) { - i = start+1; - var int2 = null; - var float2 = null; - while (i < end && isNumber(line.charAt(i))) i++; - - float2 = parseFloat(line.substring(start, i)); - tokens.push({ type: 'number', token: line.substring(start, i), intt: int2, floatt: float2, continueId: isLetter(line.charAt(i)), start: start, end: i}); - start = i + 1; - } else if (isNumber(line.charAt(start)) || (line.charAt(start) === '-' && isNumber(line.charAt(i+1)))) { - i = start+1; - var intt = null; - var floatt = null; - while (i < end && isNumber(line.charAt(i))) i++; - if (line.charAt(i) === '.' && isNumber(line.charAt(i+1))) { - i++; - while (i < end && isNumber(line.charAt(i))) i++; - } else - intt = parseInt(line.substring(start, i)); - - floatt = parseFloat(line.substring(start, i)); - tokens.push({ type: 'number', token: line.substring(start, i), intt: intt, floatt: floatt, continueId: isLetter(line.charAt(i)), start: start, end: i}); - start = i + 1; - } else if (line.charAt(start) === ' ' || line.charAt(start) === '\t') { - i = start+1; - } else { - tokens.push({ type: 'punct', token: line.charAt(start), start: start, end: start+1}); - i = start+1; - } - start = i; - } - return tokens; - }; - - this.getVoiceToken = function(line, start, end) { - // This finds the next token. A token is delimited by a space or an equal sign. If it starts with a quote, then the portion between the quotes is returned. - var i = start; - while (i < end && this.isWhiteSpace(line.charAt(i)) || line.charAt(i) === '=') - i++; - - if (line.charAt(i) === '"') { - var close = line.indexOf('"', i+1); - if (close === -1 || close >= end) - return {len: 1, err: "Missing close quote"}; - return {len: close-start+1, token: this.translateString(line.substring(i+1, close))}; - } else { - var ii = i; - while (ii < end && !this.isWhiteSpace(line.charAt(ii)) && line.charAt(ii) !== '=') - ii++; - return {len: ii-start+1, token: line.substring(i, ii)}; - } - }; - - var charMap = { - "`a": 'à', "'a": "á", "^a": "â", "~a": "ã", "\"a": "ä", "oa": "å", "aa": "å", "=a": "ā", "ua": "ă", ";a": "ą", - "`e": 'è', "'e": "é", "^e": "ê", "\"e": "ë", "=e": "ē", "ue": "ĕ", ";e": "ę", ".e": "ė", - "`i": 'ì', "'i": "í", "^i": "î", "\"i": "ï", "=i": "ī", "ui": "ĭ", ";i": "į", - "`o": 'ò', "'o": "ó", "^o": "ô", "~o": "õ", "\"o": "ö", "=o": "ō", "uo": "ŏ", "/o": "ø", - "`u": 'ù', "'u": "ú", "^u": "û", "~u": "ũ", "\"u": "ü", "ou": "ů", "=u": "ū", "uu": "ŭ", ";u": "ų", - "`A": 'À', "'A": "Á", "^A": "Â", "~A": "Ã", "\"A": "Ä", "oA": "Å", "AA": "Å", "=A": "Ā", "uA": "Ă", ";A": "Ą", - "`E": 'È', "'E": "É", "^E": "Ê", "\"E": "Ë", "=E": "Ē", "uE": "Ĕ", ";E": "Ę", ".E": "Ė", - "`I": 'Ì', "'I": "Í", "^I": "Î", "~I": "Ĩ", "\"I": "Ï", "=I": "Ī", "uI": "Ĭ", ";I": "Į", ".I": "İ", - "`O": 'Ò', "'O": "Ó", "^O": "Ô", "~O": "Õ", "\"O": "Ö", "=O": "Ō", "uO": "Ŏ", "/O": "Ø", - "`U": 'Ù', "'U": "Ú", "^U": "Û", "~U": "Ũ", "\"U": "Ü", "oU": "Ů", "=U": "Ū", "uU": "Ŭ", ";U": "Ų", - "ae": "æ", "AE": "Æ", "oe": "œ", "OE": "Œ", "ss": "ß", - "'c": "ć", "^c": "ĉ", "uc": "č", "cc": "ç", ".c": "ċ", "cC": "Ç", "'C": "Ć", "^C": "Ĉ", "uC": "Č", ".C": "Ċ", - "~N": "Ñ", "~n": "ñ", - "=s": "š", "vs": "š", - "DH": "Ð", "dh": "ð", - "HO": "Ő", "Ho": "ő", "HU": "Ű", "Hu": "ű", - "'Y": "Ý", "'y": "ý", "^Y": "Ŷ", "^y": "ŷ", "\"Y": "Ÿ", "\"y": "ÿ", - "vS": "Š", "vZ": "Ž", "vz": 'ž' - -// More chars: IJ ij Ď ď Đ đ Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š Ţ ţ Ť ť Ŧ ŧ Ŵ ŵ Ź ź Ż ż Ž - }; - var charMap1 = { - "#": "♯", - "b": "♭", - "=": "♮" - }; - var charMap2 = { - "201": "♯", - "202": "♭", - "203": "♮", - "241": "¡", - "242": "¢", "252": "a", "262": "2", "272": "o", "302": "Â", "312": "Ê", "322": "Ò", "332": "Ú", "342": "â", "352": "ê", "362": "ò", "372": "ú", - "243": "£", "253": "«", "263": "3", "273": "»", "303": "Ã", "313": "Ë", "323": "Ó", "333": "Û", "343": "ã", "353": "ë", "363": "ó", "373": "û", - "244": "¤", "254": "¬", "264": " ́", "274": "1⁄4", "304": "Ä", "314": "Ì", "324": "Ô", "334": "Ü", "344": "ä", "354": "ì", "364": "ô", "374": "ü", - "245": "¥", "255": "-", "265": "μ", "275": "1⁄2", "305": "Å", "315": "Í", "325": "Õ", "335": "Ý", "345": "å", "355": "í", "365": "õ", "375": "ý", - "246": "¦", "256": "®", "266": "¶", "276": "3⁄4", "306": "Æ", "316": "Î", "326": "Ö", "336": "Þ", "346": "æ", "356": "î", "366": "ö", "376": "þ", - "247": "§", "257": " ̄", "267": "·", "277": "¿", "307": "Ç", "317": "Ï", "327": "×", "337": "ß", "347": "ç", "357": "ï", "367": "÷", "377": "ÿ", - "250": " ̈", "260": "°", "270": " ̧", "300": "À", "310": "È", "320": "Ð", "330": "Ø", "340": "à", "350": "è", "360": "ð", "370": "ø", - "251": "©", "261": "±", "271": "1", "301": "Á", "311": "É", "321": "Ñ", "331": "Ù", "341": "á", "351": "é", "361": "ñ", "371": "ù" }; - this.translateString = function(str) { - var arr = str.split('\\'); - if (arr.length === 1) return str; - var out = null; - abc_common.each(arr, function(s) { - if (out === null) - out = s; - else { - var c = charMap[s.substring(0, 2)]; - if (c !== undefined) - out += c + s.substring(2); - else { - c = charMap2[s.substring(0, 3)]; - if (c !== undefined) - out += c + s.substring(3); - else { - c = charMap1[s.substring(0, 1)]; - if (c !== undefined) - out += c + s.substring(1); - else - out += "\\" + s; - } - } - } - }); - return out; - }; - this.getNumber = function(line, index) { - var num = 0; - while (index < line.length) { - switch (line.charAt(index)) { - case '0':num = num*10;index++;break; - case '1':num = num*10+1;index++;break; - case '2':num = num*10+2;index++;break; - case '3':num = num*10+3;index++;break; - case '4':num = num*10+4;index++;break; - case '5':num = num*10+5;index++;break; - case '6':num = num*10+6;index++;break; - case '7':num = num*10+7;index++;break; - case '8':num = num*10+8;index++;break; - case '9':num = num*10+9;index++;break; - default: - return {num: num, index: index}; - } - } - return {num: num, index: index}; - }; - - this.getFraction = function(line, index) { - var num = 1; - var den = 1; - if (line.charAt(index) !== '/') { - var ret = this.getNumber(line, index); - num = ret.num; - index = ret.index; - } - if (line.charAt(index) === '/') { - index++; - if (line.charAt(index) === '/') { - var div = 0.5; - while (line.charAt(index++) === '/') - div = div /2; - return {value: num * div, index: index-1}; - } else { - var iSave = index; - var ret2 = this.getNumber(line, index); - if (ret2.num === 0 && iSave === index) // If we didn't use any characters, it is an implied 2 - ret2.num = 2; - if (ret2.num !== 0) - den = ret2.num; - index = ret2.index; - } - } - - return {value: num/den, index: index}; - }; - - this.theReverser = function(str) { - if (abc_common.endsWith(str, ", The")) - return "The " + str.substring(0, str.length-5); - if (abc_common.endsWith(str, ", A")) - return "A " + str.substring(0, str.length-3); - return str; - }; - - this.stripComment = function(str) { - var i = str.indexOf('%'); - if (i >= 0) - return abc_common.strip(str.substring(0, i)); - return abc_common.strip(str); - }; - - this.getInt = function(str) { - // This parses the beginning of the string for a number and returns { value: num, digits: num } - // If digits is 0, then the string didn't point to a number. - var x = parseInt(str); - if (isNaN(x)) - return {digits: 0}; - var s = "" + x; - var i = str.indexOf(s); // This is to account for leading spaces - return {value: x, digits: i+s.length}; - }; - - this.getFloat = function(str) { - // This parses the beginning of the string for a number and returns { value: num, digits: num } - // If digits is 0, then the string didn't point to a number. - var x = parseFloat(str); - if (isNaN(x)) - return {digits: 0}; - var s = "" + x; - var i = str.indexOf(s); // This is to account for leading spaces - return {value: x, digits: i+s.length}; - }; - - this.getMeasurement = function(tokens) { - if (tokens.length === 0) return { used: 0 }; - var used = 1; - var num = ''; - if (tokens[0].token === '-') { - tokens.shift(); - num = '-'; - used++; - } - else if (tokens[0].type !== 'number') return { used: 0 }; - num += tokens.shift().token; - if (tokens.length === 0) return { used: 1, value: parseInt(num) }; - var x = tokens.shift(); - if (x.token === '.') { - used++; - if (tokens.length === 0) return { used: used, value: parseInt(num) }; - if (tokens[0].type === 'number') { - x = tokens.shift(); - num = num + '.' + x.token; - used++; - if (tokens.length === 0) return { used: used, value: parseFloat(num) }; - } - x = tokens.shift(); - } - switch (x.token) { - case 'pt': return { used: used+1, value: parseFloat(num) }; - case 'cm': return { used: used+1, value: parseFloat(num)/2.54*72 }; - case 'in': return { used: used+1, value: parseFloat(num)*72 }; - default: tokens.unshift(x); return { used: used, value: parseFloat(num) }; - } - }; - var substInChord = function(str) - { - while ( str.indexOf("\\n") !== -1) - { - str = str.replace("\\n", "\n"); - } - return str; - }; - this.getBrackettedSubstring = function(line, i, maxErrorChars, _matchChar) - { - // This extracts the sub string by looking at the first character and searching for that - // character later in the line (or search for the optional _matchChar). - // For instance, if the first character is a quote it will look for - // the end quote. If the end of the line is reached, then only up to the default number - // of characters are returned, so that a missing end quote won't eat up the entire line. - // It returns the substring and the number of characters consumed. - // The number of characters consumed is normally two more than the size of the substring, - // but in the error case it might not be. - var matchChar = _matchChar || line.charAt(i); - var pos = i+1; - while ((pos < line.length) && (line.charAt(pos) !== matchChar)) - ++pos; - if (line.charAt(pos) === matchChar) - return [pos-i+1,substInChord(line.substring(i+1, pos)), true]; - else // we hit the end of line, so we'll just pick an arbitrary num of chars so the line doesn't disappear. - { - pos = i+maxErrorChars; - if (pos > line.length-1) - pos = line.length-1; - return [pos-i+1, substInChord(line.substring(i+1, pos)), false]; - } - }; -}; - -var abc_tokenizer = Tokenizer; - -// wrap_lines.js: does line wrap on an already parsed tune. -// Copyright (C) 2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -function wrapLines(tune, lineBreaks) { - if (!lineBreaks || tune.lines.length === 0) - return; - - // tune.lines contains nested arrays: there is an array of lines (that's the part this function rewrites), - // there is an array of staffs per line (for instance, piano will have 2, orchestra will have many) - // there is an array of voices per staff (for instance, 4-part harmony might have bass and tenor on a single staff) - // The measure numbers start at zero for each staff, but on the succeeding lines, the measure numbers are reset to the beginning of the line. - var newLines = []; - // keep track of our counters for each staff and voice - var startNewLine = []; - var currentLine = []; - var measureNumber = []; - var measureMarker = []; - var lastMeter = ''; - var voiceStart = {}; - var linesWithoutStaff = 0; - - for (var i = 0; i < tune.lines.length; i++) { - var line = tune.lines[i]; - if (line.staff) { - var staffs = line.staff; - for (var j = 0; j < staffs.length; j++) { - if (startNewLine[j] === undefined) { - startNewLine[j] = []; - currentLine[j] = []; - measureNumber[j] = []; - measureMarker[j] = []; - } - var staff = staffs[j]; - var voices = staff.voices; - for (var k = 0; k < voices.length; k++) { - if (startNewLine[j][k] === undefined) { - startNewLine[j][k] = true; - currentLine[j][k] = 0; - measureNumber[j][k] = 0; - measureMarker[j][k] = 0; - } - if (linesWithoutStaff > 0) currentLine[j][k] += linesWithoutStaff; - var voice = voices[k]; - for (var e = 0; e < voice.length; e++) { - if (startNewLine[j][k]) { - if (!newLines[currentLine[j][k]]) - newLines[currentLine[j][k]] = { staff: [] }; - if (!newLines[currentLine[j][k]].staff[j]) { - newLines[currentLine[j][k]].staff[j] = {voices: []}; - for (var key in staff) { - if (staff.hasOwnProperty(key)) { - if (key === 'meter') { - if (newLines.length === 1 || lastMeter !== JSON.stringify(staff[key])) { - lastMeter = JSON.stringify(staff[key]); - newLines[currentLine[j][k]].staff[j][key] = staff[key]; - } - } else if (key !== 'voices') { - newLines[currentLine[j][k]].staff[j][key] = staff[key]; - } - } - } - } - if (measureMarker[j][k]) - newLines[currentLine[j][k]].staff[j].barNumber = measureMarker[j][k]; - startNewLine[j][k] = false; - } - var element = voice[e]; - if (!newLines[currentLine[j][k]].staff[j].voices[k]) { - newLines[currentLine[j][k]].staff[j].voices[k] = []; - for (var startItem in voiceStart) { - if (voiceStart.hasOwnProperty(startItem)) { - newLines[currentLine[j][k]].staff[j].voices[k].push(voiceStart[startItem]); - } - } - } - newLines[currentLine[j][k]].staff[j].voices[k].push(element); - if (element.el_type === 'stem') { - // This is a nice trick to just pay attention to the last setting of each type. - voiceStart[element.el_type] = element; - } - - if (element.el_type === 'bar') { - measureNumber[j][k]++; - if (lineBreaks[measureNumber[j][k]]) { - startNewLine[j][k] = true; - currentLine[j][k]++; - measureMarker[j][k] = element.barNumber; - delete element.barNumber; - } - } - } - - } - } - linesWithoutStaff = 0; - } else { - newLines.push(line); - linesWithoutStaff++; - } - } - tune.lines = newLines; -} - -function freeFormLineBreaks(widths, lineBreakPoint) { - var lineBreaks = []; - var totals = []; - var totalThisLine = 0; - // run through each measure and see if the accumulation is less than the ideal. - // if it passes the ideal, then see whether the last or this one is closer to the ideal. - for (var i = 0; i < widths.length; i++) { - var width = widths[i]; - var attemptedWidth = totalThisLine + width; - if (attemptedWidth < lineBreakPoint) - totalThisLine = attemptedWidth; - else { - // This just passed the ideal, so see whether the previous or the current number of measures is closer. - var oldDistance = lineBreakPoint - totalThisLine; - var newDistance = attemptedWidth - lineBreakPoint; - if (oldDistance < newDistance && totalThisLine > 0) { - lineBreaks.push(i - 1); - totals.push(Math.round(totalThisLine - width)); - totalThisLine = width; - } else { - if (i < widths.length-1) { - lineBreaks.push(i); - totals.push(Math.round(totalThisLine)); - totalThisLine = 0; - } - } - } - } - totals.push(Math.round(totalThisLine)); - return { lineBreaks: lineBreaks, totals: totals }; -} - -function clone(arr) { - var newArr = []; - for (var i = 0; i < arr.length; i++) - newArr.push(arr[i]); - return newArr; -} - -function oneTry(measureWidths, idealWidths, accumulator, lineAccumulator, lineWidths, lastVariance, highestVariance, currLine, lineBreaks, startIndex, otherTries) { - for (var i = startIndex; i < measureWidths.length; i++) { - var measureWidth = measureWidths[i]; - accumulator += measureWidth; - lineAccumulator += measureWidth; - var thisVariance = Math.abs(accumulator - idealWidths[currLine]); - var varianceIsClose = Math.abs(thisVariance - lastVariance) < idealWidths[0] / 10; // see if the difference is less than 10%, if so, run the test both ways. - if (varianceIsClose) { - if (thisVariance < lastVariance) { - // Also attempt one less measure on the current line - sometimes that works out better. - var newWidths = clone(lineWidths); - var newBreaks = clone(lineBreaks); - newBreaks.push(i-1); - newWidths.push(lineAccumulator - measureWidth); - otherTries.push({ - accumulator: accumulator, - lineAccumulator: measureWidth, - lineWidths: newWidths, - lastVariance: Math.abs(accumulator - idealWidths[currLine+1]), - highestVariance: Math.max(highestVariance, lastVariance), - currLine: currLine+1, - lineBreaks: newBreaks, - startIndex: i+1}); - } else if (thisVariance > lastVariance && i < measureWidths.length-1) { - // Also attempt one extra measure on this line. - newWidths = clone(lineWidths); - newBreaks = clone(lineBreaks); - // newBreaks[newBreaks.length-1] = i; - // newWidths[newWidths.length-1] = lineAccumulator; - otherTries.push({ - accumulator: accumulator, - lineAccumulator: lineAccumulator, - lineWidths: newWidths, - lastVariance: thisVariance, - highestVariance: Math.max(highestVariance, thisVariance), - currLine: currLine, - lineBreaks: newBreaks, - startIndex: i+1}); - } - } - if (thisVariance > lastVariance) { - lineBreaks.push(i - 1); - currLine++; - highestVariance = Math.max(highestVariance, lastVariance); - lastVariance = Math.abs(accumulator - idealWidths[currLine]); - lineWidths.push(lineAccumulator - measureWidth); - lineAccumulator = measureWidth; - } else { - lastVariance = thisVariance; - } - } - lineWidths.push(lineAccumulator); -} - -function optimizeLineWidths(widths, lineBreakPoint, lineBreaks, explanation) { - // figure out how many lines - That's one more than was tried before. - var numLines = Math.ceil(widths.total / lineBreakPoint) + 1; - - // get the ideal width for a line (cumulative width / num lines) - approx the same as lineBreakPoint except for rounding - var idealWidth = Math.floor(widths.total / numLines); - - // get each ideal line width (1*ideal, 2*ideal, 3*ideal, etc) - var idealWidths = []; - for (var i = 0; i < numLines; i++) - idealWidths.push(idealWidth*(i+1)); - - // from first measure, step through accum. Widths until the abs of the ideal is greater than the last one. - // This can sometimes look funny in edge cases, so when the length is within 10%, try one more or one less to see which is better. - // This is better than trying all the possibilities because that would get to be a huge number for even a medium size piece. - // This method seems to never generate more than about 16 tries and it is usually 4 or less. - var otherTries = []; - otherTries.push({ - accumulator: 0, - lineAccumulator: 0, - lineWidths: [], - lastVariance: 999999, - highestVariance: 0, - currLine: 0, - lineBreaks: [], // These are the zero-based last measure on each line - startIndex: 0}); - var index = 0; - while (index < otherTries.length) { - oneTry(widths.measureWidths, - idealWidths, - otherTries[index].accumulator, - otherTries[index].lineAccumulator, - otherTries[index].lineWidths, - otherTries[index].lastVariance, - otherTries[index].highestVariance, - otherTries[index].currLine, - otherTries[index].lineBreaks, - otherTries[index].startIndex, - otherTries); - index++; - } - for (i = 0; i < otherTries.length; i++) { - var otherTry = otherTries[i]; - otherTry.variances = []; - otherTry.aveVariance = 0; - for (var j = 0; j < otherTry.lineWidths.length; j++) { - var lineWidth = otherTry.lineWidths[j]; - otherTry.variances.push(lineWidth - idealWidths[0]); - otherTry.aveVariance += Math.abs(lineWidth - idealWidths[0]); - } - otherTry.aveVariance = otherTry.aveVariance / otherTry.lineWidths.length; - explanation.attempts.push({ type: "optimizeLineWidths", lineBreaks: otherTry.lineBreaks, variances: otherTry.variances, aveVariance: otherTry.aveVariance, widths: widths.measureWidths }); - } - var smallest = 9999999; - var smallestIndex = -1; - for (i = 0; i < otherTries.length; i++) { - otherTry = otherTries[i]; - if (otherTry.aveVariance < smallest) { - smallest = otherTry.aveVariance; - smallestIndex = i; - } - } - return { failed: false, lineBreaks: otherTries[smallestIndex].lineBreaks, variance: otherTries[smallestIndex].highestVariance }; -} -// // Instead of having to try all the different combinations to find the best, we start with an important piece of knowledge about the lineBreaks we are given: -// // If there is a line too short, it is the last one. -// // So, let's just do a couple of tweaks to see how it works to add one or two measures to the last line. -// var avg = widths.total / (lineBreaks.length + 1); -// var variance = getVariance(widths, lineBreaks); -// var variancePct = variance/lineBreakPoint*100; -// -// if (lineBreaks.length === 0) -// return { failed: true, reason: "Only one line." }; -// -// var lastLineStart = lineBreaks[lineBreaks.length-1]+1; -// var lastLineVariance = lineVariance(widths.measureWidths, lastLineStart, widths.measureWidths.length, avg); -// if (variance > lastLineVariance) -// return { failed: true, reason: "Last line is not too short." }; -// -// // Let's get a list of all combinations that have a possibility of working. That is, all combinations where no line has a variance larger than "variance". -// var lastLines = lastLinePossibilities(widths.measureWidths, lastLineStart, avg - variance, avg + variance); -// var attempts = getAttempts(widths.measureWidths, 0, lineBreaks.length, avg - variance, avg + variance, lastLines); -// //console.log(attempts, avg - variance, avg + variance); -// -// var failed = true; -// for (var i = 0; i < attempts.length; i++) { -// var newVariance = getVariance(widths, attempts[i]); -// if (newVariance < variance) { -// explanation.attempts.push({ -// type: "Optimize try", lineBreaks: attempts[i], -// variance: Math.round(variance), newVariance: Math.round(newVariance), -// totalAttempts: attempts.length -// }); -// variance = newVariance; -// lineBreaks = attempts[i]; -// failed = false; -// } -// } -// if (failed) { -// explanation.attempts.push({ type: "Optimize try", lineBreaks: lineBreaks, variance: variance, reason: "None of the " + attempts.length + " attempts were better." }); -// // TODO-PER: This shouldn't be necessary, but just try to move one measure down and see if it helps. -// if (lineBreaks.length > 0) { -// var attempt = [].concat(lineBreaks); -// attempt[attempt.length - 1]--; -// newVariance = getVariance(widths, attempt); -// explanation.attempts.push({ -// type: "Optimize last try", lineBreaks: attempts[i], -// variance: Math.round(variance), newVariance: Math.round(newVariance), -// totalAttempts: attempts.length -// }); -// if (newVariance < variance) { -// variance = newVariance; -// lineBreaks = attempt; -// failed = false; -// } -// } -// } -// // Let's squeeze the line successively until it spills onto an extra line, then take the option with the lowest variance -// // var targetNumLines = lineBreaks.length; -// // var newNumLines = targetNumLines; -// // var TRY_INCREMENT = 1; -// // var tryBreakPoint = lineBreakPoint - TRY_INCREMENT; -// // var failed = true; -// // while (targetNumLines === newNumLines && tryBreakPoint > 50) { -// // var ff = freeFormLineBreaks(widths.measureWidths, tryBreakPoint); -// // newNumLines = ff.lineBreaks.length; -// // if (newNumLines === targetNumLines) { -// // var newVariance = getVariance(widths, ff.lineBreaks); -// // var newVariancePct = newVariance/tryBreakPoint*100; -// // explanation.attempts.push({type: "Optimize try", tryBreakPoint: Math.round(tryBreakPoint), lineBreaks: ff.lineBreaks, totals: ff.totals, -// // variance: Math.round(variance), newVariance: Math.round(newVariance), variancePct: Math.round(variancePct), newVariancePct: Math.round(newVariancePct) -// // }); -// // if (newVariancePct < variancePct) { -// // variancePct = newVariancePct; -// // lineBreaks = ff.lineBreaks; -// // failed = false; -// // } -// // } else { -// // explanation.attempts.push({type: "Optimize try", explanation: "Exceeded number of lines." , tryBreakPoint: Math.round(tryBreakPoint), lineBreaks: ff.lineBreaks, totals: ff.totals, variance: variance, avg: avg, variancePct: variancePct}); -// // } -// // tryBreakPoint -= TRY_INCREMENT; -// // } -// -// return { failed: failed, lineBreaks: lineBreaks, variance: variance }; -// } - -// function fixedNumLinesBreaks(widths, numLines, allowOver, allowableVariance) { -// var idealLineBreak = widths.total / numLines; -// // If all the measures had the same amount of stuff, then the ave would be correct. -// // We will test all the combinations from one less to one more than the average. -// var averageMeasuresPerLine = Math.round(widths.measureWidths.length / numLines); -// var minMeasuresPerLine = Math.max(averageMeasuresPerLine - 1, 1); -// var maxMeasuresPerLine = averageMeasuresPerLine + 1; -// var tries = createLineTestArray(numLines, widths.measureWidths.length, maxMeasuresPerLine, minMeasuresPerLine); -// console.log("fixedNumLinesBreaks tests ("+minMeasuresPerLine+'-'+maxMeasuresPerLine+")", numLines, tries.length) -// -// // For each possible number of measures per line, see which has the closest spacing to the ideal. -// var bestCase = -1; -// var bestCaseVariance = 1000000; -// for (var i = 0 ; i < tries.length; i++) { -// var attempt = tries[i]; -// var variance = getVariance(attempt, idealLineBreak, widths.measureWidths, allowOver ? allowableVariance : 0); -// if (variance !== null) { -// if (variance < bestCaseVariance) { -// bestCaseVariance = variance; -// bestCase = i; -// } -// } -// } -// var failed = true; -// // For debugging, recreate the line widths -// var totals = []; -// if (bestCase >= 0) { -// failed = false; -// var index = 0; -// for (i = 0; i < tries[bestCase].length; i++) { -// var total = 0; -// for (var j = 0; j < tries[bestCase][i]; j++) { -// total += widths.measureWidths[index++]; -// } -// totals.push(Math.round(total)); -// } -// // We now have an array that contains the number of measures per line, but we want to return the absolute measure number to break on. -// if (tries[bestCase].length > 0) { -// tries[bestCase][0]--; // The results should contain the last measure number on the line, zero-based. -// for (i = 1; i < tries[bestCase].length; i++) -// tries[bestCase][i] += tries[bestCase][i - 1]; // This sets the zero-based measure number -// // The last line is implied and we don't need to return it -// tries[bestCase].pop(); -// } -// } -// return { failed: failed, lineBreaks: tries[bestCase], bestCaseVariance: Math.round(bestCaseVariance), totals: totals }; -// } - -function fixedMeasureLineBreaks(widths, lineBreakPoint, preferredMeasuresPerLine) { - var lineBreaks = []; - var totals = []; - var thisWidth = 0; - var failed = false; - for (var i = 0; i < widths.length; i++) { - thisWidth += widths[i]; - if (thisWidth > lineBreakPoint) { - failed = true; - } - if (i % preferredMeasuresPerLine === (preferredMeasuresPerLine-1)) { - if (i !== widths.length-1) // Don't bother putting a line break for the last line - it's already a break. - lineBreaks.push(i); - totals.push(Math.round(thisWidth)); - thisWidth = 0; - } - } - return { failed: failed, totals: totals, lineBreaks: lineBreaks }; -} - -function getRevisedTune(lineBreaks, staffWidth, abcString, params, Parse) { - var abcParser = new Parse(); - var revisedParams = { - lineBreaks: lineBreaks, - staffwidth: staffWidth - }; - for (var key in params) { - if (params.hasOwnProperty(key) && key !== 'wrap' && key !== 'staffwidth') { - revisedParams[key] = params[key]; - } - } - - abcParser.parse(abcString, revisedParams); - return { tune: abcParser.getTune(), revisedParams: revisedParams }; -} - -function calcLineWraps(tune, widths, abcString, params, Parse, engraver_controller) { - // For calculating how much can go on the line, it depends on the width of the line. It is a convenience to just divide it here - // by the minimum spacing instead of multiplying the min spacing later. - // The scaling works differently: this is done by changing the scaling of the outer SVG, so the scaling needs to be compensated - // for here, because the actual width will be different from the calculated numbers. - - // If the desired width is less than the margin, just punt and return the original tune - if (params.staffwidth < widths.left) { - return { - explanation: "Staffwidth is narrower than the margin", - tune: tune, - revisedParams: params - }; - } - var scale = params.scale ? Math.max(params.scale, 0.1) : 1; - var minSpacing = params.wrap.minSpacing ? Math.max(parseFloat(params.wrap.minSpacing), 1) : 1; - var minSpacingLimit = params.wrap.minSpacingLimit ? Math.max(parseFloat(params.wrap.minSpacingLimit), 1) : minSpacing - 0.1; - var maxSpacing = params.wrap.maxSpacing ? Math.max(parseFloat(params.wrap.maxSpacing), 1) : undefined; - if (params.wrap.lastLineLimit && !maxSpacing) - maxSpacing = Math.max(parseFloat(params.wrap.lastLineLimit), 1); - var targetHeight = params.wrap.targetHeight ? Math.max(parseInt(params.wrap.targetHeight, 10), 100) : undefined; - var preferredMeasuresPerLine = params.wrap.preferredMeasuresPerLine ? Math.max(parseInt(params.wrap.preferredMeasuresPerLine, 10), 1) : undefined; - - var lineBreakPoint = (params.staffwidth - widths.left) / minSpacing / scale; - var minLineSize = (params.staffwidth - widths.left) / maxSpacing / scale; - var allowableVariance = (params.staffwidth - widths.left) / minSpacingLimit / scale; - var explanation = { widths: widths, lineBreakPoint: lineBreakPoint, minLineSize: minLineSize, attempts: [], staffWidth: params.staffwidth, minWidth: Math.round(allowableVariance) }; - - // If there is a preferred number of measures per line, test that first. If none of the lines is too long, then we're finished. - var lineBreaks = null; - if (preferredMeasuresPerLine) { - var f = fixedMeasureLineBreaks(widths.measureWidths, lineBreakPoint, preferredMeasuresPerLine); - explanation.attempts.push({ type: "Fixed Measures Per Line", preferredMeasuresPerLine: preferredMeasuresPerLine, lineBreaks: f.lineBreaks, failed: f.failed, totals: f.totals }); - if (!f.failed) - lineBreaks = f.lineBreaks; - } - - // If we don't have lineBreaks yet, use the free form method of line breaks. - // This will be called either if Preferred Measures is not used, or if the music is just weird - like a single measure is way too crowded. - if (!lineBreaks) { - var ff = freeFormLineBreaks(widths.measureWidths, lineBreakPoint); - explanation.attempts.push({ type: "Free Form", lineBreaks: ff.lineBreaks, totals: ff.totals }); - lineBreaks = ff.lineBreaks; - - // We now have an acceptable number of lines, but the measures may not be optimally distributed. See if there is a better distribution. - ff = optimizeLineWidths(widths, lineBreakPoint, lineBreaks, explanation); - explanation.attempts.push({ type: "Optimize", failed: ff.failed, reason: ff.reason, lineBreaks: ff.lineBreaks, totals: ff.totals }); - if (!ff.failed) - lineBreaks = ff.lineBreaks; - } - - // If the vertical space exceeds targetHeight, remove a line and try again. If that is too crowded, then don't use it. - var staffWidth = params.staffwidth; - var ret = getRevisedTune(lineBreaks, staffWidth, abcString, params, Parse); - var newWidths = engraver_controller.getMeasureWidths(ret.tune); - var gotTune = true; // If we adjust the num lines, set this to false - explanation.attempts.push({type: "heightCheck", height: newWidths.height }); - - // if all of the lines are too sparse, make the width narrower. - // TODO-PER: implement this case. - - // If one line and the spacing is > maxSpacing, make the width narrower. - if (lineBreaks.length === 0 && minLineSize > widths.total) { - staffWidth = (widths.total * maxSpacing * scale) + widths.left; - explanation.attempts.push({type: "too sparse", newWidth: Math.round(staffWidth)}); - gotTune = false; - } - - // if (ret.lineBreaks.length === 0) { - // // Everything fits on one line, so see if there is TOO much space and the staff width needs to be shortened. - // if (minLineSize > 0 && ret.totalThisLine > 0 && ret.totalThisLine < minLineSize) - // staffWidth = staffWidth / (minLineSize / ret.totalThisLine); - // } else if (ret.totalThisLine < minLineSize) { - // // the last line is too short, so attempt to redistribute by changing the min. - // // We will try more and less space alternatively. The space can't be less than 1.0, and we'll try in 0.1 increments. - // var minTrys = []; - // if (minSpacing > 1.1) - // minTrys.push(minSpacing - 0.1); - // minTrys.push(minSpacing + 0.1); - // if (minSpacing > 1.2) - // minTrys.push(minSpacing - 0.2); - // minTrys.push(minSpacing + 0.2); - // if (minSpacing > 1.3) - // minTrys.push(minSpacing - 0.3); - // minTrys.push(minSpacing + 0.3); - // for (var i = 0; i < minTrys.length && ret.totalThisLine < minLineSize; i++) { - // lineBreakPoint = (params.staffwidth - widths.left) / minTrys[i] / scale; - // ret = calcLineBreaks(widths.measureWidths, lineBreakPoint); - // } - // } - - if (!gotTune) - ret = getRevisedTune(lineBreaks, staffWidth, abcString, params, Parse); - ret.explanation = explanation; - return ret; -} - -var wrap_lines = { wrapLines: wrapLines, calcLineWraps: calcLineWraps }; - -// abc_tune.js: a computer usable internal structure representing one tune. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - -/** - * This is the data for a single ABC tune. It is created and populated by the window.ABCJS.parse.Parse class. - * Also known as the ABCJS Abstract Syntax Tree - * @alternateClassName ABCJS.Tune - */ -var Tune = function() { - // The structure consists of a hash with the following two items: - // metaText: a hash of {key, value}, where key is one of: title, author, rhythm, source, transcription, unalignedWords, etc... - // tempo: { noteLength: number (e.g. .125), bpm: number } - // lines: an array of elements, or one of the following: - // - // STAFF: array of elements - // SUBTITLE: string - // - // TODO: actually, the start and end char should modify each part of the note type - // The elements all have a type field and a start and end char - // field. The rest of the fields depend on the type and are listed below: - // REST: duration=1,2,4,8; chord: string - // NOTE: accidental=none,dbl_flat,flat,natural,sharp,dbl_sharp - // pitch: "C" is 0. The numbers refer to the pitch letter. - // duration: .5 (sixteenth), .75 (dotted sixteenth), 1 (eighth), 1.5 (dotted eighth) - // 2 (quarter), 3 (dotted quarter), 4 (half), 6 (dotted half) 8 (whole) - // chord: { name:chord, position: one of 'default', 'above', 'below' } - // end_beam = true or undefined if this is the last note in a beam. - // lyric: array of { syllable: xxx, divider: one of " -_" } - // startTie = true|undefined - // endTie = true|undefined - // startTriplet = num <- that is the number to print - // endTriplet = true|undefined (the last note of the triplet) - // TODO: actually, decoration should be an array. - // decoration: upbow, downbow, accent - // BAR: type=bar_thin, bar_thin_thick, bar_thin_thin, bar_thick_thin, bar_right_repeat, bar_left_repeat, bar_double_repeat - // number: 1 or 2: if it is the start of a first or second ending - // CLEF: type=treble,bass - // KEY-SIG: - // accidentals[]: { acc:sharp|dblsharp|natural|flat|dblflat, note:a|b|c|d|e|f|g } - // METER: type: common_time,cut_time,specified - // if specified, { num: 99, den: 99 } - - this.getBeatLength = function() { - for (var i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff) { - for (var j = 0; j < this.lines[i].staff.length; j++) { - if (this.lines[i].staff[j].meter) { - var meter = this.lines[i].staff[j].meter; - if (meter.type === "specified") { - if (meter.value.length > 0) { - var num = parseInt(meter.value[0].num, 10); - var den = parseInt(meter.value[0].den, 10); - if (num === 3 && den === 8) return 3/8; - if (num === 6 && den === 8) return 3/8; - if (num === 6 && den === 4) return 3/4; - if (num === 9 && den === 8) return 3/8; - if (num === 12 && den === 8) return 3/8; - return 1/den; - } - else - return 1/4; // No meter was specified, so use this default - } else if (meter.type === 'cut_time') { - return 1/2; - } else { - return 1/4; // TODO-PER: this works for common time, but not for the ancient meters. - } - } - } - } - } - return 1/4; // No meter was specified, so use this default - }; - - this.getPickupLength = function() { - var pickupLength = 0; - var barLength = this.getBarLength(); - for (var i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff) { - for (var j = 0; j < this.lines[i].staff.length; j++) { - for (var v = 0; v < this.lines[i].staff[j].voices.length; v++) { - var voice = this.lines[i].staff[j].voices[v]; - var tripletMultiplier = 1; - for (var el = 0; el < voice.length; el++) { - var isSpacer = voice[el].rest && voice[el].rest.type === "spacer"; - if (voice[el].startTriplet) - tripletMultiplier = voice[el].tripletMultiplier; - if (voice[el].duration && !isSpacer) - pickupLength += voice[el].duration * tripletMultiplier; - if (voice[el].endTriplet) - tripletMultiplier = 1; - if (pickupLength >= barLength) - pickupLength -= barLength; - if (voice[el].el_type === 'bar') - return pickupLength; - } - } - } - } - } - return pickupLength; - }; - - this.getBarLength = function() { - var meter = this.getMeterFraction(); - return meter.num / meter.den; - }; - - this.millisecondsPerMeasure = function(bpmOverride) { - var bpm; - if (bpmOverride) { - bpm = bpmOverride; - } else { - var tempo = this.metaText ? this.metaText.tempo : null; - bpm = this.getBpm(tempo); - } - if (bpm <= 0) - bpm = 1; // I don't think this can happen, but we don't want a possibility of dividing by zero. - - var beatsPerMeasure = this.getBeatsPerMeasure(); - - var minutesPerMeasure = beatsPerMeasure / bpm; - return minutesPerMeasure * 60000; - }; - - this.getBeatsPerMeasure = function() { - var beatsPerMeasure; - var meter = this.getMeterFraction(); - if (meter.den === 8) { - beatsPerMeasure = meter.num / 3; - } else { - beatsPerMeasure = meter.num; - } - if (beatsPerMeasure <= 0) // This probably won't happen in any normal case - but it is possible that the meter could be set to something nonsensical. - beatsPerMeasure = 1; - return beatsPerMeasure; - }; - - this.reset = function () { - this.version = "1.0.1"; - this.media = "screen"; - this.metaText = {}; - this.formatting = {}; - this.lines = []; - this.staffNum = 0; - this.voiceNum = 0; - this.lineNum = 0; - }; - - this.resolveOverlays = function() { - var madeChanges = false; - for (var i = 0; i < this.lines.length; i++) { - var line = this.lines[i]; - if (line.staff) { - for (var j = 0; j < line.staff.length; j++) { - var staff = line.staff[j]; - var overlayVoice = []; - for (var k = 0; k < staff.voices.length; k++) { - var voice = staff.voices[k]; - overlayVoice.push({ hasOverlay: false, voice: [], snip: []}); - var durationThisBar = 0; - var inOverlay = false; - var snipStart = -1; - for (var kk = 0; kk < voice.length; kk++) { - var event = voice[kk]; - if (event.el_type === "overlay" && !inOverlay) { - madeChanges = true; - inOverlay = true; - snipStart = kk; - overlayVoice[k].hasOverlay = true; - } else if (event.el_type === "bar") { - if (inOverlay) { - // delete the overlay events from this array without messing up this loop. - inOverlay = false; - overlayVoice[k].snip.push({ start: snipStart, len: kk - snipStart}); - overlayVoice[k].voice.push(event); // Also end the overlay with the barline. - } else { - // This keeps the voices lined up: if the overlay isn't in the first measure then we need a bunch of invisible rests. - if (durationThisBar > 0) - overlayVoice[k].voice.push({ el_type: "note", duration: durationThisBar, rest: {type: "invisible"}, startChar: event.startChar, endChar: event.endChar }); - overlayVoice[k].voice.push(event); - } - durationThisBar = 0; - } else if (event.el_type === "note") { - if (inOverlay) { - overlayVoice[k].voice.push(event); - } else { - durationThisBar += event.duration; - } - } else if (event.el_type === "scale" || event.el_type === "stem" || event.el_type === "overlay" || event.el_type === "style" || event.el_type === "transpose") { - // These types of events are duplicated on the overlay layer. - overlayVoice[k].voice.push(event); - } - } - if (overlayVoice[k].hasOverlay && overlayVoice[k].snip.length === 0) { - // there was no closing bar, so we didn't set the snip amount. - overlayVoice[k].snip.push({ start: snipStart, len: voice.length - snipStart}); - } - } - for (k = 0; k < overlayVoice.length; k++) { - var ov = overlayVoice[k]; - if (ov.hasOverlay) { - staff.voices.push(ov.voice); - for (var kkk = ov.snip.length-1; kkk >= 0; kkk--) { - var snip = ov.snip[kkk]; - staff.voices[k].splice(snip.start, snip.len); - } - // remove ending marks from the overlay voice so they are not repeated - for (kkk = 0; kkk < staff.voices[staff.voices.length-1].length; kkk++) { - staff.voices[staff.voices.length-1][kkk] = abc_common.clone(staff.voices[staff.voices.length-1][kkk]); - var el = staff.voices[staff.voices.length-1][kkk]; - if (el.el_type === 'bar' && el.startEnding) { - delete el.startEnding; - } - if (el.el_type === 'bar' && el.endEnding) - delete el.endEnding; - } - } - } - } - } - } - return madeChanges; - }; - - function fixTitles(lines) { - // We might have name and subname defined. We now know what line everything is on, so we can determine which to use. - var firstMusicLine = true; - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - if (line.staff) { - for (var j = 0; j < line.staff.length; j++) { - var staff = line.staff[j]; - if (staff.title) { - var hasATitle = false; - for (var k = 0; k < staff.title.length; k++) { - if (staff.title[k]) { - staff.title[k] = (firstMusicLine) ? staff.title[k].name : staff.title[k].subname; - if (staff.title[k]) - hasATitle = true; - else - staff.title[k] = ''; - } else - staff.title[k] = ''; - } - if (!hasATitle) - delete staff.title; - } - } - firstMusicLine = false; - } - } - } - - this.cleanUp = function(defWidth, defLength, barsperstaff, staffnonote, currSlur) { - this.closeLine(); // Close the last line. - - // If the tempo was created with a string like "Allegro", then the duration of a beat needs to be set at the last moment, when it is most likely known. - if (this.metaText.tempo && this.metaText.tempo.bpm && !this.metaText.tempo.duration) - this.metaText.tempo.duration = [ this.getBeatLength() ]; - - // Remove any blank lines - var anyDeleted = false; - var i, s, v; - for (i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff !== undefined) { - var hasAny = false; - for (s = 0; s < this.lines[i].staff.length; s++) { - if (this.lines[i].staff[s] === undefined) { - anyDeleted = true; - this.lines[i].staff[s] = null; - //this.lines[i].staff[s] = { voices: []}; // TODO-PER: There was a part missing in the abc music. How should we recover? - } else { - for (v = 0; v < this.lines[i].staff[s].voices.length; v++) { - if (this.lines[i].staff[s].voices[v] === undefined) - this.lines[i].staff[s].voices[v] = []; // TODO-PER: There was a part missing in the abc music. How should we recover? - else - if (this.containsNotes(this.lines[i].staff[s].voices[v])) hasAny = true; - } - } - } - if (!hasAny) { - this.lines[i] = null; - anyDeleted = true; - } - } - } - if (anyDeleted) { - this.lines = abc_common.compact(this.lines); - abc_common.each(this.lines, function(line) { - if (line.staff) - line.staff = abc_common.compact(line.staff); - }); - } - - // if we exceeded the number of bars allowed on a line, then force a new line - if (barsperstaff) { - while (wrapMusicLines(this.lines, barsperstaff)) { - // This will keep wrapping until the end of the piece. - } - } - - // If we were passed staffnonote, then we want to get rid of all staffs that contain only rests. - if (staffnonote) { - anyDeleted = false; - for (i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff !== undefined) { - for (s = 0; s < this.lines[i].staff.length; s++) { - var keepThis = false; - for (v = 0; v < this.lines[i].staff[s].voices.length; v++) { - if (this.containsNotesStrict(this.lines[i].staff[s].voices[v])) { - keepThis = true; - } - } - if (!keepThis) { - anyDeleted = true; - this.lines[i].staff[s] = null; - } - } - } - } - if (anyDeleted) { - abc_common.each(this.lines, function(line) { - if (line.staff) - line.staff = abc_common.compact(line.staff); - }); - } - } - - fixTitles(this.lines); - - // Remove the temporary working variables - for (i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff) { - for (s = 0; s < this.lines[i].staff.length; s++) - delete this.lines[i].staff[s].workingClef; - } - } - - // If there are overlays, create new voices for them. - while (this.resolveOverlays()) { - // keep resolving overlays as long as any are found. - } - - function cleanUpSlursInLine(line) { - var x; -// var lyr = null; // TODO-PER: debugging. - - var addEndSlur = function(obj, num, chordPos) { - if (currSlur[chordPos] === undefined) { - // There isn't an exact match for note position, but we'll take any other open slur. - for (x = 0; x < currSlur.length; x++) { - if (currSlur[x] !== undefined) { - chordPos = x; - break; - } - } - if (currSlur[chordPos] === undefined) { - var offNum = chordPos*100+1; - abc_common.each(obj.endSlur, function(x) { if (offNum === x) --offNum; }); - currSlur[chordPos] = [offNum]; - } - } - var slurNum; - for (var i = 0; i < num; i++) { - slurNum = currSlur[chordPos].pop(); - obj.endSlur.push(slurNum); -// lyr.syllable += '<' + slurNum; // TODO-PER: debugging - } - if (currSlur[chordPos].length === 0) - delete currSlur[chordPos]; - return slurNum; - }; - - var addStartSlur = function(obj, num, chordPos, usedNums) { - obj.startSlur = []; - if (currSlur[chordPos] === undefined) { - currSlur[chordPos] = []; - } - var nextNum = chordPos*100+1; - for (var i = 0; i < num; i++) { - if (usedNums) { - abc_common.each(usedNums, function(x) { if (nextNum === x) ++nextNum; }); - abc_common.each(usedNums, function(x) { if (nextNum === x) ++nextNum; }); - abc_common.each(usedNums, function(x) { if (nextNum === x) ++nextNum; }); - } - abc_common.each(currSlur[chordPos], function(x) { if (nextNum === x) ++nextNum; }); - abc_common.each(currSlur[chordPos], function(x) { if (nextNum === x) ++nextNum; }); - - currSlur[chordPos].push(nextNum); - obj.startSlur.push({ label: nextNum }); -// lyr.syllable += ' ' + nextNum + '>'; // TODO-PER:debugging - nextNum++; - } - }; - - for (var i = 0; i < line.length; i++) { - var el = line[i]; -// if (el.lyric === undefined) // TODO-PER: debugging -// el.lyric = [{ divider: '-' }]; // TODO-PER: debugging -// lyr = el.lyric[0]; // TODO-PER: debugging -// lyr.syllable = ''; // TODO-PER: debugging - if (el.el_type === 'note') { - if (el.gracenotes) { - for (var g = 0; g < el.gracenotes.length; g++) { - if (el.gracenotes[g].endSlur) { - var gg = el.gracenotes[g].endSlur; - el.gracenotes[g].endSlur = []; - for (var ggg = 0; ggg < gg; ggg++) - addEndSlur(el.gracenotes[g], 1, 20); - } - if (el.gracenotes[g].startSlur) { - x = el.gracenotes[g].startSlur; - addStartSlur(el.gracenotes[g], x, 20); - } - } - } - if (el.endSlur) { - x = el.endSlur; - el.endSlur = []; - addEndSlur(el, x, 0); - } - if (el.startSlur) { - x = el.startSlur; - addStartSlur(el, x, 0); - } - if (el.pitches) { - var usedNums = []; - for (var p = 0; p < el.pitches.length; p++) { - if (el.pitches[p].endSlur) { - var k = el.pitches[p].endSlur; - el.pitches[p].endSlur = []; - for (var j = 0; j < k; j++) { - var slurNum = addEndSlur(el.pitches[p], 1, p+1); - usedNums.push(slurNum); - } - } - } - for (p = 0; p < el.pitches.length; p++) { - if (el.pitches[p].startSlur) { - x = el.pitches[p].startSlur; - addStartSlur(el.pitches[p], x, p+1, usedNums); - } - } - // Correct for the weird gracenote case where ({g}a) should match. - // The end slur was already assigned to the note, and needs to be moved to the first note of the graces. - if (el.gracenotes && el.pitches[0].endSlur && el.pitches[0].endSlur[0] === 100 && el.pitches[0].startSlur) { - if (el.gracenotes[0].endSlur) - el.gracenotes[0].endSlur.push(el.pitches[0].startSlur[0].label); - else - el.gracenotes[0].endSlur = [el.pitches[0].startSlur[0].label]; - if (el.pitches[0].endSlur.length === 1) - delete el.pitches[0].endSlur; - else if (el.pitches[0].endSlur[0] === 100) - el.pitches[0].endSlur.shift(); - else if (el.pitches[0].endSlur[el.pitches[0].endSlur.length-1] === 100) - el.pitches[0].endSlur.pop(); - if (currSlur[1].length === 1) - delete currSlur[1]; - else - currSlur[1].pop(); - } - } - } - } - } - - // TODO-PER: This could be done faster as we go instead of as the last step. - function fixClefPlacement(el) { - abc_parse_key_voice.fixClef(el); - //if (el.el_type === 'clef') { -// var min = -2; -// var max = 5; -// switch(el.type) { -// case 'treble+8': -// case 'treble-8': -// break; -// case 'bass': -// case 'bass+8': -// case 'bass-8': -// el.verticalPos = 20 + el.verticalPos; min += 6; max += 6; -// break; -// case 'tenor': -// case 'tenor+8': -// case 'tenor-8': -// el.verticalPos = - el.verticalPos; min = -40; max = 40; -//// el.verticalPos+=2; min += 6; max += 6; -// break; -// case 'alto': -// case 'alto+8': -// case 'alto-8': -// el.verticalPos = - el.verticalPos; min = -40; max = 40; -//// el.verticalPos-=2; min += 4; max += 4; -// break; -// } -// if (el.verticalPos < min) { -// while (el.verticalPos < min) -// el.verticalPos += 7; -// } else if (el.verticalPos > max) { -// while (el.verticalPos > max) -// el.verticalPos -= 7; -// } - //} - } - - function wrapMusicLines(lines, barsperstaff) { - for (i = 0; i < lines.length; i++) { - if (lines[i].staff !== undefined) { - for (s = 0; s < lines[i].staff.length; s++) { - var permanentItems = []; - for (v = 0; v < lines[i].staff[s].voices.length; v++) { - var voice = lines[i].staff[s].voices[v]; - var barNumThisLine = 0; - for (var n = 0; n < voice.length; n++) { - if (voice[n].el_type === 'bar') { - barNumThisLine++; - if (barNumThisLine >= barsperstaff) { - // push everything else to the next line, if there is anything else, - // and there is a next line. If there isn't a next line, create one. - if (n < voice.length - 1) { - var nextLine = getNextMusicLine(lines, i); - if (!nextLine) { - var cp = JSON.parse(JSON.stringify(lines[i])); - lines.push(abc_common.clone(cp)); - nextLine = lines[lines.length - 1]; - for (var ss = 0; ss < nextLine.staff.length; ss++) { - for (var vv = 0; vv < nextLine.staff[ss].voices.length; vv++) - nextLine.staff[ss].voices[vv] = []; - } - } - var startElement = n + 1; - var section = lines[i].staff[s].voices[v].slice(startElement); - lines[i].staff[s].voices[v] = lines[i].staff[s].voices[v].slice(0, startElement); - nextLine.staff[s].voices[v] = permanentItems.concat(section.concat(nextLine.staff[s].voices[v])); - return true; - } - } - } else if (!voice[n].duration) { - permanentItems.push(voice[n]); - } - } - } - } - } - } - return false; - } - - function getNextMusicLine(lines, currentLine) { - currentLine++; - while (lines.length > currentLine) { - if (lines[currentLine].staff) - return lines[currentLine]; - currentLine++; - } - return null; - } - - for (this.lineNum = 0; this.lineNum < this.lines.length; this.lineNum++) { - var staff = this.lines[this.lineNum].staff; - if (staff) { - for (this.staffNum = 0; this.staffNum < staff.length; this.staffNum++) { - if (staff[this.staffNum].clef) - fixClefPlacement(staff[this.staffNum].clef); - for (this.voiceNum = 0; this.voiceNum < staff[this.staffNum].voices.length; this.voiceNum++) { - var voice = staff[this.staffNum].voices[this.voiceNum]; - cleanUpSlursInLine(voice); - for (var j = 0; j < voice.length; j++) { - if (voice[j].el_type === 'clef') - fixClefPlacement(voice[j]); - } - if (voice.length > 0 && voice[voice.length-1].barNumber) { - // Don't hang a bar number on the last bar line: it should go on the next line. - var nextLine = getNextMusicLine(this.lines, this.lineNum); - if (nextLine) - nextLine.staff[0].barNumber = voice[voice.length-1].barNumber; - delete voice[voice.length-1].barNumber; - } - } - } - } - } - - if (!this.formatting.pagewidth) - this.formatting.pagewidth = defWidth; - if (!this.formatting.pageheight) - this.formatting.pageheight = defLength; - - // Remove temporary variables that the outside doesn't need to know about - delete this.staffNum; - delete this.voiceNum; - delete this.lineNum; - delete this.potentialStartBeam; - delete this.potentialEndBeam; - delete this.vskipPending; - - return currSlur; - }; - - this.reset(); - - this.getLastNote = function() { - if (this.lines[this.lineNum] && this.lines[this.lineNum].staff && this.lines[this.lineNum].staff[this.staffNum] && - this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum]) { - for (var i = this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum].length-1; i >= 0; i--) { - var el = this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum][i]; - if (el.el_type === 'note') { - return el; - } - } - } - return null; - }; - - this.addTieToLastNote = function() { - // TODO-PER: if this is a chord, which note? - var el = this.getLastNote(); - if (el && el.pitches && el.pitches.length > 0) { - el.pitches[0].startTie = {}; - return true; - } - return false; - }; - - this.getDuration = function(el) { - if (el.duration) return el.duration; - //if (el.pitches && el.pitches.length > 0) return el.pitches[0].duration; - return 0; - }; - - this.closeLine = function() { - if (this.potentialStartBeam && this.potentialEndBeam) { - this.potentialStartBeam.startBeam = true; - this.potentialEndBeam.endBeam = true; - } - delete this.potentialStartBeam; - delete this.potentialEndBeam; - }; - - this.appendElement = function(type, startChar, endChar, hashParams) - { - var This = this; - var pushNote = function(hp) { - var currStaff = This.lines[This.lineNum].staff[This.staffNum]; - if (!currStaff) { - // TODO-PER: This prevents a crash, but it drops the element. Need to figure out how to start a new line, or delay adding this. - return; - } - if (hp.pitches !== undefined) { - var mid = currStaff.workingClef.verticalPos; - abc_common.each(hp.pitches, function(p) { p.verticalPos = p.pitch - mid; }); - } - if (hp.gracenotes !== undefined) { - var mid2 = currStaff.workingClef.verticalPos; - abc_common.each(hp.gracenotes, function(p) { p.verticalPos = p.pitch - mid2; }); - } - currStaff.voices[This.voiceNum].push(hp); - }; - hashParams.el_type = type; - if (startChar !== null) - hashParams.startChar = startChar; - if (endChar !== null) - hashParams.endChar = endChar; - var endBeamHere = function() { - This.potentialStartBeam.startBeam = true; - hashParams.endBeam = true; - delete This.potentialStartBeam; - delete This.potentialEndBeam; - }; - var endBeamLast = function() { - if (This.potentialStartBeam !== undefined && This.potentialEndBeam !== undefined) { // Do we have a set of notes to beam? - This.potentialStartBeam.startBeam = true; - This.potentialEndBeam.endBeam = true; - } - delete This.potentialStartBeam; - delete This.potentialEndBeam; - }; - if (type === 'note') { // && (hashParams.rest !== undefined || hashParams.end_beam === undefined)) { - // Now, add the startBeam and endBeam where it is needed. - // end_beam is already set on the places where there is a forced end_beam. We'll remove that here after using that info. - // this.potentialStartBeam either points to null or the start beam. - // this.potentialEndBeam either points to null or the start beam. - // If we have a beam break (note is longer than a quarter, or an end_beam is on this element), then set the beam if we have one. - // reset the variables for the next notes. - var dur = This.getDuration(hashParams); - if (dur >= 0.25) { // The beam ends on the note before this. - endBeamLast(); - } else if (hashParams.force_end_beam_last && This.potentialStartBeam !== undefined) { - endBeamLast(); - } else if (hashParams.end_beam && This.potentialStartBeam !== undefined) { // the beam is forced to end on this note, probably because of a space in the ABC - if (hashParams.rest === undefined) - endBeamHere(); - else - endBeamLast(); - } else if (hashParams.rest === undefined) { // this a short note and we aren't about to end the beam - if (This.potentialStartBeam === undefined) { // We aren't collecting notes for a beam, so start here. - if (!hashParams.end_beam) { - This.potentialStartBeam = hashParams; - delete This.potentialEndBeam; - } - } else { - This.potentialEndBeam = hashParams; // Continue the beaming, look for the end next note. - } - } - - // end_beam goes on rests and notes which precede rests _except_ when a rest (or set of adjacent rests) has normal notes on both sides (no spaces) -// if (hashParams.rest !== undefined) -// { -// hashParams.end_beam = true; -// var el2 = this.getLastNote(); -// if (el2) el2.end_beam = true; -// // TODO-PER: implement exception mentioned in the comment. -// } - } else { // It's not a note, so there definitely isn't beaming after it. - endBeamLast(); - } - delete hashParams.end_beam; // We don't want this temporary variable hanging around. - delete hashParams.force_end_beam_last; // We don't want this temporary variable hanging around. - pushNote(hashParams); - }; - - this.appendStartingElement = function(type, startChar, endChar, hashParams2) - { - // If we're in the middle of beaming, then end the beam. - this.closeLine(); - - // We only ever want implied naturals the first time. - var impliedNaturals; - if (type === 'key') { - impliedNaturals = hashParams2.impliedNaturals; - delete hashParams2.impliedNaturals; - delete hashParams2.explicitAccidentals; - } - - // Clone the object because it will be sticking around for the next line and we don't want the extra fields in it. - var hashParams = abc_common.clone(hashParams2); - - if (this.lines[this.lineNum].staff) { // be sure that we are on a music type line before doing the following. - // If this is the first item in this staff, then we might have to initialize the staff, first. - if (this.lines[this.lineNum].staff.length <= this.staffNum) { - this.lines[this.lineNum].staff[this.staffNum] = {}; - this.lines[this.lineNum].staff[this.staffNum].clef = abc_common.clone(this.lines[this.lineNum].staff[0].clef); - this.lines[this.lineNum].staff[this.staffNum].key = abc_common.clone(this.lines[this.lineNum].staff[0].key); - if (this.lines[this.lineNum].staff[0].meter) - this.lines[this.lineNum].staff[this.staffNum].meter = abc_common.clone(this.lines[this.lineNum].staff[0].meter); - this.lines[this.lineNum].staff[this.staffNum].workingClef = abc_common.clone(this.lines[this.lineNum].staff[0].workingClef); - this.lines[this.lineNum].staff[this.staffNum].voices = [[]]; - } - // If this is a clef type, then we replace the working clef on the line. This is kept separate from - // the clef in case there is an inline clef field. We need to know what the current position for - // the note is. - if (type === 'clef') { - this.lines[this.lineNum].staff[this.staffNum].workingClef = hashParams; - } - - // These elements should not be added twice, so if the element exists on this line without a note or bar before it, just replace the staff version. - var voice = this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum]; - for (var i = 0; i < voice.length; i++) { - if (voice[i].el_type === 'note' || voice[i].el_type === 'bar') { - hashParams.el_type = type; - hashParams.startChar = startChar; - hashParams.endChar = endChar; - if (impliedNaturals) - hashParams.accidentals = impliedNaturals.concat(hashParams.accidentals); - voice.push(hashParams); - return; - } - if (voice[i].el_type === type) { - hashParams.el_type = type; - hashParams.startChar = startChar; - hashParams.endChar = endChar; - if (impliedNaturals) - hashParams.accidentals = impliedNaturals.concat(hashParams.accidentals); - voice[i] = hashParams; - return; - } - } - // We didn't see either that type or a note, so replace the element to the staff. - this.lines[this.lineNum].staff[this.staffNum][type] = hashParams2; - } - }; - - this.getNumLines = function() { - return this.lines.length; - }; - - this.pushLine = function(hash) { - if (this.vskipPending) { - hash.vskip = this.vskipPending; - delete this.vskipPending; - } - this.lines.push(hash); - }; - - this.addSubtitle = function(str) { - this.pushLine({subtitle: str}); - }; - - this.addSpacing = function(num) { - this.vskipPending = num; - }; - - this.addNewPage = function(num) { - this.pushLine({newpage: num}); - }; - - this.addSeparator = function(spaceAbove, spaceBelow, lineLength) { - this.pushLine({separator: {spaceAbove: spaceAbove, spaceBelow: spaceBelow, lineLength: lineLength}}); - }; - - this.addText = function(str) { - this.pushLine({text: str}); - }; - - this.addCentered = function(str) { - this.pushLine({text: [{text: str, center: true }]}); - }; - - this.containsNotes = function(voice) { - for (var i = 0; i < voice.length; i++) { - if (voice[i].el_type === 'note' || voice[i].el_type === 'bar') - return true; - } - return false; - }; - - this.containsNotesStrict = function(voice) { - for (var i = 0; i < voice.length; i++) { - if (voice[i].el_type === 'note' && voice[i].rest === undefined) - return true; - } - return false; - }; - -// anyVoiceContainsNotes: function(line) { -// for (var i = 0; i < line.staff.voices.length; i++) { -// if (this.containsNotes(line.staff.voices[i])) -// return true; -// } -// return false; -// }, - this.changeVoiceScale = function(scale) { - var This = this; - This.appendElement('scale', null, null, { size: scale} ); - }; - - this.startNewLine = function(params) { - // If the pointed to line doesn't exist, just create that. If the line does exist, but doesn't have any music on it, just use it. - // If it does exist and has music, then increment the line number. If the new element doesn't exist, create it. - var This = this; - this.closeLine(); // Close the previous line. - var createVoice = function(params) { - var thisStaff = This.lines[This.lineNum].staff[This.staffNum]; - thisStaff.voices[This.voiceNum] = []; - if (!thisStaff.title) - thisStaff.title = []; - thisStaff.title[This.voiceNum] = { name: params.name, subname: params.subname }; - if (params.style) - This.appendElement('style', null, null, {head: params.style}); - if (params.stem) - This.appendElement('stem', null, null, {direction: params.stem}); - else if (This.voiceNum > 0) { - if (thisStaff.voices[0]!== undefined) { - var found = false; - for (var i = 0; i < thisStaff.voices[0].length; i++) { - if (thisStaff.voices[0].el_type === 'stem') - found = true; - } - if (!found) { - var stem = { el_type: 'stem', direction: 'up' }; - thisStaff.voices[0].splice(0,0,stem); - } - } - This.appendElement('stem', null, null, {direction: 'down'}); - } - if (params.scale) - This.appendElement('scale', null, null, { size: params.scale} ); - }; - var createStaff = function(params) { - if (params.key && params.key.impliedNaturals) { - params.key.accidentals = params.key.accidentals.concat(params.key.impliedNaturals); - delete params.key.impliedNaturals; - } - - This.lines[This.lineNum].staff[This.staffNum] = {voices: [ ], clef: params.clef, key: params.key, workingClef: params.clef }; - if (params.stafflines !== undefined) { - This.lines[This.lineNum].staff[This.staffNum].clef.stafflines = params.stafflines; - This.lines[This.lineNum].staff[This.staffNum].workingClef.stafflines = params.stafflines; - } - if (params.staffscale) { - This.lines[This.lineNum].staff[This.staffNum].staffscale = params.staffscale; - } - if (params.tripletfont) This.lines[This.lineNum].staff[This.staffNum].tripletfont = params.tripletfont; - if (params.vocalfont) This.lines[This.lineNum].staff[This.staffNum].vocalfont = params.vocalfont; - if (params.bracket) This.lines[This.lineNum].staff[This.staffNum].bracket = params.bracket; - if (params.brace) This.lines[This.lineNum].staff[This.staffNum].brace = params.brace; - if (params.connectBarLines) This.lines[This.lineNum].staff[This.staffNum].connectBarLines = params.connectBarLines; - if (params.barNumber) This.lines[This.lineNum].staff[This.staffNum].barNumber = params.barNumber; - createVoice(params); - // Some stuff just happens for the first voice - if (params.part) - This.appendElement('part', params.part.startChar, params.part.endChar, {title: params.part.title}); - if (params.meter !== undefined) This.lines[This.lineNum].staff[This.staffNum].meter = params.meter; - }; - var createLine = function(params) { - This.lines[This.lineNum] = {staff: []}; - createStaff(params); - }; - if (this.lines[this.lineNum] === undefined) createLine(params); - else if (this.lines[this.lineNum].staff === undefined) { - this.lineNum++; - this.startNewLine(params); - } else if (this.lines[this.lineNum].staff[this.staffNum] === undefined) createStaff(params); - else if (this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum] === undefined) createVoice(params); - else if (!this.containsNotes(this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum])) return; - else { - this.lineNum++; - this.startNewLine(params); - } - }; - - this.setBarNumberImmediate = function(barNumber) { - // If this is called right at the beginning of a line, then correct the measure number that is already written. - // If this is called at the beginning of a measure, then correct the measure number that was just created. - // If this is called in the middle of a measure, then subtract one from it, because it will be incremented before applied. - var currentVoice = this.getCurrentVoice(); - if (currentVoice && currentVoice.length > 0) { - var lastElement = currentVoice[currentVoice.length-1]; - if (lastElement.el_type === 'bar') { - if (lastElement.barNumber !== undefined) // the measure number might not be written for this bar, don't override that. - lastElement.barNumber = barNumber; - } else - return barNumber-1; - } - return barNumber; - }; - - this.hasBeginMusic = function() { - // return true if there exists at least one line that contains "staff" - for (var i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff) - return true; - } - return false; - }; - - this.isFirstLine = function(index) { - for (var i = index-1; i >= 0; i--) { - if (this.lines[i].staff !== undefined) return false; - } - return true; - }; - - this.getMeter = function() { - for (var i = 0; i < this.lines.length; i++) { - var line = this.lines[i]; - if (line.staff) { - for (var j = 0; j < line.staff.length; j++) { - var meter = line.staff[j].meter; - if (meter) { - return meter; - } - } - } - } - return { type: "common_time" }; - }; - - this.getMeterFraction = function() { - var meter = this.getMeter(); - var num = 4; - var den = 4; - if (meter) { - if (meter.type === 'specified') { - num = parseInt(meter.value[0].num, 10); - den = parseInt(meter.value[0].den,10); - } else if (meter.type === 'cut_time') { - num = 2; - den = 2; - } else if (meter.type === 'common_time') { - num = 4; - den = 4; - } - } - this.meter = { num: num, den: den }; - return this.meter; // TODO-PER: is this saved value used anywhere? A get function shouldn't change state. - }; - - this.getKeySignature = function() { - for (var i = 0; i < this.lines.length; i++) { - var line = this.lines[i]; - if (line.staff) { - for (var j = 0; j < line.staff.length; j++) { - if (line.staff[j].key) - return line.staff[j].key; - } - } - } - return { }; - }; - - this.getCurrentVoice = function() { - if (this.lines[this.lineNum] !== undefined && this.lines[this.lineNum].staff[this.staffNum] !== undefined && this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum] !== undefined) - return this.lines[this.lineNum].staff[this.staffNum].voices[this.voiceNum]; - else return null; - }; - - this.setCurrentVoice = function(staffNum, voiceNum) { - this.staffNum = staffNum; - this.voiceNum = voiceNum; - for (var i = 0; i < this.lines.length; i++) { - if (this.lines[i].staff) { - if (this.lines[i].staff[staffNum] === undefined || this.lines[i].staff[staffNum].voices[voiceNum] === undefined || - !this.containsNotes(this.lines[i].staff[staffNum].voices[voiceNum] )) { - this.lineNum = i; - return; - } - } - } - this.lineNum = i; - }; - - this.addMetaText = function(key, value) { - if (this.metaText[key] === undefined) - this.metaText[key] = value; - else - this.metaText[key] += "\n" + value; - }; - - this.addMetaTextArray = function(key, value) { - if (this.metaText[key] === undefined) - this.metaText[key] = [value]; - else - this.metaText[key].push(value); - }; - this.addMetaTextObj = function(key, value) { - this.metaText[key] = value; - }; - - function addVerticalInfo(timingEvents) { - // Add vertical info to the bar events: put the next event's top, and the event after the next measure's top. - var lastBarTop; - var lastBarBottom; - var lastEventTop; - var lastEventBottom; - for (var e = timingEvents.length - 1; e >= 0; e--) { - var ev = timingEvents[e]; - if (ev.type === 'bar') { - ev.top = lastEventTop; - ev.nextTop = lastBarTop; - lastBarTop = lastEventTop; - - ev.bottom = lastEventBottom; - ev.nextBottom = lastBarBottom; - lastBarBottom = lastEventBottom; - } else if (ev.type === 'event') { - lastEventTop = ev.top; - lastEventBottom = ev.top + ev.height; - } - } - } - - function makeSortedArray(hash) { - var arr = []; - for (var k in hash) { - if (hash.hasOwnProperty(k)) - arr.push(hash[k]); - } - arr = arr.sort(function (a, b) { - var diff = a.milliseconds - b.milliseconds; - // if the events have the same time, make sure a bar comes before a note - if (diff !== 0) { - return diff; - } - else { - return a.type === "bar" ? -1 : 1; - } - }); - return arr; - } - - this.addElementToEvents = function(eventHash, element, voiceTimeMilliseconds, top, height, line, measureNumber, timeDivider, isTiedState, nextIsBar) { - if (element.hint) - return { isTiedState: undefined, duration: 0 }; - var realDuration = element.durationClass ? element.durationClass : element.duration; - if (element.abcelem.rest && element.abcelem.rest.type === "spacer") - realDuration = 0; - if (realDuration > 0) { - var es = []; - // If there is an invisible rest, then there are not elements, so don't push a null one. - for (var i = 0; i < element.elemset.length; i++) { - if (element.elemset[i] !== null) - es.push(element.elemset[i]); - } - var isTiedToNext = element.startTie; - if (isTiedState !== undefined) { - eventHash["event" + isTiedState].elements.push(es); // Add the tied note to the first note that it is tied to - if (nextIsBar) { - if (!eventHash["event" + voiceTimeMilliseconds]) { - eventHash["event" + voiceTimeMilliseconds] = { - type: "event", - milliseconds: voiceTimeMilliseconds, - line: line, - measureNumber: measureNumber, - top: top, - height: height, - left: null, - width: 0, - elements: [], - startChar: null, - endChar: null, - startCharArray: [], - endCharArray: [] - }; - } - eventHash["event" + voiceTimeMilliseconds].measureStart = true; - nextIsBar = false; - } - if (!isTiedToNext) - isTiedState = undefined; - } else { - // the last note wasn't tied. - if (!eventHash["event" + voiceTimeMilliseconds]) { - eventHash["event" + voiceTimeMilliseconds] = { - type: "event", - milliseconds: voiceTimeMilliseconds, - line: line, - measureNumber: measureNumber, - top: top, - height: height, - left: element.x, - width: element.w, - elements: [es], - startChar: element.abcelem.startChar, - endChar: element.abcelem.endChar, - startCharArray: [element.abcelem.startChar], - endCharArray: [element.abcelem.endChar], - midiPitches: element.abcelem.midiPitches ? abc_common.cloneArray(element.abcelem.midiPitches) : [] - }; - if (element.abcelem.midiGraceNotePitches) - eventHash["event" + voiceTimeMilliseconds].midiGraceNotePitches = abc_common.cloneArray(element.abcelem.midiGraceNotePitches); - } else { - // If there is more than one voice then two notes can fall at the same time. Usually they would be lined up in the same place, but if it is a whole rest, then it is placed funny. In any case, the left most element wins. - if (eventHash["event" + voiceTimeMilliseconds].left) - eventHash["event" + voiceTimeMilliseconds].left = Math.min(eventHash["event" + voiceTimeMilliseconds].left, element.x); - else - eventHash["event" + voiceTimeMilliseconds].left = element.x; - eventHash["event" + voiceTimeMilliseconds].elements.push(es); - eventHash["event" + voiceTimeMilliseconds].startCharArray.push(element.abcelem.startChar); - eventHash["event" + voiceTimeMilliseconds].endCharArray.push(element.abcelem.endChar); - if (eventHash["event" + voiceTimeMilliseconds].startChar === null) - eventHash["event" + voiceTimeMilliseconds].startChar =element.abcelem.startChar; - if (eventHash["event" + voiceTimeMilliseconds].endChar === null) - eventHash["event" + voiceTimeMilliseconds].endChar =element.abcelem.endChar; - if (element.abcelem.midiPitches && element.abcelem.midiPitches.length) { - if (!eventHash["event" + voiceTimeMilliseconds].midiPitches) - eventHash["event" + voiceTimeMilliseconds].midiPitches = []; - for (var i = 0; i < element.abcelem.midiPitches.length; i++) - eventHash["event" + voiceTimeMilliseconds].midiPitches.push(element.abcelem.midiPitches[i]); - } - if (element.abcelem.midiGraceNotePitches && element.abcelem.midiGraceNotePitches.length) { - if (!eventHash["event" + voiceTimeMilliseconds].midiGraceNotePitches) - eventHash["event" + voiceTimeMilliseconds].midiGraceNotePitches = []; - for (var j = 0; j < element.abcelem.midiGraceNotePitches.length; j++) - eventHash["event" + voiceTimeMilliseconds].midiGraceNotePitches.push(element.abcelem.midiGraceNotePitches[j]); - } - } - if (nextIsBar) { - eventHash["event" + voiceTimeMilliseconds].measureStart = true; - nextIsBar = false; - } - if (isTiedToNext) - isTiedState = voiceTimeMilliseconds; - } - } - return { isTiedState: isTiedState, duration: realDuration / timeDivider, nextIsBar: nextIsBar || element.type === 'bar' }; - }; - - this.makeVoicesArray = function() { - // First make a new array that is arranged by voice so that the repeats that span different lines are handled correctly. - var voicesArr = []; - for (var line = 0; line < this.engraver.staffgroups.length; line++) { - var group = this.engraver.staffgroups[line]; - var firstStaff = group.staffs[0]; - var middleC = firstStaff.absoluteY; - var top = middleC - firstStaff.top * abc_spacing.STEP; - var lastStaff = group.staffs[group.staffs.length - 1]; - middleC = lastStaff.absoluteY; - var bottom = middleC - lastStaff.bottom * abc_spacing.STEP; - var height = bottom - top; - - var voices = group.voices; - for (var v = 0; v < voices.length; v++) { - var measureNumber = 0; - var noteFound = false; - if (!voicesArr[v]) - voicesArr[v] = []; - var elements = voices[v].children; - for (var elem = 0; elem < elements.length; elem++) { - voicesArr[v].push({top: top, height: height, line: line, measureNumber: measureNumber, elem: elements[elem]}); - if (elements[elem].type === 'bar' && noteFound) // Count the measures by counting the bar lines, but skip a bar line that appears at the left of the music, before any notes. - measureNumber++; - if (elements[elem].type === 'note' || elements[elem].type === 'rest') - noteFound = true; - } - } - } - return voicesArr; - }; - - this.setupEvents = function(startingDelay, timeDivider, bpm) { - var timingEvents = []; - - var eventHash = {}; - // The time is the number of seconds from the beginning of the piece. - // The units we are scanning are in notation units (i.e. 0.25 is a quarter note) - var time = startingDelay; - var isTiedState; - var nextIsBar = true; - var voices = this.makeVoicesArray(); - for (var v = 0; v < voices.length; v++) { - var voiceTime = time; - var voiceTimeMilliseconds = Math.round(voiceTime * 1000); - var startingRepeatElem = 0; - var endingRepeatElem = -1; - var elements = voices[v]; - for (var elem = 0; elem < elements.length; elem++) { - var element = elements[elem].elem; - if (element.abcelem.el_type === "tempo") { - var bpm = this.getBpm(element.abcelem); - var beatLength = this.getBeatLength(); - var beatsPerSecond = bpm / 60; - timeDivider = beatLength * beatsPerSecond; - } - var ret = this.addElementToEvents(eventHash, element, voiceTimeMilliseconds, elements[elem].top, elements[elem].height, elements[elem].line, elements[elem].measureNumber, timeDivider, isTiedState, nextIsBar); - isTiedState = ret.isTiedState; - nextIsBar = ret.nextIsBar; - voiceTime += ret.duration; - voiceTimeMilliseconds = Math.round(voiceTime * 1000); - if (element.type === 'bar') { - var barType = element.abcelem.type; - var endRepeat = (barType === "bar_right_repeat" || barType === "bar_dbl_repeat"); - var startEnding = (element.abcelem.startEnding === '1'); - var startRepeat = (barType === "bar_left_repeat" || barType === "bar_dbl_repeat" || barType === "bar_right_repeat"); - if (endRepeat) { - if (endingRepeatElem === -1) - endingRepeatElem = elem; - for (var el2 = startingRepeatElem; el2 < endingRepeatElem; el2++) { - var element2 = elements[el2].elem; - ret = this.addElementToEvents(eventHash, element2, voiceTimeMilliseconds, elements[el2].top, elements[el2].height, elements[el2].line, elements[el2].measureNumber, timeDivider, isTiedState, nextIsBar); - isTiedState = ret.isTiedState; - nextIsBar = ret.nextIsBar; - voiceTime += ret.duration; - voiceTimeMilliseconds = Math.round(voiceTime * 1000); - } - nextIsBar = true; - endingRepeatElem = -1; - } - if (startEnding) - endingRepeatElem = elem; - if (startRepeat) - startingRepeatElem = elem; - } - } - } - // now we have all the events, but if there are multiple voices then there may be events out of order or duplicated, so normalize it. - timingEvents = makeSortedArray(eventHash); - addVerticalInfo(timingEvents); - timingEvents.push({ type: "end", milliseconds: voiceTimeMilliseconds }); - this.addUsefulCallbackInfo(timingEvents, bpm); - return timingEvents; - }; - - this.addUsefulCallbackInfo = function(timingEvents, bpm) { - var millisecondsPerMeasure = this.millisecondsPerMeasure(bpm); - for (var i = 0; i < timingEvents.length; i++) { - var ev = timingEvents[i]; - ev.millisecondsPerMeasure = millisecondsPerMeasure; - } - }; - - this.getBpm = function(tempo) { - var bpm; - if (tempo) { - bpm = tempo.bpm; - var beatLength = this.getBeatLength(); - var statedBeatLength = tempo.duration && tempo.duration.length > 0 ? tempo.duration[0] : beatLength; - bpm = bpm * statedBeatLength / beatLength; - } - if (!bpm) { - bpm = 180; - // Compensate for compound meter, where the beat isn't a beat. - var meter = this.getMeterFraction(); - if (meter && meter.den === 8) { - bpm = 120; - } - } - return bpm; - }; - - this.setTiming = function (bpm, measuresOfDelay) { - if (!bpm) { - var tempo = this.metaText ? this.metaText.tempo : null; - bpm = this.getBpm(tempo); - } - - var beatLength = this.getBeatLength(); - var beatsPerSecond = bpm / 60; - - var measureLength = this.getBarLength(); - - var startingDelay = measureLength / beatLength * measuresOfDelay / beatsPerSecond; - if (startingDelay) - startingDelay -= this.getPickupLength() / beatLength / beatsPerSecond; - var timeDivider = beatLength * beatsPerSecond; - - this.noteTimings = this.setupEvents(startingDelay, timeDivider, bpm); - }; -}; - -var abc_tune = Tune; - -// abc_parse.js: parses a string representing ABC Music Notation into a usable internal structure. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/*global window */ - - - - - - - - - - - -var Parse = function() { - var tune = new abc_tune(); - var tokenizer = new abc_tokenizer(); - - this.getTune = function() { - return { - formatting: tune.formatting, - lines: tune.lines, - media: tune.media, - metaText: tune.metaText, - version: tune.version, - - addElementToEvents: tune.addElementToEvents, - addUsefulCallbackInfo: tune.addUsefulCallbackInfo, - getBarLength: tune.getBarLength, - getBeatLength: tune.getBeatLength, - getBeatsPerMeasure: tune.getBeatsPerMeasure, - getBpm: tune.getBpm, - getMeter: tune.getMeter, - getMeterFraction: tune.getMeterFraction, - getPickupLength: tune.getPickupLength, - getKeySignature: tune.getKeySignature, - makeVoicesArray: tune.makeVoicesArray, - millisecondsPerMeasure: tune.millisecondsPerMeasure, - setupEvents: tune.setupEvents, - setTiming: tune.setTiming - }; - }; - - function addPositioning(el, type, value) { - if (!el.positioning) el.positioning = {}; - el.positioning[type] = value; - } - - function addFont(el, type, value) { - if (!el.fonts) el.fonts = {}; - el.fonts[type] = value; - } - - var multilineVars = { - reset: function() { - for (var property in this) { - if (this.hasOwnProperty(property) && typeof this[property] !== "function") { - delete this[property]; - } - } - this.iChar = 0; - this.key = {accidentals: [], root: 'none', acc: '', mode: '' }; - this.meter = null; // if no meter is specified, free meter is assumed - this.origMeter = null; // this is for new voices that are created after we set the meter. - this.hasMainTitle = false; - this.default_length = 0.125; - this.clef = { type: 'treble', verticalPos: 0 }; - this.next_note_duration = 0; - this.start_new_line = true; - this.is_in_header = true; - this.is_in_history = false; - this.partForNextLine = {}; - this.havent_set_length = true; - this.voices = {}; - this.staves = []; - this.macros = {}; - this.currBarNumber = 1; - this.barCounter = {}; - this.inTextBlock = false; - this.inPsBlock = false; - this.ignoredDecorations = []; - this.textBlock = ""; - this.score_is_present = false; // Can't have original V: lines when there is the score directive - this.inEnding = false; - this.inTie = []; - this.inTieChord = {}; - this.vocalPosition = "auto"; - this.dynamicPosition = "auto"; - this.chordPosition = "auto"; - this.ornamentPosition = "auto"; - this.volumePosition = "auto"; - this.openSlurs = []; - this.freegchord = false; - }, - differentFont: function(type, defaultFonts) { - if (this[type].decoration !== defaultFonts[type].decoration) return true; - if (this[type].face !== defaultFonts[type].face) return true; - if (this[type].size !== defaultFonts[type].size) return true; - if (this[type].style !== defaultFonts[type].style) return true; - if (this[type].weight !== defaultFonts[type].weight) return true; - return false; - }, - addFormattingOptions: function(el, defaultFonts, elType) { - if (elType === 'note') { - if (this.vocalPosition !== 'auto') addPositioning(el, 'vocalPosition', this.vocalPosition); - if (this.dynamicPosition !== 'auto') addPositioning(el, 'dynamicPosition', this.dynamicPosition); - if (this.chordPosition !== 'auto') addPositioning(el, 'chordPosition', this.chordPosition); - if (this.ornamentPosition !== 'auto') addPositioning(el, 'ornamentPosition', this.ornamentPosition); - if (this.volumePosition !== 'auto') addPositioning(el, 'volumePosition', this.volumePosition); - if (this.differentFont("annotationfont", defaultFonts)) addFont(el, 'annotationfont', this.annotationfont); - if (this.differentFont("gchordfont", defaultFonts)) addFont(el, 'gchordfont', this.gchordfont); - if (this.differentFont("vocalfont", defaultFonts)) addFont(el, 'vocalfont', this.vocalfont); - if (this.differentFont("tripletfont", defaultFonts)) addFont(el, 'tripletfont', this.tripletfont); - } else if (elType === 'bar') { - if (this.dynamicPosition !== 'auto') addPositioning(el, 'dynamicPosition', this.dynamicPosition); - if (this.chordPosition !== 'auto') addPositioning(el, 'chordPosition', this.chordPosition); - if (this.ornamentPosition !== 'auto') addPositioning(el, 'ornamentPosition', this.ornamentPosition); - if (this.volumePosition !== 'auto') addPositioning(el, 'volumePosition', this.volumePosition); - if (this.differentFont("measurefont", defaultFonts)) addFont(el, 'measurefont', this.measurefont); - if (this.differentFont("repeatfont", defaultFonts)) addFont(el, 'repeatfont', this.repeatfont); - } - } - }; - - var addWarning = function(str) { - if (!multilineVars.warnings) - multilineVars.warnings = []; - multilineVars.warnings.push(str); - }; - - var addWarningObject = function(warningObject) { - if (!multilineVars.warningObjects) - multilineVars.warningObjects = []; - multilineVars.warningObjects.push(warningObject); - }; - - var encode = function(str) { - var ret = abc_common.gsub(str, '\x12', ' '); - ret = abc_common.gsub(ret, '&', '&'); - ret = abc_common.gsub(ret, '<', '<'); - return abc_common.gsub(ret, '>', '>'); - }; - - var warn = function(str, line, col_num) { - if (!line) line = " "; - var bad_char = line.charAt(col_num); - if (bad_char === ' ') - bad_char = "SPACE"; - var clean_line = encode(line.substring(0, col_num)) + - '' + bad_char + '' + - encode(line.substring(col_num+1)); - addWarning("Music Line:" + tune.getNumLines() + ":" + (col_num+1) + ': ' + str + ": " + clean_line); - addWarningObject({message:str, line:line, startChar: multilineVars.iChar + col_num, column: col_num}); - }; - var header = new abc_parse_header(tokenizer, warn, multilineVars, tune); - - this.getWarnings = function() { - return multilineVars.warnings; - }; - this.getWarningObjects = function() { - return multilineVars.warningObjects; - }; - - var letter_to_chord = function(line, i) - { - if (line.charAt(i) === '"') - { - var chord = tokenizer.getBrackettedSubstring(line, i, 5); - if (!chord[2]) - warn("Missing the closing quote while parsing the chord symbol", line , i); - // If it starts with ^, then the chord appears above. - // If it starts with _ then the chord appears below. - // (note that the 2.0 draft standard defines them as not chords, but annotations and also defines @.) - if (chord[0] > 0 && chord[1].length > 0 && chord[1].charAt(0) === '^') { - chord[1] = chord[1].substring(1); - chord[2] = 'above'; - } else if (chord[0] > 0 && chord[1].length > 0 && chord[1].charAt(0) === '_') { - chord[1] = chord[1].substring(1); - chord[2] = 'below'; - } else if (chord[0] > 0 && chord[1].length > 0 && chord[1].charAt(0) === '<') { - chord[1] = chord[1].substring(1); - chord[2] = 'left'; - } else if (chord[0] > 0 && chord[1].length > 0 && chord[1].charAt(0) === '>') { - chord[1] = chord[1].substring(1); - chord[2] = 'right'; - } else if (chord[0] > 0 && chord[1].length > 0 && chord[1].charAt(0) === '@') { - // @-15,5.7 - chord[1] = chord[1].substring(1); - var x = tokenizer.getFloat(chord[1]); - if (x.digits === 0) - warn("Missing first position in absolutely positioned annotation.", line , i); - chord[1] = chord[1].substring(x.digits); - if (chord[1][0] !== ',') - warn("Missing comma absolutely positioned annotation.", line , i); - chord[1] = chord[1].substring(1); - var y = tokenizer.getFloat(chord[1]); - if (y.digits === 0) - warn("Missing second position in absolutely positioned annotation.", line , i); - chord[1] = chord[1].substring(y.digits); - var ws = tokenizer.skipWhiteSpace(chord[1]); - chord[1] = chord[1].substring(ws); - chord[2] = null; - chord[3] = { x: x.value, y: y.value }; - } else { - if (multilineVars.freegchord !== true) { - chord[1] = chord[1].replace(/([ABCDEFG0-9])b/g, "$1♭"); - chord[1] = chord[1].replace(/([ABCDEFG0-9])#/g, "$1♯"); - } - chord[2] = 'default'; - chord[1] = abc_transpose.chordName(multilineVars, chord[1]); - } - return chord; - } - return [0, ""]; - }; - - var legalAccents = [ "trill", "lowermordent", "uppermordent", "mordent", "pralltriller", "accent", - "fermata", "invertedfermata", "tenuto", "0", "1", "2", "3", "4", "5", "+", "wedge", - "open", "thumb", "snap", "turn", "roll", "breath", "shortphrase", "mediumphrase", "longphrase", - "segno", "coda", "D.S.", "D.C.", "fine", - "slide", "^", "marcato", - "upbow", "downbow", "/", "//", "///", "////", "trem1", "trem2", "trem3", "trem4", - "turnx", "invertedturn", "invertedturnx", "trill(", "trill)", "arpeggio", "xstem", "mark", "umarcato", - "style=normal", "style=harmonic", "style=rhythm", "style=x" - ]; - var volumeDecorations = [ "p", "pp", "f", "ff", "mf", "mp", "ppp", "pppp", "fff", "ffff", "sfz" ]; - var dynamicDecorations = ["crescendo(", "crescendo)", "diminuendo(", "diminuendo)"]; - - var accentPseudonyms = [ ["<", "accent"], [">", "accent"], ["tr", "trill"], - ["plus", "+"], [ "emphasis", "accent"], - [ "^", "umarcato" ], [ "marcato", "umarcato" ] ]; - var accentDynamicPseudonyms = [ ["<(", "crescendo("], ["<)", "crescendo)"], - [">(", "diminuendo("], [">)", "diminuendo)"] ]; - var letter_to_accent = function(line, i) - { - var macro = multilineVars.macros[line.charAt(i)]; - - if (macro !== undefined) { - if (macro.charAt(0) === '!' || macro.charAt(0) === '+') - macro = macro.substring(1); - if (macro.charAt(macro.length-1) === '!' || macro.charAt(macro.length-1) === '+') - macro = macro.substring(0, macro.length-1); - if (abc_common.detect(legalAccents, function(acc) { - return (macro === acc); - })) - return [ 1, macro ]; - else if (abc_common.detect(volumeDecorations, function(acc) { - return (macro === acc); - })) { - if (multilineVars.volumePosition === 'hidden') - macro = ""; - return [1, macro]; - } else if (abc_common.detect(dynamicDecorations, function(acc) { - if (multilineVars.dynamicPosition === 'hidden') - macro = ""; - return (macro === acc); - })) { - return [1, macro]; - } else { - if (!abc_common.detect(multilineVars.ignoredDecorations, function(dec) { - return (macro === dec); - })) - warn("Unknown macro: " + macro, line, i); - return [1, '' ]; - } - } - switch (line.charAt(i)) - { - case '.':return [1, 'staccato']; - case 'u':return [1, 'upbow']; - case 'v':return [1, 'downbow']; - case '~':return [1, 'irishroll']; - case '!': - case '+': - var ret = tokenizer.getBrackettedSubstring(line, i, 5); - // Be sure that the accent is recognizable. - if (ret[1].length > 0 && (ret[1].charAt(0) === '^' || ret[1].charAt(0) ==='_')) - ret[1] = ret[1].substring(1); // TODO-PER: The test files have indicators forcing the ornament to the top or bottom, but that isn't in the standard. We'll just ignore them. - if (abc_common.detect(legalAccents, function(acc) { - return (ret[1] === acc); - })) - return ret; - if (abc_common.detect(volumeDecorations, function(acc) { - return (ret[1] === acc); - })) { - if (multilineVars.volumePosition === 'hidden' ) - ret[1] = ''; - return ret; - } - if (abc_common.detect(dynamicDecorations, function(acc) { - return (ret[1] === acc); - })) { - if (multilineVars.dynamicPosition === 'hidden' ) - ret[1] = ''; - return ret; - } - - if (abc_common.detect(accentPseudonyms, function(acc) { - if (ret[1] === acc[0]) { - ret[1] = acc[1]; - return true; - } else - return false; - })) - return ret; - - if (abc_common.detect(accentDynamicPseudonyms, function(acc) { - if (ret[1] === acc[0]) { - ret[1] = acc[1]; - return true; - } else - return false; - })) { - if (multilineVars.dynamicPosition === 'hidden' ) - ret[1] = ''; - return ret; - } - // We didn't find the accent in the list, so consume the space, but don't return an accent. - // Although it is possible that ! was used as a line break, so accept that. - if (line.charAt(i) === '!' && (ret[0] === 1 || line.charAt(i+ret[0]-1) !== '!')) - return [1, null ]; - warn("Unknown decoration: " + ret[1], line, i); - ret[1] = ""; - return ret; - case 'H':return [1, 'fermata']; - case 'J':return [1, 'slide']; - case 'L':return [1, 'accent']; - case 'M':return [1, 'mordent']; - case 'O':return [1, 'coda']; - case 'P':return [1, 'pralltriller']; - case 'R':return [1, 'roll']; - case 'S':return [1, 'segno']; - case 'T':return [1, 'trill']; - } - return [0, 0]; - }; - - var letter_to_spacer = function(line, i) - { - var start = i; - while (tokenizer.isWhiteSpace(line.charAt(i))) - i++; - return [ i-start ]; - }; - - // returns the class of the bar line - // the number of the repeat - // and the number of characters used up - // if 0 is returned, then the next element was not a bar line - var letter_to_bar = function(line, curr_pos) - { - var ret = tokenizer.getBarLine(line, curr_pos); - if (ret.len === 0) - return [0,""]; - if (ret.warn) { - warn(ret.warn, line, curr_pos); - return [ret.len,""]; - } - - // Now see if this is a repeated ending - // A repeated ending is all of the characters 1,2,3,4,5,6,7,8,9,0,-, and comma - // It can also optionally start with '[', which is ignored. - // Also, it can have white space before the '['. - for (var ws = 0; ws < line.length; ws++) - if (line.charAt(curr_pos + ret.len + ws) !== ' ') - break; - var orig_bar_len = ret.len; - if (line.charAt(curr_pos+ret.len+ws) === '[') { - ret.len += ws + 1; - } - - // It can also be a quoted string. It is unclear whether that construct requires '[', but it seems like it would. otherwise it would be confused with a regular chord. - if (line.charAt(curr_pos+ret.len) === '"' && line.charAt(curr_pos+ret.len-1) === '[') { - var ending = tokenizer.getBrackettedSubstring(line, curr_pos+ret.len, 5); - return [ret.len+ending[0], ret.token, ending[1]]; - } - var retRep = tokenizer.getTokenOf(line.substring(curr_pos+ret.len), "1234567890-,"); - if (retRep.len === 0 || retRep.token[0] === '-') - return [orig_bar_len, ret.token]; - - return [ret.len+retRep.len, ret.token, retRep.token]; - }; - - var tripletQ = { - 2: 3, - 3: 2, - 4: 3, - 5: 2, // TODO-PER: not handling 6/8 rhythm yet - 6: 2, - 7: 2, // TODO-PER: not handling 6/8 rhythm yet - 8: 3, - 9: 2 // TODO-PER: not handling 6/8 rhythm yet - }; - var letter_to_open_slurs_and_triplets = function(line, i) { - // consume spaces, and look for all the open parens. If there is a number after the open paren, - // that is a triplet. Otherwise that is a slur. Collect all the slurs and the first triplet. - var ret = {}; - var start = i; - while (line.charAt(i) === '(' || tokenizer.isWhiteSpace(line.charAt(i))) { - if (line.charAt(i) === '(') { - if (i+1 < line.length && (line.charAt(i+1) >= '2' && line.charAt(i+1) <= '9')) { - if (ret.triplet !== undefined) - warn("Can't nest triplets", line, i); - else { - ret.triplet = line.charAt(i+1) - '0'; - ret.tripletQ = tripletQ[ret.triplet]; - ret.num_notes = ret.triplet; - if (i+2 < line.length && line.charAt(i+2) === ':') { - // We are expecting "(p:q:r" or "(p:q" or "(p::r" - // That is: "put p notes into the time of q for the next r notes" - // if r is missing, then it is equal to p. - // if q is missing, it is determined from this table: - // (2 notes in the time of 3 - // (3 notes in the time of 2 - // (4 notes in the time of 3 - // (5 notes in the time of n | if time sig is (6/8, 9/8, 12/8), n=3, else n=2 - // (6 notes in the time of 2 - // (7 notes in the time of n - // (8 notes in the time of 3 - // (9 notes in the time of n - if (i+3 < line.length && line.charAt(i+3) === ':') { - // The second number, 'q', is not present. - if (i+4 < line.length && (line.charAt(i+4) >= '1' && line.charAt(i+4) <= '9')) { - ret.num_notes = line.charAt(i+4) - '0'; - i += 3; - } else - warn("expected number after the two colons after the triplet to mark the duration", line, i); - } else if (i+3 < line.length && (line.charAt(i+3) >= '1' && line.charAt(i+3) <= '9')) { - ret.tripletQ = line.charAt(i+3) - '0'; - if (i+4 < line.length && line.charAt(i+4) === ':') { - if (i+5 < line.length && (line.charAt(i+5) >= '1' && line.charAt(i+5) <= '9')) { - ret.num_notes = line.charAt(i+5) - '0'; - i += 4; - } - } else { - i += 2; - } - } else - warn("expected number after the triplet to mark the duration", line, i); - } - } - i++; - } - else { - if (ret.startSlur === undefined) - ret.startSlur = 1; - else - ret.startSlur++; - } - } - i++; - } - ret.consumed = i-start; - return ret; - }; - - var addWords = function(line, words) { - if (!line) { warn("Can't add words before the first line of music", line, 0); return; } - words = abc_common.strip(words); - if (words.charAt(words.length-1) !== '-') - words = words + ' '; // Just makes it easier to parse below, since every word has a divider after it. - var word_list = []; - // first make a list of words from the string we are passed. A word is divided on either a space or dash. - var last_divider = 0; - var replace = false; - var addWord = function(i) { - var word = abc_common.strip(words.substring(last_divider, i)); - last_divider = i+1; - if (word.length > 0) { - if (replace) - word = abc_common.gsub(word,'~', ' '); - var div = words.charAt(i); - if (div !== '_' && div !== '-') - div = ' '; - word_list.push({syllable: tokenizer.translateString(word), divider: div}); - replace = false; - return true; - } - return false; - }; - for (var i = 0; i < words.length; i++) { - switch (words.charAt(i)) { - case ' ': - case '\x12': - addWord(i); - break; - case '-': - if (!addWord(i) && word_list.length > 0) { - abc_common.last(word_list).divider = '-'; - word_list.push({skip: true, to: 'next'}); - } - break; - case '_': - addWord(i); - word_list.push({skip: true, to: 'slur'}); - break; - case '*': - addWord(i); - word_list.push({skip: true, to: 'next'}); - break; - case '|': - addWord(i); - word_list.push({skip: true, to: 'bar'}); - break; - case '~': - replace = true; - break; - } - } - - var inSlur = false; - abc_common.each(line, function(el) { - if (word_list.length !== 0) { - if (word_list[0].skip) { - switch (word_list[0].to) { - case 'next': if (el.el_type === 'note' && el.pitches !== null && !inSlur) word_list.shift(); break; - case 'slur': if (el.el_type === 'note' && el.pitches !== null) word_list.shift(); break; - case 'bar': if (el.el_type === 'bar') word_list.shift(); break; - } - if (el.el_type !== 'bar') { - if (el.lyric === undefined) - el.lyric = [{syllable: "", divider: " "}]; - else - el.lyric.push({syllable: "", divider: " "}); - } - } else { - if (el.el_type === 'note' && el.rest === undefined && !inSlur) { - var lyric = word_list.shift(); - if (lyric.syllable) - lyric.syllable = lyric.syllable.replace(/ +/g,'\xA0'); - if (el.lyric === undefined) - el.lyric = [ lyric ]; - else - el.lyric.push(lyric); - } - } - } - }); - }; - - var addSymbols = function(line, words) { - // TODO-PER: Currently copied from w: line. This needs to be read as symbols instead. - if (!line) { warn("Can't add symbols before the first line of music", line, 0); return; } - words = abc_common.strip(words); - if (words.charAt(words.length-1) !== '-') - words = words + ' '; // Just makes it easier to parse below, since every word has a divider after it. - var word_list = []; - // first make a list of words from the string we are passed. A word is divided on either a space or dash. - var last_divider = 0; - var replace = false; - var addWord = function(i) { - var word = abc_common.strip(words.substring(last_divider, i)); - last_divider = i+1; - if (word.length > 0) { - if (replace) - word = abc_common.gsub(word, '~', ' '); - var div = words.charAt(i); - if (div !== '_' && div !== '-') - div = ' '; - word_list.push({syllable: tokenizer.translateString(word), divider: div}); - replace = false; - return true; - } - return false; - }; - for (var i = 0; i < words.length; i++) { - switch (words.charAt(i)) { - case ' ': - case '\x12': - addWord(i); - break; - case '-': - if (!addWord(i) && word_list.length > 0) { - abc_common.last(word_list).divider = '-'; - word_list.push({skip: true, to: 'next'}); - } - break; - case '_': - addWord(i); - word_list.push({skip: true, to: 'slur'}); - break; - case '*': - addWord(i); - word_list.push({skip: true, to: 'next'}); - break; - case '|': - addWord(i); - word_list.push({skip: true, to: 'bar'}); - break; - case '~': - replace = true; - break; - } - } - - var inSlur = false; - abc_common.each(line, function(el) { - if (word_list.length !== 0) { - if (word_list[0].skip) { - switch (word_list[0].to) { - case 'next': if (el.el_type === 'note' && el.pitches !== null && !inSlur) word_list.shift(); break; - case 'slur': if (el.el_type === 'note' && el.pitches !== null) word_list.shift(); break; - case 'bar': if (el.el_type === 'bar') word_list.shift(); break; - } - } else { - if (el.el_type === 'note' && el.rest === undefined && !inSlur) { - var lyric = word_list.shift(); - if (el.lyric === undefined) - el.lyric = [ lyric ]; - else - el.lyric.push(lyric); - } - } - } - }); - }; - - var getBrokenRhythm = function(line, index) { - switch (line.charAt(index)) { - case '>': - if (index < line.length - 1 && line.charAt(index+1) === '>') // double >> - return [2, 1.75, 0.25]; - else - return [1, 1.5, 0.5]; - case '<': - if (index < line.length - 1 && line.charAt(index+1) === '<') // double << - return [2, 0.25, 1.75]; - else - return [1, 0.5, 1.5]; - } - return null; - }; - - // TODO-PER: make this a method in el. - var addEndBeam = function(el) { - if (el.duration !== undefined && el.duration < 0.25) - el.end_beam = true; - return el; - }; - - var pitches = {A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11}; - var rests = {x: 'invisible', y: 'spacer', z: 'rest', Z: 'multimeasure' }; - var getCoreNote = function(line, index, el, canHaveBrokenRhythm) { - //var el = { startChar: index }; - var isComplete = function(state) { - return (state === 'octave' || state === 'duration' || state === 'Zduration' || state === 'broken_rhythm' || state === 'end_slur'); - }; - var state = 'startSlur'; - var durationSetByPreviousNote = false; - while (1) { - switch(line.charAt(index)) { - case '(': - if (state === 'startSlur') { - if (el.startSlur === undefined) el.startSlur = 1; else el.startSlur++; - } else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case ')': - if (isComplete(state)) { - if (el.endSlur === undefined) el.endSlur = 1; else el.endSlur++; - } else return null; - break; - case '^': - if (state === 'startSlur') {el.accidental = 'sharp';state = 'sharp2';} - else if (state === 'sharp2') {el.accidental = 'dblsharp';state = 'pitch';} - else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case '_': - if (state === 'startSlur') {el.accidental = 'flat';state = 'flat2';} - else if (state === 'flat2') {el.accidental = 'dblflat';state = 'pitch';} - else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case '=': - if (state === 'startSlur') {el.accidental = 'natural';state = 'pitch';} - else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - if (state === 'startSlur' || state === 'sharp2' || state === 'flat2' || state === 'pitch') { - el.pitch = pitches[line.charAt(index)]; - abc_transpose.note(multilineVars, el); - state = 'octave'; - // At this point we have a valid note. The rest is optional. Set the duration in case we don't get one below - if (canHaveBrokenRhythm && multilineVars.next_note_duration !== 0) { - el.duration = multilineVars.default_length * multilineVars.next_note_duration; - multilineVars.next_note_duration = 0; - durationSetByPreviousNote = true; - } else - el.duration = multilineVars.default_length; - // If the clef is percussion, there is probably some translation of the pitch to a particular drum kit item. - if ((multilineVars.clef && multilineVars.clef.type === "perc") || - (multilineVars.currentVoice && multilineVars.currentVoice.clef === "perc")) { - var key = line.charAt(index); - if (el.accidental) { - var accMap = { 'dblflat': '__', 'flat': '_', 'natural': '=', 'sharp': '^', 'dblsharp': '^^'}; - key = accMap[el.accidental] + key; - } - if (tune.formatting && tune.formatting.midi && tune.formatting.midi.drummap) - el.midipitch = tune.formatting.midi.drummap[key]; - } - } else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case ',': - if (state === 'octave') {el.pitch -= 7;} - else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case '\'': - if (state === 'octave') {el.pitch += 7;} - else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case 'x': - case 'y': - case 'z': - case 'Z': - if (state === 'startSlur') { - el.rest = { type: rests[line.charAt(index)] }; - // There shouldn't be some of the properties that notes have. If some sneak in due to bad syntax in the abc file, - // just nix them here. - delete el.accidental; - delete el.startSlur; - delete el.startTie; - delete el.endSlur; - delete el.endTie; - delete el.end_beam; - delete el.grace_notes; - // At this point we have a valid note. The rest is optional. Set the duration in case we don't get one below - if (el.rest.type === 'multimeasure') { - el.duration = 1; - state = 'Zduration'; - } else { - if (canHaveBrokenRhythm && multilineVars.next_note_duration !== 0) { - el.duration = multilineVars.default_length * multilineVars.next_note_duration; - multilineVars.next_note_duration = 0; - durationSetByPreviousNote = true; - } else - el.duration = multilineVars.default_length; - state = 'duration'; - } - } else if (isComplete(state)) {el.endChar = index;return el;} - else return null; - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - case '/': - if (state === 'octave' || state === 'duration') { - var fraction = tokenizer.getFraction(line, index); - //if (!durationSetByPreviousNote) - el.duration = el.duration * fraction.value; - // TODO-PER: We can test the returned duration here and give a warning if it isn't the one expected. - el.endChar = fraction.index; - while (fraction.index < line.length && (tokenizer.isWhiteSpace(line.charAt(fraction.index)) || line.charAt(fraction.index) === '-')) { - if (line.charAt(fraction.index) === '-') - el.startTie = {}; - else - el = addEndBeam(el); - fraction.index++; - } - index = fraction.index-1; - state = 'broken_rhythm'; - } else if (state === 'sharp2') { - el.accidental = 'quartersharp';state = 'pitch'; - } else if (state === 'flat2') { - el.accidental = 'quarterflat';state = 'pitch'; - } else if (state === 'Zduration') { - var num = tokenizer.getNumber(line, index); - el.duration = num.num; - el.endChar = num.index; - return el; - } else return null; - break; - case '-': - if (state === 'startSlur') { - // This is the first character, so it must have been meant for the previous note. Correct that here. - tune.addTieToLastNote(); - el.endTie = true; - } else if (state === 'octave' || state === 'duration' || state === 'end_slur') { - el.startTie = {}; - if (!durationSetByPreviousNote && canHaveBrokenRhythm) - state = 'broken_rhythm'; - else { - // Peek ahead to the next character. If it is a space, then we have an end beam. - if (tokenizer.isWhiteSpace(line.charAt(index + 1))) - addEndBeam(el); - el.endChar = index+1; - return el; - } - } else if (state === 'broken_rhythm') {el.endChar = index;return el;} - else return null; - break; - case ' ': - case '\t': - if (isComplete(state)) { - el.end_beam = true; - // look ahead to see if there is a tie - do { - if (line.charAt(index) === '-') - el.startTie = {}; - index++; - } while (index < line.length && (tokenizer.isWhiteSpace(line.charAt(index)) || line.charAt(index) === '-')); - el.endChar = index; - if (!durationSetByPreviousNote && canHaveBrokenRhythm && (line.charAt(index) === '<' || line.charAt(index) === '>')) { // TODO-PER: Don't need the test for < and >, but that makes the endChar work out for the regression test. - index--; - state = 'broken_rhythm'; - } else - return el; - } - else return null; - break; - case '>': - case '<': - if (isComplete(state)) { - if (canHaveBrokenRhythm) { - var br2 = getBrokenRhythm(line, index); - index += br2[0] - 1; // index gets incremented below, so we'll let that happen - multilineVars.next_note_duration = br2[2]; - el.duration = br2[1]*el.duration; - state = 'end_slur'; - } else { - el.endChar = index; - return el; - } - } else - return null; - break; - default: - if (isComplete(state)) { - el.endChar = index; - return el; - } - return null; - } - index++; - if (index === line.length) { - if (isComplete(state)) {el.endChar = index;return el;} - else return null; - } - } - return null; - }; - - function startNewLine() { - var params = { startChar: -1, endChar: -1}; - if (multilineVars.partForNextLine.title) - params.part = multilineVars.partForNextLine; - params.clef = multilineVars.currentVoice && multilineVars.staves[multilineVars.currentVoice.staffNum].clef !== undefined ? abc_common.clone(multilineVars.staves[multilineVars.currentVoice.staffNum].clef) : abc_common.clone(multilineVars.clef); - var scoreTranspose = multilineVars.currentVoice ? multilineVars.currentVoice.scoreTranspose : 0; - params.key = abc_parse_key_voice.standardKey(multilineVars.key.root+multilineVars.key.acc+multilineVars.key.mode, multilineVars.key.root, multilineVars.key.acc, scoreTranspose); - params.key.mode = multilineVars.key.mode; - if (multilineVars.key.impliedNaturals) - params.key.impliedNaturals = multilineVars.key.impliedNaturals; - if (multilineVars.key.explicitAccidentals) { - for (var i = 0; i < multilineVars.key.explicitAccidentals.length; i++) { - var found = false; - for (var j = 0; j < params.key.accidentals.length; j++) { - if (params.key.accidentals[j].note === multilineVars.key.explicitAccidentals[i].note) { - // If the note is already in the list, override it with the new value - params.key.accidentals[j].acc = multilineVars.key.explicitAccidentals[i].acc; - found = true; - } - } - if (!found) - params.key.accidentals.push(multilineVars.key.explicitAccidentals[i]); - } - } - multilineVars.targetKey = params.key; - if (params.key.explicitAccidentals) - delete params.key.explicitAccidentals; - abc_parse_key_voice.addPosToKey(params.clef, params.key); - if (multilineVars.meter !== null) { - if (multilineVars.currentVoice) { - abc_common.each(multilineVars.staves, function(st) { - st.meter = multilineVars.meter; - }); - params.meter = multilineVars.staves[multilineVars.currentVoice.staffNum].meter; - multilineVars.staves[multilineVars.currentVoice.staffNum].meter = null; - } else - params.meter = multilineVars.meter; - multilineVars.meter = null; - } else if (multilineVars.currentVoice && multilineVars.staves[multilineVars.currentVoice.staffNum].meter) { - // Make sure that each voice gets the meter marking. - params.meter = multilineVars.staves[multilineVars.currentVoice.staffNum].meter; - multilineVars.staves[multilineVars.currentVoice.staffNum].meter = null; - } - if (multilineVars.currentVoice && multilineVars.currentVoice.name) - params.name = multilineVars.currentVoice.name; - if (multilineVars.vocalfont) - params.vocalfont = multilineVars.vocalfont; - if (multilineVars.tripletfont) - params.tripletfont = multilineVars.tripletfont; - if (multilineVars.style) - params.style = multilineVars.style; - if (multilineVars.currentVoice) { - var staff = multilineVars.staves[multilineVars.currentVoice.staffNum]; - if (staff.brace) params.brace = staff.brace; - if (staff.bracket) params.bracket = staff.bracket; - if (staff.connectBarLines) params.connectBarLines = staff.connectBarLines; - if (staff.name) params.name = staff.name[multilineVars.currentVoice.index]; - if (staff.subname) params.subname = staff.subname[multilineVars.currentVoice.index]; - if (multilineVars.currentVoice.stem) - params.stem = multilineVars.currentVoice.stem; - if (multilineVars.currentVoice.stafflines) - params.stafflines = multilineVars.currentVoice.stafflines; - if (multilineVars.currentVoice.staffscale) - params.staffscale = multilineVars.currentVoice.staffscale; - if (multilineVars.currentVoice.scale) - params.scale = multilineVars.currentVoice.scale; - if (multilineVars.currentVoice.style) - params.style = multilineVars.currentVoice.style; - if (multilineVars.currentVoice.transpose) - params.clef.transpose = multilineVars.currentVoice.transpose; - } - var isFirstVoice = multilineVars.currentVoice === undefined || (multilineVars.currentVoice.staffNum === 0 && multilineVars.currentVoice.index === 0); - if (multilineVars.barNumbers === 0 && isFirstVoice && multilineVars.currBarNumber !== 1) - params.barNumber = multilineVars.currBarNumber; - tune.startNewLine(params); - if (multilineVars.key.impliedNaturals) - delete multilineVars.key.impliedNaturals; - - multilineVars.partForNextLine = {}; - } - - var letter_to_grace = function(line, i) { - // Grace notes are an array of: startslur, note, endslur, space; where note is accidental, pitch, duration - if (line.charAt(i) === '{') { - // fetch the gracenotes string and consume that into the array - var gra = tokenizer.getBrackettedSubstring(line, i, 1, '}'); - if (!gra[2]) - warn("Missing the closing '}' while parsing grace note", line, i); - // If there is a slur after the grace construction, then move it to the last note inside the grace construction - if (line[i+gra[0]] === ')') { - gra[0]++; - gra[1] += ')'; - } - - var gracenotes = []; - var ii = 0; - var inTie = false; - while (ii < gra[1].length) { - var acciaccatura = false; - if (gra[1].charAt(ii) === '/') { - acciaccatura = true; - ii++; - } - var note = getCoreNote(gra[1], ii, {}, false); - if (note !== null) { - // The grace note durations should not be affected by the default length: they should be based on 1/16, so if that isn't the default, then multiply here. - note.duration = note.duration / (multilineVars.default_length * 8); - if (acciaccatura) - note.acciaccatura = true; - gracenotes.push(note); - - if (inTie) { - note.endTie = true; - inTie = false; - } - if (note.startTie) - inTie = true; - - ii = note.endChar; - delete note.endChar; - } - else { - // We shouldn't get anything but notes or a space here, so report an error - if (gra[1].charAt(ii) === ' ') { - if (gracenotes.length > 0) - gracenotes[gracenotes.length-1].end_beam = true; - } else - warn("Unknown character '" + gra[1].charAt(ii) + "' while parsing grace note", line, i); - ii++; - } - } - if (gracenotes.length) - return [gra[0], gracenotes]; - } - return [ 0 ]; - }; - - function letter_to_overlay(line, i) { - if (line.charAt(i) === '&') { - var start = i; - while (line.charAt(i) && line.charAt(i) !== ':' && line.charAt(i) !== '|') - i++; - return [ i-start, line.substring(start+1, i) ]; - } - return [ 0 ]; - } - - function durationOfMeasure(multilineVars) { - // TODO-PER: This could be more complicated if one of the unusual measures is used. - var meter = multilineVars.origMeter; - if (!meter || meter.type !== 'specified') - return 1; - if (!meter.value || meter.value.length === 0) - return 1; - return parseInt(meter.value[0].num, 10) / parseInt(meter.value[0].den, 10); - } - - // - // Parse line of music - // - // This is a stream of <(bar-marking|header|note-group)...> in any order, with optional spaces between each element - // core-note is with no spaces within that - // chord is with no spaces within that - // grace-notes is spaces are allowed - // note-group is spaces are allowed between items - // bar-marking is or spaces allowed - // header is spaces can occur between the colon, in the field, and before the close bracket - // header can also be the only thing on a line. This is true even if it is a continuation line. In this case the brackets are not required. - // a space is a back-tick, a space, or a tab. If it is a back-tick, then there is no end-beam. - - // Line preprocessing: anything after a % is ignored (the double %% should have been taken care of before this) - // Then, all leading and trailing spaces are ignored. - // If there was a line continuation, the \n was replaced by a \r and the \ was replaced by a space. This allows the construct - // of having a header mid-line conceptually, but actually be at the start of the line. This is equivolent to putting the header in [ ]. - - // TODO-PER: How to handle ! for line break? - // TODO-PER: dots before bar, dots before slur - // TODO-PER: U: redefinable symbols. - - // Ambiguous symbols: - // "[" can be the start of a chord, the start of a header element or part of a bar line. - // --- if it is immediately followed by "|", it is a bar line - // --- if it is immediately followed by K: L: M: V: it is a header (note: there are other headers mentioned in the standard, but I'm not sure how they would be used.) - // --- otherwise it is the beginning of a chord - // "(" can be the start of a slur or a triplet - // --- if it is followed by a number from 2-9, then it is a triplet - // --- otherwise it is a slur - // "]" - // --- if there is a chord open, then this is the close - // --- if it is after a [|, then it is an invisible bar line - // --- otherwise, it is par of a bar - // "." can be a bar modifier or a slur modifier, or a decoration - // --- if it comes immediately before a bar, it is a bar modifier - // --- if it comes immediately before a slur, it is a slur modifier - // --- otherwise it is a decoration for the next note. - // number: - // --- if it is after a bar, with no space, it is an ending marker - // --- if it is after a ( with no space, it is a triplet count - // --- if it is after a pitch or octave or slash, then it is a duration - - // Unambiguous symbols (except inside quoted strings): - // vertical-bar, colon: part of a bar - // ABCDEFGabcdefg: pitch - // xyzZ: rest - // comma, prime: octave - // close-paren: end-slur - // hyphen: tie - // tilde, v, u, bang, plus, THLMPSO: decoration - // carat, underscore, equal: accidental - // ampersand: time reset - // open-curly, close-curly: grace notes - // double-quote: chord symbol - // less-than, greater-than, slash: duration - // back-tick, space, tab: space - var nonDecorations = "ABCDEFGabcdefgxyzZ[]|^_{"; // use this to prescreen so we don't have to look for a decoration at every note. - - var parseRegularMusicLine = function(line) { - header.resolveTempo(); - //multilineVars.havent_set_length = false; // To late to set this now. - multilineVars.is_in_header = false; // We should have gotten a key header by now, but just in case, this is definitely out of the header. - var i = 0; - var startOfLine = multilineVars.iChar; - // see if there is nothing but a comment on this line. If so, just ignore it. A full line comment is optional white space followed by % - while (tokenizer.isWhiteSpace(line.charAt(i)) && i < line.length) - i++; - if (i === line.length || line.charAt(i) === '%') - return; - - // Start with the standard staff, clef and key symbols on each line - var delayStartNewLine = multilineVars.start_new_line; - if (multilineVars.continueall === undefined) - multilineVars.start_new_line = true; - else - multilineVars.start_new_line = false; - var tripletNotesLeft = 0; - - // See if the line starts with a header field - var retHeader = header.letter_to_body_header(line, i); - if (retHeader[0] > 0) { - i += retHeader[0]; - if (retHeader[1] === 'V') - delayStartNewLine = true; // fixes bug on this: c[V:2]d - // TODO-PER: Handle inline headers - } - var el = { }; - - var overlayLevel = 0; - while (i < line.length) - { - var startI = i; - if (line.charAt(i) === '%') - break; - - var retInlineHeader = header.letter_to_inline_header(line, i); - if (retInlineHeader[0] > 0) { - i += retInlineHeader[0]; - if (retInlineHeader[1] === 'V') - delayStartNewLine = true; // fixes bug on this: c[V:2]d - // TODO-PER: Handle inline headers - //multilineVars.start_new_line = false; - } else { - // Wait until here to actually start the line because we know we're past the inline statements. - if (delayStartNewLine) { - startNewLine(); - delayStartNewLine = false; - } - - // We need to decide if the following characters are a bar-marking or a note-group. - // Unfortunately, that is ambiguous. Both can contain chord symbols and decorations. - // If there is a grace note either before or after the chord symbols and decorations, then it is definitely a note-group. - // If there is a bar marker, it is definitely a bar-marking. - // If there is either a core-note or chord, it is definitely a note-group. - // So, loop while we find grace-notes, chords-symbols, or decorations. [It is an error to have more than one grace-note group in a row; the others can be multiple] - // Then, if there is a grace-note, we know where to go. - // Else see if we have a chord, core-note, slur, triplet, or bar. - - var ret; - while (1) { - ret = tokenizer.eatWhiteSpace(line, i); - if (ret > 0) { - i += ret; - } - if (i > 0 && line.charAt(i-1) === '\x12') { - // there is one case where a line continuation isn't the same as being on the same line, and that is if the next character after it is a header. - ret = header.letter_to_body_header(line, i); - if (ret[0] > 0) { - if (ret[1] === 'V') - startNewLine(); // fixes bug on this: c\\nV:2]\\nd - // TODO: insert header here - i = ret[0]; - multilineVars.start_new_line = false; - } - } - // gather all the grace notes, chord symbols and decorations - ret = letter_to_spacer(line, i); - if (ret[0] > 0) { - i += ret[0]; - } - - ret = letter_to_chord(line, i); - if (ret[0] > 0) { - // There could be more than one chord here if they have different positions. - // If two chords have the same position, then connect them with newline. - if (!el.chord) - el.chord = []; - var chordName = tokenizer.translateString(ret[1]); - chordName = chordName.replace(/;/g, "\n"); - var addedChord = false; - for (var ci = 0; ci < el.chord.length; ci++) { - if (el.chord[ci].position === ret[2]) { - addedChord = true; - el.chord[ci].name += "\n" + chordName; - } - } - if (addedChord === false) { - if (ret[2] === null && ret[3]) - el.chord.push({name: chordName, rel_position: ret[3]}); - else - el.chord.push({name: chordName, position: ret[2]}); - } - - i += ret[0]; - var ii = tokenizer.skipWhiteSpace(line.substring(i)); - if (ii > 0) - el.force_end_beam_last = true; - i += ii; - } else { - if (nonDecorations.indexOf(line.charAt(i)) === -1) - ret = letter_to_accent(line, i); - else ret = [ 0 ]; - if (ret[0] > 0) { - if (ret[1] === null) { - if (i + 1 < line.length) - startNewLine(); // There was a ! in the middle of the line. Start a new line if there is anything after it. - } else if (ret[1].length > 0) { - if (ret[1].indexOf("style=") === 0) { - el.style = ret[1].substr(6); - } else { - if (el.decoration === undefined) - el.decoration = []; - el.decoration.push(ret[1]); - } - } - i += ret[0]; - } else { - ret = letter_to_grace(line, i); - // TODO-PER: Be sure there aren't already grace notes defined. That is an error. - if (ret[0] > 0) { - el.gracenotes = ret[1]; - i += ret[0]; - } else - break; - } - } - } - - ret = letter_to_bar(line, i); - if (ret[0] > 0) { - // This is definitely a bar - overlayLevel = 0; - if (el.gracenotes !== undefined) { - // Attach the grace note to an invisible note - el.rest = { type: 'spacer' }; - el.duration = 0.125; // TODO-PER: I don't think the duration of this matters much, but figure out if it does. - multilineVars.addFormattingOptions(el, tune.formatting, 'note'); - tune.appendElement('note', startOfLine+i, startOfLine+i+ret[0], el); - multilineVars.measureNotEmpty = true; - el = {}; - } - var bar = {type: ret[1]}; - if (bar.type.length === 0) - warn("Unknown bar type", line, i); - else { - if (multilineVars.inEnding && bar.type !== 'bar_thin') { - bar.endEnding = true; - multilineVars.inEnding = false; - } - if (ret[2]) { - bar.startEnding = ret[2]; - if (multilineVars.inEnding) - bar.endEnding = true; - multilineVars.inEnding = true; - } - if (el.decoration !== undefined) - bar.decoration = el.decoration; - if (el.chord !== undefined) - bar.chord = el.chord; - if (bar.startEnding && multilineVars.barFirstEndingNum === undefined) - multilineVars.barFirstEndingNum = multilineVars.currBarNumber; - else if (bar.startEnding && bar.endEnding && multilineVars.barFirstEndingNum) - multilineVars.currBarNumber = multilineVars.barFirstEndingNum; - else if (bar.endEnding) - multilineVars.barFirstEndingNum = undefined; - if (bar.type !== 'bar_invisible' && multilineVars.measureNotEmpty) { - var isFirstVoice = multilineVars.currentVoice === undefined || (multilineVars.currentVoice.staffNum === 0 && multilineVars.currentVoice.index === 0); - if (isFirstVoice) { - multilineVars.currBarNumber++; - if (multilineVars.barNumbers && multilineVars.currBarNumber % multilineVars.barNumbers === 0) - bar.barNumber = multilineVars.currBarNumber; - } - } - multilineVars.addFormattingOptions(el, tune.formatting, 'bar'); - tune.appendElement('bar', startOfLine+i, startOfLine+i+ret[0], bar); - multilineVars.measureNotEmpty = false; - el = {}; - } - i += ret[0]; - var cv = multilineVars.currentVoice ? multilineVars.currentVoice.staffNum + '-' + multilineVars.currentVoice.index : 'ONLY'; - // if (multilineVars.lineBreaks) { - // if (!multilineVars.barCounter[cv]) - // multilineVars.barCounter[cv] = 0; - // var breakNow = multilineVars.lineBreaks[''+multilineVars.barCounter[cv]]; - // multilineVars.barCounter[cv]++; - // if (breakNow) - // startNewLine(); - // } - } else if (line[i] === '&') { // backtrack to beginning of measure - ret = letter_to_overlay(line, i); - if (ret[0] > 0) { - tune.appendElement('overlay', startOfLine, startOfLine+1, {}); - i += 1; - overlayLevel++; - } - - } else { - // This is definitely a note group - // - // Look for as many open slurs and triplets as there are. (Note: only the first triplet is valid.) - ret = letter_to_open_slurs_and_triplets(line, i); - if (ret.consumed > 0) { - if (ret.startSlur !== undefined) - el.startSlur = ret.startSlur; - if (ret.triplet !== undefined) { - if (tripletNotesLeft > 0) - warn("Can't nest triplets", line, i); - else { - el.startTriplet = ret.triplet; - el.tripletMultiplier = ret.tripletQ / ret.triplet; - tripletNotesLeft = ret.num_notes === undefined ? ret.triplet : ret.num_notes; - } - } - i += ret.consumed; - } - - // handle chords. - if (line.charAt(i) === '[') { - var chordStartChar = i; - i++; - var chordDuration = null; - var rememberEndBeam = false; - - var done = false; - while (!done) { - var accent = letter_to_accent(line, i); - if (accent[0] > 0) { - i += accent[0]; - } - - var chordNote = getCoreNote(line, i, {}, false); - if (chordNote !== null) { - if (accent[0] > 0) { // If we found a decoration above, it modifies the entire chord. "style" is handled below. - if (accent[1].indexOf("style=") !== 0) { - if (el.decoration === undefined) - el.decoration = []; - el.decoration.push(accent[1]); - } - } - if (chordNote.end_beam) { - el.end_beam = true; - delete chordNote.end_beam; - } - if (el.pitches === undefined) { - el.duration = chordNote.duration; - el.pitches = [ chordNote ]; - } else // Just ignore the note lengths of all but the first note. The standard isn't clear here, but this seems less confusing. - el.pitches.push(chordNote); - delete chordNote.duration; - if (accent[0] > 0) { // If we found a style above, it modifies the individual pitch, not the entire chord. - if (accent[1].indexOf("style=") === 0) { - el.pitches[el.pitches.length-1].style = accent[1].substr(6); - } - } - - if (multilineVars.inTieChord[el.pitches.length]) { - chordNote.endTie = true; - multilineVars.inTieChord[el.pitches.length] = undefined; - } - if (chordNote.startTie) - multilineVars.inTieChord[el.pitches.length] = true; - - i = chordNote.endChar; - delete chordNote.endChar; - } else if (line.charAt(i) === ' ') { - // Spaces are not allowed in chords, but we can recover from it by ignoring it. - warn("Spaces are not allowed in chords", line, i); - i++; - } else { - if (i < line.length && line.charAt(i) === ']') { - // consume the close bracket - i++; - - if (multilineVars.next_note_duration !== 0) { - el.duration = el.duration * multilineVars.next_note_duration; - multilineVars.next_note_duration = 0; - } - - if (isInTie(multilineVars, overlayLevel, el)) { - abc_common.each(el.pitches, function(pitch) { pitch.endTie = true; }); - setIsInTie(multilineVars, overlayLevel, false); - } - - if (tripletNotesLeft > 0) { - tripletNotesLeft--; - if (tripletNotesLeft === 0) { - el.endTriplet = true; - } - } - - var postChordDone = false; - while (i < line.length && !postChordDone) { - switch (line.charAt(i)) { - case ' ': - case '\t': - addEndBeam(el); - break; - case ')': - if (el.endSlur === undefined) el.endSlur = 1; else el.endSlur++; - break; - case '-': - abc_common.each(el.pitches, function(pitch) { pitch.startTie = {}; }); - setIsInTie(multilineVars, overlayLevel, true); - break; - case '>': - case '<': - var br2 = getBrokenRhythm(line, i); - i += br2[0] - 1; // index gets incremented below, so we'll let that happen - multilineVars.next_note_duration = br2[2]; - if (chordDuration) - chordDuration = chordDuration * br2[1]; - else - chordDuration = br2[1]; - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '/': - var fraction = tokenizer.getFraction(line, i); - chordDuration = fraction.value; - i = fraction.index; - if (line.charAt(i) === ' ') - rememberEndBeam = true; - if (line.charAt(i) === '-' || line.charAt(i) === ')' || line.charAt(i) === ' ' || line.charAt(i) === '<' || line.charAt(i) === '>') - i--; // Subtracting one because one is automatically added below - else - postChordDone = true; - break; - default: - postChordDone = true; - break; - } - if (!postChordDone) { - i++; - } - } - } else - warn("Expected ']' to end the chords", line, i); - - if (el.pitches !== undefined) { - if (chordDuration !== null) { - el.duration = el.duration * chordDuration; - if (rememberEndBeam) - addEndBeam(el); - } - - multilineVars.addFormattingOptions(el, tune.formatting, 'note'); - tune.appendElement('note', startOfLine+chordStartChar, startOfLine+i, el); - multilineVars.measureNotEmpty = true; - el = {}; - } - done = true; - } - } - - } else { - // Single pitch - var el2 = {}; - var core = getCoreNote(line, i, el2, true); - if (el2.endTie !== undefined) setIsInTie(multilineVars, overlayLevel, true); - if (core !== null) { - if (core.pitch !== undefined) { - el.pitches = [ { } ]; - // TODO-PER: straighten this out so there is not so much copying: getCoreNote shouldn't change e' - if (core.accidental !== undefined) el.pitches[0].accidental = core.accidental; - el.pitches[0].pitch = core.pitch; - if (core.midipitch) - el.pitches[0].midipitch = core.midipitch; - if (core.endSlur !== undefined) el.pitches[0].endSlur = core.endSlur; - if (core.endTie !== undefined) el.pitches[0].endTie = core.endTie; - if (core.startSlur !== undefined) el.pitches[0].startSlur = core.startSlur; - if (el.startSlur !== undefined) el.pitches[0].startSlur = el.startSlur; - if (core.startTie !== undefined) el.pitches[0].startTie = core.startTie; - if (el.startTie !== undefined) el.pitches[0].startTie = el.startTie; - } else { - el.rest = core.rest; - if (core.endSlur !== undefined) el.endSlur = core.endSlur; - if (core.endTie !== undefined) el.rest.endTie = core.endTie; - if (core.startSlur !== undefined) el.startSlur = core.startSlur; - if (core.startTie !== undefined) el.rest.startTie = core.startTie; - if (el.startTie !== undefined) el.rest.startTie = el.startTie; - } - - if (core.chord !== undefined) el.chord = core.chord; - if (core.duration !== undefined) el.duration = core.duration; - if (core.decoration !== undefined) el.decoration = core.decoration; - if (core.graceNotes !== undefined) el.graceNotes = core.graceNotes; - delete el.startSlur; - if (isInTie(multilineVars, overlayLevel, el)) { - if (el.pitches !== undefined) { - el.pitches[0].endTie = true; - } else if (el.rest.type !== 'spacer') { - el.rest.endTie = true; - } - setIsInTie(multilineVars, overlayLevel, false); - } - if (core.startTie || el.startTie) - setIsInTie(multilineVars, overlayLevel, true); - i = core.endChar; - - if (tripletNotesLeft > 0) { - tripletNotesLeft--; - if (tripletNotesLeft === 0) { - el.endTriplet = true; - } - } - - if (core.end_beam) - addEndBeam(el); - - // If there is a whole rest, then it should be the duration of the measure, not it's own duration. We need to special case it. - // If the time signature length is greater than 4/4, though, then a whole rest has no special treatment. - if (el.rest && el.rest.type === 'rest' && el.duration === 1 && durationOfMeasure(multilineVars) <= 1) { - el.rest.type = 'whole'; - - el.duration = durationOfMeasure(multilineVars); - } - - multilineVars.addFormattingOptions(el, tune.formatting, 'note'); - tune.appendElement('note', startOfLine+startI, startOfLine+i, el); - multilineVars.measureNotEmpty = true; - el = {}; - } - } - - if (i === startI) { // don't know what this is, so ignore it. - if (line.charAt(i) !== ' ' && line.charAt(i) !== '`') - warn("Unknown character ignored", line, i); - i++; - } - } - } - } - }; - - var isInTie = function(multilineVars, overlayLevel, el) { - if (multilineVars.inTie[overlayLevel] === undefined) - return false; - // If this is single voice music then the voice index isn't set, so we use the first voice. - var voiceIndex = multilineVars.currentVoice ? multilineVars.currentVoice.index : 0; - if (multilineVars.inTie[overlayLevel][voiceIndex]) { - if (el.pitches !== undefined || el.rest.type !== 'spacer') - return true; - } - return false; - }; - - var setIsInTie =function(multilineVars, overlayLevel, value) { - // If this is single voice music then the voice index isn't set, so we use the first voice. - var voiceIndex = multilineVars.currentVoice ? multilineVars.currentVoice.index : 0; - if (multilineVars.inTie[overlayLevel] === undefined) - multilineVars.inTie[overlayLevel] = []; - multilineVars.inTie[overlayLevel][voiceIndex] = value; - }; - - var parseLine = function(line) { - var ret = header.parseHeader(line); - if (ret.regular) - parseRegularMusicLine(ret.str); - if (ret.newline) - startNewLine(); - if (ret.words) - addWords(tune.getCurrentVoice(), line.substring(2)); - if (ret.symbols) - addSymbols(tune.getCurrentVoice(), line.substring(2)); - if (ret.recurse) - parseLine(ret.str); - }; - - function appendLastMeasure(voice, nextVoice) { - voice.push({ - el_type: 'hint' - }); - for (var i = 0; i < nextVoice.length; i++) { - var element = nextVoice[i]; - var hint = abc_common.clone(element); - voice.push(hint); - if (element.el_type === 'bar') - return; - } - } - - function addHintMeasure(staff, nextStaff) { - for (var i = 0; i < staff.length; i++) { - var stave = staff[i]; - var nextStave = nextStaff[i]; - if (nextStave) { // Be sure there is the same number of staves on the next line. - for (var j = 0; j < nextStave.voices.length; j++) { - var nextVoice = nextStave.voices[j]; - var voice = stave.voices[j]; - if (voice) { // Be sure there are the same number of voices on the previous line. - appendLastMeasure(voice, nextVoice); - } - } - } - } - } - - function addHintMeasures() { - for (var i = 0; i < tune.lines.length; i++) { - var line = tune.lines[i].staff; - if (line) { - var j = i+1; - while (j < tune.lines.length && tune.lines[j].staff === undefined) - j++; - if (j < tune.lines.length) { - var nextLine = tune.lines[j].staff; - addHintMeasure(line, nextLine); - } - } - } - } - - this.parse = function(strTune, switches, startPos) { - // the switches are optional and cause a difference in the way the tune is parsed. - // switches.header_only : stop parsing when the header is finished - // switches.stop_on_warning : stop at the first warning encountered. - // switches.print: format for the page instead of the browser. - // switches.format: a hash of the desired formatting commands. - // switches.hint_measures: put the next measure at the end of the current line. - // switches.transpose: change the key signature, chords, and notes by a number of half-steps. - if (!switches) switches = {}; - if (!startPos) startPos = 0; - tune.reset(); - if (switches.print) - tune.media = 'print'; - multilineVars.reset(); - multilineVars.iChar = startPos; - if (switches.visualTranspose) { - multilineVars.globalTranspose = parseInt(switches.visualTranspose); - if (multilineVars.globalTranspose === 0) - multilineVars.globalTranspose = undefined; - } else - multilineVars.globalTranspose = undefined; - if (switches.lineBreaks) { - // change the format of the the line breaks for easy testing. - // The line break numbers are 0-based and they reflect the last measure of the current line. - multilineVars.lineBreaks = {}; - //multilineVars.continueall = true; - for (var i = 0; i < switches.lineBreaks.length; i++) - multilineVars.lineBreaks[''+(switches.lineBreaks[i]+1)] = true; // Add 1 so that the line break is the first measure of the next line. - } - header.reset(tokenizer, warn, multilineVars, tune); - - // Take care of whatever line endings come our way - strTune = abc_common.gsub(strTune, '\r\n', '\n'); - strTune = abc_common.gsub(strTune, '\r', '\n'); - strTune += '\n'; // Tacked on temporarily to make the last line continuation work - strTune = strTune.replace(/\n\\.*\n/g, "\n"); // get rid of latex commands. - var continuationReplacement = function(all, backslash, comment){ - var spaces = " "; - var padding = comment ? spaces.substring(0, comment.length) : ""; - return backslash + " \x12" + padding; - }; - strTune = strTune.replace(/\\([ \t]*)(%.*)*\n/g, continuationReplacement); // take care of line continuations right away, but keep the same number of characters - var lines = strTune.split('\n'); - if (abc_common.last(lines).length === 0) // remove the blank line we added above. - lines.pop(); - try { - if (switches.format) { - abc_parse_directive.globalFormatting(switches.format); - } - abc_common.each(lines, function(line) { - if (switches.header_only && multilineVars.is_in_header === false) - throw "normal_abort"; - if (switches.stop_on_warning && multilineVars.warnings) - throw "normal_abort"; - if (multilineVars.is_in_history) { - if (line.charAt(1) === ':') { - multilineVars.is_in_history = false; - parseLine(line); - } else - tune.addMetaText("history", tokenizer.translateString(tokenizer.stripComment(line))); - } else if (multilineVars.inTextBlock) { - if (abc_common.startsWith(line, "%%endtext")) { - //tune.addMetaText("textBlock", multilineVars.textBlock); - tune.addText(multilineVars.textBlock); - multilineVars.inTextBlock = false; - } - else { - if (abc_common.startsWith(line, "%%")) - multilineVars.textBlock += ' ' + line.substring(2); - else - multilineVars.textBlock += ' ' + line; - } - } else if (multilineVars.inPsBlock) { - if (abc_common.startsWith(line, "%%endps")) { - // Just ignore postscript - multilineVars.inPsBlock = false; - } - else - multilineVars.textBlock += ' ' + line; - } else - parseLine(line); - multilineVars.iChar += line.length + 1; - }); - var ph = 11*72; - var pl = 8.5*72; - switch (multilineVars.papersize) { - //case "letter": ph = 11*72; pl = 8.5*72; break; - case "legal": ph = 14*72; pl = 8.5*72; break; - case "A4": ph = 11.7*72; pl = 8.3*72; break; - } - if (multilineVars.landscape) { - var x = ph; - ph = pl; - pl = x; - } - multilineVars.openSlurs = tune.cleanUp(pl, ph, multilineVars.barsperstaff, multilineVars.staffnonote, multilineVars.openSlurs); - } catch (err) { - if (err !== "normal_abort") - throw err; - } - if (switches.hint_measures) { - addHintMeasures(); - } - - wrap_lines.wrapLines(tune, multilineVars.lineBreaks); - }; -}; - -var abc_parse = Parse; - -// abc_tunebook.js: splits a string representing ABC Music Notation into individual tunes. -// Copyright (C) 2010-2018 Paul Rosen (paul at paulrosen dot net) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/*global document */ -/*global window, ABCJS, console */ - - - - -var tunebook = {}; - -(function() { - - tunebook.numberOfTunes = function(abc) { - var tunes = abc.split("\nX:"); - var num = tunes.length; - if (num === 0) num = 1; - return num; - }; - - var TuneBook = tunebook.TuneBook = function(book) { - var This = this; - var directives = ""; - book = abc_common.strip(book); - var tunes = book.split("\nX:"); - for (var i = 1; i < tunes.length; i++) // Put back the X: that we lost when splitting the tunes. - tunes[i] = "X:" + tunes[i]; - // Keep track of the character position each tune starts with. - var pos = 0; - This.tunes = []; - abc_common.each(tunes, function(tune) { - This.tunes.push({ abc: tune, startPos: pos}); - pos += tune.length + 1; // We also lost a newline when splitting, so count that. - }); - if (This.tunes.length > 1 && !abc_common.startsWith(This.tunes[0].abc, 'X:')) { // If there is only one tune, the X: might be missing, otherwise assume the top of the file is "intertune" - // There could be file-wide directives in this, if so, we need to insert it into each tune. We can probably get away with - // just looking for file-wide directives here (before the first tune) and inserting them at the bottom of each tune, since - // the tune is parsed all at once. The directives will be seen before the engraver begins processing. - var dir = This.tunes.shift(); - var arrDir = dir.abc.split('\n'); - abc_common.each(arrDir, function(line) { - if (abc_common.startsWith(line, '%%')) - directives += line + '\n'; - }); - } - This.header = directives; - - // Now, the tune ends at a blank line, so truncate it if needed. There may be "intertune" stuff. - abc_common.each(This.tunes, function(tune) { - var end = tune.abc.indexOf('\n\n'); - if (end > 0) - tune.abc = tune.abc.substring(0, end); - tune.pure = tune.abc; - tune.abc = directives + tune.abc; - - // for the user's convenience, parse and store the title separately. The title is between the first T: and the next \n - var title = tune.pure.split("T:"); - if (title.length > 1) { - title = title[1].split("\n"); - tune.title = title[0].replace(/^\s+|\s+$/g, ''); - } else - tune.title = ""; - - // for the user's convenience, parse and store the id separately. The id is between the first X: and the next \n - var id = tune.pure.substring(2, tune.pure.indexOf("\n")); - tune.id = id.replace(/^\s+|\s+$/g, ''); - }); - }; - - TuneBook.prototype.getTuneById = function(id) { - for (var i = 0; i < this.tunes.length; i++) { - if (this.tunes[i].id === ''+id) - return this.tunes[i]; - } - return null; - }; - - TuneBook.prototype.getTuneByTitle = function(title) { - for (var i = 0; i < this.tunes.length; i++) { - if (this.tunes[i].title === title) - return this.tunes[i]; - } - return null; - }; - - tunebook.parseOnly = function(abc, params) { - var numTunes = tunebook.numberOfTunes(abc); - - // this just needs to be passed in because this tells the engine how many tunes to process. - var output = []; - for (var i = 0; i < numTunes; i++) { - output.push(1); - } - function callback() { - // Don't need to do anything with the parsed tunes. - } - return tunebook.renderEngine(callback, output, abc, params); - }; - - tunebook.renderEngine = function (callback, output, abc, params) { - var ret = []; - var isArray = function(testObject) { - return testObject && !(testObject.propertyIsEnumerable('length')) && typeof testObject === 'object' && typeof testObject.length === 'number'; - }; - - // check and normalize input parameters - if (output === undefined || abc === undefined) - return; - if (!isArray(output)) - output = [ output ]; - if (params === undefined) - params = {}; - var currentTune = params.startingTune ? parseInt(params.startingTune, 10) : 0; - - // parse the abc string - var book = new TuneBook(abc); - var abcParser = new abc_parse(); - - // output each tune, if it exists. Otherwise clear the div. - for (var i = 0; i < output.length; i++) { - var div = output[i]; - if (div === "*") ; else if (typeof(div) === "string") - div = document.getElementById(div); - if (div) { - if (currentTune >= 0 && currentTune < book.tunes.length) { - abcParser.parse(book.tunes[currentTune].abc, params, book.tunes[currentTune].startPos - book.header.length); - var tune = abcParser.getTune(); - var override = callback(div, tune, i, book.tunes[currentTune].abc); - ret.push(override ? override : tune); - } else { - if (div.hasOwnProperty('innerHTML')) - div.innerHTML = ""; - } - } - currentTune++; - } - return ret; - }; - - tunebook.extractMeasures = function(abc) { - var tunes = []; - var book = new TuneBook(abc); - for (var i = 0; i < book.tunes.length; i++) { - var tune = book.tunes[i]; - var arr = tune.abc.split("K:"); - var arr2 = arr[1].split("\n"); - var header = arr[0] + "K:" + arr2[0] + "\n"; - var lastChord = null; - var measureStartChord = null; - var fragStart = null; - var measures = []; - var hasNotes = false; - var tuneObj = tunebook.parseOnly(tune.abc)[0]; - var hasPickup = tuneObj.getPickupLength() > 0; - // var staves = flattenTune(tuneObj); - // for (var s = 0; s < staves.length; s++) { - // var voices = measuresParser(staves[s], tune); - // if (s === 0) - // measures = voices; - // else { - // for (var ss = 0; ss < voices.length; ss++) { - // var voice = voices[ss]; - // if (measures.length <= ss) - // measures.push([]); - // var measureVoice = measures[ss]; - // for (var sss = 0; sss < voice.length; sss++) { - // if (measureVoice.length > sss) - // measureVoice[sss].abc += "\n" + voice[sss].abc; - // else - // measures.push(voice[sss]); - // } - // } - // } - // console.log(voices); - // } - // measures = measures[0]; - - for (var j = 0; j < tuneObj.lines.length; j++) { - var line = tuneObj.lines[j]; - if (line.staff) { - for (var k = 0; k < 1 /*line.staff.length*/; k++) { - var staff = line.staff[k]; - for (var kk = 0; kk < 1 /*staff.voices.length*/; kk++) { - var voice = staff.voices[kk]; - for (var kkk = 0; kkk < voice.length; kkk++) { - var elem = voice[kkk]; - if (fragStart === null && elem.startChar >= 0) { - fragStart = elem.startChar; - if (elem.chord === undefined) - measureStartChord = lastChord; - else - measureStartChord = null; - } - if (elem.chord) - lastChord = elem; - if (elem.el_type === 'bar') { - if (hasNotes) { - var frag = tune.abc.substring(fragStart, elem.endChar); - var measure = {abc: frag}; - lastChord = measureStartChord && measureStartChord.chord && measureStartChord.chord.length > 0 ? measureStartChord.chord[0].name : null; - if (lastChord) - measure.lastChord = lastChord; - if (elem.startEnding) - measure.startEnding = elem.startEnding; - if (elem.endEnding) - measure.endEnding = elem.endEnding; - measures.push(measure); - fragStart = null; - hasNotes = false; - } - } else if (elem.el_type === 'note') { - hasNotes = true; - } - } - } - } - } - } - tunes.push({ - header: header, - measures: measures, - hasPickup: hasPickup - }); - } - return tunes; - }; -})(); - -var abc_tunebook = tunebook; - -// abc_absolute_element.js: Definition of the AbsoluteElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -// duration - actual musical duration - different from notehead duration in triplets. refer to abcelem to get the notehead duration -// minspacing - spacing which must be taken on top of the width defined by the duration -// type is a meta-type for the element. It is not necessary for drawing, but it is useful to make semantic sense of the element. For instance, it can be used in the element's class name. -var AbsoluteElement = function AbsoluteElement(abcelem, duration, minspacing, type, tuneNumber, options) { - //console.log("Absolute:",abcelem, type); - if (!options) - options = {}; - this.tuneNumber = tuneNumber; - this.abcelem = abcelem; - this.duration = duration; - this.durationClass = options.durationClassOveride ? options.durationClassOveride : this.duration; - this.minspacing = minspacing || 0; - this.x = 0; - this.children = []; - this.heads = []; - this.extra = []; - this.extraw = 0; - //this.decs = []; - this.w = 0; - this.right = []; - this.invisible = false; - this.bottom = undefined; - this.top = undefined; - this.type = type; - // these are the heights of all of the vertical elements that can't be placed until the end of the line. - // the vertical order of elements that are above is: tempo, part, volume/dynamic, ending/chord, lyric - // the vertical order of elements that are below is: lyric, chord, volume/dynamic - this.specialY = { - tempoHeightAbove: 0, - partHeightAbove: 0, - volumeHeightAbove: 0, - dynamicHeightAbove: 0, - endingHeightAbove: 0, - chordHeightAbove: 0, - lyricHeightAbove: 0, - - lyricHeightBelow: 0, - chordHeightBelow: 0, - volumeHeightBelow: 0, - dynamicHeightBelow: 0 - }; -}; - -// For each of the relative elements that can't be placed in advance (because their vertical placement depends on everything -// else on the line), this iterates through them and sets their pitch. By the time this is called, specialYResolved contains a -// hash with the vertical placement (in pitch units) for each type. -// TODO-PER: I think this needs to be separated by "above" and "below". How do we know that for dynamics at the point where they are being defined, though? We need a pass through all the relative elements to set "above" and "below". -AbsoluteElement.prototype.setUpperAndLowerElements = function(specialYResolved) { - // specialYResolved contains the actual pitch for each of the classes of elements. - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - for (var key in this.specialY) { // for each class of element that needs to be placed vertically - if (this.specialY.hasOwnProperty(key)) { - if (child[key]) { // If this relative element has defined a height for this class of element - child.pitch = specialYResolved[key]; - if (child.top === undefined) { // TODO-PER: HACK! Not sure this is the right place to do this. - child.setUpperAndLowerElements(specialYResolved); - this.pushTop(child.top); - this.pushBottom(child.bottom); - } - } - } - } - } -}; - -AbsoluteElement.prototype.getMinWidth = function () { // absolute space taken to the right of the note - return this.w; -}; - -AbsoluteElement.prototype.getExtraWidth = function () { // space needed to the left of the note - return -this.extraw; -}; - -AbsoluteElement.prototype.addExtra = function (extra) { - if (extra.dxthis.w) this.w = right.dx+right.w; - this.right[this.right.length] = right; - this.addChild(right); -}; - -AbsoluteElement.prototype.addCentered = function (elem) { - var half = elem.w/2; - if (-halfthis.w) this.w = elem.dx+half; - this.right[this.right.length] = elem; - this.addChild(elem); -}; - -AbsoluteElement.prototype.setLimit = function(member, child) { - if (!child[member]) return; - if (!this.specialY[member]) - this.specialY[member] = child[member]; - else - this.specialY[member] = Math.max(this.specialY[member], child[member]); -}; - -AbsoluteElement.prototype.addChild = function (child) { - //console.log("Relative:",child); - child.parent = this; - this.children[this.children.length] = child; - this.pushTop(child.top); - this.pushBottom(child.bottom); - this.setLimit('tempoHeightAbove', child); - this.setLimit('partHeightAbove', child); - this.setLimit('volumeHeightAbove', child); - this.setLimit('dynamicHeightAbove', child); - this.setLimit('endingHeightAbove', child); - this.setLimit('chordHeightAbove', child); - this.setLimit('lyricHeightAbove', child); - this.setLimit('lyricHeightBelow', child); - this.setLimit('chordHeightBelow', child); - this.setLimit('volumeHeightBelow', child); - this.setLimit('dynamicHeightBelow', child); -}; - -AbsoluteElement.prototype.pushTop = function (top) { - if (top !== undefined) { - if (this.top === undefined) - this.top = top; - else - this.top = Math.max(top, this.top); - } -}; - -AbsoluteElement.prototype.pushBottom = function (bottom) { - if (bottom !== undefined) { - if (this.bottom === undefined) - this.bottom = bottom; - else - this.bottom = Math.min(bottom, this.bottom); - } -}; - -AbsoluteElement.prototype.setX = function (x) { - this.x = x; - for (var i=0; i 0) { - if (kls.length > 0 && kls.charAt(kls.length - 1) !== ' ') kls += " "; - kls += addClass; - } - el.setAttribute("class", kls); - } -}; - -AbsoluteElement.prototype.highlight = function (klass, color) { - if (klass === undefined) - klass = "abcjs-note_selected"; - if (color === undefined) - color = "#ff0000"; - this.setClass(klass, "", color); -}; - -AbsoluteElement.prototype.unhighlight = function (klass, color) { - if (klass === undefined) - klass = "abcjs-note_selected"; - if (color === undefined) - color = "#000000"; - this.setClass("", klass, color); -}; - -var abc_absolute_element = AbsoluteElement; - -// abc_relative_element.js: Definition of the RelativeElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var RelativeElement = function RelativeElement(c, dx, w, pitch, opt) { - opt = opt || {}; - this.x = 0; - this.c = c; // character or path or string - this.dx = dx; // relative x position - this.w = w; // minimum width taken up by this element (can include gratuitous space) - this.pitch = pitch; // relative y position by pitch - this.scalex = opt.scalex || 1; // should the character/path be scaled? - this.scaley = opt.scaley || 1; // should the character/path be scaled? - this.type = opt.type || "symbol"; // cheap types. - this.pitch2 = opt.pitch2; - this.linewidth = opt.linewidth; - this.klass = opt.klass; - this.top = pitch; - if (this.pitch2 !== undefined && this.pitch2 > this.top) this.top = this.pitch2; - this.bottom = pitch; - if (this.pitch2 !== undefined && this.pitch2 < this.bottom) this.bottom = this.pitch2; - if (opt.thickness) { - this.top += opt.thickness/2; - this.bottom -= opt.thickness/2; - } - if (opt.stemHeight) { - if (opt.stemHeight > 0) - this.top += opt.stemHeight; - else - this.bottom += opt.stemHeight; - } - //if (this.type === "symbol") { - // var offset = glyphs.getYCorr(this.c); - // this.top += offset; - // this.bottom += offset; - //} - this.height = opt.height ? opt.height : 4; // The +1 is to give a little bit of padding. - this.centerVertically = false; - switch (this.type) { - case "debug": - this.chordHeightAbove = this.height; - break; - case "lyric": - if (opt.position && opt.position === 'below') - this.lyricHeightBelow = this.height; - else - this.lyricHeightAbove = this.height; - break; - case "chord": - if (opt.position && opt.position === 'below') - this.chordHeightBelow = this.height; - else - this.chordHeightAbove = this.height; - break; - case "text": - if (this.pitch === undefined) { - if (opt.position && opt.position === 'below') - this.chordHeightBelow = this.height; - else - this.chordHeightAbove = this.height; - } else - this.centerVertically = true; - break; - case "part": this.partHeightAbove = this.height; break; - } -}; - -RelativeElement.prototype.setX = function (x) { - this.x = x+this.dx; -}; - -RelativeElement.prototype.setUpperAndLowerElements = function(positionY) { - switch(this.type) { - case "part": - this.top = positionY.partHeightAbove + this.height; - this.bottom = positionY.partHeightAbove; - break; - case "text": - case "chord": - if (this.chordHeightAbove) { - this.top = positionY.chordHeightAbove; - this.bottom = positionY.chordHeightAbove; - } else { - this.top = positionY.chordHeightBelow; - this.bottom = positionY.chordHeightBelow; - } - break; - case "lyric": - if (this.lyricHeightAbove) { - this.top = positionY.lyricHeightAbove; - this.bottom = positionY.lyricHeightAbove; - } else { - this.top = positionY.lyricHeightBelow; - this.bottom = positionY.lyricHeightBelow; - } - break; - case "debug": - this.top = positionY.chordHeightAbove; - this.bottom = positionY.chordHeightAbove; - break; - } - if (this.pitch === undefined || this.top === undefined) - window.console.error("RelativeElement position not set.", this.type, this.pitch, this.top, positionY); -}; - -RelativeElement.prototype.draw = function (renderer, bartop) { - if (this.pitch === undefined) - window.console.error(this.type + " Relative Element y-coordinate not set."); - var y = renderer.calcY(this.pitch); - switch(this.type) { - case "symbol": - if (this.c===null) return null; - var klass = "symbol"; - if (this.klass) klass += " " + this.klass; - this.graphelem = renderer.printSymbol(this.x, this.pitch, this.c, this.scalex, this.scaley, renderer.addClasses(klass)); break; - case "debug": - this.graphelem = renderer.renderText(this.x, renderer.calcY(15), ""+this.c, "debugfont", 'debug-msg', 'start'); break; - case "barNumber": - this.graphelem = renderer.renderText(this.x, y, ""+this.c, "measurefont", 'bar-number', "middle"); - break; - case "lyric": - this.graphelem = renderer.renderText(this.x, y, this.c, "vocalfont", 'lyric', "middle"); - break; - case "chord": - this.graphelem = renderer.renderText(this.x, y, this.c, 'gchordfont', "chord", "middle"); - break; - case "decoration": - this.graphelem = renderer.renderText(this.x, y, this.c, 'annotationfont', "annotation", "middle", true); - break; - case "text": - this.graphelem = renderer.renderText(this.x, y, this.c, 'annotationfont', "annotation", "start", this.centerVertically); - break; - case "multimeasure-text": - this.graphelem = renderer.renderText(this.x+this.w/2, y, this.c, 'tempofont', "rest", "middle", false); - break; - case "part": - this.graphelem = renderer.renderText(this.x, y, this.c, 'partsfont', "part", "start"); - break; - case "bar": - this.graphelem = renderer.printStem(this.x, this.linewidth, y, (bartop)?bartop:renderer.calcY(this.pitch2)); break; // bartop can't be 0 - case "stem": - this.graphelem = renderer.printStem(this.x, this.linewidth, y, renderer.calcY(this.pitch2)); break; - case "ledger": - this.graphelem = renderer.printStaveLine(this.x, this.x+this.w, this.pitch); break; - } - if (this.scalex!==1 && this.graphelem) { - renderer.scaleExistingElem(this.graphelem, this.scalex, this.scaley, this.x, y); - } - return this.graphelem; -}; - -var abc_relative_element = RelativeElement; - -// abc_beam_element.js: Definition of the BeamElem class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - -var getDurlog = function(duration) { - // TODO-PER: This is a hack to prevent a Chrome lockup. Duration should have been defined already, - // but there's definitely a case where it isn't. [Probably something to do with triplets.] - if (duration === undefined) { - return 0; - } -// console.log("getDurlog: " + duration); - return Math.floor(Math.log(duration)/Math.log(2)); -}; - - -// Most elements on the page are related to a particular absolute element -- notes, rests, bars, etc. Beams, however, span multiple elements. -// This means that beams can't be laid out until the absolute elements are placed. There is the further complication that the stems for beamed -// notes can't be laid out until the beams are because we don't know how long they will be until we know the slope of the beam and the horizontal -// spacing of the absolute elements. -// -// So, when a beam is detected, a BeamElem is created, then all notes belonging to that beam are added to it. These notes are not given stems at that time. -// Then, after the horizontal layout is complete, all of the BeamElem are iterated to set the beam position, then all of the notes that are beamed are given -// stems. After that, we are ready for the drawing step. - -// There are three phases: the setup phase, when new elements are being discovered, the layout phase, when everything is calculated, and the drawing phase, -// when the object is not changed, but is used to put the elements on the page. - -var BeamElem; - -(function() { - - // - // Setup phase - // - BeamElem = function BeamElem(stemHeight, type, flat) { - // type is "grace", "up", "down", or undefined. flat is used to force flat beams, as it commonly found in the grace notes of bagpipe music. - this.isflat = flat; - this.isgrace = (type && type === "grace"); - this.forceup = this.isgrace || (type && type === "up"); - this.forcedown = (type && type === "down"); - this.elems = []; // all the AbsoluteElements that this beam touches. It may include embedded rests. - this.total = 0; - this.allrests = true; - this.stemHeight = stemHeight; - this.beams = []; // During the layout phase, this will become a list of the beams that need to be drawn. - }; - - BeamElem.prototype.setHint = function () { - this.hint = true; - }; - - BeamElem.prototype.add = function(abselem) { - var pitch = abselem.abcelem.averagepitch; - if (pitch === undefined) return; // don't include elements like spacers in beams - this.allrests = this.allrests && abselem.abcelem.rest; - abselem.beam = this; - this.elems.push(abselem); - //var pitch = abselem.abcelem.averagepitch; - this.total += pitch; // TODO CHORD (get pitches from abselem.heads) - if (this.min === undefined || abselem.abcelem.minpitch < this.min) { - this.min = abselem.abcelem.minpitch; - } - if (this.max === undefined || abselem.abcelem.maxpitch > this.max) { - this.max = abselem.abcelem.maxpitch; - } - }; - - var middleLine = 6; // hardcoded 6 is B - - BeamElem.prototype.calcDir = function() { - if (this.forceup) return true; - if (this.forcedown) return false; - var average = calcAverage(this.total, this.elems.length); - return average < middleLine; - }; - - // - // layout phase - // - BeamElem.prototype.layout = function() { - if (this.elems.length === 0 || this.allrests) return; - - this.stemsUp = this.calcDir(); // True means the stems are facing up. - var dy = calcDy(this.stemsUp, this.isgrace); // This is the width of the beam line. - - // create the main beam - var firstElement = this.elems[0]; - var lastElement = this.elems[this.elems.length - 1]; - var minStemHeight = 0; // The following is to leave space for "!///!" marks. - var referencePitch = this.stemsUp ? firstElement.abcelem.maxpitch : firstElement.abcelem.minpitch; - minStemHeight = minStem(firstElement, this.stemsUp, referencePitch, minStemHeight); - minStemHeight = minStem(lastElement, this.stemsUp, referencePitch, minStemHeight); - minStemHeight = Math.max(this.stemHeight, minStemHeight + 3); // TODO-PER: The 3 is the width of a 16th beam. The actual height of the beam should be used instead. - var yPos = calcYPos(this.total, this.elems.length, minStemHeight, this.stemsUp, firstElement.abcelem.averagepitch, lastElement.abcelem.averagepitch, this.isflat, this.min, this.max, this.isgrace); - var xPos = calcXPos(this.stemsUp, firstElement, lastElement); - this.beams.push({ startX: xPos[0], endX: xPos[1], startY: yPos[0], endY: yPos[1], dy: dy }); - - // create the rest of the beams (in the case of 1/16th notes, etc. - var beams = createAdditionalBeams(this.elems, this.stemsUp, this.beams[0], this.isgrace, dy); - for (var i = 0; i < beams.length; i++) - this.beams.push(beams[i]); - - // Now that the main beam is defined, we know how tall the stems should be, so create them and attach them to the original notes. - createStems(this.elems, this.stemsUp, this.beams[0], dy, this.mainNote); - }; - - BeamElem.prototype.isAbove = function() { - return this.stemsUp; - }; - - // We can't just use the entire beam for the calculation. The range has to be passed in, because the beam might extend into some unrelated notes. for instance, (3_a'f'e'f'2 when L:16 - BeamElem.prototype.heightAtMidpoint = function(startX, endX) { - if (this.beams.length === 0) - return 0; - var beam = this.beams[0]; - var midPoint = startX + (endX - startX) / 2; - return getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, midPoint); - }; - - BeamElem.prototype.yAtNote = function(element) { - var beam = this.beams[0]; - return getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, element.x); - }; - - BeamElem.prototype.xAtMidpoint = function(startX, endX) { - return startX + (endX - startX)/2; - }; - - // - // Drawing phase - // - BeamElem.prototype.draw = function(renderer) { - if (this.beams.length === 0) return; - - renderer.beginGroup(); - for (var i = 0; i < this.beams.length; i++) { - var beam = this.beams[i]; - drawBeam(renderer, beam.startX, beam.startY, beam.endX, beam.endY, beam.dy, this.hint); - } - renderer.endGroup('beam-elem'); - }; - - // - // private functions - // - function minStem(element, stemsUp, referencePitch, minStemHeight) { - if (!element.children) - return minStemHeight; - for (var i = 0; i < element.children.length; i++) { - var elem = element.children[i]; - if (stemsUp && elem.top !== undefined && elem.c === "flags.ugrace") - minStemHeight = Math.max(minStemHeight, elem.top - referencePitch); - else if (!stemsUp && elem.bottom !== undefined && elem.c === "flags.ugrace") - minStemHeight = Math.max(minStemHeight, referencePitch - elem.bottom + 7); // The extra 7 is because we are measuring the slash from the top. - } - return minStemHeight; - } - - function calcSlant(leftAveragePitch, rightAveragePitch, numStems, isFlat) { - if (isFlat) - return 0; - var slant = leftAveragePitch - rightAveragePitch; - var maxSlant = numStems / 2; - - if (slant > maxSlant) slant = maxSlant; - if (slant < -maxSlant) slant = -maxSlant; - return slant; - } - - function calcAverage(total, numElements) { - if (!numElements) - return 0; - return total / numElements; - } - - function getBarYAt(startx, starty, endx, endy, x) { - return starty + (endy - starty) / (endx - startx) * (x - startx); - } - - function calcDy(asc, isGrace) { - var dy = (asc) ? abc_spacing.STEP : -abc_spacing.STEP; - if (isGrace) dy = dy * 0.4; - return dy; - } - - function drawBeam(renderer, startX, startY, endX, endY, dy, isHint) { - var klass = 'beam-elem'; - if (isHint) - klass += " abcjs-hint"; - - // the X coordinates are actual coordinates, but the Y coordinates are in pitches. - startY = renderer.calcY(startY); - endY = renderer.calcY(endY); - var pathString = "M" + startX + " " + startY + " L" + endX + " " + endY + - "L" + endX + " " + (endY + dy) + " L" + startX + " " + (startY + dy) + "z"; - renderer.printPath({ - path: pathString, - stroke: "none", - fill: "#000000", - 'class': renderer.addClasses(klass) - }); - } - - function calcXPos(asc, firstElement, lastElement) { - var starthead = firstElement.heads[asc ? 0 : firstElement.heads.length - 1]; - var endhead = lastElement.heads[asc ? 0 : lastElement.heads.length - 1]; - var startX = starthead.x; - if (asc) startX += starthead.w - 0.6; - var endX = endhead.x; - if (asc) endX += endhead.w; - return [ startX, endX ]; - } - - function calcYPos(total, numElements, stemHeight, asc, firstAveragePitch, lastAveragePitch, isFlat, minPitch, maxPitch, isGrace) { - var average = calcAverage(total, numElements); // This is the average pitch for the all the notes that will be beamed. - var barpos = stemHeight - 2; // (isGrace)? 5:7; - var barminpos = stemHeight - 2; - var pos = Math.round(asc ? Math.max(average + barpos, maxPitch + barminpos) : Math.min(average - barpos, minPitch - barminpos)); - - var slant = calcSlant(firstAveragePitch, lastAveragePitch, numElements, isFlat); - var startY = pos + Math.floor(slant / 2); - var endY = pos + Math.floor(-slant / 2); - - // If the notes are too high or too low, make the beam go down to the middle - if (!isGrace) { - if (asc && pos < 6) { - startY = 6; - endY = 6; - } else if (!asc && pos > 6) { - startY = 6; - endY = 6; - } - } - - return [ startY, endY]; - } - - function createStems(elems, asc, beam, dy, mainNote) { - for (var i = 0; i < elems.length; i++) { - var elem = elems[i]; - if (elem.abcelem.rest) - continue; - // TODO-PER: This is odd. If it is a regular beam then elems is an array of AbsoluteElements, if it is a grace beam then it is an array of objects , so we directly attach the element to the parent. We tell it if is a grace note because they are passed in as a generic object instead of an AbsoluteElement. - var isGrace = elem.addExtra ? false : true; - var parent = isGrace ? mainNote : elem; - var furthestHead = elem.heads[(asc) ? 0 : elem.heads.length - 1]; - var ovalDelta = 1 / 5;//(isGrace)?1/3:1/5; - var pitch = furthestHead.pitch + ((asc) ? ovalDelta : -ovalDelta); - var dx = asc ? furthestHead.w : 0; // down-pointing stems start on the left side of the note, up-pointing stems start on the right side, so we offset by the note width. - var x = furthestHead.x + dx; // this is now the actual x location in pixels. - var bary = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, x); - var lineWidth = (asc) ? -0.6 : 0.6; - if (!asc) - bary -= (dy / 2) / abc_spacing.STEP; // TODO-PER: This is just a fudge factor so the down-pointing stems don't overlap. - if (isGrace) - dx += elem.heads[0].dx; - // TODO-PER-HACK: One type of note head has a different placement of the stem. This should be more generically calculated: - if (furthestHead.c === 'noteheads.slash.quarter') { - if (asc) - pitch += 1; - else - pitch -= 1; - } - var stem = new abc_relative_element(null, dx, 0, pitch, { - "type": "stem", - "pitch2": bary, - linewidth: lineWidth - }); - stem.setX(parent.x); // This is after the x coordinates were set, so we have to set it directly. - parent.addExtra(stem); - } - - } - - function createAdditionalBeams(elems, asc, beam, isGrace, dy) { - var beams = []; - var auxBeams = []; // auxbeam will be {x, y, durlog, single} auxbeam[0] should match with durlog=-4 (16th) (j=-4-durlog) - for (var i = 0; i < elems.length; i++) { - var elem = elems[i]; - if (elem.abcelem.rest) - continue; - var furthestHead = elem.heads[(asc) ? 0 : elem.heads.length - 1]; - var x = furthestHead.x + ((asc) ? furthestHead.w : 0); - var bary = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, x); - - var sy = (asc) ? -1.5 : 1.5; - if (isGrace) sy = sy * 2 / 3; // This makes the second beam on grace notes closer to the first one. - var duration = elem.abcelem.duration; // get the duration via abcelem because of triplets - if (duration === 0) duration = 0.25; // if this is stemless, then we use quarter note as the duration. - for (var durlog = getDurlog(duration); durlog < -3; durlog++) { - if (auxBeams[-4 - durlog]) { - auxBeams[-4 - durlog].single = false; - } else { - auxBeams[-4 - durlog] = { - x: x + ((asc) ? -0.6 : 0), y: bary + sy * (-4 - durlog + 1), - durlog: durlog, single: true - }; - } - } - - for (var j = auxBeams.length - 1; j >= 0; j--) { - if (i === elems.length - 1 || getDurlog(elems[i + 1].abcelem.duration) > (-j - 4)) { - - var auxBeamEndX = x; - var auxBeamEndY = bary + sy * (j + 1); - - - if (auxBeams[j].single) { - auxBeamEndX = (i === 0) ? x + 5 : x - 5; - auxBeamEndY = getBarYAt(beam.startX, beam.startY, beam.endX, beam.endY, auxBeamEndX) + sy * (j + 1); - } - beams.push({ startX: auxBeams[j].x, endX: auxBeamEndX, startY: auxBeams[j].y, endY: auxBeamEndY, dy: dy }); - auxBeams = auxBeams.slice(0, j); - } - } - } - return beams; - } -})(); - -var abc_beam_element = BeamElem; - -// abc_brace_element.js: Definition of the BraceElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var BraceElem = function BraceElem() { - this.length = 1; -}; - -BraceElem.prototype.increaseStavesIncluded = function() { - this.length++; -}; - -BraceElem.prototype.setLocation = function(x) { - this.x = x; -}; - -BraceElem.prototype.getWidth = function() { - return 10; // TODO-PER: right now the drawing function doesn't vary the width at all. If it does in the future then this will change. -}; - -BraceElem.prototype.layout = function (renderer, top, bottom) { - this.startY = top; - this.endY = bottom; -}; - -BraceElem.prototype.draw = function (renderer, top, bottom) { - this.layout(renderer, top, bottom); - renderer.drawBrace(this.x,this.startY, this.endY); - -}; - -var abc_brace_element = BraceElem; - -/** - * Glyphs and some methods to adjust for their x and y baseline - */ - var glyphs = - {'0':{d:[['M',4.83,-14.97],['c',0.33,-0.03,1.11,0.00,1.47,0.06],['c',1.68,0.36,2.97,1.59,3.78,3.60],['c',1.20,2.97,0.81,6.96,-0.90,9.27],['c',-0.78,1.08,-1.71,1.71,-2.91,1.95],['c',-0.45,0.09,-1.32,0.09,-1.77,0.00],['c',-0.81,-0.18,-1.47,-0.51,-2.07,-1.02],['c',-2.34,-2.07,-3.15,-6.72,-1.74,-10.20],['c',0.87,-2.16,2.28,-3.42,4.14,-3.66],['z'],['m',1.11,0.87],['c',-0.21,-0.06,-0.69,-0.09,-0.87,-0.06],['c',-0.54,0.12,-0.87,0.42,-1.17,0.99],['c',-0.36,0.66,-0.51,1.56,-0.60,3.00],['c',-0.03,0.75,-0.03,4.59,0.00,5.31],['c',0.09,1.50,0.27,2.40,0.60,3.06],['c',0.24,0.48,0.57,0.78,0.96,0.90],['c',0.27,0.09,0.78,0.09,1.05,0.00],['c',0.39,-0.12,0.72,-0.42,0.96,-0.90],['c',0.33,-0.66,0.51,-1.56,0.60,-3.06],['c',0.03,-0.72,0.03,-4.56,0.00,-5.31],['c',-0.09,-1.47,-0.27,-2.37,-0.60,-3.03],['c',-0.24,-0.48,-0.54,-0.78,-0.93,-0.90],['z']],w:10.78,h:14.959}, - '1':{d:[['M',3.30,-15.06],['c',0.06,-0.06,0.21,-0.03,0.66,0.15],['c',0.81,0.39,1.08,0.39,1.83,0.03],['c',0.21,-0.09,0.39,-0.15,0.42,-0.15],['c',0.12,0.00,0.21,0.09,0.27,0.21],['c',0.06,0.12,0.06,0.33,0.06,5.94],['c',0.00,3.93,0.00,5.85,0.03,6.03],['c',0.06,0.36,0.15,0.69,0.27,0.96],['c',0.36,0.75,0.93,1.17,1.68,1.26],['c',0.30,0.03,0.39,0.09,0.39,0.30],['c',0.00,0.15,-0.03,0.18,-0.09,0.24],['c',-0.06,0.06,-0.09,0.06,-0.48,0.06],['c',-0.42,0.00,-0.69,-0.03,-2.10,-0.24],['c',-0.90,-0.15,-1.77,-0.15,-2.67,0.00],['c',-1.41,0.21,-1.68,0.24,-2.10,0.24],['c',-0.39,0.00,-0.42,0.00,-0.48,-0.06],['c',-0.06,-0.06,-0.06,-0.09,-0.06,-0.24],['c',0.00,-0.21,0.06,-0.27,0.36,-0.30],['c',0.75,-0.09,1.32,-0.51,1.68,-1.26],['c',0.12,-0.27,0.21,-0.60,0.27,-0.96],['c',0.03,-0.18,0.03,-1.59,0.03,-4.29],['c',0.00,-3.87,0.00,-4.05,-0.06,-4.14],['c',-0.09,-0.15,-0.18,-0.24,-0.39,-0.24],['c',-0.12,0.00,-0.15,0.03,-0.21,0.06],['c',-0.03,0.06,-0.45,0.99,-0.96,2.13],['c',-0.48,1.14,-0.90,2.10,-0.93,2.16],['c',-0.06,0.15,-0.21,0.24,-0.33,0.24],['c',-0.24,0.00,-0.42,-0.18,-0.42,-0.39],['c',0.00,-0.06,3.27,-7.62,3.33,-7.74],['z']],w:8.94,h:15.058}, - '2':{d:[['M',4.23,-14.97],['c',0.57,-0.06,1.68,0.00,2.34,0.18],['c',0.69,0.18,1.50,0.54,2.01,0.90],['c',1.35,0.96,1.95,2.25,1.77,3.81],['c',-0.15,1.35,-0.66,2.34,-1.68,3.15],['c',-0.60,0.48,-1.44,0.93,-3.12,1.65],['c',-1.32,0.57,-1.80,0.81,-2.37,1.14],['c',-0.57,0.33,-0.57,0.33,-0.24,0.27],['c',0.39,-0.09,1.26,-0.09,1.68,0.00],['c',0.72,0.15,1.41,0.45,2.10,0.90],['c',0.99,0.63,1.86,0.87,2.55,0.75],['c',0.24,-0.06,0.42,-0.15,0.57,-0.30],['c',0.12,-0.09,0.30,-0.42,0.30,-0.51],['c',0.00,-0.09,0.12,-0.21,0.24,-0.24],['c',0.18,-0.03,0.39,0.12,0.39,0.30],['c',0.00,0.12,-0.15,0.57,-0.30,0.87],['c',-0.54,1.02,-1.56,1.74,-2.79,2.01],['c',-0.42,0.09,-1.23,0.09,-1.62,0.03],['c',-0.81,-0.18,-1.32,-0.45,-2.01,-1.11],['c',-0.45,-0.45,-0.63,-0.57,-0.96,-0.69],['c',-0.84,-0.27,-1.89,0.12,-2.25,0.90],['c',-0.12,0.21,-0.21,0.54,-0.21,0.72],['c',0.00,0.12,-0.12,0.21,-0.27,0.24],['c',-0.15,0.00,-0.27,-0.03,-0.33,-0.15],['c',-0.09,-0.21,0.09,-1.08,0.33,-1.71],['c',0.24,-0.66,0.66,-1.26,1.29,-1.89],['c',0.45,-0.45,0.90,-0.81,1.92,-1.56],['c',1.29,-0.93,1.89,-1.44,2.34,-1.98],['c',0.87,-1.05,1.26,-2.19,1.20,-3.63],['c',-0.06,-1.29,-0.39,-2.31,-0.96,-2.91],['c',-0.36,-0.33,-0.72,-0.51,-1.17,-0.54],['c',-0.84,-0.03,-1.53,0.42,-1.59,1.05],['c',-0.03,0.33,0.12,0.60,0.57,1.14],['c',0.45,0.54,0.54,0.87,0.42,1.41],['c',-0.15,0.63,-0.54,1.11,-1.08,1.38],['c',-0.63,0.33,-1.20,0.33,-1.83,0.00],['c',-0.24,-0.12,-0.33,-0.18,-0.54,-0.39],['c',-0.18,-0.18,-0.27,-0.30,-0.36,-0.51],['c',-0.24,-0.45,-0.27,-0.84,-0.21,-1.38],['c',0.12,-0.75,0.45,-1.41,1.02,-1.98],['c',0.72,-0.72,1.74,-1.17,2.85,-1.32],['z']],w:10.764,h:14.97}, - '3':{d:[['M',3.78,-14.97],['c',0.30,-0.03,1.41,0.00,1.83,0.06],['c',2.22,0.30,3.51,1.32,3.72,2.91],['c',0.03,0.33,0.03,1.26,-0.03,1.65],['c',-0.12,0.84,-0.48,1.47,-1.05,1.77],['c',-0.27,0.15,-0.36,0.24,-0.45,0.39],['c',-0.09,0.21,-0.09,0.36,0.00,0.57],['c',0.09,0.15,0.18,0.24,0.51,0.39],['c',0.75,0.42,1.23,1.14,1.41,2.13],['c',0.06,0.42,0.06,1.35,0.00,1.71],['c',-0.18,0.81,-0.48,1.38,-1.02,1.95],['c',-0.75,0.72,-1.80,1.20,-3.18,1.38],['c',-0.42,0.06,-1.56,0.06,-1.95,0.00],['c',-1.89,-0.33,-3.18,-1.29,-3.51,-2.64],['c',-0.03,-0.12,-0.03,-0.33,-0.03,-0.60],['c',0.00,-0.36,0.00,-0.42,0.06,-0.63],['c',0.12,-0.30,0.27,-0.51,0.51,-0.75],['c',0.24,-0.24,0.45,-0.39,0.75,-0.51],['c',0.21,-0.06,0.27,-0.06,0.60,-0.06],['c',0.33,0.00,0.39,0.00,0.60,0.06],['c',0.30,0.12,0.51,0.27,0.75,0.51],['c',0.36,0.33,0.57,0.75,0.60,1.20],['c',0.00,0.21,0.00,0.27,-0.06,0.42],['c',-0.09,0.18,-0.12,0.24,-0.54,0.54],['c',-0.51,0.36,-0.63,0.54,-0.60,0.87],['c',0.06,0.54,0.54,0.90,1.38,0.99],['c',0.36,0.06,0.72,0.03,0.96,-0.06],['c',0.81,-0.27,1.29,-1.23,1.44,-2.79],['c',0.03,-0.45,0.03,-1.95,-0.03,-2.37],['c',-0.09,-0.75,-0.33,-1.23,-0.75,-1.44],['c',-0.33,-0.18,-0.45,-0.18,-1.98,-0.18],['c',-1.35,0.00,-1.41,0.00,-1.50,-0.06],['c',-0.18,-0.12,-0.24,-0.39,-0.12,-0.60],['c',0.12,-0.15,0.15,-0.15,1.68,-0.15],['c',1.50,0.00,1.62,0.00,1.89,-0.15],['c',0.18,-0.09,0.42,-0.36,0.54,-0.57],['c',0.18,-0.42,0.27,-0.90,0.30,-1.95],['c',0.03,-1.20,-0.06,-1.80,-0.36,-2.37],['c',-0.24,-0.48,-0.63,-0.81,-1.14,-0.96],['c',-0.30,-0.06,-1.08,-0.06,-1.38,0.03],['c',-0.60,0.15,-0.90,0.42,-0.96,0.84],['c',-0.03,0.30,0.06,0.45,0.63,0.84],['c',0.33,0.24,0.42,0.39,0.45,0.63],['c',0.03,0.72,-0.57,1.50,-1.32,1.65],['c',-1.05,0.27,-2.10,-0.57,-2.10,-1.65],['c',0.00,-0.45,0.15,-0.96,0.39,-1.38],['c',0.12,-0.21,0.54,-0.63,0.81,-0.81],['c',0.57,-0.42,1.38,-0.69,2.25,-0.81],['z']],w:9.735,h:14.967}, - '4':{d:[['M',8.64,-14.94],['c',0.27,-0.09,0.42,-0.12,0.54,-0.03],['c',0.09,0.06,0.15,0.21,0.15,0.30],['c',-0.03,0.06,-1.92,2.31,-4.23,5.04],['c',-2.31,2.73,-4.23,4.98,-4.26,5.01],['c',-0.03,0.06,0.12,0.06,2.55,0.06],['l',2.61,0.00],['l',0.00,-2.37],['c',0.00,-2.19,0.03,-2.37,0.06,-2.46],['c',0.03,-0.06,0.21,-0.18,0.57,-0.42],['c',1.08,-0.72,1.38,-1.08,1.86,-2.16],['c',0.12,-0.30,0.24,-0.54,0.27,-0.57],['c',0.12,-0.12,0.39,-0.06,0.45,0.12],['c',0.06,0.09,0.06,0.57,0.06,3.96],['l',0.00,3.90],['l',1.08,0.00],['c',1.05,0.00,1.11,0.00,1.20,0.06],['c',0.24,0.15,0.24,0.54,0.00,0.69],['c',-0.09,0.06,-0.15,0.06,-1.20,0.06],['l',-1.08,0.00],['l',0.00,0.33],['c',0.00,0.57,0.09,1.11,0.30,1.53],['c',0.36,0.75,0.93,1.17,1.68,1.26],['c',0.30,0.03,0.39,0.09,0.39,0.30],['c',0.00,0.15,-0.03,0.18,-0.09,0.24],['c',-0.06,0.06,-0.09,0.06,-0.48,0.06],['c',-0.42,0.00,-0.69,-0.03,-2.10,-0.24],['c',-0.90,-0.15,-1.77,-0.15,-2.67,0.00],['c',-1.41,0.21,-1.68,0.24,-2.10,0.24],['c',-0.39,0.00,-0.42,0.00,-0.48,-0.06],['c',-0.06,-0.06,-0.06,-0.09,-0.06,-0.24],['c',0.00,-0.21,0.06,-0.27,0.36,-0.30],['c',0.75,-0.09,1.32,-0.51,1.68,-1.26],['c',0.21,-0.42,0.30,-0.96,0.30,-1.53],['l',0.00,-0.33],['l',-2.70,0.00],['c',-2.91,0.00,-2.85,0.00,-3.09,-0.15],['c',-0.18,-0.12,-0.30,-0.39,-0.27,-0.54],['c',0.03,-0.06,0.18,-0.24,0.33,-0.45],['c',0.75,-0.90,1.59,-2.07,2.13,-3.03],['c',0.33,-0.54,0.84,-1.62,1.05,-2.16],['c',0.57,-1.41,0.84,-2.64,0.90,-4.05],['c',0.03,-0.63,0.06,-0.72,0.24,-0.81],['l',0.12,-0.06],['l',0.45,0.12],['c',0.66,0.18,1.02,0.24,1.47,0.27],['c',0.60,0.03,1.23,-0.09,2.01,-0.33],['z']],w:11.795,h:14.994}, - '5':{d:[['M',1.02,-14.94],['c',0.12,-0.09,0.03,-0.09,1.08,0.06],['c',2.49,0.36,4.35,0.36,6.96,-0.06],['c',0.57,-0.09,0.66,-0.06,0.81,0.06],['c',0.15,0.18,0.12,0.24,-0.15,0.51],['c',-1.29,1.26,-3.24,2.04,-5.58,2.31],['c',-0.60,0.09,-1.20,0.12,-1.71,0.12],['c',-0.39,0.00,-0.45,0.00,-0.57,0.06],['c',-0.09,0.06,-0.15,0.12,-0.21,0.21],['l',-0.06,0.12],['l',0.00,1.65],['l',0.00,1.65],['l',0.21,-0.21],['c',0.66,-0.57,1.41,-0.96,2.19,-1.14],['c',0.33,-0.06,1.41,-0.06,1.95,0.00],['c',2.61,0.36,4.02,1.74,4.26,4.14],['c',0.03,0.45,0.03,1.08,-0.03,1.44],['c',-0.18,1.02,-0.78,2.01,-1.59,2.70],['c',-0.72,0.57,-1.62,1.02,-2.49,1.20],['c',-1.38,0.27,-3.03,0.06,-4.20,-0.54],['c',-1.08,-0.54,-1.71,-1.32,-1.86,-2.28],['c',-0.09,-0.69,0.09,-1.29,0.57,-1.74],['c',0.24,-0.24,0.45,-0.39,0.75,-0.51],['c',0.21,-0.06,0.27,-0.06,0.60,-0.06],['c',0.33,0.00,0.39,0.00,0.60,0.06],['c',0.30,0.12,0.51,0.27,0.75,0.51],['c',0.36,0.33,0.57,0.75,0.60,1.20],['c',0.00,0.21,0.00,0.27,-0.06,0.42],['c',-0.09,0.18,-0.12,0.24,-0.54,0.54],['c',-0.18,0.12,-0.36,0.30,-0.42,0.33],['c',-0.36,0.42,-0.18,0.99,0.36,1.26],['c',0.51,0.27,1.47,0.36,2.01,0.27],['c',0.93,-0.21,1.47,-1.17,1.65,-2.91],['c',0.06,-0.45,0.06,-1.89,0.00,-2.31],['c',-0.15,-1.20,-0.51,-2.10,-1.05,-2.55],['c',-0.21,-0.18,-0.54,-0.36,-0.81,-0.39],['c',-0.30,-0.06,-0.84,-0.03,-1.26,0.06],['c',-0.93,0.18,-1.65,0.60,-2.16,1.20],['c',-0.15,0.21,-0.27,0.30,-0.39,0.30],['c',-0.15,0.00,-0.30,-0.09,-0.36,-0.18],['c',-0.06,-0.09,-0.06,-0.15,-0.06,-3.66],['c',0.00,-3.39,0.00,-3.57,0.06,-3.66],['c',0.03,-0.06,0.09,-0.15,0.15,-0.18],['z']],w:10.212,h:14.997}, - '6':{d:[['M',4.98,-14.97],['c',0.36,-0.03,1.20,0.00,1.59,0.06],['c',0.90,0.15,1.68,0.51,2.25,1.05],['c',0.57,0.51,0.87,1.23,0.84,1.98],['c',-0.03,0.51,-0.21,0.90,-0.60,1.26],['c',-0.24,0.24,-0.45,0.39,-0.75,0.51],['c',-0.21,0.06,-0.27,0.06,-0.60,0.06],['c',-0.33,0.00,-0.39,0.00,-0.60,-0.06],['c',-0.30,-0.12,-0.51,-0.27,-0.75,-0.51],['c',-0.39,-0.36,-0.57,-0.78,-0.57,-1.26],['c',0.00,-0.27,0.00,-0.30,0.09,-0.42],['c',0.03,-0.09,0.18,-0.21,0.30,-0.30],['c',0.12,-0.09,0.30,-0.21,0.39,-0.27],['c',0.09,-0.06,0.21,-0.18,0.27,-0.24],['c',0.06,-0.12,0.09,-0.15,0.09,-0.33],['c',0.00,-0.18,-0.03,-0.24,-0.09,-0.36],['c',-0.24,-0.39,-0.75,-0.60,-1.38,-0.57],['c',-0.54,0.03,-0.90,0.18,-1.23,0.48],['c',-0.81,0.72,-1.08,2.16,-0.96,5.37],['l',0.00,0.63],['l',0.30,-0.12],['c',0.78,-0.27,1.29,-0.33,2.10,-0.27],['c',1.47,0.12,2.49,0.54,3.27,1.29],['c',0.48,0.51,0.81,1.11,0.96,1.89],['c',0.06,0.27,0.06,0.42,0.06,0.93],['c',0.00,0.54,0.00,0.69,-0.06,0.96],['c',-0.15,0.78,-0.48,1.38,-0.96,1.89],['c',-0.54,0.51,-1.17,0.87,-1.98,1.08],['c',-1.14,0.30,-2.40,0.33,-3.24,0.03],['c',-1.50,-0.48,-2.64,-1.89,-3.27,-4.02],['c',-0.36,-1.23,-0.51,-2.82,-0.42,-4.08],['c',0.30,-3.66,2.28,-6.30,4.95,-6.66],['z'],['m',0.66,7.41],['c',-0.27,-0.09,-0.81,-0.12,-1.08,-0.06],['c',-0.72,0.18,-1.08,0.69,-1.23,1.71],['c',-0.06,0.54,-0.06,3.00,0.00,3.54],['c',0.18,1.26,0.72,1.77,1.80,1.74],['c',0.39,-0.03,0.63,-0.09,0.90,-0.27],['c',0.66,-0.42,0.90,-1.32,0.90,-3.24],['c',0.00,-2.22,-0.36,-3.12,-1.29,-3.42],['z']],w:9.956,h:14.982}, - '7':{d:[['M',0.21,-14.97],['c',0.21,-0.06,0.45,0.00,0.54,0.15],['c',0.06,0.09,0.06,0.15,0.06,0.39],['c',0.00,0.24,0.00,0.33,0.06,0.42],['c',0.06,0.12,0.21,0.24,0.27,0.24],['c',0.03,0.00,0.12,-0.12,0.24,-0.21],['c',0.96,-1.20,2.58,-1.35,3.99,-0.42],['c',0.15,0.12,0.42,0.30,0.54,0.45],['c',0.48,0.39,0.81,0.57,1.29,0.60],['c',0.69,0.03,1.50,-0.30,2.13,-0.87],['c',0.09,-0.09,0.27,-0.30,0.39,-0.45],['c',0.12,-0.15,0.24,-0.27,0.30,-0.30],['c',0.18,-0.06,0.39,0.03,0.51,0.21],['c',0.06,0.18,0.06,0.24,-0.27,0.72],['c',-0.18,0.24,-0.54,0.78,-0.78,1.17],['c',-2.37,3.54,-3.54,6.27,-3.87,9.00],['c',-0.03,0.33,-0.03,0.66,-0.03,1.26],['c',0.00,0.90,0.00,1.08,0.15,1.89],['c',0.06,0.45,0.06,0.48,0.03,0.60],['c',-0.06,0.09,-0.21,0.21,-0.30,0.21],['c',-0.03,0.00,-0.27,-0.06,-0.54,-0.15],['c',-0.84,-0.27,-1.11,-0.30,-1.65,-0.30],['c',-0.57,0.00,-0.84,0.03,-1.56,0.27],['c',-0.60,0.18,-0.69,0.21,-0.81,0.15],['c',-0.12,-0.06,-0.21,-0.18,-0.21,-0.30],['c',0.00,-0.15,0.60,-1.44,1.20,-2.61],['c',1.14,-2.22,2.73,-4.68,5.10,-8.01],['c',0.21,-0.27,0.36,-0.48,0.33,-0.48],['c',0.00,0.00,-0.12,0.06,-0.27,0.12],['c',-0.54,0.30,-0.99,0.39,-1.56,0.39],['c',-0.75,0.03,-1.20,-0.18,-1.83,-0.75],['c',-0.99,-0.90,-1.83,-1.17,-2.31,-0.72],['c',-0.18,0.15,-0.36,0.51,-0.45,0.84],['c',-0.06,0.24,-0.06,0.33,-0.09,1.98],['c',0.00,1.62,-0.03,1.74,-0.06,1.80],['c',-0.15,0.24,-0.54,0.24,-0.69,0.00],['c',-0.06,-0.09,-0.06,-0.15,-0.06,-3.57],['c',0.00,-3.42,0.00,-3.48,0.06,-3.57],['c',0.03,-0.06,0.09,-0.12,0.15,-0.15],['z']],w:10.561,h:15.093}, - '8':{d:[['M',4.98,-14.97],['c',0.33,-0.03,1.02,-0.03,1.32,0.00],['c',1.32,0.12,2.49,0.60,3.21,1.32],['c',0.39,0.39,0.66,0.81,0.78,1.29],['c',0.09,0.36,0.09,1.08,0.00,1.44],['c',-0.21,0.84,-0.66,1.59,-1.59,2.55],['l',-0.30,0.30],['l',0.27,0.18],['c',1.47,0.93,2.31,2.31,2.25,3.75],['c',-0.03,0.75,-0.24,1.35,-0.63,1.95],['c',-0.45,0.66,-1.02,1.14,-1.83,1.53],['c',-1.80,0.87,-4.20,0.87,-6.00,0.03],['c',-1.62,-0.78,-2.52,-2.16,-2.46,-3.66],['c',0.06,-0.99,0.54,-1.77,1.80,-2.97],['c',0.54,-0.51,0.54,-0.54,0.48,-0.57],['c',-0.39,-0.27,-0.96,-0.78,-1.20,-1.14],['c',-0.75,-1.11,-0.87,-2.40,-0.30,-3.60],['c',0.69,-1.35,2.25,-2.25,4.20,-2.40],['z'],['m',1.53,0.69],['c',-0.42,-0.09,-1.11,-0.12,-1.38,-0.06],['c',-0.30,0.06,-0.60,0.18,-0.81,0.30],['c',-0.21,0.12,-0.60,0.51,-0.72,0.72],['c',-0.51,0.87,-0.42,1.89,0.21,2.52],['c',0.21,0.21,0.36,0.30,1.95,1.23],['c',0.96,0.54,1.74,0.99,1.77,1.02],['c',0.09,0.00,0.63,-0.60,0.99,-1.11],['c',0.21,-0.36,0.48,-0.87,0.57,-1.23],['c',0.06,-0.24,0.06,-0.36,0.06,-0.72],['c',0.00,-0.45,-0.03,-0.66,-0.15,-0.99],['c',-0.39,-0.81,-1.29,-1.44,-2.49,-1.68],['z'],['m',-1.44,8.07],['l',-1.89,-1.08],['c',-0.03,0.00,-0.18,0.15,-0.39,0.33],['c',-1.20,1.08,-1.65,1.95,-1.59,3.00],['c',0.09,1.59,1.35,2.85,3.21,3.24],['c',0.33,0.06,0.45,0.06,0.93,0.06],['c',0.63,0.00,0.81,-0.03,1.29,-0.27],['c',0.90,-0.42,1.47,-1.41,1.41,-2.40],['c',-0.06,-0.66,-0.39,-1.29,-0.90,-1.65],['c',-0.12,-0.09,-1.05,-0.63,-2.07,-1.23],['z']],w:10.926,h:14.989}, - '9':{d:[['M',4.23,-14.97],['c',0.42,-0.03,1.29,0.00,1.62,0.06],['c',0.51,0.12,0.93,0.30,1.38,0.57],['c',1.53,1.02,2.52,3.24,2.73,5.94],['c',0.18,2.55,-0.48,4.98,-1.83,6.57],['c',-1.05,1.26,-2.40,1.89,-3.93,1.83],['c',-1.23,-0.06,-2.31,-0.45,-3.03,-1.14],['c',-0.57,-0.51,-0.87,-1.23,-0.84,-1.98],['c',0.03,-0.51,0.21,-0.90,0.60,-1.26],['c',0.24,-0.24,0.45,-0.39,0.75,-0.51],['c',0.21,-0.06,0.27,-0.06,0.60,-0.06],['c',0.33,0.00,0.39,0.00,0.60,0.06],['c',0.30,0.12,0.51,0.27,0.75,0.51],['c',0.39,0.36,0.57,0.78,0.57,1.26],['c',0.00,0.27,0.00,0.30,-0.09,0.42],['c',-0.03,0.09,-0.18,0.21,-0.30,0.30],['c',-0.12,0.09,-0.30,0.21,-0.39,0.27],['c',-0.09,0.06,-0.21,0.18,-0.27,0.24],['c',-0.06,0.12,-0.06,0.15,-0.06,0.33],['c',0.00,0.18,0.00,0.24,0.06,0.36],['c',0.24,0.39,0.75,0.60,1.38,0.57],['c',0.54,-0.03,0.90,-0.18,1.23,-0.48],['c',0.81,-0.72,1.08,-2.16,0.96,-5.37],['l',0.00,-0.63],['l',-0.30,0.12],['c',-0.78,0.27,-1.29,0.33,-2.10,0.27],['c',-1.47,-0.12,-2.49,-0.54,-3.27,-1.29],['c',-0.48,-0.51,-0.81,-1.11,-0.96,-1.89],['c',-0.06,-0.27,-0.06,-0.42,-0.06,-0.96],['c',0.00,-0.51,0.00,-0.66,0.06,-0.93],['c',0.15,-0.78,0.48,-1.38,0.96,-1.89],['c',0.15,-0.12,0.33,-0.27,0.42,-0.36],['c',0.69,-0.51,1.62,-0.81,2.76,-0.93],['z'],['m',1.17,0.66],['c',-0.21,-0.06,-0.57,-0.06,-0.81,-0.03],['c',-0.78,0.12,-1.26,0.69,-1.41,1.74],['c',-0.12,0.63,-0.15,1.95,-0.09,2.79],['c',0.12,1.71,0.63,2.40,1.77,2.46],['c',1.08,0.03,1.62,-0.48,1.80,-1.74],['c',0.06,-0.54,0.06,-3.00,0.00,-3.54],['c',-0.15,-1.05,-0.51,-1.53,-1.26,-1.68],['z']],w:9.959,h:14.986}, - 'rests.multimeasure':{d:[['M',0,-4],['l',0,16],['l',1,0],['l',0,-5],['l',40,0],['l',0,5],['l',1,0],['l',0,-16],['l',-1,0],['l',0,5],['l',-40,0],['l',0,-5],['z']],w:42,h:18}, - 'rests.whole':{d:[['M',0.06,0.03],['l',0.09,-0.06],['l',5.46,0.00],['l',5.49,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,2.19],['l',0.00,2.19],['l',-0.06,0.09],['l',-0.09,0.06],['l',-5.49,0.00],['l',-5.46,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-2.19],['l',0.00,-2.19],['z']],w:11.25,h:4.68}, - 'rests.half':{d:[['M',0.06,-4.62],['l',0.09,-0.06],['l',5.46,0.00],['l',5.49,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,2.19],['l',0.00,2.19],['l',-0.06,0.09],['l',-0.09,0.06],['l',-5.49,0.00],['l',-5.46,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-2.19],['l',0.00,-2.19],['z']],w:11.25,h:4.68}, - 'rests.quarter':{d:[['M',1.89,-11.82],['c',0.12,-0.06,0.24,-0.06,0.36,-0.03],['c',0.09,0.06,4.74,5.58,4.86,5.82],['c',0.21,0.39,0.15,0.78,-0.15,1.26],['c',-0.24,0.33,-0.72,0.81,-1.62,1.56],['c',-0.45,0.36,-0.87,0.75,-0.96,0.84],['c',-0.93,0.99,-1.14,2.49,-0.60,3.63],['c',0.18,0.39,0.27,0.48,1.32,1.68],['c',1.92,2.25,1.83,2.16,1.83,2.34],['c',0.00,0.18,-0.18,0.36,-0.36,0.39],['c',-0.15,0.00,-0.27,-0.06,-0.48,-0.27],['c',-0.75,-0.75,-2.46,-1.29,-3.39,-1.08],['c',-0.45,0.09,-0.69,0.27,-0.90,0.69],['c',-0.12,0.30,-0.21,0.66,-0.24,1.14],['c',-0.03,0.66,0.09,1.35,0.30,2.01],['c',0.15,0.42,0.24,0.66,0.45,0.96],['c',0.18,0.24,0.18,0.33,0.03,0.42],['c',-0.12,0.06,-0.18,0.03,-0.45,-0.30],['c',-1.08,-1.38,-2.07,-3.36,-2.40,-4.83],['c',-0.27,-1.05,-0.15,-1.77,0.27,-2.07],['c',0.21,-0.12,0.42,-0.15,0.87,-0.15],['c',0.87,0.06,2.10,0.39,3.30,0.90],['l',0.39,0.18],['l',-1.65,-1.95],['c',-2.52,-2.97,-2.61,-3.09,-2.70,-3.27],['c',-0.09,-0.24,-0.12,-0.48,-0.03,-0.75],['c',0.15,-0.48,0.57,-0.96,1.83,-2.01],['c',0.45,-0.36,0.84,-0.72,0.93,-0.78],['c',0.69,-0.75,1.02,-1.80,0.90,-2.79],['c',-0.06,-0.33,-0.21,-0.84,-0.39,-1.11],['c',-0.09,-0.15,-0.45,-0.60,-0.81,-1.05],['c',-0.36,-0.42,-0.69,-0.81,-0.72,-0.87],['c',-0.09,-0.18,0.00,-0.42,0.21,-0.51],['z']],w:7.888,h:21.435}, - 'rests.8th':{d:[['M',1.68,-6.12],['c',0.66,-0.09,1.23,0.09,1.68,0.51],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.12,0.27,0.33,0.45,0.60,0.48],['c',0.12,0.00,0.18,0.00,0.33,-0.09],['c',0.39,-0.18,1.32,-1.29,1.68,-1.98],['c',0.09,-0.21,0.24,-0.30,0.39,-0.30],['c',0.12,0.00,0.27,0.09,0.33,0.18],['c',0.03,0.06,-0.27,1.11,-1.86,6.42],['c',-1.02,3.48,-1.89,6.39,-1.92,6.42],['c',0.00,0.03,-0.12,0.12,-0.24,0.15],['c',-0.18,0.09,-0.21,0.09,-0.45,0.09],['c',-0.24,0.00,-0.30,0.00,-0.48,-0.06],['c',-0.09,-0.06,-0.21,-0.12,-0.21,-0.15],['c',-0.06,-0.03,0.15,-0.57,1.68,-4.92],['c',0.96,-2.67,1.74,-4.89,1.71,-4.89],['l',-0.51,0.15],['c',-1.08,0.36,-1.74,0.48,-2.55,0.48],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.33,-0.45,0.84,-0.81,1.38,-0.90],['z']],w:7.534,h:13.883}, - 'rests.16th':{d:[['M',3.33,-6.12],['c',0.66,-0.09,1.23,0.09,1.68,0.51],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.15,0.39,0.57,0.57,0.87,0.42],['c',0.39,-0.18,1.20,-1.23,1.62,-2.07],['c',0.06,-0.15,0.24,-0.24,0.36,-0.24],['c',0.12,0.00,0.27,0.09,0.33,0.18],['c',0.03,0.06,-0.45,1.86,-2.67,10.17],['c',-1.50,5.55,-2.73,10.14,-2.76,10.17],['c',-0.03,0.03,-0.12,0.12,-0.24,0.15],['c',-0.18,0.09,-0.21,0.09,-0.45,0.09],['c',-0.24,0.00,-0.30,0.00,-0.48,-0.06],['c',-0.09,-0.06,-0.21,-0.12,-0.21,-0.15],['c',-0.06,-0.03,0.12,-0.57,1.44,-4.92],['c',0.81,-2.67,1.47,-4.86,1.47,-4.89],['c',-0.03,0.00,-0.27,0.06,-0.54,0.15],['c',-1.08,0.36,-1.77,0.48,-2.58,0.48],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.72,-1.05,2.22,-1.23,3.06,-0.42],['c',0.30,0.33,0.42,0.60,0.60,1.38],['c',0.09,0.45,0.21,0.78,0.33,0.90],['c',0.09,0.09,0.27,0.18,0.45,0.21],['c',0.12,0.00,0.18,0.00,0.33,-0.09],['c',0.33,-0.15,1.02,-0.93,1.41,-1.59],['c',0.12,-0.21,0.18,-0.39,0.39,-1.08],['c',0.66,-2.10,1.17,-3.84,1.17,-3.87],['c',0.00,0.00,-0.21,0.06,-0.42,0.15],['c',-0.51,0.15,-1.20,0.33,-1.68,0.42],['c',-0.33,0.06,-0.51,0.06,-0.96,0.06],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.33,-0.45,0.84,-0.81,1.38,-0.90],['z']],w:9.724,h:21.383}, - 'rests.32nd':{d:[['M',4.23,-13.62],['c',0.66,-0.09,1.23,0.09,1.68,0.51],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.12,0.27,0.33,0.45,0.60,0.48],['c',0.12,0.00,0.18,0.00,0.27,-0.06],['c',0.33,-0.21,0.99,-1.11,1.44,-1.98],['c',0.09,-0.24,0.21,-0.33,0.39,-0.33],['c',0.12,0.00,0.27,0.09,0.33,0.18],['c',0.03,0.06,-0.57,2.67,-3.21,13.89],['c',-1.80,7.62,-3.30,13.89,-3.30,13.92],['c',-0.03,0.06,-0.12,0.12,-0.24,0.18],['c',-0.21,0.09,-0.24,0.09,-0.48,0.09],['c',-0.24,0.00,-0.30,0.00,-0.48,-0.06],['c',-0.09,-0.06,-0.21,-0.12,-0.21,-0.15],['c',-0.06,-0.03,0.09,-0.57,1.23,-4.92],['c',0.69,-2.67,1.26,-4.86,1.29,-4.89],['c',0.00,-0.03,-0.12,-0.03,-0.48,0.12],['c',-1.17,0.39,-2.22,0.57,-3.00,0.54],['c',-0.42,-0.03,-0.75,-0.12,-1.11,-0.30],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.72,-1.05,2.22,-1.23,3.06,-0.42],['c',0.30,0.33,0.42,0.60,0.60,1.38],['c',0.09,0.45,0.21,0.78,0.33,0.90],['c',0.12,0.09,0.30,0.18,0.48,0.21],['c',0.12,0.00,0.18,0.00,0.30,-0.09],['c',0.42,-0.21,1.29,-1.29,1.56,-1.89],['c',0.03,-0.12,1.23,-4.59,1.23,-4.65],['c',0.00,-0.03,-0.18,0.03,-0.39,0.12],['c',-0.63,0.18,-1.20,0.36,-1.74,0.45],['c',-0.39,0.06,-0.54,0.06,-1.02,0.06],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.72,-1.05,2.22,-1.23,3.06,-0.42],['c',0.30,0.33,0.42,0.60,0.60,1.38],['c',0.09,0.45,0.21,0.78,0.33,0.90],['c',0.18,0.18,0.51,0.27,0.72,0.15],['c',0.30,-0.12,0.69,-0.57,1.08,-1.17],['c',0.42,-0.60,0.39,-0.51,1.05,-3.03],['c',0.33,-1.26,0.60,-2.31,0.60,-2.34],['c',0.00,0.00,-0.21,0.03,-0.45,0.12],['c',-0.57,0.18,-1.14,0.33,-1.62,0.42],['c',-0.33,0.06,-0.51,0.06,-0.96,0.06],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.33,-0.45,0.84,-0.81,1.38,-0.90],['z']],w:11.373,h:28.883}, - 'rests.64th':{d:[['M',5.13,-13.62],['c',0.66,-0.09,1.23,0.09,1.68,0.51],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.15,0.63,0.21,0.81,0.33,0.96],['c',0.18,0.21,0.54,0.30,0.75,0.18],['c',0.24,-0.12,0.63,-0.66,1.08,-1.56],['c',0.33,-0.66,0.39,-0.72,0.60,-0.72],['c',0.12,0.00,0.27,0.09,0.33,0.18],['c',0.03,0.06,-0.69,3.66,-3.54,17.64],['c',-1.95,9.66,-3.57,17.61,-3.57,17.64],['c',-0.03,0.06,-0.12,0.12,-0.24,0.18],['c',-0.21,0.09,-0.24,0.09,-0.48,0.09],['c',-0.24,0.00,-0.30,0.00,-0.48,-0.06],['c',-0.09,-0.06,-0.21,-0.12,-0.21,-0.15],['c',-0.06,-0.03,0.06,-0.57,1.05,-4.95],['c',0.60,-2.70,1.08,-4.89,1.08,-4.92],['c',0.00,0.00,-0.24,0.06,-0.51,0.15],['c',-0.66,0.24,-1.20,0.36,-1.77,0.48],['c',-0.42,0.06,-0.57,0.06,-1.05,0.06],['c',-0.69,0.00,-0.87,-0.03,-1.35,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.72,-1.05,2.22,-1.23,3.06,-0.42],['c',0.30,0.33,0.42,0.60,0.60,1.38],['c',0.09,0.45,0.21,0.78,0.33,0.90],['c',0.09,0.09,0.27,0.18,0.45,0.21],['c',0.21,0.03,0.39,-0.09,0.72,-0.42],['c',0.45,-0.45,1.02,-1.26,1.17,-1.65],['c',0.03,-0.09,0.27,-1.14,0.54,-2.34],['c',0.27,-1.20,0.48,-2.19,0.51,-2.22],['c',0.00,-0.03,-0.09,-0.03,-0.48,0.12],['c',-1.17,0.39,-2.22,0.57,-3.00,0.54],['c',-0.42,-0.03,-0.75,-0.12,-1.11,-0.30],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.15,0.39,0.57,0.57,0.90,0.42],['c',0.36,-0.18,1.20,-1.26,1.47,-1.89],['c',0.03,-0.09,0.30,-1.20,0.57,-2.43],['l',0.51,-2.28],['l',-0.54,0.18],['c',-1.11,0.36,-1.80,0.48,-2.61,0.48],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.15,0.63,0.21,0.81,0.33,0.96],['c',0.21,0.21,0.54,0.30,0.75,0.18],['c',0.36,-0.18,0.93,-0.93,1.29,-1.68],['c',0.12,-0.24,0.18,-0.48,0.63,-2.55],['l',0.51,-2.31],['c',0.00,-0.03,-0.18,0.03,-0.39,0.12],['c',-1.14,0.36,-2.10,0.54,-2.82,0.51],['c',-0.42,-0.03,-0.75,-0.12,-1.11,-0.30],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.33,-0.45,0.84,-0.81,1.38,-0.90],['z']],w:12.453,h:36.383}, - 'rests.128th':{d:[['M',6.03,-21.12],['c',0.66,-0.09,1.23,0.09,1.68,0.51],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.12,0.27,0.33,0.45,0.60,0.48],['c',0.21,0.00,0.33,-0.06,0.54,-0.36],['c',0.15,-0.21,0.54,-0.93,0.78,-1.47],['c',0.15,-0.33,0.18,-0.39,0.30,-0.48],['c',0.18,-0.09,0.45,0.00,0.51,0.15],['c',0.03,0.09,-7.11,42.75,-7.17,42.84],['c',-0.03,0.03,-0.15,0.09,-0.24,0.15],['c',-0.18,0.06,-0.24,0.06,-0.45,0.06],['c',-0.24,0.00,-0.30,0.00,-0.48,-0.06],['c',-0.09,-0.06,-0.21,-0.12,-0.21,-0.15],['c',-0.06,-0.03,0.03,-0.57,0.84,-4.98],['c',0.51,-2.70,0.93,-4.92,0.90,-4.92],['c',0.00,0.00,-0.15,0.06,-0.36,0.12],['c',-0.78,0.27,-1.62,0.48,-2.31,0.57],['c',-0.15,0.03,-0.54,0.03,-0.81,0.03],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.12,0.27,0.33,0.45,0.63,0.48],['c',0.12,0.00,0.18,0.00,0.30,-0.09],['c',0.42,-0.21,1.14,-1.11,1.50,-1.83],['c',0.12,-0.27,0.12,-0.27,0.54,-2.52],['c',0.24,-1.23,0.42,-2.25,0.39,-2.25],['c',0.00,0.00,-0.24,0.06,-0.51,0.18],['c',-1.26,0.39,-2.25,0.57,-3.06,0.54],['c',-0.42,-0.03,-0.75,-0.12,-1.11,-0.30],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.15,0.63,0.21,0.81,0.33,0.96],['c',0.18,0.21,0.51,0.30,0.75,0.18],['c',0.36,-0.15,1.05,-0.99,1.41,-1.77],['l',0.15,-0.30],['l',0.42,-2.25],['c',0.21,-1.26,0.42,-2.28,0.39,-2.28],['l',-0.51,0.15],['c',-1.11,0.39,-1.89,0.51,-2.70,0.51],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.15,0.63,0.21,0.81,0.33,0.96],['c',0.18,0.18,0.48,0.27,0.72,0.21],['c',0.33,-0.12,1.14,-1.26,1.41,-1.95],['c',0.00,-0.09,0.21,-1.11,0.45,-2.34],['c',0.21,-1.20,0.39,-2.22,0.39,-2.28],['c',0.03,-0.03,0.00,-0.03,-0.45,0.12],['c',-0.57,0.18,-1.20,0.33,-1.71,0.42],['c',-0.30,0.06,-0.51,0.06,-0.93,0.06],['c',-0.66,0.00,-0.84,-0.03,-1.32,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.36,-0.54,0.96,-0.87,1.65,-0.93],['c',0.54,-0.03,1.02,0.15,1.41,0.54],['c',0.27,0.30,0.39,0.54,0.57,1.26],['c',0.09,0.33,0.18,0.66,0.21,0.72],['c',0.12,0.27,0.33,0.45,0.60,0.48],['c',0.18,0.00,0.36,-0.09,0.57,-0.33],['c',0.33,-0.36,0.78,-1.14,0.93,-1.56],['c',0.03,-0.12,0.24,-1.20,0.45,-2.40],['c',0.24,-1.20,0.42,-2.22,0.42,-2.28],['c',0.03,-0.03,0.00,-0.03,-0.39,0.09],['c',-1.05,0.36,-1.80,0.48,-2.58,0.48],['c',-0.63,0.00,-0.84,-0.03,-1.29,-0.27],['c',-1.32,-0.63,-1.77,-2.16,-1.02,-3.30],['c',0.33,-0.45,0.84,-0.81,1.38,-0.90],['z']],w:12.992,h:43.883}, - 'accidentals.sharp':{d:[['M',5.73,-11.19],['c',0.21,-0.12,0.54,-0.03,0.66,0.24],['c',0.06,0.12,0.06,0.21,0.06,2.31],['c',0.00,1.23,0.00,2.22,0.03,2.22],['c',0.00,0.00,0.27,-0.12,0.60,-0.24],['c',0.69,-0.27,0.78,-0.30,0.96,-0.15],['c',0.21,0.15,0.21,0.18,0.21,1.38],['c',0.00,1.02,0.00,1.11,-0.06,1.20],['c',-0.03,0.06,-0.09,0.12,-0.12,0.15],['c',-0.06,0.03,-0.42,0.21,-0.84,0.36],['l',-0.75,0.33],['l',-0.03,2.43],['c',0.00,1.32,0.00,2.43,0.03,2.43],['c',0.00,0.00,0.27,-0.12,0.60,-0.24],['c',0.69,-0.27,0.78,-0.30,0.96,-0.15],['c',0.21,0.15,0.21,0.18,0.21,1.38],['c',0.00,1.02,0.00,1.11,-0.06,1.20],['c',-0.03,0.06,-0.09,0.12,-0.12,0.15],['c',-0.06,0.03,-0.42,0.21,-0.84,0.36],['l',-0.75,0.33],['l',-0.03,2.52],['c',0.00,2.28,-0.03,2.55,-0.06,2.64],['c',-0.21,0.36,-0.72,0.36,-0.93,0.00],['c',-0.03,-0.09,-0.06,-0.33,-0.06,-2.43],['l',0.00,-2.31],['l',-1.29,0.51],['l',-1.26,0.51],['l',0.00,2.43],['c',0.00,2.58,0.00,2.52,-0.15,2.67],['c',-0.06,0.09,-0.27,0.18,-0.36,0.18],['c',-0.12,0.00,-0.33,-0.09,-0.39,-0.18],['c',-0.15,-0.15,-0.15,-0.09,-0.15,-2.43],['c',0.00,-1.23,0.00,-2.22,-0.03,-2.22],['c',0.00,0.00,-0.27,0.12,-0.60,0.24],['c',-0.69,0.27,-0.78,0.30,-0.96,0.15],['c',-0.21,-0.15,-0.21,-0.18,-0.21,-1.38],['c',0.00,-1.02,0.00,-1.11,0.06,-1.20],['c',0.03,-0.06,0.09,-0.12,0.12,-0.15],['c',0.06,-0.03,0.42,-0.21,0.84,-0.36],['l',0.78,-0.33],['l',0.00,-2.43],['c',0.00,-1.32,0.00,-2.43,-0.03,-2.43],['c',0.00,0.00,-0.27,0.12,-0.60,0.24],['c',-0.69,0.27,-0.78,0.30,-0.96,0.15],['c',-0.21,-0.15,-0.21,-0.18,-0.21,-1.38],['c',0.00,-1.02,0.00,-1.11,0.06,-1.20],['c',0.03,-0.06,0.09,-0.12,0.12,-0.15],['c',0.06,-0.03,0.42,-0.21,0.84,-0.36],['l',0.78,-0.33],['l',0.00,-2.52],['c',0.00,-2.28,0.03,-2.55,0.06,-2.64],['c',0.21,-0.36,0.72,-0.36,0.93,0.00],['c',0.03,0.09,0.06,0.33,0.06,2.43],['l',0.03,2.31],['l',1.26,-0.51],['l',1.26,-0.51],['l',0.00,-2.43],['c',0.00,-2.28,0.00,-2.43,0.06,-2.55],['c',0.06,-0.12,0.12,-0.18,0.27,-0.24],['z'],['m',-0.33,10.65],['l',0.00,-2.43],['l',-1.29,0.51],['l',-1.26,0.51],['l',0.00,2.46],['l',0.00,2.43],['l',0.09,-0.03],['c',0.06,-0.03,0.63,-0.27,1.29,-0.51],['l',1.17,-0.48],['l',0.00,-2.46],['z']],w:8.25,h:22.462}, - 'accidentals.halfsharp':{d:[['M',2.43,-10.05],['c',0.21,-0.12,0.54,-0.03,0.66,0.24],['c',0.06,0.12,0.06,0.21,0.06,2.01],['c',0.00,1.05,0.00,1.89,0.03,1.89],['l',0.72,-0.48],['c',0.69,-0.48,0.69,-0.51,0.87,-0.51],['c',0.15,0.00,0.18,0.03,0.27,0.09],['c',0.21,0.15,0.21,0.18,0.21,1.41],['c',0.00,1.11,-0.03,1.14,-0.09,1.23],['c',-0.03,0.03,-0.48,0.39,-1.02,0.75],['l',-0.99,0.66],['l',0.00,2.37],['c',0.00,1.32,0.00,2.37,0.03,2.37],['l',0.72,-0.48],['c',0.69,-0.48,0.69,-0.51,0.87,-0.51],['c',0.15,0.00,0.18,0.03,0.27,0.09],['c',0.21,0.15,0.21,0.18,0.21,1.41],['c',0.00,1.11,-0.03,1.14,-0.09,1.23],['c',-0.03,0.03,-0.48,0.39,-1.02,0.75],['l',-0.99,0.66],['l',0.00,2.25],['c',0.00,1.95,0.00,2.28,-0.06,2.37],['c',-0.06,0.12,-0.12,0.21,-0.24,0.27],['c',-0.27,0.12,-0.54,0.03,-0.69,-0.24],['c',-0.06,-0.12,-0.06,-0.21,-0.06,-2.01],['c',0.00,-1.05,0.00,-1.89,-0.03,-1.89],['l',-0.72,0.48],['c',-0.69,0.48,-0.69,0.48,-0.87,0.48],['c',-0.15,0.00,-0.18,0.00,-0.27,-0.06],['c',-0.21,-0.15,-0.21,-0.18,-0.21,-1.41],['c',0.00,-1.11,0.03,-1.14,0.09,-1.23],['c',0.03,-0.03,0.48,-0.39,1.02,-0.75],['l',0.99,-0.66],['l',0.00,-2.37],['c',0.00,-1.32,0.00,-2.37,-0.03,-2.37],['l',-0.72,0.48],['c',-0.69,0.48,-0.69,0.48,-0.87,0.48],['c',-0.15,0.00,-0.18,0.00,-0.27,-0.06],['c',-0.21,-0.15,-0.21,-0.18,-0.21,-1.41],['c',0.00,-1.11,0.03,-1.14,0.09,-1.23],['c',0.03,-0.03,0.48,-0.39,1.02,-0.75],['l',0.99,-0.66],['l',0.00,-2.25],['c',0.00,-2.13,0.00,-2.28,0.06,-2.40],['c',0.06,-0.12,0.12,-0.18,0.27,-0.24],['z']],w:5.25,h:20.174}, - 'accidentals.nat':{d:[['M',0.21,-11.40],['c',0.24,-0.06,0.78,0.00,0.99,0.15],['c',0.03,0.03,0.03,0.48,0.00,2.61],['c',-0.03,1.44,-0.03,2.61,-0.03,2.61],['c',0.00,0.03,0.75,-0.09,1.68,-0.24],['c',0.96,-0.18,1.71,-0.27,1.74,-0.27],['c',0.15,0.03,0.27,0.15,0.36,0.30],['l',0.06,0.12],['l',0.09,8.67],['c',0.09,6.96,0.12,8.67,0.09,8.67],['c',-0.03,0.03,-0.12,0.06,-0.21,0.09],['c',-0.24,0.09,-0.72,0.09,-0.96,0.00],['c',-0.09,-0.03,-0.18,-0.06,-0.21,-0.09],['c',-0.03,-0.03,-0.03,-0.48,0.00,-2.61],['c',0.03,-1.44,0.03,-2.61,0.03,-2.61],['c',0.00,-0.03,-0.75,0.09,-1.68,0.24],['c',-0.96,0.18,-1.71,0.27,-1.74,0.27],['c',-0.15,-0.03,-0.27,-0.15,-0.36,-0.30],['l',-0.06,-0.15],['l',-0.09,-7.53],['c',-0.06,-4.14,-0.09,-8.04,-0.12,-8.67],['l',0.00,-1.11],['l',0.15,-0.06],['c',0.09,-0.03,0.21,-0.06,0.27,-0.09],['z'],['m',3.75,8.40],['c',0.00,-0.33,0.00,-0.42,-0.03,-0.42],['c',-0.12,0.00,-2.79,0.45,-2.79,0.48],['c',-0.03,0.00,-0.09,6.30,-0.09,6.33],['c',0.03,0.00,2.79,-0.45,2.82,-0.48],['c',0.00,0.00,0.09,-4.53,0.09,-5.91],['z']],w:5.4,h:22.8}, - 'accidentals.flat':{d:[['M',-0.36,-14.07],['c',0.33,-0.06,0.87,0.00,1.08,0.15],['c',0.06,0.03,0.06,0.36,-0.03,5.25],['c',-0.06,2.85,-0.09,5.19,-0.09,5.19],['c',0.00,0.03,0.12,-0.03,0.24,-0.12],['c',0.63,-0.42,1.41,-0.66,2.19,-0.72],['c',0.81,-0.03,1.47,0.21,2.04,0.78],['c',0.57,0.54,0.87,1.26,0.93,2.04],['c',0.03,0.57,-0.09,1.08,-0.36,1.62],['c',-0.42,0.81,-1.02,1.38,-2.82,2.61],['c',-1.14,0.78,-1.44,1.02,-1.80,1.44],['c',-0.18,0.18,-0.39,0.39,-0.45,0.42],['c',-0.27,0.18,-0.57,0.15,-0.81,-0.06],['c',-0.06,-0.09,-0.12,-0.18,-0.15,-0.27],['c',-0.03,-0.06,-0.09,-3.27,-0.18,-8.34],['c',-0.09,-4.53,-0.15,-8.58,-0.18,-9.03],['l',0.00,-0.78],['l',0.12,-0.06],['c',0.06,-0.03,0.18,-0.09,0.27,-0.12],['z'],['m',3.18,11.01],['c',-0.21,-0.12,-0.54,-0.15,-0.81,-0.06],['c',-0.54,0.15,-0.99,0.63,-1.17,1.26],['c',-0.06,0.30,-0.12,2.88,-0.06,3.87],['c',0.03,0.42,0.03,0.81,0.06,0.90],['l',0.03,0.12],['l',0.45,-0.39],['c',0.63,-0.54,1.26,-1.17,1.56,-1.59],['c',0.30,-0.42,0.60,-0.99,0.72,-1.41],['c',0.18,-0.69,0.09,-1.47,-0.18,-2.07],['c',-0.15,-0.30,-0.33,-0.51,-0.60,-0.63],['z']],w:6.75,h:18.801}, - 'accidentals.halfflat':{d:[['M',4.83,-14.07],['c',0.33,-0.06,0.87,0.00,1.08,0.15],['c',0.06,0.03,0.06,0.60,-0.12,9.06],['c',-0.09,5.55,-0.15,9.06,-0.18,9.12],['c',-0.03,0.09,-0.09,0.18,-0.15,0.27],['c',-0.24,0.21,-0.54,0.24,-0.81,0.06],['c',-0.06,-0.03,-0.27,-0.24,-0.45,-0.42],['c',-0.36,-0.42,-0.66,-0.66,-1.80,-1.44],['c',-1.23,-0.84,-1.83,-1.32,-2.25,-1.77],['c',-0.66,-0.78,-0.96,-1.56,-0.93,-2.46],['c',0.09,-1.41,1.11,-2.58,2.40,-2.79],['c',0.30,-0.06,0.84,-0.03,1.23,0.06],['c',0.54,0.12,1.08,0.33,1.53,0.63],['c',0.12,0.09,0.24,0.15,0.24,0.12],['c',0.00,0.00,-0.12,-8.37,-0.18,-9.75],['l',0.00,-0.66],['l',0.12,-0.06],['c',0.06,-0.03,0.18,-0.09,0.27,-0.12],['z'],['m',-1.65,10.95],['c',-0.60,-0.18,-1.08,0.09,-1.38,0.69],['c',-0.27,0.60,-0.36,1.38,-0.18,2.07],['c',0.12,0.42,0.42,0.99,0.72,1.41],['c',0.30,0.42,0.93,1.05,1.56,1.59],['l',0.48,0.39],['l',0.00,-0.12],['c',0.03,-0.09,0.03,-0.48,0.06,-0.90],['c',0.03,-0.57,0.03,-1.08,0.00,-2.22],['c',-0.03,-1.62,-0.03,-1.62,-0.24,-2.07],['c',-0.21,-0.42,-0.60,-0.75,-1.02,-0.84],['z']],w:6.728,h:18.801}, - 'accidentals.dblflat':{d:[['M',-0.36,-14.07],['c',0.33,-0.06,0.87,0.00,1.08,0.15],['c',0.06,0.03,0.06,0.33,-0.03,4.89],['c',-0.06,2.67,-0.09,5.01,-0.09,5.22],['l',0.00,0.36],['l',0.15,-0.15],['c',0.36,-0.30,0.75,-0.51,1.20,-0.63],['c',0.33,-0.09,0.96,-0.09,1.26,-0.03],['c',0.27,0.09,0.63,0.27,0.87,0.45],['l',0.21,0.15],['l',0.00,-0.27],['c',0.00,-0.15,-0.03,-2.43,-0.09,-5.10],['c',-0.09,-4.56,-0.09,-4.86,-0.03,-4.89],['c',0.15,-0.12,0.39,-0.15,0.72,-0.15],['c',0.30,0.00,0.54,0.03,0.69,0.15],['c',0.06,0.03,0.06,0.33,-0.03,4.95],['c',-0.06,2.70,-0.09,5.04,-0.09,5.22],['l',0.03,0.30],['l',0.21,-0.15],['c',0.69,-0.48,1.44,-0.69,2.28,-0.69],['c',0.51,0.00,0.78,0.03,1.20,0.21],['c',1.32,0.63,2.01,2.28,1.53,3.69],['c',-0.21,0.57,-0.51,1.02,-1.05,1.56],['c',-0.42,0.42,-0.81,0.72,-1.92,1.50],['c',-1.26,0.87,-1.50,1.08,-1.86,1.50],['c',-0.39,0.45,-0.54,0.54,-0.81,0.51],['c',-0.18,0.00,-0.21,0.00,-0.33,-0.06],['l',-0.21,-0.21],['l',-0.06,-0.12],['l',-0.03,-0.99],['c',-0.03,-0.54,-0.03,-1.29,-0.06,-1.68],['l',0.00,-0.69],['l',-0.21,0.24],['c',-0.36,0.42,-0.75,0.75,-1.80,1.62],['c',-1.02,0.84,-1.20,0.99,-1.44,1.38],['c',-0.36,0.51,-0.54,0.60,-0.90,0.51],['c',-0.15,-0.03,-0.39,-0.27,-0.42,-0.42],['c',-0.03,-0.06,-0.09,-3.27,-0.18,-8.34],['c',-0.09,-4.53,-0.15,-8.58,-0.18,-9.03],['l',0.00,-0.78],['l',0.12,-0.06],['c',0.06,-0.03,0.18,-0.09,0.27,-0.12],['z'],['m',2.52,10.98],['c',-0.18,-0.09,-0.48,-0.12,-0.66,-0.06],['c',-0.39,0.15,-0.69,0.54,-0.84,1.14],['c',-0.06,0.24,-0.06,0.39,-0.09,1.74],['c',-0.03,1.44,0.00,2.73,0.06,3.18],['l',0.03,0.15],['l',0.27,-0.27],['c',0.93,-0.96,1.50,-1.95,1.74,-3.06],['c',0.06,-0.27,0.06,-0.39,0.06,-0.96],['c',0.00,-0.54,0.00,-0.69,-0.06,-0.93],['c',-0.09,-0.51,-0.27,-0.81,-0.51,-0.93],['z'],['m',5.43,0.00],['c',-0.18,-0.09,-0.51,-0.12,-0.72,-0.06],['c',-0.54,0.12,-0.96,0.63,-1.17,1.26],['c',-0.06,0.30,-0.12,2.88,-0.06,3.90],['c',0.03,0.42,0.03,0.81,0.06,0.90],['l',0.03,0.12],['l',0.36,-0.30],['c',0.42,-0.36,1.02,-0.96,1.29,-1.29],['c',0.36,-0.45,0.66,-0.99,0.81,-1.41],['c',0.42,-1.23,0.15,-2.76,-0.60,-3.12],['z']],w:11.613,h:18.804}, - 'accidentals.dblsharp':{d:[['M',-0.18,-3.96],['c',0.06,-0.03,0.12,-0.06,0.15,-0.06],['c',0.09,0.00,2.76,0.27,2.79,0.30],['c',0.12,0.03,0.15,0.12,0.15,0.51],['c',0.06,0.96,0.24,1.59,0.57,2.10],['c',0.06,0.09,0.15,0.21,0.18,0.24],['l',0.09,0.06],['l',0.09,-0.06],['c',0.03,-0.03,0.12,-0.15,0.18,-0.24],['c',0.33,-0.51,0.51,-1.14,0.57,-2.10],['c',0.00,-0.39,0.03,-0.45,0.12,-0.51],['c',0.03,0.00,0.66,-0.09,1.44,-0.15],['c',1.47,-0.15,1.50,-0.15,1.56,-0.03],['c',0.03,0.06,0.00,0.42,-0.09,1.44],['c',-0.09,0.72,-0.15,1.35,-0.15,1.38],['c',0.00,0.03,-0.03,0.09,-0.06,0.12],['c',-0.06,0.06,-0.12,0.09,-0.51,0.09],['c',-1.08,0.06,-1.80,0.30,-2.28,0.75],['l',-0.12,0.09],['l',0.09,0.09],['c',0.12,0.15,0.39,0.33,0.63,0.45],['c',0.42,0.18,0.96,0.27,1.68,0.33],['c',0.39,0.00,0.45,0.03,0.51,0.09],['c',0.03,0.03,0.06,0.09,0.06,0.12],['c',0.00,0.03,0.06,0.66,0.15,1.38],['c',0.09,1.02,0.12,1.38,0.09,1.44],['c',-0.06,0.12,-0.09,0.12,-1.56,-0.03],['c',-0.78,-0.06,-1.41,-0.15,-1.44,-0.15],['c',-0.09,-0.06,-0.12,-0.12,-0.12,-0.54],['c',-0.06,-0.93,-0.24,-1.56,-0.57,-2.07],['c',-0.06,-0.09,-0.15,-0.21,-0.18,-0.24],['l',-0.09,-0.06],['l',-0.09,0.06],['c',-0.03,0.03,-0.12,0.15,-0.18,0.24],['c',-0.33,0.51,-0.51,1.14,-0.57,2.07],['c',0.00,0.42,-0.03,0.48,-0.12,0.54],['c',-0.03,0.00,-0.66,0.09,-1.44,0.15],['c',-1.47,0.15,-1.50,0.15,-1.56,0.03],['c',-0.03,-0.06,0.00,-0.42,0.09,-1.44],['c',0.09,-0.72,0.15,-1.35,0.15,-1.38],['c',0.00,-0.03,0.03,-0.09,0.06,-0.12],['c',0.06,-0.06,0.12,-0.09,0.51,-0.09],['c',0.72,-0.06,1.26,-0.15,1.68,-0.33],['c',0.24,-0.12,0.51,-0.30,0.63,-0.45],['l',0.09,-0.09],['l',-0.12,-0.09],['c',-0.48,-0.45,-1.20,-0.69,-2.28,-0.75],['c',-0.39,0.00,-0.45,-0.03,-0.51,-0.09],['c',-0.03,-0.03,-0.06,-0.09,-0.06,-0.12],['c',0.00,-0.03,-0.06,-0.63,-0.12,-1.38],['c',-0.09,-0.72,-0.15,-1.35,-0.15,-1.38],['z']],w:7.95,h:7.977}, - 'dots.dot':{d:[['M',1.32,-1.68],['c',0.09,-0.03,0.27,-0.06,0.39,-0.06],['c',0.96,0.00,1.74,0.78,1.74,1.71],['c',0.00,0.96,-0.78,1.74,-1.71,1.74],['c',-0.96,0.00,-1.74,-0.78,-1.74,-1.71],['c',0.00,-0.78,0.54,-1.50,1.32,-1.68],['z']],w:3.45,h:3.45}, - 'noteheads.dbl':{d:[['M',-0.69,-4.02],['c',0.18,-0.09,0.36,-0.09,0.54,0.00],['c',0.18,0.09,0.24,0.15,0.33,0.30],['c',0.06,0.15,0.06,0.18,0.06,1.41],['l',0.00,1.23],['l',0.12,-0.18],['c',0.72,-1.26,2.64,-2.31,4.86,-2.64],['c',0.81,-0.15,1.11,-0.15,2.13,-0.15],['c',0.99,0.00,1.29,0.00,2.10,0.15],['c',0.75,0.12,1.38,0.27,2.04,0.54],['c',1.35,0.51,2.34,1.26,2.82,2.10],['l',0.12,0.18],['l',0.00,-1.23],['c',0.00,-1.20,0.00,-1.26,0.06,-1.38],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['c',0.18,-0.09,0.36,-0.09,0.54,0.00],['c',0.18,0.09,0.24,0.15,0.33,0.30],['l',0.06,0.15],['l',0.00,3.54],['l',0.00,3.54],['l',-0.06,0.15],['c',-0.09,0.18,-0.15,0.24,-0.33,0.33],['c',-0.18,0.09,-0.36,0.09,-0.54,0.00],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['c',-0.06,-0.12,-0.06,-0.18,-0.06,-1.38],['l',0.00,-1.23],['l',-0.12,0.18],['c',-0.48,0.84,-1.47,1.59,-2.82,2.10],['c',-0.84,0.33,-1.71,0.54,-2.85,0.66],['c',-0.45,0.06,-2.16,0.06,-2.61,0.00],['c',-1.14,-0.12,-2.01,-0.33,-2.85,-0.66],['c',-1.35,-0.51,-2.34,-1.26,-2.82,-2.10],['l',-0.12,-0.18],['l',0.00,1.23],['c',0.00,1.23,0.00,1.26,-0.06,1.38],['c',-0.09,0.18,-0.15,0.24,-0.33,0.33],['c',-0.18,0.09,-0.36,0.09,-0.54,0.00],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['l',-0.06,-0.15],['l',0.00,-3.54],['c',0.00,-3.48,0.00,-3.54,0.06,-3.66],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['z'],['m',7.71,0.63],['c',-0.36,-0.06,-0.90,-0.06,-1.14,0.00],['c',-0.30,0.03,-0.66,0.24,-0.87,0.42],['c',-0.60,0.54,-0.90,1.62,-0.75,2.82],['c',0.12,0.93,0.51,1.68,1.11,2.31],['c',0.75,0.72,1.83,1.20,2.85,1.26],['c',1.05,0.06,1.83,-0.54,2.10,-1.65],['c',0.21,-0.90,0.12,-1.95,-0.24,-2.82],['c',-0.36,-0.81,-1.08,-1.53,-1.95,-1.95],['c',-0.30,-0.15,-0.78,-0.30,-1.11,-0.39],['z']],w:16.83,h:8.145}, - 'noteheads.whole':{d:[['M',6.51,-4.05],['c',0.51,-0.03,2.01,0.00,2.52,0.03],['c',1.41,0.18,2.64,0.51,3.72,1.08],['c',1.20,0.63,1.95,1.41,2.19,2.31],['c',0.09,0.33,0.09,0.90,0.00,1.23],['c',-0.24,0.90,-0.99,1.68,-2.19,2.31],['c',-1.08,0.57,-2.28,0.90,-3.75,1.08],['c',-0.66,0.06,-2.31,0.06,-2.97,0.00],['c',-1.47,-0.18,-2.67,-0.51,-3.75,-1.08],['c',-1.20,-0.63,-1.95,-1.41,-2.19,-2.31],['c',-0.09,-0.33,-0.09,-0.90,0.00,-1.23],['c',0.24,-0.90,0.99,-1.68,2.19,-2.31],['c',1.20,-0.63,2.61,-0.99,4.23,-1.11],['z'],['m',0.57,0.66],['c',-0.87,-0.15,-1.53,0.00,-2.04,0.51],['c',-0.15,0.15,-0.24,0.27,-0.33,0.48],['c',-0.24,0.51,-0.36,1.08,-0.33,1.77],['c',0.03,0.69,0.18,1.26,0.42,1.77],['c',0.60,1.17,1.74,1.98,3.18,2.22],['c',1.11,0.21,1.95,-0.15,2.34,-0.99],['c',0.24,-0.51,0.36,-1.08,0.33,-1.80],['c',-0.06,-1.11,-0.45,-2.04,-1.17,-2.76],['c',-0.63,-0.63,-1.47,-1.05,-2.40,-1.20],['z']],w:14.985,h:8.097}, - 'noteheads.half':{d:[['M',7.44,-4.05],['c',0.06,-0.03,0.27,-0.03,0.48,-0.03],['c',1.05,0.00,1.71,0.24,2.10,0.81],['c',0.42,0.60,0.45,1.35,0.18,2.40],['c',-0.42,1.59,-1.14,2.73,-2.16,3.39],['c',-1.41,0.93,-3.18,1.44,-5.40,1.53],['c',-1.17,0.03,-1.89,-0.21,-2.28,-0.81],['c',-0.42,-0.60,-0.45,-1.35,-0.18,-2.40],['c',0.42,-1.59,1.14,-2.73,2.16,-3.39],['c',0.63,-0.42,1.23,-0.72,1.98,-0.96],['c',0.90,-0.30,1.65,-0.42,3.12,-0.54],['z'],['m',1.29,0.87],['c',-0.27,-0.09,-0.63,-0.12,-0.90,-0.03],['c',-0.72,0.24,-1.53,0.69,-3.27,1.80],['c',-2.34,1.50,-3.30,2.25,-3.57,2.79],['c',-0.36,0.72,-0.06,1.50,0.66,1.77],['c',0.24,0.12,0.69,0.09,0.99,0.00],['c',0.84,-0.30,1.92,-0.93,4.14,-2.37],['c',1.62,-1.08,2.37,-1.71,2.61,-2.19],['c',0.36,-0.72,0.06,-1.50,-0.66,-1.77],['z']],w:10.37,h:8.132}, - 'noteheads.quarter':{d:[['M',6.09,-4.05],['c',0.36,-0.03,1.20,0.00,1.53,0.06],['c',1.17,0.24,1.89,0.84,2.16,1.83],['c',0.06,0.18,0.06,0.30,0.06,0.66],['c',0.00,0.45,0.00,0.63,-0.15,1.08],['c',-0.66,2.04,-3.06,3.93,-5.52,4.38],['c',-0.54,0.09,-1.44,0.09,-1.83,0.03],['c',-1.23,-0.27,-1.98,-0.87,-2.25,-1.86],['c',-0.06,-0.18,-0.06,-0.30,-0.06,-0.66],['c',0.00,-0.45,0.00,-0.63,0.15,-1.08],['c',0.24,-0.78,0.75,-1.53,1.44,-2.22],['c',1.20,-1.20,2.85,-2.01,4.47,-2.22],['z']],w:9.81,h:8.094}, - 'noteheads.slash.nostem':{d:[['M',9.30,-7.77],['c',0.06,-0.06,0.18,-0.06,1.71,-0.06],['l',1.65,0.00],['l',0.09,0.09],['c',0.06,0.06,0.06,0.09,0.06,0.15],['c',-0.03,0.12,-9.21,15.24,-9.30,15.33],['c',-0.06,0.06,-0.18,0.06,-1.71,0.06],['l',-1.65,0.00],['l',-0.09,-0.09],['c',-0.06,-0.06,-0.06,-0.09,-0.06,-0.15],['c',0.03,-0.12,9.21,-15.24,9.30,-15.33],['z']],w:12.81,h:15.63}, - 'noteheads.indeterminate':{d:[['M',0.78,-4.05],['c',0.12,-0.03,0.24,-0.03,0.36,0.03],['c',0.03,0.03,0.93,0.72,1.95,1.56],['l',1.86,1.50],['l',1.86,-1.50],['c',1.02,-0.84,1.92,-1.53,1.95,-1.56],['c',0.21,-0.12,0.33,-0.09,0.75,0.24],['c',0.30,0.27,0.36,0.36,0.36,0.54],['c',0.00,0.03,-0.03,0.12,-0.06,0.18],['c',-0.03,0.06,-0.90,0.75,-1.89,1.56],['l',-1.80,1.47],['c',0.00,0.03,0.81,0.69,1.80,1.50],['c',0.99,0.81,1.86,1.50,1.89,1.56],['c',0.03,0.06,0.06,0.15,0.06,0.18],['c',0.00,0.18,-0.06,0.27,-0.36,0.54],['c',-0.42,0.33,-0.54,0.36,-0.75,0.24],['c',-0.03,-0.03,-0.93,-0.72,-1.95,-1.56],['l',-1.86,-1.50],['l',-1.86,1.50],['c',-1.02,0.84,-1.92,1.53,-1.95,1.56],['c',-0.21,0.12,-0.33,0.09,-0.75,-0.24],['c',-0.30,-0.27,-0.36,-0.36,-0.36,-0.54],['c',0.00,-0.03,0.03,-0.12,0.06,-0.18],['c',0.03,-0.06,0.90,-0.75,1.89,-1.56],['l',1.80,-1.47],['c',0.00,-0.03,-0.81,-0.69,-1.80,-1.50],['c',-0.99,-0.81,-1.86,-1.50,-1.89,-1.56],['c',-0.06,-0.12,-0.09,-0.21,-0.03,-0.36],['c',0.03,-0.09,0.57,-0.57,0.72,-0.63],['z']],w:9.843,h:8.139}, - 'scripts.ufermata':{d:[['M',-0.75,-10.77],['c',0.12,0.00,0.45,-0.03,0.69,-0.03],['c',2.91,-0.03,5.55,1.53,7.41,4.35],['c',1.17,1.71,1.95,3.72,2.43,6.03],['c',0.12,0.51,0.12,0.57,0.03,0.69],['c',-0.12,0.21,-0.48,0.27,-0.69,0.12],['c',-0.12,-0.09,-0.18,-0.24,-0.27,-0.69],['c',-0.78,-3.63,-3.42,-6.54,-6.78,-7.38],['c',-0.78,-0.21,-1.20,-0.24,-2.07,-0.24],['c',-0.63,0.00,-0.84,0.00,-1.20,0.06],['c',-1.83,0.27,-3.42,1.08,-4.80,2.37],['c',-1.41,1.35,-2.40,3.21,-2.85,5.19],['c',-0.09,0.45,-0.15,0.60,-0.27,0.69],['c',-0.21,0.15,-0.57,0.09,-0.69,-0.12],['c',-0.09,-0.12,-0.09,-0.18,0.03,-0.69],['c',0.33,-1.62,0.78,-3.00,1.47,-4.38],['c',1.77,-3.54,4.44,-5.67,7.56,-5.97],['z'],['m',0.33,7.47],['c',1.38,-0.30,2.58,0.90,2.31,2.25],['c',-0.15,0.72,-0.78,1.35,-1.47,1.50],['c',-1.38,0.27,-2.58,-0.93,-2.31,-2.31],['c',0.15,-0.69,0.78,-1.29,1.47,-1.44],['z']],w:19.748,h:11.289}, - 'scripts.dfermata':{d:[['M',-9.63,-0.42],['c',0.15,-0.09,0.36,-0.06,0.51,0.03],['c',0.12,0.09,0.18,0.24,0.27,0.66],['c',0.78,3.66,3.42,6.57,6.78,7.41],['c',0.78,0.21,1.20,0.24,2.07,0.24],['c',0.63,0.00,0.84,0.00,1.20,-0.06],['c',1.83,-0.27,3.42,-1.08,4.80,-2.37],['c',1.41,-1.35,2.40,-3.21,2.85,-5.22],['c',0.09,-0.42,0.15,-0.57,0.27,-0.66],['c',0.21,-0.15,0.57,-0.09,0.69,0.12],['c',0.09,0.12,0.09,0.18,-0.03,0.69],['c',-0.33,1.62,-0.78,3.00,-1.47,4.38],['c',-1.92,3.84,-4.89,6.00,-8.31,6.00],['c',-3.42,0.00,-6.39,-2.16,-8.31,-6.00],['c',-0.48,-0.96,-0.84,-1.92,-1.14,-2.97],['c',-0.18,-0.69,-0.42,-1.74,-0.42,-1.92],['c',0.00,-0.12,0.09,-0.27,0.24,-0.33],['z'],['m',9.21,0.00],['c',1.20,-0.27,2.34,0.63,2.34,1.86],['c',0.00,0.90,-0.66,1.68,-1.50,1.89],['c',-1.38,0.27,-2.58,-0.93,-2.31,-2.31],['c',0.15,-0.69,0.78,-1.29,1.47,-1.44],['z']],w:19.744,h:11.274}, - 'scripts.sforzato':{d:[['M',-6.45,-3.69],['c',0.06,-0.03,0.15,-0.06,0.18,-0.06],['c',0.06,0.00,2.85,0.72,6.24,1.59],['l',6.33,1.65],['c',0.33,0.06,0.45,0.21,0.45,0.51],['c',0.00,0.30,-0.12,0.45,-0.45,0.51],['l',-6.33,1.65],['c',-3.39,0.87,-6.18,1.59,-6.21,1.59],['c',-0.21,0.00,-0.48,-0.24,-0.51,-0.45],['c',0.00,-0.15,0.06,-0.36,0.18,-0.45],['c',0.09,-0.06,0.87,-0.27,3.84,-1.05],['c',2.04,-0.54,3.84,-0.99,4.02,-1.02],['c',0.15,-0.06,1.14,-0.24,2.22,-0.42],['c',1.05,-0.18,1.92,-0.36,1.92,-0.36],['c',0.00,0.00,-0.87,-0.18,-1.92,-0.36],['c',-1.08,-0.18,-2.07,-0.36,-2.22,-0.42],['c',-0.18,-0.03,-1.98,-0.48,-4.02,-1.02],['c',-2.97,-0.78,-3.75,-0.99,-3.84,-1.05],['c',-0.12,-0.09,-0.18,-0.30,-0.18,-0.45],['c',0.03,-0.15,0.15,-0.30,0.30,-0.39],['z']],w:13.5,h:7.5}, - 'scripts.staccato':{d:[['M',-0.36,-1.47],['c',0.93,-0.21,1.86,0.51,1.86,1.47],['c',0.00,0.93,-0.87,1.65,-1.80,1.47],['c',-0.54,-0.12,-1.02,-0.57,-1.14,-1.08],['c',-0.21,-0.81,0.27,-1.65,1.08,-1.86],['z']],w:2.989,h:3.004}, - 'scripts.tenuto':{d:[['M',-4.20,-0.48],['l',0.12,-0.06],['l',4.08,0.00],['l',4.08,0.00],['l',0.12,0.06],['c',0.39,0.21,0.39,0.75,0.00,0.96],['l',-0.12,0.06],['l',-4.08,0.00],['l',-4.08,0.00],['l',-0.12,-0.06],['c',-0.39,-0.21,-0.39,-0.75,0.00,-0.96],['z']],w:8.985,h:1.08}, - 'scripts.umarcato':{d:[['M',-0.15,-8.19],['c',0.15,-0.12,0.36,-0.03,0.45,0.15],['c',0.21,0.42,3.45,7.65,3.45,7.71],['c',0.00,0.12,-0.12,0.27,-0.21,0.30],['c',-0.03,0.03,-0.51,0.03,-1.14,0.03],['c',-1.05,0.00,-1.08,0.00,-1.17,-0.06],['c',-0.09,-0.06,-0.24,-0.36,-1.17,-2.40],['c',-0.57,-1.29,-1.05,-2.34,-1.08,-2.34],['c',0.00,-0.03,-0.51,1.02,-1.08,2.34],['c',-0.93,2.07,-1.08,2.34,-1.14,2.40],['c',-0.06,0.03,-0.15,0.06,-0.18,0.06],['c',-0.15,0.00,-0.33,-0.18,-0.33,-0.33],['c',0.00,-0.06,3.24,-7.32,3.45,-7.71],['c',0.03,-0.06,0.09,-0.15,0.15,-0.15],['z']],w:7.5,h:8.245}, - 'scripts.dmarcato':{d:[['M',-3.57,0.03],['c',0.03,0.00,0.57,-0.03,1.17,-0.03],['c',1.05,0.00,1.08,0.00,1.17,0.06],['c',0.09,0.06,0.24,0.36,1.17,2.40],['c',0.57,1.29,1.05,2.34,1.08,2.34],['c',0.00,0.03,0.51,-1.02,1.08,-2.34],['c',0.93,-2.07,1.08,-2.34,1.14,-2.40],['c',0.06,-0.03,0.15,-0.06,0.18,-0.06],['c',0.15,0.00,0.33,0.18,0.33,0.33],['c',0.00,0.09,-3.45,7.74,-3.54,7.83],['c',-0.12,0.12,-0.30,0.12,-0.42,0.00],['c',-0.09,-0.09,-3.54,-7.74,-3.54,-7.83],['c',0.00,-0.09,0.12,-0.27,0.18,-0.30],['z']],w:7.5,h:8.25}, - 'scripts.stopped':{d:[['M',-0.27,-4.08],['c',0.18,-0.09,0.36,-0.09,0.54,0.00],['c',0.18,0.09,0.24,0.15,0.33,0.30],['l',0.06,0.15],['l',0.00,1.50],['l',0.00,1.47],['l',1.47,0.00],['l',1.50,0.00],['l',0.15,0.06],['c',0.15,0.09,0.21,0.15,0.30,0.33],['c',0.09,0.18,0.09,0.36,0.00,0.54],['c',-0.09,0.18,-0.15,0.24,-0.33,0.33],['c',-0.12,0.06,-0.18,0.06,-1.62,0.06],['l',-1.47,0.00],['l',0.00,1.47],['l',0.00,1.47],['l',-0.06,0.15],['c',-0.09,0.18,-0.15,0.24,-0.33,0.33],['c',-0.18,0.09,-0.36,0.09,-0.54,0.00],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['l',-0.06,-0.15],['l',0.00,-1.47],['l',0.00,-1.47],['l',-1.47,0.00],['c',-1.44,0.00,-1.50,0.00,-1.62,-0.06],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['c',-0.09,-0.18,-0.09,-0.36,0.00,-0.54],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['l',0.15,-0.06],['l',1.47,0.00],['l',1.47,0.00],['l',0.00,-1.47],['c',0.00,-1.44,0.00,-1.50,0.06,-1.62],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['z']],w:8.295,h:8.295}, - 'scripts.upbow':{d:[['M',-4.65,-15.54],['c',0.12,-0.09,0.36,-0.06,0.48,0.03],['c',0.03,0.03,0.09,0.09,0.12,0.15],['c',0.03,0.06,0.66,2.13,1.41,4.62],['c',1.35,4.41,1.38,4.56,2.01,6.96],['l',0.63,2.46],['l',0.63,-2.46],['c',0.63,-2.40,0.66,-2.55,2.01,-6.96],['c',0.75,-2.49,1.38,-4.56,1.41,-4.62],['c',0.06,-0.15,0.18,-0.21,0.36,-0.24],['c',0.15,0.00,0.30,0.06,0.39,0.18],['c',0.15,0.21,0.24,-0.18,-2.10,7.56],['c',-1.20,3.96,-2.22,7.32,-2.25,7.41],['c',0.00,0.12,-0.06,0.27,-0.09,0.30],['c',-0.12,0.21,-0.60,0.21,-0.72,0.00],['c',-0.03,-0.03,-0.09,-0.18,-0.09,-0.30],['c',-0.03,-0.09,-1.05,-3.45,-2.25,-7.41],['c',-2.34,-7.74,-2.25,-7.35,-2.10,-7.56],['c',0.03,-0.03,0.09,-0.09,0.15,-0.12],['z']],w:9.73,h:15.608}, - 'scripts.downbow':{d:[['M',-5.55,-9.93],['l',0.09,-0.06],['l',5.46,0.00],['l',5.46,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,4.77],['c',0.00,5.28,0.00,4.89,-0.18,5.01],['c',-0.18,0.12,-0.42,0.06,-0.54,-0.12],['c',-0.06,-0.09,-0.06,-0.18,-0.06,-2.97],['l',0.00,-2.85],['l',-4.83,0.00],['l',-4.83,0.00],['l',0.00,2.85],['c',0.00,2.79,0.00,2.88,-0.06,2.97],['c',-0.15,0.24,-0.51,0.24,-0.66,0.00],['c',-0.06,-0.09,-0.06,-0.21,-0.06,-4.89],['l',0.00,-4.77],['z']],w:11.22,h:9.992}, - 'scripts.turn':{d:[['M',-4.77,-3.90],['c',0.36,-0.06,1.05,-0.06,1.44,0.03],['c',0.78,0.15,1.50,0.51,2.34,1.14],['c',0.60,0.45,1.05,0.87,2.22,2.01],['c',1.11,1.08,1.62,1.50,2.22,1.86],['c',0.60,0.36,1.32,0.57,1.92,0.57],['c',0.90,0.00,1.71,-0.57,1.89,-1.35],['c',0.24,-0.93,-0.39,-1.89,-1.35,-2.10],['l',-0.15,-0.06],['l',-0.09,0.15],['c',-0.03,0.09,-0.15,0.24,-0.24,0.33],['c',-0.72,0.72,-2.04,0.54,-2.49,-0.36],['c',-0.48,-0.93,0.03,-1.86,1.17,-2.19],['c',0.30,-0.09,1.02,-0.09,1.35,0.00],['c',0.99,0.27,1.74,0.87,2.25,1.83],['c',0.69,1.41,0.63,3.00,-0.21,4.26],['c',-0.21,0.30,-0.69,0.81,-0.99,1.02],['c',-0.30,0.21,-0.84,0.45,-1.17,0.54],['c',-1.23,0.36,-2.49,0.15,-3.72,-0.60],['c',-0.75,-0.48,-1.41,-1.02,-2.85,-2.46],['c',-1.11,-1.08,-1.62,-1.50,-2.22,-1.86],['c',-0.60,-0.36,-1.32,-0.57,-1.92,-0.57],['c',-0.90,0.00,-1.71,0.57,-1.89,1.35],['c',-0.24,0.93,0.39,1.89,1.35,2.10],['l',0.15,0.06],['l',0.09,-0.15],['c',0.03,-0.09,0.15,-0.24,0.24,-0.33],['c',0.72,-0.72,2.04,-0.54,2.49,0.36],['c',0.48,0.93,-0.03,1.86,-1.17,2.19],['c',-0.30,0.09,-1.02,0.09,-1.35,0.00],['c',-0.99,-0.27,-1.74,-0.87,-2.25,-1.83],['c',-0.69,-1.41,-0.63,-3.00,0.21,-4.26],['c',0.21,-0.30,0.69,-0.81,0.99,-1.02],['c',0.48,-0.33,1.11,-0.57,1.74,-0.66],['z']],w:16.366,h:7.893}, - 'scripts.trill':{d:[['M',-0.51,-16.02],['c',0.12,-0.09,0.21,-0.18,0.21,-0.18],['l',-0.81,4.02],['l',-0.81,4.02],['c',0.03,0.00,0.51,-0.27,1.08,-0.60],['c',0.60,-0.30,1.14,-0.63,1.26,-0.66],['c',1.14,-0.54,2.31,-0.60,3.09,-0.18],['c',0.27,0.15,0.54,0.36,0.60,0.51],['l',0.06,0.12],['l',0.21,-0.21],['c',0.90,-0.81,2.22,-0.99,3.12,-0.42],['c',0.60,0.42,0.90,1.14,0.78,2.07],['c',-0.15,1.29,-1.05,2.31,-1.95,2.25],['c',-0.48,-0.03,-0.78,-0.30,-0.96,-0.81],['c',-0.09,-0.27,-0.09,-0.90,-0.03,-1.20],['c',0.21,-0.75,0.81,-1.23,1.59,-1.32],['l',0.24,-0.03],['l',-0.09,-0.12],['c',-0.51,-0.66,-1.62,-0.63,-2.31,0.03],['c',-0.39,0.42,-0.30,0.09,-1.23,4.77],['l',-0.81,4.14],['c',-0.03,0.00,-0.12,-0.03,-0.21,-0.09],['c',-0.33,-0.15,-0.54,-0.18,-0.99,-0.18],['c',-0.42,0.00,-0.66,0.03,-1.05,0.18],['c',-0.12,0.06,-0.21,0.09,-0.21,0.09],['c',0.00,-0.03,0.36,-1.86,0.81,-4.11],['c',0.90,-4.47,0.87,-4.26,0.69,-4.53],['c',-0.21,-0.36,-0.66,-0.51,-1.17,-0.36],['c',-0.15,0.06,-2.22,1.14,-2.58,1.38],['c',-0.12,0.09,-0.12,0.09,-0.21,0.60],['l',-0.09,0.51],['l',0.21,0.24],['c',0.63,0.75,1.02,1.47,1.20,2.19],['c',0.06,0.27,0.06,0.36,0.06,0.81],['c',0.00,0.42,0.00,0.54,-0.06,0.78],['c',-0.15,0.54,-0.33,0.93,-0.63,1.35],['c',-0.18,0.24,-0.57,0.63,-0.81,0.78],['c',-0.24,0.15,-0.63,0.36,-0.84,0.42],['c',-0.27,0.06,-0.66,0.06,-0.87,0.03],['c',-0.81,-0.18,-1.32,-1.05,-1.38,-2.46],['c',-0.03,-0.60,0.03,-0.99,0.33,-2.46],['c',0.21,-1.08,0.24,-1.32,0.21,-1.29],['c',-1.20,0.48,-2.40,0.75,-3.21,0.72],['c',-0.69,-0.06,-1.17,-0.30,-1.41,-0.72],['c',-0.39,-0.75,-0.12,-1.80,0.66,-2.46],['c',0.24,-0.18,0.69,-0.42,1.02,-0.51],['c',0.69,-0.18,1.53,-0.15,2.31,0.09],['c',0.30,0.09,0.75,0.30,0.99,0.45],['c',0.12,0.09,0.15,0.09,0.15,0.03],['c',0.03,-0.03,0.33,-1.59,0.72,-3.45],['c',0.36,-1.86,0.66,-3.42,0.69,-3.45],['c',0.00,-0.03,0.03,-0.03,0.21,0.03],['c',0.21,0.06,0.27,0.06,0.48,0.06],['c',0.42,-0.03,0.78,-0.18,1.26,-0.48],['c',0.15,-0.12,0.36,-0.27,0.48,-0.39],['z'],['m',-5.73,7.68],['c',-0.27,-0.03,-0.96,-0.06,-1.20,-0.03],['c',-0.81,0.12,-1.35,0.57,-1.50,1.20],['c',-0.18,0.66,0.12,1.14,0.75,1.29],['c',0.66,0.12,1.92,-0.12,3.18,-0.66],['l',0.33,-0.15],['l',0.09,-0.39],['c',0.06,-0.21,0.09,-0.42,0.09,-0.45],['c',0.00,-0.03,-0.45,-0.30,-0.75,-0.45],['c',-0.27,-0.15,-0.66,-0.27,-0.99,-0.36],['z'],['m',4.29,3.63],['c',-0.24,-0.39,-0.51,-0.75,-0.51,-0.69],['c',-0.06,0.12,-0.39,1.92,-0.45,2.28],['c',-0.09,0.54,-0.12,1.14,-0.06,1.38],['c',0.06,0.42,0.21,0.60,0.51,0.57],['c',0.39,-0.06,0.75,-0.48,0.93,-1.14],['c',0.09,-0.33,0.09,-1.05,0.00,-1.38],['c',-0.09,-0.39,-0.24,-0.69,-0.42,-1.02],['z']],w:17.963,h:16.49}, - 'scripts.segno':{d:[['M',-3.72,-11.22],['c',0.78,-0.09,1.59,0.03,2.31,0.42],['c',1.20,0.60,2.01,1.71,2.31,3.09],['c',0.09,0.42,0.09,1.20,0.03,1.50],['c',-0.15,0.45,-0.39,0.81,-0.66,0.93],['c',-0.33,0.18,-0.84,0.21,-1.23,0.15],['c',-0.81,-0.18,-1.32,-0.93,-1.26,-1.89],['c',0.03,-0.36,0.09,-0.57,0.24,-0.90],['c',0.15,-0.33,0.45,-0.60,0.72,-0.75],['c',0.12,-0.06,0.18,-0.09,0.18,-0.12],['c',0.00,-0.03,-0.03,-0.15,-0.09,-0.24],['c',-0.18,-0.45,-0.54,-0.87,-0.96,-1.08],['c',-1.11,-0.57,-2.34,-0.18,-2.88,0.90],['c',-0.24,0.51,-0.33,1.11,-0.24,1.83],['c',0.27,1.92,1.50,3.54,3.93,5.13],['c',0.48,0.33,1.26,0.78,1.29,0.78],['c',0.03,0.00,1.35,-2.19,2.94,-4.89],['l',2.88,-4.89],['l',0.84,0.00],['l',0.87,0.00],['l',-0.03,0.06],['c',-0.15,0.21,-6.15,10.41,-6.15,10.44],['c',0.00,0.00,0.21,0.15,0.48,0.27],['c',2.61,1.47,4.35,3.03,5.13,4.65],['c',1.14,2.34,0.51,5.07,-1.44,6.39],['c',-0.66,0.42,-1.32,0.63,-2.13,0.69],['c',-2.01,0.09,-3.81,-1.41,-4.26,-3.54],['c',-0.09,-0.42,-0.09,-1.20,-0.03,-1.50],['c',0.15,-0.45,0.39,-0.81,0.66,-0.93],['c',0.33,-0.18,0.84,-0.21,1.23,-0.15],['c',0.81,0.18,1.32,0.93,1.26,1.89],['c',-0.03,0.36,-0.09,0.57,-0.24,0.90],['c',-0.15,0.33,-0.45,0.60,-0.72,0.75],['c',-0.12,0.06,-0.18,0.09,-0.18,0.12],['c',0.00,0.03,0.03,0.15,0.09,0.24],['c',0.18,0.45,0.54,0.87,0.96,1.08],['c',1.11,0.57,2.34,0.18,2.88,-0.90],['c',0.24,-0.51,0.33,-1.11,0.24,-1.83],['c',-0.27,-1.92,-1.50,-3.54,-3.93,-5.13],['c',-0.48,-0.33,-1.26,-0.78,-1.29,-0.78],['c',-0.03,0.00,-1.35,2.19,-2.91,4.89],['l',-2.88,4.89],['l',-0.87,0.00],['l',-0.87,0.00],['l',0.03,-0.06],['c',0.15,-0.21,6.15,-10.41,6.15,-10.44],['c',0.00,0.00,-0.21,-0.15,-0.48,-0.30],['c',-2.61,-1.44,-4.35,-3.00,-5.13,-4.62],['c',-0.90,-1.89,-0.72,-4.02,0.48,-5.52],['c',0.69,-0.84,1.68,-1.41,2.73,-1.53],['z'],['m',8.76,9.09],['c',0.03,-0.03,0.15,-0.03,0.27,-0.03],['c',0.33,0.03,0.57,0.18,0.72,0.48],['c',0.09,0.18,0.09,0.57,0.00,0.75],['c',-0.09,0.18,-0.21,0.30,-0.36,0.39],['c',-0.15,0.06,-0.21,0.06,-0.39,0.06],['c',-0.21,0.00,-0.27,0.00,-0.39,-0.06],['c',-0.30,-0.15,-0.48,-0.45,-0.48,-0.75],['c',0.00,-0.39,0.24,-0.72,0.63,-0.84],['z'],['m',-10.53,2.61],['c',0.03,-0.03,0.15,-0.03,0.27,-0.03],['c',0.33,0.03,0.57,0.18,0.72,0.48],['c',0.09,0.18,0.09,0.57,0.00,0.75],['c',-0.09,0.18,-0.21,0.30,-0.36,0.39],['c',-0.15,0.06,-0.21,0.06,-0.39,0.06],['c',-0.21,0.00,-0.27,0.00,-0.39,-0.06],['c',-0.30,-0.15,-0.48,-0.45,-0.48,-0.75],['c',0.00,-0.39,0.24,-0.72,0.63,-0.84],['z']],w:15,h:22.504}, - 'scripts.coda':{d:[['M',-0.21,-10.47],['c',0.18,-0.12,0.42,-0.06,0.54,0.12],['c',0.06,0.09,0.06,0.18,0.06,1.50],['l',0.00,1.38],['l',0.18,0.00],['c',0.39,0.06,0.96,0.24,1.38,0.48],['c',1.68,0.93,2.82,3.24,3.03,6.12],['c',0.03,0.24,0.03,0.45,0.03,0.45],['c',0.00,0.03,0.60,0.03,1.35,0.03],['c',1.50,0.00,1.47,0.00,1.59,0.18],['c',0.09,0.12,0.09,0.30,0.00,0.42],['c',-0.12,0.18,-0.09,0.18,-1.59,0.18],['c',-0.75,0.00,-1.35,0.00,-1.35,0.03],['c',0.00,0.00,0.00,0.21,-0.03,0.42],['c',-0.24,3.15,-1.53,5.58,-3.45,6.36],['c',-0.27,0.12,-0.72,0.24,-0.96,0.27],['l',-0.18,0.00],['l',0.00,1.38],['c',0.00,1.32,0.00,1.41,-0.06,1.50],['c',-0.15,0.24,-0.51,0.24,-0.66,0.00],['c',-0.06,-0.09,-0.06,-0.18,-0.06,-1.50],['l',0.00,-1.38],['l',-0.18,0.00],['c',-0.39,-0.06,-0.96,-0.24,-1.38,-0.48],['c',-1.68,-0.93,-2.82,-3.24,-3.03,-6.15],['c',-0.03,-0.21,-0.03,-0.42,-0.03,-0.42],['c',0.00,-0.03,-0.60,-0.03,-1.35,-0.03],['c',-1.50,0.00,-1.47,0.00,-1.59,-0.18],['c',-0.09,-0.12,-0.09,-0.30,0.00,-0.42],['c',0.12,-0.18,0.09,-0.18,1.59,-0.18],['c',0.75,0.00,1.35,0.00,1.35,-0.03],['c',0.00,0.00,0.00,-0.21,0.03,-0.45],['c',0.24,-3.12,1.53,-5.55,3.45,-6.33],['c',0.27,-0.12,0.72,-0.24,0.96,-0.27],['l',0.18,0.00],['l',0.00,-1.38],['c',0.00,-1.53,0.00,-1.50,0.18,-1.62],['z'],['m',-0.18,6.93],['c',0.00,-2.97,0.00,-3.15,-0.06,-3.15],['c',-0.09,0.00,-0.51,0.15,-0.66,0.21],['c',-0.87,0.51,-1.38,1.62,-1.56,3.51],['c',-0.06,0.54,-0.12,1.59,-0.12,2.16],['l',0.00,0.42],['l',1.20,0.00],['l',1.20,0.00],['l',0.00,-3.15],['z'],['m',1.17,-3.06],['c',-0.09,-0.03,-0.21,-0.06,-0.27,-0.09],['l',-0.12,0.00],['l',0.00,3.15],['l',0.00,3.15],['l',1.20,0.00],['l',1.20,0.00],['l',0.00,-0.81],['c',-0.06,-2.40,-0.33,-3.69,-0.93,-4.59],['c',-0.27,-0.39,-0.66,-0.69,-1.08,-0.81],['z'],['m',-1.17,10.14],['l',0.00,-3.15],['l',-1.20,0.00],['l',-1.20,0.00],['l',0.00,0.81],['c',0.03,0.96,0.06,1.47,0.15,2.13],['c',0.24,2.04,0.96,3.12,2.13,3.36],['l',0.12,0.00],['l',0.00,-3.15],['z'],['m',3.18,-2.34],['l',0.00,-0.81],['l',-1.20,0.00],['l',-1.20,0.00],['l',0.00,3.15],['l',0.00,3.15],['l',0.12,0.00],['c',1.17,-0.24,1.89,-1.32,2.13,-3.36],['c',0.09,-0.66,0.12,-1.17,0.15,-2.13],['z']],w:16.035,h:21.062}, - 'scripts.comma':{d:[['M',1.14,-4.62],['c',0.30,-0.12,0.69,-0.03,0.93,0.15],['c',0.12,0.12,0.36,0.45,0.51,0.78],['c',0.90,1.77,0.54,4.05,-1.08,6.75],['c',-0.36,0.63,-0.87,1.38,-0.96,1.44],['c',-0.18,0.12,-0.42,0.06,-0.54,-0.12],['c',-0.09,-0.18,-0.09,-0.30,0.12,-0.60],['c',0.96,-1.44,1.44,-2.97,1.38,-4.35],['c',-0.06,-0.93,-0.30,-1.68,-0.78,-2.46],['c',-0.27,-0.39,-0.33,-0.63,-0.24,-0.96],['c',0.09,-0.27,0.36,-0.54,0.66,-0.63],['z']],w:3.042,h:9.237}, - 'scripts.roll':{d:[['M',1.95,-6.00],['c',0.21,-0.09,0.36,-0.09,0.57,0.00],['c',0.39,0.15,0.63,0.39,1.47,1.35],['c',0.66,0.75,0.78,0.87,1.08,1.05],['c',0.75,0.45,1.65,0.42,2.40,-0.06],['c',0.12,-0.09,0.27,-0.27,0.54,-0.60],['c',0.42,-0.54,0.51,-0.63,0.69,-0.63],['c',0.09,0.00,0.30,0.12,0.36,0.21],['c',0.09,0.12,0.12,0.30,0.03,0.42],['c',-0.06,0.12,-3.15,3.90,-3.30,4.08],['c',-0.06,0.06,-0.18,0.12,-0.27,0.18],['c',-0.27,0.12,-0.60,0.06,-0.99,-0.27],['c',-0.27,-0.21,-0.42,-0.39,-1.08,-1.14],['c',-0.63,-0.72,-0.81,-0.90,-1.17,-1.08],['c',-0.36,-0.18,-0.57,-0.21,-0.99,-0.21],['c',-0.39,0.00,-0.63,0.03,-0.93,0.18],['c',-0.36,0.15,-0.51,0.27,-0.90,0.81],['c',-0.24,0.27,-0.45,0.51,-0.48,0.54],['c',-0.12,0.09,-0.27,0.06,-0.39,0.00],['c',-0.24,-0.15,-0.33,-0.39,-0.21,-0.60],['c',0.09,-0.12,3.18,-3.87,3.33,-4.02],['c',0.06,-0.06,0.18,-0.15,0.24,-0.21],['z']],w:10.817,h:6.125}, - 'scripts.prall':{d:[['M',-4.38,-3.69],['c',0.06,-0.03,0.18,-0.06,0.24,-0.06],['c',0.30,0.00,0.27,-0.03,1.89,1.95],['l',1.53,1.83],['c',0.03,0.00,0.57,-0.84,1.23,-1.83],['c',1.14,-1.68,1.23,-1.83,1.35,-1.89],['c',0.06,-0.03,0.18,-0.06,0.24,-0.06],['c',0.30,0.00,0.27,-0.03,1.89,1.95],['l',1.53,1.83],['l',0.48,-0.69],['c',0.51,-0.78,0.54,-0.84,0.69,-0.90],['c',0.42,-0.18,0.87,0.15,0.81,0.60],['c',-0.03,0.12,-0.30,0.51,-1.50,2.37],['c',-1.38,2.07,-1.50,2.22,-1.62,2.28],['c',-0.06,0.03,-0.18,0.06,-0.24,0.06],['c',-0.30,0.00,-0.27,0.03,-1.89,-1.95],['l',-1.53,-1.83],['c',-0.03,0.00,-0.57,0.84,-1.23,1.83],['c',-1.14,1.68,-1.23,1.83,-1.35,1.89],['c',-0.06,0.03,-0.18,0.06,-0.24,0.06],['c',-0.30,0.00,-0.27,0.03,-1.89,-1.95],['l',-1.53,-1.83],['l',-0.48,0.69],['c',-0.51,0.78,-0.54,0.84,-0.69,0.90],['c',-0.42,0.18,-0.87,-0.15,-0.81,-0.60],['c',0.03,-0.12,0.30,-0.51,1.50,-2.37],['c',1.38,-2.07,1.50,-2.22,1.62,-2.28],['z']],w:15.011,h:7.5}, - 'scripts.arpeggio':{d:[['M',1.5,0],['c',1.5,2,1.5,3,1.5,3],['s',0,1,-2,1.5],['s',-0.5,3,1,5.5],['l',1.5,0],['s',-1.75,-2,-1.9,-3.25],['s',2.15,-0.6,2.95,-1.6],['s',0.45,-1,0.5,-1.25],['s',0,-1,-2,-3.9],['l',-1.5,0],['z']],w:5,h:10}, - 'scripts.mordent':{d:[['M',-0.21,-4.95],['c',0.27,-0.15,0.63,0.00,0.75,0.27],['c',0.06,0.12,0.06,0.24,0.06,1.44],['l',0.00,1.29],['l',0.57,-0.84],['c',0.51,-0.75,0.57,-0.84,0.69,-0.90],['c',0.06,-0.03,0.18,-0.06,0.24,-0.06],['c',0.30,0.00,0.27,-0.03,1.89,1.95],['l',1.53,1.83],['l',0.48,-0.69],['c',0.51,-0.78,0.54,-0.84,0.69,-0.90],['c',0.42,-0.18,0.87,0.15,0.81,0.60],['c',-0.03,0.12,-0.30,0.51,-1.50,2.37],['c',-1.38,2.07,-1.50,2.22,-1.62,2.28],['c',-0.06,0.03,-0.18,0.06,-0.24,0.06],['c',-0.30,0.00,-0.27,0.03,-1.83,-1.89],['c',-0.81,-0.99,-1.50,-1.80,-1.53,-1.86],['c',-0.06,-0.03,-0.06,-0.03,-0.12,0.03],['c',-0.06,0.06,-0.06,0.15,-0.06,2.28],['c',0.00,1.95,0.00,2.25,-0.06,2.34],['c',-0.18,0.45,-0.81,0.48,-1.05,0.03],['c',-0.03,-0.06,-0.06,-0.24,-0.06,-1.41],['l',0.00,-1.35],['l',-0.57,0.84],['c',-0.54,0.78,-0.60,0.87,-0.72,0.93],['c',-0.06,0.03,-0.18,0.06,-0.24,0.06],['c',-0.30,0.00,-0.27,0.03,-1.89,-1.95],['l',-1.53,-1.83],['l',-0.48,0.69],['c',-0.51,0.78,-0.54,0.84,-0.69,0.90],['c',-0.42,0.18,-0.87,-0.15,-0.81,-0.60],['c',0.03,-0.12,0.30,-0.51,1.50,-2.37],['c',1.38,-2.07,1.50,-2.22,1.62,-2.28],['c',0.06,-0.03,0.18,-0.06,0.24,-0.06],['c',0.30,0.00,0.27,-0.03,1.89,1.95],['l',1.53,1.83],['c',0.03,0.00,0.06,-0.06,0.09,-0.09],['c',0.06,-0.12,0.06,-0.15,0.06,-2.28],['c',0.00,-1.92,0.00,-2.22,0.06,-2.31],['c',0.06,-0.15,0.15,-0.24,0.30,-0.30],['z']],w:15.011,h:10.012}, - 'flags.u8th':{d:[['M',-0.42,3.75],['l',0.00,-3.75],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,0.18],['c',0.00,0.30,0.06,0.84,0.12,1.23],['c',0.24,1.53,0.90,3.12,2.13,5.16],['l',0.99,1.59],['c',0.87,1.44,1.38,2.34,1.77,3.09],['c',0.81,1.68,1.20,3.06,1.26,4.53],['c',0.03,1.53,-0.21,3.27,-0.75,5.01],['c',-0.21,0.69,-0.51,1.50,-0.60,1.59],['c',-0.09,0.12,-0.27,0.21,-0.42,0.21],['c',-0.15,0.00,-0.42,-0.12,-0.51,-0.21],['c',-0.15,-0.18,-0.18,-0.42,-0.09,-0.66],['c',0.15,-0.33,0.45,-1.20,0.57,-1.62],['c',0.42,-1.38,0.60,-2.58,0.60,-3.90],['c',0.00,-0.66,0.00,-0.81,-0.06,-1.11],['c',-0.39,-2.07,-1.80,-4.26,-4.59,-7.14],['l',-0.42,-0.45],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-3.75],['z']],w:6.692,h:22.59}, - 'flags.u16th':{d:[['M',-0.42,7.50],['l',0.00,-7.50],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,0.39],['c',0.06,1.08,0.39,2.19,0.99,3.39],['c',0.45,0.90,0.87,1.59,1.95,3.12],['c',1.29,1.86,1.77,2.64,2.22,3.57],['c',0.45,0.93,0.72,1.80,0.87,2.64],['c',0.06,0.51,0.06,1.50,0.00,1.92],['c',-0.12,0.60,-0.30,1.20,-0.54,1.71],['l',-0.09,0.24],['l',0.18,0.45],['c',0.51,1.20,0.72,2.22,0.69,3.42],['c',-0.06,1.53,-0.39,3.03,-0.99,4.53],['c',-0.30,0.75,-0.36,0.81,-0.57,0.90],['c',-0.15,0.09,-0.33,0.06,-0.48,0.00],['c',-0.18,-0.09,-0.27,-0.18,-0.33,-0.33],['c',-0.09,-0.18,-0.06,-0.30,0.12,-0.75],['c',0.66,-1.41,1.02,-2.88,1.08,-4.32],['c',0.00,-0.60,-0.03,-1.05,-0.18,-1.59],['c',-0.30,-1.20,-0.99,-2.40,-2.25,-3.87],['c',-0.42,-0.48,-1.53,-1.62,-2.19,-2.22],['l',-0.45,-0.42],['l',-0.03,1.11],['l',0.00,1.11],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-7.50],['z'],['m',1.65,0.09],['c',-0.30,-0.30,-0.69,-0.72,-0.90,-0.87],['l',-0.33,-0.33],['l',0.00,0.15],['c',0.00,0.30,0.06,0.81,0.15,1.26],['c',0.27,1.29,0.87,2.61,2.04,4.29],['c',0.15,0.24,0.60,0.87,0.96,1.38],['l',1.08,1.53],['l',0.42,0.63],['c',0.03,0.00,0.12,-0.36,0.21,-0.72],['c',0.06,-0.33,0.06,-1.20,0.00,-1.62],['c',-0.33,-1.71,-1.44,-3.48,-3.63,-5.70],['z']],w:6.693,h:26.337}, - 'flags.u32nd':{d:[['M',-0.42,11.25],['l',0.00,-11.25],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,0.36],['c',0.09,1.68,0.69,3.27,2.07,5.46],['l',0.87,1.35],['c',1.02,1.62,1.47,2.37,1.86,3.18],['c',0.48,1.02,0.78,1.92,0.93,2.88],['c',0.06,0.48,0.06,1.50,0.00,1.89],['c',-0.09,0.42,-0.21,0.87,-0.36,1.26],['l',-0.12,0.30],['l',0.15,0.39],['c',0.69,1.56,0.84,2.88,0.54,4.38],['c',-0.09,0.45,-0.27,1.08,-0.45,1.47],['l',-0.12,0.24],['l',0.18,0.36],['c',0.33,0.72,0.57,1.56,0.69,2.34],['c',0.12,1.02,-0.06,2.52,-0.42,3.84],['c',-0.27,0.93,-0.75,2.13,-0.93,2.31],['c',-0.18,0.15,-0.45,0.18,-0.66,0.09],['c',-0.18,-0.09,-0.27,-0.18,-0.33,-0.33],['c',-0.09,-0.18,-0.06,-0.30,0.06,-0.60],['c',0.21,-0.36,0.42,-0.90,0.57,-1.38],['c',0.51,-1.41,0.69,-3.06,0.48,-4.08],['c',-0.15,-0.81,-0.57,-1.68,-1.20,-2.55],['c',-0.72,-0.99,-1.83,-2.13,-3.30,-3.33],['l',-0.48,-0.42],['l',-0.03,1.53],['l',0.00,1.56],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-11.25],['z'],['m',1.26,-3.96],['c',-0.27,-0.30,-0.54,-0.60,-0.66,-0.72],['l',-0.18,-0.21],['l',0.00,0.42],['c',0.06,0.87,0.24,1.74,0.66,2.67],['c',0.36,0.87,0.96,1.86,1.92,3.18],['c',0.21,0.33,0.63,0.87,0.87,1.23],['c',0.27,0.39,0.60,0.84,0.75,1.08],['l',0.27,0.39],['l',0.03,-0.12],['c',0.12,-0.45,0.15,-1.05,0.09,-1.59],['c',-0.27,-1.86,-1.38,-3.78,-3.75,-6.33],['z'],['m',-0.27,6.09],['c',-0.27,-0.21,-0.48,-0.42,-0.51,-0.45],['c',-0.06,-0.03,-0.06,-0.03,-0.06,0.21],['c',0.00,0.90,0.30,2.04,0.81,3.09],['c',0.48,1.02,0.96,1.77,2.37,3.63],['c',0.60,0.78,1.05,1.44,1.29,1.77],['c',0.06,0.12,0.15,0.21,0.15,0.18],['c',0.03,-0.03,0.18,-0.57,0.24,-0.87],['c',0.06,-0.45,0.06,-1.32,-0.03,-1.74],['c',-0.09,-0.48,-0.24,-0.90,-0.51,-1.44],['c',-0.66,-1.35,-1.83,-2.70,-3.75,-4.38],['z']],w:6.697,h:32.145}, - 'flags.u64th':{d:[['M',-0.42,15.00],['l',0.00,-15.00],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,0.36],['c',0.06,1.20,0.39,2.37,1.02,3.66],['c',0.39,0.81,0.84,1.56,1.80,3.09],['c',0.81,1.26,1.05,1.68,1.35,2.22],['c',0.87,1.50,1.35,2.79,1.56,4.08],['c',0.06,0.54,0.06,1.56,-0.03,2.04],['c',-0.09,0.48,-0.21,0.99,-0.36,1.35],['l',-0.12,0.27],['l',0.12,0.27],['c',0.09,0.15,0.21,0.45,0.27,0.66],['c',0.69,1.89,0.63,3.66,-0.18,5.46],['l',-0.18,0.39],['l',0.15,0.33],['c',0.30,0.66,0.51,1.44,0.63,2.10],['c',0.06,0.48,0.06,1.35,0.00,1.71],['c',-0.15,0.57,-0.42,1.20,-0.78,1.68],['l',-0.21,0.27],['l',0.18,0.33],['c',0.57,1.05,0.93,2.13,1.02,3.18],['c',0.06,0.72,0.00,1.83,-0.21,2.79],['c',-0.18,1.02,-0.63,2.34,-1.02,3.09],['c',-0.15,0.33,-0.48,0.45,-0.78,0.30],['c',-0.18,-0.09,-0.27,-0.18,-0.33,-0.33],['c',-0.09,-0.18,-0.06,-0.30,0.03,-0.54],['c',0.75,-1.50,1.23,-3.45,1.17,-4.89],['c',-0.06,-1.02,-0.42,-2.01,-1.17,-3.15],['c',-0.48,-0.72,-1.02,-1.35,-1.89,-2.22],['c',-0.57,-0.57,-1.56,-1.50,-1.92,-1.77],['l',-0.12,-0.09],['l',0.00,1.68],['l',0.00,1.68],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-15.00],['z'],['m',0.93,-8.07],['c',-0.27,-0.30,-0.48,-0.54,-0.51,-0.54],['c',0.00,0.00,0.00,0.69,0.03,1.02],['c',0.15,1.47,0.75,2.94,2.04,4.83],['l',1.08,1.53],['c',0.39,0.57,0.84,1.20,0.99,1.44],['c',0.15,0.24,0.30,0.45,0.30,0.45],['c',0.00,0.00,0.03,-0.09,0.06,-0.21],['c',0.36,-1.59,-0.15,-3.33,-1.47,-5.40],['c',-0.63,-0.93,-1.35,-1.83,-2.52,-3.12],['z'],['m',0.06,6.72],['c',-0.24,-0.21,-0.48,-0.42,-0.51,-0.45],['l',-0.06,-0.06],['l',0.00,0.33],['c',0.00,1.20,0.30,2.34,0.93,3.60],['c',0.45,0.90,0.96,1.68,2.25,3.51],['c',0.39,0.54,0.84,1.17,1.02,1.44],['c',0.21,0.33,0.33,0.51,0.33,0.48],['c',0.06,-0.09,0.21,-0.63,0.30,-0.99],['c',0.06,-0.33,0.06,-0.45,0.06,-0.96],['c',0.00,-0.60,-0.03,-0.84,-0.18,-1.35],['c',-0.30,-1.08,-1.02,-2.28,-2.13,-3.57],['c',-0.39,-0.45,-1.44,-1.47,-2.01,-1.98],['z'],['m',0.00,6.72],['c',-0.24,-0.21,-0.48,-0.39,-0.51,-0.42],['l',-0.06,-0.06],['l',0.00,0.33],['c',0.00,1.41,0.45,2.82,1.38,4.35],['c',0.42,0.72,0.72,1.14,1.86,2.73],['c',0.36,0.45,0.75,0.99,0.87,1.20],['c',0.15,0.21,0.30,0.36,0.30,0.36],['c',0.06,0.00,0.30,-0.48,0.39,-0.75],['c',0.09,-0.36,0.12,-0.63,0.12,-1.05],['c',-0.06,-1.05,-0.45,-2.04,-1.20,-3.18],['c',-0.57,-0.87,-1.11,-1.53,-2.07,-2.49],['c',-0.36,-0.33,-0.84,-0.78,-1.08,-1.02],['z']],w:6.682,h:39.694}, - 'flags.d8th':{d:[['M',5.67,-21.63],['c',0.24,-0.12,0.54,-0.06,0.69,0.15],['c',0.06,0.06,0.21,0.36,0.39,0.66],['c',0.84,1.77,1.26,3.36,1.32,5.10],['c',0.03,1.29,-0.21,2.37,-0.81,3.63],['c',-0.60,1.23,-1.26,2.13,-3.21,4.38],['c',-1.35,1.53,-1.86,2.19,-2.40,2.97],['c',-0.63,0.93,-1.11,1.92,-1.38,2.79],['c',-0.15,0.54,-0.27,1.35,-0.27,1.80],['l',0.00,0.15],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-3.75],['l',0.00,-3.75],['l',0.21,0.00],['l',0.21,0.00],['l',0.48,-0.30],['c',1.83,-1.11,3.12,-2.10,4.17,-3.12],['c',0.78,-0.81,1.32,-1.53,1.71,-2.31],['c',0.45,-0.93,0.60,-1.74,0.51,-2.88],['c',-0.12,-1.56,-0.63,-3.18,-1.47,-4.68],['c',-0.12,-0.21,-0.15,-0.33,-0.06,-0.51],['c',0.06,-0.15,0.15,-0.24,0.33,-0.33],['z']],w:8.492,h:21.691}, - 'flags.ugrace':{d:[['M',6.03,6.93],['c',0.15,-0.09,0.33,-0.06,0.51,0.00],['c',0.15,0.09,0.21,0.15,0.30,0.33],['c',0.09,0.18,0.06,0.39,-0.03,0.54],['c',-0.06,0.15,-10.89,8.88,-11.07,8.97],['c',-0.15,0.09,-0.33,0.06,-0.48,0.00],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['c',-0.09,-0.18,-0.06,-0.39,0.03,-0.54],['c',0.06,-0.15,10.89,-8.88,11.07,-8.97],['z']],w:12.019,h:9.954}, - 'flags.dgrace':{d:[['M',-6.06,-15.93],['c',0.18,-0.09,0.33,-0.12,0.48,-0.06],['c',0.18,0.09,14.01,8.04,14.10,8.10],['c',0.12,0.12,0.18,0.33,0.18,0.51],['c',-0.03,0.21,-0.15,0.39,-0.36,0.48],['c',-0.18,0.09,-0.33,0.12,-0.48,0.06],['c',-0.18,-0.09,-14.01,-8.04,-14.10,-8.10],['c',-0.12,-0.12,-0.18,-0.33,-0.18,-0.51],['c',0.03,-0.21,0.15,-0.39,0.36,-0.48],['z']],w:15.12,h:9.212}, - 'flags.d16th':{d:[['M',6.84,-22.53],['c',0.27,-0.12,0.57,-0.06,0.72,0.15],['c',0.15,0.15,0.33,0.87,0.45,1.56],['c',0.06,0.33,0.06,1.35,0.00,1.65],['c',-0.06,0.33,-0.15,0.78,-0.27,1.11],['c',-0.12,0.33,-0.45,0.96,-0.66,1.32],['l',-0.18,0.27],['l',0.09,0.18],['c',0.48,1.02,0.72,2.25,0.69,3.30],['c',-0.06,1.23,-0.42,2.28,-1.26,3.45],['c',-0.57,0.87,-0.99,1.32,-3.00,3.39],['c',-1.56,1.56,-2.22,2.40,-2.76,3.45],['c',-0.42,0.84,-0.66,1.80,-0.66,2.55],['l',0.00,0.15],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-7.50],['l',0.00,-7.50],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,1.14],['l',0.00,1.11],['l',0.27,-0.15],['c',1.11,-0.57,1.77,-0.99,2.52,-1.47],['c',2.37,-1.56,3.69,-3.15,4.05,-4.83],['c',0.03,-0.18,0.03,-0.39,0.03,-0.78],['c',0.00,-0.60,-0.03,-0.93,-0.24,-1.50],['c',-0.06,-0.18,-0.12,-0.39,-0.15,-0.45],['c',-0.03,-0.24,0.12,-0.48,0.36,-0.60],['z'],['m',-0.63,7.50],['c',-0.06,-0.18,-0.15,-0.36,-0.15,-0.36],['c',-0.03,0.00,-0.03,0.03,-0.06,0.06],['c',-0.06,0.12,-0.96,1.02,-1.95,1.98],['c',-0.63,0.57,-1.26,1.17,-1.44,1.35],['c',-1.53,1.62,-2.28,2.85,-2.55,4.32],['c',-0.03,0.18,-0.03,0.54,-0.06,0.99],['l',0.00,0.69],['l',0.18,-0.09],['c',0.93,-0.54,2.10,-1.29,2.82,-1.83],['c',0.69,-0.51,1.02,-0.81,1.53,-1.29],['c',1.86,-1.89,2.37,-3.66,1.68,-5.82],['z']],w:8.475,h:22.591}, - 'flags.d32nd':{d:[['M',6.84,-29.13],['c',0.27,-0.12,0.57,-0.06,0.72,0.15],['c',0.12,0.12,0.27,0.63,0.36,1.11],['c',0.33,1.59,0.06,3.06,-0.81,4.47],['l',-0.18,0.27],['l',0.09,0.15],['c',0.12,0.24,0.33,0.69,0.45,1.05],['c',0.63,1.83,0.45,3.57,-0.57,5.22],['l',-0.18,0.30],['l',0.15,0.27],['c',0.42,0.87,0.60,1.71,0.57,2.61],['c',-0.06,1.29,-0.48,2.46,-1.35,3.78],['c',-0.54,0.81,-0.93,1.29,-2.46,3.00],['c',-0.51,0.54,-1.05,1.17,-1.26,1.41],['c',-1.56,1.86,-2.25,3.36,-2.37,5.01],['l',0.00,0.33],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-11.25],['l',0.00,-11.25],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,1.35],['l',0.03,1.35],['l',0.78,-0.39],['c',1.38,-0.69,2.34,-1.26,3.24,-1.92],['c',1.38,-1.02,2.28,-2.13,2.64,-3.21],['c',0.15,-0.48,0.18,-0.72,0.18,-1.29],['c',0.00,-0.57,-0.06,-0.90,-0.24,-1.47],['c',-0.06,-0.18,-0.12,-0.39,-0.15,-0.45],['c',-0.03,-0.24,0.12,-0.48,0.36,-0.60],['z'],['m',-0.63,7.20],['c',-0.09,-0.18,-0.12,-0.21,-0.12,-0.15],['c',-0.03,0.09,-1.02,1.08,-2.04,2.04],['c',-1.17,1.08,-1.65,1.56,-2.07,2.04],['c',-0.84,0.96,-1.38,1.86,-1.68,2.76],['c',-0.21,0.57,-0.27,0.99,-0.30,1.65],['l',0.00,0.54],['l',0.66,-0.33],['c',3.57,-1.86,5.49,-3.69,5.94,-5.70],['c',0.06,-0.39,0.06,-1.20,-0.03,-1.65],['c',-0.06,-0.39,-0.24,-0.90,-0.36,-1.20],['z'],['m',-0.06,7.20],['c',-0.06,-0.15,-0.12,-0.33,-0.15,-0.45],['l',-0.06,-0.18],['l',-0.18,0.21],['l',-1.83,1.83],['c',-0.87,0.90,-1.77,1.80,-1.95,2.01],['c',-1.08,1.29,-1.62,2.31,-1.89,3.51],['c',-0.06,0.30,-0.06,0.51,-0.09,0.93],['l',0.00,0.57],['l',0.09,-0.06],['c',0.75,-0.45,1.89,-1.26,2.52,-1.74],['c',0.81,-0.66,1.74,-1.53,2.22,-2.16],['c',1.26,-1.53,1.68,-3.06,1.32,-4.47],['z']],w:8.385,h:29.191}, - 'flags.d64th':{d:[['M',7.08,-32.88],['c',0.30,-0.12,0.66,-0.03,0.78,0.24],['c',0.18,0.33,0.27,2.10,0.15,2.64],['c',-0.09,0.39,-0.21,0.78,-0.39,1.08],['l',-0.15,0.30],['l',0.09,0.27],['c',0.03,0.12,0.09,0.45,0.12,0.69],['c',0.27,1.44,0.18,2.55,-0.30,3.60],['l',-0.12,0.33],['l',0.06,0.42],['c',0.27,1.35,0.33,2.82,0.21,3.63],['c',-0.12,0.60,-0.30,1.23,-0.57,1.80],['l',-0.15,0.27],['l',0.03,0.42],['c',0.06,1.02,0.06,2.70,0.03,3.06],['c',-0.15,1.47,-0.66,2.76,-1.74,4.41],['c',-0.45,0.69,-0.75,1.11,-1.74,2.37],['c',-1.05,1.38,-1.50,1.98,-1.95,2.73],['c',-0.93,1.50,-1.38,2.82,-1.44,4.20],['l',0.00,0.42],['l',-0.21,0.00],['l',-0.21,0.00],['l',0.00,-15.00],['l',0.00,-15.00],['l',0.21,0.00],['l',0.21,0.00],['l',0.00,1.86],['l',0.00,1.89],['c',0.00,0.00,0.21,-0.03,0.45,-0.09],['c',2.22,-0.39,4.08,-1.11,5.19,-2.01],['c',0.63,-0.54,1.02,-1.14,1.20,-1.80],['c',0.06,-0.30,0.06,-1.14,-0.03,-1.65],['c',-0.03,-0.18,-0.06,-0.39,-0.09,-0.48],['c',-0.03,-0.24,0.12,-0.48,0.36,-0.60],['z'],['m',-0.45,6.15],['c',-0.03,-0.18,-0.06,-0.42,-0.06,-0.54],['l',-0.03,-0.18],['l',-0.33,0.30],['c',-0.42,0.36,-0.87,0.72,-1.68,1.29],['c',-1.98,1.38,-2.25,1.59,-2.85,2.16],['c',-0.75,0.69,-1.23,1.44,-1.47,2.19],['c',-0.15,0.45,-0.18,0.63,-0.21,1.35],['l',0.00,0.66],['l',0.39,-0.18],['c',1.83,-0.90,3.45,-1.95,4.47,-2.91],['c',0.93,-0.90,1.53,-1.83,1.74,-2.82],['c',0.06,-0.33,0.06,-0.87,0.03,-1.32],['z'],['m',-0.27,4.86],['c',-0.03,-0.21,-0.06,-0.36,-0.06,-0.36],['c',0.00,-0.03,-0.12,0.09,-0.24,0.24],['c',-0.39,0.48,-0.99,1.08,-2.16,2.19],['c',-1.47,1.38,-1.92,1.83,-2.46,2.49],['c',-0.66,0.87,-1.08,1.74,-1.29,2.58],['c',-0.09,0.42,-0.15,0.87,-0.15,1.44],['l',0.00,0.54],['l',0.48,-0.33],['c',1.50,-1.02,2.58,-1.89,3.51,-2.82],['c',1.47,-1.47,2.25,-2.85,2.40,-4.26],['c',0.03,-0.39,0.03,-1.17,-0.03,-1.71],['z'],['m',-0.66,7.68],['c',0.03,-0.15,0.03,-0.60,0.03,-0.99],['l',0.00,-0.72],['l',-0.27,0.33],['l',-1.74,1.98],['c',-1.77,1.92,-2.43,2.76,-2.97,3.90],['c',-0.51,1.02,-0.72,1.77,-0.75,2.91],['c',0.00,0.63,0.00,0.63,0.06,0.60],['c',0.03,-0.03,0.30,-0.27,0.63,-0.54],['c',0.66,-0.60,1.86,-1.80,2.31,-2.31],['c',1.65,-1.89,2.52,-3.54,2.70,-5.16],['z']],w:8.485,h:32.932}, - 'clefs.C':{d:[['M',0.06,-14.94],['l',0.09,-0.06],['l',1.92,0.00],['l',1.92,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,14.85],['l',0.00,14.82],['l',-0.06,0.09],['l',-0.09,0.06],['l',-1.92,0.00],['l',-1.92,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-14.82],['l',0.00,-14.85],['z'],['m',5.37,0.00],['c',0.09,-0.06,0.09,-0.06,0.57,-0.06],['c',0.45,0.00,0.45,0.00,0.54,0.06],['l',0.06,0.09],['l',0.00,7.14],['l',0.00,7.11],['l',0.09,-0.06],['c',0.18,-0.18,0.72,-0.84,0.96,-1.20],['c',0.30,-0.45,0.66,-1.17,0.84,-1.65],['c',0.36,-0.90,0.57,-1.83,0.60,-2.79],['c',0.03,-0.48,0.03,-0.54,0.09,-0.63],['c',0.12,-0.18,0.36,-0.21,0.54,-0.12],['c',0.18,0.09,0.21,0.15,0.24,0.66],['c',0.06,0.87,0.21,1.56,0.57,2.22],['c',0.51,1.02,1.26,1.68,2.22,1.92],['c',0.21,0.06,0.33,0.06,0.78,0.06],['c',0.45,0.00,0.57,0.00,0.84,-0.06],['c',0.45,-0.12,0.81,-0.33,1.08,-0.60],['c',0.57,-0.57,0.87,-1.41,0.99,-2.88],['c',0.06,-0.54,0.06,-3.00,0.00,-3.57],['c',-0.21,-2.58,-0.84,-3.87,-2.16,-4.50],['c',-0.48,-0.21,-1.17,-0.36,-1.77,-0.36],['c',-0.69,0.00,-1.29,0.27,-1.50,0.72],['c',-0.06,0.15,-0.06,0.21,-0.06,0.42],['c',0.00,0.24,0.00,0.30,0.06,0.45],['c',0.12,0.24,0.24,0.39,0.63,0.66],['c',0.42,0.30,0.57,0.48,0.69,0.72],['c',0.06,0.15,0.06,0.21,0.06,0.48],['c',0.00,0.39,-0.03,0.63,-0.21,0.96],['c',-0.30,0.60,-0.87,1.08,-1.50,1.26],['c',-0.27,0.06,-0.87,0.06,-1.14,0.00],['c',-0.78,-0.24,-1.44,-0.87,-1.65,-1.68],['c',-0.12,-0.42,-0.09,-1.17,0.09,-1.71],['c',0.51,-1.65,1.98,-2.82,3.81,-3.09],['c',0.84,-0.09,2.46,0.03,3.51,0.27],['c',2.22,0.57,3.69,1.80,4.44,3.75],['c',0.36,0.93,0.57,2.13,0.57,3.36],['c',0.00,1.44,-0.48,2.73,-1.38,3.81],['c',-1.26,1.50,-3.27,2.43,-5.28,2.43],['c',-0.48,0.00,-0.51,0.00,-0.75,-0.09],['c',-0.15,-0.03,-0.48,-0.21,-0.78,-0.36],['c',-0.69,-0.36,-0.87,-0.42,-1.26,-0.42],['c',-0.27,0.00,-0.30,0.00,-0.51,0.09],['c',-0.57,0.30,-0.81,0.90,-0.81,2.10],['c',0.00,1.23,0.24,1.83,0.81,2.13],['c',0.21,0.09,0.24,0.09,0.51,0.09],['c',0.39,0.00,0.57,-0.06,1.26,-0.42],['c',0.30,-0.15,0.63,-0.33,0.78,-0.36],['c',0.24,-0.09,0.27,-0.09,0.75,-0.09],['c',2.01,0.00,4.02,0.93,5.28,2.40],['c',0.90,1.11,1.38,2.40,1.38,3.84],['c',0.00,1.50,-0.30,2.88,-0.84,3.96],['c',-0.78,1.59,-2.19,2.64,-4.17,3.15],['c',-1.05,0.24,-2.67,0.36,-3.51,0.27],['c',-1.83,-0.27,-3.30,-1.44,-3.81,-3.09],['c',-0.18,-0.54,-0.21,-1.29,-0.09,-1.74],['c',0.15,-0.60,0.63,-1.20,1.23,-1.47],['c',0.36,-0.18,0.57,-0.21,0.99,-0.21],['c',0.42,0.00,0.63,0.03,1.02,0.21],['c',0.42,0.21,0.84,0.63,1.05,1.05],['c',0.18,0.36,0.21,0.60,0.21,0.96],['c',0.00,0.30,0.00,0.36,-0.06,0.51],['c',-0.12,0.24,-0.27,0.42,-0.69,0.72],['c',-0.57,0.42,-0.69,0.63,-0.69,1.08],['c',0.00,0.24,0.00,0.30,0.06,0.45],['c',0.12,0.21,0.30,0.39,0.57,0.54],['c',0.42,0.18,0.87,0.21,1.53,0.15],['c',1.08,-0.15,1.80,-0.57,2.34,-1.32],['c',0.54,-0.75,0.84,-1.83,0.99,-3.51],['c',0.06,-0.57,0.06,-3.03,0.00,-3.57],['c',-0.12,-1.47,-0.42,-2.31,-0.99,-2.88],['c',-0.27,-0.27,-0.63,-0.48,-1.08,-0.60],['c',-0.27,-0.06,-0.39,-0.06,-0.84,-0.06],['c',-0.45,0.00,-0.57,0.00,-0.78,0.06],['c',-1.14,0.27,-2.01,1.17,-2.46,2.49],['c',-0.21,0.57,-0.30,0.99,-0.33,1.65],['c',-0.03,0.51,-0.06,0.57,-0.24,0.66],['c',-0.12,0.06,-0.27,0.06,-0.39,0.00],['c',-0.21,-0.09,-0.21,-0.15,-0.24,-0.75],['c',-0.09,-1.92,-0.78,-3.72,-2.01,-5.19],['c',-0.18,-0.21,-0.36,-0.42,-0.39,-0.45],['l',-0.09,-0.06],['l',0.00,7.11],['l',0.00,7.14],['l',-0.06,0.09],['c',-0.09,0.06,-0.09,0.06,-0.54,0.06],['c',-0.48,0.00,-0.48,0.00,-0.57,-0.06],['l',-0.06,-0.09],['l',0.00,-14.82],['l',0.00,-14.85],['z']],w:20.31,h:29.97}, - 'clefs.F':{d:[['M',6.30,-7.80],['c',0.36,-0.03,1.65,0.00,2.13,0.03],['c',3.60,0.42,6.03,2.10,6.93,4.86],['c',0.27,0.84,0.36,1.50,0.36,2.58],['c',0.00,0.90,-0.03,1.35,-0.18,2.16],['c',-0.78,3.78,-3.54,7.08,-8.37,9.96],['c',-1.74,1.05,-3.87,2.13,-6.18,3.12],['c',-0.39,0.18,-0.75,0.33,-0.81,0.36],['c',-0.06,0.03,-0.15,0.06,-0.18,0.06],['c',-0.15,0.00,-0.33,-0.18,-0.33,-0.33],['c',0.00,-0.15,0.06,-0.21,0.51,-0.48],['c',3.00,-1.77,5.13,-3.21,6.84,-4.74],['c',0.51,-0.45,1.59,-1.50,1.95,-1.95],['c',1.89,-2.19,2.88,-4.32,3.15,-6.78],['c',0.06,-0.42,0.06,-1.77,0.00,-2.19],['c',-0.24,-2.01,-0.93,-3.63,-2.04,-4.71],['c',-0.63,-0.63,-1.29,-1.02,-2.07,-1.20],['c',-1.62,-0.39,-3.36,0.15,-4.56,1.44],['c',-0.54,0.60,-1.05,1.47,-1.32,2.22],['l',-0.09,0.21],['l',0.24,-0.12],['c',0.39,-0.21,0.63,-0.24,1.11,-0.24],['c',0.30,0.00,0.45,0.00,0.66,0.06],['c',1.92,0.48,2.85,2.55,1.95,4.38],['c',-0.45,0.99,-1.41,1.62,-2.46,1.71],['c',-1.47,0.09,-2.91,-0.87,-3.39,-2.25],['c',-0.18,-0.57,-0.21,-1.32,-0.03,-2.28],['c',0.39,-2.25,1.83,-4.20,3.81,-5.19],['c',0.69,-0.36,1.59,-0.60,2.37,-0.69],['z'],['m',11.58,2.52],['c',0.84,-0.21,1.71,0.30,1.89,1.14],['c',0.30,1.17,-0.72,2.19,-1.89,1.89],['c',-0.99,-0.21,-1.50,-1.32,-1.02,-2.25],['c',0.18,-0.39,0.60,-0.69,1.02,-0.78],['z'],['m',0.00,7.50],['c',0.84,-0.21,1.71,0.30,1.89,1.14],['c',0.21,0.87,-0.30,1.71,-1.14,1.89],['c',-0.87,0.21,-1.71,-0.30,-1.89,-1.14],['c',-0.21,-0.84,0.30,-1.71,1.14,-1.89],['z']],w:20.153,h:23.142}, - 'clefs.G':{d:[['M',9.69,-37.41],['c',0.09,-0.09,0.24,-0.06,0.36,0.00],['c',0.12,0.09,0.57,0.60,0.96,1.11],['c',1.77,2.34,3.21,5.85,3.57,8.73],['c',0.21,1.56,0.03,3.27,-0.45,4.86],['c',-0.69,2.31,-1.92,4.47,-4.23,7.44],['c',-0.30,0.39,-0.57,0.72,-0.60,0.75],['c',-0.03,0.06,0.00,0.15,0.18,0.78],['c',0.54,1.68,1.38,4.44,1.68,5.49],['l',0.09,0.42],['l',0.39,0.00],['c',1.47,0.09,2.76,0.51,3.96,1.29],['c',1.83,1.23,3.06,3.21,3.39,5.52],['c',0.09,0.45,0.12,1.29,0.06,1.74],['c',-0.09,1.02,-0.33,1.83,-0.75,2.73],['c',-0.84,1.71,-2.28,3.06,-4.02,3.72],['l',-0.33,0.12],['l',0.03,1.26],['c',0.00,1.74,-0.06,3.63,-0.21,4.62],['c',-0.45,3.06,-2.19,5.49,-4.47,6.21],['c',-0.57,0.18,-0.90,0.21,-1.59,0.21],['c',-0.69,0.00,-1.02,-0.03,-1.65,-0.21],['c',-1.14,-0.27,-2.13,-0.84,-2.94,-1.65],['c',-0.99,-0.99,-1.56,-2.16,-1.71,-3.54],['c',-0.09,-0.81,0.06,-1.53,0.45,-2.13],['c',0.63,-0.99,1.83,-1.56,3.00,-1.53],['c',1.50,0.09,2.64,1.32,2.73,2.94],['c',0.06,1.47,-0.93,2.70,-2.37,2.97],['c',-0.45,0.06,-0.84,0.03,-1.29,-0.09],['l',-0.21,-0.09],['l',0.09,0.12],['c',0.39,0.54,0.78,0.93,1.32,1.26],['c',1.35,0.87,3.06,1.02,4.35,0.36],['c',1.44,-0.72,2.52,-2.28,2.97,-4.35],['c',0.15,-0.66,0.24,-1.50,0.30,-3.03],['c',0.03,-0.84,0.03,-2.94,0.00,-3.00],['c',-0.03,0.00,-0.18,0.00,-0.36,0.03],['c',-0.66,0.12,-0.99,0.12,-1.83,0.12],['c',-1.05,0.00,-1.71,-0.06,-2.61,-0.30],['c',-4.02,-0.99,-7.11,-4.35,-7.80,-8.46],['c',-0.12,-0.66,-0.12,-0.99,-0.12,-1.83],['c',0.00,-0.84,0.00,-1.14,0.15,-1.92],['c',0.36,-2.28,1.41,-4.62,3.30,-7.29],['l',2.79,-3.60],['c',0.54,-0.66,0.96,-1.20,0.96,-1.23],['c',0.00,-0.03,-0.09,-0.33,-0.18,-0.69],['c',-0.96,-3.21,-1.41,-5.28,-1.59,-7.68],['c',-0.12,-1.38,-0.15,-3.09,-0.06,-3.96],['c',0.33,-2.67,1.38,-5.07,3.12,-7.08],['c',0.36,-0.42,0.99,-1.05,1.17,-1.14],['z'],['m',2.01,4.71],['c',-0.15,-0.30,-0.30,-0.54,-0.30,-0.54],['c',-0.03,0.00,-0.18,0.09,-0.30,0.21],['c',-2.40,1.74,-3.87,4.20,-4.26,7.11],['c',-0.06,0.54,-0.06,1.41,-0.03,1.89],['c',0.09,1.29,0.48,3.12,1.08,5.22],['c',0.15,0.42,0.24,0.78,0.24,0.81],['c',0.00,0.03,0.84,-1.11,1.23,-1.68],['c',1.89,-2.73,2.88,-5.07,3.15,-7.53],['c',0.09,-0.57,0.12,-1.74,0.06,-2.37],['c',-0.09,-1.23,-0.27,-1.92,-0.87,-3.12],['z'],['m',-2.94,20.70],['c',-0.21,-0.72,-0.39,-1.32,-0.42,-1.32],['c',0.00,0.00,-1.20,1.47,-1.86,2.37],['c',-2.79,3.63,-4.02,6.30,-4.35,9.30],['c',-0.03,0.21,-0.03,0.69,-0.03,1.08],['c',0.00,0.69,0.00,0.75,0.06,1.11],['c',0.12,0.54,0.27,0.99,0.51,1.47],['c',0.69,1.38,1.83,2.55,3.42,3.42],['c',0.96,0.54,2.07,0.90,3.21,1.08],['c',0.78,0.12,2.04,0.12,2.94,-0.03],['c',0.51,-0.06,0.45,-0.03,0.42,-0.30],['c',-0.24,-3.33,-0.72,-6.33,-1.62,-10.08],['c',-0.09,-0.39,-0.18,-0.75,-0.18,-0.78],['c',-0.03,-0.03,-0.42,0.00,-0.81,0.09],['c',-0.90,0.18,-1.65,0.57,-2.22,1.14],['c',-0.72,0.72,-1.08,1.65,-1.05,2.64],['c',0.06,0.96,0.48,1.83,1.23,2.58],['c',0.36,0.36,0.72,0.63,1.17,0.90],['c',0.33,0.18,0.36,0.21,0.42,0.33],['c',0.18,0.42,-0.18,0.90,-0.60,0.87],['c',-0.18,-0.03,-0.84,-0.36,-1.26,-0.63],['c',-0.78,-0.51,-1.38,-1.11,-1.86,-1.83],['c',-1.77,-2.70,-0.99,-6.42,1.71,-8.19],['c',0.30,-0.21,0.81,-0.48,1.17,-0.63],['c',0.30,-0.09,1.02,-0.30,1.14,-0.30],['c',0.06,0.00,0.09,0.00,0.09,-0.03],['c',0.03,-0.03,-0.51,-1.92,-1.23,-4.26],['z'],['m',3.78,7.41],['c',-0.18,-0.03,-0.36,-0.06,-0.39,-0.06],['c',-0.03,0.00,0.00,0.21,0.18,1.02],['c',0.75,3.18,1.26,6.30,1.50,9.09],['c',0.06,0.72,0.00,0.69,0.51,0.42],['c',0.78,-0.36,1.44,-0.96,1.98,-1.77],['c',1.08,-1.62,1.20,-3.69,0.30,-5.55],['c',-0.81,-1.62,-2.31,-2.79,-4.08,-3.15],['z']],w:19.051,h:57.057}, - 'clefs.perc':{d:[['M',5.07,-7.44],['l',0.09,-0.06],['l',1.53,0.00],['l',1.53,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,7.35],['l',0.00,7.32],['l',-0.06,0.09],['l',-0.09,0.06],['l',-1.53,0.00],['l',-1.53,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-7.32],['l',0.00,-7.35],['z'],['m',6.63,0.00],['l',0.09,-0.06],['l',1.53,0.00],['l',1.53,0.00],['l',0.09,0.06],['l',0.06,0.09],['l',0.00,7.35],['l',0.00,7.32],['l',-0.06,0.09],['l',-0.09,0.06],['l',-1.53,0.00],['l',-1.53,0.00],['l',-0.09,-0.06],['l',-0.06,-0.09],['l',0.00,-7.32],['l',0.00,-7.35],['z']],w:9.99,h:14.97}, - 'timesig.common':{d:[['M',6.66,-7.83],['c',0.72,-0.06,1.41,-0.03,1.98,0.09],['c',1.20,0.27,2.34,0.96,3.09,1.92],['c',0.63,0.81,1.08,1.86,1.14,2.73],['c',0.06,1.02,-0.51,1.92,-1.44,2.22],['c',-0.24,0.09,-0.30,0.09,-0.63,0.09],['c',-0.33,0.00,-0.42,0.00,-0.63,-0.06],['c',-0.66,-0.24,-1.14,-0.63,-1.41,-1.20],['c',-0.15,-0.30,-0.21,-0.51,-0.24,-0.90],['c',-0.06,-1.08,0.57,-2.04,1.56,-2.37],['c',0.18,-0.06,0.27,-0.06,0.63,-0.06],['l',0.45,0.00],['c',0.06,0.03,0.09,0.03,0.09,0.00],['c',0.00,0.00,-0.09,-0.12,-0.24,-0.27],['c',-1.02,-1.11,-2.55,-1.68,-4.08,-1.50],['c',-1.29,0.15,-2.04,0.69,-2.40,1.74],['c',-0.36,0.93,-0.42,1.89,-0.42,5.37],['c',0.00,2.97,0.06,3.96,0.24,4.77],['c',0.24,1.08,0.63,1.68,1.41,2.07],['c',0.81,0.39,2.16,0.45,3.18,0.09],['c',1.29,-0.45,2.37,-1.53,3.03,-2.97],['c',0.15,-0.33,0.33,-0.87,0.39,-1.17],['c',0.09,-0.24,0.15,-0.36,0.30,-0.39],['c',0.21,-0.03,0.42,0.15,0.39,0.36],['c',-0.06,0.39,-0.42,1.38,-0.69,1.89],['c',-0.96,1.80,-2.49,2.94,-4.23,3.18],['c',-0.99,0.12,-2.58,-0.06,-3.63,-0.45],['c',-0.96,-0.36,-1.71,-0.84,-2.40,-1.50],['c',-1.11,-1.11,-1.80,-2.61,-2.04,-4.56],['c',-0.06,-0.60,-0.06,-2.01,0.00,-2.61],['c',0.24,-1.95,0.90,-3.45,2.01,-4.56],['c',0.69,-0.66,1.44,-1.11,2.37,-1.47],['c',0.63,-0.24,1.47,-0.42,2.22,-0.48],['z']],w:13.038,h:15.689}, - 'timesig.cut':{d:[['M',6.24,-10.44],['c',0.09,-0.06,0.09,-0.06,0.48,-0.06],['c',0.36,0.00,0.36,0.00,0.45,0.06],['l',0.06,0.09],['l',0.00,1.23],['l',0.00,1.26],['l',0.27,0.00],['c',1.26,0.00,2.49,0.45,3.48,1.29],['c',1.05,0.87,1.80,2.28,1.89,3.48],['c',0.06,1.02,-0.51,1.92,-1.44,2.22],['c',-0.24,0.09,-0.30,0.09,-0.63,0.09],['c',-0.33,0.00,-0.42,0.00,-0.63,-0.06],['c',-0.66,-0.24,-1.14,-0.63,-1.41,-1.20],['c',-0.15,-0.30,-0.21,-0.51,-0.24,-0.90],['c',-0.06,-1.08,0.57,-2.04,1.56,-2.37],['c',0.18,-0.06,0.27,-0.06,0.63,-0.06],['l',0.45,0.00],['c',0.06,0.03,0.09,0.03,0.09,0.00],['c',0.00,-0.03,-0.45,-0.51,-0.66,-0.69],['c',-0.87,-0.69,-1.83,-1.05,-2.94,-1.11],['l',-0.42,0.00],['l',0.00,7.17],['l',0.00,7.14],['l',0.42,0.00],['c',0.69,-0.03,1.23,-0.18,1.86,-0.51],['c',1.05,-0.51,1.89,-1.47,2.46,-2.70],['c',0.15,-0.33,0.33,-0.87,0.39,-1.17],['c',0.09,-0.24,0.15,-0.36,0.30,-0.39],['c',0.21,-0.03,0.42,0.15,0.39,0.36],['c',-0.03,0.24,-0.21,0.78,-0.39,1.20],['c',-0.96,2.37,-2.94,3.90,-5.13,3.90],['l',-0.30,0.00],['l',0.00,1.26],['l',0.00,1.23],['l',-0.06,0.09],['c',-0.09,0.06,-0.09,0.06,-0.45,0.06],['c',-0.39,0.00,-0.39,0.00,-0.48,-0.06],['l',-0.06,-0.09],['l',0.00,-1.29],['l',0.00,-1.29],['l',-0.21,-0.03],['c',-1.23,-0.21,-2.31,-0.63,-3.21,-1.29],['c',-0.15,-0.09,-0.45,-0.36,-0.66,-0.57],['c',-1.11,-1.11,-1.80,-2.61,-2.04,-4.56],['c',-0.06,-0.60,-0.06,-2.01,0.00,-2.61],['c',0.24,-1.95,0.93,-3.45,2.04,-4.59],['c',0.42,-0.39,0.78,-0.66,1.26,-0.93],['c',0.75,-0.45,1.65,-0.75,2.61,-0.90],['l',0.21,-0.03],['l',0.00,-1.29],['l',0.00,-1.29],['z'],['m',-0.06,10.44],['c',0.00,-5.58,0.00,-6.99,-0.03,-6.99],['c',-0.15,0.00,-0.63,0.27,-0.87,0.45],['c',-0.45,0.36,-0.75,0.93,-0.93,1.77],['c',-0.18,0.81,-0.24,1.80,-0.24,4.74],['c',0.00,2.97,0.06,3.96,0.24,4.77],['c',0.24,1.08,0.66,1.68,1.41,2.07],['c',0.12,0.06,0.30,0.12,0.33,0.15],['l',0.09,0.00],['l',0.00,-6.96],['z']],w:13.038,h:20.97}, - 'timesig.imperfectum':{d:[['M',13,-5],['a',8,8,0,1,0,0,10]],w:13.038,h:20.97}, - 'timesig.imperfectum2':{d:[['M',13,-5],['a',8,8,0,1,0,0,10]],w:13.038,h:20.97}, - 'timesig.perfectum':{d:[['M',13,-5],['a',8,8,0,1,0,0,10]],w:13.038,h:20.97}, - 'timesig.perfectum2':{d:[['M',13,-5],['a',8,8,0,1,0,0,10]],w:13.038,h:20.97}, - 'f':{d:[['M',9.93,-14.28],['c',1.53,-0.18,2.88,0.45,3.12,1.50],['c',0.12,0.51,0.00,1.32,-0.27,1.86],['c',-0.15,0.30,-0.42,0.57,-0.63,0.69],['c',-0.69,0.36,-1.56,0.03,-1.83,-0.69],['c',-0.09,-0.24,-0.09,-0.69,0.00,-0.87],['c',0.06,-0.12,0.21,-0.24,0.45,-0.42],['c',0.42,-0.24,0.57,-0.45,0.60,-0.72],['c',0.03,-0.33,-0.09,-0.39,-0.63,-0.42],['c',-0.30,0.00,-0.45,0.00,-0.60,0.03],['c',-0.81,0.21,-1.35,0.93,-1.74,2.46],['c',-0.06,0.27,-0.48,2.25,-0.48,2.31],['c',0.00,0.03,0.39,0.03,0.90,0.03],['c',0.72,0.00,0.90,0.00,0.99,0.06],['c',0.42,0.15,0.45,0.72,0.03,0.90],['c',-0.12,0.06,-0.24,0.06,-1.17,0.06],['l',-1.05,0.00],['l',-0.78,2.55],['c',-0.45,1.41,-0.87,2.79,-0.96,3.06],['c',-0.87,2.37,-2.37,4.74,-3.78,5.91],['c',-1.05,0.90,-2.04,1.23,-3.09,1.08],['c',-1.11,-0.18,-1.89,-0.78,-2.04,-1.59],['c',-0.12,-0.66,0.15,-1.71,0.54,-2.19],['c',0.69,-0.75,1.86,-0.54,2.22,0.39],['c',0.06,0.15,0.09,0.27,0.09,0.48],['c',0.00,0.24,-0.03,0.27,-0.12,0.42],['c',-0.03,0.09,-0.15,0.18,-0.27,0.27],['c',-0.09,0.06,-0.27,0.21,-0.36,0.27],['c',-0.24,0.18,-0.36,0.36,-0.39,0.60],['c',-0.03,0.33,0.09,0.39,0.63,0.42],['c',0.42,0.00,0.63,-0.03,0.90,-0.15],['c',0.60,-0.30,0.96,-0.96,1.38,-2.64],['c',0.09,-0.42,0.63,-2.55,1.17,-4.77],['l',1.02,-4.08],['c',0.00,-0.03,-0.36,-0.03,-0.81,-0.03],['c',-0.72,0.00,-0.81,0.00,-0.93,-0.06],['c',-0.42,-0.18,-0.39,-0.75,0.03,-0.90],['c',0.09,-0.06,0.27,-0.06,1.05,-0.06],['l',0.96,0.00],['l',0.00,-0.09],['c',0.06,-0.18,0.30,-0.72,0.51,-1.17],['c',1.20,-2.46,3.30,-4.23,5.34,-4.50],['z']],w:16.155,h:19.445}, - 'm':{d:[['M',2.79,-8.91],['c',0.09,0.00,0.30,-0.03,0.45,-0.03],['c',0.24,0.03,0.30,0.03,0.45,0.12],['c',0.36,0.15,0.63,0.54,0.75,1.02],['l',0.03,0.21],['l',0.33,-0.30],['c',0.69,-0.69,1.38,-1.02,2.07,-1.02],['c',0.27,0.00,0.33,0.00,0.48,0.06],['c',0.21,0.09,0.48,0.36,0.63,0.60],['c',0.03,0.09,0.12,0.27,0.18,0.42],['c',0.03,0.15,0.09,0.27,0.12,0.27],['c',0.00,0.00,0.09,-0.09,0.18,-0.21],['c',0.33,-0.39,0.87,-0.81,1.29,-0.99],['c',0.78,-0.33,1.47,-0.21,2.01,0.33],['c',0.30,0.33,0.48,0.69,0.60,1.14],['c',0.09,0.42,0.06,0.54,-0.54,3.06],['c',-0.33,1.29,-0.57,2.40,-0.57,2.43],['c',0.00,0.12,0.09,0.21,0.21,0.21],['c',0.24,0.00,0.75,-0.30,1.20,-0.72],['c',0.45,-0.39,0.60,-0.45,0.78,-0.27],['c',0.18,0.18,0.09,0.36,-0.45,0.87],['c',-1.05,0.96,-1.83,1.47,-2.58,1.71],['c',-0.93,0.33,-1.53,0.21,-1.80,-0.33],['c',-0.06,-0.15,-0.06,-0.21,-0.06,-0.45],['c',0.00,-0.24,0.03,-0.48,0.60,-2.82],['c',0.42,-1.71,0.60,-2.64,0.63,-2.79],['c',0.03,-0.57,-0.30,-0.75,-0.84,-0.48],['c',-0.24,0.12,-0.54,0.39,-0.66,0.63],['c',-0.03,0.09,-0.42,1.38,-0.90,3.00],['c',-0.90,3.15,-0.84,3.00,-1.14,3.15],['l',-0.15,0.09],['l',-0.78,0.00],['c',-0.60,0.00,-0.78,0.00,-0.84,-0.06],['c',-0.09,-0.03,-0.18,-0.18,-0.18,-0.27],['c',0.00,-0.03,0.36,-1.38,0.84,-2.97],['c',0.57,-2.04,0.81,-2.97,0.84,-3.12],['c',0.03,-0.54,-0.30,-0.72,-0.84,-0.45],['c',-0.24,0.12,-0.57,0.42,-0.66,0.63],['c',-0.06,0.09,-0.51,1.44,-1.05,2.97],['c',-0.51,1.56,-0.99,2.85,-0.99,2.91],['c',-0.06,0.12,-0.21,0.24,-0.36,0.30],['c',-0.12,0.06,-0.21,0.06,-0.90,0.06],['c',-0.60,0.00,-0.78,0.00,-0.84,-0.06],['c',-0.09,-0.03,-0.18,-0.18,-0.18,-0.27],['c',0.00,-0.03,0.45,-1.38,0.99,-2.97],['c',1.05,-3.18,1.05,-3.18,0.93,-3.45],['c',-0.12,-0.27,-0.39,-0.30,-0.72,-0.15],['c',-0.54,0.27,-1.14,1.17,-1.56,2.40],['c',-0.06,0.15,-0.15,0.30,-0.18,0.36],['c',-0.21,0.21,-0.57,0.27,-0.72,0.09],['c',-0.09,-0.09,-0.06,-0.21,0.06,-0.63],['c',0.48,-1.26,1.26,-2.46,2.01,-3.21],['c',0.57,-0.54,1.20,-0.87,1.83,-1.02],['z']],w:14.687,h:9.126}, - 'p':{d:[['M',1.92,-8.70],['c',0.27,-0.09,0.81,-0.06,1.11,0.03],['c',0.54,0.18,0.93,0.51,1.17,0.99],['c',0.09,0.15,0.15,0.33,0.18,0.36],['l',0.00,0.12],['l',0.30,-0.27],['c',0.66,-0.60,1.35,-1.02,2.13,-1.20],['c',0.21,-0.06,0.33,-0.06,0.78,-0.06],['c',0.45,0.00,0.51,0.00,0.84,0.09],['c',1.29,0.33,2.07,1.32,2.25,2.79],['c',0.09,0.81,-0.09,2.01,-0.45,2.79],['c',-0.54,1.26,-1.86,2.55,-3.18,3.03],['c',-0.45,0.18,-0.81,0.24,-1.29,0.24],['c',-0.69,-0.03,-1.35,-0.18,-1.86,-0.45],['c',-0.30,-0.15,-0.51,-0.18,-0.69,-0.09],['c',-0.09,0.03,-0.18,0.09,-0.18,0.12],['c',-0.09,0.12,-1.05,2.94,-1.05,3.06],['c',0.00,0.24,0.18,0.48,0.51,0.63],['c',0.18,0.06,0.54,0.15,0.75,0.15],['c',0.21,0.00,0.36,0.06,0.42,0.18],['c',0.12,0.18,0.06,0.42,-0.12,0.54],['c',-0.09,0.03,-0.15,0.03,-0.78,0.00],['c',-1.98,-0.15,-3.81,-0.15,-5.79,0.00],['c',-0.63,0.03,-0.69,0.03,-0.78,0.00],['c',-0.24,-0.15,-0.24,-0.57,0.03,-0.66],['c',0.06,-0.03,0.48,-0.09,0.99,-0.12],['c',0.87,-0.06,1.11,-0.09,1.35,-0.21],['c',0.18,-0.06,0.33,-0.18,0.39,-0.30],['c',0.06,-0.12,3.24,-9.42,3.27,-9.60],['c',0.06,-0.33,0.03,-0.57,-0.15,-0.69],['c',-0.09,-0.06,-0.12,-0.06,-0.30,-0.06],['c',-0.69,0.06,-1.53,1.02,-2.28,2.61],['c',-0.09,0.21,-0.21,0.45,-0.27,0.51],['c',-0.09,0.12,-0.33,0.24,-0.48,0.24],['c',-0.18,0.00,-0.36,-0.15,-0.36,-0.30],['c',0.00,-0.24,0.78,-1.83,1.26,-2.55],['c',0.72,-1.11,1.47,-1.74,2.28,-1.92],['z'],['m',5.37,1.47],['c',-0.27,-0.12,-0.75,-0.03,-1.14,0.21],['c',-0.75,0.48,-1.47,1.68,-1.89,3.15],['c',-0.45,1.47,-0.42,2.34,0.00,2.70],['c',0.45,0.39,1.26,0.21,1.83,-0.36],['c',0.51,-0.51,0.99,-1.68,1.38,-3.27],['c',0.30,-1.17,0.33,-1.74,0.15,-2.13],['c',-0.09,-0.15,-0.15,-0.21,-0.33,-0.30],['z']],w:14.689,h:13.127}, - 'r':{d:[['M',6.33,-9.12],['c',0.27,-0.03,0.93,0.00,1.20,0.06],['c',0.84,0.21,1.23,0.81,1.02,1.53],['c',-0.24,0.75,-0.90,1.17,-1.56,0.96],['c',-0.33,-0.09,-0.51,-0.30,-0.66,-0.75],['c',-0.03,-0.12,-0.09,-0.24,-0.12,-0.30],['c',-0.09,-0.15,-0.30,-0.24,-0.48,-0.24],['c',-0.57,0.00,-1.38,0.54,-1.65,1.08],['c',-0.06,0.15,-0.33,1.17,-0.90,3.27],['c',-0.57,2.31,-0.81,3.12,-0.87,3.21],['c',-0.03,0.06,-0.12,0.15,-0.18,0.21],['l',-0.12,0.06],['l',-0.81,0.03],['c',-0.69,0.00,-0.81,0.00,-0.90,-0.03],['c',-0.09,-0.06,-0.18,-0.21,-0.18,-0.30],['c',0.00,-0.06,0.39,-1.62,0.90,-3.51],['c',0.84,-3.24,0.87,-3.45,0.87,-3.72],['c',0.00,-0.21,0.00,-0.27,-0.03,-0.36],['c',-0.12,-0.15,-0.21,-0.24,-0.42,-0.24],['c',-0.24,0.00,-0.45,0.15,-0.78,0.42],['c',-0.33,0.36,-0.45,0.54,-0.72,1.14],['c',-0.03,0.12,-0.21,0.24,-0.36,0.27],['c',-0.12,0.00,-0.15,0.00,-0.24,-0.06],['c',-0.18,-0.12,-0.18,-0.21,-0.06,-0.54],['c',0.21,-0.57,0.42,-0.93,0.78,-1.32],['c',0.54,-0.51,1.20,-0.81,1.95,-0.87],['c',0.81,-0.03,1.53,0.30,1.92,0.87],['l',0.12,0.18],['l',0.09,-0.09],['c',0.57,-0.45,1.41,-0.84,2.19,-0.96],['z']],w:9.41,h:9.132}, - 's':{d:[['M',4.47,-8.73],['c',0.09,0.00,0.36,-0.03,0.57,-0.03],['c',0.75,0.03,1.29,0.24,1.71,0.63],['c',0.51,0.54,0.66,1.26,0.36,1.83],['c',-0.24,0.42,-0.63,0.57,-1.11,0.42],['c',-0.33,-0.09,-0.60,-0.36,-0.60,-0.57],['c',0.00,-0.03,0.06,-0.21,0.15,-0.39],['c',0.12,-0.21,0.15,-0.33,0.18,-0.48],['c',0.00,-0.24,-0.06,-0.48,-0.15,-0.60],['c',-0.15,-0.21,-0.42,-0.24,-0.75,-0.15],['c',-0.27,0.06,-0.48,0.18,-0.69,0.36],['c',-0.39,0.39,-0.51,0.96,-0.33,1.38],['c',0.09,0.21,0.42,0.51,0.78,0.72],['c',1.11,0.69,1.59,1.11,1.89,1.68],['c',0.21,0.39,0.24,0.78,0.15,1.29],['c',-0.18,1.20,-1.17,2.16,-2.52,2.52],['c',-1.02,0.24,-1.95,0.12,-2.70,-0.42],['c',-0.72,-0.51,-0.99,-1.47,-0.60,-2.19],['c',0.24,-0.48,0.72,-0.63,1.17,-0.42],['c',0.33,0.18,0.54,0.45,0.57,0.81],['c',0.00,0.21,-0.03,0.30,-0.33,0.51],['c',-0.33,0.24,-0.39,0.42,-0.27,0.69],['c',0.06,0.15,0.21,0.27,0.45,0.33],['c',0.30,0.09,0.87,0.09,1.20,0.00],['c',0.75,-0.21,1.23,-0.72,1.29,-1.35],['c',0.03,-0.42,-0.15,-0.81,-0.54,-1.20],['c',-0.24,-0.24,-0.48,-0.42,-1.41,-1.02],['c',-0.69,-0.42,-1.05,-0.93,-1.05,-1.47],['c',0.00,-0.39,0.12,-0.87,0.30,-1.23],['c',0.27,-0.57,0.78,-1.05,1.38,-1.35],['c',0.24,-0.12,0.63,-0.27,0.90,-0.30],['z']],w:6.632,h:8.758}, - 'z':{d:[['M',2.64,-7.95],['c',0.36,-0.09,0.81,-0.03,1.71,0.27],['c',0.78,0.21,0.96,0.27,1.74,0.30],['c',0.87,0.06,1.02,0.03,1.38,-0.21],['c',0.21,-0.15,0.33,-0.15,0.48,-0.06],['c',0.15,0.09,0.21,0.30,0.15,0.45],['c',-0.03,0.06,-1.26,1.26,-2.76,2.67],['l',-2.73,2.55],['l',0.54,0.03],['c',0.54,0.03,0.72,0.03,2.01,0.15],['c',0.36,0.03,0.90,0.06,1.20,0.09],['c',0.66,0.00,0.81,-0.03,1.02,-0.24],['c',0.30,-0.30,0.39,-0.72,0.27,-1.23],['c',-0.06,-0.27,-0.06,-0.27,-0.03,-0.39],['c',0.15,-0.30,0.54,-0.27,0.69,0.03],['c',0.15,0.33,0.27,1.02,0.27,1.50],['c',0.00,1.47,-1.11,2.70,-2.52,2.79],['c',-0.57,0.03,-1.02,-0.09,-2.01,-0.51],['c',-1.02,-0.42,-1.23,-0.48,-2.13,-0.54],['c',-0.81,-0.06,-0.96,-0.03,-1.26,0.18],['c',-0.12,0.06,-0.24,0.12,-0.27,0.12],['c',-0.27,0.00,-0.45,-0.30,-0.36,-0.51],['c',0.03,-0.06,1.32,-1.32,2.91,-2.79],['l',2.88,-2.73],['c',-0.03,0.00,-0.21,0.03,-0.42,0.06],['c',-0.21,0.03,-0.78,0.09,-1.23,0.12],['c',-1.11,0.12,-1.23,0.15,-1.95,0.27],['c',-0.72,0.15,-1.17,0.18,-1.29,0.09],['c',-0.27,-0.18,-0.21,-0.75,0.12,-1.26],['c',0.39,-0.60,0.93,-1.02,1.59,-1.20],['z']],w:8.573,h:8.743}, - '+':{d:[['M',3.48,-9.3],['c',0.18,-0.09,0.36,-0.09,0.54,0.00],['c',0.18,0.09,0.24,0.15,0.33,0.30],['l',0.06,0.15],['l',0.00,1.29],['l',0.00,1.29],['l',1.29,0.00],['c',1.23,0.00,1.29,0.00,1.41,0.06],['c',0.06,0.03,0.15,0.09,0.18,0.12],['c',0.12,0.09,0.21,0.33,0.21,0.48],['c',0.00,0.15,-0.09,0.39,-0.21,0.48],['c',-0.03,0.03,-0.12,0.09,-0.18,0.12],['c',-0.12,0.06,-0.18,0.06,-1.41,0.06],['l',-1.29,0.00],['l',0.00,1.29],['c',0.00,1.23,0.00,1.29,-0.06,1.41],['c',-0.09,0.18,-0.15,0.24,-0.30,0.33],['c',-0.21,0.09,-0.39,0.09,-0.57,0.00],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['c',-0.06,-0.12,-0.06,-0.18,-0.06,-1.41],['l',0.00,-1.29],['l',-1.29,0.00],['c',-1.23,0.00,-1.29,0.00,-1.41,-0.06],['c',-0.18,-0.09,-0.24,-0.15,-0.33,-0.33],['c',-0.09,-0.18,-0.09,-0.36,0.00,-0.54],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['l',0.15,-0.06],['l',1.26,0.00],['l',1.29,0.00],['l',0.00,-1.29],['c',0.00,-1.23,0.00,-1.29,0.06,-1.41],['c',0.09,-0.18,0.15,-0.24,0.33,-0.33],['z']],w:7.507,h:7.515}, - ',':{d:[['M',1.32,-3.36],['c',0.57,-0.15,1.17,0.03,1.59,0.45],['c',0.45,0.45,0.60,0.96,0.51,1.89],['c',-0.09,1.23,-0.42,2.46,-0.99,3.93],['c',-0.30,0.72,-0.72,1.62,-0.78,1.68],['c',-0.18,0.21,-0.51,0.18,-0.66,-0.06],['c',-0.03,-0.06,-0.06,-0.15,-0.06,-0.18],['c',0.00,-0.06,0.12,-0.33,0.24,-0.63],['c',0.84,-1.80,1.02,-2.61,0.69,-3.24],['c',-0.12,-0.24,-0.27,-0.36,-0.75,-0.60],['c',-0.36,-0.15,-0.42,-0.21,-0.60,-0.39],['c',-0.69,-0.69,-0.69,-1.71,0.00,-2.40],['c',0.21,-0.21,0.51,-0.39,0.81,-0.45],['z']],w:3.452,h:8.143}, - '-':{d:[['M',0.18,-5.34],['c',0.09,-0.06,0.15,-0.06,2.31,-0.06],['c',2.46,0.00,2.37,0.00,2.46,0.21],['c',0.12,0.21,0.03,0.42,-0.15,0.54],['c',-0.09,0.06,-0.15,0.06,-2.28,0.06],['c',-2.16,0.00,-2.22,0.00,-2.31,-0.06],['c',-0.27,-0.15,-0.27,-0.54,-0.03,-0.69],['z']],w:5.001,h:0.81}, - '.':{d:[['M',1.32,-3.36],['c',1.05,-0.27,2.10,0.57,2.10,1.65],['c',0.00,1.08,-1.05,1.92,-2.10,1.65],['c',-0.90,-0.21,-1.50,-1.14,-1.26,-2.04],['c',0.12,-0.63,0.63,-1.11,1.26,-1.26],['z']],w:3.413,h:3.402}, - 'scripts.wedge':{d:[['M',-3.66,-7.44],['c',0.06,-0.09,0.00,-0.09,0.81,0.03],['c',1.86,0.30,3.84,0.30,5.73,0.00],['c',0.78,-0.12,0.72,-0.12,0.78,-0.03],['c',0.15,0.15,0.12,0.24,-0.24,0.60],['c',-0.93,0.93,-1.98,2.76,-2.67,4.62],['c',-0.30,0.78,-0.51,1.71,-0.51,2.13],['c',0.00,0.15,0.00,0.18,-0.06,0.27],['c',-0.12,0.09,-0.24,0.09,-0.36,0.00],['c',-0.06,-0.09,-0.06,-0.12,-0.06,-0.27],['c',0.00,-0.42,-0.21,-1.35,-0.51,-2.13],['c',-0.69,-1.86,-1.74,-3.69,-2.67,-4.62],['c',-0.36,-0.36,-0.39,-0.45,-0.24,-0.60],['z']],w:7.49,h:7.752}, - 'scripts.thumb':{d:[['M',-0.54,-3.69],['c',0.15,-0.03,0.36,-0.06,0.51,-0.06],['c',1.44,0.00,2.58,1.11,2.94,2.85],['c',0.09,0.48,0.09,1.32,0.00,1.80],['c',-0.27,1.41,-1.08,2.43,-2.16,2.73],['l',-0.18,0.06],['l',0.00,0.12],['c',0.03,0.06,0.06,0.45,0.09,0.87],['c',0.03,0.57,0.03,0.78,0.00,0.84],['c',-0.09,0.27,-0.39,0.48,-0.66,0.48],['c',-0.27,0.00,-0.57,-0.21,-0.66,-0.48],['c',-0.03,-0.06,-0.03,-0.27,0.00,-0.84],['c',0.03,-0.42,0.06,-0.81,0.09,-0.87],['l',0.00,-0.12],['l',-0.18,-0.06],['c',-1.08,-0.30,-1.89,-1.32,-2.16,-2.73],['c',-0.09,-0.48,-0.09,-1.32,0.00,-1.80],['c',0.15,-0.84,0.51,-1.53,1.02,-2.04],['c',0.39,-0.39,0.84,-0.63,1.35,-0.75],['z'],['m',1.05,0.90],['c',-0.15,-0.09,-0.21,-0.09,-0.45,-0.12],['c',-0.15,0.00,-0.30,0.03,-0.39,0.03],['c',-0.57,0.18,-0.90,0.72,-1.08,1.74],['c',-0.06,0.48,-0.06,1.80,0.00,2.28],['c',0.15,0.90,0.42,1.44,0.90,1.65],['c',0.18,0.09,0.21,0.09,0.51,0.09],['c',0.30,0.00,0.33,0.00,0.51,-0.09],['c',0.48,-0.21,0.75,-0.75,0.90,-1.65],['c',0.03,-0.27,0.03,-0.54,0.03,-1.14],['c',0.00,-0.60,0.00,-0.87,-0.03,-1.14],['c',-0.15,-0.90,-0.45,-1.44,-0.90,-1.65],['z']],w:5.955,h:9.75}, - 'scripts.open':{d:[['M',-0.54,-3.69],['c',0.15,-0.03,0.36,-0.06,0.51,-0.06],['c',1.44,0.00,2.58,1.11,2.94,2.85],['c',0.09,0.48,0.09,1.32,0.00,1.80],['c',-0.33,1.74,-1.47,2.85,-2.91,2.85],['c',-1.44,0.00,-2.58,-1.11,-2.91,-2.85],['c',-0.09,-0.48,-0.09,-1.32,0.00,-1.80],['c',0.15,-0.84,0.51,-1.53,1.02,-2.04],['c',0.39,-0.39,0.84,-0.63,1.35,-0.75],['z'],['m',1.11,0.90],['c',-0.21,-0.09,-0.27,-0.09,-0.51,-0.12],['c',-0.30,0.00,-0.42,0.03,-0.66,0.15],['c',-0.24,0.12,-0.51,0.39,-0.66,0.63],['c',-0.54,0.93,-0.63,2.64,-0.21,3.81],['c',0.21,0.54,0.51,0.90,0.93,1.11],['c',0.21,0.09,0.24,0.09,0.54,0.09],['c',0.30,0.00,0.33,0.00,0.54,-0.09],['c',0.42,-0.21,0.72,-0.57,0.93,-1.11],['c',0.36,-0.99,0.36,-2.37,0.00,-3.36],['c',-0.21,-0.54,-0.51,-0.90,-0.90,-1.11],['z']],w:5.955,h:7.5}, - 'scripts.longphrase':{d:[['M',1.47,-15.09],['c',0.36,-0.09,0.66,-0.18,0.69,-0.18],['c',0.06,0.00,0.06,0.54,0.06,11.25],['l',0.00,11.25],['l',-0.63,0.15],['c',-0.66,0.18,-1.44,0.39,-1.50,0.39],['c',-0.03,0.00,-0.03,-3.39,-0.03,-11.25],['l',0.00,-11.25],['l',0.36,-0.09],['c',0.21,-0.06,0.66,-0.18,1.05,-0.27],['z']],w:2.16,h:23.04}, - 'scripts.mediumphrase':{d:[['M',1.47,-7.59],['c',0.36,-0.09,0.66,-0.18,0.69,-0.18],['c',0.06,0.00,0.06,0.39,0.06,7.50],['l',0.00,7.50],['l',-0.63,0.15],['c',-0.66,0.18,-1.44,0.39,-1.50,0.39],['c',-0.03,0.00,-0.03,-2.28,-0.03,-7.50],['l',0.00,-7.50],['l',0.36,-0.09],['c',0.21,-0.06,0.66,-0.18,1.05,-0.27],['z']],w:2.16,h:15.54}, - 'scripts.shortphrase':{d:[['M',1.47,-7.59],['c',0.36,-0.09,0.66,-0.18,0.69,-0.18],['c',0.06,0.00,0.06,0.21,0.06,3.75],['l',0.00,3.75],['l',-0.42,0.09],['c',-0.57,0.18,-1.65,0.45,-1.71,0.45],['c',-0.03,0.00,-0.03,-0.72,-0.03,-3.75],['l',0.00,-3.75],['l',0.36,-0.09],['c',0.21,-0.06,0.66,-0.18,1.05,-0.27],['z']],w:2.16,h:8.04}, - 'scripts.snap':{d:[['M',4.50,-3.39],['c',0.36,-0.03,0.96,-0.03,1.35,0.00],['c',1.56,0.15,3.15,0.90,4.20,2.01],['c',0.24,0.27,0.33,0.42,0.33,0.60],['c',0.00,0.27,0.03,0.24,-2.46,2.22],['c',-1.29,1.02,-2.40,1.86,-2.49,1.92],['c',-0.18,0.09,-0.30,0.09,-0.48,0.00],['c',-0.09,-0.06,-1.20,-0.90,-2.49,-1.92],['c',-2.49,-1.98,-2.46,-1.95,-2.46,-2.22],['c',0.00,-0.18,0.09,-0.33,0.33,-0.60],['c',1.05,-1.08,2.64,-1.86,4.17,-2.01],['z'],['m',1.29,1.17],['c',-1.47,-0.15,-2.97,0.30,-4.14,1.20],['l',-0.18,0.15],['l',0.06,0.09],['c',0.15,0.12,3.63,2.85,3.66,2.85],['c',0.03,0.00,3.51,-2.73,3.66,-2.85],['l',0.06,-0.09],['l',-0.18,-0.15],['c',-0.84,-0.66,-1.89,-1.08,-2.94,-1.20],['z']],w:10.38,h:6.84}}; - - // Custom characters that weren't generated from the font: - glyphs['noteheads.slash.whole'] = {d:[['M',5,-5],['l',1,1],['l',-5,5],['l',-1,-1],['z'],['m',4,6],['l',-5,-5],['l',2,-2],['l',5,5],['z'],['m',0,-2],['l',1,1],['l',-5,5],['l',-1,-1],['z'],['m',-4,6],['l',-5,-5],['l',2,-2],['l',5,5],['z']],w:10.81,h:15.63}; - - glyphs['noteheads.slash.quarter'] = {d:[['M',9,-6],['l',0,4],['l',-9,9],['l',0,-4],['z']],w:9,h:9}; - - glyphs['noteheads.harmonic.quarter'] = {d:[['M',3.63,-4.02],['c',0.09,-0.06,0.18,-0.09,0.24,-0.03],['c',0.03,0.03,0.87,0.93,1.83,2.01],['c',1.50,1.65,1.80,1.98,1.80,2.04],['c',0.00,0.06,-0.30,0.39,-1.80,2.04],['c',-0.96,1.08,-1.80,1.98,-1.83,2.01],['c',-0.06,0.06,-0.15,0.03,-0.24,-0.03],['c',-0.12,-0.09,-3.54,-3.84,-3.60,-3.93],['c',-0.03,-0.03,-0.03,-0.09,-0.03,-0.15],['c',0.03,-0.06,3.45,-3.84,3.63,-3.96],['z']],w:7.5,h:8.165}; - -var pathClone = function (pathArray) { - var res = []; - for (var i = 0, ii = pathArray.length; i < ii; i++) { - res[i] = []; - for (var j = 0, jj = pathArray[i].length; j < jj; j++) { - res[i][j] = pathArray[i][j]; - } - } - return res; -}; - -var pathScale = function (pathArray, kx, ky) { - for (var i = 0, ii = pathArray.length; i < ii; i++) { - var p = pathArray[i]; - var j, jj; - for (j = 1, jj = p.length; j < jj; j++) { - p[j] *= (j % 2) ? kx : ky; - } - } -}; - -var Glyphs = { - printSymbol: function (x,y,symb,paper, klass) { - if (!glyphs[symb]) return null; - var pathArray = pathClone(glyphs[symb].d); - pathArray[0][1] +=x; - pathArray[0][2] +=y; - var path = ""; - for (var i = 0; i < pathArray.length; i++) - path += pathArray[i].join(" "); - return paper.path({path:path, stroke:"none", fill:"#000000", 'class': klass }); - }, - - getPathForSymbol: function (x,y,symb,scalex, scaley) { - scalex = scalex || 1; - scaley = scaley || 1; - if (!glyphs[symb]) return null; - var pathArray = pathClone(glyphs[symb].d); - if (scalex!==1 || scaley!==1) pathScale(pathArray,scalex,scaley); - pathArray[0][1] +=x; - pathArray[0][2] +=y; - - return pathArray; - }, - - getSymbolWidth: function (symbol) { - if (glyphs[symbol]) return glyphs[symbol].w; - return 0; - }, - - symbolHeightInPitches: function(symbol) { - var height = glyphs[symbol] ? glyphs[symbol].h : 0; - return height / abc_spacing.STEP; - }, - - getSymbolAlign: function (symbol) { - if (symbol.substring(0,7)==="scripts" && - symbol!=="scripts.roll") { - return "center"; - } - return "left"; - }, - - getYCorr: function (symbol) { - switch(symbol) { - case "0": - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - case "+": return -2; - case "timesig.common": - case "timesig.cut": return 0; - case "flags.d32nd": return -1; - case "flags.d64th": return -2; - case "flags.u32nd": return 1; - case "flags.u64th": return 3; - case "rests.whole": return 1; - case "rests.half": return -1; - case "rests.8th": return -1; - case "rests.quarter": return -1; - case "rests.16th": return -1; - case "rests.32nd": return -1; - case "rests.64th": return -1; - case "f": - case "m": - case "p": - case "s": - case "z": - return -4; - case "scripts.trill": - case "scripts.upbow": - case "scripts.downbow": - return -2; - case "scripts.ufermata": - case "scripts.wedge": - case "scripts.roll": - case "scripts.shortphrase": - case "scripts.longphrase": - return -1; - case "scripts.dfermata": - return 1; - default: return 0; - } - }, - setSymbol: function(name, path) { - glyphs[name] = path; - } -}; - -var abc_glyphs = Glyphs; // we need the glyphs for layout information - -// abc_create_clef.js -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - -var createClef; - -(function() { - - createClef = function(elem, tuneNumber) { - var clef; - var octave = 0; - var abselem = new abc_absolute_element(elem,0,10, 'staff-extra', tuneNumber); - abselem.isClef = true; - switch (elem.type) { - case "treble": clef = "clefs.G"; break; - case "tenor": clef="clefs.C"; break; - case "alto": clef="clefs.C"; break; - case "bass": clef="clefs.F"; break; - case 'treble+8': clef = "clefs.G"; octave = 1; break; - case 'tenor+8':clef="clefs.C"; octave = 1; break; - case 'bass+8': clef="clefs.F"; octave = 1; break; - case 'alto+8': clef="clefs.C"; octave = 1; break; - case 'treble-8': clef = "clefs.G"; octave = -1; break; - case 'tenor-8':clef="clefs.C"; octave = -1; break; - case 'bass-8': clef="clefs.F"; octave = -1; break; - case 'alto-8': clef="clefs.C"; octave = -1; break; - case 'none': return null; - case 'perc': clef="clefs.perc"; break; - default: abselem.addChild(new abc_relative_element("clef="+elem.type, 0, 0, undefined, {type:"debug"})); - } - // if (elem.verticalPos) { - // pitch = elem.verticalPos; - // } - var dx =5; - if (clef) { - abselem.addRight(new abc_relative_element(clef, dx, abc_glyphs.getSymbolWidth(clef), elem.clefPos)); - - if (clef === 'clefs.G') { - abselem.top = 13; - abselem.bottom = -1; - } else { - abselem.top = 10; - abselem.bottom = 2; - } - if (octave !== 0) { - var scale = 2 / 3; - var adjustspacing = (abc_glyphs.getSymbolWidth(clef) - abc_glyphs.getSymbolWidth("8") * scale) / 2; - abselem.addRight(new abc_relative_element("8", dx + adjustspacing, abc_glyphs.getSymbolWidth("8") * scale, (octave > 0) ? abselem.top + 3 : abselem.bottom - 1, { - scalex: scale, - scaley: scale - })); - abselem.top += 2; - } - } - return abselem; - }; - -})(); - -var abc_create_clef = createClef; - -// abc_create_key_signature.js -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - - - -var createKeySignature; - -(function() { - - createKeySignature = function(elem, tuneNumber) { - if (!elem.accidentals || elem.accidentals.length === 0) - return null; - var abselem = new abc_absolute_element(elem, 0, 10, 'staff-extra', tuneNumber); - abselem.isKeySig = true; - var dx = 0; - abc_common.each(elem.accidentals, function(acc) { - var symbol; - switch(acc.acc) { - case "sharp": symbol = "accidentals.sharp"; break; - case "natural": symbol = "accidentals.nat"; break; - case "flat": symbol = "accidentals.flat"; break; - case "quartersharp": symbol = "accidentals.halfsharp"; break; - case "quarterflat": symbol = "accidentals.halfflat"; break; - default: symbol = "accidentals.flat"; - } - abselem.addRight(new abc_relative_element(symbol, dx, abc_glyphs.getSymbolWidth(symbol), acc.verticalPos, {thickness: abc_glyphs.symbolHeightInPitches(symbol)})); - dx += abc_glyphs.getSymbolWidth(symbol) + 2; - }, this); - return abselem; - }; -})(); - -var abc_create_key_signature = createKeySignature; - -// abc_create_time_signature.js -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - - -var createTimeSignature; - -(function() { - - createTimeSignature = function(elem, tuneNumber) { - var abselem = new abc_absolute_element(elem,0,10, 'staff-extra', tuneNumber); - if (elem.type === "specified") { - var x = 0; - for (var i = 0; i < elem.value.length; i++) { - if (i !== 0) { - abselem.addRight(new abc_relative_element('+', x+1, abc_glyphs.getSymbolWidth("+"), 6, {thickness: abc_glyphs.symbolHeightInPitches("+")})); - x += abc_glyphs.getSymbolWidth("+")+2; - } - if (elem.value[i].den) { - var numWidth = 0; - for (var i2 = 0; i2 < elem.value[i].num.length; i2++) - numWidth += abc_glyphs.getSymbolWidth(elem.value[i].num.charAt(i2)); - var denWidth = 0; - for (i2 = 0; i2 < elem.value[i].num.length; i2++) - denWidth += abc_glyphs.getSymbolWidth(elem.value[i].den.charAt(i2)); - var maxWidth = Math.max(numWidth, denWidth); - abselem.addRight(new abc_relative_element(elem.value[i].num, x+(maxWidth-numWidth)/2, numWidth, 8, { thickness: abc_glyphs.symbolHeightInPitches(elem.value[i].num.charAt(0)) })); - abselem.addRight(new abc_relative_element(elem.value[i].den, x+(maxWidth-denWidth)/2, denWidth, 4, { thickness: abc_glyphs.symbolHeightInPitches(elem.value[i].den.charAt(0)) })); - x += maxWidth; - } else { - var thisWidth = 0; - for (var i3 = 0; i3 < elem.value[i].num.length; i3++) - thisWidth += abc_glyphs.getSymbolWidth(elem.value[i].num.charAt(i3)); - abselem.addRight(new abc_relative_element(elem.value[i].num, x, thisWidth, 6, { thickness: abc_glyphs.symbolHeightInPitches(elem.value[i].num.charAt(0)) })); - x += thisWidth; - } - } - } else if (elem.type === "common_time") { - abselem.addRight(new abc_relative_element("timesig.common", 0, abc_glyphs.getSymbolWidth("timesig.common"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.common") })); - - } else if (elem.type === "cut_time") { - abselem.addRight(new abc_relative_element("timesig.cut", 0, abc_glyphs.getSymbolWidth("timesig.cut"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.cut") })); - } else if (elem.type === "tempus_imperfectum") { - abselem.addRight(new abc_relative_element("timesig.imperfectum", 0, abc_glyphs.getSymbolWidth("timesig.imperfectum"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.imperfectum") })); - } else if (elem.type === "tempus_imperfectum_prolatio") { - abselem.addRight(new abc_relative_element("timesig.imperfectum2", 0, abc_glyphs.getSymbolWidth("timesig.imperfectum2"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.imperfectum2") })); - } else if (elem.type === "tempus_perfectum") { - abselem.addRight(new abc_relative_element("timesig.perfectum", 0, abc_glyphs.getSymbolWidth("timesig.perfectum"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.perfectum") })); - } else if (elem.type === "tempus_perfectum_prolatio") { - abselem.addRight(new abc_relative_element("timesig.perfectum2", 0, abc_glyphs.getSymbolWidth("timesig.perfectum2"), 6, { thickness: abc_glyphs.symbolHeightInPitches("timesig.perfectum2") })); - } else { - console.log("time signature:",elem); - } - return abselem; - }; -})(); - -var abc_create_time_signature = createTimeSignature; - -// abc_dynamic_decoration.js: Definition of the DynamicDecoration class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var DynamicDecoration = function DynamicDecoration(anchor, dec, position) { - this.anchor = anchor; - this.dec = dec; - if (position === 'below') - this.volumeHeightBelow = 5; - else - this.volumeHeightAbove = 5; - this.pitch = undefined; // This will be set later -}; - -DynamicDecoration.prototype.setUpperAndLowerElements = function(positionY) { - if (this.volumeHeightAbove) - this.pitch = positionY.volumeHeightAbove; - else - this.pitch = positionY.volumeHeightBelow; -}; - -DynamicDecoration.prototype.draw = function(renderer, linestartx, lineendx) { - if (this.pitch === undefined) - window.console.error("Dynamic Element y-coordinate not set."); - var scalex = 1; - var scaley = 1; - renderer.printSymbol(this.anchor.x, this.pitch, this.dec, scalex, scaley, renderer.addClasses('decoration')); -}; - -var abc_dynamic_decoration = DynamicDecoration; - -/** - * sprintf() for JavaScript v.0.4 - * - Copyright (c) 2007-present, Alexandru Mărășteanu - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of this software nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -//function str_repeat(i, m) { for (var o = []; m > 0; o[--m] = i); return(o.join('')); } - -var sprintf = function() { - var i = 0, a, f = arguments[i++], o = [], m, p, c, x; - while (f) { - if (m = /^[^\x25]+/.exec(f)) o.push(m[0]); - else if (m = /^\x25{2}/.exec(f)) o.push('%'); - else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) { - if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw("Too few arguments."); - if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) - throw("Expecting number but found " + typeof(a)); - switch (m[7]) { - case 'b': a = a.toString(2); break; - case 'c': a = String.fromCharCode(a); break; - case 'd': a = parseInt(a); break; - case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break; - case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break; - case 'o': a = a.toString(8); break; - case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break; - case 'u': a = Math.abs(a); break; - case 'x': a = a.toString(16); break; - case 'X': a = a.toString(16).toUpperCase(); break; - } - a = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a); - c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' '; - x = m[5] - String(a).length; - p = m[5] ? str_repeat(c, x) : ''; - o.push(m[4] ? a + p : p + a); - } - else throw ("Huh ?!"); - f = f.substring(m[0].length); - } - return o.join(''); -}; - -var sprintf_1 = sprintf; - -// abc_crescendo_element.js: Definition of the CrescendoElem class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var CrescendoElem = function CrescendoElem(anchor1, anchor2, dir, positioning) { - this.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the "beginning" of the line - after keysig) - this.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line) - this.dir = dir; // either "<" or ">" - if (positioning === 'above') - this.dynamicHeightAbove = 4; - else - this.dynamicHeightBelow = 4; - this.pitch = undefined; // This will be set later -}; - -CrescendoElem.prototype.setUpperAndLowerElements = function(positionY) { - if (this.dynamicHeightAbove) - this.pitch = positionY.dynamicHeightAbove; - else - this.pitch = positionY.dynamicHeightBelow; -}; - -CrescendoElem.prototype.draw = function (renderer) { - if (this.pitch === undefined) - window.console.error("Crescendo Element y-coordinate not set."); - var y = renderer.calcY(this.pitch) + 4; // This is the top pixel to use (it is offset a little so that it looks good with the volume marks.) - var height = 8; - if (this.dir === "<") { - this.drawLine(renderer, y+height/2, y); - this.drawLine(renderer, y+height/2, y+height); - } else { - this.drawLine(renderer, y, y+height/2); - this.drawLine(renderer, y+height, y+height/2); - } -}; - -CrescendoElem.prototype.drawLine = function (renderer, y1, y2) { - // TODO-PER: This is just a quick hack to make the dynamic marks not crash if they are mismatched. See the slur treatment for the way to get the beginning and end. - var left = this.anchor1 ? this.anchor1.x : 0; - var right = this.anchor2 ? this.anchor2.x : 800; - var pathString = sprintf_1("M %f %f L %f %f", - left, y1, right, y2); - renderer.printPath({path:pathString, stroke:"#000000", 'class': renderer.addClasses('decoration')}); -}; - -var abc_crescendo_element = CrescendoElem; - -// abc_tie_element.js: Definition of the TieElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var TieElem = function TieElem(options) { -// console.log("constructor", options.anchor1 ? options.anchor1.pitch : "N/A", options.anchor2 ? options.anchor2.pitch : "N/A", options.isTie, options.isGrace); - this.anchor1 = options.anchor1; // must have a .x and a .pitch, and a .parent property or be null (means starts at the "beginning" of the line - after keysig) - this.anchor2 = options.anchor2; // must have a .x and a .pitch property or be null (means ends at the end of the line) - if (options.isGrace) - this.isGrace = true; - if (options.fixedY) - this.fixedY = true; - if (options.stemDir) - this.stemDir = options.stemDir; - if (options.voiceNumber !== undefined) - this.voiceNumber = options.voiceNumber; - this.internalNotes = []; -}; - -TieElem.prototype.addInternalNote = function(note) { - this.internalNotes.push(note); -}; - -TieElem.prototype.setEndAnchor = function(anchor2) { -// console.log("end", this.anchor1 ? this.anchor1.pitch : "N/A", anchor2 ? anchor2.pitch : "N/A", this.isTie, this.isGrace); - this.anchor2 = anchor2; // must have a .x and a .pitch property or be null (means ends at the end of the line) -}; - -// If we encounter a repeat sign, then we don't want to extend either a tie or a slur past it, so these are called to be a limit. -TieElem.prototype.setStartX = function(startLimitElem) { - this.startLimitX = startLimitElem; -}; - -TieElem.prototype.setEndX = function(endLimitElem) { - this.endLimitX = endLimitElem; -}; - -TieElem.prototype.setHint = function () { - this.hint = true; -}; - -TieElem.prototype.setUpperAndLowerElements = function(positionY) { - // Doesn't depend on the highest and lowest, so there's nothing to do here. -}; - -TieElem.prototype.calcTieDirection = function () { - // The rules: - // 1) If it is in a grace note group, then the direction is always BELOW. - // 2) If it is in a single voice, then the direction is always OPPOSITE of the stem (or where the stem would have been in the case of whole notes.) - // 3) If the stem direction is forced (probably because there are two voices on the same line), then the direction is the SAME as the stem direction. - - if (this.isGrace) - this.above = false; - else if (this.voiceNumber === 0) - this.above = true; - else if (this.voiceNumber > 0) - this.above = false; - else { - var referencePitch; - if (this.anchor1) - referencePitch = this.anchor1.pitch; - else if (this.anchor2) - referencePitch = this.anchor2.pitch; - else - referencePitch = 14; // TODO-PER: this can't really happen normally. This would imply that a tie crossed over three lines, something like "C-\nz\nC" - // Put the arc in the opposite direction of the stem. That isn't always the pitch if one or both of the notes are beamed with something that affects its stem. - if ((this.anchor1 && this.anchor1.stemDir === 'down') && (this.anchor2 && this.anchor2.stemDir === "down")) - this.above = true; - else if ((this.anchor1 && this.anchor1.stemDir === 'up') && (this.anchor2 && this.anchor2.stemDir === "up")) - this.above = false; - else if (this.anchor1 && this.anchor2) - this.above = referencePitch >= 6; - else if (this.anchor1) - this.above = this.anchor1.stemDir === "down"; - else if (this.anchor2) - this.above = this.anchor2.stemDir === "down"; - else - this.above = referencePitch >= 6; - } -}; - -// From "standard music notation practice" by Music Publishers’ Association: -// 1) Slurs are placed under the note heads if all stems go up. -// 2) Slurs are placed over the note heads if all stems go down. -// 3) If there are both up stems and down stems, prefer placing the slur over. -// 4) When the staff has opposite stemmed voices, all slurs should be on the stemmed side. - -TieElem.prototype.calcSlurDirection = function () { - if (this.isGrace) - this.above = false; - else if (this.voiceNumber === 0) - this.above = true; - else if (this.voiceNumber > 0) - this.above = false; - else { - var hasDownStem = false; - if (this.anchor1 && this.anchor1.stemDir === "down") - hasDownStem = true; - if (this.anchor2 && this.anchor2.stemDir === "down") - hasDownStem = true; - for (var i = 0; i < this.internalNotes.length; i++) { - var n = this.internalNotes[i]; - if (n.stemDir === "down") - hasDownStem = true; - } - this.above = hasDownStem; - } -}; - -TieElem.prototype.calcX = function (lineStartX, lineEndX) { - if (this.anchor1) { - this.startX = this.anchor1.x; // The normal case where there is a starting element to attach to. - if (this.anchor1.scalex < 1) // this is a grace note - don't offset the tie as much. - this.startX -= 3; - } else if (this.startLimitX) - this.startX = this.startLimitX.x+this.startLimitX.w; // if there is no start element, but there is a repeat mark before the start of the line. - else - this.startX = lineStartX; // There is no element and no repeat mark: extend to the beginning of the line. - - if (this.anchor2) - this.endX = this.anchor2.x; // The normal case where there is a starting element to attach to. - else if (this.endLimitX) - this.endX = this.endLimitX.x; // if there is no start element, but there is a repeat mark before the start of the line. - else - this.endX = lineEndX; // There is no element and no repeat mark: extend to the beginning of the line. -}; - -TieElem.prototype.calcTieY = function () { - // If the tie comes from another line, then one or both anchors will be missing. - if (this.anchor1) - this.startY = this.anchor1.pitch; - else if (this.anchor2) - this.startY = this.anchor2.pitch; - else - this.startY = this.above ? 14 : 0; - - if (this.anchor2) - this.endY = this.anchor2.pitch; - else if (this.anchor1) - this.endY = this.anchor1.pitch; - else - this.endY = this.above ? 14 : 0; -}; - -// From "standard music notation practice" by Music Publishers’ Association: -// 1) If the anchor note is down stem, the slur points to the note head. -// 2) If the anchor note is up stem, and the slur is over, then point to middle of stem. - -TieElem.prototype.calcSlurY = function () { - if (this.anchor1 && this.anchor2) { - if (this.above && this.anchor1.stemDir === "up" && !this.fixedY) { - this.startY = (this.anchor1.highestVert + this.anchor1.pitch) / 2; - this.startX += this.anchor1.w/2; // When going to the middle of the stem, bump the line to the right a little bit to make it look right. - } else - this.startY = this.anchor1.pitch; - - // If the closing note has an up stem, and it is beamed, and it isn't the first note in the beam, then the beam will get in the way. - var beamInterferes = this.anchor2.parent.beam && this.anchor2.parent.beam.stemsUp && this.anchor2.parent.beam.elems[0] !== this.anchor2.parent; - var midPoint = (this.anchor2.highestVert + this.anchor2.pitch) / 2; - if (this.above && this.anchor2.stemDir === "up" && !this.fixedY && !beamInterferes && (midPoint < this.startY)) { - this.endY = midPoint; - this.endX += this.anchor2.w/2; // When going to the middle of the stem, bump the line to the right a little bit to make it look right. - } else - this.endY = this.above && beamInterferes ? this.anchor2.highestVert : this.anchor2.pitch; - - } else if (this.anchor1) { - this.startY = this.endY = this.anchor1.pitch; - } else if (this.anchor2) { - this.startY = this.endY = this.anchor2.pitch; - } else { - // This is the case where the slur covers the entire line. - // TODO-PER: figure out where the real top and bottom of the line are. - this.startY = this.above ? 14 : 0; - this.endY = this.above ? 14 : 0; - } -}; - -TieElem.prototype.avoidCollisionAbove = function () { - // Double check that an interior note in the slur isn't so high that it interferes. - if (this.above) { - var maxInnerHeight = -50; - for (var i = 0; i < this.internalNotes.length; i++) { - if (this.internalNotes[i].highestVert > maxInnerHeight) - maxInnerHeight = this.internalNotes[i].highestVert; - } - if (maxInnerHeight > this.startY && maxInnerHeight > this.endY) - this.startY = this.endY = maxInnerHeight - 1; - } -}; - -TieElem.prototype.layout = function (lineStartX, lineEndX) { - // We now have all of the input variables set, so we can figure out the start and ending x,y coordinates, and finalize the direction of the arc. - - // Ties and slurs are handled a little differently, so do calculations for them separately. - if (!this.anchor1 || !this.anchor2) - this.isTie = true; // if the slur goes off the end of the line, then draw it like a tie - else if (this.anchor1.pitch === this.anchor2.pitch && this.internalNotes.length === 0) - this.isTie = true; - else - this.isTie = false; - - // TODO-PER: Not sure why this would be needed, but it would be better to figure out a way to have the anchors be immutable here anyway. - // if (this.isTie) { - // if (this.anchor1) // this can happen if the tie comes from the previous line. - // this.anchor1.isTie = true; - // if (this.anchor2) // this can happen if the tie does not go to the next line. - // this.anchor2.isTie = true; - // } - - if (this.isTie) { - this.calcTieDirection(); - // TODO-PER: Not sure why this would be needed, but it would be better to figure out a way to have the anchors be immutable here anyway. - // if (this.anchor1) // this can happen if the tie comes from the previous line. - // this.anchor1.tieAbove = this.above; - // if (this.anchor2) // this can happen if the tie goes to the next line. - // this.anchor2.tieAbove = this.above; - this.calcX(lineStartX, lineEndX); - this.calcTieY(); - - } else { - this.calcSlurDirection(); - this.calcX(lineStartX, lineEndX); - this.calcSlurY(); - } - this.avoidCollisionAbove(); -}; - -TieElem.prototype.draw = function (renderer, linestartx, lineendx) { - this.layout(linestartx, lineendx); - - var klass; - if (this.hint) - klass = "abcjs-hint"; - var fudgeY = this.fixedY ? 1.5 : 0; // TODO-PER: This just compensates for drawArc, which contains too much knowledge of ties and slurs. - renderer.drawArc(this.startX, this.endX, this.startY+fudgeY, this.endY+fudgeY, this.above, klass, this.isTie); - -}; - -var abc_tie_element = TieElem; - -// abc_decoration.js: Creates a data structure suitable for printing a line of abc -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) & Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/*global window */ - - - - - - - -var Decoration; - -(function() { - - Decoration = function Decoration() { - this.startDiminuendoX = undefined; - this.startCrescendoX = undefined; - this.minTop = 12; // TODO-PER: this is assuming a 5-line staff. Pass that info in. - this.minBottom = 0; - }; - - var closeDecoration = function(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch) { - var yPos; - for (var i=0;i9) yPos++; // take up some room of those that are above - var deltaX = width/2; - if (abc_glyphs.getSymbolAlign(symbol)!=="center") { - deltaX -= (abc_glyphs.getSymbolWidth(symbol)/2); - } - abselem.addChild(new abc_relative_element(symbol, deltaX, abc_glyphs.getSymbolWidth(symbol), yPos)); - } - if (decoration[i]==="slide" && abselem.heads[0]) { - var yPos2 = abselem.heads[0].pitch; - yPos2 -= 2; // TODO-PER: not sure what this fudge factor is. - var blank1 = new abc_relative_element("", -roomtaken-15, 0, yPos2-1); - var blank2 = new abc_relative_element("", -roomtaken-5, 0, yPos2+1); - abselem.addChild(blank1); - abselem.addChild(blank2); - voice.addOther(new abc_tie_element({ anchor1: blank1, anchor2: blank2, fixedY: true})); - } - } - if (yPos === undefined) - yPos = pitch; - - return { above: yPos, below: abselem.bottom }; - }; - - var volumeDecoration = function(voice, decoration, abselem, positioning) { - for (var i=0;i minBottom) - y = minBottom; - } - return y; - } - function textDecoration(text, placement) { - var y = getPlacement(placement); - var textFudge = 2; - var textHeight = 5; - // TODO-PER: Get the height of the current font and use that for the thickness. - abselem.addChild(new abc_relative_element(text, width/2, 0, y+textFudge, {type:"decoration", klass: 'ornament', thickness: 3})); - - incrementPlacement(placement, textHeight); - } - function symbolDecoration(symbol, placement) { - var deltaX = width/2; - if (abc_glyphs.getSymbolAlign(symbol) !== "center") { - deltaX -= (abc_glyphs.getSymbolWidth(symbol) / 2); - } - var height = abc_glyphs.symbolHeightInPitches(symbol) + 1; // adding a little padding so nothing touches. - var y = getPlacement(placement); - y = (placement === 'above') ? y + height/2 : y - height/2;// Center the element vertically. - abselem.addChild(new abc_relative_element(symbol, deltaX, abc_glyphs.getSymbolWidth(symbol), y, { klass: 'ornament', thickness: abc_glyphs.symbolHeightInPitches(symbol) })); - - incrementPlacement(placement, height); - } - - var symbolList = { - "+": "scripts.stopped", - "open": "scripts.open", - "snap": "scripts.snap", - "wedge": "scripts.wedge", - "thumb": "scripts.thumb", - "shortphrase": "scripts.shortphrase", - "mediumphrase": "scripts.mediumphrase", - "longphrase": "scripts.longphrase", - "trill": "scripts.trill", - "roll": "scripts.roll", - "irishroll": "scripts.roll", - "marcato": "scripts.umarcato", - "dmarcato": "scripts.dmarcato", - "umarcato": "scripts.umarcato", - "turn": "scripts.turn", - "uppermordent": "scripts.prall", - "pralltriller": "scripts.prall", - "mordent": "scripts.mordent", - "lowermordent": "scripts.mordent", - "downbow": "scripts.downbow", - "upbow": "scripts.upbow", - "fermata": "scripts.ufermata", - "invertedfermata": "scripts.dfermata", - "breath": ",", - "coda": "scripts.coda", - "segno": "scripts.segno" - }; - - var hasOne = false; - for (var i=0;i", positioning)); - } - if (crescendo) { - voice.addOther(new abc_crescendo_element(crescendo.start, crescendo.stop, "<", positioning)); - } - }; - - Decoration.prototype.createDecoration = function(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch, positioning, hasVocals) { - if (!positioning) - positioning = { ornamentPosition: 'above', volumePosition: hasVocals ? 'above' :'below', dynamicPosition: hasVocals ? 'above' : 'below' }; - // These decorations don't affect the placement of other decorations - volumeDecoration(voice, decoration, abselem, positioning.volumePosition); - this.dynamicDecoration(voice, decoration, abselem, positioning.dynamicPosition); - compoundDecoration(decoration, pitch, width, abselem, dir); - - // treat staccato, accent, and tenuto first (may need to shift other markers) - var yPos = closeDecoration(voice, decoration, pitch, width, abselem, roomtaken, dir, minPitch); - // yPos is an object containing 'above' and 'below'. That is the placement of the next symbol on either side. - - yPos.above = Math.max(yPos.above, this.minTop); - var hasOne = stackedDecoration(decoration, width, abselem, yPos, positioning.ornamentPosition, this.minTop, this.minBottom); - leftDecoration(decoration, abselem, roomtaken); - }; - -})(); - -var abc_decoration = Decoration; - -// abc_ending_element.js: Definition of the EndingElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var EndingElem = function EndingElem(text, anchor1, anchor2) { - this.text = text; // text to be displayed top left - this.anchor1 = anchor1; // must have a .x property or be null (means starts at the "beginning" of the line - after keysig) - this.anchor2 = anchor2; // must have a .x property or be null (means ends at the end of the line) - this.endingHeightAbove = 5; - this.pitch = undefined; // This will be set later -}; - -EndingElem.prototype.setUpperAndLowerElements = function(positionY) { - this.pitch = positionY.endingHeightAbove - 2; -}; - -EndingElem.prototype.draw = function (renderer, linestartx, lineendx) { - if (this.pitch === undefined) - window.console.error("Ending Element y-coordinate not set."); - var y = renderer.calcY(this.pitch); - var height = 20; - var pathString; - if (this.anchor1) { - linestartx = this.anchor1.x+this.anchor1.w; - pathString = sprintf_1("M %f %f L %f %f", - linestartx, y, linestartx, y+height); - renderer.printPath({path:pathString, stroke:"#000000", fill:"#000000", 'class': renderer.addClasses('ending')}); - renderer.renderText(linestartx+5, renderer.calcY(this.pitch-0.5), this.text, 'repeatfont', 'ending',"start"); - } - - if (this.anchor2) { - lineendx = this.anchor2.x; - pathString = sprintf_1("M %f %f L %f %f", - lineendx, y, lineendx, y+height); - renderer.printPath({path:pathString, stroke:"#000000", fill:"#000000", 'class': renderer.addClasses('ending')}); - } - - - pathString = sprintf_1("M %f %f L %f %f", - linestartx, y, lineendx, y); - renderer.printPath({path:pathString, stroke:"#000000", fill:"#000000", 'class': renderer.addClasses('ending')}); -}; - -var abc_ending_element = EndingElem; - -// abc_staff_group_element.js: Definition of the StaffGroupElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/*globals console */ - - - -// StaffGroupElement contains all the elements that go together to make one line of music. -// That might be multiple staves that are tied together, and it might be multiple voices on one staff. -// -// Methods: -// constructor: some basic initialization -// addVoice(): Called once for each voice. May add a new staff if needed. -// finished(): Called only internally by layout() -// layout(): This does all the layout. It sets the following: spacingunits, startx, minspace, w, and the x-coordinate of each element in each voice. -// draw(): Calls the underlying methods on the voice objects to do the drawing. Sets y and height. -// -// Members: -// staffs: an array of all the staves in this group. Each staff contains the following elements: -// { top, bottom, highest, lowest, y } -// voices: array of VoiceElement objects. This is mostly passed in, but the VoiceElement objects are modified here. -// -// spacingunits: number of relative x-units in the line. Used by the calling function to pass back in as the "spacing" input parameter. -// TODO-PER: This should actually be passed back as a return value. -// minspace: smallest space between two notes. Used by the calling function to pass back in as the "spacing" input parameter. -// TODO-PER: This should actually be passed back as a return value. -// startx: The left edge, taking the margin and the optional voice name. Used by the draw() method. -// w: The width of the line. Used by calling function to pass back in as the "spacing" input parameter, and the draw() method. -// TODO-PER: This should actually be passed back as a return value. (TODO-PER: in pixels or spacing units?) -// y: The top of the staff group, in pixels. This is set in the draw method. -// TODO-PER: Where is that used? It looks like it might not be needed. -// height: Set in the draw() method to the height actually used. Used by the calling function to know where to start the next staff group. -// TODO-PER: This should actually be set in the layout method and passed back as a return value. - -var StaffGroupElement = function() { - this.voices = []; - this.staffs = []; - this.brace = undefined; //tony -}; - -StaffGroupElement.prototype.setLimit = function(member, voice) { - if (!voice.specialY[member]) return; - if (!voice.staff.specialY[member]) - voice.staff.specialY[member] = voice.specialY[member]; - else - voice.staff.specialY[member] = Math.max(voice.staff.specialY[member], voice.specialY[member]); -}; - -StaffGroupElement.prototype.addVoice = function (voice, staffnumber, stafflines) { - var voiceNum = this.voices.length; - this.voices[voiceNum] = voice; - if (this.staffs[staffnumber]) - this.staffs[staffnumber].voices.push(voiceNum); - else { - // TODO-PER: how does the min/max change when stafflines is not 5? - this.staffs[this.staffs.length] = { - top: 10, - bottom: 2, - lines: stafflines, - voices: [voiceNum], - specialY: { - tempoHeightAbove: 0, - partHeightAbove: 0, - volumeHeightAbove: 0, - dynamicHeightAbove: 0, - endingHeightAbove: 0, - chordHeightAbove: 0, - lyricHeightAbove: 0, - - lyricHeightBelow: 0, - chordHeightBelow: 0, - volumeHeightBelow: 0, - dynamicHeightBelow: 0 - } - }; - } - voice.staff = this.staffs[staffnumber]; -}; - -StaffGroupElement.prototype.setStaffLimits = function (voice) { - voice.staff.top = Math.max(voice.staff.top, voice.top); - voice.staff.bottom = Math.min(voice.staff.bottom, voice.bottom); - this.setLimit('tempoHeightAbove', voice); - this.setLimit('partHeightAbove', voice); - this.setLimit('volumeHeightAbove', voice); - this.setLimit('dynamicHeightAbove', voice); - this.setLimit('endingHeightAbove', voice); - this.setLimit('chordHeightAbove', voice); - this.setLimit('lyricHeightAbove', voice); - this.setLimit('lyricHeightBelow', voice); - this.setLimit('chordHeightBelow', voice); - this.setLimit('volumeHeightBelow', voice); - this.setLimit('dynamicHeightBelow', voice); -}; - -StaffGroupElement.prototype.setUpperAndLowerElements = function(renderer) { - // Each staff already has the top and bottom set, now we see if there are elements that are always on top and bottom, and resolve their pitch. - // Also, get the overall height of all the staves in this group. - var lastStaffBottom; - for (var i = 0; i < this.staffs.length; i++) { - var staff = this.staffs[i]; - // the vertical order of elements that are above is: tempo, part, volume/dynamic, ending/chord, lyric - // the vertical order of elements that are below is: lyric, chord, volume/dynamic - var positionY = { - tempoHeightAbove: 0, - partHeightAbove: 0, - volumeHeightAbove: 0, - dynamicHeightAbove: 0, - endingHeightAbove: 0, - chordHeightAbove: 0, - lyricHeightAbove: 0, - - lyricHeightBelow: 0, - chordHeightBelow: 0, - volumeHeightBelow: 0, - dynamicHeightBelow: 0 - }; - - if (staff.specialY.lyricHeightAbove) { staff.top += staff.specialY.lyricHeightAbove; positionY.lyricHeightAbove = staff.top; } - if (staff.specialY.chordHeightAbove) { staff.top += staff.specialY.chordHeightAbove; positionY.chordHeightAbove = staff.top; } - if (staff.specialY.endingHeightAbove) { - if (staff.specialY.chordHeightAbove) - staff.top += 2; - else - staff.top += staff.specialY.endingHeightAbove; - positionY.endingHeightAbove = staff.top; - } - if (staff.specialY.dynamicHeightAbove && staff.specialY.volumeHeightAbove) { - staff.top += Math.max(staff.specialY.dynamicHeightAbove, staff.specialY.volumeHeightAbove); - positionY.dynamicHeightAbove = staff.top; - positionY.volumeHeightAbove = staff.top; - } else if (staff.specialY.dynamicHeightAbove) { - staff.top += staff.specialY.dynamicHeightAbove; positionY.dynamicHeightAbove = staff.top; - } else if (staff.specialY.volumeHeightAbove) { staff.top += staff.specialY.volumeHeightAbove; positionY.volumeHeightAbove = staff.top; } - if (staff.specialY.partHeightAbove) { staff.top += staff.specialY.partHeightAbove; positionY.partHeightAbove = staff.top; } - if (staff.specialY.tempoHeightAbove) { staff.top += staff.specialY.tempoHeightAbove; positionY.tempoHeightAbove = staff.top; } - - if (staff.specialY.lyricHeightBelow) { positionY.lyricHeightBelow = staff.bottom; staff.bottom -= staff.specialY.lyricHeightBelow; } - if (staff.specialY.chordHeightBelow) { positionY.chordHeightBelow = staff.bottom; staff.bottom -= staff.specialY.chordHeightBelow; } - if (staff.specialY.volumeHeightBelow && staff.specialY.dynamicHeightBelow) { - positionY.volumeHeightBelow = staff.bottom; - positionY.dynamicHeightBelow = staff.bottom; - staff.bottom -= Math.max(staff.specialY.volumeHeightBelow, staff.specialY.dynamicHeightBelow); - } else if (staff.specialY.volumeHeightBelow) { - positionY.volumeHeightBelow = staff.bottom; staff.bottom -= staff.specialY.volumeHeightBelow; - } else if (staff.specialY.dynamicHeightBelow) { - positionY.dynamicHeightBelow = staff.bottom; staff.bottom -= staff.specialY.dynamicHeightBelow; - } - - for (var j = 0; j < staff.voices.length; j++) { - var voice = this.voices[staff.voices[j]]; - voice.setUpperAndLowerElements(positionY); - } - // We might need a little space in between staves if the staves haven't been pushed far enough apart by notes or extra vertical stuff. - // Only try to put in extra space if this isn't the top staff. - if (lastStaffBottom !== undefined) { - var thisStaffTop = staff.top - 10; - var forcedSpacingBetween = lastStaffBottom + thisStaffTop; - var minSpacingInPitches = renderer.spacing.systemStaffSeparation/abc_spacing.STEP; - var addedSpace = minSpacingInPitches - forcedSpacingBetween; - if (addedSpace > 0) - staff.top += addedSpace; - } - lastStaffBottom = 2 - staff.bottom; // the staff starts at position 2 and the bottom variable is negative. Therefore to find out how large the bottom is, we reverse the sign of the bottom, and add the 2 in. - - // Now we need a little margin on the top, so we'll just throw that in. - //staff.top += 4; - //console.log("Staff Y: ",i,heightInPitches,staff.top,staff.bottom); - } - //console.log("Staff Height: ",heightInPitches,this.height); -}; - -StaffGroupElement.prototype.finished = function() { - for (var i=0;i epsilon) { - othervoices.push(this.voices[i]); - //console.log("out: voice ",i); - } else { - currentvoices.push(this.voices[i]); - //if (debug) console.log("in: voice ",i); - } - } - - // among the current duration level find the one which needs starting furthest right - spacingunit = 0; // number of spacingunits coming from the previously laid out element to this one - var spacingduration = 0; - for (i=0;ix) { - x=currentvoices[i].getNextX(); - spacingunit=currentvoices[i].getSpacingUnits(); - spacingduration = currentvoices[i].spacingduration; - } - } - spacingunits+=spacingunit; - minspace = Math.min(minspace,spacingunit); - if (debug) console.log("currentduration: ",currentduration, spacingunits, minspace); - - for (i=0;i0) { - x = voicechildx; //update x - for (var j=0;jx) { - x=this.voices[i].getNextX(); - spacingunit=this.voices[i].getSpacingUnits(); - } - } - //console.log("greatest remaining",spacingunit,x); - spacingunits+=spacingunit; - this.w = x; - - for (i=0;i1) { - renderer.printStem(this.startx, 0.6, topLine, bottomLine); - } - renderer.y = startY; -}; - -var abc_staff_group_element = StaffGroupElement; - -// abc_tempo_element.js: Definition of the TempoElement class. -// Copyright (C) 2014-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -var TempoElement; -(function() { - var totalHeightInPitches = 5; - - TempoElement = function TempoElement(tempo, tuneNumber, createNoteHead) { - this.tempo = tempo; - this.tuneNumber = tuneNumber; - this.tempoHeightAbove = totalHeightInPitches; - this.pitch = undefined; // This will be set later - if (this.tempo.duration && !this.tempo.suppressBpm) { - this.note = this.createNote(createNoteHead, tempo, tuneNumber); - } - }; - - TempoElement.prototype.setUpperAndLowerElements = function(positionY) { // TODO-PER: This might not be called. - this.pitch = positionY.tempoHeightAbove; - this.top = positionY.tempoHeightAbove; - this.bottom = positionY.tempoHeightAbove; - if (this.note) { - var tempoPitch = this.pitch - totalHeightInPitches + 1; // The pitch we receive is the top of the allotted area: change that to practically the bottom. - this.note.top = tempoPitch; - this.note.bottom = tempoPitch; - for (var i = 0; i < this.note.children.length; i++) { - var child = this.note.children[i]; - child.top += tempoPitch; - child.bottom += tempoPitch; - child.pitch += tempoPitch; - if (child.pitch2 !== undefined) - child.pitch2 += tempoPitch; - } - } - }; - - TempoElement.prototype.setX = function (x) { - this.x = x; - }; - - TempoElement.prototype.createNote = function(createNoteHead, tempo, tuneNumber) { - var temposcale = 0.75; - var duration = tempo.duration[0]; // TODO when multiple durations - var absElem = new abc_absolute_element(tempo, duration, 1, 'tempo', tuneNumber); - // There aren't an infinite number of note values, but we are passed a float, so just in case something is off upstream, - // merge all of the in between points. - var dot; - var flag; - var note; - if (duration <= 1/32) { note = "noteheads.quarter"; flag = "flags.u32nd"; dot = 0; } - else if (duration <= 1/16) { note = "noteheads.quarter"; flag = "flags.u16th"; dot = 0; } - else if (duration <= 3/32) { note = "noteheads.quarter"; flag = "flags.u16nd"; dot = 1; } - else if (duration <= 1/8) { note = "noteheads.quarter"; flag = "flags.u8th"; dot = 0; } - else if (duration <= 3/16) { note = "noteheads.quarter"; flag = "flags.u8th"; dot = 1; } - else if (duration <= 1/4) { note = "noteheads.quarter"; dot = 0; } - else if (duration <= 3/8) { note = "noteheads.quarter"; dot = 1; } - else if (duration <= 1/2) { note = "noteheads.half"; dot = 0; } - else if (duration <= 3/4) { note = "noteheads.half"; dot = 1; } - else if (duration <= 1) { note = "noteheads.whole"; dot = 0; } - else if (duration <= 1.5) { note = "noteheads.whole"; dot = 1; } - else if (duration <= 2) { note = "noteheads.dbl"; dot = 0; } - else { note = "noteheads.dbl"; dot = 1; } - - var ret = createNoteHead(absElem, - note, - { verticalPos: 0}, // This is just temporary: we'll offset the vertical positioning when we get the actual vertical spot. - "up", - 0, - 0, - flag, - dot, - 0, - temposcale, - [], - false - ); - var tempoNote = ret.notehead; - absElem.addHead(tempoNote); - var stem; - if (note !== "noteheads.whole" && note !== "noteheads.dbl") { - var p1 = 1 / 3 * temposcale; - var p2 = 7 * temposcale; - var dx = tempoNote.dx + tempoNote.w; - var width = -0.6; - stem = new abc_relative_element(null, dx, 0, p1, {"type": "stem", "pitch2": p2, linewidth: width}); - absElem.addExtra(stem); - } - return absElem; - }; - - TempoElement.prototype.draw = function(renderer) { - var x = this.x; - if (this.pitch === undefined) - window.console.error("Tempo Element y-coordinate not set."); - - var y = renderer.calcY(this.pitch); - var text; - if (this.tempo.preString) { - text = renderer.renderText(x, y, this.tempo.preString, 'tempofont', 'tempo', "start"); - var size = renderer.getTextSize(this.tempo.preString, 'tempofont', 'tempo', text); - var preWidth = size.width; - var charWidth = preWidth / this.tempo.preString.length; // Just get some average number to increase the spacing. - x += preWidth + charWidth; - } - if (this.note) { - if (this.note) - this.note.setX(x); - for (var i = 0; i < this.note.children.length; i++) - this.note.children[i].draw(renderer, x); - x += (this.note.w + 5); - var str = "= " + this.tempo.bpm; - text = renderer.renderText(x, y, str, 'tempofont', 'tempo', "start"); - size = renderer.getTextSize(str, 'tempofont', 'tempo', text); - var postWidth = size.width; - var charWidth2 = postWidth / str.length; // Just get some average number to increase the spacing. - x += postWidth + charWidth2; - } - if (this.tempo.postString) { - renderer.renderText(x, y, this.tempo.postString, 'tempofont', 'tempo', "start"); - } - }; -})(); - -var abc_tempo_element = TempoElement; - -// abc_triplet_element.js: Definition of the TripletElem class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var TripletElem; - -(function() { - - TripletElem = function TripletElem(number, anchor1, options) { - this.anchor1 = anchor1; // must have a .x and a .parent property or be null (means starts at the "beginning" of the line - after key signature) - this.number = number; - this.duration = (''+anchor1.parent.durationClass).replace(/\./, '-'); - this.middleElems = []; // This is to calculate the highest interior pitch. It is used to make sure that the drawn bracket never crosses a really high middle note. - this.flatBeams = options.flatBeams; - }; - - TripletElem.prototype.isClosed = function() { - return this.anchor2; - }; - - TripletElem.prototype.middleNote = function(elem) { - this.middleElems.push(elem); - }; - - TripletElem.prototype.setCloseAnchor = function(anchor2) { - this.anchor2 = anchor2; - // TODO-PER: Unfortunately, I don't know if there is a beam above until after the vertical positioning is done, - // so I don't know whether to leave room for the number above. Therefore, If there is a beam on the first note, I'll leave room just in case. - if (this.anchor1.parent.beam) - this.endingHeightAbove = 4; - }; - - TripletElem.prototype.setUpperAndLowerElements = function(/*positionY*/) { - }; - - TripletElem.prototype.layout = function() { - // TODO end and beginning of line (PER: P.S. I'm not sure this can happen: I think the parser will always specify both the start and end points.) - if (this.anchor1 && this.anchor2) { - this.hasBeam = this.anchor1.parent.beam && this.anchor1.parent.beam === this.anchor2.parent.beam; - - if (this.hasBeam) { - // If there is a beam then we don't need to draw anything except the text. The beam could either be above or below. - var beam = this.anchor1.parent.beam; - var left = beam.isAbove() ? this.anchor1.x + this.anchor1.w : this.anchor1.x; - this.yTextPos = beam.heightAtMidpoint(left, this.anchor2.x); - this.yTextPos += beam.isAbove() ? 3 : -2; // This creates some space between the beam and the number. - this.top = this.yTextPos + 1; - this.bottom = this.yTextPos - 2; - if (beam.isAbove()) - this.endingHeightAbove = 4; - } else { - // If there isn't a beam, then we need to draw the bracket and the text. The bracket is always above. - // The bracket is never lower than the 'a' line, but is 4 pitches above the first and last notes. If there is - // a tall note in the middle, the bracket is horizontal and above the highest note. - this.startNote = Math.max(this.anchor1.parent.top, 9) + 4; - this.endNote = Math.max(this.anchor2.parent.top, 9) + 4; - // If it starts or ends on a rest, make the beam horizontal - if (this.anchor1.parent.type === "rest" && this.anchor2.parent.type !== "rest") - this.startNote = this.endNote; - else if (this.anchor2.parent.type === "rest" && this.anchor1.parent.type !== "rest") - this.endNote = this.startNote; - // See if the middle note is really high. - var max = 0; - for (var i = 0; i < this.middleElems.length; i++) { - max = Math.max(max, this.middleElems[i].top); - } - max += 4; - if (max > this.startNote || max > this.endNote) { - this.startNote = max; - this.endNote = max; - } - if (this.flatBeams) { - this.startNote = Math.max(this.startNote, this.endNote); - this.endNote = Math.max(this.startNote, this.endNote); - } - - this.yTextPos = this.startNote + (this.endNote - this.startNote) / 2; - this.top = this.yTextPos + 1; - } - } - delete this.middleElems; - delete this.flatBeams; - }; - - TripletElem.prototype.draw = function(renderer) { - var xTextPos; - if (this.hasBeam) { - var left = this.anchor1.parent.beam.isAbove() ? this.anchor1.x + this.anchor1.w : this.anchor1.x; - xTextPos = this.anchor1.parent.beam.xAtMidpoint(left, this.anchor2.x); - } else { - xTextPos = this.anchor1.x + (this.anchor2.x + this.anchor2.w - this.anchor1.x) / 2; - drawBracket(renderer, this.anchor1.x, this.startNote, this.anchor2.x + this.anchor2.w, this.endNote, this.duration); - } - renderer.renderText(xTextPos, renderer.calcY(this.yTextPos), "" + this.number, 'tripletfont', renderer.addClasses('triplet d'+this.duration), "middle", true); - }; - - function drawLine(renderer, l, t, r, b, duration) { - var pathString = sprintf_1("M %f %f L %f %f", - l, t, r, b); - renderer.printPath({path: pathString, stroke: "#000000", 'class': renderer.addClasses('triplet d'+duration)}); - } - - function drawBracket(renderer, x1, y1, x2, y2, duration) { - y1 = renderer.calcY(y1); - y2 = renderer.calcY(y2); - var bracketHeight = 5; - - // Draw vertical lines at the beginning and end - drawLine(renderer, x1, y1, x1, y1 + bracketHeight, duration); - drawLine(renderer, x2, y2, x2, y2 + bracketHeight, duration); - - // figure out midpoints to draw the broken line. - var midX = x1 + (x2-x1)/2; - //var midY = y1 + (y2-y1)/2; - var gapWidth = 8; - var slope = (y2 - y1) / (x2 - x1); - var leftEndX = midX - gapWidth; - var leftEndY = y1 + (leftEndX - x1) * slope; - drawLine(renderer, x1, y1, leftEndX, leftEndY, duration); - var rightStartX = midX + gapWidth; - var rightStartY = y1 + (rightStartX - x1) * slope; - drawLine(renderer, rightStartX, rightStartY, x2, y2, duration); - } -})(); - -var abc_triplet_element = TripletElem; - -// abc_voice_element.js: Definition of the VoiceElement class. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var VoiceElement = function VoiceElement(voicenumber, voicetotal) { - this.children = []; - this.beams = []; - this.otherchildren = []; // ties, slurs, triplets - this.w = 0; - this.duplicate = false; - this.voicenumber = voicenumber; //number of the voice on a given stave (not staffgroup) - this.voicetotal = voicetotal; - this.bottom = 7; - this.top = 7; - this.specialY = { - tempoHeightAbove: 0, - partHeightAbove: 0, - volumeHeightAbove: 0, - dynamicHeightAbove: 0, - endingHeightAbove: 0, - chordHeightAbove: 0, - lyricHeightAbove: 0, - - lyricHeightBelow: 0, - chordHeightBelow: 0, - volumeHeightBelow: 0, - dynamicHeightBelow: 0 - }; -}; - -VoiceElement.prototype.addChild = function (child) { - if (child.type === 'bar') { - var firstItem = true; - for (var i = 0; firstItem && i < this.children.length; i++) { - if (this.children[i].type !== "staff-extra" && this.children[i].type !== "tempo") - firstItem = false; - } - if (!firstItem) { - this.beams.push("bar"); - this.otherchildren.push("bar"); - } - } - this.children[this.children.length] = child; - this.setRange(child); -}; - -VoiceElement.prototype.setLimit = function(member, child) { - // Sometimes we get an absolute element in here and sometimes we get some type of relative element. - // If there is a "specialY" element, then assume it is an absolute element. If that doesn't exist, look for the - // same members at the top level, because that's where they are in relative elements. - var specialY = child.specialY; - if (!specialY) specialY = child; - if (!specialY[member]) return; - if (!this.specialY[member]) - this.specialY[member] = specialY[member]; - else - this.specialY[member] = Math.max(this.specialY[member], specialY[member]); -}; - -VoiceElement.prototype.moveDecorations = function(beam) { - var padding = 1.5; // This is the vertical padding between elements, in pitches. - for (var ch = 0; ch < beam.elems.length; ch++) { - var child = beam.elems[ch]; - if (child.top) { - // We now know where the ornaments should have been placed, so move them if they would overlap. - var top = beam.yAtNote(child); - for (var i = 0; i < child.children.length; i++) { - var el = child.children[i]; - if (el.klass === 'ornament') { - if (el.bottom - padding < top) { - var distance = top - el.bottom + padding; // Find the distance that it needs to move and add a little margin so the element doesn't touch the beam. - el.bottom += distance; - el.top += distance; - el.pitch += distance; - top = child.top = el.top; - } - } - } - } - } -}; - -VoiceElement.prototype.adjustRange = function(child) { - if (child.bottom !== undefined) - this.bottom = Math.min(this.bottom, child.bottom); - if (child.top !== undefined) - this.top = Math.max(this.top, child.top); -}; - -VoiceElement.prototype.setRange = function(child) { - this.adjustRange(child); - this.setLimit('tempoHeightAbove', child); - this.setLimit('partHeightAbove', child); - this.setLimit('volumeHeightAbove', child); - this.setLimit('dynamicHeightAbove', child); - this.setLimit('endingHeightAbove', child); - this.setLimit('chordHeightAbove', child); - this.setLimit('lyricHeightAbove', child); - this.setLimit('lyricHeightBelow', child); - this.setLimit('chordHeightBelow', child); - this.setLimit('volumeHeightBelow', child); - this.setLimit('dynamicHeightBelow', child); -}; - -VoiceElement.prototype.setUpperAndLowerElements = function(positionY) { - var i; - for (i = 0; i < this.children.length; i++) { - var abselem = this.children[i]; - abselem.setUpperAndLowerElements(positionY); - } - for (i = 0; i < this.otherchildren.length; i++) { - var abselem = this.otherchildren[i]; - if (typeof abselem !== 'string') - abselem.setUpperAndLowerElements(positionY); - } -}; - -VoiceElement.prototype.addOther = function (child) { - this.otherchildren.push(child); - this.setRange(child); -}; - -VoiceElement.prototype.addBeam = function (child) { - this.beams.push(child); -}; - -VoiceElement.prototype.updateIndices = function () { - if (!this.layoutEnded()) { - this.durationindex += this.children[this.i].duration; - if (this.children[this.i].type === 'bar') this.durationindex = Math.round(this.durationindex*64)/64; // everytime we meet a barline, do rounding to nearest 64th - this.i++; - } -}; - -VoiceElement.prototype.layoutEnded = function () { - return (this.i>=this.children.length); -}; - -VoiceElement.prototype.getDurationIndex = function () { - return this.durationindex - (this.children[this.i] && (this.children[this.i].duration>0)?0:0.0000005); // if the ith element doesn't have a duration (is not a note), its duration index is fractionally before. This enables CLEF KEYSIG TIMESIG PART, etc. to be laid out before we get to the first note of other voices -}; - -// number of spacing units expected for next positioning -VoiceElement.prototype.getSpacingUnits = function () { - return Math.sqrt(this.spacingduration*8); - // TODO-PER: On short lines, this would never trigger, so the spacing was wrong. I just changed this line empirically, though, so I don't know if there are other ramifications. - //return (this.minx= 0; i--) { - // var elem = voice.children[i]; - // if (elem.abcelem.el_type === 'bar') - // break; - // width += elem.w; - // } - // return new RelativeElement(width.toFixed(2), -70, 0, undefined, {type:"debug"}); - // } - - // return an array of AbsoluteElement -AbstractEngraver.prototype.createABCElement = function(isFirstStaff, isSingleLineStaff, voice, elem) { - var elemset = []; - switch (elem.el_type) { - case undefined: - // it is undefined if we were passed an array in - an array means a set of notes that should be beamed together. - elemset = this.createBeam(isSingleLineStaff, voice, elem); - break; - case "note": - elemset[0] = this.createNote(elem, false, isSingleLineStaff, voice); - if (this.triplet && this.triplet.isClosed()) { - voice.addOther(this.triplet); - this.triplet = null; - this.tripletmultiplier = 1; - } - break; - case "bar": - elemset[0] = this.createBarLine(voice, elem, isFirstStaff); - if (voice.duplicate && elemset.length > 0) elemset[0].invisible = true; -// elemset[0].addChild(writeMeasureWidth(voice)); - break; - case "meter": - elemset[0] = abc_create_time_signature(elem, this.tuneNumber); - this.startlimitelem = elemset[0]; // limit ties here - if (voice.duplicate && elemset.length > 0) elemset[0].invisible = true; - break; - case "clef": - elemset[0] = abc_create_clef(elem, this.tuneNumber); - if (!elemset[0]) return null; - if (voice.duplicate && elemset.length > 0) elemset[0].invisible = true; - break; - case "key": - var absKey = abc_create_key_signature(elem, this.tuneNumber); - if (absKey) { - elemset[0] = absKey; - this.startlimitelem = elemset[0]; // limit ties here - } - if (voice.duplicate && elemset.length > 0) elemset[0].invisible = true; - break; - case "stem": - this.stemdir=elem.direction; - break; - case "part": - var abselem = new abc_absolute_element(elem,0,0, 'part', this.tuneNumber); - var dim = this.renderer.getTextSize(elem.title, 'partsfont', "part"); - abselem.addChild(new abc_relative_element(elem.title, 0, 0, undefined, {type:"part", height: dim.height/abc_spacing.STEP})); - elemset[0] = abselem; - break; - case "tempo": - var abselem3 = new abc_absolute_element(elem,0,0, 'tempo', this.tuneNumber); - abselem3.addChild(new abc_tempo_element(elem, this.tuneNumber, createNoteHead)); - elemset[0] = abselem3; - break; - case "style": - if (elem.head === "normal") - delete this.style; - else - this.style = elem.head; - break; - case "hint": - hint = true; - this.saveState(); - break; - case "midi": - // This has no effect on the visible music, so just skip it. - break; - case "scale": - this.voiceScale = elem.size; - break; - - default: - var abselem2 = new abc_absolute_element(elem,0,0, 'unsupported', this.tuneNumber); - abselem2.addChild(new abc_relative_element("element type "+elem.el_type, 0, 0, undefined, {type:"debug"})); - elemset[0] = abselem2; - } - - return elemset; -}; - - function setAveragePitch(elem) { - if (elem.pitches) { - sortPitch(elem); - var sum = 0; - for (var p = 0; p < elem.pitches.length; p++) { - sum += elem.pitches[p].verticalPos; - } - elem.averagepitch = sum / elem.pitches.length; - elem.minpitch = elem.pitches[0].verticalPos; - elem.maxpitch = elem.pitches[elem.pitches.length - 1].verticalPos; - } - } - - AbstractEngraver.prototype.calcBeamDir = function (isSingleLineStaff, voice, elems) { - if (this.stemdir) // If the user or voice is forcing the stem direction, we already know the answer. - return this.stemdir; - var beamelem = new abc_beam_element(this.stemHeight * this.voiceScale, this.stemdir, this.flatBeams); - for (var i = 0; i < elems.length; i++) { - beamelem.add({abcelem: elems[i]}); // This is a hack to call beam elem with just a minimum of processing: for our purposes, we don't need to construct the whole note. - } - - var dir = beamelem.calcDir(); - return dir ? "up" : "down"; - }; - - AbstractEngraver.prototype.createBeam = function (isSingleLineStaff, voice, elems) { - var abselemset = []; - - var dir = this.calcBeamDir(isSingleLineStaff, voice, elems); - var beamelem = new abc_beam_element(this.stemHeight * this.voiceScale, dir, this.flatBeams); - if (hint) beamelem.setHint(); - var oldDir = this.stemdir; - this.stemdir = dir; - for (var i = 0; i < elems.length; i++) { - var elem = elems[i]; - var abselem = this.createNote(elem, true, isSingleLineStaff, voice); - abselemset.push(abselem); - beamelem.add(abselem); - if (this.triplet && this.triplet.isClosed()) { - voice.addOther(this.triplet); - this.triplet = null; - this.tripletmultiplier = 1; - } - } - this.stemdir = oldDir; - voice.addBeam(beamelem); - return abselemset; - }; - -var sortPitch = function(elem) { - var sorted; - do { - sorted = true; - for (var p = 0; pelem.pitches[p+1].pitch) { - sorted = false; - var tmp = elem.pitches[p]; - elem.pitches[p] = elem.pitches[p+1]; - elem.pitches[p+1] = tmp; - } - } - } while (!sorted); -}; - -var ledgerLines = function(abselem, minPitch, maxPitch, isRest, symbolWidth, additionalLedgers, dir, dx, scale) { - for (var i=maxPitch; i>11; i--) { - if (i%2===0 && !isRest) { - abselem.addChild(new abc_relative_element(null, dx, (symbolWidth+4)*scale, i, {type:"ledger"})); - } - } - - for (i=minPitch; i<1; i++) { - if (i%2===0 && !isRest) { - abselem.addChild(new abc_relative_element(null, dx, (symbolWidth+4)*scale, i, {type:"ledger"})); - } - } - - for (i = 0; i < additionalLedgers.length; i++) { // PER: draw additional ledgers - var ofs = symbolWidth; - if (dir === 'down') ofs = -ofs; - abselem.addChild(new abc_relative_element(null, ofs+dx, (symbolWidth+4)*scale, additionalLedgers[i], {type:"ledger"})); - } -}; - - AbstractEngraver.prototype.addGraceNotes = function (elem, voice, abselem, notehead, stemHeight, isBagpipes, roomtaken) { - var gracescale = 3 / 5; - var graceScaleStem = 3.5 / 5; // TODO-PER: empirically found constant. - var gracebeam = null; - var flag; - - if (elem.gracenotes.length > 1) { - gracebeam = new abc_beam_element(stemHeight * graceScaleStem, "grace", isBagpipes); - if (hint) gracebeam.setHint(); - gracebeam.mainNote = abselem; // this gives us a reference back to the note this is attached to so that the stems can be attached somewhere. - } - - var graceoffsets = []; - for (i = elem.gracenotes.length - 1; i >= 0; i--) { // figure out where to place each gracenote - roomtaken += 10; - graceoffsets[i] = roomtaken; - if (elem.gracenotes[i].accidental) { - roomtaken += 7; - } - } - - var i; - for (i = 0; i < elem.gracenotes.length; i++) { - var gracepitch = elem.gracenotes[i].verticalPos; - - flag = (gracebeam) ? null : chartable.uflags[(isBagpipes) ? 5 : 3]; - var accidentalSlot = []; - var ret = createNoteHead(abselem, "noteheads.quarter", elem.gracenotes[i], "up", -graceoffsets[i], -graceoffsets[i], flag, 0, 0, gracescale*this.voiceScale, accidentalSlot, false); - ret.notehead.highestVert = ret.notehead.pitch + stemHeight * graceScaleStem; - var grace = ret.notehead; - this.addSlursAndTies(abselem, elem.gracenotes[i], grace, voice, "up", true); - - abselem.addExtra(grace); - // PER: added acciaccatura slash - if (elem.gracenotes[i].acciaccatura) { - var pos = elem.gracenotes[i].verticalPos + 7 * gracescale; // the same formula that determines the flag position. - var dAcciaccatura = gracebeam ? 5 : 6; // just an offset to make it line up correctly. - abselem.addRight(new abc_relative_element("flags.ugrace", -graceoffsets[i] + dAcciaccatura, 0, pos, {scalex: gracescale, scaley: gracescale})); - } - if (gracebeam) { // give the beam the necessary info - var graceDuration = elem.gracenotes[i].duration / 2; - if (isBagpipes) graceDuration /= 2; - var pseudoabselem = { - heads: [grace], - abcelem: {averagepitch: gracepitch, minpitch: gracepitch, maxpitch: gracepitch, duration: graceDuration} - }; - gracebeam.add(pseudoabselem); - } else { // draw the stem - var p1 = gracepitch + 1 / 3 * gracescale; - var p2 = gracepitch + 7 * gracescale; - var dx = grace.dx + grace.w; - var width = -0.6; - abselem.addExtra(new abc_relative_element(null, dx, 0, p1, {"type": "stem", "pitch2": p2, linewidth: width})); - } - ledgerLines(abselem, gracepitch, gracepitch, false, abc_glyphs.getSymbolWidth("noteheads.quarter"), [], true, grace.dx - 1, 0.6); - - if (i === 0 && !isBagpipes && !(elem.rest && (elem.rest.type === "spacer" || elem.rest.type === "invisible"))) { - // This is the overall slur that is under the grace notes. - var isTie = (elem.gracenotes.length === 1 && grace.pitch === notehead.pitch); - voice.addOther(new abc_tie_element({ anchor1: grace, anchor2: notehead, isGrace: true})); - } - } - - if (gracebeam) { - voice.addBeam(gracebeam); - } - return roomtaken; - }; - - function addRestToAbsElement(abselem, elem, duration, dot, isMultiVoice, stemdir, isSingleLineStaff, durlog, voiceScale) { - var c; - var restpitch = 7; - var noteHead; - var roomTaken; - var roomTakenRight; - - if (isMultiVoice) { - if (stemdir === "down") restpitch = 3; - if (stemdir === "up") restpitch = 11; - } - // There is special placement for the percussion staff. If there is one staff line, then move the rest position. - if (isSingleLineStaff) { - // The half and whole rests are attached to different lines normally, so we need to tweak their position to get them to both be attached to the same one. - if (duration < 0.5) - restpitch = 7; - else if (duration < 1) - restpitch = 7; // half rest - else - restpitch = 5; // whole rest - } - switch (elem.rest.type) { - case "whole": - c = chartable.rest[0]; - elem.averagepitch = restpitch; - elem.minpitch = restpitch; - elem.maxpitch = restpitch; - dot = 0; - break; - case "rest": - if (elem.style === "rhythm") // special case for rhythm: rests are a handy way to express the rhythm. - c = chartable.rhythm[-durlog]; - else - c = chartable.rest[-durlog]; - elem.averagepitch = restpitch; - elem.minpitch = restpitch; - elem.maxpitch = restpitch; - break; - case "invisible": - case "spacer": - c = ""; - elem.averagepitch = restpitch; - elem.minpitch = restpitch; - elem.maxpitch = restpitch; - break; - case "multimeasure": - c = chartable.rest['multi']; - elem.averagepitch = restpitch; - elem.minpitch = restpitch; - elem.maxpitch = restpitch; - dot = 0; - var mmWidth = abc_glyphs.getSymbolWidth(c); - abselem.addHead(new abc_relative_element(c, -mmWidth, mmWidth * 2, 7)); - var numMeasures = new abc_relative_element("" + elem.duration, 0, mmWidth, 16, {type: "multimeasure-text"}); - abselem.addExtra(numMeasures); - } - if (elem.rest.type !== "multimeasure") { - var ret = createNoteHead(abselem, c, {verticalPos: restpitch}, null, 0, 0, null, dot, 0, voiceScale, [], false); - noteHead = ret.notehead; - if (noteHead) { - abselem.addHead(noteHead); - roomTaken = ret.accidentalshiftx; - roomTakenRight = ret.dotshiftx; - } - } - return { noteHead: noteHead, roomTaken: roomTaken, roomTakenRight: roomTakenRight }; - } - - function addIfNotExist(arr, item) { - for (var i = 0; i < arr.length; i++) { - if (JSON.stringify(arr[i]) === JSON.stringify(item)) - return; - } - arr.push(item); - } - - AbstractEngraver.prototype.addNoteToAbcElement = function(abselem, elem, dot, stemdir, style, zeroDuration, durlog, nostem, voice) { - var dotshiftx = 0; // room taken by chords with displaced noteheads which cause dots to shift - var noteHead; - var roomTaken = 0; - var roomTakenRight = 0; - var min; - var i; - var additionalLedgers = []; - // The accidentalSlot will hold a list of all the accidentals on this chord. Each element is a vertical place, - // and contains a pitch, which is the last pitch that contains an accidental in that slot. The slots are numbered - // from closest to the note to farther left. We only need to know the last accidental we placed because - // we know that the pitches are sorted by now. - var accidentalSlot = []; - var symbolWidth = 0; - - var dir = (elem.averagepitch>=6) ? "down": "up"; - if (stemdir) dir=stemdir; - - style = elem.style ? elem.style : style; // get the style of note head. - if (!style || style === "normal") style = "note"; - var noteSymbol; - if (zeroDuration) - noteSymbol = chartable[style].nostem; - else - noteSymbol = chartable[style][-durlog]; - if (!noteSymbol) - console.log("noteSymbol:", style, durlog, zeroDuration); - - // determine elements of chords which should be shifted - var p; - for (p=(dir==="down")?elem.pitches.length-2:1; (dir==="down")?p>=0:p 11 || curr.verticalPos < 1) { // PER: add extra ledger line - additionalLedgers.push(curr.verticalPos - (curr.verticalPos%2)); - } - if (dir==="down") { - roomTaken = abc_glyphs.getSymbolWidth(noteSymbol)+2; - } else { - dotshiftx = abc_glyphs.getSymbolWidth(noteSymbol)+2; - } - } - } - - var pp = elem.pitches.length; - for (p=0; p 0) - noteHead.bottom = noteHead.bottom - 1; // If there is a tie to the grace notes, leave a little more room for the note to avoid collisions. - abselem.addHead(noteHead); - } - roomTaken += ret.accidentalshiftx; - roomTakenRight = Math.max(roomTakenRight,ret.dotshiftx); - } - - // draw stem from the furthest note to a pitch above/below the stemmed note - if (hasStem) { - var stemHeight = 7 * this.voiceScale; - var p1 = (dir==="down") ? elem.minpitch-stemHeight : elem.minpitch+1/3; - // PER added stemdir test to make the line meet the note. - if (p1>6 && !stemdir) p1=6; - var p2 = (dir==="down") ? elem.maxpitch-1/3 : elem.maxpitch+stemHeight; - // PER added stemdir test to make the line meet the note. - if (p2<6 && !stemdir) p2=6; - var dx = (dir==="down" || abselem.heads.length === 0)?0:abselem.heads[0].w; - var width = (dir==="down")?1:-1; - // TODO-PER-HACK: One type of note head has a different placement of the stem. This should be more generically calculated: - if (noteHead.c === 'noteheads.slash.quarter') { - if (dir === 'down') - p2 -= 1; - else - p1 += 1; - } - abselem.addExtra(new abc_relative_element(null, dx, 0, p1, {"type": "stem", "pitch2":p2, linewidth: width})); - //var RelativeElement = function RelativeElement(c, dx, w, pitch, opt) { - min = Math.min(p1, p2); - } - return { noteHead: noteHead, roomTaken: roomTaken, roomTakenRight: roomTakenRight, min: min, additionalLedgers: additionalLedgers, dir: dir, symbolWidth: symbolWidth }; - }; - - AbstractEngraver.prototype.addLyric = function(abselem, elem) { - var lyricStr = ""; - abc_common.each(elem.lyric, function(ly) { - var div = ly.divider === ' ' ? "" : ly.divider; - lyricStr += ly.syllable + div + "\n"; - }); - var lyricDim = this.renderer.getTextSize(lyricStr, 'vocalfont', "lyric"); - var position = elem.positioning ? elem.positioning.vocalPosition : 'below'; - abselem.addCentered(new abc_relative_element(lyricStr, 0, lyricDim.width, undefined, {type:"lyric", position: position, height: lyricDim.height / abc_spacing.STEP })); - }; - - AbstractEngraver.prototype.addChord = function(abselem, elem, roomTaken, roomTakenRight) { - var chordMargin = 8; // If there are chords next to each other, this is how close they can get. - for (var i = 0; i < elem.chord.length; i++) { - var x = 0; - var y; - var dim = this.renderer.getTextSize(elem.chord[i].name, 'annotationfont', "annotation"); - var chordWidth = dim.width; - var chordHeight = dim.height / abc_spacing.STEP; - switch (elem.chord[i].position) { - case "left": - roomTaken+=chordWidth+7; - x = -roomTaken; // TODO-PER: This is just a guess from trial and error - y = elem.averagepitch; - abselem.addExtra(new abc_relative_element(elem.chord[i].name, x, chordWidth+4, y, {type:"text", height: chordHeight})); - break; - case "right": - roomTakenRight+=4; - x = roomTakenRight;// TODO-PER: This is just a guess from trial and error - y = elem.averagepitch; - abselem.addRight(new abc_relative_element(elem.chord[i].name, x, chordWidth+4, y, {type:"text", height: chordHeight})); - break; - case "below": - // setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is. - abselem.addRight(new abc_relative_element(elem.chord[i].name, 0, chordWidth+chordMargin, undefined, {type: "text", position: "below", height: chordHeight})); - break; - case "above": - // setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is. - abselem.addRight(new abc_relative_element(elem.chord[i].name, 0, chordWidth+chordMargin, undefined, {type: "text", height: chordHeight})); - break; - default: - if (elem.chord[i].rel_position) { - var relPositionY = elem.chord[i].rel_position.y + 3*abc_spacing.STEP; // TODO-PER: this is a fudge factor to make it line up with abcm2ps - abselem.addChild(new abc_relative_element(elem.chord[i].name, x + elem.chord[i].rel_position.x, 0, elem.minpitch + relPositionY / abc_spacing.STEP, {type: "text", height: chordHeight})); - } else { - // setting the y-coordinate to undefined for now: it will be overwritten later on, after we figure out what the highest element on the line is. - var pos2 = 'above'; - if (elem.positioning && elem.positioning.chordPosition) - pos2 = elem.positioning.chordPosition; - - dim = this.renderer.getTextSize(elem.chord[i].name, 'gchordfont', "chord"); - chordHeight = dim.height / abc_spacing.STEP; - chordWidth = dim.width; // Since the chord is centered, we only use half the width. - abselem.addCentered(new abc_relative_element(elem.chord[i].name, x, chordWidth, undefined, {type: "chord", position: pos2, height: chordHeight })); - } - } - } - return { roomTaken: roomTaken, roomTakenRight: roomTakenRight }; - }; - -AbstractEngraver.prototype.createNote = function(elem, nostem, isSingleLineStaff, voice) { //stem presence: true for drawing stemless notehead - var notehead = null; - var roomtaken = 0; // room needed to the left of the note - var roomtakenright = 0; // room needed to the right of the note - var symbolWidth = 0; - var additionalLedgers = []; // PER: handle the case of [bc'], where the b doesn't have a ledger line - var dir; - - var duration = getDuration(elem); - var zeroDuration = false; - if (duration === 0) { zeroDuration = true; duration = 0.25; nostem = true; } //PER: zero duration will draw a quarter note head. - var durlog = Math.floor(Math.log(duration)/Math.log(2)); //TODO use getDurlog - var dot=0; - - for (var tot = Math.pow(2,durlog), inc=tot/2; tot 1, this.stemdir, isSingleLineStaff, durlog, this.voiceScale); - notehead = ret1.noteHead; - roomtaken = ret1.roomTaken; - roomtakenright = ret1.roomTakenRight; - } else { - var ret2 = this.addNoteToAbcElement(abselem, elem, dot, this.stemdir, this.style, zeroDuration, durlog, nostem, voice); - if (ret2.min !== undefined) - this.minY = Math.min(ret2.min, this.minY); - notehead = ret2.noteHead; - roomtaken = ret2.roomTaken; - roomtakenright = ret2.roomTakenRight; - additionalLedgers = ret2.additionalLedgers; - dir = ret2.dir; - symbolWidth = ret2.symbolWidth; - } - - if (elem.lyric !== undefined) { - this.addLyric(abselem, elem); - } - - if (elem.gracenotes !== undefined) { - roomtaken += this.addGraceNotes(elem, voice, abselem, notehead, this.stemHeight * this.voiceScale, this.isBagpipes, roomtaken); - } - - if (elem.decoration) { - this.decoration.createDecoration(voice, elem.decoration, abselem.top, (notehead)?notehead.w:0, abselem, roomtaken, dir, abselem.bottom, elem.positioning, this.hasVocals); - } - - if (elem.barNumber) { - abselem.addChild(new abc_relative_element(elem.barNumber, -10, 0, 0, {type:"barNumber"})); - } - - // ledger lines - ledgerLines(abselem, elem.minpitch, elem.maxpitch, elem.rest, symbolWidth, additionalLedgers, dir, -2, 1); - - if (elem.chord !== undefined) { - var ret3 = this.addChord(abselem, elem, roomtaken, roomtakenright); - roomtaken = ret3.roomTaken; - roomtakenright = ret3.roomTakenRight; - } - - - if (elem.startTriplet) { - this.triplet = new abc_triplet_element(elem.startTriplet, notehead, { flatBeams: this.flatBeams }); // above is opposite from case of slurs - } - - if (elem.endTriplet && this.triplet) { - this.triplet.setCloseAnchor(notehead); - } - - if (this.triplet && !elem.startTriplet && !elem.endTriplet) { - this.triplet.middleNote(notehead); - } - - - return abselem; -}; - - - - -var createNoteHead = function(abselem, c, pitchelem, dir, headx, extrax, flag, dot, dotshiftx, scale, accidentalSlot, shouldExtendStem) { - // TODO scale the dot as well - var pitch = pitchelem.verticalPos; - var notehead; - var accidentalshiftx = 0; - var newDotShiftX = 0; - var extraLeft = 0; - if (c === undefined) - abselem.addChild(new abc_relative_element("pitch is undefined", 0, 0, 0, {type:"debug"})); - else if (c==="") { - notehead = new abc_relative_element(null, 0, 0, pitch); - } else { - var shiftheadx = headx; - if (pitchelem.printer_shift) { - var adjust = (pitchelem.printer_shift==="same")?1:0; - shiftheadx = (dir==="down")?-abc_glyphs.getSymbolWidth(c)*scale+adjust:abc_glyphs.getSymbolWidth(c)*scale-adjust; - } - var opts = {scalex:scale, scaley: scale, thickness: abc_glyphs.symbolHeightInPitches(c)*scale }; - notehead = new abc_relative_element(c, shiftheadx, abc_glyphs.getSymbolWidth(c)*scale, pitch, opts); - notehead.stemDir = dir; - if (flag) { - var pos = pitch+((dir==="down")?-7:7)*scale; - // if this is a regular note, (not grace or tempo indicator) then the stem will have been stretched to the middle line if it is far from the center. - if (shouldExtendStem) { - if (dir==="down" && pos > 6) - pos = 6; - if (dir==="up" && pos < 6) - pos = 6; - } - //if (scale===1 && (dir==="down")?(pos>6):(pos<6)) pos=6; - var xdelta = (dir==="down")?headx:headx+notehead.w-0.6; - abselem.addRight(new abc_relative_element(flag, xdelta, abc_glyphs.getSymbolWidth(flag)*scale, pos, {scalex:scale, scaley: scale})); - } - newDotShiftX = notehead.w+dotshiftx-2+5*dot; - for (;dot>0;dot--) { - var dotadjusty = (1-Math.abs(pitch)%2); //PER: take abs value of the pitch. And the shift still happens on ledger lines. - abselem.addRight(new abc_relative_element("dots.dot", notehead.w+dotshiftx-2+5*dot, abc_glyphs.getSymbolWidth("dots.dot"), pitch+dotadjusty)); - } - } - if (notehead) - notehead.highestVert = pitchelem.highestVert; - - if (pitchelem.accidental) { - var symb; - switch (pitchelem.accidental) { - case "quartersharp": - symb = "accidentals.halfsharp"; - break; - case "dblsharp": - symb = "accidentals.dblsharp"; - break; - case "sharp": - symb = "accidentals.sharp"; - break; - case "quarterflat": - symb = "accidentals.halfflat"; - break; - case "flat": - symb = "accidentals.flat"; - break; - case "dblflat": - symb = "accidentals.dblflat"; - break; - case "natural": - symb = "accidentals.nat"; - } - // if a note is at least a sixth away, it can share a slot with another accidental - var accSlotFound = false; - var accPlace = extrax; - for (var j = 0; j < accidentalSlot.length; j++) { - if (pitch - accidentalSlot[j][0] >= 6) { - accidentalSlot[j][0] = pitch; - accPlace = accidentalSlot[j][1]; - accSlotFound = true; - break; - } - } - if (accSlotFound === false) { - accPlace -= (abc_glyphs.getSymbolWidth(symb)*scale+2); - accidentalSlot.push([pitch,accPlace]); - accidentalshiftx = (abc_glyphs.getSymbolWidth(symb)*scale+2); - } - abselem.addExtra(new abc_relative_element(symb, accPlace, abc_glyphs.getSymbolWidth(symb), pitch, {scalex:scale, scaley: scale})); - extraLeft = abc_glyphs.getSymbolWidth(symb) / 2; // TODO-PER: We need a little extra width if there is an accidental, but I'm not sure why it isn't the full width of the accidental. - } - - return { notehead: notehead, accidentalshiftx: accidentalshiftx, dotshiftx: newDotShiftX, extraLeft: extraLeft }; - -}; - - AbstractEngraver.prototype.addSlursAndTies = function(abselem, pitchelem, notehead, voice, dir, isGrace) { - if (pitchelem.endTie) { - if (this.ties.length > 0) { - // If there are multiple open ties, find the one that applies by matching the pitch, if possible. - var found = false; - for (var j = 0; j < this.ties.length; j++) { - if (this.ties[j].anchor1 && this.ties[j].anchor1.pitch === notehead.pitch) { - this.ties[j].setEndAnchor(notehead); - this.ties.splice(j, 1); - found = true; - break; - } - } - if (!found) { - this.ties[0].setEndAnchor(notehead); - this.ties.splice(0, 1); - } - } - } - - var voiceNumber = voice.voicetotal < 2 ? -1 : voice.voicenumber; - if (pitchelem.startTie) { - var tie = new abc_tie_element({ anchor1: notehead, force: (this.stemdir==="down" || this.stemdir==="up"), stemDir: this.stemdir, isGrace: isGrace, voiceNumber: voiceNumber}); - if (hint) tie.setHint(); - - this.ties[this.ties.length]=tie; - voice.addOther(tie); - // HACK-PER: For the animation, we need to know if a note is tied to the next one, so here's a flag. - // Unfortunately, only some of the notes in the current event might be tied, but this will consider it - // tied if any one of them is. That will work for most cases. - abselem.startTie = true; - } - - if (pitchelem.endSlur) { - for (var i=0; i= 0) - debugger; - el.setAttributeNS(null, key, attr[key]); - } - } - this.append(el); - return el; -}; - -Svg.prototype.text = function(text, attr, target) { - var el = document.createElementNS(svgNS, 'text'); - for (var key in attr) { - if (attr.hasOwnProperty(key)) { - el.setAttribute(key, attr[key]); - } - } - var lines = (""+text).split("\n"); - for (var i = 0; i < lines.length; i++) { - var line = document.createElementNS(svgNS, 'tspan'); - line.textContent = lines[i]; - line.setAttribute("x", attr.x ? attr.x : 0); - if (i !== 0) - line.setAttribute("dy", "1.2em"); - el.appendChild(line); - } - if (target) - target.appendChild(el); - else - this.append(el); - return el; -}; - -Svg.prototype.guessWidth = function(text, attr) { - var svg = this.createDummySvg(); - var el = this.text(text, attr, svg); - var size; - try { - size = el.getBBox(); - if (isNaN(size.height) || !size.height) // TODO-PER: I don't think this can happen unless there isn't a browser at all. - size = { width: attr['font-size']/2, height: attr['font-size'] + 2 }; // Just a wild guess. - else - size = {width: size.width, height: size.height}; - } catch (ex) { - size = { width: attr['font-size']/2, height: attr['font-size'] + 2 }; // Just a wild guess. - } - svg.removeChild(el); - return size; -}; - -Svg.prototype.createDummySvg = function() { - if (!this.dummySvg) { - this.dummySvg = createSvg(); - var styles = [ - "display: block !important;", - "height: 1px;", - "width: 1px;", - "position: absolute;" - ]; - this.dummySvg.setAttribute('style', styles.join("")); - var body = document.querySelector('body'); - body.appendChild(this.dummySvg); - } - - return this.dummySvg; -}; - -Svg.prototype.getTextSize = function(text, attr, el) { - if (typeof text === 'number') - text = ''+text; - if (!text || text.match(/^\s+$/)) - return { width: 0, height: 0 }; - var removeLater = !el; - if (!el) - el = this.text(text, attr); - var size; - try { - size = el.getBBox(); - if (isNaN(size.height) || !size.height) - size = this.guessWidth(text, attr); - else - size = {width: size.width, height: size.height}; - } catch (ex) { - size = this.guessWidth(text, attr); - } - if (removeLater) { - if (this.currentGroup) - this.currentGroup.removeChild(el); - else - this.svg.removeChild(el); - } - return size; -}; - -Svg.prototype.openGroup = function(options) { - options = options ? options : {}; - var el = document.createElementNS(svgNS, "g"); - if (options.prepend) - this.svg.insertBefore(el, this.svg.firstChild); - else - this.svg.appendChild(el); - this.currentGroup = el; - return el; -}; - -Svg.prototype.closeGroup = function() { - var g = this.currentGroup; - this.currentGroup = null; - return g; -}; - -Svg.prototype.path = function(attr) { - var el = document.createElementNS(svgNS, "path"); - for (var key in attr) { - if (attr.hasOwnProperty(key)) { - if (key === 'path') - el.setAttributeNS(null, 'd', attr.path); - else - el.setAttributeNS(null, key, attr[key]); - } - } - this.append(el); - return el; -}; - -Svg.prototype.pathToBack = function(attr) { - var el = document.createElementNS(svgNS, "path"); - for (var key in attr) { - if (attr.hasOwnProperty(key)) { - if (key === 'path') - el.setAttributeNS(null, 'd', attr.path); - else - el.setAttributeNS(null, key, attr[key]); - } - } - this.prepend(el); - return el; -}; - -Svg.prototype.append = function(el) { - if (this.currentGroup) - this.currentGroup.appendChild(el); - else - this.svg.appendChild(el); -}; - -Svg.prototype.prepend = function(el) { - // The entire group is prepended, so don't prepend the individual elements. - if (this.currentGroup) - this.currentGroup.appendChild(el); - else - this.svg.insertBefore(el, this.svg.firstChild); -}; - -Svg.prototype.setAttributeOnElement = function(el, attr) { - for (var key in attr) { - if (attr.hasOwnProperty(key)) { - el.setAttributeNS(null, key, attr[key]); - } - } -}; - -function createSvg() { - var svg = document.createElementNS(svgNS, "svg"); - svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); - svg.setAttribute('role', 'img'); // for accessibility - return svg; -} - - -var svg = Svg; - -// abc_renderer.js: API to render to SVG/Raphael/whatever rendering engine -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -/*global Math, console */ - - - - - - -/** - * Implements the API for rendering ABCJS Abstract Rendering Structure to a canvas/paper (e.g. SVG, Raphael, etc) - * @param {Object} paper - * @param {bool} doRegression - */ -var Renderer = function(paper, doRegression, shouldAddClasses) { - this.paper = new svg(paper); - this.controller = null; //TODO-GD only used when drawing the ABCJS ARS to connect the controller with the elements for highlighting - - this.space = 3*abc_spacing.SPACE; - this.padding = {}; // renderer's padding is managed by the controller - this.doRegression = doRegression; - this.shouldAddClasses = shouldAddClasses; - if (this.doRegression) - this.regressionLines = []; - this.reset(); -}; - -Renderer.prototype.reset = function() { - - this.paper.clear(); - this.y = 0; - this.abctune = null; - this.lastM = null; - this.ingroup = false; - this.path = null; - this.isPrint = false; - this.initVerticalSpace(); - if (this.doRegression) - this.regressionLines = []; - // HACK-PER: There was a problem in Raphael where every path string that was sent to it was cached. - // That was causing the browser's memory to steadily grow until the browser went slower and slower until - // it crashed. The fix to that was a patch to Raphael, so it is only patched on the versions of this library that - // bundle Raphael with it. Also, if Raphael gets an update, then that patch will be lost. On version 2.1.2 of Raphael, - // the patch is on line 1542 and 1545 and it is: - // p[ps].sleep = 1; -}; - -Renderer.prototype.newTune = function(abcTune) { - this.abctune = abcTune; // TODO-PER: this is just to get the font info. - this.setVerticalSpace(abcTune.formatting); - this.measureNumber = null; - this.noteNumber = null; - this.setPrintMode(abcTune.media === 'print'); - this.setPadding(abcTune); -}; - -Renderer.prototype.createElemSet = function() { - return this.paper.openGroup(); -}; - -Renderer.prototype.closeElemSet = function() { - return this.paper.closeGroup(); -}; - -/** - * Set whether we are formatting this for the screen, or as a preview for creating a PDF version. - * @param {bool} isPrint - */ -Renderer.prototype.setPrintMode = function (isPrint) { - this.isPrint = isPrint; -}; - -/** - * Set the size of the canvas. - * @param {object} maxwidth - * @param {object} scale - */ -Renderer.prototype.setPaperSize = function (maxwidth, scale, responsive) { - var w = (maxwidth+this.padding.right)*scale; - var h = (this.y+this.padding.bottom)*scale; - if (this.isPrint) - h = Math.max(h, 1056); // 11in x 72pt/in x 1.33px/pt - // TODO-PER: We are letting the page get as long as it needs now, but eventually that should go to a second page. - if (this.doRegression) - this.regressionLines.push("PAPER SIZE: ("+w+","+h+")"); - - // for accessibility - var text = "Sheet Music"; - if (this.abctune && this.abctune.metaText && this.abctune.metaText.title) - text += " for \"" + this.abctune.metaText.title + '"'; - this.paper.setTitle(text); - - var parentStyles = { overflow: "hidden" }; - if (responsive === 'resize') { - this.paper.setResponsiveWidth(w, h); - } else { - parentStyles.width = ""; - parentStyles.height = h + "px"; - if (scale < 1) { - parentStyles.width = w + "px"; - this.paper.setSize(w / scale, h / scale); - } else - this.paper.setSize(w, h); - } - this.paper.setScale(scale); - this.paper.setParentStyles(parentStyles); -}; - -/** - * Set the padding - * @param {object} params - */ -Renderer.prototype.setPaddingOverride = function(params) { - this.paddingOverride = { top: params.paddingtop, bottom: params.paddingbottom, - right: params.paddingright, left: params.paddingleft }; -}; - -/** - * Set the padding - * @param {object} params - */ -Renderer.prototype.setPadding = function(abctune) { - // If the padding is set in the tune, then use that. - // Otherwise, if the padding is set in the override, use that. - // Otherwise, use the defaults (there are a different set of defaults for screen and print.) - function setPaddingVariable(self, paddingKey, formattingKey, printDefault, screenDefault) { - if (abctune.formatting[formattingKey] !== undefined) - self.padding[paddingKey] = abctune.formatting[formattingKey]; - else if (self.paddingOverride[paddingKey] !== undefined) - self.padding[paddingKey] = self.paddingOverride[paddingKey]; - else if (self.isPrint) - self.padding[paddingKey] = printDefault; - else - self.padding[paddingKey] = screenDefault; - } - // 1cm x 0.393701in/cm x 72pt/in x 1.33px/pt = 38px - // 1.8cm x 0.393701in/cm x 72pt/in x 1.33px/pt = 68px - setPaddingVariable(this, 'top', 'topmargin', 38, 15); - setPaddingVariable(this, 'bottom', 'botmargin', 38, 15); - setPaddingVariable(this, 'left', 'leftmargin', 68, 15); - setPaddingVariable(this, 'right', 'rightmargin', 68, 15); -}; - -/** - * Some of the items on the page are not scaled, so adjust them in the opposite direction of scaling to cancel out the scaling. - * @param {float} scale - */ -Renderer.prototype.adjustNonScaledItems = function (scale) { - this.padding.top /= scale; - this.padding.bottom /= scale; - this.padding.left /= scale; - this.padding.right /= scale; - this.abctune.formatting.headerfont.size /= scale; - this.abctune.formatting.footerfont.size /= scale; -}; - -/** - * Set the the values for all the configurable vertical space options. - */ -Renderer.prototype.initVerticalSpace = function() { - // conversion: 37.7953 = conversion factor for cm to px. - // All of the following values are in px. - this.spacing = { - composer: 7.56, // Set the vertical space above the composer. - graceBefore: 8.67, // Define the space before, inside and after the grace notes. - graceInside: 10.67, - graceAfter: 16, - info: 0, // Set the vertical space above the infoline. - lineSkipFactor: 1.1, // Set the factor for spacing between lines of text. (multiply this by the font size) - music: 7.56, // Set the vertical space above the first staff. - paragraphSkipFactor: 0.4, // Set the factor for spacing between text paragraphs. (multiply this by the font size) - parts: 11.33, // Set the vertical space above a new part. - slurHeight: 1.0, // Set the slur height factor. - staffSeparation: 61.33, // Do not put a staff system closer than from the previous system. - stemHeight: 26.67+10, // Set the stem height. - subtitle: 3.78, // Set the vertical space above the subtitle. - systemStaffSeparation: 48, // Do not place the staves closer than inside a system. * This values applies to all staves when in the tune header. Otherwise, it applies to the next staff - text: 18.9, // Set the vertical space above the history. - title: 7.56, // Set the vertical space above the title. - top: 30.24, //Set the vertical space above the tunes and on the top of the continuation pages. - vocal: 30.67, // Set the vertical space above the lyrics under the staves. - words: 0 // Set the vertical space above the lyrics at the end of the tune. - }; - /* - TODO-PER: Handle the x-coordinate spacing items, too. -maxshrink Default: 0.65 -Set how much to compress horizontally when music line breaks -are automatic. - must be between 0 (natural spacing) -and 1 (max shrinking). - -// This next value is used to compute the natural spacing of -// the notes. The base spacing of the crotchet is always -// 40 pts. When the duration of a note type is twice the -// duration of an other note type, its spacing is multiplied -// by this factor. -// The default value causes the note spacing to be multiplied -// by 2 when its duration is multiplied by 4, i.e. the -// space of the semibreve is 80 pts and the space of the -// semiquaver is 20 pts. -// Setting this value to 1 sets all note spacing to 40 pts. -noteSpacingFactor: 1.414, // Set the note spacing factor to (range 1..2). - -scale Default: 0.75 Set the page scale factor. Note that the header and footer are not scaled. - -stretchlast Default: 0.8 -Stretch the last music line of a tune when it exceeds -the fraction of the page width. - range is 0.0 to 1.0. - */ -}; - -Renderer.prototype.setVerticalSpace = function(formatting) { - // conversion from pts to px 4/3 - if (formatting.staffsep !== undefined) - this.spacing.staffSeparation = formatting.staffsep *4/3; - if (formatting.composerspace !== undefined) - this.spacing.composer = formatting.composerspace *4/3; - if (formatting.partsspace !== undefined) - this.spacing.parts = formatting.partsspace *4/3; - if (formatting.textspace !== undefined) - this.spacing.text = formatting.textspace *4/3; - if (formatting.musicspace !== undefined) - this.spacing.music = formatting.musicspace *4/3; - if (formatting.titlespace !== undefined) - this.spacing.title = formatting.titlespace *4/3; - if (formatting.sysstaffsep !== undefined) - this.spacing.systemStaffSeparation = formatting.sysstaffsep *4/3; - if (formatting.subtitlespace !== undefined) - this.spacing.subtitle = formatting.subtitlespace *4/3; - if (formatting.topspace !== undefined) - this.spacing.top = formatting.topspace *4/3; - if (formatting.vocalspace !== undefined) - this.spacing.vocal = formatting.vocalspace *4/3; - if (formatting.wordsspace !== undefined) - this.spacing.words = formatting.wordsspace *4/3; -}; - -/** - * Leave space at the top of the paper - * @param {object} abctune - */ -Renderer.prototype.topMargin = function(abctune) { - this.moveY(this.padding.top); -}; - -/** - * Leave space before printing the music - */ -Renderer.prototype.addMusicPadding = function() { - this.moveY(this.spacing.music); -}; - -/** - * Leave space before printing a staff system - */ -Renderer.prototype.addStaffPadding = function(lastStaffGroup, thisStaffGroup) { - var lastStaff = lastStaffGroup.staffs[lastStaffGroup.staffs.length-1]; - var lastBottomLine = -(lastStaff.bottom - 2); // The 2 is because the scale goes to 2 below the last line. - var nextTopLine = thisStaffGroup.staffs[0].top - 10; // Because 10 represents the top line. - var naturalSeparation = nextTopLine + lastBottomLine; // This is how far apart they'd be without extra spacing - var separationInPixels = naturalSeparation * abc_spacing.STEP; - if (separationInPixels < this.spacing.staffSeparation) - this.moveY(this.spacing.staffSeparation-separationInPixels); -}; - -/** - * Text that goes above the score - * @param {number} width - * @param {object} abctune - */ -Renderer.prototype.engraveTopText = function(width, abctune) { - if (abctune.metaText.header && this.isPrint) { - // Note: whether there is a header or not doesn't change any other positioning, so this doesn't change the Y-coordinate. - // This text goes above the margin, so we'll temporarily move up. - var headerTextHeight = this.getTextSize("XXXX", "headerfont", 'abcjs-header abcjs-meta-top').height; - this.y -=headerTextHeight; - this.outputTextIf(this.padding.left, abctune.metaText.header.left, 'headerfont', 'header meta-top', 0, null, 'start'); - this.outputTextIf(this.padding.left + width / 2, abctune.metaText.header.center, 'headerfont', 'header meta-top', 0, null, 'middle'); - this.outputTextIf(this.padding.left + width, abctune.metaText.header.right, 'headerfont', 'header meta-top', 0, null, 'end'); - this.y += headerTextHeight; - } - if (this.isPrint) - this.moveY(this.spacing.top); - this.outputTextIf(this.padding.left + width / 2, abctune.metaText.title, 'titlefont', 'title meta-top', this.spacing.title, 0, 'middle'); - if (abctune.lines[0]) - this.outputTextIf(this.padding.left + width / 2, abctune.lines[0].subtitle, 'subtitlefont', 'text meta-top', this.spacing.subtitle, 0, 'middle'); - - if (abctune.metaText.rhythm || abctune.metaText.origin || abctune.metaText.composer) { - this.moveY(this.spacing.composer); - var rSpace = this.outputTextIf(this.padding.left, abctune.metaText.rhythm, 'infofont', 'meta-top', 0, null, "start"); - - var composerLine = ""; - if (abctune.metaText.composer) composerLine += abctune.metaText.composer; - if (abctune.metaText.origin) composerLine += ' (' + abctune.metaText.origin + ')'; - if (composerLine.length > 0) { - var space = this.outputTextIf(this.padding.left + width, composerLine, 'composerfont', 'meta-top', 0, null, "end"); - this.moveY(space[1]); - } else { - this.moveY(rSpace[1]); - } - // TODO-PER: The following is a hack to make the elements line up with abcm2ps. Don't know where the extra space is coming from. - this.moveY(-6); - //} else if (this.isPrint) { - // // abcm2ps adds this space whether there is anything to write or not. - // this.moveY(this.spacing.composer); - // var space2 = this.getTextSize("M", 'composerfont', 'meta-top'); - // this.moveY(space2.height); - } - - this.outputTextIf(this.padding.left + width, abctune.metaText.author, 'composerfont', 'meta-top', 0, 0, "end"); - //this.skipSpaceY(); - - this.outputTextIf(this.padding.left, abctune.metaText.partOrder, 'partsfont', 'meta-bottom', 0, 0, "start"); -}; - -/** - * Text that goes below the score - * @param {number} width - * @param {object} abctune - */ -Renderer.prototype.engraveExtraText = function(width, abctune) { - this.lineNumber = null; - this.measureNumber = null; - this.noteNumber = null; - this.voiceNumber = null; - - if (abctune.metaText.unalignedWords) { - var hash = this.getFontAndAttr("wordsfont", 'meta-bottom'); - var space = this.getTextSize("i", 'wordsfont', 'meta-bottom'); - - if (abctune.metaText.unalignedWords.length > 0) - this.moveY(this.spacing.words, 1); - for (var j = 0; j < abctune.metaText.unalignedWords.length; j++) { - if (abctune.metaText.unalignedWords[j] === '') - this.moveY(hash.font.size, 1); - else if (typeof abctune.metaText.unalignedWords[j] === 'string') { - this.outputTextIf(this.padding.left + abc_spacing.INDENT, abctune.metaText.unalignedWords[j], 'wordsfont', 'meta-bottom', 0, 0, "start"); - } else { - var largestY = 0; - var offsetX = 0; - for (var k = 0; k < abctune.metaText.unalignedWords[j].length; k++) { - var thisWord = abctune.metaText.unalignedWords[j][k]; - var type = (thisWord.font) ? thisWord.font : "wordsfont"; - var el = this.renderText(this.padding.left + abc_spacing.INDENT + offsetX, this.y, thisWord.text, type, 'meta-bottom', false); - var size = this.getTextSize(thisWord.text, type, 'meta-bottom'); - largestY = Math.max(largestY, size.height); - offsetX += size.width; - // If the phrase ends in a space, then that is not counted in the width, so we need to add that in ourselves. - if (thisWord.text[thisWord.text.length-1] === ' ') { - offsetX += space.width; - } - } - this.moveY(largestY, 1); - } - } - if (abctune.metaText.unalignedWords.length > 0) - this.moveY(hash.font.size, 2); - } - - var extraText = ""; - if (abctune.metaText.book) extraText += "Book: " + abctune.metaText.book + "\n"; - if (abctune.metaText.source) extraText += "Source: " + abctune.metaText.source + "\n"; - if (abctune.metaText.discography) extraText += "Discography: " + abctune.metaText.discography + "\n"; - if (abctune.metaText.notes) extraText += "Notes: " + abctune.metaText.notes + "\n"; - if (abctune.metaText.transcription) extraText += "Transcription: " + abctune.metaText.transcription + "\n"; - if (abctune.metaText.history) extraText += "History: " + abctune.metaText.history + "\n"; - if (abctune.metaText['abc-copyright']) extraText += "Copyright: " + abctune.metaText['abc-copyright'] + "\n"; - if (abctune.metaText['abc-creator']) extraText += "Creator: " + abctune.metaText['abc-creator'] + "\n"; - if (abctune.metaText['abc-edited-by']) extraText += "Edited By: " + abctune.metaText['abc-edited-by'] + "\n"; - this.outputTextIf(this.padding.left, extraText, 'historyfont', 'meta-bottom', this.spacing.info, 0, "start"); - - if (abctune.metaText.footer && this.isPrint) { - // Note: whether there is a footer or not doesn't change any other positioning, so this doesn't change the Y-coordinate. - this.outputTextIf(this.padding.left, abctune.metaText.footer.left, 'footerfont', 'header meta-bottom', 0, null, 'start'); - this.outputTextIf(this.padding.left + width / 2, abctune.metaText.footer.center, 'footerfont', 'header meta-bottom', 0, null, 'middle'); - this.outputTextIf(this.padding.left + width, abctune.metaText.footer.right, 'footerfont', 'header meta-bottom', 0, null, 'end'); - } -}; - -/** - * Output text defined with %%text. - * @param {array or string} text - */ -Renderer.prototype.outputFreeText = function (text, vskip) { - if (vskip) - this.moveY(vskip); - var hash = this.getFontAndAttr('textfont', 'defined-text'); - if (text === "") { // we do want to print out blank lines if they have been specified. - this.moveY(hash.attr['font-size'] * 2); // move the distance of the line, plus the distance of the margin, which is also one line. - } else if (typeof text === 'string') { - this.moveY(hash.attr['font-size']/2); // TODO-PER: move down some - the y location should be the top of the text, but we output text specifying the center line. - this.outputTextIf(this.padding.left, text, 'textfont', 'defined-text', 0, 0, "start"); - } else { - var str = ""; - var isCentered = false; // The structure is wrong here: it requires an array to do centering, but it shouldn't have. - for (var i = 0; i < text.length; i++) { - if (text[i].font) - str += "FONT(" + text[i].font + ")"; - str += text[i].text; - if (text[i].center) - isCentered = true; - } - var alignment = isCentered ? 'middle' : 'start'; - var x = isCentered ? this.controller.width / 2 : this.padding.left; - this.outputTextIf(x, str, 'textfont', 'defined-text', 0, 1, alignment); - } -}; - -Renderer.prototype.outputSeparator = function (separator) { - if (!separator.lineLength) - return; - this.moveY(separator.spaceAbove); - this.printSeparator(separator.lineLength); - this.moveY(separator.spaceBelow); -}; - -/** - * Output an extra subtitle that is defined later in the tune. - */ -Renderer.prototype.outputSubtitle = function (width, subtitle) { - this.outputTextIf(this.padding.left + width / 2, subtitle, 'subtitlefont', 'text meta-top', this.spacing.subtitle, 0, 'middle'); -}; - -/** - * Begin a group of glyphs that will always be moved, scaled and highlighted together - */ -Renderer.prototype.beginGroup = function () { - this.path = []; - this.lastM = [0,0]; - this.ingroup = true; -}; - -/** - * Add a path to the current group - * @param {Array} path - * @private - */ -Renderer.prototype.addPath = function (path) { - path = path || []; - if (path.length===0) return; - path[0][0]="m"; - path[0][1]-=this.lastM[0]; - path[0][2]-=this.lastM[1]; - this.lastM[0]+=path[0][1]; - this.lastM[1]+=path[0][2]; - this.path.push(path[0]); - for (var i=1,ii=path.length;i 1 && symbol.indexOf(".") < 0) { - this.paper.openGroup(); - var dx = 0; - for (var i = 0; i < symbol.length; i++) { - var s = symbol.charAt(i); - ycorr = abc_glyphs.getYCorr(s); - el = abc_glyphs.printSymbol(x + dx, this.calcY(offset + ycorr), s, this.paper, klass); - if (el) { - if (this.doRegression) this.addToRegression(el); - //elemset.push(el); - if (i < symbol.length - 1) - dx += kernSymbols(s, symbol.charAt(i + 1), abc_glyphs.getSymbolWidth(s)); - } else { - this.renderText(x, this.y, "no symbol:" + symbol, "debugfont", 'debug-msg', 'start'); - } - } - return this.paper.closeGroup(); - } else { - ycorr = abc_glyphs.getYCorr(symbol); - if (this.ingroup) { - this.addPath(abc_glyphs.getPathForSymbol(x, this.calcY(offset + ycorr), symbol, scalex, scaley)); - } else { - el = abc_glyphs.printSymbol(x, this.calcY(offset + ycorr), symbol, this.paper, klass); - if (el) { - if (this.doRegression) this.addToRegression(el); - return el; - } else - this.renderText(x, this.y, "no symbol:" + symbol, "debugfont", 'debug-msg', 'start'); - } - return null; - } -}; - -Renderer.prototype.scaleExistingElem = function (elem, scaleX, scaleY, x, y) { - this.paper.setAttributeOnElement(elem, { style: "transform:scale("+scaleX+","+scaleY + ");transform-origin:" + x + "px " + y + "px;"}); -}; - -Renderer.prototype.printPath = function (attrs) { - var ret = this.paper.path(attrs); - if (this.doRegression) this.addToRegression(ret); - return ret; -}; - -Renderer.prototype.drawBrace = function(xLeft, yTop, yBottom) {//Tony - var yHeight = yBottom - yTop; - - var xCurve = [7.5, -8, 21, 0, 18.5, -10.5, 7.5]; - var yCurve = [0, yHeight/5.5, yHeight/3.14, yHeight/2, yHeight/2.93, yHeight/4.88, 0]; - - var pathString = sprintf_1("M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z", - xLeft+xCurve[0], yTop+yCurve[0], - xLeft+xCurve[1], yTop+yCurve[1], - xLeft+xCurve[2], yTop+yCurve[2], - xLeft+xCurve[3], yTop+yCurve[3], - xLeft+xCurve[4], yTop+yCurve[4], - xLeft+xCurve[5], yTop+yCurve[5], - xLeft+xCurve[6], yTop+yCurve[6]); - var ret1 = this.paper.path({path:pathString, stroke:"#000000", fill:"#000000", 'class': this.addClasses('brace')}); - - xCurve = [0, 17.5, -7.5, 6.6, -5, 20, 0]; - yCurve = [yHeight/2, yHeight/1.46, yHeight/1.22, yHeight, yHeight/1.19, yHeight/1.42, yHeight/2]; - - pathString = sprintf_1("M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z", - xLeft+xCurve[ 0], yTop+yCurve[0], - xLeft+xCurve[1], yTop+yCurve[1], - xLeft+xCurve[2], yTop+yCurve[2], - xLeft+xCurve[3], yTop+yCurve[3], - xLeft+xCurve[4], yTop+yCurve[4], - xLeft+xCurve[5], yTop+yCurve[5], - xLeft+xCurve[6], yTop+yCurve[6]); - var ret2 = this.paper.path({path:pathString, stroke:"#000000", fill:"#000000", 'class': this.addClasses('brace')}); - - if (this.doRegression){ - this.addToRegression(ret1); - this.addToRegression(ret2); - } - return ret1 + ret2; -}; - -Renderer.prototype.drawArc = function(x1, x2, pitch1, pitch2, above, klass, isTie) { - // If it is a tie vs. a slur, draw it shallower. - var spacing = isTie ? 1.2 : 1.5; - - x1 = x1 + 6; - x2 = x2 + 4; - pitch1 = pitch1 + ((above)?spacing:-spacing); - pitch2 = pitch2 + ((above)?spacing:-spacing); - var y1 = this.calcY(pitch1); - var y2 = this.calcY(pitch2); - - //unit direction vector - var dx = x2-x1; - var dy = y2-y1; - var norm= Math.sqrt(dx*dx+dy*dy); - var ux = dx/norm; - var uy = dy/norm; - - var flatten = norm/3.5; - var maxFlatten = isTie ? 10 : 25; // If it is a tie vs. a slur, draw it shallower. - var curve = ((above)?-1:1)*Math.min(maxFlatten, Math.max(4, flatten)); - - var controlx1 = x1+flatten*ux-curve*uy; - var controly1 = y1+flatten*uy+curve*ux; - var controlx2 = x2-flatten*ux-curve*uy; - var controly2 = y2-flatten*uy+curve*ux; - var thickness = 2; - var pathString = sprintf_1("M %f %f C %f %f %f %f %f %f C %f %f %f %f %f %f z", x1, y1, - controlx1, controly1, controlx2, controly2, x2, y2, - controlx2-thickness*uy, controly2+thickness*ux, controlx1-thickness*uy, controly1+thickness*ux, x1, y1); - if (klass) - klass += ' slur'; - else - klass = 'slur'; - var ret = this.paper.path({path:pathString, stroke:"none", fill:"#000000", 'class': this.addClasses(klass)}); - if (this.doRegression) this.addToRegression(ret); - - return ret; -}; -/** - * Calculates the y for a given pitch value (relative to the stave the renderer is currently printing) - * @param {number} ofs pitch value (bottom C on a G clef = 0, D=1, etc.) - */ -Renderer.prototype.calcY = function(ofs) { - return this.y - ofs*abc_spacing.STEP; -}; - -/** - * Print @param {number} numLines. If there is 1 line it is the B line. Otherwise the bottom line is the E line. - */ -Renderer.prototype.printStave = function (startx, endx, numLines) { - var klass = "top-line"; - this.paper.openGroup({ prepend: true }); - // If there is one line, it is the B line. Otherwise, the bottom line is the E line. - if (numLines === 1) { - this.printStaveLine(startx,endx,6, klass); - return; - } - for (var i = numLines-1; i >= 0; i--) { - this.printStaveLine(startx,endx,(i+1)*2, klass); - klass = undefined; - } - this.paper.closeGroup(); -}; - -/** - * - * @private - */ -Renderer.prototype.addClasses = function (c, isNote) { - if (!this.shouldAddClasses) - return ""; - var ret = []; - if (c.length > 0) ret.push(c); - if (this.lineNumber !== null && this.lineNumber !== undefined) ret.push("l"+this.lineNumber); - if (this.measureNumber !== null && this.measureNumber !== undefined) ret.push("m"+this.measureNumber); - if (this.voiceNumber !== null && this.voiceNumber !== undefined) ret.push("v"+this.voiceNumber); - if ((c.indexOf('note') >= 0 || c.indexOf('rest') >= 0 || c.indexOf('lyric') >= 0 ) && this.noteNumber !== null && this.noteNumber !== undefined) ret.push("n"+this.noteNumber); - // add a prefix to all classes that abcjs adds. - if (ret.length > 0) { - ret = ret.join(' '); // Some strings are compound classes - that is, specify more than one class in a string. - ret = ret.split(' '); - for (var i = 0; i < ret.length; i++) { - if (ret[i].indexOf('abcjs-') !== 0 && ret[i].length > 0) // if the prefix doesn't already exist and the class is not blank. - ret[i] = 'abcjs-' + ret[i]; - } - } - return ret.join(' '); -}; - -Renderer.prototype.getFontAndAttr = function(type, klass) { - var font; - if (typeof type === 'string') { - font = this.abctune.formatting[type]; - // Raphael deliberately changes the font units to pixels for some reason, so we need to change points to pixels here. - if (font) - font = {face: font.face, size: font.size * 4 / 3, decoration: font.decoration, style: font.style, weight: font.weight, box: font.box}; - else - font = {face: "Arial", size: 12 * 4 / 3, decoration: "underline", style: "normal", weight: "normal"}; - } else - font = {face: type.face, size: type.size * 4 / 3, decoration: type.decoration, style: type.style, weight: type.weight, box: type.box}; - - var attr = {"font-size": font.size, 'font-style': font.style, - "font-family": font.face, 'font-weight': font.weight, 'text-decoration': font.decoration, - 'class': this.addClasses(klass) }; - attr.font = ""; // There is a spurious font definition that is put on all text elements. This overwrites it. - return { font: font, attr: attr }; -}; - -Renderer.prototype.getTextSize = function(text, type, klass, el) { - var hash = this.getFontAndAttr(type, klass); - var size = this.paper.getTextSize(text, hash.attr, el); - if (hash.font.box) { - size.height += 8; - size.width += 8; - } - return size; -}; - -Renderer.prototype.renderText = function(x, y, text, type, klass, anchor, centerVertically) { - var hash = this.getFontAndAttr(type, klass); - if (anchor) - hash.attr["text-anchor"] = anchor; - hash.attr.x = x; - hash.attr.y = y + 7; // TODO-PER: Not sure why the text appears to be 7 pixels off. - if (!centerVertically) - hash.attr.dy = "0.5em"; - if (type === 'debugfont') { - console.log("Debug msg: " + text); - hash.attr.stroke = "#ff0000"; - } - - text = text.replace(/\n\n/g, "\n \n"); - text = text.replace(/^\n/, "\xA0\n"); - - if (hash.font.box) { - hash.attr.x += 2; - hash.attr.y += 4; - } - var el = this.paper.text(text, hash.attr); - - if (hash.font.box) { - var size = this.getTextSize(text, type, klass); - var padding = 2; - var margin = 2; - this.paper.rect({ x: x - padding, y: y, width: size.width + padding*2, height: size.height + padding*2 - margin, stroke: "#888888", fill: "transparent"}); - //size.height += 8; - } - if (this.doRegression) this.addToRegression(el); - return el; -}; - -Renderer.prototype.moveY = function (em, numLines) { - if (numLines === undefined) numLines = 1; - this.y += em*numLines; -}; - -Renderer.prototype.skipSpaceY = function () { - this.y += this.space; -}; - -// Call with 'kind' being the font type to use, -// if marginBottom === null then don't increment the Y after printing, otherwise that is the extra number of em's to leave below the line. -// and alignment being "start", "middle", or "end". -Renderer.prototype.outputTextIf = function(x, str, kind, klass, marginTop, marginBottom, alignment) { - if (str) { - if (marginTop) - this.moveY(marginTop); - var el = this.renderText(x, this.y, str, kind, klass, alignment); - var bb = this.getTextSize(str, kind, klass); - var width = isNaN(bb.width) ? 0 : bb.width; - var height = isNaN(bb.height) ? 0 : bb.height; - var hash = this.getFontAndAttr(kind, klass); - if (hash.font.box) { - width += 8; - height += 8; - } - if (marginBottom !== null) { - var numLines = str.split("\n").length; - if (!isNaN(bb.height)) - this.moveY(height/numLines, (numLines + marginBottom)); - } - return [width, height]; - } - return [0,0]; -}; - -Renderer.prototype.addInvisibleMarker = function (className) { - var dy = 0.35; - var fill = "rgba(0,0,0,0)"; - var y = this.y; - y = Math.round(y); - var x1 = 0; - var x2 = 100; - var pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", x1, y-dy, x1+x2, y-dy, - x2, y+dy, x1, y+dy); - this.paper.pathToBack({path:pathString, stroke:"none", fill:fill, "fill-opacity": 0, 'class': this.addClasses(className), 'data-vertical': y }); -}; - -Renderer.prototype.printSeparator = function(width) { - var fill = "rgba(0,0,0,255)"; - var stroke = "rgba(0,0,0,0)"; - var y = Math.round(this.y); - var staffWidth = this.controller.width; - var x1 = (staffWidth - width)/2; - var x2 = x1 + width; - var pathString = 'M ' + x1 + ' ' + y + - ' L ' + x2 + ' ' + y + - ' L ' + x2 + ' ' + (y+1) + - ' L ' + x1 + ' ' + (y+1) + - ' L ' + x1 + ' ' + y + ' z'; - this.paper.pathToBack({path:pathString, stroke:stroke, fill:fill, 'class': this.addClasses('defined-text')}); -}; - -// For debugging, it is sometimes useful to know where you are vertically. -Renderer.prototype.printHorizontalLine = function (width, vertical, comment) { - var dy = 0.35; - var fill = "rgba(0,0,255,.4)"; - var y = this.y; - if (vertical) y = vertical; - y = Math.round(y); - this.paper.text(""+Math.round(y), {x: 10, y: y, "text-anchor": "start", "font-size":"18px", fill: fill, stroke: fill }); - var x1 = 50; - var x2 = width; - var pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", x1, y-dy, x1+x2, y-dy, - x2, y+dy, x1, y+dy); - this.paper.pathToBack({path:pathString, stroke:"none", fill:fill, 'class': this.addClasses('staff')}); - for (var i = 1; i < width/100; i++) { - pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", i*100-dy, y-5, i*100-dy, y+5, - i*100+dy, y-5, i*100+dy, y+5); - this.paper.pathToBack({path:pathString, stroke:"none", fill:fill, 'class': this.addClasses('staff')}); - } - if (comment) - this.paper.text(comment, {x: width+70, y: y, "text-anchor": "start", "font-size":"18px", fill: fill, stroke: fill }); -}; - -Renderer.prototype.printShadedBox = function (x, y, width, height, color, opacity, comment) { - var box = this.paper.rect({ x: x, y: y, width: width, height: height, fill: color, stroke: color, "fill-opacity": opacity, "stroke-opacity": opacity }); - if (comment) - this.paper.text(comment, {x: 0, y: y+7, "text-anchor": "start", "font-size":"14px", fill: "rgba(0,0,255,.4)", stroke: "rgba(0,0,255,.4)" }); - return box; -}; - -Renderer.prototype.printVerticalLine = function (x, y1, y2) { - var dy = 0.35; - var fill = "#00aaaa"; - var pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", x - dy, y1, x - dy, y2, - x + dy, y1, x + dy, y2); - this.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': this.addClasses('staff')}); - pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", x - 20, y1, x - 20, y1+3, - x, y1, x, y1+3); - this.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': this.addClasses('staff')}); - pathString = sprintf_1("M %f %f L %f %f L %f %f L %f %f z", x + 20, y2, x + 20, y2+3, - x, y2, x, y2+3); - this.paper.pathToBack({path: pathString, stroke: "none", fill: fill, 'class': this.addClasses('staff')}); - -}; - -/** - * @private - */ -Renderer.prototype.addToRegression = function (el) { - var box; - try { - box = el.getBBox(); - } catch(e) { - box = { width: 0, height: 0 }; - } - //var str = "("+box.x+","+box.y+")["+box.width+","+box.height+"] " - var str = el.type + ' ' + box.toString() + ' '; - var attrs = []; - for (var key in el.attrs) { - if (el.attrs.hasOwnProperty(key)) { - if (key === 'class') - str = el.attrs[key] + " " + str; - else - attrs.push(key+": "+el.attrs[key]); - } - } - attrs.sort(); - str += "{ " +attrs.join(" ") + " }"; - this.regressionLines.push(str); -}; - -var abc_renderer = Renderer; - -// abc_engraver_controller.js: Controls the engraving process of an ABCJS abstract syntax tree as produced by ABCJS/parse -// Copyright (C) 2014-2018 Gregory Dyke (gregdyke at gmail dot com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -/*global Math */ - -var spacing$1 = abc_spacing; - - - -/** - * @class - * Controls the engraving process, from ABCJS Abstract Syntax Tree (ABCJS AST) to rendered score sheet - * - * Call engraveABC to run the process. This creates a graphelems ABCJS Abstract Engraving Structure (ABCJS AES) that can be accessed through this.staffgroups - * this data structure is first laid out (giving the graphelems x and y coordinates) and then drawn onto the renderer - * each ABCJS AES represents a single staffgroup - all elements that are not in a staffgroup are rendered directly by the controller - * - * elements in ABCJS AES know their "source data" in the ABCJS AST, and their "target shape" - * in the renderer for highlighting purposes - * - * @param {Object} paper div element that will wrap the SVG - * @param {Object} params all the params -- documented on github //TODO-GD move some of that documentation here - */ -var EngraverController = function(paper, params) { - params = params || {}; - this.responsive = params.responsive; - this.space = 3*spacing$1.SPACE; - this.scale = params.scale ? parseFloat(params.scale) : 0; - if (!(this.scale > 0.1)) - this.scale = undefined; - - if (params.staffwidth) { - // Note: Normally all measurements to the engraver are in POINTS. However, if a person is formatting for the - // screen and directly inputting the width, then it is more logical to have the measurement in pixels. - this.staffwidthScreen = params.staffwidth; - this.staffwidthPrint = params.staffwidth; - } else { - this.staffwidthScreen = 740; // TODO-PER: Not sure where this number comes from, but this is how it's always been. - this.staffwidthPrint = 680; // The number of pixels in 8.5", after 1cm of margin has been removed. - } - this.editable = params.editable || false; - this.listeners = []; - if (params.clickListener) - this.addSelectListener(params.clickListener); - - this.renderer=new abc_renderer(paper, params.regression, params.add_classes); - this.renderer.setPaddingOverride(params); - this.renderer.controller = this; // TODO-GD needed for highlighting - - this.reset(); -}; - -EngraverController.prototype.reset = function() { - this.selected = []; - this.ingroup = false; - this.staffgroups = []; - this.lastStaffGroupIndex = -1; - if (this.engraver) - this.engraver.reset(); - this.engraver = null; - this.renderer.reset(); -}; - -/** - * run the engraving process - * @param {ABCJS.Tune|ABCJS.Tune[]} abctunes - */ -EngraverController.prototype.engraveABC = function(abctunes, tuneNumber) { - if (abctunes[0]===undefined) { - abctunes = [abctunes]; - } - this.reset(); - - for (var i = 0; i < abctunes.length; i++) { - if (tuneNumber === undefined) - tuneNumber = i; - this.engraveTune(abctunes[i], tuneNumber); - } - if (this.renderer.doRegression) - return this.renderer.regressionLines.join("\n"); -}; - -/** - * Some of the items on the page are not scaled, so adjust them in the opposite direction of scaling to cancel out the scaling. - * @param {float} scale - */ -EngraverController.prototype.adjustNonScaledItems = function (scale) { - this.width /= scale; - this.renderer.adjustNonScaledItems(scale); -}; - -EngraverController.prototype.getMeasureWidths = function(abcTune) { - this.reset(); - - this.renderer.lineNumber = null; - - this.renderer.newTune(abcTune); - this.engraver = new abc_abstract_engraver(this.renderer, 0, { bagpipes: abcTune.formatting.bagpipes, flatbeams: abcTune.formatting.flatbeams }); - this.engraver.setStemHeight(this.renderer.spacing.stemHeight); - if (abcTune.formatting.staffwidth) { - this.width = abcTune.formatting.staffwidth * 1.33; // The width is expressed in pt; convert to px. - } else { - this.width = this.renderer.isPrint ? this.staffwidthPrint : this.staffwidthScreen; - } - - var scale = abcTune.formatting.scale ? abcTune.formatting.scale : this.scale; - if (this.responsive === "resize") // The resizing will mess with the scaling, so just don't do it explicitly. - scale = undefined; - if (scale === undefined) scale = this.renderer.isPrint ? 0.75 : 1; - this.adjustNonScaledItems(scale); - - var ret = { left: 0, measureWidths: [], height: 0, total: 0 }; - // TODO-PER: need to add the height of the title block, too. - ret.height = this.renderer.padding.top + this.renderer.spacing.music + this.renderer.padding.bottom + 24; // the 24 is the empirical value added to the bottom of all tunes. - var debug = false; - var hasPrintedTempo = false; - for(var i=0; i 0) { - var voice = abcLine.staffGroup.voices[0]; - var foundNotStaffExtra = false; - var lastXPosition = 0; - for (var k = 0; k < voice.children.length; k++) { - var child = voice.children[k]; - if (!foundNotStaffExtra && !child.isClef && !child.isKeySig) { - foundNotStaffExtra = true; - ret.left = child.x; - lastXPosition = child.x; - } - if (child.type === 'bar') { - ret.measureWidths.push(child.x - lastXPosition); - ret.total += (child.x - lastXPosition); - lastXPosition = child.x; - } - } - } - hasPrintedTempo = true; - ret.height += abcLine.staffGroup.calcHeight() * spacing$1.STEP; - } - } - return ret; -}; - -/** - * Run the engraving process on a single tune - * @param {ABCJS.Tune} abctune - */ -EngraverController.prototype.engraveTune = function (abctune, tuneNumber) { - this.renderer.lineNumber = null; - - this.renderer.newTune(abctune); - this.engraver = new abc_abstract_engraver(this.renderer, tuneNumber, { bagpipes: abctune.formatting.bagpipes, flatbeams: abctune.formatting.flatbeams }); - this.engraver.setStemHeight(this.renderer.spacing.stemHeight); - this.engraver.measureLength = abctune.getMeterFraction().num/abctune.getMeterFraction().den; - if (abctune.formatting.staffwidth) { - this.width = abctune.formatting.staffwidth * 1.33; // The width is expressed in pt; convert to px. - } else { - this.width = this.renderer.isPrint ? this.staffwidthPrint : this.staffwidthScreen; - } - - var scale = abctune.formatting.scale ? abctune.formatting.scale : this.scale; - if (this.responsive === "resize") // The resizing will mess with the scaling, so just don't do it explicitly. - scale = undefined; - if (scale === undefined) scale = this.renderer.isPrint ? 0.75 : 1; - this.adjustNonScaledItems(scale); - - // Generate the raw staff line data - var i; - var abcLine; - var hasPrintedTempo = false; - for(i=0; i maxWidth) maxWidth = abcLine.staffGroup.w; - } - } - - // Layout the beams and add the stems to the beamed notes. - for(i=0; i 0) { - spacing = (targetWidth - constSpace) / spacingUnits; - if (spacing * minSpace > 50) { - spacing = 50 / minSpace; - } - return spacing; - } - return null; -} - -/** - * Do the x-axis positioning for a single line (a group of related staffs) - * @param {ABCJS.Tune} abctune an ABCJS AST - * @param {Object} staffGroup an staffGroup - * @param {Object} formatting an formatting - * @param {boolean} isLastLine is this the last line to be printed? - * @private - */ -EngraverController.prototype.setXSpacing = function (staffGroup, formatting, isLastLine, debug) { - var newspace = this.space; - for (var it = 0; it < 8; it++) { // TODO-PER: shouldn't need multiple passes, but each pass gets it closer to the right spacing. (Only affects long lines: normal lines break out of this loop quickly.) - var ret = staffGroup.layout(newspace, this.renderer, debug); - var stretchLast = formatting.stretchlast ? formatting.stretchlast : false; - newspace = calcHorizontalSpacing(isLastLine, stretchLast, this.width+this.renderer.padding.left, staffGroup.w, newspace, ret.spacingUnits, ret.minSpace); - if (debug) - console.log("setXSpace", it, staffGroup.w, newspace, staffGroup.minspace); - if (newspace === null) break; - } - centerWholeRests(staffGroup.voices); - //this.renderer.printHorizontalLine(this.width); -}; - -/** - * Engrave a single line (a group of related staffs) - * @param {ABCJS.Tune} abctune an ABCJS AST - * @param {Object} staffGroup an staffGroup - * @private - */ -EngraverController.prototype.engraveStaffLine = function (staffGroup) { - if (this.lastStaffGroupIndex > -1) - this.renderer.addStaffPadding(this.staffgroups[this.lastStaffGroupIndex], staffGroup); - this.renderer.voiceNumber = null; - staffGroup.draw(this.renderer); - var height = staffGroup.height * spacing$1.STEP; - //this.renderer.printVerticalLine(this.width+this.renderer.padding.left, this.renderer.y, this.renderer.y+height); - this.staffgroups[this.staffgroups.length] = staffGroup; - this.lastStaffGroupIndex = this.staffgroups.length-1; - this.renderer.y += height; -}; - -/** - * Called by the Abstract Engraving Structure or any other (e.g. midi playback) to say it was selected (notehead clicked on) - * @protected - */ -EngraverController.prototype.notifySelect = function (abselem, tuneNumber, classes) { - this.clearSelection(); - if (abselem.highlight) { - this.selected = [abselem]; - abselem.highlight(); - } - var abcelem = abselem.abcelem || {}; - for (var i=0; ielStart && start=start && elems[elem].abcelem.endChar<=end) { - this.selected[this.selected.length]=elems[elem]; - elems[elem].highlight(); - } - } - } - } -}; - - -function centerWholeRests(voices) { - // whole rests are a special case: if they are by themselves in a measure, then they should be centered. - // (If they are not by themselves, that is probably a user error, but we'll just center it between the two items to either side of it.) - for (var i = 0; i < voices.length; i++) { - var voice = voices[i]; - // Look through all of the elements except for the first and last. If the whole note appears there then there isn't anything to center it between anyway. - for (var j = 1; j < voice.children.length-1; j++) { - var absElem = voice.children[j]; - if (absElem.abcelem.rest && (absElem.abcelem.rest.type === 'whole' || absElem.abcelem.rest.type === 'multimeasure')) { - var before = voice.children[j-1]; - var after = voice.children[j+1]; - var midpoint = (after.x - before.x) / 2 + before.x; - absElem.x = midpoint - absElem.w / 2; - for (var k = 0; k < absElem.children.length; k++) - absElem.children[k].x = absElem.x; - } - } - } -} - -var abc_engraver_controller = EngraverController; - -var resizeDivs = {}; -function resizeOuter() { - var width = window.innerWidth; - for (var id in resizeDivs) { - if (resizeDivs.hasOwnProperty(id)) { - var outer = resizeDivs[id]; - var ofs = outer.offsetLeft; - width -= ofs * 2; - outer.style.width = width + "px"; - } - } -} - -window.addEventListener("resize", resizeOuter); -window.addEventListener("orientationChange", resizeOuter); - -function renderOne(div, tune, params, tuneNumber) { - if (params.viewportHorizontal) { - // Create an inner div that holds the music, so that the passed in div will be the viewport. - div.innerHTML = '
'; - if (params.scrollHorizontal) { - div.style.overflowX = "auto"; - div.style.overflowY = "hidden"; - } else - div.style.overflow = "hidden"; - resizeDivs[div.id] = div; // We use a hash on the element's id so that multiple calls won't keep adding to the list. - div = div.children[0]; // The music should be rendered in the inner div. - } - else if (params.viewportVertical) { - // Create an inner div that holds the music, so that the passed in div will be the viewport. - div.innerHTML = '
'; - div.style.overflowX = "hidden"; - div.style.overflowY = "auto"; - div = div.children[0]; // The music should be rendered in the inner div. - } - else - div.innerHTML = ""; - var engraver_controller = new abc_engraver_controller(div, params); - engraver_controller.engraveABC(tune, tuneNumber); - tune.engraver = engraver_controller; - if (params.viewportVertical || params.viewportHorizontal) { - // If we added a wrapper around the div, then we need to size the wrapper, too. - var parent = div.parentNode; - parent.style.width = div.style.width; - } -} - -function renderEachLineSeparately(div, tune, params, tuneNumber) { - function initializeTuneLine(tune) { - var obj = new abc_tune(); - obj.formatting = tune.formatting; - obj.media = tune.media; - obj.version = tune.version; - obj.metaText = {}; - obj.lines = []; - return obj; - } - - // Before rendering, chop up the returned tune into an array where each element is a line. - // The first element of the array gets the title and other items that go on top, the last element - // of the array gets the extra text that goes on bottom. Each element gets any non-music info that comes before it. - var tunes = []; - var tuneLine; - for (var i = 0; i < tune.lines.length; i++) { - var line = tune.lines[i]; - if (!tuneLine) - tuneLine = initializeTuneLine(tune); - - if (i === 0) { - // These items go on top of the music - tuneLine.metaText.tempo = tune.metaText.tempo; - tuneLine.metaText.title = tune.metaText.title; - tuneLine.metaText.header = tune.metaText.header; - tuneLine.metaText.rhythm = tune.metaText.rhythm; - tuneLine.metaText.origin = tune.metaText.origin; - tuneLine.metaText.composer = tune.metaText.composer; - tuneLine.metaText.author = tune.metaText.author; - tuneLine.metaText.partOrder = tune.metaText.partOrder; - } - - // push the lines until we get to a music line - tuneLine.lines.push(line); - if (line.staff) { - tunes.push(tuneLine); - tuneLine = undefined; - } - } - // Add any extra stuff to the last line. - if (tuneLine) { - var lastLine = tunes[tunes.length-1]; - for (var j = 0; j < tuneLine.lines.length; j++) - lastLine.lines.push(tuneLine.lines[j]); - } - - // These items go below the music - tuneLine = tunes[tunes.length-1]; - tuneLine.metaText.unalignedWords = tune.metaText.unalignedWords; - tuneLine.metaText.book = tune.metaText.book; - tuneLine.metaText.source = tune.metaText.source; - tuneLine.metaText.discography = tune.metaText.discography; - tuneLine.metaText.notes = tune.metaText.notes; - tuneLine.metaText.transcription = tune.metaText.transcription; - tuneLine.metaText.history = tune.metaText.history; - tuneLine.metaText['abc-copyright'] = tune.metaText['abc-copyright']; - tuneLine.metaText['abc-creator'] = tune.metaText['abc-creator']; - tuneLine.metaText['abc-edited-by'] = tune.metaText['abc-edited-by']; - tuneLine.metaText.footer = tune.metaText.footer; - - // Now create sub-divs and render each line. Need to copy the params to change the padding for the interior slices. - var ep = {}; - for (var key in params) { - if (params.hasOwnProperty(key)) { - ep[key] = params[key]; - } - } - var origPaddingTop = ep.paddingtop; - var origPaddingBottom = ep.paddingbottom; - div.innerHTML = ""; - for (var k = 0; k < tunes.length; k++) { - var lineEl = document.createElement("div"); - div.appendChild(lineEl); - - if (k === 0) { - ep.paddingtop = origPaddingTop; - ep.paddingbottom = -20; - } else if (k === tunes.length-1) { - ep.paddingtop = 10; - ep.paddingbottom = origPaddingBottom; - } else { - ep.paddingtop = 10; - ep.paddingbottom = -20; - } - renderOne(lineEl, tunes[k], ep, tuneNumber); - if (k === 0) - tune.engraver = tunes[k].engraver; - else { - if (!tune.engraver.staffgroups) - tune.engraver.staffgroups = tunes[k].engraver.staffgroups; - else if (tunes[k].engraver.staffgroups.length > 0) - tune.engraver.staffgroups.push(tunes[k].engraver.staffgroups[0]); - } - } -} - -// A quick way to render a tune from javascript when interactivity is not required. -// This is used when a javascript routine has some abc text that it wants to render -// in a div or collection of divs. One tune or many can be rendered. -// -// parameters: -// output: an array of divs that the individual tunes are rendered to. -// If the number of tunes exceeds the number of divs in the array, then -// only the first tunes are rendered. If the number of divs exceeds the number -// of tunes, then the unused divs are cleared. The divs can be passed as either -// elements or strings of ids. If ids are passed, then the div MUST exist already. -// (if a single element is passed, then it is an implied array of length one.) -// (if a null is passed for an element, or the element doesn't exist, then that tune is skipped.) -// abc: text representing a tune or an entire tune book in ABC notation. -// renderParams: hash of: -// startingTune: an index, starting at zero, representing which tune to start rendering at. -// (If this element is not present, then rendering starts at zero.) -// width: 800 by default. The width in pixels of the output paper -var renderAbc = function(output, abc, parserParams, engraverParams, renderParams) { - // Note: all parameters have been condensed into the first ones. It doesn't hurt anything to allow the old format, so just copy them here. - var params = {}; - var key; - if (parserParams) { - for (key in parserParams) { - if (parserParams.hasOwnProperty(key)) { - params[key] = parserParams[key]; - } - } - } - if (engraverParams) { - for (key in engraverParams) { - if (engraverParams.hasOwnProperty(key)) { - // There is a conflict with the name of the parameter "listener". If it is in the second parameter, then it is for click. - if (key === "listener") { - if (engraverParams[key].highlight) - params.clickListener = engraverParams[key].highlight; - } else - params[key] = engraverParams[key]; - } - } - } - if (renderParams) { - for (key in renderParams) { - if (renderParams.hasOwnProperty(key)) { - params[key] = renderParams[key]; - } - } - } - - function callback(div, tune, tuneNumber, abcString) { - var removeDiv = false; - if (div === "*") { - removeDiv = true; - div = document.createElement("div"); - div.setAttribute("style", "display:none;"); - document.body.appendChild(div); - } - if (params.afterParsing) - params.afterParsing(tune, tuneNumber, abcString); - if (!removeDiv && params.wrap && params.staffwidth) { - tune = doLineWrapping(div, tune, tuneNumber, abcString, params); - return tune; - } - else if (removeDiv || !params.oneSvgPerLine || tune.lines.length < 2) - renderOne(div, tune, params, tuneNumber); - else - renderEachLineSeparately(div, tune, params, tuneNumber); - if (removeDiv) - div.parentNode.removeChild(div); - return null; - } - - return abc_tunebook.renderEngine(callback, output, abc, params); -}; - -function doLineWrapping(div, tune, tuneNumber, abcString, params) { - var engraver_controller = new abc_engraver_controller(div, params); - var widths = engraver_controller.getMeasureWidths(tune); - - var ret = wrap_lines.calcLineWraps(tune, widths, abcString, params, abc_parse, engraver_controller); - if (!params.oneSvgPerLine || ret.tune.lines.length < 2) - renderOne(div, ret.tune, ret.revisedParams, tuneNumber); - else - renderEachLineSeparately(div, ret.tune, ret.revisedParams, tuneNumber); - ret.tune.explanation = ret.explanation; - return ret.tune; -} - -var abc_tunebook_svg = renderAbc; - -var soundsCache = { -}; - -var soundsCache_1 = soundsCache; - -// Load one mp3 file for one note. -// url = the base url for the soundfont -// instrument = the instrument name (e.g. "acoustic_grand_piano") -// name = the pitch name (e.g. "A3") - - -var getNote = function(url, instrument, name, audioContext) { - return new Promise(function (resolve, reject) { - if (!soundsCache_1[instrument]) - soundsCache_1[instrument] = {}; - var instrumentCache = soundsCache_1[instrument]; - - if (instrumentCache[name] === 'error') { - return reject(new Error("Unable to load sound font" + ' ' + url + ' ' + instrument + ' ' + name)); - } - if (instrumentCache[name]) { - return resolve({instrument: instrument, name: name}); - } - - // if (this.debugCallback) - // this.debugCallback(`Loading sound: ${instrument} ${name}`); - instrumentCache[name] = "pending"; // This can be called in parallel, so don't call it a second time before the first one has loaded. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url+instrument+'-mp3/'+name+'.mp3', true); - xhr.responseType = 'arraybuffer'; - - var self = this; - function onSuccess(audioBuffer) { - instrumentCache[name] = audioBuffer; - // if (self.debugCallback) - // self.debugCallback(`Sound loaded: ${instrument} ${name} ${url}`); - resolve({instrument: instrument, name: name}); - } - - function onFailure(error) { - if (self.debugCallback) - self.debugCallback(error); - console.log(error); - reject(error); - } - - xhr.onload = function (e) { - if (this.status === 200) { - audioContext.decodeAudioData(this.response, onSuccess, onFailure);//.then(function() { - // return resolve({instrument: instrument, name: name}); - // }).catch(function(error) { - // return reject(new Error(cantLoadMp3 + error)); - // }); - } else { - instrumentCache[name] = "error"; // To keep this from trying to load repeatedly. - var cantLoadMp3 = "Onload error loading sound: " + name + " " + url + " " + e.currentTarget.status + " " + e.currentTarget.statusText; - if (self.debugCallback) - self.debugCallback(cantLoadMp3); - return reject(new Error(cantLoadMp3)); - } - }; - xhr.addEventListener("error", function () { - instrumentCache[name] = "error"; // To keep this from trying to load repeatedly. - var cantLoadMp3 = "Error in loading sound: " + " " + url; - if (self.debugCallback) - self.debugCallback(cantLoadMp3); - return reject(new Error(cantLoadMp3)); - }, false); - xhr.send(); - }); -}; - -var loadNote = getNote; - -var instrumentIndexToName = [ - "acoustic_grand_piano", - "bright_acoustic_piano", - "electric_grand_piano", - "honkytonk_piano", - "electric_piano_1", - "electric_piano_2", - "harpsichord", - "clavinet", - - "celesta", - "glockenspiel", - "music_box", - "vibraphone", - "marimba", - "xylophone", - "tubular_bells", - "dulcimer", - - "drawbar_organ", - "percussive_organ", - "rock_organ", - "church_organ", - "reed_organ", - "accordion", - "harmonica", - "tango_accordion", - - "acoustic_guitar_nylon", - "acoustic_guitar_steel", - "electric_guitar_jazz", - "electric_guitar_clean", - "electric_guitar_muted", - "overdriven_guitar", - "distortion_guitar", - "guitar_harmonics", - - "acoustic_bass", - "electric_bass_finger", - "electric_bass_pick", - "fretless_bass", - "slap_bass_1", - "slap_bass_2", - "synth_bass_1", - "synth_bass_2", - - "violin", - "viola", - "cello", - "contrabass", - "tremolo_strings", - "pizzicato_strings", - "orchestral_harp", - "timpani", - - "string_ensemble_1", - "string_ensemble_2", - "synth_strings_1", - "synth_strings_2", - "choir_aahs", - "voice_oohs", - "synth_choir", - "orchestra_hit", - - "trumpet", - "trombone", - "tuba", - "muted_trumpet", - "french_horn", - "brass_section", - "synth_brass_1", - "synth_brass_2", - - "soprano_sax", - "alto_sax", - "tenor_sax", - "baritone_sax", - "oboe", - "english_horn", - "bassoon", - "clarinet", - - "piccolo", - "flute", - "recorder", - "pan_flute", - "blown_bottle", - "shakuhachi", - "whistle", - "ocarina", - - "lead_1_square", - "lead_2_sawtooth", - "lead_3_calliope", - "lead_4_chiff", - "lead_5_charang", - "lead_6_voice", - "lead_7_fifths", - "lead_8_bass__lead", - - "pad_1_new_age", - "pad_2_warm", - "pad_3_polysynth", - "pad_4_choir", - "pad_5_bowed", - "pad_6_metallic", - "pad_7_halo", - "pad_8_sweep", - - "fx_1_rain", - "fx_2_soundtrack", - "fx_3_crystal", - "fx_4_atmosphere", - "fx_5_brightness", - "fx_6_goblins", - "fx_7_echoes", - "fx_8_scifi", - - "sitar", - "banjo", - "shamisen", - "koto", - "kalimba", - "bagpipe", - "fiddle", - "shanai", - - "tinkle_bell", - "agogo", - "steel_drums", - "woodblock", - "taiko_drum", - "melodic_tom", - "synth_drum", - "reverse_cymbal", - - "guitar_fret_noise", - "breath_noise", - "seashore", - "bird_tweet", - "telephone_ring", - "helicopter", - "applause", - "gunshot", - - "percussion" -]; - -var instrumentIndexToName_1 = instrumentIndexToName; - -// Convert the input structure to a more useful structure where each item has a length of its own. - - - -var createNoteMap = function(sequence) { - var map = []; - for (var i = 0; i < sequence.tracks.length; i++) - map.push([]); - - // TODO-PER: handle more than one note in a track - var nextNote = {}; - var currentInstrument = instrumentIndexToName_1[0]; - sequence.tracks.forEach(function(track, i) { - var currentTime = 0; - track.forEach(function(ev) { - switch (ev.cmd) { - case "start": - nextNote[ev.pitch] = { time: currentTime, instrument: currentInstrument, volume: ev.volume }; - break; - case "move": - currentTime += ev.duration; - break; - case "stop": - map[i].push({pitch: ev.pitch, instrument: nextNote[ev.pitch].instrument, start: nextNote[ev.pitch].time, end: currentTime, volume: nextNote[ev.pitch].volume}); - delete nextNote[ev.pitch]; - break; - case "program": - currentInstrument = instrumentIndexToName_1[ev.instrument]; - break; - default: - // TODO-PER: handle other event types - console.log("Unhanded midi event", ev); - } - }); - }); - return map; -}; - -var createNoteMap_1 = createNoteMap; - -// Call this when it is safe for the abcjs to produce sound. This is after the first user gesture on the page. -// If you call it with no parameters, then an AudioContext is created and stored. -// If you call it with a parameter, that is used as an already created AudioContext. - -function registerAudioContext(ac) { - if (!window.abcjsAudioContext) { - if (!ac) { - ac = window.AudioContext || - window.webkitAudioContext || - navigator.mozAudioContext || - navigator.msAudioContext; - ac = new ac(); - } - window.abcjsAudioContext = ac; - } - return window.abcjsAudioContext.state !== "suspended"; -} - -var registerAudioContext_1 = registerAudioContext; - -function activeAudioContext() { - return window.abcjsAudioContext; -} - -var activeAudioContext_1 = activeAudioContext; - -// -// Support for audio depends on three things: support for Promise, support for AudioContext, and support for AudioContext.resume. -// Unfortunately, AudioContext.resume cannot be detected unless an AudioContext is created, and creating an AudioContext can't -// be done until a user click, so there is no way to know for sure if audio is supported until the user tries. -// We can get close, though - we can test for Promises and AudioContext - there are just a few evergreen browsers that supported -// that before supporting resume, so we'll test what we can. - -// The best use of this routine is to call it before doing any audio related stuff to decide whether to bother. -// But then, call it again after a user interaction to test for resume. - -function supportsAudio() { - var aac = activeAudioContext_1(); - if (aac) - return aac.resume !== undefined; - - if (!window.Promise) - return false; - - return window.AudioContext || - window.webkitAudioContext || - navigator.mozAudioContext || - navigator.msAudioContext; -} - -var supportsAudio_1 = supportsAudio; - -var pitchToNoteName = { - 21: 'A0', - 22: 'Bb0', - 23: 'B0', - 24: 'C1', - 25: 'Db1', - 26: 'D1', - 27: 'Eb1', - 28: 'E1', - 29: 'F1', - 30: 'Gb1', - 31: 'G1', - 32: 'Ab1', - 33: 'A1', - 34: 'Bb1', - 35: 'B1', - 36: 'C2', - 37: 'Db2', - 38: 'D2', - 39: 'Eb2', - 40: 'E2', - 41: 'F2', - 42: 'Gb2', - 43: 'G2', - 44: 'Ab2', - 45: 'A2', - 46: 'Bb2', - 47: 'B2', - 48: 'C3', - 49: 'Db3', - 50: 'D3', - 51: 'Eb3', - 52: 'E3', - 53: 'F3', - 54: 'Gb3', - 55: 'G3', - 56: 'Ab3', - 57: 'A3', - 58: 'Bb3', - 59: 'B3', - 60: 'C4', - 61: 'Db4', - 62: 'D4', - 63: 'Eb4', - 64: 'E4', - 65: 'F4', - 66: 'Gb4', - 67: 'G4', - 68: 'Ab4', - 69: 'A4', - 70: 'Bb4', - 71: 'B4', - 72: 'C5', - 73: 'Db5', - 74: 'D5', - 75: 'Eb5', - 76: 'E5', - 77: 'F5', - 78: 'Gb5', - 79: 'G5', - 80: 'Ab5', - 81: 'A5', - 82: 'Bb5', - 83: 'B5', - 84: 'C6', - 85: 'Db6', - 86: 'D6', - 87: 'Eb6', - 88: 'E6', - 89: 'F6', - 90: 'Gb6', - 91: 'G6', - 92: 'Ab6', - 93: 'A6', - 94: 'Bb6', - 95: 'B6', - 96: 'C7', - 97: 'Db7', - 98: 'D7', - 99: 'Eb7', - 100: 'E7', - 101: 'F7', - 102: 'Gb7', - 103: 'G7', - 104: 'Ab7', - 105: 'A7', - 106: 'Bb7', - 107: 'B7', - 108: 'C8', - 109: 'Db8', - 110: 'D8', - 111: 'Eb8', - 112: 'E8', - 113: 'F8', - 114: 'Gb8', - 115: 'G8', - 116: 'Ab8', - 117: 'A8', - 118: 'Bb8', - 119: 'B8', - 120: 'C9', - 121: 'Db9' -}; - -var pitchToNoteName_1 = pitchToNoteName; - -var downloadBuffer = function(buffer) { - return window.URL.createObjectURL(bufferToWave(buffer.audioBuffers)); -}; - -// Convert an AudioBuffer to a Blob using WAVE representation -function bufferToWave(audioBuffers) { - var numOfChan = audioBuffers.length; - var length = audioBuffers[0].length * numOfChan * 2 + 44; - var buffer = new ArrayBuffer(length); - var view = new DataView(buffer); - var channels = []; - var i; - var sample; - var offset = 0; - var pos = 0; - - // write WAVE header - setUint32(0x46464952); // "RIFF" - setUint32(length - 8); // file length - 8 - setUint32(0x45564157); // "WAVE" - - setUint32(0x20746d66); // "fmt " chunk - setUint32(16); // length = 16 - setUint16(1); // PCM (uncompressed) - setUint16(numOfChan); - setUint32(audioBuffers[0].sampleRate); - setUint32(audioBuffers[0].sampleRate * 2 * numOfChan); // avg. bytes/sec - setUint16(numOfChan * 2); // block-align - setUint16(16); // 16-bit (hardcoded in this demo) - - setUint32(0x61746164); // "data" - chunk - setUint32(length - pos - 4); // chunk length - - // write interleaved data - for(i = 0; i < audioBuffers.length; i++) - channels.push(audioBuffers[i].getChannelData(0)); - - while(pos < length) { - for(i = 0; i < channels.length; i++) { // interleave channels - sample = Math.max(-1, Math.min(1, channels[i][offset])); // clamp - sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767)|0; // scale to 16-bit signed int - view.setInt16(pos, sample, true); // write 16-bit sample - pos += 2; - } - offset++; // next source sample - } - - // create Blob - return new Blob([buffer], {type: "audio/wav"}); - - function setUint16(data) { - view.setUint16(pos, data, true); - pos += 2; - } - - function setUint32(data) { - view.setUint32(pos, data, true); - pos += 4; - } -} - -var downloadBuffer_1 = downloadBuffer; - -// abc_midi_sequencer.js: Turn parsed abc into a linear series of events. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var sequence; - -(function() { - - var measureLength; - // The abc is provided to us line by line. It might have repeats in it. We want to re arrange the elements to - // be an array of voices with all the repeats embedded, and no lines. Then it is trivial to go through the events - // one at a time and turn it into midi. - - var PERCUSSION_PROGRAM = 128; - - sequence = function(abctune, options) { - // Global options - options = options || {}; - var qpm = undefined; - var program = options.program || 0; // The program if there isn't a program specified. - var transpose = options.midiTranspose || 0; - var channel = options.channel || 0; - var drumPattern = options.drum || ""; - var drumBars = options.drumBars || 1; - var drumIntro = options.drumIntro || 0; - var drumOn = drumPattern !== ""; - - // All of the above overrides need to be integers - program = parseInt(program, 10); - transpose = parseInt(transpose, 10); - channel = parseInt(channel, 10); - if (channel === 10) - program = PERCUSSION_PROGRAM; - drumPattern = drumPattern.split(" "); - drumBars = parseInt(drumBars, 10); - drumIntro = parseInt(drumIntro, 10); - - var bagpipes = abctune.formatting.bagpipes; // If it is bagpipes, then the gracenotes are played on top of the main note. - if (bagpipes) - program = 71; - - // %%MIDI fermatafixed - // %%MIDI fermataproportional - // %%MIDI deltaloudness n - // %%MIDI gracedivider b - // %%MIDI ratio n m - // %%MIDI beat a b c n - // %%MIDI grace a/b - // %%MIDI trim x/y - - // %MIDI gchordon - // %MIDI gchordoff - // %%MIDI bassprog 45 - // %%MIDI chordprog 24 - // %%MIDI chordname name n1 n2 n3 n4 n5 n6 - - //%%MIDI beat ⟨int1⟩ ⟨int2⟩ ⟨int3⟩ ⟨int4⟩: controls the volumes of the notes in a measure. The first note in a bar has volume ⟨int1⟩; other ‘strong’ notes have volume ⟨int2⟩ and all the rest have volume ⟨int3⟩. These values must be in the range 0–127. The parameter ⟨int4⟩ determines which notes are ‘strong’. If the time signature is x/y, then each note is given a position number k = 0, 1, 2. . . x-1 within each bar. If k is a multiple of ⟨int4⟩, then the note is ‘strong’. - - var startingMidi = []; - if (abctune.formatting.midi) { - //console.log("MIDI Formatting:", abctune.formatting.midi); - var globals = abctune.formatting.midi; - if (globals.program && globals.program.length > 0) { - program = globals.program[0]; - if (globals.program.length > 1) { - program = globals.program[1]; - channel = globals.program[0]; - } - } - if (globals.transpose) - transpose = globals.transpose[0]; - if (globals.channel) - channel = globals.channel[0]; - if (globals.drum) - drumPattern = globals.drum; - if (globals.drumbars) - drumBars = globals.drumbars[0]; - if (globals.drumon) - drumOn = true; - if (channel === 10) - program = PERCUSSION_PROGRAM; - if (globals.beat) - startingMidi.push({ el_type: 'beat', beats: globals.beat }); - if (globals.nobeataccents) - startingMidi.push({ el_type: 'beataccents', value: false }); - - } - - // Specified options in abc string. - - // If the tempo was passed in, use that. - // If the tempo is specified, use that. - // If there is a default, use that. - // Otherwise, use the default. - if (options.qpm) - qpm = parseInt(options.qpm, 10); - else if (abctune.metaText.tempo) - qpm = interpretTempo(abctune.metaText.tempo); - else if (options.defaultQpm) - qpm = options.defaultQpm; - else - qpm = 180; // The tempo if there isn't a tempo specified. - - var startVoice = []; - if (bagpipes) - startVoice.push({ el_type: 'bagpipes' }); - startVoice.push({ el_type: 'instrument', program: program }); - if (channel) - startVoice.push({ el_type: 'channel', channel: channel }); - if (transpose) - startVoice.push({ el_type: 'transpose', transpose: transpose }); - startVoice.push({ el_type: 'tempo', qpm: qpm }); - for (var ss = 0; ss < startingMidi.length;ss++) - startVoice.push(startingMidi[ss]); - - // the relevant part of the input structure is: - // abctune - // array lines - // array staff - // object key - // object meter - // array voices - // array abcelem - - // visit each voice completely in turn - var voices = []; - var startRepeatPlaceholder = []; // There is a place holder for each voice. - var skipEndingPlaceholder = []; // This is the place where the first ending starts. - var startingDrumSet = false; - for (var i = 0; i < abctune.lines.length; i++) { - // For each group of staff lines in the tune. - var line = abctune.lines[i]; - if (line.staff) { - var staves = line.staff; - var voiceNumber = 0; - for (var j = 0; j < staves.length; j++) { - var staff = staves[j]; - // For each staff line - for (var k = 0; k < staff.voices.length; k++) { - // For each voice in a staff line - var voice = staff.voices[k]; - if (!voices[voiceNumber]) { - voices[voiceNumber] = [].concat(JSON.parse(JSON.stringify(startVoice))); - } - if (staff.clef && staff.clef.type === 'perc') { - for (var cl = 0; cl < voices[voiceNumber].length; cl++) { - if (voices[voiceNumber][cl].el_type === 'instrument') - voices[voiceNumber][cl].program = PERCUSSION_PROGRAM; - } - } else if (staff.key) { - if (staff.key.root === 'HP') - voices[voiceNumber].push({el_type: 'key', accidentals: [{acc: 'natural', note: 'g'}, {acc: 'sharp', note: 'f'}, {acc: 'sharp', note: 'c'}]}); - else - voices[voiceNumber].push({el_type: 'key', accidentals: staff.key.accidentals }); - } - if (staff.meter) { - voices[voiceNumber].push(interpretMeter(staff.meter)); - } - if (!startingDrumSet && drumOn) { // drum information is only needed once, so use the first line and track 0. - voices[voiceNumber].push({el_type: 'drum', params: {pattern: drumPattern, bars: drumBars, on: drumOn, intro: drumIntro}}); - startingDrumSet = true; - } - if (staff.clef && staff.clef.transpose) { - staff.clef.el_type = 'clef'; - voices[voiceNumber].push({ el_type: 'transpose', transpose: staff.clef.transpose }); - } - if (abctune.formatting.midi && abctune.formatting.midi.drumoff) { - // If there is a drum off command right at the beginning it is put in the metaText instead of the stream, - // so we will just insert it here. - voices[voiceNumber].push({ el_type: 'bar' }); - voices[voiceNumber].push({el_type: 'drum', params: {pattern: "", on: false }}); - } - var noteEventsInBar = 0; - for (var v = 0; v < voice.length; v++) { - // For each element in a voice - var elem = voice[v]; - switch (elem.el_type) { - case "note": - // regular items are just pushed. - if (!elem.rest || elem.rest.type !== 'spacer') { - if (elem.decoration) { - if (elem.decoration.indexOf('ppp') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [30, 20, 10, 1] }); - else if (elem.decoration.indexOf('pp') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [45, 35, 20, 1] }); - else if (elem.decoration.indexOf('p') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [60, 50, 35, 1] }); - else if (elem.decoration.indexOf('mp') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [75, 65, 50, 1] }); - else if (elem.decoration.indexOf('mf') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [90, 80, 65, 1] }); - else if (elem.decoration.indexOf('f') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [105, 95, 80, 1] }); - else if (elem.decoration.indexOf('ff') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [120, 110, 95, 1] }); - else if (elem.decoration.indexOf('fff') >= 0) - voices[voiceNumber].push({ el_type: 'beat', beats: [127, 125, 110, 1] }); - } - voices[voiceNumber].push(elem); - noteEventsInBar++; - } - break; - case "key": - if (elem.root === 'HP') - voices[voiceNumber].push({el_type: 'key', accidentals: [{acc: 'natural', note: 'g'}, {acc: 'sharp', note: 'f'}, {acc: 'sharp', note: 'c'}]}); - else - voices[voiceNumber].push({el_type: 'key', accidentals: elem.accidentals }); - break; - case "meter": - voices[voiceNumber].push(interpretMeter(elem)); - break; - case "clef": // need to keep this to catch the "transpose" element. - if (elem.transpose) - voices[voiceNumber].push({ el_type: 'transpose', transpose: elem.transpose }); - break; - case "tempo": - qpm = interpretTempo(elem); - voices[voiceNumber].push({ el_type: 'tempo', qpm: qpm }); - break; - case "bar": - if (noteEventsInBar > 0) // don't add two bars in a row. - voices[voiceNumber].push({ el_type: 'bar' }); // We need the bar marking to reset the accidentals. - noteEventsInBar = 0; - // figure out repeats and endings -- - // The important part is where there is a start repeat, and end repeat, or a first ending. - var endRepeat = (elem.type === "bar_right_repeat" || elem.type === "bar_dbl_repeat"); - var startEnding = (elem.startEnding === '1'); - var startRepeat = (elem.type === "bar_left_repeat" || elem.type === "bar_dbl_repeat" || elem.type === "bar_right_repeat"); - if (endRepeat) { - var s = startRepeatPlaceholder[voiceNumber]; - if (!s) s = 0; // If there wasn't a left repeat, then we repeat from the beginning. - var e = skipEndingPlaceholder[voiceNumber]; - if (!e) e = voices[voiceNumber].length; // If there wasn't a first ending marker, then we copy everything. - voices[voiceNumber] = voices[voiceNumber].concat(voices[voiceNumber].slice(s, e)); - // reset these in case there is a second repeat later on. - skipEndingPlaceholder[voiceNumber] = undefined; - startRepeatPlaceholder[voiceNumber] = undefined; - } - if (startEnding) - skipEndingPlaceholder[voiceNumber] = voices[voiceNumber].length; - if (startRepeat) - startRepeatPlaceholder[voiceNumber] = voices[voiceNumber].length; - break; - case 'style': - // TODO-PER: If this is set to rhythm heads, then it should use the percussion channel. - break; - case 'part': - // TODO-PER: If there is a part section in the header, then this should probably affect the repeats. - break; - case 'stem': - case 'scale': - // These elements don't affect sound - break; - case 'midi': - //console.log("MIDI inline", elem); // TODO-PER: for debugging. Remove this. - var drumChange = false; - switch (elem.cmd) { - case "drumon": drumOn = true; drumChange = true; break; - case "drumoff": drumOn = false; drumChange = true; break; - case "drum": drumPattern = elem.params; drumChange = true; break; - case "drumbars": drumBars = elem.params[0]; drumChange = true; break; - case "drummap": - // This is handled before getting here so it can be ignored. - break; - case "program": - voices[voiceNumber].push({ el_type: 'instrument', program: elem.params[0] }); - break; - case "transpose": - voices[voiceNumber].push({ el_type: 'transpose', transpose: elem.params[0] }); - break; - case "gchordoff": - voices[voiceNumber].push({ el_type: 'gchord', tacet: true }); - break; - case "gchordon": - voices[voiceNumber].push({ el_type: 'gchord', tacet: false }); - break; - case "beat": - voices[voiceNumber].push({ el_type: 'beat', beats: elem.params }); - break; - case "nobeataccents": - voices[voiceNumber].push({ el_type: 'beataccents', value: false }); - break; - case "beataccents": - voices[voiceNumber].push({ el_type: 'beataccents', value: true }); - break; - case "vol": - voices[voiceNumber].push({ el_type: 'vol', volume: elem.params[0] }); - break; - case "volinc": - voices[voiceNumber].push({ el_type: 'volinc', volume: elem.params[0] }); - break; - default: - console.log("MIDI seq: midi cmd not handled: ", elem.cmd, elem); - } - if (drumChange) { - voices[0].push({el_type: 'drum', params: { pattern: drumPattern, bars: drumBars, intro: drumIntro, on: drumOn}}); - startingDrumSet = true; - } - break; - default: - console.log("MIDI: element type " + elem.el_type + " not handled."); - } - } - voiceNumber++; - } - } - } - } - if (drumIntro) { - var pickups = abctune.getPickupLength(); - // add some measures of rests to the start of each track. - for (var vv = 0; vv < voices.length; vv++) { - var insertPoint = 0; - while (voices[vv][insertPoint].el_type !== "note" && voices[vv].length > insertPoint) - insertPoint++; - if (voices[vv].length > insertPoint) { - for (var w = 0; w < drumIntro; w++) { - // If it is the last measure of intro, subtract the pickups. - if (pickups === 0 || w < drumIntro-1) - voices[vv].splice(insertPoint, 0, {el_type: "note", rest: {type: "rest"}, duration: measureLength}, - { el_type: "bar" }); - else { - voices[vv].splice(insertPoint, 0, {el_type: "note", rest: {type: "rest"}, duration: measureLength-pickups}); - } - } - } - } - } - return voices; - }; - - function interpretTempo(element) { - var duration = 1/4; - if (element.duration) { - duration = element.duration[0]; - } - var bpm = 60; - if (element.bpm) { - bpm = element.bpm; - } - // The tempo is defined with a beat of a 1/4 note, so we need to adjust it if the tempo is expressed with other than a quarter note. - // expressedDuration * expressedBeatsPerMinute / lengthOfQuarterNote = quarterNotesPerMinute - return duration * bpm / 0.25; - } - - function interpretMeter(element) { - var meter; - switch (element.type) { - case "common_time": - meter = { el_type: 'meter', num: 4, den: 4 }; - break; - case "cut_time": - meter = { el_type: 'meter', num: 2, den: 2 }; - break; - case "specified": - // TODO-PER: only taking the first meter, so the complex meters are not handled. - meter = { el_type: 'meter', num: element.value[0].num, den: element.value[0].den }; - break; - default: - // This should never happen. - meter = { el_type: 'meter' }; - } - measureLength = meter.num/meter.den; - return meter; - } -})(); - -var abc_midi_sequencer = sequence; - -// abc_midi_flattener.js: Turn a linear series of events into a series of MIDI commands. -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) and Paul Rosen -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -// We input a set of voices, but the notes are still complex. This pass changes the logical definitions -// of the grace notes, decorations, ties, triplets, rests, transpositions, keys, and accidentals into actual note durations. -// It also extracts guitar chords to a separate voice and resolves their rhythm. - -var flatten; - -(function() { - - var barAccidentals; - var accidentals; - var transpose; - var bagpipes; - var multiplier; - var tracks; - var startingTempo; - var tempoChangeFactor = 1; - var instrument; - var currentInstrument; - // var channel; - var currentTrack; - var pitchesTied; - var lastNoteDurationPosition; - var currentTrackCounter; - - var meter = { num: 4, den: 4 }; - var chordTrack; - var chordTrackFinished; - var chordChannel; - var chordInstrument = 0; - var drumInstrument = 128; - var currentChords; - var lastChord; - var barBeat; - var gChordTacet = false; - var doBeatAccents = true; - var stressBeat1 = 105; - var stressBeatDown = 95; - var stressBeatUp = 85; - var beatFraction = 0.25; - var nextVolume; - var nextVolumeDelta; - - var drumTrack; - var drumDefinition = {}; - - var normalBreakBetweenNotes = 1.0/128; // a 128th note of silence between notes for articulation. - - flatten = function(voices, options) { - if (!options) options = {}; - barAccidentals = []; - accidentals = [0,0,0,0,0,0,0]; - bagpipes = false; - multiplier = 1; - tracks = []; - startingTempo = undefined; - tempoChangeFactor = 1; - instrument = undefined; - currentInstrument = undefined; - // channel = undefined; - currentTrack = undefined; - currentTrackCounter = undefined; - pitchesTied = {}; - - // For resolving chords. - meter = { num: 4, den: 4 }; - chordTrack = []; - chordChannel = voices.length; // first free channel for chords - chordTrackFinished = false; - currentChords = []; - lastChord = undefined; - barBeat = 0; - gChordTacet = options.chordsOff ? true : false; - - doBeatAccents = true; - stressBeat1 = 105; - stressBeatDown = 95; - stressBeatUp = 85; - beatFraction = 0.25; - nextVolume = undefined; - nextVolumeDelta = undefined; - - // For the drum/metronome track. - drumTrack = []; - drumDefinition = {}; - - zeroOutMilliseconds(voices); - - for (var i = 0; i < voices.length; i++) { - transpose = 0; - lastNoteDurationPosition = -1; - var voice = voices[i]; - currentTrack = [{ cmd: 'program', channel: i, instrument: instrument }]; - currentTrackCounter = 0; - pitchesTied = {}; - for (var j = 0; j < voice.length; j++) { - var element = voice[j]; - switch (element.el_type) { - case "note": - writeNote(element, options.voicesOff); - break; - case "key": - accidentals = setKeySignature(element); - break; - case "meter": - meter = element; - beatFraction = getBeatFraction(meter); - break; - case "tempo": - if (!startingTempo) - startingTempo = element.qpm; - else - tempoChangeFactor = element.qpm ? startingTempo / element.qpm : 1; - break; - case "transpose": - transpose = element.transpose; - break; - case "bar": - if (chordTrack.length > 0 && i === 0) { - resolveChords(); - currentChords = []; - } - barBeat = 0; - barAccidentals = []; - if (i === 0) // Only write the drum part on the first voice so that it is not duplicated. - writeDrum(voices.length+1); - break; - case "bagpipes": - bagpipes = true; - break; - case "instrument": - if (instrument === undefined) - instrument = element.program; - currentInstrument = element.program; - if (currentTrack.length > 0 && currentTrack[currentTrack.length-1].cmd === 'program') - currentTrack[currentTrack.length-1].instrument = element.program; - else { - var ii; - for (ii = currentTrack.length-1; ii >= 0 && currentTrack[ii].cmd !== 'program'; ii--) - ; - if (ii < 0 || currentTrack[ii].instrument !== element.program) - currentTrack.push({cmd: 'program', channel: i, instrument: element.program}); - } - break; - case "channel": - // if (channel === undefined) - // channel = element.channel; - // currentTrack[0].channel = element.channel; - break; - case "drum": - drumDefinition = normalizeDrumDefinition(element.params); - break; - case "gchord": - if (!options.chordsOff) - gChordTacet = element.tacet; - break; - case "beat": - stressBeat1 = element.beats[0]; - stressBeatDown = element.beats[1]; - stressBeatUp = element.beats[2]; - // TODO-PER: also use the last parameter - which changes which beats are strong. - break; - case "vol": - nextVolume = element.volume; - break; - case "volinc": - nextVolumeDelta = element.volume; - break; - case "beataccents": - doBeatAccents = element.value; - break; - default: - // This should never happen - console.log("MIDI creation. Unknown el_type: " + element.el_type + "\n");// jshint ignore:line - break; - } - } - if (currentTrack[0].instrument === undefined) - currentTrack[0].instrument = instrument ? instrument : 0; - tracks.push(currentTrack); - if (chordTrack.length > 0) // Don't do chords on more than one track, so turn off chord detection after we create it. - chordTrackFinished = true; - if (drumTrack.length > 0) // Don't do drums on more than one track, so turn off drum after we create it. - ; - } - if (chordTrack.length > 0) - tracks.push(chordTrack); - if (drumTrack.length > 0) - tracks.push(drumTrack); - // Adjust the tempo according to the meter. The rules are this: - // 1) If the denominator is 2 or 4, then always make a beat be the denominator. - // - // 2) If the denominator is 8 or 16, then: - // a) If the numerator is divisible by 3, the beat is 3*denominator. - // b) Otherwise the beat is the denominator. - // - // 3) If the denominator is anything else, then don't worry about it because it doesn't make sense. Don't modify it and hope for the best. - // - // Right now, the startingTempo is calculated for a quarter note, so modify it if necessary. - // var num = startingMeter ? parseInt(startingMeter.num, 10) : meter.num; - // var den = startingMeter ? parseInt(startingMeter.den, 10) : meter.den; - // if (den === 2) - // startingTempo *= 2; - // else if (den === 8) { - // if (parseInt(num, 10) % 3 === 0) - // startingTempo *= 3/2; - // else - // startingTempo /= 2; - // } else if (den === 16) { - // if (num % 3 === 0) - // startingTempo *= 3/4; - // else - // startingTempo /= 4; - // } - - return { tempo: startingTempo, instrument: instrument, tracks: tracks, totalDuration: totalDuration(tracks) }; - }; - - function zeroOutMilliseconds(voices) { - for (var i = 0; i < voices.length; i++) { - var voice = voices[i]; - for (var j = 0; j < voice.length; j++) { - var element = voice[j]; - delete element.currentTrackMilliseconds; - } - } - } - - function totalDuration(tracks) { - var total = 0; - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; - var trackTotal = 0; - for (var j = 0; j < track.length; j++) { - var event = track[j]; - if (event.duration) - trackTotal += event.duration; - } - total = Math.max(total, trackTotal); - } - return total; - } - - function getBeatFraction(meter) { - switch (meter.den) { - case 2: return 0.5; - case 4: return 0.25; - case 8: return 0.375; - case 16: return 0.125; - } - return 0.25; - } - // - // The algorithm for chords is: - // - The chords are done in a separate track. - // - If there are notes before the first chord, then put that much silence to start the track. - // - The pattern of chord expression depends on the meter, and how many chords are in a measure. - // - There is a possibility that a measure will have an incorrect number of beats, if that is the case, then - // start the pattern anew on the next measure number. - // - If a chord root is not A-G, then ignore it as if the chord wasn't there at all. - // - If a chord modification isn't in our supported list, change it to a major triad. - // - // - If there is only one chord in a measure: - // - If 2/4, play root chord - // - If cut time, play root(1) chord(3) - // - If 3/4, play root chord chord - // - If 4/4 or common time, play root chord fifth chord - // - If 6/8, play root(1) chord(3) fifth(4) chord(6) - // - For any other meter, play the full chord on each beat. (TODO-PER: expand this as more support is added.) - // - // - If there is a chord specified that is not on a beat, move it earlier to the previous beat, unless there is already a chord on that beat. - // - Otherwise, move it later, unless there is already a chord on that beat. - // - Otherwise, ignore it. (TODO-PER: expand this as more support is added.) - // - // - If there is a chord on the second beat, play a chord for the first beat instead of a bass note. - // - Likewise, if there is a chord on the fourth beat of 4/4, play a chord on the third beat instead of a bass note. - // - var breakSynonyms = [ 'break', '(break)', 'no chord', 'n.c.', 'tacet']; - - function findChord(elem) { - if (gChordTacet) - return 'break'; - - // TODO-PER: Just using the first chord if there are more than one. - if (chordTrackFinished || !elem.chord || elem.chord.length === 0) - return null; - - // Return the first annotation that is a regular chord: that is, it is in the default place or is a recognized "tacet" phrase. - for (var i = 0; i < elem.chord.length; i++) { - var ch = elem.chord[i]; - if (ch.position === 'default') - return ch.name; - if (breakSynonyms.indexOf(ch.name.toLowerCase()) >= 0) - return 'break'; - } - return null; - } - - function timeFromStart() { - var distance = 0; - for (var ct = 0; ct < currentTrack.length; ct++) { - if (currentTrack[ct].cmd === 'move') - distance += currentTrack[ct].duration; - } - return distance; - } - - function writeNote(elem, voiceOff) { - // - // Create a series of note events to append to the current track. - // The output event is one of: { pitchStart: pitch_in_abc_units, volume: from_1_to_64 } - // { pitchStop: pitch_in_abc_units } - // { moveTime: duration_in_abc_units } - // If there are guitar chords, then they are put in a separate track, but they have the same format. - // - - var volume; - if (nextVolume) { - volume = nextVolume; - nextVolume = undefined; - } else if (!doBeatAccents) { - volume = stressBeatDown; - } else { - if (barBeat === 0) - volume = stressBeat1; - else if (barBeat % beatFraction < 0.001) // A little slop because of JavaScript floating point math. - volume = stressBeatDown; - else - volume = stressBeatUp; - } - if (nextVolumeDelta) { - volume += nextVolumeDelta; - nextVolumeDelta = undefined; - } - if (volume < 0) - volume = 0; - if (volume > 127) - volume = 127; - var velocity = voiceOff ? 0 : volume; - var chord = findChord(elem); - if (chord) { - var c = interpretChord(chord); - // If this isn't a recognized chord, just completely ignore it. - if (c) { - // If we ever have a chord in this voice, then we add the chord track. - // However, if there are chords on more than one voice, then just use the first voice. - if (chordTrack.length === 0) { - chordTrack.push({cmd: 'program', channel: chordChannel, instrument: chordInstrument}); - // need to figure out how far in time the chord started: if there are pickup notes before the chords start, we need pauses. - var distance = timeFromStart(); - if (distance > 0) - chordTrack.push({cmd: 'move', duration: distance*tempoChangeFactor }); - } - - lastChord = c; - currentChords.push({chord: lastChord, beat: barBeat}); - } - } - - if (elem.startTriplet) { - multiplier = elem.tripletMultiplier; - } - - var duration = (elem.durationClass ? elem.durationClass : elem.duration) *multiplier; - barBeat += duration; - - // if there are grace notes, then also play them. - // I'm not sure there is an exact rule for the length of the notes. My rule, unless I find - // a better one is: the grace notes cannot take more than 1/2 of the main note's value. - // A grace note (of 1/8 note duration) takes 1/8 of the main note's value. - var graces; - if (elem.gracenotes) { - // There are two cases: if this is bagpipe, the grace notes are played on the beat with the current note. - // Normally, the grace notes would be played before the beat. (If this is the first note in the track, however, then it is played on the current beat.) - // The reason for the exception on the first note is that it would otherwise move the whole track in time and would affect all the other tracks. - var stealFromCurrent = (bagpipes || lastNoteDurationPosition < 0 || currentTrack.length === 0); - var stealFromDuration = stealFromCurrent ? duration : currentTrack[lastNoteDurationPosition].duration; - graces = processGraceNotes(elem.gracenotes, stealFromDuration); - if (!bagpipes) { - duration = writeGraceNotes(graces, stealFromCurrent, duration, null, velocity); - } - } - - // The currentTrackCounter is the number of whole notes from the beginning of the piece. - // The beat fraction is the note that gets a beat (.25 is a quarter note) - // The tempo is in minutes and we want to get to milliseconds. - if (!elem.currentTrackMilliseconds) - elem.currentTrackMilliseconds = []; - elem.currentTrackMilliseconds.push(currentTrackCounter / beatFraction / startingTempo * 60*1000); - if (elem.pitches) { - if (graces && bagpipes) { - // If it is bagpipes, then the graces are played with the note. If the grace has the same pitch as the note, then we just skip it. - duration = writeGraceNotes(graces, true, duration, null, velocity); - } - var pitches = []; - elem.midiPitches = []; - for (var i=0; i= 0; last--) { - if (currentTrack[last].cmd === 'start' && currentTrack[last].pitch === actualPitch && currentTrack[last].elem) { - var pitchArray = currentTrack[last].elem.midiPitches; - for (var last2 = 0; last2 < pitchArray.length; last2++) { - if (pitchArray[last2].pitch-60 === actualPitch) { // TODO-PER: the 60 is to compensate for the midi pitch numbers again. - pitchArray[last2].durationInMeasures += duration * tempoChangeFactor; - } - } - break; - } - } - } - - if (note.startTie) { - pitchesTied['' + actualPitch] = true; - currentTrack[currentTrack.length-1].elem = elem; - } else if (note.endTie) - pitchesTied[''+actualPitch] = false; - } - if (elem.gracenotes) { - for (var j = 0; j < elem.gracenotes.length; j++) { - elem.midiGraceNotePitches = []; - var grace = elem.gracenotes[j]; - elem.midiGraceNotePitches.push({ pitch: adjustPitch(grace)+60, durationInMeasures: 0, volume: volume, instrument: currentInstrument}); - } - } - var thisBreakBetweenNotes = normalBreakBetweenNotes; - var soundDuration = duration-normalBreakBetweenNotes; - if (soundDuration < 0) { - soundDuration = 0; - thisBreakBetweenNotes = 0; - } - currentTrack.push({ cmd: 'move', duration: soundDuration*tempoChangeFactor }); - lastNoteDurationPosition = currentTrack.length-1; - currentTrackCounter += soundDuration*tempoChangeFactor; - - for (var ii = 0; ii < pitches.length; ii++) { - if (!pitchesTied[''+pitches[ii].pitch]) - currentTrack.push({ cmd: 'stop', pitch: pitches[ii].pitch }); - } - currentTrack.push({ cmd: 'move', duration: thisBreakBetweenNotes*tempoChangeFactor }); - currentTrackCounter += thisBreakBetweenNotes*tempoChangeFactor; - } else if (elem.rest) { - currentTrack.push({ cmd: 'move', duration: duration*tempoChangeFactor }); - currentTrackCounter += duration*tempoChangeFactor; - } - - if (elem.endTriplet) { - multiplier=1; - } - } - - var scale = [0,2,4,5,7,9,11]; - function adjustPitch(note) { - if (note.midipitch) - return note.midipitch - 60; - var pitch = note.pitch; - if (note.accidental) { - switch(note.accidental) { // change that pitch (not other octaves) for the rest of the bar - case "sharp": - barAccidentals[pitch]=1; break; - case "flat": - barAccidentals[pitch]=-1; break; - case "natural": - barAccidentals[pitch]=0; break; - case "dblsharp": - barAccidentals[pitch]=2; break; - case "dblflat": - barAccidentals[pitch]=-2; break; - } - } - - var actualPitch = extractOctave(pitch) *12 + scale[extractNote(pitch)]; - - if ( barAccidentals[pitch]!==undefined) { - actualPitch += barAccidentals[pitch]; - } else { // use normal accidentals - actualPitch += accidentals[extractNote(pitch)]; - } - actualPitch += transpose; - return actualPitch; - } - - function setKeySignature(elem) { - var accidentals = [0,0,0,0,0,0,0]; - if (!elem.accidentals) return accidentals; - for (var i = 0; i < elem.accidentals.length; i++) { - var acc = elem.accidentals[i]; - var d = (acc.acc === "sharp") ? 1 : (acc.acc === "natural") ?0 : -1; - - var lowercase = acc.note.toLowerCase(); - var note = extractNote(lowercase.charCodeAt(0)-'c'.charCodeAt(0)); - accidentals[note]+=d; - } - return accidentals; - } - - var graceDivider = 8; // This is the fraction of a note that the grace represents. That is, if this is 2, then a grace note of 1/16 would be a 1/32. - function processGraceNotes(graces, companionDuration) { - var graceDuration = 0; - var ret = []; - var grace; - for (var g = 0; g < graces.length; g++) { - grace = graces[g]; - graceDuration += grace.duration; - } - graceDuration = graceDuration / graceDivider; - var multiplier = (graceDuration * 2 > companionDuration) ? companionDuration/(graceDuration * 2) : 1; - - for (g = 0; g < graces.length; g++) { - grace = graces[g]; - var pitch = grace.midipitch ? grace.midipitch - 60 : grace.pitch; - ret.push({ pitch: pitch, duration: grace.duration/graceDivider*multiplier }); - } - return ret; - } - - function writeGraceNotes(graces, stealFromCurrent, duration, skipNote, velocity) { - for (var g = 0; g < graces.length; g++) { - var gp = graces[g]; - if (gp !== skipNote) - currentTrack.push({cmd: 'start', pitch: gp.pitch, volume: velocity}); - currentTrack.push({cmd: 'move', duration: graces[g].duration*tempoChangeFactor }); - if (gp !== skipNote) - currentTrack.push({cmd: 'stop', pitch: gp.pitch}); - if (!stealFromCurrent) - currentTrack[lastNoteDurationPosition].duration -= graces[g].duration; - duration -= graces[g].duration; - } - return duration; - } - - function extractOctave(pitch) { - return Math.floor(pitch/7); - } - - function extractNote(pitch) { - pitch = pitch%7; - if (pitch<0) pitch+=7; - return pitch; - } - - var basses = { - 'A': -27, 'B': -25, 'C': -24, 'D': -22, 'E': -20, 'F': -19, 'G': -17 - }; - function interpretChord(name) { - // chords have the format: - // [root][acc][modifier][/][bass][acc] - // (The chord might be surrounded by parens. Just ignore them.) - // root must be present and must be from A-G. - // acc is optional and can be # or b - // The modifier can be a wide variety of things, like "maj7". As they are discovered, more are supported here. - // If there is a slash, then there is a bass note, which can be from A-G, with an optional acc. - // If the root is unrecognized, then "undefined" is returned and there is no chord. - // If the modifier is unrecognized, a major triad is returned. - // If the bass notes is unrecognized, it is ignored. - if (name.length === 0) - return undefined; - if (name === 'break') - return { chick: []}; - var root = name.substring(0,1); - if (root === '(') { - name = name.substring(1,name.length-2); - if (name.length === 0) - return undefined; - root = name.substring(0,1); - } - var bass = basses[root]; - if (!bass) // If the bass note isn't listed, then this was an unknown root. Only A-G are accepted. - return undefined; - bass += transpose; - var bass2 = bass - 5; // The alternating bass is a 4th below - var chick; - if (name.length === 1) - chick = chordNotes(bass, ''); - var remaining = name.substring(1); - var acc = remaining.substring(0,1); - if (acc === 'b' || acc === '♭') { - bass--; - bass2--; - remaining = remaining.substring(1); - } else if (acc === '#' || acc === '♯') { - bass++; - bass2++; - remaining = remaining.substring(1); - } - var arr = remaining.split('/'); - chick = chordNotes(bass, arr[0]); - if (arr.length === 2) { - var explicitBass = basses[arr[1].substring(0,1)]; - if (explicitBass) { - var bassAcc = arr[1].substring(1); - var bassShift = {'#': 1, '♯': 1, 'b': -1, '♭': -1}[bassAcc] || 0; - bass = basses[arr[1].substring(0,1)] + bassShift + transpose; - bass2 = bass; - } - } - return { boom: bass, boom2: bass2, chick: chick }; - } - - var chordIntervals = { - // diminished (all flat 5 chords) - 'dim': [ 0, 3, 6 ], - '°': [ 0, 3, 6 ], - '˚': [ 0, 3, 6 ], - - 'dim7': [ 0, 3, 6, 9 ], - '°7': [ 0, 3, 6, 9 ], - '˚7': [ 0, 3, 6, 9 ], - - 'ø7': [ 0, 3, 6, 10 ], - 'm7(b5)': [ 0, 3, 6, 10 ], - 'm7b5': [ 0, 3, 6, 10 ], - '-7(b5)': [ 0, 3, 6, 10 ], - '-7b5': [ 0, 3, 6, 10 ], - - '7b5': [ 0, 4, 6, 10 ], - '7(b5)': [ 0, 4, 6, 10 ], - '7♭5': [ 0, 4, 6, 10 ], - - '7(b9,b5)': [ 0, 4, 6, 10, 13 ], - '7b9,b5': [ 0, 4, 6, 10, 13 ], - '7(#9,b5)': [ 0, 4, 6, 10, 15 ], - '7#9b5': [ 0, 4, 6, 10, 15 ], - 'maj7(b5)': [ 0, 3, 6, 11 ], - 'maj7b5': [ 0, 3, 6, 11 ], - '13(b5)': [ 0, 4, 6, 10, 14, 18 ], - '13b5': [ 0, 4, 6, 10, 14, 18 ], - - // minor (all normal 5, minor 3 chords) - 'm': [ 0, 3, 7 ], - '-': [ 0, 3, 7 ], - 'm6': [ 0, 3, 7, 9 ], - '-6': [ 0, 3, 7, 9 ], - 'm7': [ 0, 3, 7, 10 ], - '-7': [ 0, 3, 7, 10 ], - - '-(b6)': [ 0, 3, 7, 8 ], - '-b6': [ 0, 3, 7, 8 ], - '-6/9': [ 0, 3, 7, 9, 14 ], - '-7(b9)': [ 0, 3, 7, 10, 13 ], - '-7b9': [ 0, 3, 7, 10, 13 ], - '-maj7': [ 0, 3, 7, 11 ], - '-9+7': [ 0, 3, 7, 11, 13 ], - '-11': [ 0, 3, 7, 11, 14, 16 ], - - // major (all normal 5, major 3 chords) - 'M': [ 0, 4, 7 ], - '6': [ 0, 4, 7, 9 ], - '6/9': [ 0, 4, 7, 9, 14 ], - - '7': [ 0, 4, 7, 10 ], - '9': [ 0, 4, 7, 10, 14 ], - '11': [ 0, 4, 7, 10, 14, 16 ], - '13': [ 0, 4, 7, 10, 14, 18 ], - '7b9': [ 0, 4, 7, 10, 13 ], - '7♭9': [ 0, 4, 7, 10, 13 ], - '7(b9)': [ 0, 4, 7, 10, 13 ], - '7(#9)': [ 0, 4, 7, 10, 15 ], - '7#9': [ 0, 4, 7, 10, 15 ], - '(13)': [ 0, 4, 7, 10, 14, 18 ], - '7(9,13)': [ 0, 4, 7, 10, 14, 18 ], - '7(#9,b13)': [ 0, 4, 7, 10, 15, 17 ], - '7(#11)': [ 0, 4, 7, 10, 14, 17 ], - '7#11': [ 0, 4, 7, 10, 14, 17 ], - '7(b13)': [ 0, 4, 7, 10, 17 ], - '7b13': [ 0, 4, 7, 10, 17 ], - '9(#11)': [ 0, 4, 7, 10, 14, 17 ], - '9#11': [ 0, 4, 7, 10, 14, 17 ], - '13(#11)': [ 0, 4, 7, 10, 15, 18 ], - '13#11': [ 0, 4, 7, 10, 15, 18 ], - - 'maj7': [ 0, 4, 7, 11 ], - '∆7': [ 0, 4, 7, 11 ], - 'Δ7': [ 0, 4, 7, 11 ], - 'maj9': [ 0, 4, 7, 11, 14 ], - 'maj7(9)': [ 0, 4, 7, 11, 14 ], - 'maj7(11)': [ 0, 4, 7, 11, 16 ], - 'maj7(#11)': [ 0, 4, 7, 11, 17 ], - 'maj7(13)': [ 0, 4, 7, 11, 18 ], - 'maj7(9,13)': [ 0, 4, 7, 11, 14, 18 ], - - '7sus4': [ 0, 5, 7, 10 ], - 'm7sus4': [ 0, 5, 7, 10 ], - 'sus4': [ 0, 5, 7 ], - 'sus2': [ 0, 2, 7 ], - '7sus2': [ 0, 2, 7, 10 ], - '9sus4': [ 0, 5, 7, 14 ], - '13sus4': [ 0, 5, 7, 18 ], - - // augmented (all sharp 5 chords) - 'aug7': [ 0, 4, 8, 10 ], - '+7': [ 0, 4, 8, 10 ], - '+': [ 0, 4, 8 ], - '7#5': [ 0, 4, 8, 10 ], - '7♯5': [ 0, 4, 8, 10 ], - '7+5': [ 0, 4, 8, 10 ], - '9#5': [ 0, 4, 8, 10, 14 ], - '9♯5': [ 0, 4, 8, 10, 14 ], - '9+5': [ 0, 4, 8, 10, 14 ], - '-7(#5)': [ 0, 3, 8, 10 ], - '-7#5': [ 0, 3, 8, 10 ], - '7(#5)': [ 0, 4, 8, 10 ], - '7(b9,#5)': [ 0, 4, 8, 10, 13 ], - '7b9#5': [ 0, 4, 8, 10, 13 ], - 'maj7(#5)': [ 0, 4, 8, 11 ], - 'maj7#5': [ 0, 4, 8, 11 ], - 'maj7(#5,#11)': [ 0, 4, 8, 11, 14 ], - 'maj7#5#11': [ 0, 4, 8, 11, 14 ], - '9(#5)': [ 0, 4, 8, 10, 14 ], - '13(#5)': [ 0, 4, 8, 10, 14, 18 ], - '13#5': [ 0, 4, 8, 10, 14, 18 ] -}; - function chordNotes(bass, modifier) { - var intervals = chordIntervals[modifier]; - if (!intervals) - intervals = chordIntervals.M; - bass += 12; // the chord is an octave above the bass note. - var notes = [ ]; - for (var i = 0; i < intervals.length; i++) { - notes.push(bass + intervals[i]); - } - return notes; - } - - function writeBoom(boom, beatLength) { - // undefined means there is a stop time. - if (boom !== undefined) - chordTrack.push({cmd: 'start', pitch: boom, volume: 64}); - chordTrack.push({ cmd: 'move', duration: (beatLength/2)*tempoChangeFactor }); - if (boom !== undefined) - chordTrack.push({ cmd: 'stop', pitch: boom }); - chordTrack.push({ cmd: 'move', duration: (beatLength/2)*tempoChangeFactor }); - } - - function writeChick(chick, beatLength) { - for (var c = 0; c < chick.length; c++) - chordTrack.push({cmd: 'start', pitch: chick[c], volume: 48}); - chordTrack.push({ cmd: 'move', duration: (beatLength/2)*tempoChangeFactor }); - for (c = 0; c < chick.length; c++) - chordTrack.push({ cmd: 'stop', pitch: chick[c] }); - chordTrack.push({ cmd: 'move', duration: (beatLength/2)*tempoChangeFactor }); - } - - var rhythmPatterns = { "2/2": [ 'boom', 'chick' ], - "2/4": [ 'boom', 'chick' ], - "3/4": [ 'boom', 'chick', 'chick' ], - "4/4": [ 'boom', 'chick', 'boom2', 'chick' ], - "5/4": [ 'boom', 'chick', 'chick', 'boom2', 'chick' ], - "6/8": [ 'boom', '', 'chick', 'boom2', '', 'chick' ], - "9/8": [ 'boom', '', 'chick', 'boom2', '', 'chick', 'boom2', '', 'chick' ], - "12/8": [ 'boom', '', 'chick', 'boom2', '', 'chick', 'boom2', '', 'chick', 'boom2', '', 'chick' ], - }; - - function resolveChords() { - var num = meter.num; - var den = meter.den; - var beatLength = 1/den; - var pattern = rhythmPatterns[num+'/'+den]; - var thisMeasureLength = parseInt(num,10)/parseInt(den,10); - // See if this is a full measure: unfortunately, with triplets, there isn't an exact match, what with the floating point, so we just see if it is "close". - var portionOfAMeasure = Math.abs(thisMeasureLength - barBeat); - if (!pattern || portionOfAMeasure > 0.0078125) { // If it is an unsupported meter, or this isn't a full bar, just chick on each beat. - pattern = []; - var beatsPresent = barBeat / beatLength; - for (var p = 0; p < beatsPresent; p++) - pattern.push("chick"); - } - - if (currentChords.length === 0) { // there wasn't a new chord this measure, so use the last chord declared. - currentChords.push({ beat: 0, chord: lastChord}); - } - if (currentChords[0].beat !== 0 && lastChord) { // this is the case where there is a chord declared in the measure, but not on its first beat. - currentChords.unshift({ beat: 0, chord: lastChord}); - } - if (currentChords.length === 1) { - for (var m = 0; m < pattern.length; m++) { - switch (pattern[m]) { - case 'boom': - writeBoom(currentChords[0].chord.boom, beatLength); - break; - case 'boom2': - writeBoom(currentChords[0].chord.boom2, beatLength); - break; - case 'chick': - writeChick(currentChords[0].chord.chick, beatLength); - break; - case '': - chordTrack.push({ cmd: 'move', duration: beatLength*tempoChangeFactor }); - break; - } - } - return; - } - - // If we are here it is because more than one chord was declared in the measure, so we have to sort out what chord goes where. - - // First, normalize the chords on beats. - var beats = {}; - for (var i = 0; i < currentChords.length; i++) { - var cc = currentChords[i]; - var beat = Math.floor(cc.beat / beatLength); // now all the beats are integers, there may be - beats[''+beat] = cc; - } - - // - If there is a chord on the second beat, play a chord for the first beat instead of a bass note. - // - Likewise, if there is a chord on the fourth beat of 4/4, play a chord on the third beat instead of a bass note. - for (var m2 = 0; m2 < pattern.length; m2++) { - var thisChord; - if (beats[''+m2]) - thisChord = beats[''+m2]; - switch (pattern[m2]) { - case 'boom': - if (beats[''+(m2+1)]) // If there is not a chord change on the next beat, play a bass note. - writeChick(thisChord.chord.chick, beatLength); - else - writeBoom(thisChord.chord.boom, beatLength); - break; - case 'boom2': - if (beats[''+(m2+1)]) - writeChick(thisChord.chord.chick, beatLength); - else - writeBoom(thisChord.chord.boom2, beatLength); - break; - case 'chick': - writeChick(thisChord.chord.chick, beatLength); - break; - case '': - if (beats[''+m2]) // If there is an explicit chord on this beat, play it. - writeChick(thisChord.chord.chick, beatLength); - else - chordTrack.push({cmd: 'move', duration: beatLength*tempoChangeFactor }); - break; - } - } - } - - function normalizeDrumDefinition(params) { - // Be very strict with the drum definition. If anything is not perfect, - // just turn the drums off. - // Perhaps all of this logic belongs in the parser instead. - if (params.pattern.length === 0 || params.on === false) - return { on: false }; - - var str = params.pattern[0]; - var events = []; - var event = ""; - var totalPlay = 0; - for (var i = 0; i < str.length; i++) { - if (str[i] === 'd') - totalPlay++; - if (str[i] === 'd' || str[i] === 'z') { - if (event.length !== 0) { - events.push(event); - event = str[i]; - } else - event = event + str[i]; - } else { - if (event.length === 0) { - // there was an error: the string should have started with d or z - return {on: false}; - } - event = event + str[i]; - } - } - - if (event.length !== 0) - events.push(event); - - // Now the events array should have one item per event. - // There should be two more params for each event: the volume and the pitch. - if (params.pattern.length !== totalPlay*2 + 1) - return { on: false }; - - var ret = { on: true, bars: params.bars, pattern: []}; - var beatLength = 1/meter.den; - var playCount = 0; - for (var j = 0; j < events.length; j++) { - event = events[j]; - var len = 1; - var div = false; - var num = 0; - for (var k = 1; k < event.length; k++) { - switch(event[k]) { - case "/": - if (num !== 0) - len *= num; - num = 0; - div = true; - break; - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - num = num*10 +event[k]; - break; - default: - return { on: false }; - } - } - if (div) { - if (num === 0) num = 2; // a slash by itself is interpreted as "/2" - len /= num; - } else if (num) - len *= num; - if (event[0] === 'd') { - ret.pattern.push({ len: len * beatLength, pitch: params.pattern[1 + playCount], velocity: params.pattern[1 + playCount + totalPlay]}); - playCount++; - } else - ret.pattern.push({ len: len * beatLength, pitch: null}); - } - // Now normalize the pattern to cover the correct number of measures. The note lengths passed are relative to each other and need to be scaled to fit a measure. - var totalTime = 0; - var measuresPerBeat = meter.num/meter.den; - for (var ii = 0; ii < ret.pattern.length; ii++) - totalTime += ret.pattern[ii].len; - var numBars = params.bars ? params.bars : 1; - var factor = totalTime / numBars / measuresPerBeat; - for (ii = 0; ii < ret.pattern.length; ii++) - ret.pattern[ii].len = ret.pattern[ii].len / factor; - return ret; - } - - function drumBeat(pitch, soundLength, volume) { - drumTrack.push({ cmd: 'start', pitch: pitch - 60, volume: volume}); - drumTrack.push({ cmd: 'move', duration: soundLength }); - drumTrack.push({ cmd: 'stop', pitch: pitch - 60 }); - } - - function writeDrum(channel) { - if (drumTrack.length === 0 && !drumDefinition.on) - return; - - var measureLen = meter.num/meter.den; - if (drumTrack.length === 0) { - drumTrack.push({cmd: 'program', channel: channel, instrument: drumInstrument}); - // need to figure out how far in time the bar started: if there are pickup notes before the chords start, we need pauses. - var distance = timeFromStart(); - if (distance > 0 && distance < measureLen - 0.01) { // because of floating point, adding the notes might not exactly equal the measure size. - drumTrack.push({cmd: 'move', duration: distance * tempoChangeFactor}); - return; - } - } - - if (!drumDefinition.on) { - // this is the case where there has been a drum track, but it was specifically turned off. - drumTrack.push({ cmd: 'move', duration: measureLen * tempoChangeFactor }); - return; - } - for (var i = 0; i < drumDefinition.pattern.length; i++) { - var len = drumDefinition.pattern[i].len * tempoChangeFactor; - if (drumDefinition.pattern[i].pitch) - drumBeat(drumDefinition.pattern[i].pitch, len, drumDefinition.pattern[i].velocity); - else - drumTrack.push({ cmd: 'move', duration: len }); - } - } -})(); - -var abc_midi_flattener = flatten; - -// TODO-PER: remove the midi tests from here: I don't think the object can be constructed unless it passes. -var notSupportedMessage = "MIDI is not supported in this browser."; - -var defaultSoundFontUrl = "https://paulrosen.github.io/midi-js-soundfonts/FluidR3_GM/"; - - -function CreateSynth() { - var self = this; - self.audioBufferPossible = undefined; - self.directSource = []; // type: AudioBufferSourceNode - self.startTimeSec = undefined; // the time that the midi started: used for pause/resume. - self.pausedTimeSec = undefined; // the time that the midi was paused: used for resume. - self.audioBuffers = []; // cache of the buffers so starting play can be fast. - self.duration = undefined; // the duration of the tune in seconds. - self.isRunning = false; // whether there is currently a sound buffer running. - - // Load and cache all needed sounds - self.init = function(options) { - if (!options) - options = {}; - registerAudioContext_1(options.audioContext); // This works no matter what - if there is already an ac it is a nop; if the context is not passed in, then it creates one. - var startTime = activeAudioContext_1().currentTime; - self.debugCallback = options.debugCallback; - if (self.debugCallback) - self.debugCallback("init called"); - self.audioBufferPossible = self._deviceCapable(); - if (!self.audioBufferPossible) - return Promise.reject({ status: "NotSupported", message: notSupportedMessage}); - self.soundFontUrl = options.soundFontUrl ? options.soundFontUrl : defaultSoundFontUrl; - self.millisecondsPerMeasure = options.millisecondsPerMeasure ? options.millisecondsPerMeasure : (options.visualObj ? options.visualObj.millisecondsPerMeasure() : 1000); - var params = options.options ? options.options : {}; - self.meterSize = 1; - if (options.visualObj) { - var seq = abc_midi_sequencer(options.visualObj, params); - self.flattened = abc_midi_flattener(seq, params); - self.meterSize = options.visualObj.getMeterFraction().num / options.visualObj.getMeterFraction().den; - } else if (options.sequence) - self.flattened = options.sequence; - else - return Promise.reject(new Error("Must pass in either a visualObj or a sequence")); - self.sequenceCallback = params.sequenceCallback; - self.callbackContext = params.callbackContext; - self.onEnded = options.onEnded; - - var allNotes = {}; - var currentInstrument = instrumentIndexToName_1[0]; - self.flattened.tracks.forEach(function(track) { - track.forEach(function(event) { - if (event.cmd === "program" && instrumentIndexToName_1[event.instrument]) - currentInstrument = instrumentIndexToName_1[event.instrument]; - if (event.pitch !== undefined) { - var pitchNumber = event.pitch + 60; - var noteName = pitchToNoteName_1[pitchNumber]; - if (noteName) { - if (!allNotes[currentInstrument]) - allNotes[currentInstrument] = {}; - allNotes[currentInstrument][pitchToNoteName_1[pitchNumber]] = true; - } else - console.log("Can't find note: ", pitchNumber); - } - }); - }); - if (self.debugCallback) - self.debugCallback("note gathering time = " + Math.floor((activeAudioContext_1().currentTime - startTime)*1000)+"ms"); - startTime = activeAudioContext_1().currentTime; - - var notes = []; - Object.keys(allNotes).forEach(function(instrument) { - Object.keys(allNotes[instrument]).forEach(function(note) { - notes.push({ instrument: instrument, note: note }); - }); - }); - // If there are lots of notes, load them in batches - var batches = []; - var CHUNK = 256; - for (var i=0; i < notes.length; i += CHUNK) { - batches.push(notes.slice(i, i + CHUNK)); - } - - return new Promise(function(resolve, reject) { - var results = []; - - var index = 0; - var next = function() { - if (index < batches.length) { - self._loadBatch(batches[index], self.soundFontUrl, startTime).then(function(data) { - startTime = activeAudioContext_1().currentTime; - results.push(data); - index++; - next(); - }, reject); - } else { - resolve(results); - } - }; - next(); - }); - }; - - self._loadBatch = (function(batch, soundFontUrl, startTime) { - var promises = []; - batch.forEach(function(item) { - promises.push(loadNote(soundFontUrl, item.instrument, item.note, activeAudioContext_1())); - }); - return Promise.all(promises).then(function(response) { - if (self.debugCallback) - self.debugCallback("mp3 load time = " + Math.floor((activeAudioContext_1().currentTime - startTime)*1000)+"ms"); - return Promise.resolve(response); - }); - }); - - self.prime = function() { - self.isRunning = false; - if (!self.audioBufferPossible) - return Promise.reject(new Error(notSupportedMessage)); - if (self.debugCallback) - self.debugCallback("prime called"); - return new Promise(function(resolve) { - var startTime = activeAudioContext_1().currentTime; - var tempoMultiplier = self.millisecondsPerMeasure / 1000 / self.meterSize; - self.duration = self.flattened.totalDuration * tempoMultiplier; - var totalSamples = Math.floor(activeAudioContext_1().sampleRate * self.duration); - - // There might be a previous run that needs to be turned off. - self.stop(); - - var noteMapTracks = createNoteMap_1(self.flattened); - if (self.sequenceCallback) - self.sequenceCallback(noteMapTracks, self.callbackContext); - //console.log(noteMapTracks); - - self.audioBuffers = []; - noteMapTracks.forEach(function(noteMap) { - var audioBuffer = activeAudioContext_1().createBuffer(1, totalSamples, activeAudioContext_1().sampleRate); - var chanData = audioBuffer.getChannelData(0); - - noteMap.forEach(function(note) { - self._placeNote(chanData, note, tempoMultiplier, soundsCache_1); - }); - - self.audioBuffers.push(audioBuffer); - }); - - if (self.debugCallback) { - self.debugCallback("sampleRate = " + activeAudioContext_1().sampleRate); - self.debugCallback("totalSamples = " + totalSamples); - self.debugCallback("creationTime = " + Math.floor((activeAudioContext_1().currentTime - startTime)*1000) + "ms"); - } - resolve({ - status: "ok", - seconds: 0 - }); - }); - }; - - // This is called after everything is set up, so it can quickly make sound - self.start = function() { - if (self.pausedTimeSec) { - self.resume(); - return; - } - - if (!self.audioBufferPossible) - throw new Error(notSupportedMessage); - if (self.debugCallback) - self.debugCallback("start called"); - - self._kickOffSound(0); - self.startTimeSec = activeAudioContext_1().currentTime; - self.pausedTimeSec = undefined; - - if (self.debugCallback) - self.debugCallback("MIDI STARTED", self.startTimeSec); - }; - - self.pause = function() { - if (!self.audioBufferPossible) - throw new Error(notSupportedMessage); - if (self.debugCallback) - self.debugCallback("pause called"); - - if (!self.pausedTimeSec) { // ignore if self is already paused. - self.stop(); - self.pausedTimeSec = activeAudioContext_1().currentTime; - } - }; - - self.resume = function() { - if (!self.audioBufferPossible) - throw new Error(notSupportedMessage); - if (self.debugCallback) - self.debugCallback("resume called"); - - var offset = self.pausedTimeSec - self.startTimeSec; - self.startTimeSec = activeAudioContext_1().currentTime - offset; // We move the start time in case there is another pause/resume. - self.pausedTimeSec = undefined; - self._kickOffSound(offset); - }; - - self.seek = function(percent) { - var offset = self.duration * percent; - - // TODO-PER: can seek when paused or when playing - if (!self.audioBufferPossible) - throw new Error(notSupportedMessage); - if (self.debugCallback) - self.debugCallback("seek called sec=" + offset); - - if (self.isRunning) { - self.stop(); - self._kickOffSound(offset); - } - var pauseDistance = self.pausedTimeSec ? self.pausedTimeSec - self.startTimeSec : undefined; - self.startTimeSec = activeAudioContext_1().currentTime - offset; - if (self.pausedTimeSec) - self.pausedTimeSec = self.startTimeSec + pauseDistance; - }; - - self.stop = function() { - self.isRunning = false; - self.pausedTimeSec = undefined; - self.directSource.forEach(function(source) { - try { - source.stop(); - } catch (error) { - // We don't care if self succeeds: it might fail if something else turned off the sound or it ended for some reason. - console.log("direct source didn't stop:", error); - } - }); - self.directSource = []; - }; - - self.download = function() { - return downloadBuffer_1(self); - }; - - /////////////// Private functions ////////////// - - self._deviceCapable = function() { - if (!supportsAudio_1()) { - console.warn(notSupportedMessage); - if (self.debugCallback) - self.debugCallback(notSupportedMessage); - return false; - } - return true; - }; - - self._kickOffSound = function(seconds) { - self.isRunning = true; - self.directSource = []; - self.audioBuffers.forEach(function(audioBuffer, trackNum) { - self.directSource[trackNum] = activeAudioContext_1().createBufferSource(); // creates a sound source - self.directSource[trackNum].buffer = audioBuffer; // tell the source which sound to play - self.directSource[trackNum].connect(activeAudioContext_1().destination); // connect the source to the context's destination (the speakers) - }); - self.directSource.forEach(function(source) { - source.start(0, seconds); - }); - if (self.onEnded) { - self.directSource[0].onended = function () { - self.onEnded(self.callbackContext); - }; - } - }; - - self._placeNote = function(chanData, note, tempoMultiplier, soundsCache) { - var start = Math.floor(note.start*activeAudioContext_1().sampleRate * tempoMultiplier); - var numBeats = note.end - note.start; - var noteTimeSec = numBeats * tempoMultiplier; - var noteName = pitchToNoteName_1[note.pitch+60]; - if (noteName) { // Just ignore pitches that don't exist. - var pitch = soundsCache[note.instrument][noteName].getChannelData(0); - var duration = Math.min(pitch.length, Math.floor(noteTimeSec * activeAudioContext_1().sampleRate)); - //console.log(pitchToNote[note.pitch+''], start, numBeats, noteTimeSec, duration); - for (var i = 0; i < duration; i++) { - var thisSample = pitch[i] * note.volume / 128; - if (chanData[start + i]) - chanData[start + i] = (chanData[start + i] + thisSample) *0.75; - else - chanData[start + i] = thisSample; - } - } - }; -} - -var createSynth = CreateSynth; - -var SynthSequence = function() { - var self = this; - self.tracks = []; - self.totalDuration = 0; - - self.addTrack = function() { - self.tracks.push([]); - return self.tracks.length - 1; - }; - - self.setInstrument = function(trackNumber, instrumentNumber) { - self.tracks[trackNumber].push({ - channel: 0, - cmd: "program", - instrument: instrumentNumber - }); - }; - - self.appendNote = function(trackNumber, pitch, durationInMeasures, volume) { - self.tracks[trackNumber].push({ - cmd: "start", - pitch: pitch - 60, - volume: volume - }); - self.tracks[trackNumber].push({ - cmd: "move", - duration: durationInMeasures - }); - self.tracks[trackNumber].push({ - cmd: "stop", - pitch: pitch - 60 - }); - var duration = 0; - self.tracks[trackNumber].forEach(function(event) { - if (event.duration) - duration += event.duration; - }); - self.totalDuration = Math.max(self.totalDuration, duration); - }; -}; - -var synthSequence = SynthSequence; - -// TODO-PER: The require statements for svg don't play well for node apps without extra plugins. The following lines would be clearer than inlining the SVG -// var loopImage = require('./images/loop.svg'); -// var playImage = require('./images/play.svg'); -// var pauseImage = require('./images/pause.svg'); -// var loadingImage = require('./images/loading.svg'); -// var resetImage = require('./images/reset.svg'); -var loopImage = '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n'; -var playImage = '\n' + - ' \n' + - ' \n' + - ' \n' + - ''; -var pauseImage = '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ''; -var loadingImage = '\n' + - ' \n' + - ''; -var resetImage = '\n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ''; - -function CreateSynthControl(parent, options) { - var self = this; - // parent is either an element or a selector. - if (typeof parent === "string") { - var selector = parent; - parent = document.querySelector(selector); - if (!parent) - throw new Error("Cannot find element \"" + selector + "\" in the DOM."); - } else if (!(parent instanceof HTMLElement)) - throw new Error("The first parameter must be a valid element or selector in the DOM."); - - self.parent = parent; - self.options = {}; - if (options) - self.options = abc_common.clone(options); - - // This can be called in the following cases: - // AC already registered and not suspended - // AC already registered and suspended - // AC not registered and not passed in - // AC not registered but passed in (but suspended) - // AC not registered but passed in (not suspended) - // If the AC is already registered, then just use it - ignore what is passed in - // Create the AC if necessary if there isn't one already. - // We don't care right now if the AC is suspended - whenever a button is clicked then we check it. - if (self.options.ac) - registerAudioContext_1(self.options.ac); - buildDom(self.parent, self.options); - attachListeners(self); - - self.setTempo = function(tempo) { - var el = self.parent.querySelector(".abcjs-midi-current-tempo"); - if (el) - el.innerHTML = tempo; - }; - self.resetAll = function() { - var pushedButtons = self.parent.querySelectorAll(".abcjs-pushed"); - for (var i = 0; i < pushedButtons.length; i++) { - var button = pushedButtons[i]; - button.classList.remove("abcjs-pushed"); - } - }; - self.pushPlay = function(push) { - var startButton = self.parent.querySelector(".abcjs-midi-start"); - if (!startButton) - return; - if (push) - startButton.classList.add("abcjs-pushed"); - else - startButton.classList.remove("abcjs-pushed"); - }; - self.pushLoop = function(push) { - var loopButton = self.parent.querySelector(".abcjs-midi-loop"); - if (!loopButton) - return; - if (push) - loopButton.classList.add("abcjs-pushed"); - else - loopButton.classList.remove("abcjs-pushed"); - }; - - self.setProgress = function (percent, totalTime) { - var progressBackground = self.parent.querySelector(".abcjs-midi-progress-background"); - var progressThumb = self.parent.querySelector(".abcjs-midi-progress-indicator"); - if (!progressBackground || !progressThumb) - return; - var width = progressBackground.clientWidth; - var left = width * percent; - progressThumb.style.left = left + "px"; - - var clock = self.parent.querySelector(".abcjs-midi-clock"); - if (clock) { - var totalSeconds = (totalTime * percent) / 1000; - var minutes = Math.floor(totalSeconds / 60); - var seconds = Math.floor(totalSeconds % 60); - var secondsFormatted = seconds < 10 ? "0" + seconds : seconds; - clock.innerHTML = minutes + ":" + secondsFormatted; - } - }; - - if (self.options.afterResume) { - var isResumed = false; - if (self.options.ac) { - isResumed = self.options.ac.state !== "suspended"; - } else if (activeAudioContext_1()) { - isResumed = activeAudioContext_1().state !== "suspended"; - } - if (isResumed) - self.options.afterResume(); - } -} - -function buildDom(parent, options) { - var hasLoop = !!options.loopHandler; - var hasRestart = !!options.restartHandler; - var hasPlay = !!options.playHandler || !!options.playPromiseHandler; - var hasProgress = !!options.progressHandler; - var hasWarp = !!options.warpHandler; - var hasClock = options.hasClock !== false; - - var html = '
\n'; - if (hasLoop) { - var repeatTitle = options.repeatTitle ? options.repeatTitle : "Click to toggle play once/repeat."; - var repeatAria = options.repeatAria ? options.repeatAria : repeatTitle; - html += '\n'; - } - if (hasRestart) { - var restartTitle = options.restartTitle ? options.restartTitle : "Click to go to beginning."; - var restartAria = options.restartAria ? options.restartAria : restartTitle; - html += '\n'; - } - if (hasPlay) { - var playTitle = options.playTitle ? options.playTitle : "Click to play/pause."; - var playAria = options.playAria ? options.playAria : playTitle; - html += '\n'; - } - if (hasProgress) { - var randomTitle = options.randomTitle ? options.randomTitle : "Click to change the playback position."; - var randomAria = options.randomAria ? options.randomAria : randomTitle; - html += '\n'; - } - if (hasClock) { - html += '\n'; - } - if (hasWarp) { - var warpTitle = options.warpTitle ? options.warpTitle : "Change the playback speed."; - var warpAria = options.warpAria ? options.warpAria : warpTitle; - var bpm = options.bpm ? options.bpm : "BPM"; - html += ' ( ' + bpm + ')\n'; - } - html += '
\n'; - parent.innerHTML = html; -} - -function acResumerMiddleWare(next, ev, playBtn, afterResume, isPromise) { - var needsInit = true; - if (!activeAudioContext_1()) { - registerAudioContext_1(); - } else { - needsInit = activeAudioContext_1().state === "suspended"; - } - if (!supportsAudio_1()) { - throw { status: "NotSupported", message: "This browser does not support audio."}; - } - - if ((needsInit || isPromise) && playBtn) - playBtn.classList.add("abcjs-loading"); - - if (needsInit) { - activeAudioContext_1().resume().then(function () { - if (afterResume) { - afterResume().then(function (response) { - doNext(next, ev, playBtn, isPromise); - }); - } else { - doNext(next, ev, playBtn, isPromise); - } - }); - } else { - doNext(next, ev, playBtn, isPromise); - } -} - -function doNext(next, ev, playBtn, isPromise) { - if (isPromise) { - next(ev).then(function() { - if (playBtn) - playBtn.classList.remove("abcjs-loading"); - }); - } else { - next(ev); - if (playBtn) - playBtn.classList.remove("abcjs-loading"); - } -} - -function attachListeners(self) { - var hasLoop = !!self.options.loopHandler; - var hasRestart = !!self.options.restartHandler; - var hasPlay = !!self.options.playHandler || !!self.options.playPromiseHandler; - var hasProgress = !!self.options.progressHandler; - var hasWarp = !!self.options.warpHandler; - var playBtn = self.parent.querySelector(".abcjs-midi-start"); - - if (hasLoop) - self.parent.querySelector(".abcjs-midi-loop").addEventListener("click", function(ev){acResumerMiddleWare(self.options.loopHandler, ev, playBtn, self.options.afterResume);}); - if (hasRestart) - self.parent.querySelector(".abcjs-midi-reset").addEventListener("click", function(ev){acResumerMiddleWare(self.options.restartHandler, ev, playBtn, self.options.afterResume);}); - if (hasPlay) - playBtn.addEventListener("click", function(ev){ - acResumerMiddleWare( - self.options.playPromiseHandler || self.options.playHandler, - ev, - playBtn, - self.options.afterResume, - !!self.options.playPromiseHandler); - }); - if (hasProgress) - self.parent.querySelector(".abcjs-midi-progress-background").addEventListener("click", function(ev){acResumerMiddleWare(self.options.progressHandler, ev, playBtn, self.options.afterResume);}); - if (hasWarp) - self.parent.querySelector(".abcjs-midi-tempo").addEventListener("change", function(ev){acResumerMiddleWare(self.options.warpHandler, ev, playBtn, self.options.afterResume);}); -} -var createSynthControl = CreateSynthControl; - -function playEvent(midiPitches, midiGracePitches, millisecondsPerMeasure) { - var sequence = new synthSequence(); - - for (var i = 0; i < midiPitches.length; i++) { - var note = midiPitches[i]; - var trackNum = sequence.addTrack(); - sequence.setInstrument(trackNum, note.instrument); - if (i === 0 && midiGracePitches) { - for (var j = 0; j < midiGracePitches.length; j++) { - var grace = midiGracePitches[j]; - sequence.appendNote(trackNum, grace.pitch, 1 / 64, grace.volume); - } - } - sequence.appendNote(trackNum, note.pitch, note.durationInMeasures, note.volume); - } - - var buffer = new createSynth(); - return buffer.init({ - sequence: sequence, - millisecondsPerMeasure: millisecondsPerMeasure - }).then(function () { - return buffer.prime(); - }).then(function () { - return buffer.start(); - }); -} -var playEvent_1 = playEvent; - -function SynthController() { - var self = this; - self.warp = 100; - self.cursorControl = null; - self.visualObj = null; - self.timer = null; - self.midiBuffer = null; - self.options = null; - self.currentTempo = null; - self.control = null; - self.isLooping = false; - self.isStarted = false; - self.isLoaded = false; - - self.load = function (selector, cursorControl, visualOptions) { - if (!visualOptions) - visualOptions = {}; - self.control = new createSynthControl(selector, { - loopHandler: visualOptions.displayLoop ? self.toggleLoop : undefined, - restartHandler: visualOptions.displayRestart ? self.restart : undefined, - playPromiseHandler: visualOptions.displayPlay ? self.play : undefined, - progressHandler: visualOptions.displayProgress ? self.randomAccess : undefined, - warpHandler: visualOptions.displayWarp ? self.onWarp : undefined, - afterResume: self.init - }); - self.cursorControl = cursorControl; - }; - - self.setTune = function(visualObj, userAction, audioParams) { - self.isLoaded = false; - self.visualObj = visualObj; - self.options = audioParams; - - if (self.control) { - self.pause(); - self.setProgress(0, 1); - self.control.resetAll(); - self.restart(); - self.isStarted = false; - } - self.isLooping = false; - - if (userAction) - return self.go(); - else { - return Promise.resolve({status: "no-audio-context"}); - } - }; - - self.go = function () { - var millisecondsPerMeasure = self.visualObj.millisecondsPerMeasure() * 100 / self.warp; - self.currentTempo = Math.round(self.visualObj.getBeatsPerMeasure() / millisecondsPerMeasure * 60000); - if (self.control) - self.control.setTempo(self.currentTempo); - self.percent = 0; - - if (!self.midiBuffer) - self.midiBuffer = new createSynth(); - return self.midiBuffer.init({ - visualObj: self.visualObj, - options: self.options, - millisecondsPerMeasure: millisecondsPerMeasure - }).then(function () { - return self.midiBuffer.prime(); - }).then(function () { - var subdivisions = 16; - if (self.cursorControl && - self.cursorControl.beatSubdivisions !== undefined && - parseInt(self.cursorControl.beatSubdivisions, 10) >= 1 && - parseInt(self.cursorControl.beatSubdivisions, 10) <= 64) - subdivisions = parseInt(self.cursorControl.beatSubdivisions, 10); - - // Need to create the TimingCallbacks after priming the midi so that the midi data is available for the callbacks. - self.timer = new abc_timing_callbacks(self.visualObj, { - beatCallback: self.beatCallback, - eventCallback: self.eventCallback, - lineEndCallback: self.lineEndCallback, - qpm: self.currentTempo, - - extraMeasuresAtBeginning: self.cursorControl ? self.cursorControl.extraMeasuresAtBeginning : undefined, - lineEndAnticipation: self.cursorControl ? self.cursorControl.lineEndAnticipation : undefined, - beatSubdivisions: subdivisions, - }); - if (self.cursorControl && self.cursorControl.onReady && typeof self.cursorControl.onReady === 'function') - self.cursorControl.onReady(self); - self.isLoaded = true; - return Promise.resolve({ status: "created" }); - }); - }; - - self.destroy = function () { - if (self.timer) { - self.timer.reset(); - self.timer.stop(); - self.timer = null; - } - if (self.midiBuffer) { - self.midiBuffer.stop(); - self.midiBuffer = null; - } - self.setProgress(0, 1); - if (self.control) - self.control.resetAll(); - }; - - self.play = function () { - if (!self.isLoaded) { - return self.go().then(function() { - return self._play(); - }); - } else - return self._play(); - }; - - self._play = function () { - self.isStarted = !self.isStarted; - if (self.isStarted) { - if (self.cursorControl && self.cursorControl.onStart && typeof self.cursorControl.onStart === 'function') - self.cursorControl.onStart(); - self.midiBuffer.start(); - self.timer.start(); - if (self.control) - self.control.pushPlay(true); - } else { - self.pause(); - } - return Promise.resolve({ status: "ok" }); - }; - - self.pause = function() { - if (self.timer) { - self.timer.pause(); - self.midiBuffer.pause(); - if (self.control) - self.control.pushPlay(false); - } - }; - - self.toggleLoop = function () { - self.isLooping = !self.isLooping; - if (self.control) - self.control.pushLoop(self.isLooping); - }; - - self.restart = function () { - if (self.timer) { - self.timer.setProgress(0); - self.midiBuffer.seek(0); - } - }; - - self.randomAccess = function (ev) { - if (!self.isLoaded) { - return self.go().then(function() { - return self._randomAccess(ev); - }); - } else - return self._randomAccess(ev); - }; - - self._randomAccess = function (ev) { - var background = (ev.target.classList.contains('abcjs-midi-progress-indicator')) ? ev.target.parentNode : ev.target; - var percent = (ev.x - background.offsetLeft) / background.offsetWidth; - if (percent < 0) - percent = 0; - if (percent > 100) - percent = 100; - self.timer.setProgress(percent); - self.midiBuffer.seek(percent); - }; - - self.onWarp = function (ev) { - var newWarp = ev.target.value; - if (parseInt(newWarp, 10) > 0) { - self.warp = parseInt(newWarp, 10); - var wasPlaying = self.isStarted; - var startPercent = self.percent; - self.destroy(); - self.isStarted = false; - self.go().then(function () { - self.setProgress(startPercent, self.midiBuffer.duration * 1000); - if (wasPlaying) { - self.play(); - } - self.timer.setProgress(startPercent); - self.midiBuffer.seek(startPercent); - }); - } - }; - - self.setProgress = function (percent, totalTime) { - self.percent = percent; - if (self.control) - self.control.setProgress(percent, totalTime); - }; - - self.finished = function () { - self.timer.reset(); - if (self.isLooping) { - self.timer.start(); - self.midiBuffer.start(); - } else { - self.timer.stop(); - if (self.isStarted) { - if (self.control) - self.control.pushPlay(false); - self.isStarted = false; - if (self.cursorControl && self.cursorControl.onFinished && typeof self.cursorControl.onFinished === 'function') - self.cursorControl.onFinished(); - self.setProgress(0, 1); - } - } - }; - - self.beatCallback = function (beatNumber, totalBeats, totalTime) { - var percent = beatNumber / totalBeats; - self.setProgress(percent, totalTime); - if (self.cursorControl && self.cursorControl.onBeat && typeof self.cursorControl.onBeat === 'function') - self.cursorControl.onBeat(beatNumber, totalBeats, totalTime); - }; - - self.eventCallback = function (event) { - if (event) { - if (self.cursorControl && self.cursorControl.onEvent && typeof self.cursorControl.onEvent === 'function') - self.cursorControl.onEvent(event); - } else { - self.finished(); - } - }; - - self.lineEndCallback = function (data) { - if (self.cursorControl && self.cursorControl.onLineEnd && typeof self.cursorControl.onLineEnd === 'function') - self.cursorControl.onLineEnd(data); - }; - - self.getUrl = function () { - return self.midiBuffer.download(); - }; - - self.download = function(fileName) { - var url = self.getUrl(); - var link = document.createElement('a'); - document.body.appendChild(link); - link.setAttribute("style","display: none;"); - link.href = url; - link.download = fileName ? fileName : 'output.wav'; - link.click(); - window.URL.revokeObjectURL(url); - document.body.removeChild(link); - }; -} - -var synthController = SynthController; - -// abc2abc_write.js: Prints an abc file in text format parsed by abc_parse.js -// Copyright (C) 2010-2018 Gregory Dyke (gregdyke at gmail dot com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var TextPrinter = function(elem, reposition) { - this.elem = elem; - this.text = ""; - this.l = 1/8; - this.reposition = reposition || false; -}; - -TextPrinter.prototype.printString = function(str, elem) { - if (this.reposition && elem) elem.startChar = this.text.length; - this.text += str; - if (this.reposition && elem) elem.endChar = this.text.length; -}; - -TextPrinter.prototype.printNewLine = function () { - this.text += "\n"; -}; - -TextPrinter.prototype.printSpace = function () { - if (this.text[this.text.length-1].match(/\s/)) return; //TODO match whitespace - this.text += " "; -}; - -TextPrinter.prototype.printABC = function(abctune) { - this.text = ""; - this.abctune = abctune; - //TODO formatting - this.printHeader(); - this.printBody(); - this.elem.value=this.text; -}; - -TextPrinter.prototype.printHeader = function() { - // much of this info is duplicated in metaTextHEaders in abc_parse_header.js - this.printHeaderLine("x","X","1"); - this.printHeaderLine("title","T"); - this.printHeaderLine("composer","C"); - this.printHeaderLine("history","H"); - this.printHeaderLine("author","A"); - this.printHeaderLine("book","B"); - this.printHeaderLine("discography","D"); - this.printHeaderLine("url","F"); - this.printHeaderLine("group","G"); - this.printHeaderLine("instruction","I"); - this.printHeaderLine("notes","N"); - this.printHeaderLine("origin","O"); - this.printHeaderLine("rhythm","R"); - this.printHeaderLine("source","S"); - this.printHeaderLine("unalignedwords","W"); - this.printHeaderLine("transcription","Z"); - //TODO part order - //TODO Q tempo - //TODO textBlock - this.printHeaderLine("NULL","L","1/8"); //TODO L - - this.printHeaderLine("NULL","M",this.getMeterString(this.abctune.lines[0].staff[0].meter)); - this.printHeaderLine("NULL","K",this.getKeyString(this.abctune.lines[0].staff[0].key));//TODO K -}; - -TextPrinter.prototype.getKeyString = function(key) { - return key.root+key.acc+key.mode; -}; - -TextPrinter.prototype.getMeterString = function(meter) { - switch (meter.type) { - case "cut_time": return "C|"; - case "common_time": return "C"; - case "specified": - if (meter.value[0].den) - return meter.value[0].num+"/"+meter.value[0].den; - else - return meter.value[0].num; - } - return ""; -}; - -TextPrinter.prototype.printHeaderLine = function(fieldname, abcfield, defaut) { - var val = this.abctune.metaText[fieldname] || defaut; - if (val !== undefined) { - var valarray = val.split("\n"); - for (var i=0; i 1) str+="["; - for (i=0; i 1) str+="]"; - } - - if (elem.pitches.length === 1 && elem.pitches[0].endSlur) { - str+=this.multiplyString(")",elem.pitches[0].endSlur.length); - } - - if (elem.endSlur) { - str+=this.multiplyString(")",elem.endSlur.length); - } - - this.printString(str,elem); - -}; - -// accidentals, ties and sometimes slurs, sometimes duration -TextPrinter.prototype.getNoteString = function(pitchelem, ignoreslur) { - var str = ""; - if (!ignoreslur && pitchelem.startSlur) { - str+="("; - } - - var symb = ""; - switch (pitchelem.accidental) { - case "quartersharp": - symb = "^/"; - break; - case "dblsharp": - symb = "^^"; - break; - case "sharp": - symb = "^"; - break; - case "quarterflat": - symb = "_/"; - break; - case "flat": - symb = "_"; - break; - case "dblflat": - symb = "__"; - break; - case "natural": - symb = "="; - } - str+=symb; - - var pitches = ["C","D","E","F","G","A","B"]; - var pitchstr = pitches[this.extractNote(pitchelem.pitch)]; - var octave = this.extractOctave(pitchelem.pitch); - if (octave>0) { - pitchstr = pitchstr.toLowerCase(); - octave--; - while (octave>0) { - pitchstr+="'"; - octave--; - } - } else { - while (octave<0) { - pitchstr+=","; - octave++; - } - } - - str+=pitchstr; - - if (pitchelem.duration) { - str+=this.getDurationString(pitchelem.duration); - } - - if (!ignoreslur && pitchelem.endSlur) { - str+=")"; - } - - if (pitchelem.startTie) { - str+="-"; - } - - return str; -}; - -TextPrinter.prototype.getDurationString = function(duration) { - //TODO detect crooked rhythm - if (duration/this.l > 1) { - return duration/this.l; - } - var ret = ""; - if (this.l/duration>1) { - ret+="/"; - if (this.l/duration>2) { - ret+=this.l/duration; - } - } - return ret; -}; - -TextPrinter.prototype.extractNote = function(pitch) { - var pitch2 = pitch%7; - if (pitch2<0) pitch2+=7; - return pitch2; -}; - -TextPrinter.prototype.extractOctave = function(pitch) { - return Math.floor(pitch/7); -}; - -TextPrinter.prototype.printBarLine = function(elem) { - var barstr = ""; - switch (elem.type) { - case "bar_thin": barstr+="|"; break; - case "bar_thin_thick": barstr+="|]"; break; - case "bar_thin_thin": barstr+="||"; break; - case "bar_thick_thin": barstr+="[|"; break; - case "bar_dbl_repeat": barstr+=":||:"; break; - case "bar_left_repeat": barstr+="|:"; break; - case "bar_right_repeat": barstr+=":|"; break; - case "bar_invisible": barstr+=""; break; - } - this.printString(barstr,elem); -}; - -TextPrinter.prototype.multiplyString = function (s, n) { - var ret = ""; - for (;n>0;n--) ret+=s; - return ret; -}; - -var abc2abc_write = TextPrinter; - -// abc_editor.js -// window.ABCJS.Editor is the interface class for the area that contains the ABC text. It is responsible for -// holding the text of the tune and calling the parser and the rendering engines. -// -// EditArea is an example of using a textarea as the control that is shown to the user. As long as -// the same interface is used, window.ABCJS.Editor can use a different type of object. -// -// EditArea: -// - constructor(textareaid) -// This contains the id of a textarea control that will be used. -// - addSelectionListener(listener) -// A callback class that contains the entry point fireSelectionChanged() -// - addChangeListener(listener) -// A callback class that contains the entry point fireChanged() -// - getSelection() -// returns the object { start: , end: } with the current selection in characters -// - setSelection(start, end) -// start and end are the character positions that should be selected. -// - getString() -// returns the ABC text that is currently displayed. -// - setString(str) -// sets the ABC text that is currently displayed, and resets the initialText variable -// - getElem() -// returns the textarea element -// - string initialText -// Contains the starting text. This can be compared against the current text to see if anything changed. -// - -/*global document, window, clearTimeout, setTimeout */ - -var TuneBook = abc_tunebook.TuneBook; - - - - - - - -// Polyfill for CustomEvent for old IE versions -if ( typeof window.CustomEvent !== "function" ) { - var CustomEvent = function(event, params) { - params = params || {bubbles: false, cancelable: false, detail: undefined}; - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); - return evt; - }; - CustomEvent.prototype = window.Event.prototype; - window.CustomEvent = CustomEvent; -} - -var EditArea = function(textareaid) { - this.textarea = document.getElementById(textareaid); - this.initialText = this.textarea.value; - this.isDragging = false; -}; - -EditArea.prototype.addSelectionListener = function(listener) { - this.textarea.onmousemove = function(ev) { - if (this.isDragging) - listener.fireSelectionChanged(); - }; -}; - -EditArea.prototype.addChangeListener = function(listener) { - this.changelistener = listener; - this.textarea.onkeyup = function() { - listener.fireChanged(); - }; - this.textarea.onmousedown = function() { - this.isDragging = true; - listener.fireSelectionChanged(); - }; - this.textarea.onmouseup = function() { - this.isDragging = false; - listener.fireChanged(); - }; - this.textarea.onchange = function() { - listener.fireChanged(); - }; -}; - -//TODO won't work under IE? -EditArea.prototype.getSelection = function() { - return {start: this.textarea.selectionStart, end: this.textarea.selectionEnd}; -}; - -EditArea.prototype.setSelection = function(start, end) { - if(this.textarea.setSelectionRange) - this.textarea.setSelectionRange(start, end); - else if(this.textarea.createTextRange) { - // For IE8 - var e = this.textarea.createTextRange(); - e.collapse(true); - e.moveEnd('character', end); - e.moveStart('character', start); - e.select(); - } - this.textarea.focus(); -}; - -EditArea.prototype.getString = function() { - return this.textarea.value; -}; - -EditArea.prototype.setString = function(str) { - this.textarea.value = str; - this.initialText = this.getString(); - if (this.changelistener) { - this.changelistener.fireChanged(); - } -}; - -EditArea.prototype.getElem = function() { - return this.textarea; -}; - -// -// window.ABCJS.Editor: -// -// constructor(editarea, params) -// if editarea is a string, then it is an HTML id of a textarea control. -// Otherwise, it should be an instantiation of an object that expresses the EditArea interface. -// -// params is a hash of: -// canvas_id: or paper_id: HTML id to draw in. If not present, then the drawing happens just below the editor. -// generate_midi: if present, then midi is generated. -// midi_id: if present, the HTML id to place the midi control. Otherwise it is placed in the same div as the paper. -// midi_download_id: if present, the HTML id to place the midi download link. Otherwise it is placed in the same div as the paper. -// generate_warnings: if present, then parser warnings are displayed on the page. -// warnings_id: if present, the HTML id to place the warnings. Otherwise they are placed in the same div as the paper. -// onchange: if present, the callback function to call whenever there has been a change. -// gui: if present, the paper can send changes back to the editor (presumably because the user changed something directly.) -// parser_options: options to send to the parser engine. -// midi_options: options to send to the midi engine. -// render_options: options to send to the render engine. -// indicate_changed: the dirty flag is set if this is true. -// -// - setReadOnly(bool) -// adds or removes the class abc_textarea_readonly, and adds or removes the attribute readonly=yes -// - setDirtyStyle(bool) -// adds or removes the class abc_textarea_dirty -// - renderTune(abc, parserparams, div) -// Immediately renders the tune. (Useful for creating the SVG output behind the scenes, if div is hidden) -// string abc: the ABC text -// parserparams: params to send to the parser -// div: the HTML id to render to. -// - modelChanged() -// Called when the model has been changed to trigger re-rendering -// - parseABC() -// Called internally by fireChanged() -// returns true if there has been a change since last call. -// - updateSelection() -// Called when the user has changed the selection. This calls the engraver_controller to show the selection. -// - fireSelectionChanged() -// Called by the textarea object when the user has changed the selection. -// - paramChanged(engraverparams) -// Called to signal that the engraver params have changed, so re-rendering should occur. -// - fireChanged() -// Called by the textarea object when the user has changed something. -// - setNotDirty() -// Called by the client app to reset the dirty flag -// - isDirty() -// Returns true or false, whether the textarea contains the same text that it started with. -// - highlight(abcelem) -// Called by the engraver_controller to highlight an area. -// - pause(bool) -// Stops the automatic rendering when the user is typing. -// - -var Editor = function(editarea, params) { - // Copy all the options that will be passed through - this.abcjsParams = {}; - var key; - if (params.abcjsParams) { - for (key in params.abcjsParams) { - if (params.abcjsParams.hasOwnProperty(key)) { - this.abcjsParams[key] = params.abcjsParams[key]; - } - } - } - if (params.midi_options) { - for (key in params.midi_options) { - if (params.midi_options.hasOwnProperty(key)) { - this.abcjsParams[key] = params.midi_options[key]; - } - } - } - if (params.parser_options) { - for (key in params.parser_options) { - if (params.parser_options.hasOwnProperty(key)) { - this.abcjsParams[key] = params.parser_options[key]; - } - } - } - if (params.render_options) { - for (key in params.render_options) { - if (params.render_options.hasOwnProperty(key)) { - this.abcjsParams[key] = params.render_options[key]; - } - } - } - - if (params.indicate_changed) - this.indicate_changed = true; - if (typeof editarea === "string") { - this.editarea = new EditArea(editarea); - } else { - this.editarea = editarea; - } - this.editarea.addSelectionListener(this); - this.editarea.addChangeListener(this); - - if (params.canvas_id) { - this.div = document.getElementById(params.canvas_id); - } else if (params.paper_id) { - this.div = document.getElementById(params.paper_id); - } else { - this.div = document.createElement("DIV"); - this.editarea.getElem().parentNode.insertBefore(this.div, this.editarea.getElem()); - } - - if (params.selectionChangeCallback) { - this.selectionChangeCallback = params.selectionChangeCallback; - } - - if (params.synth) { - if (supportsAudio_1()) { - this.synth = { - el: params.synth.el, - cursorControl: params.synth.cursorControl, - options: params.synth.options - }; - } - } - // If the user wants midi, then store the elements that it will be written to. The element could either be passed in as an id, - // an element, or nothing. If nothing is passed in, then just put the midi on top of the generated music. - if (params.generate_midi) { - this.generate_midi = params.generate_midi; - if (this.abcjsParams.generateDownload) { - if (typeof params.midi_download_id === 'string') - this.downloadMidi = document.getElementById(params.midi_download_id); - else if (params.midi_download_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough. - this.downloadMidi = params.midi_download_id; - } - if (this.abcjsParams.generateInline !== false) { // The default for this is true, so undefined is also true. - if (typeof params.midi_id === 'string') - this.inlineMidi = document.getElementById(params.midi_id); - else if (params.midi_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough. - this.inlineMidi = params.midi_id; - } - } - - if (params.generate_warnings || params.warnings_id) { - if (params.warnings_id) { - this.warningsdiv = document.getElementById(params.warnings_id); - } else { - this.warningsdiv = this.div; - } - } - - this.onchangeCallback = params.onchange; - - if (params.gui) { - this.target = document.getElementById(editarea); - this.abcjsParams.editable = true; - } - this.oldt = ""; - this.bReentry = false; - this.parseABC(); - this.modelChanged(); - - this.addClassName = function(element, className) { - var hasClassName = function(element, className) { - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName === className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }; - - if (!hasClassName(element, className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }; - - this.removeClassName = function(element, className) { - element.className = abc_common.strip(element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ')); - return element; - }; - - this.setReadOnly = function(readOnly) { - var readonlyClass = 'abc_textarea_readonly'; - var el = this.editarea.getElem(); - if (readOnly) { - el.setAttribute('readonly', 'yes'); - this.addClassName(el, readonlyClass); - } else { - el.removeAttribute('readonly'); - this.removeClassName(el, readonlyClass); - } - }; -}; - -Editor.prototype.renderTune = function(abc, params, div) { - var tunebook = new TuneBook(abc); - var abcParser = abc_parse(); - abcParser.parse(tunebook.tunes[0].abc, params, tunebook.tunes[0].startPos - tunebook.header.length); //TODO handle multiple tunes - var tune = abcParser.getTune(); - var engraver_controller = new abc_engraver_controller(div, this.abcjsParams); - engraver_controller.engraveABC(tune); -}; - -Editor.prototype.redrawMidi = function() { - if (this.generate_midi && !this.midiPause) { - var event = new window.CustomEvent("generateMidi", { - detail: { - tunes: this.tunes, - abcjsParams: this.abcjsParams, - downloadMidiEl: this.downloadMidi, - inlineMidiEl: this.inlineMidi, - engravingEl: this.div - } - }); - window.dispatchEvent(event); - } - if (this.synth) { - if (!this.synth.synthControl) { - this.synth.synthControl = new synthController(); - this.synth.synthControl.load(this.synth.el, this.synth.cursorControl, this.synth.options); - } - this.synth.synthControl.setTune(this.tunes[0], false); - } -}; - -Editor.prototype.modelChanged = function() { - if (this.tunes === undefined) { - if (this.downloadMidi !== undefined) - this.downloadMidi.innerHTML = ""; - if (this.inlineMidi !== undefined) - this.inlineMidi.innerHTML = ""; - this.div.innerHTML = ""; - return; - } - - if (this.bReentry) - return; // TODO is this likely? maybe, if we rewrite abc immediately w/ abc2abc - this.bReentry = true; - this.timerId = null; - this.div.innerHTML = ""; - this.engraver_controller = new abc_engraver_controller(this.div, this.abcjsParams); - this.engraver_controller.engraveABC(this.tunes); - this.tunes[0].engraver = this.engraver_controller; // TODO-PER: We actually want an output object for each tune, not the entire controller. When refactoring, don't save data in the controller. - this.redrawMidi(); - - if (this.warningsdiv) { - this.warningsdiv.innerHTML = (this.warnings) ? this.warnings.join("
") : "No errors"; - } - if (this.target) { - var textprinter = new abc2abc_write(this.target, true); - textprinter.printABC(this.tunes[0]); //TODO handle multiple tunes - } - this.engraver_controller.addSelectListener(this.highlight.bind(this)); - this.updateSelection(); - this.bReentry = false; -}; - -// Call this to reparse in response to the printing parameters changing -Editor.prototype.paramChanged = function(engraverParams) { - if (engraverParams) { - for (var key in engraverParams) { - if (engraverParams.hasOwnProperty(key)) { - this.abcjsParams[key] = engraverParams[key]; - } - } - } - this.oldt = ""; - this.fireChanged(); -}; - -// return true if the model has changed -Editor.prototype.parseABC = function() { - var t = this.editarea.getString(); - if (t===this.oldt) { - this.updateSelection(); - return false; - } - - this.oldt = t; - if (t === "") { - this.tunes = undefined; - this.warnings = ""; - return true; - } - var tunebook = new TuneBook(t); - - this.tunes = []; - this.startPos = []; - this.warnings = []; - for (var i=0; i 0 && (elementClassName === className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }; - - if (!hasClassName(element, className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }; - - var removeClassName = function(element, className) { - element.className = abc_common.strip(element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ')); - return element; - }; - - var readonlyClass = 'abc_textarea_dirty'; - var el = this.editarea.getElem(); - if (isDirty) { - addClassName(el, readonlyClass); - } else { - removeClassName(el, readonlyClass); - } -}; - -// call when abc text is changed and needs re-parsing -Editor.prototype.fireChanged = function() { - if (this.bIsPaused) - return; - if (this.parseABC()) { - var self = this; - if (this.timerId) // If the user is still typing, cancel the update - clearTimeout(this.timerId); - this.timerId = setTimeout(function () { - self.modelChanged(); - }, 300); // Is this a good compromise between responsiveness and not redrawing too much? - var isDirty = this.isDirty(); - if (this.wasDirty !== isDirty) { - this.wasDirty = isDirty; - this.setDirtyStyle(isDirty); - } - if (this.onchangeCallback) - this.onchangeCallback(this); - } -}; - -Editor.prototype.setNotDirty = function() { - this.editarea.initialText = this.editarea.getString(); - this.wasDirty = false; - this.setDirtyStyle(false); -}; - -Editor.prototype.isDirty = function() { - if (this.indicate_changed === undefined) - return false; - return this.editarea.initialText !== this.editarea.getString(); -}; - -Editor.prototype.highlight = function(abcelem, tuneNumber, classes) { - // TODO-PER: The marker appears to get off by one for each tune parsed. I'm not sure why, but adding the tuneNumber in corrects it for the time being. -// var offset = (tuneNumber !== undefined) ? this.startPos[tuneNumber] + tuneNumber : 0; - - this.editarea.setSelection(abcelem.startChar, abcelem.endChar); - if (this.selectionChangeCallback) - this.selectionChangeCallback(abcelem.startChar, abcelem.endChar); -}; - -Editor.prototype.pause = function(shouldPause) { - this.bIsPaused = shouldPause; - if (!shouldPause) - this.fireChanged(); -}; - -Editor.prototype.millisecondsPerMeasure = function() { - return this.synth.synthControl.visualObj.millisecondsPerMeasure(); -}; - -Editor.prototype.pauseMidi = function(shouldPause) { - this.midiPause = shouldPause; - if (!shouldPause) - this.redrawMidi(); -}; - -var abc_editor = Editor; - -var abcjs = {}; - -abcjs.signature = "abcjs-basic v" + version_1; - -Object.keys(abc_animation).forEach(function (key) { - abcjs[key] = abc_animation[key]; -}); - -Object.keys(abc_tunebook).forEach(function (key) { - abcjs[key] = abc_tunebook[key]; -}); - -abcjs.renderAbc = abc_tunebook_svg; -abcjs.TimingCallbacks = abc_timing_callbacks; - - -abcjs.setGlyph = abc_glyphs.setSymbol; - - - - - - - - - - - - -abcjs.synth = { - CreateSynth: createSynth, - instrumentIndexToName: instrumentIndexToName_1, - pitchToNoteName: pitchToNoteName_1, - SynthController: synthController, - SynthSequence: synthSequence, - CreateSynthControl: createSynthControl, - registerAudioContext: registerAudioContext_1, - activeAudioContext: activeAudioContext_1, - supportsAudio: supportsAudio_1, - playEvent: playEvent_1 -}; - - -abcjs['Editor'] = abc_editor; - -var abcjs_1 = abcjs; - -var MusicPlugin = /** @class */ (function (_super) { - __extends(MusicPlugin, _super); - function MusicPlugin() { - return _super !== null && _super.apply(this, arguments) || this; - } - MusicPlugin.prototype.onload = function () { - console.log('loading abcjs plugin'); - obsidian.MarkdownPreviewRenderer.registerPostProcessor(MusicPlugin.postprocessor); - }; - MusicPlugin.prototype.onunload = function () { - console.log('unloading abcjs plugin'); - obsidian.MarkdownPreviewRenderer.unregisterPostProcessor(MusicPlugin.postprocessor); - }; - MusicPlugin.postprocessor = function (el, ctx) { - // Assumption: One section always contains only the code block - var blockToReplace = el.querySelector('pre'); - if (!blockToReplace) - return; - var musicBlock = blockToReplace.querySelector('code.language-music-abc'); - if (!musicBlock) - return; - var source = musicBlock.textContent; - var destination = document.createElement('div'); - abcjs_1.renderAbc(destination, source, { - add_classes: true, - responsive: 'resize' - }); - el.replaceChild(destination, blockToReplace); - }; - return MusicPlugin; -}(obsidian.Plugin)); - -module.exports = MusicPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy92ZXJzaW9uLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfc3BhY2luZy5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvYXBpL2FiY190aW1pbmdfY2FsbGJhY2tzLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9hcGkvYWJjX2FuaW1hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3BhcnNlX2RpcmVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3RyYW5zcG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3BhcnNlX2tleV92b2ljZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3BhcnNlX2hlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3Rva2VuaXplci5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2Uvd3JhcF9saW5lcy5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvZGF0YS9hYmNfdHVuZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvcGFyc2UvYWJjX3BhcnNlLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9hcGkvYWJjX3R1bmVib29rLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfYWJzb2x1dGVfZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX3JlbGF0aXZlX2VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19iZWFtX2VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19icmFjZV9lbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfZ2x5cGhzLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfY3JlYXRlX2NsZWYuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19jcmVhdGVfa2V5X3NpZ25hdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX2NyZWF0ZV90aW1lX3NpZ25hdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX2R5bmFtaWNfZGVjb3JhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvc3ByaW50Zi5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX2NyZXNjZW5kb19lbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfdGllX2VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19kZWNvcmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfZW5kaW5nX2VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19zdGFmZl9ncm91cF9lbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfdGVtcG9fZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX3RyaXBsZXRfZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvYWJjX3ZvaWNlX2VsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19hYnN0cmFjdF9lbmdyYXZlci5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvd3JpdGUvc3ZnLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy93cml0ZS9hYmNfcmVuZGVyZXIuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3dyaXRlL2FiY19lbmdyYXZlcl9jb250cm9sbGVyLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9hcGkvYWJjX3R1bmVib29rX3N2Zy5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvc3ludGgvc291bmRzLWNhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9zeW50aC9sb2FkLW5vdGUuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3N5bnRoL2luc3RydW1lbnQtaW5kZXgtdG8tbmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvc3ludGgvY3JlYXRlLW5vdGUtbWFwLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9zeW50aC9yZWdpc3Rlci1hdWRpby1jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9zeW50aC9hY3RpdmUtYXVkaW8tY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvc3ludGgvc3VwcG9ydHMtYXVkaW8uanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3N5bnRoL3BpdGNoLXRvLW5vdGUtbmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvc3ludGgvZG93bmxvYWQtYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9taWRpL2FiY19taWRpX3NlcXVlbmNlci5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvbWlkaS9hYmNfbWlkaV9mbGF0dGVuZXIuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3N5bnRoL2NyZWF0ZS1zeW50aC5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvc3ludGgvc3ludGgtc2VxdWVuY2UuanMiLCJub2RlX21vZHVsZXMvYWJjanMvc3JjL3N5bnRoL2NyZWF0ZS1zeW50aC1jb250cm9sLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9zeW50aC9wbGF5LWV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy9zeW50aC9zeW50aC1jb250cm9sbGVyLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL3NyYy90cmFuc2Zvcm0vYWJjMmFiY193cml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9hYmNqcy9zcmMvZWRpdC9hYmNfZWRpdG9yLmpzIiwibm9kZV9tb2R1bGVzL2FiY2pzL2luZGV4LmpzIiwibWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG4iLCJ2YXIgdmVyc2lvbiA9ICc1LjEyLjAnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCIvLyAgICBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBzcGFjaW5nID0ge307XG5cbnNwYWNpbmcuRk9OVEVNID0gMzYwO1xuc3BhY2luZy5GT05UU0laRSA9IDMwO1xuc3BhY2luZy5TVEVQID0gc3BhY2luZy5GT05UU0laRSo5My83MjA7XG5zcGFjaW5nLlNQQUNFID0gMTA7XG5zcGFjaW5nLlRPUE5PVEUgPSAxNTtcbnNwYWNpbmcuU1RBVkVIRUlHSFQgPSAxMDA7XG5zcGFjaW5nLklOREVOVCA9IDUwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNwYWNpbmc7XG4iLCIvLyAgICBhYmNfcGFyc2UuanM6IHBhcnNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgQUJDIE11c2ljIE5vdGF0aW9uIGludG8gYSB1c2FibGUgaW50ZXJuYWwgc3RydWN0dXJlLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggUGF1bCBSb3NlbiAocGF1bCBhdCBwYXVscm9zZW4gZG90IG5ldClcbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHBhcnNlQ29tbW9uID0ge307XG5cbnBhcnNlQ29tbW9uLmNsb25lID0gZnVuY3Rpb24oc291cmNlKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IHt9O1xuXHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpXG5cdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG5cdFx0XHRkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldO1xuXHRyZXR1cm4gZGVzdGluYXRpb247XG59O1xuXG5wYXJzZUNvbW1vbi5jbG9uZUFycmF5ID0gZnVuY3Rpb24oc291cmNlKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IFtdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuXHRcdGRlc3RpbmF0aW9uLnB1c2gocGFyc2VDb21tb24uY2xvbmUoc291cmNlW2ldKSk7XG5cdH1cblx0cmV0dXJuIGRlc3RpbmF0aW9uO1xufTtcblxucGFyc2VDb21tb24uY2xvbmVIYXNoT2ZIYXNoID0gZnVuY3Rpb24oc291cmNlKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IHt9O1xuXHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpXG5cdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG5cdFx0XHRkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBwYXJzZUNvbW1vbi5jbG9uZShzb3VyY2VbcHJvcGVydHldKTtcblx0cmV0dXJuIGRlc3RpbmF0aW9uO1xufTtcblxucGFyc2VDb21tb24uY2xvbmVIYXNoT2ZBcnJheU9mSGFzaCA9IGZ1bmN0aW9uKHNvdXJjZSkge1xuXHR2YXIgZGVzdGluYXRpb24gPSB7fTtcblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gc291cmNlKVxuXHRcdGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuXHRcdFx0ZGVzdGluYXRpb25bcHJvcGVydHldID0gcGFyc2VDb21tb24uY2xvbmVBcnJheShzb3VyY2VbcHJvcGVydHldKTtcblx0cmV0dXJuIGRlc3RpbmF0aW9uO1xufTtcblxucGFyc2VDb21tb24uZ3N1YiA9IGZ1bmN0aW9uKHNvdXJjZSwgcGF0dGVybiwgcmVwbGFjZW1lbnQpIHtcblx0cmV0dXJuIHNvdXJjZS5zcGxpdChwYXR0ZXJuKS5qb2luKHJlcGxhY2VtZW50KTtcbn07XG5cbnBhcnNlQ29tbW9uLnN0cmlwID0gZnVuY3Rpb24oc3RyKSB7XG5cdHJldHVybiBzdHIucmVwbGFjZSgvXlxccysvLCAnJykucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG59O1xuXG5wYXJzZUNvbW1vbi5zdGFydHNXaXRoID0gZnVuY3Rpb24oc3RyLCBwYXR0ZXJuKSB7XG5cdHJldHVybiBzdHIuaW5kZXhPZihwYXR0ZXJuKSA9PT0gMDtcbn07XG5cbnBhcnNlQ29tbW9uLmVuZHNXaXRoID0gZnVuY3Rpb24oc3RyLCBwYXR0ZXJuKSB7XG5cdHZhciBkID0gc3RyLmxlbmd0aCAtIHBhdHRlcm4ubGVuZ3RoO1xuXHRyZXR1cm4gZCA+PSAwICYmIHN0ci5sYXN0SW5kZXhPZihwYXR0ZXJuKSA9PT0gZDtcbn07XG5cbnBhcnNlQ29tbW9uLmVhY2ggPSBmdW5jdGlvbihhcnIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG5cdGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcnIubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspXG5cdCAgaXRlcmF0b3IuYXBwbHkoY29udGV4dCwgW2FycltpXSxpXSk7XG59O1xuXG5wYXJzZUNvbW1vbi5sYXN0ID0gZnVuY3Rpb24oYXJyKSB7XG5cdGlmIChhcnIubGVuZ3RoID09PSAwKVxuXHRcdHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXJyW2Fyci5sZW5ndGgtMV07XG59O1xuXG5wYXJzZUNvbW1vbi5jb21wYWN0ID0gZnVuY3Rpb24oYXJyKSB7XG5cdHZhciBvdXRwdXQgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoYXJyW2ldKVxuXHRcdFx0b3V0cHV0LnB1c2goYXJyW2ldKTtcblx0fVxuXHRyZXR1cm4gb3V0cHV0O1xufTtcblxucGFyc2VDb21tb24uZGV0ZWN0ID0gZnVuY3Rpb24oYXJyLCBpdGVyYXRvcikge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpdGVyYXRvcihhcnJbaV0pKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuLy8gVGhlIGZvbGxvd2luZyBpcyBhIHBvbHlmaWxsIGZvciBPYmplY3QucmVtb3ZlIGZvciBJRTksIElFMTAsIGFuZCBJRTExLlxuLy8gZnJvbTpodHRwczovL2dpdGh1Yi5jb20vanNlcnovanNfcGllY2UvYmxvYi9tYXN0ZXIvRE9NL0NoaWxkTm9kZS9yZW1vdmUoKS9yZW1vdmUoKS5tZFxuKGZ1bmN0aW9uIChhcnIpIHtcblx0YXJyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRpZiAoaXRlbS5oYXNPd25Qcm9wZXJ0eSgncmVtb3ZlJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW0sICdyZW1vdmUnLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuXHRcdFx0XHRpZiAodGhpcy5wYXJlbnROb2RlICE9PSBudWxsKVxuXHRcdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59KShbRWxlbWVudC5wcm90b3R5cGUsIENoYXJhY3RlckRhdGEucHJvdG90eXBlLCBEb2N1bWVudFR5cGUucHJvdG90eXBlXSk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VDb21tb247XG4iLCJcbnZhciBUaW1pbmdDYWxsYmFja3MgPSBmdW5jdGlvbih0YXJnZXQsIHBhcmFtcykge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGlmICghcGFyYW1zKSBwYXJhbXMgPSB7fTtcblx0c2VsZi5xcG0gPSBwYXJhbXMucXBtID8gcGFyc2VJbnQocGFyYW1zLnFwbSwgMTApIDogbnVsbDtcblx0aWYgKCFzZWxmLnFwbSkge1xuXHRcdHZhciB0ZW1wbyA9IHRhcmdldC5tZXRhVGV4dCA/IHRhcmdldC5tZXRhVGV4dC50ZW1wbyA6IG51bGw7XG5cdFx0c2VsZi5xcG0gPSB0YXJnZXQuZ2V0QnBtKHRlbXBvKTtcblx0fVxuXHRzZWxmLmV4dHJhTWVhc3VyZXNBdEJlZ2lubmluZyA9IHBhcmFtcy5leHRyYU1lYXN1cmVzQXRCZWdpbm5pbmcgPyBwYXJzZUludChwYXJhbXMuZXh0cmFNZWFzdXJlc0F0QmVnaW5uaW5nLCAxMCkgOiAwO1xuXHRzZWxmLmJlYXRDYWxsYmFjayA9IHBhcmFtcy5iZWF0Q2FsbGJhY2s7IC8vIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIGJlYXQuXG5cdHNlbGYuZXZlbnRDYWxsYmFjayA9IHBhcmFtcy5ldmVudENhbGxiYWNrOyAgIC8vIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIG5vdGUgb3IgcmVzdCBlbmNvdW50ZXJlZC5cblx0c2VsZi5saW5lRW5kQ2FsbGJhY2sgPSBwYXJhbXMubGluZUVuZENhbGxiYWNrOyAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGVuZCBvZiBhIGxpbmUgaXMgYXBwcm9hY2hpbmcuXG5cdHNlbGYubGluZUVuZEFudGljaXBhdGlvbiA9IHBhcmFtcy5saW5lRW5kQW50aWNpcGF0aW9uID8gcGFyc2VJbnQocGFyYW1zLmxpbmVFbmRBbnRpY2lwYXRpb24sIDEwKSA6IDA7ICAgLy8gSG93IG1hbnkgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgZW5kIHNob3VsZCB0aGUgY2FsbCBoYXBwZW4uXG5cdHNlbGYuYmVhdFN1YmRpdmlzaW9ucyA9IHBhcmFtcy5iZWF0U3ViZGl2aXNpb25zID8gcGFyc2VJbnQocGFyYW1zLmJlYXRTdWJkaXZpc2lvbnMsIDEwKSA6IDE7IC8vIGhvdyBtYW55IGNhbGxiYWNrcyBwZXIgYmVhdCBpcyBkZXNpcmVkLlxuXG5cdHNlbGYucmVwbGFjZVRhcmdldCA9IGZ1bmN0aW9uKG5ld1RhcmdldCkge1xuXHRcdG5ld1RhcmdldC5zZXRUaW1pbmcoc2VsZi5xcG0sIHNlbGYuZXh0cmFNZWFzdXJlc0F0QmVnaW5uaW5nKTtcblx0XHRpZiAobmV3VGFyZ2V0Lm5vdGVUaW1pbmdzLmxlbmd0aCA9PT0gMClcblx0XHRcdG5ld1RhcmdldC5zZXRUaW1pbmcoMCwwKTtcblx0XHRpZiAoc2VsZi5saW5lRW5kQ2FsbGJhY2spIHtcblx0XHRcdHNlbGYubGluZUVuZFRpbWluZ3MgPSBnZXRMaW5lRW5kVGltaW5ncyhuZXdUYXJnZXQubm90ZVRpbWluZ3MsIHNlbGYubGluZUVuZEFudGljaXBhdGlvbik7XG5cdFx0fVxuXHRcdHNlbGYubm90ZVRpbWluZ3MgPSBuZXdUYXJnZXQubm90ZVRpbWluZ3M7XG5cdH07XG5cblx0c2VsZi5yZXBsYWNlVGFyZ2V0KHRhcmdldCk7XG5cdGlmIChzZWxmLm5vdGVUaW1pbmdzLmxlbmd0aCA9PT0gMClcblx0XHRyZXR1cm47XG5cblx0Ly8gbm90ZVRpbWluZ3MgY29udGFpbnMgYW4gYXJyYXkgb2YgZXZlbnRzIHNvcnRlZCBieSB0aW1lLiBFdmVudHMgdGhhdCBoYXBwZW4gYXQgdGhlIHNhbWUgdGltZSBhcmUgaW4gdGhlIHNhbWUgZWxlbWVudCBvZiB0aGUgYXJyYXkuXG5cdHNlbGYubm90ZVRpbWluZ3MgPSB0YXJnZXQubm90ZVRpbWluZ3M7XG5cdHNlbGYubWlsbGlzZWNvbmRzUGVyQmVhdCA9IDEwMDAgLyAoc2VsZi5xcG0gLyA2MCkgLyBzZWxmLmJlYXRTdWJkaXZpc2lvbnM7XG5cdHNlbGYubGFzdE1vbWVudCA9IHNlbGYubm90ZVRpbWluZ3Nbc2VsZi5ub3RlVGltaW5ncy5sZW5ndGgtMV0ubWlsbGlzZWNvbmRzO1xuXHRzZWxmLnRvdGFsQmVhdHMgPSBNYXRoLnJvdW5kKHNlbGYubGFzdE1vbWVudCAvIHNlbGYubWlsbGlzZWNvbmRzUGVyQmVhdCk7XG5cblx0c2VsZi5zdGFydFRpbWUgPSBudWxsO1xuXHRzZWxmLmN1cnJlbnRCZWF0ID0gMDtcblx0c2VsZi5jdXJyZW50RXZlbnQgPSAwO1xuXHRzZWxmLmlzUGF1c2VkID0gZmFsc2U7XG5cdHNlbGYuaXNSdW5uaW5nID0gZmFsc2U7XG5cdHNlbGYucGF1c2VkVGltZSA9IG51bGw7XG5cdHNlbGYuanVzdFVucGF1c2VkID0gZmFsc2U7XG5cblx0c2VsZi5uZXdTZWVrUGVyY2VudCA9IDA7XG5cdHNlbGYuanVzdFNlZWtlZCA9IGZhbHNlO1xuXG5cdGZ1bmN0aW9uIHNldEN1cnJlbnRMb2NhdGlvbih0aW1lc3RhbXApIHtcblx0XHQvLyBGaXJzdCBmaW5kIHRoZSByZWxhdGl2ZSBhbW91bnQgdG8gbW92ZTogdGhhdCBpcywgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBwZXJjZW50YWdlIGFuZCB0aGUgcGFzc2VkIGluIHBlcmNlbnQuXG5cdFx0dmFyIGN1cnJlbnRQZXJjZW50ID0gKHRpbWVzdGFtcCAtIHNlbGYuc3RhcnRUaW1lKSAvIHNlbGYubGFzdE1vbWVudDtcblx0XHR2YXIgcGVyY2VudERpZmZlcmVuY2UgPSBjdXJyZW50UGVyY2VudCAtIHNlbGYubmV3U2Vla1BlcmNlbnQ7XG5cdFx0dmFyIHRpbWVEaWZmZXJlbmNlID0gc2VsZi5sYXN0TW9tZW50ICogcGVyY2VudERpZmZlcmVuY2U7XG5cdFx0c2VsZi5zdGFydFRpbWUgPSBzZWxmLnN0YXJ0VGltZSArIHRpbWVEaWZmZXJlbmNlO1xuXG5cdFx0dmFyIGN1cnJlbnRUaW1lID0gdGltZXN0YW1wIC0gc2VsZi5zdGFydFRpbWU7XG5cdFx0Y3VycmVudFRpbWUgKz0gNTA7IC8vIEFkZCBhIGxpdHRsZSBzbG9wIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgZXhhY3RseS5cblxuXHRcdHZhciBvbGRCZWF0ID0gc2VsZi5jdXJyZW50QmVhdDtcblx0XHRzZWxmLmN1cnJlbnRCZWF0ID0gTWF0aC5mbG9vcihjdXJyZW50VGltZSAvIHNlbGYubWlsbGlzZWNvbmRzUGVyQmVhdCk7XG5cdFx0aWYgKHNlbGYuYmVhdENhbGxiYWNrICYmIG9sZEJlYXQgIT09IHNlbGYuY3VycmVudEJlYXQpIC8vIElmIHRoZSBtb3ZlbWVudCBjYXVzZWQgdGhlIGJlYXQgdG8gY2hhbmdlLCB0aGVuIGltbWVkaWF0ZWx5IHJlcG9ydCBpdCB0byB0aGUgY2xpZW50LlxuXHRcdFx0c2VsZi5iZWF0Q2FsbGJhY2soc2VsZi5jdXJyZW50QmVhdCAvIHNlbGYuYmVhdFN1YmRpdmlzaW9ucywgc2VsZi50b3RhbEJlYXRzIC8gc2VsZi5iZWF0U3ViZGl2aXNpb25zLCBzZWxmLmxhc3RNb21lbnQpO1xuXG5cdFx0c2VsZi5jdXJyZW50RXZlbnQgPSAwO1xuXHRcdHdoaWxlIChzZWxmLm5vdGVUaW1pbmdzLmxlbmd0aCA+IHNlbGYuY3VycmVudEV2ZW50ICYmIHNlbGYubm90ZVRpbWluZ3Nbc2VsZi5jdXJyZW50RXZlbnRdLm1pbGxpc2Vjb25kcyA8IGN1cnJlbnRUaW1lKSB7XG5cdFx0XHRzZWxmLmN1cnJlbnRFdmVudCsrO1xuXHRcdH1cblx0XHRpZiAoc2VsZi5ldmVudENhbGxiYWNrICYmIHNlbGYuY3VycmVudEV2ZW50ID4gMCAmJiBzZWxmLm5vdGVUaW1pbmdzW3NlbGYuY3VycmVudEV2ZW50IC0gMV0udHlwZSA9PT0gJ2V2ZW50Jylcblx0XHRcdHNlbGYuZXZlbnRDYWxsYmFjayhzZWxmLm5vdGVUaW1pbmdzW3NlbGYuY3VycmVudEV2ZW50IC0gMV0pO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJjdXJyZW50UGVyY2VudD1cIitjdXJyZW50UGVyY2VudCtcblx0XHQvLyBcdFwiIG5ld1NlZWtQZXJjZW50PVwiK3NlbGYubmV3U2Vla1BlcmNlbnQrXG5cdFx0Ly8gXHRcIiBwZXJjZW50RGlmZmVyZW5jZT1cIitwZXJjZW50RGlmZmVyZW5jZStcblx0XHQvLyBcdFwiIHRpbWVEaWZmZXJlbmNlPVwiLHRpbWVEaWZmZXJlbmNlK1xuXHRcdC8vIFx0XCIgY3VycmVudEJlYXQ9XCIrc2VsZi5jdXJyZW50QmVhdCtcblx0XHQvLyBcdFwiIGN1cnJlbnRFdmVudD1cIitzZWxmLmN1cnJlbnRFdmVudCk7XG5cdH1cblxuXHRzZWxmLmRvVGltaW5nID0gZnVuY3Rpb24gKHRpbWVzdGFtcCkge1xuXHRcdGlmICghc2VsZi5zdGFydFRpbWUpIHtcblx0XHRcdHNlbGYuc3RhcnRUaW1lID0gdGltZXN0YW1wO1xuXHRcdH0gZWxzZSBpZiAoc2VsZi5qdXN0VW5wYXVzZWQpIHtcblx0XHRcdC8vIEFkZCB0aGUgYW1vdW50IHdlIHBhdXNlZCB0byB0aGUgc3RhcnQgdGltZSB0byBnZXQgdGhlIHJpZ2h0IHBsYWNlLlxuXHRcdFx0dmFyIHRpbWVQYXVzZWQgPSAodGltZXN0YW1wIC0gc2VsZi5wYXVzZWRUaW1lKTtcblx0XHRcdHNlbGYuc3RhcnRUaW1lICs9IHRpbWVQYXVzZWQ7XG5cdFx0fVxuXHRcdHNlbGYuanVzdFVucGF1c2VkID0gZmFsc2U7XG5cblx0XHRpZiAoc2VsZi5qdXN0U2Vla2VkKSB7XG5cdFx0XHRzZXRDdXJyZW50TG9jYXRpb24odGltZXN0YW1wKTtcblx0XHRcdHNlbGYuanVzdFNlZWtlZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoc2VsZi5pc1BhdXNlZCkge1xuXHRcdFx0c2VsZi5wYXVzZWRUaW1lID0gdGltZXN0YW1wO1xuXHRcdH0gZWxzZSBpZiAoc2VsZi5pc1J1bm5pbmcpIHtcblx0XHRcdHZhciBjdXJyZW50VGltZSA9IHRpbWVzdGFtcCAtIHNlbGYuc3RhcnRUaW1lO1xuXHRcdFx0Y3VycmVudFRpbWUgKz0gNTA7IC8vIEFkZCBhIGxpdHRsZSBzbG9wIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgZXhhY3RseS5cblx0XHRcdHdoaWxlIChzZWxmLm5vdGVUaW1pbmdzLmxlbmd0aCA+IHNlbGYuY3VycmVudEV2ZW50ICYmIHNlbGYubm90ZVRpbWluZ3Nbc2VsZi5jdXJyZW50RXZlbnRdLm1pbGxpc2Vjb25kcyA8IGN1cnJlbnRUaW1lKSB7XG5cdFx0XHRcdGlmIChzZWxmLmV2ZW50Q2FsbGJhY2sgJiYgc2VsZi5ub3RlVGltaW5nc1tzZWxmLmN1cnJlbnRFdmVudF0udHlwZSA9PT0gJ2V2ZW50Jylcblx0XHRcdFx0XHRzZWxmLmV2ZW50Q2FsbGJhY2soc2VsZi5ub3RlVGltaW5nc1tzZWxmLmN1cnJlbnRFdmVudF0pO1xuXHRcdFx0XHRzZWxmLmN1cnJlbnRFdmVudCsrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRUaW1lIDwgc2VsZi5sYXN0TW9tZW50KSB7XG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShzZWxmLmRvVGltaW5nKTtcblx0XHRcdFx0aWYgKHNlbGYuY3VycmVudEJlYXQgKiBzZWxmLm1pbGxpc2Vjb25kc1BlckJlYXQgPCBjdXJyZW50VGltZSkge1xuXHRcdFx0XHRcdGlmIChzZWxmLmJlYXRDYWxsYmFjaylcblx0XHRcdFx0XHRcdHNlbGYuYmVhdENhbGxiYWNrKHNlbGYuY3VycmVudEJlYXQgLyBzZWxmLmJlYXRTdWJkaXZpc2lvbnMsIHNlbGYudG90YWxCZWF0cyAvIHNlbGYuYmVhdFN1YmRpdmlzaW9ucywgc2VsZi5sYXN0TW9tZW50KTtcblx0XHRcdFx0XHRzZWxmLmN1cnJlbnRCZWF0Kys7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoc2VsZi5jdXJyZW50QmVhdCA8PSBzZWxmLnRvdGFsQmVhdHMpIHtcblx0XHRcdFx0Ly8gQmVjYXVzZSBvZiB0aW1pbmcgaXNzdWVzIChmb3IgaW5zdGFuY2UsIGlmIHRoZSBicm93c2VyIHRhYiBpc24ndCBhY3RpdmUpLCB0aGUgYmVhdCBjYWxsYmFja3MgbWlnaHQgbm90IGhhdmUgaGFwcGVuZWQgd2hlbiB0aGV5IGFyZSBzdXBwb3NlZCB0by4gVG8ga2VlcCB0aGUgY2xpZW50IHByb2dyYW1zIGZyb20gaGF2aW5nIHRvIGRlYWwgd2l0aCB0aGF0LCB0aGlzIHdpbGwga2VlcCBjYWxsaW5nIHRoZSBsb29wIHVudGlsIGFsbCBvZiB0aGVtIGhhdmUgYmVlbiBzZW50LlxuXHRcdFx0XHRpZiAoc2VsZi5iZWF0Q2FsbGJhY2spIHtcblx0XHRcdFx0XHRzZWxmLmJlYXRDYWxsYmFjayhzZWxmLmN1cnJlbnRCZWF0IC8gc2VsZi5iZWF0U3ViZGl2aXNpb25zLCBzZWxmLnRvdGFsQmVhdHMgLyBzZWxmLmJlYXRTdWJkaXZpc2lvbnMsIHNlbGYubGFzdE1vbWVudCk7XG5cdFx0XHRcdFx0c2VsZi5jdXJyZW50QmVhdCsrO1xuXHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShzZWxmLmRvVGltaW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc2VsZi5saW5lRW5kQ2FsbGJhY2sgJiYgc2VsZi5saW5lRW5kVGltaW5ncy5sZW5ndGggJiYgc2VsZi5saW5lRW5kVGltaW5nc1swXS5taWxsaXNlY29uZHMgPD0gY3VycmVudFRpbWUpIHtcblx0XHRcdFx0c2VsZi5saW5lRW5kQ2FsbGJhY2soc2VsZi5saW5lRW5kVGltaW5nc1swXSk7XG5cdFx0XHRcdHNlbGYubGluZUVuZFRpbWluZ3Muc2hpZnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnRUaW1lID49IHNlbGYubGFzdE1vbWVudCAmJiBzZWxmLmV2ZW50Q2FsbGJhY2spXG5cdFx0XHRcdHNlbGYuZXZlbnRDYWxsYmFjayhudWxsKTtcblx0XHR9XG5cdH07XG5cblx0c2VsZi5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRcdHNlbGYuaXNSdW5uaW5nID0gdHJ1ZTtcblx0XHRpZiAoc2VsZi5pc1BhdXNlZCkge1xuXHRcdFx0c2VsZi5pc1BhdXNlZCA9IGZhbHNlO1xuXHRcdFx0c2VsZi5qdXN0VW5wYXVzZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2VsZi5kb1RpbWluZyk7XG5cdH07XG5cdHNlbGYucGF1c2UgPSBmdW5jdGlvbigpIHtcblx0XHRzZWxmLmlzUGF1c2VkID0gdHJ1ZTtcblx0XHRzZWxmLmlzUnVubmluZyA9IGZhbHNlO1xuXHR9O1xuXHRzZWxmLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG5cdFx0c2VsZi5jdXJyZW50QmVhdCA9IDA7XG5cdFx0c2VsZi5jdXJyZW50RXZlbnQgPSAwO1xuXHRcdHNlbGYuc3RhcnRUaW1lID0gbnVsbDtcblx0XHRzZWxmLnBhdXNlZFRpbWUgPSBudWxsO1xuXHRcdGlmIChzZWxmLmxpbmVFbmRDYWxsYmFjaykge1xuXHRcdFx0c2VsZi5saW5lRW5kVGltaW5ncyA9IGdldExpbmVFbmRUaW1pbmdzKHNlbGYubm90ZVRpbWluZ3MsIHNlbGYubGluZUVuZEFudGljaXBhdGlvbik7XG5cdFx0fVxuXHR9O1xuXHRzZWxmLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRzZWxmLnBhdXNlKCk7XG5cdFx0c2VsZi5yZXNldCgpO1xuXHR9O1xuXHRzZWxmLnNldFByb2dyZXNzID0gZnVuY3Rpb24ocGVyY2VudCkge1xuXHRcdC8vIHRoaXMgaXMgcGFzc2VkIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxuXHRcdC8vIHRoZSBlZmZlY3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBtb3ZlIHN0YXJ0VGltZSBzbyB0aGF0IHRoZSBjYWxsYmFja3MgaGFwcGVuIGNvcnJlY3RseSBmb3IgdGhlIG5ldyBzZWVrLlxuXHRcdGlmIChwZXJjZW50IDwgMCkgcGVyY2VudCA9IDA7XG5cdFx0aWYgKHBlcmNlbnQgPiAxKSBwZXJjZW50ID0gMTtcblxuXHRcdHNlbGYubmV3U2Vla1BlcmNlbnQgPSBwZXJjZW50O1xuXHRcdHNlbGYuanVzdFNlZWtlZCA9IHRydWU7XG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNlbGYuZG9UaW1pbmcpO1xuXHR9O1xufTtcblxuZnVuY3Rpb24gZ2V0TGluZUVuZFRpbWluZ3ModGltaW5ncywgYW50aWNpcGF0aW9uKSB7XG5cdC8vIFJldHVybnMgYW4gYXJyYXkgb2YgbWlsbGlzZWNvbmRzIHRvIGNhbGwgdGhlIGxpbmVFbmRDYWxsYmFjay5cblx0Ly8gVGhpcyBmaWd1cmVzIG91dCB0aGUgdGltaW5nIG9mIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIGFuZCBzdWJ0cmFjdHMgdGhlIGFudGljaXBhdGlvbiBmcm9tIGl0LlxuXHR2YXIgY2FsbGJhY2tUaW1lcyA9IFtdO1xuXHR2YXIgbGFzdFRvcCA9IG51bGw7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdGltaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciB0aW1pbmcgPSB0aW1pbmdzW2ldO1xuXHRcdGlmICh0aW1pbmcudG9wICE9PSBsYXN0VG9wKSB7XG5cdFx0XHRjYWxsYmFja1RpbWVzLnB1c2goeyBtaWxsaXNlY29uZHM6IHRpbWluZy5taWxsaXNlY29uZHMgLSBhbnRpY2lwYXRpb24sIHRvcDogdGltaW5nLnRvcCwgYm90dG9tOiB0aW1pbmcudG9wK3RpbWluZy5oZWlnaHQgfSk7XG5cdFx0XHRsYXN0VG9wID0gdGltaW5nLnRvcDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNhbGxiYWNrVGltZXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVGltaW5nQ2FsbGJhY2tzO1xuXG4iLCIvLyAgICBhYmNfYW5pbWF0aW9uLmpzOiBoYW5kbGVzIGFuaW1hdGluZyB0aGUgbXVzaWMgaW4gcmVhbCB0aW1lLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTggUGF1bCBSb3NlbiAocGF1bCBhdCBwYXVscm9zZW4gZG90IG5ldClcbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHNwYWNpbmcgPSByZXF1aXJlKCcuLi93cml0ZS9hYmNfc3BhY2luZycpO1xudmFyIHBhcnNlQ29tbW9uID0gcmVxdWlyZSgnLi4vcGFyc2UvYWJjX2NvbW1vbicpO1xudmFyIFRpbWluZ0NhbGxiYWNrcyA9IHJlcXVpcmUoJy4vYWJjX3RpbWluZ19jYWxsYmFja3MnKTtcblxudmFyIGFuaW1hdGlvbiA9IHt9O1xuXG4oZnVuY3Rpb24oKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciB0aW1lcjtcblx0dmFyIGN1cnNvcjtcblx0YW5pbWF0aW9uLnN0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24ocGFwZXIsIHR1bmUsIG9wdGlvbnMpIHtcblx0XHQvL29wdGlvbnMuYnBtXG5cdFx0Ly9vcHRpb25zLnNob3dDdXJzb3Jcblx0XHQvL29wdGlvbnMuaGlkZUN1cnJlbnRNZWFzdXJlXG5cdFx0Ly9vcHRpb25zLmhpZGVGaW5pc2hlZE1lYXN1cmVzXG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHR0aW1lci5zdG9wKCk7XG5cdFx0XHR0aW1lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zaG93Q3Vyc29yKSB7XG5cdFx0XHRjdXJzb3IgPSBwYXBlci5xdWVyeVNlbGVjdG9yKCcuYWJjanMtY3Vyc29yJyk7XG5cdFx0XHRpZiAoIWN1cnNvcikge1xuXHRcdFx0XHRjdXJzb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblx0XHRcdFx0Y3Vyc29yLmNsYXNzTmFtZSA9ICdhYmNqcy1jdXJzb3IgY3Vyc29yJztcblx0XHRcdFx0Y3Vyc29yLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblxuXHRcdFx0XHRwYXBlci5hcHBlbmRDaGlsZChjdXJzb3IpO1xuXHRcdFx0XHRwYXBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaGlkZU1lYXN1cmVzKGVsZW1lbnRzKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cdFx0XHRcdGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FiY2pzLWJhcicpKVxuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBsYXN0TWVhc3VyZTtcblx0XHRmdW5jdGlvbiBkaXNhcHBlYXJNZWFzdXJlc0FmdGVyKHNlbGVjdG9yKSB7XG5cdFx0XHRpZiAobGFzdE1lYXN1cmUpIHtcblx0XHRcdFx0dmFyIGVsZW1lbnRzID0gcGFwZXIucXVlcnlTZWxlY3RvckFsbChsYXN0TWVhc3VyZSk7XG5cdFx0XHRcdGhpZGVNZWFzdXJlcyhlbGVtZW50cyk7XG5cdFx0XHR9XG5cdFx0XHRsYXN0TWVhc3VyZSA9IHNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FwcGVhck1lYXN1cmVzQmVmb3JlKHNlbGVjdG9yKSB7XG5cdFx0XHR2YXIgZWxlbWVudHMgPSBwYXBlci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblx0XHRcdGhpZGVNZWFzdXJlcyhlbGVtZW50cyk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gbWVhc3VyZUNhbGxiYWNrKHNlbGVjdG9yKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5oaWRlQ3VycmVudE1lYXN1cmUpIHtcblx0XHRcdFx0ZGlzYXBwZWFyTWVhc3VyZXNCZWZvcmUoc2VsZWN0b3IpO1xuXHRcdFx0fSBlbHNlIGlmIChvcHRpb25zLmhpZGVGaW5pc2hlZE1lYXN1cmVzKSB7XG5cdFx0XHRcdGRpc2FwcGVhck1lYXN1cmVzQWZ0ZXIoc2VsZWN0b3IpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldExpbmVBbmRNZWFzdXJlKGVsZW1lbnQpIHtcblx0XHRcdHJldHVybiAnLmFiY2pzLWwnICsgZWxlbWVudC5saW5lICsgJy5hYmNqcy1tJyArIGVsZW1lbnQubWVhc3VyZU51bWJlcjtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXRDdXJzb3IocmFuZ2UpIHtcblx0XHRcdGlmIChyYW5nZSkge1xuXHRcdFx0XHRpZiAocmFuZ2UubWVhc3VyZVN0YXJ0KSB7XG5cdFx0XHRcdFx0dmFyIHNlbGVjdG9yID0gZ2V0TGluZUFuZE1lYXN1cmUocmFuZ2UpO1xuXHRcdFx0XHRcdGlmIChzZWxlY3Rvcilcblx0XHRcdFx0XHRcdG1lYXN1cmVDYWxsYmFjayhzZWxlY3Rvcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN1cnNvcikge1xuXHRcdFx0XHRcdGN1cnNvci5zdHlsZS5sZWZ0ID0gcmFuZ2UubGVmdCArIFwicHhcIjtcblx0XHRcdFx0XHRjdXJzb3Iuc3R5bGUudG9wID0gcmFuZ2UudG9wICsgXCJweFwiO1xuXHRcdFx0XHRcdGN1cnNvci5zdHlsZS53aWR0aCA9IHJhbmdlLndpZHRoICsgXCJweFwiO1xuXHRcdFx0XHRcdGN1cnNvci5zdHlsZS5oZWlnaHQgPSByYW5nZS5oZWlnaHQgKyBcInB4XCI7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpbWVyLnN0b3AoKTtcblx0XHRcdFx0dGltZXIgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGltZXIgPSBuZXcgVGltaW5nQ2FsbGJhY2tzKHR1bmUsIHtcblx0XHRcdHFwbTogb3B0aW9ucy5icG0sXG5cdFx0XHRldmVudENhbGxiYWNrOiBzZXRDdXJzb3Jcblx0XHR9KTtcblx0XHR0aW1lci5zdGFydCgpO1xuXHR9O1xuXG5cdGFuaW1hdGlvbi5wYXVzZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKHBhdXNlKSB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRpZiAocGF1c2UpXG5cdFx0XHRcdHRpbWVyLnBhdXNlKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRpbWVyLnN0YXJ0KCk7XG5cdFx0fVxuXHR9O1xuXG5cdGFuaW1hdGlvbi5zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHR0aW1lci5zdG9wKCk7XG5cdFx0XHR0aW1lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH07XG5cbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYW5pbWF0aW9uO1xuIiwiLypnbG9iYWwgd2luZG93ICovXG5cbnZhciBwYXJzZUNvbW1vbiA9IHJlcXVpcmUoJy4vYWJjX2NvbW1vbicpO1xuXG52YXIgcGFyc2VEaXJlY3RpdmUgPSB7fTtcblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIHRva2VuaXplcjtcblx0dmFyIHdhcm47XG5cdHZhciBtdWx0aWxpbmVWYXJzO1xuXHR2YXIgdHVuZTtcblx0cGFyc2VEaXJlY3RpdmUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKHRva2VuaXplcl8sIHdhcm5fLCBtdWx0aWxpbmVWYXJzXywgdHVuZV8pIHtcblx0XHR0b2tlbml6ZXIgPSB0b2tlbml6ZXJfO1xuXHRcdHdhcm4gPSB3YXJuXztcblx0XHRtdWx0aWxpbmVWYXJzID0gbXVsdGlsaW5lVmFyc187XG5cdFx0dHVuZSA9IHR1bmVfO1xuXHRcdGluaXRpYWxpemVGb250cygpO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGluaXRpYWxpemVGb250cygpIHtcblx0XHRtdWx0aWxpbmVWYXJzLmFubm90YXRpb25mb250ICA9IHsgZmFjZTogXCJIZWx2ZXRpY2FcIiwgc2l6ZTogMTIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy5nY2hvcmRmb250ICA9IHsgZmFjZTogXCJIZWx2ZXRpY2FcIiwgc2l6ZTogMTIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy5oaXN0b3J5Zm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTYsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy5pbmZvZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTQsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy5tZWFzdXJlZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTQsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy5wYXJ0c2ZvbnQgID0geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHNpemU6IDE1LCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdG11bHRpbGluZVZhcnMucmVwZWF0Zm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTMsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy50ZXh0Zm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTYsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0bXVsdGlsaW5lVmFycy50cmlwbGV0Zm9udCA9IHtmYWNlOiBcIlRpbWVzXCIsIHNpemU6IDExLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIn07XG5cdFx0bXVsdGlsaW5lVmFycy52b2NhbGZvbnQgID0geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHNpemU6IDEzLCB3ZWlnaHQ6IFwiYm9sZFwiLCBzdHlsZTogXCJub3JtYWxcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRtdWx0aWxpbmVWYXJzLndvcmRzZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTYsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cblx0XHQvLyBUaGVzZSBmb250cyBhcmUgZ2xvYmFsIGZvciB0aGUgZW50aXJlIHR1bmUuXG5cdFx0dHVuZS5mb3JtYXR0aW5nLmNvbXBvc2VyZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTQsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0dHVuZS5mb3JtYXR0aW5nLnN1YnRpdGxlZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTYsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0dHVuZS5mb3JtYXR0aW5nLnRlbXBvZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTUsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdHR1bmUuZm9ybWF0dGluZy50aXRsZWZvbnQgID0geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHNpemU6IDIwLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdHR1bmUuZm9ybWF0dGluZy5mb290ZXJmb250ICA9IHsgZmFjZTogXCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLCBzaXplOiAxMiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJub3JtYWxcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHR0dW5lLmZvcm1hdHRpbmcuaGVhZGVyZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0dHVuZS5mb3JtYXR0aW5nLnZvaWNlZm9udCAgPSB7IGZhY2U6IFwiXFxcIlRpbWVzIE5ldyBSb21hblxcXCJcIiwgc2l6ZTogMTMsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXG5cdFx0Ly8gdGhlc2UgYXJlIHRoZSBkZWZhdWx0IGZvbnRzIGZvciB0aGVzZSBlbGVtZW50IHR5cGVzLiBJbiB0aGUgcHJpbnRlciwgdGhlc2UgZm9udHMgbWlnaHQgY2hhbmdlIGFzIHRoZSB0dW5lIHByb2dyZXNzZXMuXG5cdFx0dHVuZS5mb3JtYXR0aW5nLmFubm90YXRpb25mb250ICA9IG11bHRpbGluZVZhcnMuYW5ub3RhdGlvbmZvbnQ7XG5cdFx0dHVuZS5mb3JtYXR0aW5nLmdjaG9yZGZvbnQgID0gbXVsdGlsaW5lVmFycy5nY2hvcmRmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy5oaXN0b3J5Zm9udCAgPSBtdWx0aWxpbmVWYXJzLmhpc3Rvcnlmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy5pbmZvZm9udCAgPSBtdWx0aWxpbmVWYXJzLmluZm9mb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy5tZWFzdXJlZm9udCAgPSBtdWx0aWxpbmVWYXJzLm1lYXN1cmVmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy5wYXJ0c2ZvbnQgID0gbXVsdGlsaW5lVmFycy5wYXJ0c2ZvbnQ7XG5cdFx0dHVuZS5mb3JtYXR0aW5nLnJlcGVhdGZvbnQgID0gbXVsdGlsaW5lVmFycy5yZXBlYXRmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy50ZXh0Zm9udCAgPSBtdWx0aWxpbmVWYXJzLnRleHRmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy50cmlwbGV0Zm9udCAgPSBtdWx0aWxpbmVWYXJzLnRyaXBsZXRmb250O1xuXHRcdHR1bmUuZm9ybWF0dGluZy52b2NhbGZvbnQgID0gbXVsdGlsaW5lVmFycy52b2NhbGZvbnQ7XG5cdFx0dHVuZS5mb3JtYXR0aW5nLndvcmRzZm9udCAgPSBtdWx0aWxpbmVWYXJzLndvcmRzZm9udDtcblx0fVxuXG5cdHZhciBmb250VHlwZUNhbkhhdmVCb3ggPSB7IGdjaG9yZGZvbnQ6IHRydWUsIG1lYXN1cmVmb250OiB0cnVlLCBwYXJ0c2ZvbnQ6IHRydWUgfTtcblxuXHR2YXIgZm9udFRyYW5zbGF0aW9uID0gZnVuY3Rpb24oZm9udEZhY2UpIHtcblx0XHQvLyBUaGlzIHRyYW5zbGF0ZXMgUG9zdHNjcmlwdCBmb250cyBmb3IgYSB3ZWIgYWx0ZXJuYXRpdmUuXG5cdFx0Ly8gTm90ZSB0aGF0IHRoZSBwb3N0c2NyaXB0IGZvbnRzIGNvbnRhaW4gaXRhbGljIGFuZCBib2xkIGluZm8gaW4gdGhlbSwgc28gd2hhdCBpcyByZXR1cm5lZCBpcyBhIGhhc2guXG5cblx0XHRzd2l0Y2ggKGZvbnRGYWNlKSB7XG5cdFx0XHRjYXNlIFwiQXJpYWwtSXRhbGljXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiQXJpYWxcIiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJBcmlhbC1Cb2xkXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiQXJpYWxcIiwgd2VpZ2h0OiBcImJvbGRcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiQm9va21hbi1EZW1pXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiQm9va21hbixzZXJpZlwiLCB3ZWlnaHQ6IFwiYm9sZFwiLCBzdHlsZTogXCJub3JtYWxcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJCb29rbWFuLURlbWlJdGFsaWNcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJCb29rbWFuLHNlcmlmXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkJvb2ttYW4tTGlnaHRcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJCb29rbWFuLHNlcmlmXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiQm9va21hbi1MaWdodEl0YWxpY1wiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIkJvb2ttYW4sc2VyaWZcIiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJDb3VyaWVyXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIkNvdXJpZXIgTmV3XFxcIlwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkNvdXJpZXItT2JsaXF1ZVwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJDb3VyaWVyIE5ld1xcXCJcIiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJDb3VyaWVyLUJvbGRcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJcXFwiQ291cmllciBOZXdcXFwiXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJcXFwiQ291cmllciBOZXdcXFwiXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkF2YW50R2FyZGUtQm9va1wiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIkF2YW50R2FyZGUsQXJpYWxcIiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJub3JtYWxcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJBdmFudEdhcmRlLUJvb2tPYmxpcXVlXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiQXZhbnRHYXJkZSxBcmlhbFwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkF2YW50R2FyZGUtRGVtaVwiOlxuXHRcdFx0Y2FzZSBcIkF2YW50LUdhcmRlLURlbWlcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJBdmFudEdhcmRlLEFyaWFsXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkF2YW50R2FyZGUtRGVtaU9ibGlxdWVcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJBdmFudEdhcmRlLEFyaWFsXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkhlbHZldGljYS1PYmxpcXVlXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiSGVsdmV0aWNhXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiSGVsdmV0aWNhLUJvbGRcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJIZWx2ZXRpY2FcIiwgd2VpZ2h0OiBcImJvbGRcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiSGVsdmV0aWNhXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkhlbHZldGljYS1OYXJyb3dcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJcXFwiSGVsdmV0aWNhIE5hcnJvd1xcXCIsSGVsdmV0aWNhXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiSGVsdmV0aWNhLU5hcnJvdy1PYmxpcXVlXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIkhlbHZldGljYSBOYXJyb3dcXFwiLEhlbHZldGljYVwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIkhlbHZldGljYS1OYXJyb3ctQm9sZFwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJIZWx2ZXRpY2EgTmFycm93XFxcIixIZWx2ZXRpY2FcIiwgd2VpZ2h0OiBcImJvbGRcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiSGVsdmV0aWNhLU5hcnJvdy1Cb2xkT2JsaXF1ZVwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJIZWx2ZXRpY2EgTmFycm93XFxcIixIZWx2ZXRpY2FcIiwgd2VpZ2h0OiBcImJvbGRcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiUGFsYXRpbm8tUm9tYW5cIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJQYWxhdGlub1wiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIlBhbGF0aW5vLUl0YWxpY1wiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlBhbGF0aW5vXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiUGFsYXRpbm8tQm9sZFwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlBhbGF0aW5vXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIlBhbGF0aW5vLUJvbGRJdGFsaWNcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJQYWxhdGlub1wiLCB3ZWlnaHQ6IFwiYm9sZFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJOZXdDZW50dXJ5U2NobGJrLVJvbWFuXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIk5ldyBDZW50dXJ5XFxcIixzZXJpZlwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIk5ld0NlbnR1cnlTY2hsYmstSXRhbGljXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIk5ldyBDZW50dXJ5XFxcIixzZXJpZlwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIml0YWxpY1wiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIk5ld0NlbnR1cnlTY2hsYmstQm9sZFwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJOZXcgQ2VudHVyeVxcXCIsc2VyaWZcIiwgd2VpZ2h0OiBcImJvbGRcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiTmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIk5ldyBDZW50dXJ5XFxcIixzZXJpZlwiLCB3ZWlnaHQ6IFwiYm9sZFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJUaW1lc1wiOlxuXHRcdFx0Y2FzZSBcIlRpbWVzLVJvbWFuXCI6XG5cdFx0XHRjYXNlIFwiVGltZXMtTmFycm93XCI6XG5cdFx0XHRjYXNlIFwiVGltZXMtQ291cmllclwiOlxuXHRcdFx0Y2FzZSBcIlRpbWVzLU5ldy1Sb21hblwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwibm9ybWFsXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiVGltZXMtSXRhbGljXCI6XG5cdFx0XHRjYXNlIFwiVGltZXMtSXRhbGljc1wiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHdlaWdodDogXCJub3JtYWxcIiwgc3R5bGU6IFwiaXRhbGljXCIsIGRlY29yYXRpb246IFwibm9uZVwiIH07XG5cdFx0XHRjYXNlIFwiVGltZXMtQm9sZFwiOlxuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsIHdlaWdodDogXCJib2xkXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiB9O1xuXHRcdFx0Y2FzZSBcIlRpbWVzLUJvbGRJdGFsaWNcIjpcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLCB3ZWlnaHQ6IFwiYm9sZFwiLCBzdHlsZTogXCJpdGFsaWNcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGNhc2UgXCJaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljXCI6XG5cdFx0XHRcdHJldHVybiB7IGZhY2U6IFwiXFxcIlphcGYgQ2hhbmNlcnlcXFwiLGN1cnNpdmUsc2VyaWZcIiwgd2VpZ2h0OiBcIm5vcm1hbFwiLCBzdHlsZTogXCJub3JtYWxcIiwgZGVjb3JhdGlvbjogXCJub25lXCIgfTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fTtcblxuXHR2YXIgZ2V0Rm9udFBhcmFtZXRlciA9IGZ1bmN0aW9uKHRva2VucywgY3VycmVudFNldHRpbmcsIHN0ciwgcG9zaXRpb24sIGNtZCkge1xuXHRcdC8vIEV2ZXJ5IGZvbnQgcGFyYW1ldGVyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcblx0XHQvLyA8ZmFjZT4gPHV0Zjg+IDxzaXplPiA8bW9kaWZpZXJzPiA8Ym94PlxuXHRcdC8vIFdoZXJlOlxuXHRcdC8vIGZhY2U6IGVpdGhlciBhIHN0YW5kYXJkIHdlYiBmb250IG5hbWUsIG9yIGEgcG9zdHNjcmlwdCBmb250LCBlbnVtZXJhdGVkIGluIGZvbnRUcmFuc2xhdGlvbi4gVGhpcyBjb3VsZCBhbHNvIGJlIGFuICogb3IgYmUgbWlzc2luZyBpZiB0aGUgZmFjZSBzaG91bGRuJ3QgY2hhbmdlLlxuXHRcdC8vIHV0Zjg6IFRoaXMgaXMgb3B0aW9uYWwsIGFuZCBzcGVjaWZpZXMgdXRmOC4gVGhhdCdzIGFsbCB0aGF0IGlzIHN1cHBvcnRlZCBzbyB0aGUgZmllbGQgaXMganVzdCBzaWxlbnRseSBpZ25vcmVkLlxuXHRcdC8vIHNpemU6IFRoZSBzaXplLCBpbiBwaXhlbHMuIFRoaXMgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHNpemUgaXMgbm90IGNoYW5naW5nLlxuXHRcdC8vIG1vZGlmaWVyczogemVybyBvciBtb3JlIG9mIFwiYm9sZFwiLCBcIml0YWxpY1wiLCBcInVuZGVybGluZVwiXG5cdFx0Ly8gYm94OiBPbmx5IGFwcGxpZXMgdG8gdGhlIG1lYXN1cmUgbnVtYmVycywgZ2Nob3JkcywgYW5kIHRoZSBwYXJ0cy4gSWYgcHJlc2VudCwgdGhlbiBhIGJveCBpcyBkcmF3biBhcm91bmQgdGhlIGNoYXJhY3RlcnMuXG5cdFx0Ly8gSWYgZmFjZSBpcyBwcmVzZW50LCB0aGVuIGFsbCB0aGUgbW9kaWZpZXJzIGFyZSBjbGVhcmVkLiBJZiBmYWNlIGlzIGFic2VudCwgdGhlbiB0aGUgbW9kaWZpZXJzIGFyZSBpbGxlZ2FsLlxuXHRcdC8vIFRoZSBmYWNlIGNhbiBiZSBhIHNpbmdsZSB3b3JkLCBhIHNldCBvZiB3b3JkcyBzZXBhcmF0ZWQgYnkgaHlwaGVucywgb3IgYSBxdW90ZWQgc3RyaW5nLlxuXHRcdC8vXG5cdFx0Ly8gU28sIGluIHByYWN0aWNhbGl0eSwgdGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGZvbnQgZGVmaW5pdGlvbnM6IGEgbnVtYmVyIG9ubHksIGFuIGFzdGVyaXNrIGFuZCBhIG51bWJlciBvbmx5LCBvciB0aGUgZnVsbCBkZWZpbml0aW9uICh3aXRoIGFuIG9wdGlvbmFsIHNpemUpLlxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NOdW1iZXJPbmx5KCkge1xuXHRcdFx0dmFyIHNpemUgPSBwYXJzZUludCh0b2tlbnNbMF0udG9rZW4pO1xuXHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIWN1cnJlbnRTZXR0aW5nKSB7XG5cdFx0XHRcdHdhcm4oXCJDYW4ndCBzZXQganVzdCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBzaW5jZSB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogXCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLCB3ZWlnaHQ6IFwibm9ybWFsXCIsIHN0eWxlOiBcIm5vcm1hbFwiLCBkZWNvcmF0aW9uOiBcIm5vbmVcIiwgc2l6ZTogc2l6ZX07XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4geyBmYWNlOiBjdXJyZW50U2V0dGluZy5mYWNlLCB3ZWlnaHQ6IGN1cnJlbnRTZXR0aW5nLndlaWdodCwgc3R5bGU6IGN1cnJlbnRTZXR0aW5nLnN0eWxlLCBkZWNvcmF0aW9uOiBjdXJyZW50U2V0dGluZy5kZWNvcmF0aW9uLCBzaXplOiBzaXplfTtcblx0XHRcdH1cblx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXS50b2tlbiA9PT0gXCJib3hcIiAmJiBmb250VHlwZUNhbkhhdmVCb3hbY21kXSlcblx0XHRcdFx0cmV0dXJuIHsgZmFjZTogY3VycmVudFNldHRpbmcuZmFjZSwgd2VpZ2h0OiBjdXJyZW50U2V0dGluZy53ZWlnaHQsIHN0eWxlOiBjdXJyZW50U2V0dGluZy5zdHlsZSwgZGVjb3JhdGlvbjogY3VycmVudFNldHRpbmcuZGVjb3JhdGlvbiwgc2l6ZTogc2l6ZSwgYm94OiB0cnVlfTtcblx0XHRcdHdhcm4oXCJFeHRyYSBwYXJhbWV0ZXJzIGluIGZvbnQgZGVmaW5pdGlvbi5cIiwgc3RyLCBwb3NpdGlvbik7XG5cdFx0XHRyZXR1cm4geyBmYWNlOiBjdXJyZW50U2V0dGluZy5mYWNlLCB3ZWlnaHQ6IGN1cnJlbnRTZXR0aW5nLndlaWdodCwgc3R5bGU6IGN1cnJlbnRTZXR0aW5nLnN0eWxlLCBkZWNvcmF0aW9uOiBjdXJyZW50U2V0dGluZy5kZWNvcmF0aW9uLCBzaXplOiBzaXplfTtcblx0XHR9XG5cblx0XHQvLyBmb3JtYXQgMTogYXN0ZXJpc2sgYW5kIG51bWJlciBvbmx5XG5cdFx0aWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJyonKSB7XG5cdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdGlmICh0b2tlbnNbMF0udHlwZSA9PT0gJ251bWJlcicpXG5cdFx0XHRcdHJldHVybiBwcm9jZXNzTnVtYmVyT25seSgpO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBmb250IHNpemUgbnVtYmVyIGFmdGVyICouXCIsIHN0ciwgcG9zaXRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGZvcm1hdCAyOiBudW1iZXIgb25seVxuXHRcdGlmICh0b2tlbnNbMF0udHlwZSA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiBwcm9jZXNzTnVtYmVyT25seSgpO1xuXHRcdH1cblxuXHRcdC8vIGZvcm1hdCAzOiB3aG9sZSBkZWZpbml0aW9uXG5cdFx0dmFyIGZhY2UgPSBbXTtcblx0XHR2YXIgc2l6ZTtcblx0XHR2YXIgd2VpZ2h0ID0gXCJub3JtYWxcIjtcblx0XHR2YXIgc3R5bGUgPSBcIm5vcm1hbFwiO1xuXHRcdHZhciBkZWNvcmF0aW9uID0gXCJub25lXCI7XG5cdFx0dmFyIGJveCA9IGZhbHNlO1xuXHRcdHZhciBzdGF0ZSA9ICdmYWNlJztcblx0XHR2YXIgaHlwaGVuTGFzdCA9IGZhbHNlO1xuXHRcdHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgY3VyclRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHR2YXIgd29yZCA9IGN1cnJUb2tlbi50b2tlbi50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0c3dpdGNoIChzdGF0ZSkge1xuXHRcdFx0XHRjYXNlICdmYWNlJzpcblx0XHRcdFx0XHRpZiAoaHlwaGVuTGFzdCB8fCAod29yZCAhPT0gJ3V0ZicgJiYgY3VyclRva2VuLnR5cGUgIT09ICdudW1iZXInICYmIHdvcmQgIT09IFwiYm9sZFwiICYmIHdvcmQgIT09IFwiaXRhbGljXCIgJiYgd29yZCAhPT0gXCJ1bmRlcmxpbmVcIiAmJiB3b3JkICE9PSBcImJveFwiKSkge1xuXHRcdFx0XHRcdFx0aWYgKGZhY2UubGVuZ3RoID4gMCAmJiBjdXJyVG9rZW4udG9rZW4gPT09ICctJykge1xuXHRcdFx0XHRcdFx0XHRoeXBoZW5MYXN0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0ZmFjZVtmYWNlLmxlbmd0aC0xXSA9IGZhY2VbZmFjZS5sZW5ndGgtMV0gKyBjdXJyVG9rZW4udG9rZW47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYgKGh5cGhlbkxhc3QpIHtcblx0XHRcdFx0XHRcdFx0XHRoeXBoZW5MYXN0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0ZmFjZVtmYWNlLmxlbmd0aC0xXSA9IGZhY2VbZmFjZS5sZW5ndGgtMV0gKyBjdXJyVG9rZW4udG9rZW47XG5cdFx0XHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGZhY2UucHVzaChjdXJyVG9rZW4udG9rZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VyclRva2VuLnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzaXplKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2FybihcIkZvbnQgc2l6ZSBzcGVjaWZpZWQgdHdpY2UgaW4gZm9udCBkZWZpbml0aW9uLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRzaXplID0gY3VyclRva2VuLnRva2VuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gJ21vZGlmaWVyJztcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAod29yZCA9PT0gXCJib2xkXCIpXG5cdFx0XHRcdFx0XHRcdHdlaWdodCA9IFwiYm9sZFwiO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAod29yZCA9PT0gXCJpdGFsaWNcIilcblx0XHRcdFx0XHRcdFx0c3R5bGUgPSBcIml0YWxpY1wiO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAod29yZCA9PT0gXCJ1bmRlcmxpbmVcIilcblx0XHRcdFx0XHRcdFx0ZGVjb3JhdGlvbiA9IFwidW5kZXJsaW5lXCI7XG5cdFx0XHRcdFx0XHRlbHNlIGlmICh3b3JkID09PSBcImJveFwiKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChmb250VHlwZUNhbkhhdmVCb3hbY21kXSlcblx0XHRcdFx0XHRcdFx0XHRib3ggPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0d2FybihcIlRoaXMgZm9udCBzdHlsZSBkb2Vzbid0IHN1cHBvcnQgXFxcImJveFxcXCJcIiwgc3RyLCBwb3NpdGlvbik7XG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gXCJmaW5pc2hlZFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh3b3JkID09PSBcInV0ZlwiKSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJUb2tlbiA9IHRva2Vucy5zaGlmdCgpOyAvLyB0aGlzIGdldHMgcmlkIG9mIHRoZSBcIjhcIiBhZnRlciBcInV0ZlwiXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gXCJzaXplXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0d2FybihcIlVua25vd24gcGFyYW1ldGVyIFwiICsgY3VyclRva2VuLnRva2VuICsgXCIgaW4gZm9udCBkZWZpbml0aW9uLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJzaXplXCI6XG5cdFx0XHRcdFx0aWYgKGN1cnJUb2tlbi50eXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRcdFx0aWYgKHNpemUpIHtcblx0XHRcdFx0XHRcdFx0d2FybihcIkZvbnQgc2l6ZSBzcGVjaWZpZWQgdHdpY2UgaW4gZm9udCBkZWZpbml0aW9uLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNpemUgPSBjdXJyVG9rZW4udG9rZW47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBmb250IHNpemUgaW4gZm9udCBkZWZpbml0aW9uLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3RhdGUgPSAnbW9kaWZpZXInO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibW9kaWZpZXJcIjpcblx0XHRcdFx0XHRpZiAod29yZCA9PT0gXCJib2xkXCIpXG5cdFx0XHRcdFx0XHR3ZWlnaHQgPSBcImJvbGRcIjtcblx0XHRcdFx0XHRlbHNlIGlmICh3b3JkID09PSBcIml0YWxpY1wiKVxuXHRcdFx0XHRcdFx0c3R5bGUgPSBcIml0YWxpY1wiO1xuXHRcdFx0XHRcdGVsc2UgaWYgKHdvcmQgPT09IFwidW5kZXJsaW5lXCIpXG5cdFx0XHRcdFx0XHRkZWNvcmF0aW9uID0gXCJ1bmRlcmxpbmVcIjtcblx0XHRcdFx0XHRlbHNlIGlmICh3b3JkID09PSBcImJveFwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoZm9udFR5cGVDYW5IYXZlQm94W2NtZF0pXG5cdFx0XHRcdFx0XHRcdGJveCA9IHRydWU7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHdhcm4oXCJUaGlzIGZvbnQgc3R5bGUgZG9lc24ndCBzdXBwb3J0IFxcXCJib3hcXFwiXCIsIHN0ciwgcG9zaXRpb24pO1xuXHRcdFx0XHRcdFx0c3RhdGUgPSBcImZpbmlzaGVkXCI7XG5cdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHR3YXJuKFwiVW5rbm93biBwYXJhbWV0ZXIgXCIgKyBjdXJyVG9rZW4udG9rZW4gKyBcIiBpbiBmb250IGRlZmluaXRpb24uXCIsIHN0ciwgcG9zaXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZmluaXNoZWRcIjpcblx0XHRcdFx0XHR3YXJuKFwiRXh0cmEgY2hhcmFjdGVycyBmb3VuZCBhZnRlciBcXFwiYm94XFxcIiBpbiBmb250IGRlZmluaXRpb24uXCIsIHN0ciwgcG9zaXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghY3VycmVudFNldHRpbmcpIHtcblx0XHRcdFx0d2FybihcIk11c3Qgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgZm9udCBzaW5jZSB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLlwiLCBzdHIsIHBvc2l0aW9uKTtcblx0XHRcdFx0c2l6ZSA9IDEyO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHNpemUgPSBjdXJyZW50U2V0dGluZy5zaXplO1xuXHRcdH0gZWxzZVxuXHRcdFx0c2l6ZSA9IHBhcnNlRmxvYXQoc2l6ZSk7XG5cblx0XHRmYWNlID0gZmFjZS5qb2luKCcgJyk7XG5cdFx0dmFyIHBzRm9udCA9IGZvbnRUcmFuc2xhdGlvbihmYWNlKTtcblx0XHR2YXIgZm9udCA9IHt9O1xuXHRcdGlmIChwc0ZvbnQpIHtcblx0XHRcdGZvbnQuZmFjZSA9IHBzRm9udC5mYWNlO1xuXHRcdFx0Zm9udC53ZWlnaHQgPSBwc0ZvbnQud2VpZ2h0O1xuXHRcdFx0Zm9udC5zdHlsZSA9IHBzRm9udC5zdHlsZTtcblx0XHRcdGZvbnQuZGVjb3JhdGlvbiA9IHBzRm9udC5kZWNvcmF0aW9uO1xuXHRcdFx0Zm9udC5zaXplID0gc2l6ZTtcblx0XHRcdGlmIChib3gpXG5cdFx0XHRcdGZvbnQuYm94ID0gdHJ1ZTtcblx0XHRcdHJldHVybiBmb250O1xuXHRcdH1cblx0XHRmb250LmZhY2UgPSBmYWNlO1xuXHRcdGZvbnQud2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdGZvbnQuc3R5bGUgPSBzdHlsZTtcblx0XHRmb250LmRlY29yYXRpb24gPSBkZWNvcmF0aW9uO1xuXHRcdGZvbnQuc2l6ZSA9IHNpemU7XG5cdFx0aWYgKGJveClcblx0XHRcdGZvbnQuYm94ID0gdHJ1ZTtcblx0XHRyZXR1cm4gZm9udDtcblx0fTtcblxuXHR2YXIgZ2V0Q2hhbmdpbmdGb250ID0gZnVuY3Rpb24oY21kLCB0b2tlbnMsIHN0cikge1xuXHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKVxuXHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyBhIGZvbnQgYXMgYSBwYXJhbWV0ZXIuXCI7XG5cdFx0bXVsdGlsaW5lVmFyc1tjbWRdID0gZ2V0Rm9udFBhcmFtZXRlcih0b2tlbnMsIG11bHRpbGluZVZhcnNbY21kXSwgc3RyLCAwLCBjbWQpO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmlzX2luX2hlYWRlcikgLy8gSWYgdGhlIGZvbnQgYXBwZWFycyBpbiB0aGUgaGVhZGVyLCB0aGVuIGl0IGJlY29tZXMgdGhlIGRlZmF1bHQgZm9udC5cblx0XHRcdHR1bmUuZm9ybWF0dGluZ1tjbWRdID0gbXVsdGlsaW5lVmFyc1tjbWRdO1xuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXHR2YXIgZ2V0R2xvYmFsRm9udCA9IGZ1bmN0aW9uKGNtZCwgdG9rZW5zLCBzdHIpIHtcblx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBcXFwiXCIgKyBjbWQgKyBcIlxcXCIgcmVxdWlyZXMgYSBmb250IGFzIGEgcGFyYW1ldGVyLlwiO1xuXHRcdHR1bmUuZm9ybWF0dGluZ1tjbWRdID0gZ2V0Rm9udFBhcmFtZXRlcih0b2tlbnMsIHR1bmUuZm9ybWF0dGluZ1tjbWRdLCBzdHIsIDAsIGNtZCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cblx0dmFyIHNldFNjYWxlID0gZnVuY3Rpb24oY21kLCB0b2tlbnMpIHtcblx0XHR2YXIgc2NyYXRjaCA9IFwiXCI7XG5cdFx0cGFyc2VDb21tb24uZWFjaCh0b2tlbnMsIGZ1bmN0aW9uKHRvaykge1xuXHRcdFx0c2NyYXRjaCArPSB0b2sudG9rZW47XG5cdFx0fSk7XG5cdFx0dmFyIG51bSA9IHBhcnNlRmxvYXQoc2NyYXRjaCk7XG5cdFx0aWYgKGlzTmFOKG51bSkgfHwgbnVtID09PSAwKVxuXHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyBhIG51bWJlciBhcyBhIHBhcmFtZXRlci5cIjtcblx0XHR0dW5lLmZvcm1hdHRpbmcuc2NhbGUgPSBudW07XG5cblx0fTtcblxuXHR2YXIgZ2V0UmVxdWlyZWRNZWFzdXJlbWVudCA9IGZ1bmN0aW9uKGNtZCwgdG9rZW5zKSB7XG5cdFx0dmFyIHBvaW50cyA9IHRva2VuaXplci5nZXRNZWFzdXJlbWVudCh0b2tlbnMpO1xuXHRcdGlmIChwb2ludHMudXNlZCA9PT0gMCB8fCB0b2tlbnMubGVuZ3RoICE9PSAwKVxuXHRcdFx0cmV0dXJuIHsgZXJyb3I6IFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyBhIG1lYXN1cmVtZW50IGFzIGEgcGFyYW1ldGVyLlwifTtcblx0XHRyZXR1cm4gcG9pbnRzLnZhbHVlO1xuXHR9O1xuXHR2YXIgb25lUGFyYW1ldGVyTWVhc3VyZW1lbnQgPSBmdW5jdGlvbihjbWQsIHRva2Vucykge1xuXHRcdHZhciBwb2ludHMgPSB0b2tlbml6ZXIuZ2V0TWVhc3VyZW1lbnQodG9rZW5zKTtcblx0XHRpZiAocG9pbnRzLnVzZWQgPT09IDAgfHwgdG9rZW5zLmxlbmd0aCAhPT0gMClcblx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBcXFwiXCIgKyBjbWQgKyBcIlxcXCIgcmVxdWlyZXMgYSBtZWFzdXJlbWVudCBhcyBhIHBhcmFtZXRlci5cIjtcblx0XHR0dW5lLmZvcm1hdHRpbmdbY21kXSA9IHBvaW50cy52YWx1ZTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHR2YXIgYWRkTXVsdGlsaW5lVmFyID0gZnVuY3Rpb24oa2V5LCBjbWQsIHRva2VucywgbWluLCBtYXgpIHtcblx0XHRpZiAodG9rZW5zLmxlbmd0aCAhPT0gMSB8fCB0b2tlbnNbMF0udHlwZSAhPT0gJ251bWJlcicpXG5cdFx0XHRyZXR1cm4gXCJEaXJlY3RpdmUgXFxcIlwiICsgY21kICsgXCJcXFwiIHJlcXVpcmVzIGEgbnVtYmVyIGFzIGEgcGFyYW1ldGVyLlwiO1xuXHRcdHZhciBpID0gdG9rZW5zWzBdLmludHQ7XG5cdFx0aWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIGkgPCBtaW4pXG5cdFx0XHRyZXR1cm4gXCJEaXJlY3RpdmUgXFxcIlwiICsgY21kICsgXCJcXFwiIHJlcXVpcmVzIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcIiArIG1pbiArIFwiIGFzIGEgcGFyYW1ldGVyLlwiO1xuXHRcdGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBpID4gbWF4KVxuXHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyBhIG51bWJlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXCIgKyBtYXggKyBcIiBhcyBhIHBhcmFtZXRlci5cIjtcblx0XHRtdWx0aWxpbmVWYXJzW2tleV0gPSBpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdHZhciBhZGRNdWx0aWxpbmVWYXJCb29sID0gZnVuY3Rpb24oa2V5LCBjbWQsIHRva2Vucykge1xuXHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAxICYmICh0b2tlbnNbMF0udG9rZW4gPT09ICd0cnVlJyB8fCB0b2tlbnNbMF0udG9rZW4gPT09ICdmYWxzZScpKSB7XG5cdFx0XHRtdWx0aWxpbmVWYXJzW2tleV0gPSB0b2tlbnNbMF0udG9rZW4gPT09ICd0cnVlJztcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR2YXIgc3RyID0gYWRkTXVsdGlsaW5lVmFyKGtleSwgY21kLCB0b2tlbnMsIDAsIDEpO1xuXHRcdGlmIChzdHIgIT09IG51bGwpIHJldHVybiBzdHI7XG5cdFx0bXVsdGlsaW5lVmFyc1trZXldID0gKG11bHRpbGluZVZhcnNba2V5XSA9PT0gMSk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cblx0dmFyIGFkZE11bHRpbGluZVZhck9uZVBhcmFtQ2hvaWNlID0gZnVuY3Rpb24oa2V5LCBjbWQsIHRva2VucywgY2hvaWNlcykge1xuXHRcdGlmICh0b2tlbnMubGVuZ3RoICE9PSAxKVxuXHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyBvbmUgb2YgWyBcIiArIGNob2ljZXMuam9pbihcIiwgXCIpICsgXCIgXSBhcyBhIHBhcmFtZXRlci5cIjtcblx0XHR2YXIgY2hvaWNlID0gdG9rZW5zWzBdLnRva2VuO1xuXHRcdHZhciBmb3VuZCA9IGZhbHNlO1xuXHRcdGZvciAodmFyIGkgPSAwOyAhZm91bmQgJiYgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChjaG9pY2VzW2ldID09PSBjaG9pY2UpXG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKCFmb3VuZClcblx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBcXFwiXCIgKyBjbWQgKyBcIlxcXCIgcmVxdWlyZXMgb25lIG9mIFsgXCIgKyBjaG9pY2VzLmpvaW4oXCIsIFwiKSArIFwiIF0gYXMgYSBwYXJhbWV0ZXIuXCI7XG5cdFx0bXVsdGlsaW5lVmFyc1trZXldID0gY2hvaWNlO1xuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdHZhciBtaWRpQ21kUGFyYW0wID0gW1xuXHRcdFwibm9iYXJsaW5lc1wiLFxuXHRcdFwiYmFybGluZXNcIixcblx0XHRcImJlYXRhY2NlbnRzXCIsXG5cdFx0XCJub2JlYXRhY2NlbnRzXCIsXG5cdFx0XCJkcm9uZW9uXCIsXG5cdFx0XCJkcm9uZW9mZlwiLFxuXHRcdFwiZHJ1bW9uXCIsXG5cdFx0XCJkcnVtb2ZmXCIsXG5cdFx0XCJmZXJtYXRhZml4ZWRcIixcblx0XHRcImZlcm1hdGFwcm9wb3J0aW9uYWxcIixcblx0XHRcImdjaG9yZG9uXCIsXG5cdFx0XCJnY2hvcmRvZmZcIixcblx0XHRcImNvbnRyb2xjb21ib1wiLFxuXHRcdFwidGVtcGVyYW1lbnRub3JtYWxcIixcblx0XHRcIm5vcG9ydGFtZW50b1wiXG5cdF07XG5cdHZhciBtaWRpQ21kUGFyYW0xU3RyaW5nID0gW1xuXHRcdFwiZ2Nob3JkXCIsXG5cdFx0XCJwdHN0cmVzc1wiLFxuXHRcdFwiYmVhdHN0cmluZ1wiXG5cdF07XG5cdHZhciBtaWRpQ21kUGFyYW0xSW50ZWdlciA9IFtcblx0XHRcImJhc3N2b2xcIixcblx0XHRcImNob3Jkdm9sXCIsXG5cdFx0XCJjXCIsXG5cdFx0XCJjaGFubmVsXCIsXG5cdFx0XCJiZWF0bW9kXCIsXG5cdFx0XCJkZWx0YWxvdWRuZXNzXCIsXG5cdFx0XCJkcnVtYmFyc1wiLFxuXHRcdFwiZ3JhY2VkaXZpZGVyXCIsXG5cdFx0XCJtYWtlY2hvcmRjaGFubmVsc1wiLFxuXHRcdFwicmFuZG9tY2hvcmRhdHRhY2tcIixcblx0XHRcImNob3JkYXR0YWNrXCIsXG5cdFx0XCJzdHJlc3Ntb2RlbFwiLFxuXHRcdFwidHJhbnNwb3NlXCIsXG5cdFx0XCJydHJhbnNwb3NlXCIsXG5cdFx0XCJ2b2xcIixcblx0XHRcInZvbGluY1wiXG5cdF07XG5cdHZhciBtaWRpQ21kUGFyYW0xSW50ZWdlcjFPcHRpb25hbEludGVnZXIgPSBbXG5cdFx0XCJwcm9ncmFtXCJcblx0XTtcblx0dmFyIG1pZGlDbWRQYXJhbTJJbnRlZ2VyID0gW1xuXHRcdFwicmF0aW9cIixcblx0XHRcInNudFwiLFxuXHRcdFwiYmVuZHZlbG9jaXR5XCIsXG5cdFx0XCJwaXRjaGJlbmRcIixcblx0XHRcImNvbnRyb2xcIixcblx0XHRcInRlbXBlcmFtZW50bGluZWFyXCJcblx0XTtcblx0dmFyIG1pZGlDbWRQYXJhbTRJbnRlZ2VyID0gW1xuXHRcdFwiYmVhdFwiXG5cdF07XG5cdHZhciBtaWRpQ21kUGFyYW01SW50ZWdlciA9IFtcblx0XHRcImRyb25lXCJcblx0XTtcblx0dmFyIG1pZGlDbWRQYXJhbTFJbnRlZ2VyT3B0aW9uYWxPY3RhdmUgPSBbXG5cdFx0XCJiYXNzcHJvZ1wiLFxuXHRcdFwiY2hvcmRwcm9nXCJcblx0XTtcblx0dmFyIG1pZGlDbWRQYXJhbTFTdHJpbmcxSW50ZWdlciA9IFtcblx0XHRcInBvcnRhbWVudG9cIlxuXHRdO1xuXHR2YXIgbWlkaUNtZFBhcmFtRnJhY3Rpb24gPSBbXG5cdFx0XCJleHBhbmRcIixcblx0XHRcImdyYWNlXCIsXG5cdFx0XCJ0cmltXCJcblx0XTtcblx0dmFyIG1pZGlDbWRQYXJhbTFTdHJpbmdWYXJpYWJsZUludGVnZXJzID0gW1xuXHRcdFwiZHJ1bVwiLFxuXHRcdFwiY2hvcmRuYW1lXCJcblx0XTtcblxuXHR2YXIgcGFyc2VNaWRpQ29tbWFuZCA9IGZ1bmN0aW9uKG1pZGksIHR1bmUsIHJlc3RPZlN0cmluZykge1xuXHRcdHZhciBtaWRpX2NtZCA9IG1pZGkuc2hpZnQoKS50b2tlbjtcblx0XHR2YXIgbWlkaV9wYXJhbXMgPSBbXTtcblx0XHRpZiAobWlkaUNtZFBhcmFtMC5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBOTyBQQVJBTUVURVJTXG5cdFx0XHRpZiAobWlkaS5sZW5ndGggIT09IDApXG5cdFx0XHRcdHdhcm4oXCJVbmV4cGVjdGVkIHBhcmFtZXRlciBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0fSBlbHNlIGlmIChtaWRpQ21kUGFyYW0xU3RyaW5nLmluZGV4T2YobWlkaV9jbWQpID49IDApIHtcblx0XHRcdC8vIE9ORSBTVFJJTkcgUEFSQU1FVEVSXG5cdFx0XHRpZiAobWlkaS5sZW5ndGggIT09IDEpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBvbmUgcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzBdLnRva2VuKTtcblx0XHR9IGVsc2UgaWYgKG1pZGlDbWRQYXJhbTFJbnRlZ2VyLmluZGV4T2YobWlkaV9jbWQpID49IDApIHtcblx0XHRcdC8vIE9ORSBJTlQgUEFSQU1FVEVSXG5cdFx0XHRpZiAobWlkaS5sZW5ndGggIT09IDEpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBvbmUgcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBpbnRlZ2VyIHBhcmFtZXRlciBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVswXS5pbnR0KTtcblx0XHR9IGVsc2UgaWYgKG1pZGlDbWRQYXJhbTFJbnRlZ2VyMU9wdGlvbmFsSW50ZWdlci5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBPTkUgSU5UIFBBUkFNRVRFUiwgT05FIE9QVElPTkFMIFBBUkFNRVRFUlxuXHRcdFx0aWYgKG1pZGkubGVuZ3RoICE9PSAxICYmIG1pZGkubGVuZ3RoICE9PSAyKVxuXHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgb25lIG9yIHR3byBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGludGVnZXIgcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGkubGVuZ3RoID09PSAyICYmIG1pZGlbMV0udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGludGVnZXIgcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbMF0uaW50dCk7XG5cdFx0XHRcdGlmIChtaWRpLmxlbmd0aCA9PT0gMilcblx0XHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbMV0uaW50dCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtaWRpQ21kUGFyYW0ySW50ZWdlci5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBUV08gSU5UIFBBUkFNRVRFUlNcblx0XHRcdGlmIChtaWRpLmxlbmd0aCAhPT0gMilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHR3byBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJudW1iZXJcIiB8fCBtaWRpWzFdLnR5cGUgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCB0d28gaW50ZWdlciBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbMF0uaW50dCk7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVsxXS5pbnR0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1pZGlDbWRQYXJhbTFTdHJpbmcxSW50ZWdlci5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBPTkUgU1RSSU5HIFBBUkFNRVRFUiwgT05FIElOVCBQQVJBTUVURVJcblx0XHRcdGlmIChtaWRpLmxlbmd0aCAhPT0gMilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHR3byBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJhbHBoYVwiIHx8IG1pZGlbMV0udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBzdHJpbmcgYW5kIG9uZSBpbnRlZ2VyIHBhcmFtZXRlcnMgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVswXS50b2tlbik7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVsxXS5pbnR0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1pZGlfY21kID09PSAnZHJ1bW1hcCcpIHtcblx0XHRcdC8vIEJVSUxEIEFOIE9CSkVDVCBPRiBBQkMgTk9URSA9PiBNSURJIE5PVEVcblx0XHRcdGlmIChtaWRpLmxlbmd0aCA9PT0gMiAmJiBtaWRpWzBdLnR5cGUgPT09ICdhbHBoYScgJiYgbWlkaVsxXS50eXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRpZiAoIXR1bmUuZm9ybWF0dGluZykgdHVuZS5mb3JtYXR0aW5nID0ge307XG5cdFx0XHRcdGlmICghdHVuZS5mb3JtYXR0aW5nLm1pZGkpIHR1bmUuZm9ybWF0dGluZy5taWRpID0ge307XG5cdFx0XHRcdGlmICghdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcCkgdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcCA9IHt9O1xuXHRcdFx0XHR0dW5lLmZvcm1hdHRpbmcubWlkaS5kcnVtbWFwW21pZGlbMF0udG9rZW5dID0gbWlkaVsxXS5pbnR0O1xuXHRcdFx0XHRtaWRpX3BhcmFtcyA9IHR1bmUuZm9ybWF0dGluZy5taWRpLmRydW1tYXA7XG5cdFx0XHR9IGVsc2UgaWYgKG1pZGkubGVuZ3RoID09PSAzICYmIG1pZGlbMF0udHlwZSA9PT0gJ3B1bmN0JyAmJiBtaWRpWzFdLnR5cGUgPT09ICdhbHBoYScgJiYgbWlkaVsyXS50eXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRpZiAoIXR1bmUuZm9ybWF0dGluZykgdHVuZS5mb3JtYXR0aW5nID0ge307XG5cdFx0XHRcdGlmICghdHVuZS5mb3JtYXR0aW5nLm1pZGkpIHR1bmUuZm9ybWF0dGluZy5taWRpID0ge307XG5cdFx0XHRcdGlmICghdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcCkgdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcCA9IHt9O1xuXHRcdFx0XHR0dW5lLmZvcm1hdHRpbmcubWlkaS5kcnVtbWFwW21pZGlbMF0udG9rZW4rbWlkaVsxXS50b2tlbl0gPSBtaWRpWzJdLmludHQ7XG5cdFx0XHRcdG1pZGlfcGFyYW1zID0gdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBvbmUgbm90ZSBuYW1lIGFuZCBvbmUgaW50ZWdlciBwYXJhbWV0ZXIgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobWlkaUNtZFBhcmFtRnJhY3Rpb24uaW5kZXhPZihtaWRpX2NtZCkgPj0gMCkge1xuXHRcdFx0Ly8gT05FIEZSQUNUSU9OIFBBUkFNRVRFUlxuXHRcdFx0aWYgKG1pZGkubGVuZ3RoICE9PSAzKVxuXHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgZnJhY3Rpb24gcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJudW1iZXJcIiB8fCBtaWRpWzFdLnRva2VuICE9PSBcIi9cIiB8fCBtaWRpWzJdLnR5cGUgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBmcmFjdGlvbiBwYXJhbWV0ZXIgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVswXS5pbnR0KTtcblx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzJdLmludHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobWlkaUNtZFBhcmFtNEludGVnZXIuaW5kZXhPZihtaWRpX2NtZCkgPj0gMCkge1xuXHRcdFx0Ly8gRk9VUiBJTlQgUEFSQU1FVEVSU1xuXHRcdFx0aWYgKG1pZGkubGVuZ3RoICE9PSA0KVxuXHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgZm91ciBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2UgaWYgKG1pZGlbMF0udHlwZSAhPT0gXCJudW1iZXJcIiB8fCBtaWRpWzFdLnR5cGUgIT09IFwibnVtYmVyXCIgfHwgbWlkaVsyXS50eXBlICE9PSBcIm51bWJlclwiIHx8IG1pZGlbM10udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGZvdXIgaW50ZWdlciBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbMF0uaW50dCk7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVsxXS5pbnR0KTtcblx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzJdLmludHQpO1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbM10uaW50dCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtaWRpQ21kUGFyYW01SW50ZWdlci5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBGSVZFIElOVCBQQVJBTUVURVJTXG5cdFx0XHRpZiAobWlkaS5sZW5ndGggIT09IDUpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBmaXZlIHBhcmFtZXRlcnMgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0ZWxzZSBpZiAobWlkaVswXS50eXBlICE9PSBcIm51bWJlclwiIHx8IG1pZGlbMV0udHlwZSAhPT0gXCJudW1iZXJcIiB8fCBtaWRpWzJdLnR5cGUgIT09IFwibnVtYmVyXCIgfHwgbWlkaVszXS50eXBlICE9PSBcIm51bWJlclwiIHx8IG1pZGlbNF0udHlwZSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGZpdmUgaW50ZWdlciBwYXJhbWV0ZXJzIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbMF0uaW50dCk7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVsxXS5pbnR0KTtcblx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzJdLmludHQpO1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKG1pZGlbM10uaW50dCk7XG5cdFx0XHRcdG1pZGlfcGFyYW1zLnB1c2gobWlkaVs0XS5pbnR0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1pZGlDbWRQYXJhbTFJbnRlZ2VyMU9wdGlvbmFsSW50ZWdlci5pbmRleE9mKG1pZGlfY21kKSA+PSAwKSB7XG5cdFx0XHQvLyBPTkUgSU5UIFBBUkFNRVRFUiwgT05FIE9QVElPTkFMIE9DVEFWRSBQQVJBTUVURVJcblx0XHRcdGlmIChtaWRpLmxlbmd0aCAhPT0gMSB8fCBtaWRpLmxlbmd0aCAhPT0gNClcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBvciB0d28gcGFyYW1ldGVycyBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRlbHNlIGlmIChtaWRpWzBdLnR5cGUgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRlbHNlIGlmIChtaWRpLmxlbmd0aCA9PT0gNCkge1xuXHRcdFx0XHRpZiAobWlkaVsxXS50b2tlbiAhPT0gXCJvY3RhdmVcIilcblx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgb2N0YXZlIHBhcmFtZXRlciBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRcdGlmIChtaWRpWzJdLnRva2VuICE9PSBcIj1cIilcblx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgb2N0YXZlIHBhcmFtZXRlciBpbiBNSURJIFwiICsgbWlkaV9jbWQsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRcdGlmIChtaWRpWzNdLnR5cGUgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGludGVnZXIgcGFyYW1ldGVyIGZvciBvY3RhdmUgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzBdLmludHQpO1xuXHRcdFx0XHRpZiAobWlkaS5sZW5ndGggPT09IDQpXG5cdFx0XHRcdFx0bWlkaV9wYXJhbXMucHVzaChtaWRpWzNdLmludHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobWlkaUNtZFBhcmFtMVN0cmluZ1ZhcmlhYmxlSW50ZWdlcnMuaW5kZXhPZihtaWRpX2NtZCkgPj0gMCkge1xuXHRcdFx0Ly8gT05FIFNUUklORywgVkFSSUFCTEUgSU5UIFBBUkFNRVRFUlNcblx0XHRcdGlmIChtaWRpLmxlbmd0aCA8IDIpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBzdHJpbmcgcGFyYW1ldGVyIGFuZCBhdCBsZWFzdCBvbmUgaW50ZWdlciBwYXJhbWV0ZXIgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0ZWxzZSBpZiAobWlkaVswXS50eXBlICE9PSBcImFscGhhXCIpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBzdHJpbmcgcGFyYW1ldGVyIGFuZCBhdCBsZWFzdCBvbmUgaW50ZWdlciBwYXJhbWV0ZXIgaW4gTUlESSBcIiArIG1pZGlfY21kLCByZXN0T2ZTdHJpbmcsIDApO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHZhciBwID0gbWlkaS5zaGlmdCgpO1xuXHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKHAudG9rZW4pO1xuXHRcdFx0XHR3aGlsZSAobWlkaS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cCA9IG1pZGkuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAocC50eXBlICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdFx0d2FybihcIkV4cGVjdGVkIGludGVnZXIgcGFyYW1ldGVyIGluIE1JREkgXCIgKyBtaWRpX2NtZCwgcmVzdE9mU3RyaW5nLCAwKTtcblx0XHRcdFx0XHRtaWRpX3BhcmFtcy5wdXNoKHAuaW50dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHVuZS5oYXNCZWdpbk11c2ljKCkpXG5cdFx0XHR0dW5lLmFwcGVuZEVsZW1lbnQoJ21pZGknLCAtMSwgLTEsIHsgY21kOiBtaWRpX2NtZCwgcGFyYW1zOiBtaWRpX3BhcmFtcyB9KTtcblx0XHRlbHNlIHtcblx0XHRcdGlmICh0dW5lLmZvcm1hdHRpbmdbJ21pZGknXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHR0dW5lLmZvcm1hdHRpbmdbJ21pZGknXSA9IHt9O1xuXHRcdFx0dHVuZS5mb3JtYXR0aW5nWydtaWRpJ11bbWlkaV9jbWRdID0gbWlkaV9wYXJhbXM7XG5cdFx0fVxuXHR9O1xuXG5cdHBhcnNlRGlyZWN0aXZlLnBhcnNlRm9udENoYW5nZUxpbmUgPSBmdW5jdGlvbih0ZXh0c3RyKSB7XG5cdFx0dmFyIHRleHRQYXJ0cyA9IHRleHRzdHIuc3BsaXQoJyQnKTtcblx0XHRpZiAodGV4dFBhcnRzLmxlbmd0aCA+IDEgJiYgbXVsdGlsaW5lVmFycy5zZXRmb250KSB7XG5cdFx0XHR2YXIgdGV4dGFyciA9IFsgeyB0ZXh0OiB0ZXh0UGFydHNbMF0gfV07XG5cdFx0XHRmb3IgKHZhciBpID0gMTsgaSA8IHRleHRQYXJ0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAodGV4dFBhcnRzW2ldLmNoYXJBdCgwKSA9PT0gJzAnKVxuXHRcdFx0XHRcdHRleHRhcnIucHVzaCh7IHRleHQ6IHRleHRQYXJ0c1tpXS5zdWJzdHJpbmcoMSkgfSk7XG5cdFx0XHRcdGVsc2UgaWYgKHRleHRQYXJ0c1tpXS5jaGFyQXQoMCkgPT09ICcxJyAmJiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbMV0pXG5cdFx0XHRcdFx0dGV4dGFyci5wdXNoKHtmb250OiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbMV0sIHRleHQ6IHRleHRQYXJ0c1tpXS5zdWJzdHJpbmcoMSkgfSk7XG5cdFx0XHRcdGVsc2UgaWYgKHRleHRQYXJ0c1tpXS5jaGFyQXQoMCkgPT09ICcyJyAmJiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbMl0pXG5cdFx0XHRcdFx0dGV4dGFyci5wdXNoKHtmb250OiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbMl0sIHRleHQ6IHRleHRQYXJ0c1tpXS5zdWJzdHJpbmcoMSkgfSk7XG5cdFx0XHRcdGVsc2UgaWYgKHRleHRQYXJ0c1tpXS5jaGFyQXQoMCkgPT09ICczJyAmJiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbM10pXG5cdFx0XHRcdFx0dGV4dGFyci5wdXNoKHtmb250OiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbM10sIHRleHQ6IHRleHRQYXJ0c1tpXS5zdWJzdHJpbmcoMSkgfSk7XG5cdFx0XHRcdGVsc2UgaWYgKHRleHRQYXJ0c1tpXS5jaGFyQXQoMCkgPT09ICc0JyAmJiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbNF0pXG5cdFx0XHRcdFx0dGV4dGFyci5wdXNoKHtmb250OiBtdWx0aWxpbmVWYXJzLnNldGZvbnRbNF0sIHRleHQ6IHRleHRQYXJ0c1tpXS5zdWJzdHJpbmcoMSkgfSk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0ZXh0YXJyW3RleHRhcnIubGVuZ3RoLTFdLnRleHQgKz0gJyQnICsgdGV4dFBhcnRzW2ldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRleHRhcnIubGVuZ3RoID4gMSlcblx0XHRcdFx0cmV0dXJuIHRleHRhcnI7XG5cdFx0fVxuXHRcdHJldHVybiB0ZXh0c3RyO1xuXHR9O1xuXG5cdHZhciBwb3NpdGlvbkNob2ljZXMgPSBbICdhdXRvJywgJ2Fib3ZlJywgJ2JlbG93JywgJ2hpZGRlbicgXTtcblx0cGFyc2VEaXJlY3RpdmUuYWRkRGlyZWN0aXZlID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIHRva2VucyA9IHRva2VuaXplci50b2tlbml6ZShzdHIsIDAsIHN0ci5sZW5ndGgpO1x0Ly8gMyBvciBtb3JlICUgaW4gYSByb3csIG9yIGp1c3Qgc3BhY2VzIGFmdGVyICUlIGlzIGp1c3QgYSBjb21tZW50XG5cdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDAgfHwgdG9rZW5zWzBdLnR5cGUgIT09ICdhbHBoYScpIHJldHVybiBudWxsO1xuXHRcdHZhciByZXN0T2ZTdHJpbmcgPSBzdHIuc3Vic3RyaW5nKHN0ci5pbmRleE9mKHRva2Vuc1swXS50b2tlbikrdG9rZW5zWzBdLnRva2VuLmxlbmd0aCk7XG5cdFx0cmVzdE9mU3RyaW5nID0gdG9rZW5pemVyLnN0cmlwQ29tbWVudChyZXN0T2ZTdHJpbmcpO1xuXHRcdHZhciBjbWQgPSB0b2tlbnMuc2hpZnQoKS50b2tlbi50b0xvd2VyQ2FzZSgpO1xuXHRcdHZhciBzY3JhdGNoID0gXCJcIjtcblx0XHRzd2l0Y2ggKGNtZClcblx0XHR7XG5cdFx0XHQvLyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2VyZSBhZGRlZCB0byBhYmNfcGFyc2VyX2xpbnQsIGJ1dCBoYXZlbid0IGJlZW4gaW1wbGVtZW50ZWQgaGVyZS5cblx0XHRcdC8vIE1vc3Qgb2YgdGhlbSBhcmUgZGlyZWN0IHRyYW5zbGF0aW9ucyBmcm9tIHRoZSBkaXJlY3RpdmVzIHRoYXQgd2lsbCBiZSBwYXJzZWQgaW4uIFNlZSBhYmNtMnBzJ3MgZm9ybWF0LnR4dCBmb3IgaW5mbyBvbiBlYWNoIG9mIHRoZXNlLlxuXHRcdFx0Ly9cdFx0XHRcdFx0YWxpZ25iYXJzOiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRhbGlnbmNvbXBvc2VyOiB7IHR5cGU6IFwic3RyaW5nXCIsIEVudW06IFsgJ2xlZnQnLCAnY2VudGVyJywncmlnaHQnIF0sIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRic3RlbWRvd246IHsgdHlwZTogXCJib29sZWFuXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRjb250aW51ZWFsbDogeyB0eXBlOiBcImJvb2xlYW5cIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdGR5bmFsaWduOiB7IHR5cGU6IFwiYm9vbGVhblwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0ZXhwcmFib3ZlOiB7IHR5cGU6IFwiYm9vbGVhblwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0ZXhwcmJlbG93OiB7IHR5cGU6IFwiYm9vbGVhblwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0Z2Nob3JkYm94OiB7IHR5cGU6IFwiYm9vbGVhblwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0Z3JhY2VzbHVyczogeyB0eXBlOiBcImJvb2xlYW5cIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdGdyYWNlc3BhY2ViZWZvcmU6IHsgdHlwZTogXCJudW1iZXJcIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdGdyYWNlc3BhY2VpbnNpZGU6IHsgdHlwZTogXCJudW1iZXJcIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdGdyYWNlc3BhY2VhZnRlcjogeyB0eXBlOiBcIm51bWJlclwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0aW5mb3NwYWNlOiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRsaW5lc2tpcGZhYzogeyB0eXBlOiBcIm51bWJlclwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0bWF4c2hyaW5rOiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRtYXhzdGFmZnNlcDogeyB0eXBlOiBcIm51bWJlclwiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Ly9cdFx0XHRcdFx0bWF4c3lzc3RhZmZzZXA6IHsgdHlwZTogXCJudW1iZXJcIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdG5vdGVzcGFjaW5nZmFjdG9yOiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRwYXJza2lwZmFjOiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRzbHVyaGVpZ2h0OiB7IHR5cGU6IFwibnVtYmVyXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRzcGxpdHR1bmU6IHsgdHlwZTogXCJib29sZWFuXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRzcXVhcmVicmV2ZTogeyB0eXBlOiBcImJvb2xlYW5cIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdHN0ZW1oZWlnaHQ6IHsgdHlwZTogXCJudW1iZXJcIiwgb3B0aW9uYWw6IHRydWUgfSxcblx0XHRcdC8vXHRcdFx0XHRcdHN0cmFpZ2h0ZmxhZ3M6IHsgdHlwZTogXCJib29sZWFuXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHRzdHJldGNoc3RhZmY6IHsgdHlwZTogXCJib29sZWFuXCIsIG9wdGlvbmFsOiB0cnVlIH0sXG5cdFx0XHQvL1x0XHRcdFx0XHR0aXRsZWZvcm1hdDogeyB0eXBlOiBcInN0cmluZ1wiLCBvcHRpb25hbDogdHJ1ZSB9LFxuXHRcdFx0Y2FzZSBcImJhZ3BpcGVzXCI6dHVuZS5mb3JtYXR0aW5nLmJhZ3BpcGVzID0gdHJ1ZTticmVhaztcblx0XHRcdGNhc2UgXCJmbGF0YmVhbXNcIjp0dW5lLmZvcm1hdHRpbmcuZmxhdGJlYW1zID0gdHJ1ZTticmVhaztcblx0XHRcdGNhc2UgXCJsYW5kc2NhcGVcIjptdWx0aWxpbmVWYXJzLmxhbmRzY2FwZSA9IHRydWU7YnJlYWs7XG5cdFx0XHRjYXNlIFwicGFwZXJzaXplXCI6bXVsdGlsaW5lVmFycy5wYXBlcnNpemUgPSByZXN0T2ZTdHJpbmc7YnJlYWs7XG5cdFx0XHRjYXNlIFwic2x1cmdyYWNlc1wiOnR1bmUuZm9ybWF0dGluZy5zbHVyZ3JhY2VzID0gdHJ1ZTticmVhaztcblx0XHRcdGNhc2UgXCJzdHJldGNobGFzdFwiOnR1bmUuZm9ybWF0dGluZy5zdHJldGNobGFzdCA9IHRydWU7YnJlYWs7XG5cdFx0XHRjYXNlIFwidGl0bGVjYXBzXCI6bXVsdGlsaW5lVmFycy50aXRsZWNhcHMgPSB0cnVlO2JyZWFrO1xuXHRcdFx0Y2FzZSBcInRpdGxlbGVmdFwiOnR1bmUuZm9ybWF0dGluZy50aXRsZWxlZnQgPSB0cnVlO2JyZWFrO1xuXHRcdFx0Y2FzZSBcIm1lYXN1cmVib3hcIjp0dW5lLmZvcm1hdHRpbmcubWVhc3VyZWJveCA9IHRydWU7YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ2b2NhbFwiOiByZXR1cm4gYWRkTXVsdGlsaW5lVmFyT25lUGFyYW1DaG9pY2UoXCJ2b2NhbFBvc2l0aW9uXCIsIGNtZCwgdG9rZW5zLCBwb3NpdGlvbkNob2ljZXMpO1xuXHRcdFx0Y2FzZSBcImR5bmFtaWNcIjogcmV0dXJuIGFkZE11bHRpbGluZVZhck9uZVBhcmFtQ2hvaWNlKFwiZHluYW1pY1Bvc2l0aW9uXCIsIGNtZCwgdG9rZW5zLCBwb3NpdGlvbkNob2ljZXMpO1xuXHRcdFx0Y2FzZSBcImdjaG9yZFwiOiByZXR1cm4gYWRkTXVsdGlsaW5lVmFyT25lUGFyYW1DaG9pY2UoXCJjaG9yZFBvc2l0aW9uXCIsIGNtZCwgdG9rZW5zLCBwb3NpdGlvbkNob2ljZXMpO1xuXHRcdFx0Y2FzZSBcIm9ybmFtZW50XCI6IHJldHVybiBhZGRNdWx0aWxpbmVWYXJPbmVQYXJhbUNob2ljZShcIm9ybmFtZW50UG9zaXRpb25cIiwgY21kLCB0b2tlbnMsIHBvc2l0aW9uQ2hvaWNlcyk7XG5cdFx0XHRjYXNlIFwidm9sdW1lXCI6IHJldHVybiBhZGRNdWx0aWxpbmVWYXJPbmVQYXJhbUNob2ljZShcInZvbHVtZVBvc2l0aW9uXCIsIGNtZCwgdG9rZW5zLCBwb3NpdGlvbkNob2ljZXMpO1xuXG5cdFx0XHRjYXNlIFwiYm90bWFyZ2luXCI6XG5cdFx0XHRjYXNlIFwiYm90c3BhY2VcIjpcblx0XHRcdGNhc2UgXCJjb21wb3NlcnNwYWNlXCI6XG5cdFx0XHRjYXNlIFwiaW5kZW50XCI6XG5cdFx0XHRjYXNlIFwibGVmdG1hcmdpblwiOlxuXHRcdFx0Y2FzZSBcImxpbmVzZXBcIjpcblx0XHRcdGNhc2UgXCJtdXNpY3NwYWNlXCI6XG5cdFx0XHRjYXNlIFwicGFydHNzcGFjZVwiOlxuXHRcdFx0Y2FzZSBcInBhZ2VoZWlnaHRcIjpcblx0XHRcdGNhc2UgXCJwYWdld2lkdGhcIjpcblx0XHRcdGNhc2UgXCJyaWdodG1hcmdpblwiOlxuXHRcdFx0Y2FzZSBcInN0YWZmc2VwXCI6XG5cdFx0XHRjYXNlIFwic3RhZmZ3aWR0aFwiOlxuXHRcdFx0Y2FzZSBcInN1YnRpdGxlc3BhY2VcIjpcblx0XHRcdGNhc2UgXCJzeXNzdGFmZnNlcFwiOlxuXHRcdFx0Y2FzZSBcInN5c3RlbXNlcFwiOlxuXHRcdFx0Y2FzZSBcInRleHRzcGFjZVwiOlxuXHRcdFx0Y2FzZSBcInRpdGxlc3BhY2VcIjpcblx0XHRcdGNhc2UgXCJ0b3BtYXJnaW5cIjpcblx0XHRcdGNhc2UgXCJ0b3BzcGFjZVwiOlxuXHRcdFx0Y2FzZSBcInZvY2Fsc3BhY2VcIjpcblx0XHRcdGNhc2UgXCJ3b3Jkc3NwYWNlXCI6XG5cdFx0XHRcdHJldHVybiBvbmVQYXJhbWV0ZXJNZWFzdXJlbWVudChjbWQsIHRva2Vucyk7XG5cdFx0XHRjYXNlIFwidm9pY2VzY2FsZVwiOlxuXHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCAhPT0gMSB8fCB0b2tlbnNbMF0udHlwZSAhPT0gJ251bWJlcicpXG5cdFx0XHRcdFx0cmV0dXJuIFwidm9pY2VzY2FsZSByZXF1aXJlcyBvbmUgZmxvYXQgYXMgYSBwYXJhbWV0ZXJcIjtcblx0XHRcdFx0dmFyIHZvaWNlU2NhbGUgPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlKSB7XG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc2NhbGUgPSB2b2ljZVNjYWxlLmZsb2F0dDtcblx0XHRcdFx0XHR0dW5lLmNoYW5nZVZvaWNlU2NhbGUobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc2NhbGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0Y2FzZSBcInZza2lwXCI6XG5cdFx0XHRcdHZhciB2c2tpcCA9IGdldFJlcXVpcmVkTWVhc3VyZW1lbnQoY21kLCB0b2tlbnMpO1xuXHRcdFx0XHRpZiAodnNraXAuZXJyb3IpXG5cdFx0XHRcdFx0cmV0dXJuIHZza2lwLmVycm9yO1xuXHRcdFx0XHR0dW5lLmFkZFNwYWNpbmcodnNraXApO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdGNhc2UgXCJzY2FsZVwiOlxuXHRcdFx0XHRzZXRTY2FsZShjbWQsIHRva2Vucyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInNlcFwiOlxuXHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0XHR0dW5lLmFkZFNlcGFyYXRvcigpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR2YXIgcG9pbnRzID0gdG9rZW5pemVyLmdldE1lYXN1cmVtZW50KHRva2Vucyk7XG5cdFx0XHRcdFx0aWYgKHBvaW50cy51c2VkID09PSAwKVxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIFxcXCJcIiArIGNtZCArIFwiXFxcIiByZXF1aXJlcyAzIG51bWJlcnM6IHNwYWNlIGFib3ZlLCBzcGFjZSBiZWxvdywgbGVuZ3RoIG9mIGxpbmVcIjtcblx0XHRcdFx0XHR2YXIgc3BhY2VBYm92ZSA9IHBvaW50cy52YWx1ZTtcblxuXHRcdFx0XHRcdHBvaW50cyA9IHRva2VuaXplci5nZXRNZWFzdXJlbWVudCh0b2tlbnMpO1xuXHRcdFx0XHRcdGlmIChwb2ludHMudXNlZCA9PT0gMClcblx0XHRcdFx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBcXFwiXCIgKyBjbWQgKyBcIlxcXCIgcmVxdWlyZXMgMyBudW1iZXJzOiBzcGFjZSBhYm92ZSwgc3BhY2UgYmVsb3csIGxlbmd0aCBvZiBsaW5lXCI7XG5cdFx0XHRcdFx0dmFyIHNwYWNlQmVsb3cgPSBwb2ludHMudmFsdWU7XG5cblx0XHRcdFx0XHRwb2ludHMgPSB0b2tlbml6ZXIuZ2V0TWVhc3VyZW1lbnQodG9rZW5zKTtcblx0XHRcdFx0XHRpZiAocG9pbnRzLnVzZWQgPT09IDAgfHwgdG9rZW5zLmxlbmd0aCAhPT0gMClcblx0XHRcdFx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBcXFwiXCIgKyBjbWQgKyBcIlxcXCIgcmVxdWlyZXMgMyBudW1iZXJzOiBzcGFjZSBhYm92ZSwgc3BhY2UgYmVsb3csIGxlbmd0aCBvZiBsaW5lXCI7XG5cdFx0XHRcdFx0dmFyIGxlbkxpbmUgPSBwb2ludHMudmFsdWU7XG5cdFx0XHRcdFx0dHVuZS5hZGRTZXBhcmF0b3Ioc3BhY2VBYm92ZSwgc3BhY2VCZWxvdywgbGVuTGluZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYmFyc3BlcnN0YWZmXCI6XG5cdFx0XHRcdHNjcmF0Y2ggPSBhZGRNdWx0aWxpbmVWYXIoJ2JhcnNwZXJzdGFmZicsIGNtZCwgdG9rZW5zKTtcblx0XHRcdFx0aWYgKHNjcmF0Y2ggIT09IG51bGwpIHJldHVybiBzY3JhdGNoO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzdGFmZm5vbm90ZVwiOlxuXHRcdFx0XHQvLyBUaGUgc2Vuc2Ugb2YgdGhlIGJvb2xlYW4gaXMgb3Bwb3NpdGUgaGVyZS4gXCIwXCIgbWVhbnMgdHJ1ZS5cblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggIT09IDEpXG5cdFx0XHRcdFx0cmV0dXJuIFwiRGlyZWN0aXZlIHN0YWZmbm9ub3RlIHJlcXVpcmVzIG9uZSBwYXJhbWV0ZXI6IDAgb3IgMVwiO1xuXHRcdFx0XHRpZiAodG9rZW5zWzBdLnRva2VuID09PSAnMCcpXG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5zdGFmZm5vbm90ZSA9IHRydWU7XG5cdFx0XHRcdGVsc2UgaWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJzEnKVxuXHRcdFx0XHRcdG11bHRpbGluZVZhcnMuc3RhZmZub25vdGUgPSBmYWxzZTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJldHVybiBcIkRpcmVjdGl2ZSBzdGFmZm5vbm90ZSByZXF1aXJlcyBvbmUgcGFyYW1ldGVyOiAwIG9yIDEgKHJlY2VpdmVkIFwiICsgdG9rZW5zWzBdLnRva2VuICsgJyknO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJwcmludHRlbXBvXCI6XG5cdFx0XHRcdHNjcmF0Y2ggPSBhZGRNdWx0aWxpbmVWYXJCb29sKCdwcmludFRlbXBvJywgY21kLCB0b2tlbnMpO1xuXHRcdFx0XHRpZiAoc2NyYXRjaCAhPT0gbnVsbCkgcmV0dXJuIHNjcmF0Y2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInBhcnRzYm94XCI6XG5cdFx0XHRcdHNjcmF0Y2ggPSBhZGRNdWx0aWxpbmVWYXJCb29sKCdwYXJ0c0JveCcsIGNtZCwgdG9rZW5zKTtcblx0XHRcdFx0aWYgKHNjcmF0Y2ggIT09IG51bGwpIHJldHVybiBzY3JhdGNoO1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLnBhcnRzZm9udC5ib3ggPSBtdWx0aWxpbmVWYXJzLnBhcnRzQm94O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJmcmVlZ2Nob3JkXCI6XG5cdFx0XHRcdHNjcmF0Y2ggPSBhZGRNdWx0aWxpbmVWYXJCb29sKCdmcmVlZ2Nob3JkJywgY21kLCB0b2tlbnMpO1xuXHRcdFx0XHRpZiAoc2NyYXRjaCAhPT0gbnVsbCkgcmV0dXJuIHNjcmF0Y2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIm1lYXN1cmVuYlwiOlxuXHRcdFx0Y2FzZSBcImJhcm51bWJlcnNcIjpcblx0XHRcdFx0c2NyYXRjaCA9IGFkZE11bHRpbGluZVZhcignYmFyTnVtYmVycycsIGNtZCwgdG9rZW5zKTtcblx0XHRcdFx0aWYgKHNjcmF0Y2ggIT09IG51bGwpIHJldHVybiBzY3JhdGNoO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzZXRiYXJuYlwiOlxuXHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCAhPT0gMSB8fCB0b2tlbnNbMF0udHlwZSAhPT0gJ251bWJlcicpIHtcblx0XHRcdFx0XHRyZXR1cm4gJ0RpcmVjdGl2ZSBzZXRiYXJuYiByZXF1aXJlcyBhIG51bWJlciBhcyBhIHBhcmFtZXRlci4nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuY3VyckJhck51bWJlciA9IHR1bmUuc2V0QmFyTnVtYmVySW1tZWRpYXRlKHRva2Vuc1swXS5pbnR0KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYmVnaW50ZXh0XCI6XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuaW5UZXh0QmxvY2sgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJjb250aW51ZWFsbFwiOlxuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmNvbnRpbnVlYWxsID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYmVnaW5wc1wiOlxuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmluUHNCbG9jayA9IHRydWU7XG5cdFx0XHRcdHdhcm4oXCJQb3N0c2NyaXB0IGlnbm9yZWRcIiwgc3RyLCAwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZGVjb1wiOlxuXHRcdFx0XHRpZiAocmVzdE9mU3RyaW5nLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5pZ25vcmVkRGVjb3JhdGlvbnMucHVzaChyZXN0T2ZTdHJpbmcuc3Vic3RyaW5nKDAsIHJlc3RPZlN0cmluZy5pbmRleE9mKCcgJykpKTtcblx0XHRcdFx0d2FybihcIkRlY29yYXRpb24gcmVkZWZpbml0aW9uIGlnbm9yZWRcIiwgc3RyLCAwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0XHR2YXIgdGV4dHN0ciA9IHRva2VuaXplci50cmFuc2xhdGVTdHJpbmcocmVzdE9mU3RyaW5nKTtcblx0XHRcdFx0dHVuZS5hZGRUZXh0KHBhcnNlRGlyZWN0aXZlLnBhcnNlRm9udENoYW5nZUxpbmUodGV4dHN0cikpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJjZW50ZXJcIjpcblx0XHRcdFx0dmFyIGNlbnRlcnN0ciA9IHRva2VuaXplci50cmFuc2xhdGVTdHJpbmcocmVzdE9mU3RyaW5nKTtcblx0XHRcdFx0dHVuZS5hZGRDZW50ZXJlZChwYXJzZURpcmVjdGl2ZS5wYXJzZUZvbnRDaGFuZ2VMaW5lKGNlbnRlcnN0cikpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJmb250XCI6XG5cdFx0XHRcdC8vIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIHRoaXM7IGl0IGlzIGEgdXNlbGVzcyBkaXJlY3RpdmVcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2V0Zm9udFwiOlxuXHRcdFx0XHR2YXIgc2ZUb2tlbnMgPSB0b2tlbml6ZXIudG9rZW5pemUocmVzdE9mU3RyaW5nLCAwLCByZXN0T2ZTdHJpbmcubGVuZ3RoKTtcbi8vXHRcdFx0XHR2YXIgc2ZEb25lID0gZmFsc2U7XG5cdFx0XHRcdGlmIChzZlRva2Vucy5sZW5ndGggPj0gNCkge1xuXHRcdFx0XHRcdGlmIChzZlRva2Vuc1swXS50b2tlbiA9PT0gJy0nICYmIHNmVG9rZW5zWzFdLnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdFx0XHR2YXIgc2ZOdW0gPSBwYXJzZUludChzZlRva2Vuc1sxXS50b2tlbik7XG5cdFx0XHRcdFx0XHRpZiAoc2ZOdW0gPj0gMSAmJiBzZk51bSA8PSA0KSB7XG5cdFx0XHRcdFx0XHRcdGlmICghbXVsdGlsaW5lVmFycy5zZXRmb250KVxuXHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuc2V0Zm9udCA9IFtdO1xuXHRcdFx0XHRcdFx0XHRzZlRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0XHRzZlRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnNldGZvbnRbc2ZOdW1dID0gZ2V0Rm9udFBhcmFtZXRlcihzZlRva2VucywgbXVsdGlsaW5lVmFycy5zZXRmb250W3NmTnVtXSwgc3RyLCAwLCAnc2V0Zm9udCcpO1xuLy9cdFx0XHRcdFx0XHRcdHZhciBzZlNpemUgPSBzZlRva2Vucy5wb3AoKTtcbi8vXHRcdFx0XHRcdFx0XHRpZiAoc2ZTaXplLnR5cGUgPT09ICdudW1iZXInKSB7XG4vL1x0XHRcdFx0XHRcdFx0XHRzZlNpemUgPSBwYXJzZUludChzZlNpemUudG9rZW4pO1xuLy9cdFx0XHRcdFx0XHRcdFx0dmFyIHNmRm9udE5hbWUgPSAnJztcbi8vXHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIHNmaSA9IDI7IHNmaSA8IHNmVG9rZW5zLmxlbmd0aDsgc2ZpKyspXG4vL1x0XHRcdFx0XHRcdFx0XHRcdHNmRm9udE5hbWUgKz0gc2ZUb2tlbnNbc2ZpXS50b2tlbjtcbi8vXHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuc2V0Zm9udFtzZk51bV0gPSB7IGZhY2U6IHNmRm9udE5hbWUsIHNpemU6IHNmU2l6ZSB9O1xuLy9cdFx0XHRcdFx0XHRcdFx0c2ZEb25lID0gdHJ1ZTtcbi8vXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG4vL1x0XHRcdFx0aWYgKCFzZkRvbmUpXG4vL1x0XHRcdFx0XHRyZXR1cm4gXCJCYWQgcGFyYW1ldGVyczogXCIgKyBjbWQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImdjaG9yZGZvbnRcIjpcblx0XHRcdGNhc2UgXCJwYXJ0c2ZvbnRcIjpcblx0XHRcdGNhc2UgXCJ0cmlwbGV0Zm9udFwiOlxuXHRcdFx0Y2FzZSBcInZvY2FsZm9udFwiOlxuXHRcdFx0Y2FzZSBcInRleHRmb250XCI6XG5cdFx0XHRjYXNlIFwiYW5ub3RhdGlvbmZvbnRcIjpcblx0XHRcdGNhc2UgXCJoaXN0b3J5Zm9udFwiOlxuXHRcdFx0Y2FzZSBcImluZm9mb250XCI6XG5cdFx0XHRjYXNlIFwibWVhc3VyZWZvbnRcIjpcblx0XHRcdGNhc2UgXCJyZXBlYXRmb250XCI6XG5cdFx0XHRjYXNlIFwid29yZHNmb250XCI6XG5cdFx0XHRcdHJldHVybiBnZXRDaGFuZ2luZ0ZvbnQoY21kLCB0b2tlbnMsIHN0cik7XG5cdFx0XHRjYXNlIFwiY29tcG9zZXJmb250XCI6XG5cdFx0XHRjYXNlIFwic3VidGl0bGVmb250XCI6XG5cdFx0XHRjYXNlIFwidGVtcG9mb250XCI6XG5cdFx0XHRjYXNlIFwidGl0bGVmb250XCI6XG5cdFx0XHRjYXNlIFwidm9pY2Vmb250XCI6XG5cdFx0XHRjYXNlIFwiZm9vdGVyZm9udFwiOlxuXHRcdFx0Y2FzZSBcImhlYWRlcmZvbnRcIjpcblx0XHRcdFx0cmV0dXJuIGdldEdsb2JhbEZvbnQoY21kLCB0b2tlbnMsIHN0cik7XG5cdFx0XHRjYXNlIFwiYmFybGFiZWxmb250XCI6XG5cdFx0XHRjYXNlIFwiYmFybnVtYmVyZm9udFwiOlxuXHRcdFx0Y2FzZSBcImJhcm51bWZvbnRcIjpcblx0XHRcdFx0cmV0dXJuIGdldENoYW5naW5nRm9udChcIm1lYXN1cmVmb250XCIsIHRva2Vucywgc3RyKTtcblx0XHRcdGNhc2UgXCJzdGF2ZXNcIjpcblx0XHRcdGNhc2UgXCJzY29yZVwiOlxuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLnNjb3JlX2lzX3ByZXNlbnQgPSB0cnVlO1xuXHRcdFx0XHR2YXIgYWRkVm9pY2UgPSBmdW5jdGlvbihpZCwgbmV3U3RhZmYsIGJyYWNrZXQsIGJyYWNlLCBjb250aW51ZUJhcikge1xuXHRcdFx0XHRcdGlmIChuZXdTdGFmZiB8fCBtdWx0aWxpbmVWYXJzLnN0YXZlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuc3RhdmVzLnB1c2goe2luZGV4OiBtdWx0aWxpbmVWYXJzLnN0YXZlcy5sZW5ndGgsIG51bVZvaWNlczogMH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgc3RhZmYgPSBwYXJzZUNvbW1vbi5sYXN0KG11bHRpbGluZVZhcnMuc3RhdmVzKTtcblx0XHRcdFx0XHRpZiAoYnJhY2tldCAhPT0gdW5kZWZpbmVkKSBzdGFmZi5icmFja2V0ID0gYnJhY2tldDtcblx0XHRcdFx0XHRpZiAoYnJhY2UgIT09IHVuZGVmaW5lZCkgc3RhZmYuYnJhY2UgPSBicmFjZTtcblx0XHRcdFx0XHRpZiAoY29udGludWVCYXIpIHN0YWZmLmNvbm5lY3RCYXJMaW5lcyA9ICdlbmQnO1xuXHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy52b2ljZXNbaWRdID0ge3N0YWZmTnVtOiBzdGFmZi5pbmRleCwgaW5kZXg6IHN0YWZmLm51bVZvaWNlc307XG5cdFx0XHRcdFx0XHRzdGFmZi5udW1Wb2ljZXMrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIG9wZW5QYXJlbiA9IGZhbHNlO1xuXHRcdFx0XHR2YXIgb3BlbkJyYWNrZXQgPSBmYWxzZTtcblx0XHRcdFx0dmFyIG9wZW5CcmFjZSA9IGZhbHNlO1xuXHRcdFx0XHR2YXIganVzdE9wZW5QYXJlbiA9IGZhbHNlO1xuXHRcdFx0XHR2YXIganVzdE9wZW5CcmFja2V0ID0gZmFsc2U7XG5cdFx0XHRcdHZhciBqdXN0T3BlbkJyYWNlID0gZmFsc2U7XG5cdFx0XHRcdHZhciBjb250aW51ZUJhciA9IGZhbHNlO1xuXHRcdFx0XHR2YXIgbGFzdFZvaWNlO1xuXHRcdFx0XHR2YXIgYWRkQ29udGludWVCYXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRjb250aW51ZUJhciA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKGxhc3RWb2ljZSkge1xuXHRcdFx0XHRcdFx0dmFyIHR5ID0gJ3N0YXJ0Jztcblx0XHRcdFx0XHRcdGlmIChsYXN0Vm9pY2Uuc3RhZmZOdW0gPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLnN0YXZlc1tsYXN0Vm9pY2Uuc3RhZmZOdW0tMV0uY29ubmVjdEJhckxpbmVzID09PSAnc3RhcnQnIHx8XG5cdFx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5zdGF2ZXNbbGFzdFZvaWNlLnN0YWZmTnVtLTFdLmNvbm5lY3RCYXJMaW5lcyA9PT0gJ2NvbnRpbnVlJylcblx0XHRcdFx0XHRcdFx0XHR0eSA9ICdjb250aW51ZSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnN0YXZlc1tsYXN0Vm9pY2Uuc3RhZmZOdW1dLmNvbm5lY3RCYXJMaW5lcyA9IHR5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0d2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgdCA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdHN3aXRjaCAodC50b2tlbikge1xuXHRcdFx0XHRcdFx0Y2FzZSAnKCc6XG5cdFx0XHRcdFx0XHRcdGlmIChvcGVuUGFyZW4pIHdhcm4oXCJDYW4ndCBuZXN0IHBhcmVudGhlc2lzIGluICUlc2NvcmVcIiwgc3RyLCB0LnN0YXJ0KTtcblx0XHRcdFx0XHRcdFx0ZWxzZSB7b3BlblBhcmVuID0gdHJ1ZTtqdXN0T3BlblBhcmVuID0gdHJ1ZTt9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnKSc6XG5cdFx0XHRcdFx0XHRcdGlmICghb3BlblBhcmVuIHx8IGp1c3RPcGVuUGFyZW4pIHdhcm4oXCJVbmV4cGVjdGVkIGNsb3NlIHBhcmVudGhlc2lzIGluICUlc2NvcmVcIiwgc3RyLCB0LnN0YXJ0KTtcblx0XHRcdFx0XHRcdFx0ZWxzZSBvcGVuUGFyZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdbJzpcblx0XHRcdFx0XHRcdFx0aWYgKG9wZW5CcmFja2V0KSB3YXJuKFwiQ2FuJ3QgbmVzdCBicmFja2V0cyBpbiAlJXNjb3JlXCIsIHN0ciwgdC5zdGFydCk7XG5cdFx0XHRcdFx0XHRcdGVsc2Uge29wZW5CcmFja2V0ID0gdHJ1ZTtqdXN0T3BlbkJyYWNrZXQgPSB0cnVlO31cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICddJzpcblx0XHRcdFx0XHRcdFx0aWYgKCFvcGVuQnJhY2tldCB8fCBqdXN0T3BlbkJyYWNrZXQpIHdhcm4oXCJVbmV4cGVjdGVkIGNsb3NlIGJyYWNrZXQgaW4gJSVzY29yZVwiLCBzdHIsIHQuc3RhcnQpO1xuXHRcdFx0XHRcdFx0XHRlbHNlIHtvcGVuQnJhY2tldCA9IGZhbHNlO211bHRpbGluZVZhcnMuc3RhdmVzW2xhc3RWb2ljZS5zdGFmZk51bV0uYnJhY2tldCA9ICdlbmQnO31cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICd7Jzpcblx0XHRcdFx0XHRcdFx0aWYgKG9wZW5CcmFjZSApIHdhcm4oXCJDYW4ndCBuZXN0IGJyYWNlcyBpbiAlJXNjb3JlXCIsIHN0ciwgdC5zdGFydCk7XG5cdFx0XHRcdFx0XHRcdGVsc2Uge29wZW5CcmFjZSA9IHRydWU7anVzdE9wZW5CcmFjZSA9IHRydWU7fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ30nOlxuXHRcdFx0XHRcdFx0XHRpZiAoIW9wZW5CcmFjZSB8fCBqdXN0T3BlbkJyYWNlKSB3YXJuKFwiVW5leHBlY3RlZCBjbG9zZSBicmFjZSBpbiAlJXNjb3JlXCIsIHN0ciwgdC5zdGFydCk7XG5cdFx0XHRcdFx0XHRcdGVsc2Uge29wZW5CcmFjZSA9IGZhbHNlO211bHRpbGluZVZhcnMuc3RhdmVzW2xhc3RWb2ljZS5zdGFmZk51bV0uYnJhY2UgPSAnZW5kJzt9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnfCc6XG5cdFx0XHRcdFx0XHRcdGFkZENvbnRpbnVlQmFyKCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dmFyIHZjID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKHQudHlwZSA9PT0gJ2FscGhhJyB8fCB0LnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmMgKz0gdC50b2tlbjtcblx0XHRcdFx0XHRcdFx0XHRpZiAodC5jb250aW51ZUlkKVxuXHRcdFx0XHRcdFx0XHRcdFx0dCA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZhciBuZXdTdGFmZiA9ICFvcGVuUGFyZW4gfHwganVzdE9wZW5QYXJlbjtcblx0XHRcdFx0XHRcdFx0dmFyIGJyYWNrZXQgPSBqdXN0T3BlbkJyYWNrZXQgPyAnc3RhcnQnIDogb3BlbkJyYWNrZXQgPyAnY29udGludWUnIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR2YXIgYnJhY2UgPSBqdXN0T3BlbkJyYWNlID8gJ3N0YXJ0JyA6IG9wZW5CcmFjZSA/ICdjb250aW51ZScgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGFkZFZvaWNlKHZjLCBuZXdTdGFmZiwgYnJhY2tldCwgYnJhY2UsIGNvbnRpbnVlQmFyKTtcblx0XHRcdFx0XHRcdFx0anVzdE9wZW5QYXJlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRqdXN0T3BlbkJyYWNrZXQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0anVzdE9wZW5CcmFjZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZUJhciA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRsYXN0Vm9pY2UgPSBtdWx0aWxpbmVWYXJzLnZvaWNlc1t2Y107XG5cdFx0XHRcdFx0XHRcdGlmIChjbWQgPT09ICdzdGF2ZXMnKVxuXHRcdFx0XHRcdFx0XHRcdGFkZENvbnRpbnVlQmFyKCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIm5ld3BhZ2VcIjpcblx0XHRcdFx0dmFyIHBnTnVtID0gdG9rZW5pemVyLmdldEludChyZXN0T2ZTdHJpbmcpO1xuXHRcdFx0XHR0dW5lLmFkZE5ld1BhZ2UocGdOdW0uZGlnaXRzID09PSAwID8gLTEgOiBwZ051bS52YWx1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiYWJjXCI6XG5cdFx0XHRcdHZhciBhcnIgPSByZXN0T2ZTdHJpbmcuc3BsaXQoJyAnKTtcblx0XHRcdFx0c3dpdGNoIChhcnJbMF0pIHtcblx0XHRcdFx0XHRjYXNlIFwiLWNvcHlyaWdodFwiOlxuXHRcdFx0XHRcdGNhc2UgXCItY3JlYXRvclwiOlxuXHRcdFx0XHRcdGNhc2UgXCItZWRpdGVkLWJ5XCI6XG5cdFx0XHRcdFx0Y2FzZSBcIi12ZXJzaW9uXCI6XG5cdFx0XHRcdFx0Y2FzZSBcIi1jaGFyc2V0XCI6XG5cdFx0XHRcdFx0XHR2YXIgc3ViQ21kID0gYXJyLnNoaWZ0KCk7XG5cdFx0XHRcdFx0XHR0dW5lLmFkZE1ldGFUZXh0KGNtZCtzdWJDbWQsIGFyci5qb2luKCcgJykpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBcIlVua25vd24gZGlyZWN0aXZlOiBcIiArIGNtZCthcnJbMF07XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiaGVhZGVyXCI6XG5cdFx0XHRjYXNlIFwiZm9vdGVyXCI6XG5cdFx0XHRcdHZhciBmb290ZXJTdHIgPSB0b2tlbml6ZXIuZ2V0TWVhdChyZXN0T2ZTdHJpbmcsIDAsIHJlc3RPZlN0cmluZy5sZW5ndGgpO1xuXHRcdFx0XHRmb290ZXJTdHIgPSByZXN0T2ZTdHJpbmcuc3Vic3RyaW5nKGZvb3RlclN0ci5zdGFydCwgZm9vdGVyU3RyLmVuZCk7XG5cdFx0XHRcdGlmIChmb290ZXJTdHIuY2hhckF0KDApID09PSAnXCInICYmIGZvb3RlclN0ci5jaGFyQXQoZm9vdGVyU3RyLmxlbmd0aC0xKSA9PT0gJ1wiJyApXG5cdFx0XHRcdFx0Zm9vdGVyU3RyID0gZm9vdGVyU3RyLnN1YnN0cmluZygxLCBmb290ZXJTdHIubGVuZ3RoLTEpO1xuXHRcdFx0XHR2YXIgZm9vdGVyQXJyID0gZm9vdGVyU3RyLnNwbGl0KCdcXHQnKTtcblx0XHRcdFx0dmFyIGZvb3RlciA9IHt9O1xuXHRcdFx0XHRpZiAoZm9vdGVyQXJyLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRmb290ZXIgPSB7IGxlZnQ6IFwiXCIsIGNlbnRlcjogZm9vdGVyQXJyWzBdLCByaWdodDogXCJcIiB9O1xuXHRcdFx0XHRlbHNlIGlmIChmb290ZXJBcnIubGVuZ3RoID09PSAyKVxuXHRcdFx0XHRcdGZvb3RlciA9IHsgbGVmdDogZm9vdGVyQXJyWzBdLCBjZW50ZXI6IGZvb3RlckFyclsxXSwgcmlnaHQ6IFwiXCIgfTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGZvb3RlciA9IHsgbGVmdDogZm9vdGVyQXJyWzBdLCBjZW50ZXI6IGZvb3RlckFyclsxXSwgcmlnaHQ6IGZvb3RlckFyclsyXSB9O1xuXHRcdFx0XHRpZiAoZm9vdGVyQXJyLmxlbmd0aCA+IDMpXG5cdFx0XHRcdFx0d2FybihcIlRvbyBtYW55IHRhYnMgaW4gXCIgKyBjbWQgKyBcIjogXCIgKyBmb290ZXJBcnIubGVuZ3RoICsgXCIgZm91bmQuXCIsIHJlc3RPZlN0cmluZywgMCk7XG5cblx0XHRcdFx0dHVuZS5hZGRNZXRhVGV4dE9iaihjbWQsIGZvb3Rlcik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwibWlkaVwiOlxuXHRcdFx0XHR2YXIgbWlkaSA9IHRva2VuaXplci50b2tlbml6ZShyZXN0T2ZTdHJpbmcsIDAsIHJlc3RPZlN0cmluZy5sZW5ndGgsIHRydWUpO1xuXHRcdFx0XHRpZiAobWlkaS5sZW5ndGggPiAwICYmIG1pZGlbMF0udG9rZW4gPT09ICc9Jylcblx0XHRcdFx0XHRtaWRpLnNoaWZ0KCk7XG5cdFx0XHRcdGlmIChtaWRpLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgbWlkaSBjb21tYW5kXCIsIHJlc3RPZlN0cmluZywgMCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRwYXJzZU1pZGlDb21tYW5kKG1pZGksIHR1bmUsIHJlc3RPZlN0cmluZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwibWFwXCI6XG5cdFx0XHRjYXNlIFwicGVyY21hcFwiOlxuXHRcdFx0Y2FzZSBcInBsYXl0ZW1wb1wiOlxuXHRcdFx0Y2FzZSBcImF1cXVhbGl0eVwiOlxuXHRcdFx0Y2FzZSBcImNvbnRpbnVvdXNcIjpcblx0XHRcdGNhc2UgXCJub2JhcmNoZWNrXCI6XG5cdFx0XHRcdC8vIFRPRE8tUEVSOiBBY3R1YWxseSBoYW5kbGUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlc2Vcblx0XHRcdFx0dHVuZS5mb3JtYXR0aW5nW2NtZF0gPSByZXN0T2ZTdHJpbmc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiVW5rbm93biBkaXJlY3RpdmU6IFwiICsgY21kO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblx0cGFyc2VEaXJlY3RpdmUuZ2xvYmFsRm9ybWF0dGluZyA9IGZ1bmN0aW9uKGZvcm1hdEhhc2gpIHtcblx0XHRmb3IgKHZhciBjbWQgaW4gZm9ybWF0SGFzaCkge1xuXHRcdFx0aWYgKGZvcm1hdEhhc2guaGFzT3duUHJvcGVydHkoY21kKSkge1xuXHRcdFx0XHR2YXIgdmFsdWUgPSAnJytmb3JtYXRIYXNoW2NtZF07XG5cdFx0XHRcdHZhciB0b2tlbnMgPSB0b2tlbml6ZXIudG9rZW5pemUodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7XG5cdFx0XHRcdHZhciBzY3JhdGNoO1xuXHRcdFx0XHRzd2l0Y2ggKGNtZCkge1xuXHRcdFx0XHRcdGNhc2UgXCJ0aXRsZWZvbnRcIjpcblx0XHRcdFx0XHRjYXNlIFwiZ2Nob3JkZm9udFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJjb21wb3NlcmZvbnRcIjpcblx0XHRcdFx0XHRjYXNlIFwiZm9vdGVyZm9udFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJoZWFkZXJmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcImhpc3Rvcnlmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcImluZm9mb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcIm1lYXN1cmVmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcInBhcnRzZm9udFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJyZXBlYXRmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcInN1YnRpdGxlZm9udFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJ0ZW1wb2ZvbnRcIjpcblx0XHRcdFx0XHRjYXNlIFwidGV4dGZvbnRcIjpcblx0XHRcdFx0XHRjYXNlIFwidm9pY2Vmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcInRyaXBsZXRmb250XCI6XG5cdFx0XHRcdFx0Y2FzZSBcInZvY2FsZm9udFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJ3b3Jkc2ZvbnRcIjpcblx0XHRcdFx0XHRjYXNlIFwiYW5ub3RhdGlvbmZvbnRcIjpcblx0XHRcdFx0XHRcdGdldENoYW5naW5nRm9udChjbWQsIHRva2VucywgdmFsdWUpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInNjYWxlXCI6XG5cdFx0XHRcdFx0XHRzZXRTY2FsZShjbWQsIHRva2Vucyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicGFydHNib3hcIjpcblx0XHRcdFx0XHRcdHNjcmF0Y2ggPSBhZGRNdWx0aWxpbmVWYXJCb29sKCdwYXJ0c0JveCcsIGNtZCwgdG9rZW5zKTtcblx0XHRcdFx0XHRcdGlmIChzY3JhdGNoICE9PSBudWxsKSB3YXJuKHNjcmF0Y2gpO1xuXHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5wYXJ0c2ZvbnQuYm94ID0gbXVsdGlsaW5lVmFycy5wYXJ0c0JveDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJmcmVlZ2Nob3JkXCI6XG5cdFx0XHRcdFx0XHRzY3JhdGNoID0gYWRkTXVsdGlsaW5lVmFyQm9vbCgnZnJlZWdjaG9yZCcsIGNtZCwgdG9rZW5zKTtcblx0XHRcdFx0XHRcdGlmIChzY3JhdGNoICE9PSBudWxsKSB3YXJuKHNjcmF0Y2gpO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3YXJuKFwiRm9ybWF0dGluZyBkaXJlY3RpdmUgdW5yZWNvZ25pemVkOiBcIiwgY21kLCAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VEaXJlY3RpdmU7XG4iLCIvLyAgICBhYmNfdHJhbnNwb3NlLmpzOiBIYW5kbGVzIHRoZSBhdXRvbWF0aWMgdHJhbnNwb3NpdGlvbiBvZiBrZXkgc2lnbmF0dXJlcywgY2hvcmQgc3ltYm9scywgYW5kIG5vdGVzLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggUGF1bCBSb3NlbiAocGF1bCBhdCBwYXVscm9zZW4gZG90IG5ldClcbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHRyYW5zcG9zZSA9IHt9O1xuXG52YXIga2V5SW5kZXggPSB7XG5cdCdDJzogMCxcblx0J0MjJzogMSxcblx0J0RiJzogMSxcblx0J0QnOiAyLFxuXHQnRCMnOiAzLFxuXHQnRWInOiAzLFxuXHQnRSc6IDQsXG5cdCdGJzogNSxcblx0J0YjJzogNixcblx0J0diJzogNixcblx0J0cnOiA3LFxuXHQnRyMnOiA4LFxuXHQnQWInOiA4LFxuXHQnQSc6IDksXG5cdCdBIyc6IDEwLFxuXHQnQmInOiAxMCxcblx0J0InOiAxMVxufTtcbnZhciBuZXdLZXkgPSBbJ0MnLCAnRGInLCAnRCcsICdFYicsICdFJywgJ0YnLCAnRiMnLCAnRycsICdBYicsICdBJywgJ0JiJywgJ0InXTtcbnZhciBuZXdLZXlNaW5vciA9IFsnQycsICdDIycsICdEJywgJ0QjJywgJ0UnLCAnRicsICdGIycsICdHJywgJ0cjJywgJ0EnLCAnQmInLCAnQiddO1xuXG50cmFuc3Bvc2Uua2V5U2lnbmF0dXJlID0gZnVuY3Rpb24obXVsdGlsaW5lVmFycywga2V5cywga2V5TmFtZSwgcm9vdCwgYWNjLCBsb2NhbFRyYW5zcG9zZSkge1xuXHRpZiAoIWxvY2FsVHJhbnNwb3NlKSBsb2NhbFRyYW5zcG9zZSA9IDA7XG5cdG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2VWZXJ0aWNhbE1vdmVtZW50ID0gMDtcblx0bXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZVByZWZlckZsYXRzID0gZmFsc2U7XG5cdHZhciBrID0ga2V5c1trZXlOYW1lXTtcblx0aWYgKCFrKSByZXR1cm4gbXVsdGlsaW5lVmFycy5rZXk7IC8vIElmIHRoZSBrZXkgaXNuJ3QgaW4gdGhlIGxpc3QsIGl0IGlzIG5vbi1zdGFuZGFyZC4gV2Ugd29uJ3QgYXR0ZW1wdCB0byB0cmFuc3Bvc2UgaXQuXG5cdG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2UgPSAobXVsdGlsaW5lVmFycy5nbG9iYWxUcmFuc3Bvc2UgPyBtdWx0aWxpbmVWYXJzLmdsb2JhbFRyYW5zcG9zZSA6IDApICsgbG9jYWxUcmFuc3Bvc2U7XG5cblx0aWYgKCFtdWx0aWxpbmVWYXJzLmxvY2FsVHJhbnNwb3NlKVxuXHRcdHJldHVybiB7IGFjY2lkZW50YWxzOiBrLCByb290OiByb290LCBhY2M6IGFjYyB9O1xuXHRtdWx0aWxpbmVWYXJzLmdsb2JhbFRyYW5zcG9zZU9yaWdLZXlTaWcgPSBrO1xuXHRpZiAobXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZSAlIDEyID09PSAwKSB7XG5cdFx0bXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZVZlcnRpY2FsTW92ZW1lbnQgPSAobXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZSAvIDEyKSAqIDc7XG5cdFx0cmV0dXJuIHsgYWNjaWRlbnRhbHM6IGssIHJvb3Q6IHJvb3QsIGFjYzogYWNjIH07XG5cdH1cblxuXHR2YXIgYmFzZUtleSA9IGtleU5hbWVbMF07XG5cdGlmIChrZXlOYW1lWzFdID09PSAnYicgfHwga2V5TmFtZVsxXSA9PT0gJyMnKSB7XG5cdFx0YmFzZUtleSArPSBrZXlOYW1lWzFdO1xuXHRcdGtleU5hbWUgPSBrZXlOYW1lLnN1YnN0cigyKTtcblx0fSBlbHNlXG5cdFx0a2V5TmFtZSA9IGtleU5hbWUuc3Vic3RyKDEpO1xuXHR2YXIgaW5kZXggPSBrZXlJbmRleFtiYXNlS2V5XSArIG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2U7XG5cdHdoaWxlIChpbmRleCA8IDApIGluZGV4ICs9IDEyO1xuXHRpZiAoaW5kZXggPiAxMSkgaW5kZXggPSBpbmRleCAlIDEyO1xuXHR2YXIgbmV3S2V5TmFtZSA9IChrZXlOYW1lWzBdID09PSAnbScgPyBuZXdLZXlNaW5vcltpbmRleF0gOiBuZXdLZXlbaW5kZXhdKTtcblx0dmFyIHRyYW5zcG9zZWRLZXkgPSBuZXdLZXlOYW1lICsga2V5TmFtZTtcblx0dmFyIG5ld0tleVNpZyA9IGtleXNbdHJhbnNwb3NlZEtleV07XG5cdGlmIChuZXdLZXlTaWcubGVuZ3RoID4gMCAmJiBuZXdLZXlTaWdbMF0uYWNjID09PSAnZmxhdCcpXG5cdFx0bXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZVByZWZlckZsYXRzID0gdHJ1ZTtcblx0dmFyIGRpc3RhbmNlID0gdHJhbnNwb3NlZEtleS5jaGFyQ29kZUF0KDApIC0gYmFzZUtleS5jaGFyQ29kZUF0KDApO1xuXHRpZiAobXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZSA+IDApIHtcblx0XHRpZiAoZGlzdGFuY2UgPCAwKVxuXHRcdFx0ZGlzdGFuY2UgKz0gNztcblx0XHRlbHNlIGlmIChkaXN0YW5jZSA9PT0gMCkge1xuXHRcdFx0Ly8gVGhlcmUncyBhIGZ1bm55IHRoaW5nIHRoYXQgaGFwcGVucyB3aGVuIHRoZSBrZXkgY2hhbmdlcyBvbmx5IGFuIGFjY2lkZW50YWwncyBkaXN0YW5jZSwgZm9yIGluc3RhbmNlLCBmcm9tIEFiIHRvIEEuXG5cdFx0XHQvLyBJZiB0aGUgZGlzdGFuY2UgaXMgcG9zaXRpdmUgKHdlIGFyZSByYWlzaW5nIHBpdGNoKSwgYW5kIHRoZSBjaGFuZ2UgaXMgaGlnaGVyICh0aGF0IGlzLCBBYiAtPiBBKSwgdGhlbiByYWlzZSBhbiBvY3RhdmUuXG5cdFx0XHQvLyBUaGlzIHRlc3QgaXMgZWFzaWVyIGJlY2F1c2Ugd2Uga25vdyB0aGUga2V5cyBhcmUgbm90IGVxdWFsIChvciB3ZSB3b3VsZG4ndCBnZXQgdGhpcyBmYXIpLCBzbyBpZiB0aGUgYmFzZSBrZXkgaXMgYSBmbGF0IGtleSwgdGhlblxuXHRcdFx0Ly8gdGhlIHRyYW5zcG9zZWQga2V5IG11c3QgYmUgaGlnaGVyLiBMaWtld2lzZSwgaWYgdGhlIHRyYW5zcG9zZWQga2V5IGlzIHNoYXJwLCB0aGVuIHRoZSBiYXNlIGtleSBtdXN0IGJlIGxvd2VyLiBBbmQgb25lXG5cdFx0XHQvLyBvZiB0aG9zZSB0d28gdGhpbmdzIG11c3QgYmUgdHJ1ZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCBib3RoIG5hdHVyYWwuXG5cdFx0XHRpZiAoYmFzZUtleVsxXSA9PT0gJyMnIHx8ICB0cmFuc3Bvc2VkS2V5WzFdID09PSAnYicpXG5cdFx0XHRcdGRpc3RhbmNlICs9IDc7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2UgPCAwKSB7XG5cdFx0aWYgKGRpc3RhbmNlID4gMClcblx0XHRcdGRpc3RhbmNlIC09IDc7XG5cdFx0ZWxzZSBpZiAoZGlzdGFuY2UgPT09IDApIHtcblx0XHRcdC8vIFRoZXJlJ3MgYSBmdW5ueSB0aGluZyB0aGF0IGhhcHBlbnMgd2hlbiB0aGUga2V5IGNoYW5nZXMgb25seSBhbiBhY2NpZGVudGFsJ3MgZGlzdGFuY2UsIGZvciBpbnN0YW5jZSwgZnJvbSBBYiB0byBBLlxuXHRcdFx0Ly8gSWYgdGhlIGRpc3RhbmNlIGlzIG5lZ2F0aXZlICh3ZSBhcmUgZHJvcHBpbmcgcGl0Y2gpLCBhbmQgdGhlIGNoYW5nZSBpcyBsb3dlciAodGhhdCBpcywgQSAtPiBBYiksIHRoZW4gZHJvcCBhbiBvY3RhdmUuXG5cdFx0XHRpZiAoYmFzZUtleVsxXSA9PT0gJ2InIHx8ICB0cmFuc3Bvc2VkS2V5WzFdID09PSAnIycpXG5cdFx0XHRcdGRpc3RhbmNlIC09IDc7XG5cdFx0fVxuXHR9XG5cblx0aWYgKG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2UgPiAwKVxuXHRcdG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2VWZXJ0aWNhbE1vdmVtZW50ID0gZGlzdGFuY2UgKyBNYXRoLmZsb29yKG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2UgLyAxMikgKiA3O1xuXHRlbHNlXG5cdFx0bXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZVZlcnRpY2FsTW92ZW1lbnQgPSBkaXN0YW5jZSArIE1hdGguY2VpbChtdWx0aWxpbmVWYXJzLmxvY2FsVHJhbnNwb3NlIC8gMTIpICogNztcblx0cmV0dXJuIHsgYWNjaWRlbnRhbHM6IG5ld0tleVNpZywgcm9vdDogbmV3S2V5TmFtZVswXSwgYWNjOiBuZXdLZXlOYW1lLmxlbmd0aCA+IDEgPyBuZXdLZXlOYW1lWzFdIDogXCJcIiB9O1xufTtcblxudmFyIHNoYXJwQ2hvcmRzID0gWyAnQycsICdD4pmvJywgJ0QnLCBcIkTima9cIiwgJ0UnLCAnRicsIFwiRuKZr1wiLCAnRycsICdH4pmvJywgJ0EnLCAnQeKZrycsICdCJ107XG52YXIgZmxhdENob3JkcyA9IFsgJ0MnLCAnROKZrScsICdEJywgJ0Xima0nLCAnRScsICdGJywgJ0fima0nLCAnRycsICdB4pmtJywgJ0EnLCAnQuKZrScsICdCJ107XG52YXIgc2hhcnBDaG9yZHNGcmVlID0gWyAnQycsICdDIycsICdEJywgXCJEI1wiLCAnRScsICdGJywgXCJGI1wiLCAnRycsICdHIycsICdBJywgJ0EjJywgJ0InXTtcbnZhciBmbGF0Q2hvcmRzRnJlZSA9IFsgJ0MnLCAnRGInLCAnRCcsICdFYicsICdFJywgJ0YnLCAnR2InLCAnRycsICdBYicsICdBJywgJ0JiJywgJ0InXTtcblxudHJhbnNwb3NlLmNob3JkTmFtZSA9IGZ1bmN0aW9uKG11bHRpbGluZVZhcnMsIGNob3JkKSB7XG5cdGlmIChtdWx0aWxpbmVWYXJzLmxvY2FsVHJhbnNwb3NlICYmIChtdWx0aWxpbmVWYXJzLmxvY2FsVHJhbnNwb3NlICUgMTIgIT09IDApKSB7IC8vIFRoZSBjaG9yZHMgYXJlIHRoZSBzYW1lIGlmIGl0IGlzIGFuIGV4YWN0IG9jdGF2ZSBjaGFuZ2UuXG5cdFx0dmFyIHRyYW5zcG9zZUZhY3RvciA9IG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2U7XG5cdFx0d2hpbGUgKHRyYW5zcG9zZUZhY3RvciA8IDApIHRyYW5zcG9zZUZhY3RvciArPSAxMjtcblx0XHRpZiAodHJhbnNwb3NlRmFjdG9yID4gMTEpIHRyYW5zcG9zZUZhY3RvciA9IHRyYW5zcG9zZUZhY3RvciAlIDEyO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmZyZWVnY2hvcmQpIHtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvQ2IvZywgXCJgfjExYFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRGIvZywgXCJgfjFgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9FYi9nLCBcImB+M2BcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0ZiL2csIFwiYH40YFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvR2IvZywgXCJgfjZgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9BYi9nLCBcImB+OGBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0JiL2csIFwiYH4xMGBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0MjL2csIFwiYH4xYFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRCMvZywgXCJgfjNgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9FIy9nLCBcImB+NWBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0YjL2csIFwiYH42YFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRyMvZywgXCJgfjhgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9BIy9nLCBcImB+MTBgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9CIy9nLCBcImB+MGBcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvQ+KZrS9nLCBcImB+MTFgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9E4pmtL2csIFwiYH4xYFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvReKZrS9nLCBcImB+M2BcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0bima0vZywgXCJgfjRgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9H4pmtL2csIFwiYH42YFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvQeKZrS9nLCBcImB+OGBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0Lima0vZywgXCJgfjEwYFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvQ+KZry9nLCBcImB+MWBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0Tima8vZywgXCJgfjNgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9F4pmvL2csIFwiYH41YFwiKTtcblx0XHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRuKZry9nLCBcImB+NmBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0fima8vZywgXCJgfjhgXCIpO1xuXHRcdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9B4pmvL2csIFwiYH4xMGBcIik7XG5cdFx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0Lima8vZywgXCJgfjBgXCIpO1xuXHRcdH1cblx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0MvZywgXCJgfjBgXCIpO1xuXHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRC9nLCBcImB+MmBcIik7XG5cdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9FL2csIFwiYH40YFwiKTtcblx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0YvZywgXCJgfjVgXCIpO1xuXHRcdGNob3JkID0gY2hvcmQucmVwbGFjZSgvRy9nLCBcImB+N2BcIik7XG5cdFx0Y2hvcmQgPSBjaG9yZC5yZXBsYWNlKC9BL2csIFwiYH45YFwiKTtcblx0XHRjaG9yZCA9IGNob3JkLnJlcGxhY2UoL0IvZywgXCJgfjExYFwiKTtcblx0XHR2YXIgYXJyID0gY2hvcmQuc3BsaXQoXCJgXCIpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoYXJyW2ldWzBdID09PSAnficpIHtcblx0XHRcdFx0dmFyIGNob3JkTnVtID0gcGFyc2VJbnQoYXJyW2ldLnN1YnN0cigxKSwxMCk7XG5cdFx0XHRcdGNob3JkTnVtICs9IHRyYW5zcG9zZUZhY3Rvcjtcblx0XHRcdFx0aWYgKGNob3JkTnVtID4gMTEpIGNob3JkTnVtIC09IDEyO1xuXHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5mcmVlZ2Nob3JkKVxuXHRcdFx0XHRcdGFycltpXSA9IG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2VQcmVmZXJGbGF0cyA/IGZsYXRDaG9yZHNGcmVlW2Nob3JkTnVtXSA6IHNoYXJwQ2hvcmRzRnJlZVtjaG9yZE51bV07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRhcnJbaV0gPSBtdWx0aWxpbmVWYXJzLmxvY2FsVHJhbnNwb3NlUHJlZmVyRmxhdHMgPyBmbGF0Q2hvcmRzW2Nob3JkTnVtXSA6IHNoYXJwQ2hvcmRzW2Nob3JkTnVtXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y2hvcmQgPSBhcnIuam9pbihcIlwiKTtcblx0fVxuXHRyZXR1cm4gY2hvcmQ7XG59O1xuXG52YXIgcGl0Y2hUb0xldHRlciA9IFsgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdhJywgJ2InIF07XG5mdW5jdGlvbiBhY2NpZGVudGFsQ2hhbmdlKG9yaWdQaXRjaCwgbmV3UGl0Y2gsIGFjY2lkZW50YWwsIG9yaWdLZXlTaWcsIG5ld0tleVNpZykge1xuXHR2YXIgb3JpZ1BpdGNoTGV0dGVyID0gcGl0Y2hUb0xldHRlclsob3JpZ1BpdGNoICsgNDkpICUgN107IC8vIE1ha2Ugc3VyZSBpdCBpcyBhIHBvc2l0aXZlIHBpdGNoIGJlZm9yZSBub3JtYWxpemluZy5cblx0dmFyIG9yaWdBY2NpZGVudGFsID0gMDtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBvcmlnS2V5U2lnLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKG9yaWdLZXlTaWdbaV0ubm90ZS50b0xvd2VyQ2FzZSgpID09PSBvcmlnUGl0Y2hMZXR0ZXIpXG5cdFx0XHRvcmlnQWNjaWRlbnRhbCA9IGFjY2lkZW50YWxzW29yaWdLZXlTaWdbaV0uYWNjXTtcblx0fVxuXG5cdHZhciBjdXJyZW50QWNjaWRlbnRhbCA9IGFjY2lkZW50YWxzW2FjY2lkZW50YWxdO1xuXHR2YXIgZGVsdGEgPSBjdXJyZW50QWNjaWRlbnRhbCAtIG9yaWdBY2NpZGVudGFsO1xuXG5cdHZhciBuZXdQaXRjaExldHRlciA9IHBpdGNoVG9MZXR0ZXJbKG5ld1BpdGNoICsgNDkpICUgN107IC8vIE1ha2Ugc3VyZSBpdCBpcyBhIHBvc2l0aXZlIHBpdGNoIGJlZm9yZSBub3JtYWxpemluZy5cblx0dmFyIG5ld0FjY2lkZW50YWwgPSAwO1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IG5ld0tleVNpZy5hY2NpZGVudGFscy5sZW5ndGg7IGorKykge1xuXHRcdGlmIChuZXdLZXlTaWcuYWNjaWRlbnRhbHNbal0ubm90ZS50b0xvd2VyQ2FzZSgpID09PSBuZXdQaXRjaExldHRlcilcblx0XHRcdG5ld0FjY2lkZW50YWwgPSBhY2NpZGVudGFsc1tuZXdLZXlTaWcuYWNjaWRlbnRhbHNbal0uYWNjXTtcblx0fVxuXHR2YXIgY2FsY0FjY2lkZW50YWwgPSBkZWx0YSArIG5ld0FjY2lkZW50YWw7XG5cdGlmIChjYWxjQWNjaWRlbnRhbCA8IC0yKSB7XG5cdFx0bmV3UGl0Y2gtLTtcblx0XHRjYWxjQWNjaWRlbnRhbCArPSAobmV3UGl0Y2hMZXR0ZXIgPT09ICdjJyB8fCBuZXdQaXRjaExldHRlciA9PT0gJ2YnKSA/IDEgOiAyO1xuXHR9XG5cdGlmIChjYWxjQWNjaWRlbnRhbCA+IDIpIHtcblx0XHRuZXdQaXRjaCsrO1xuXHRcdGNhbGNBY2NpZGVudGFsIC09IChuZXdQaXRjaExldHRlciA9PT0gJ2InIHx8IG5ld1BpdGNoTGV0dGVyID09PSAnZScpID8gMSA6IDI7XG5cdH1cblx0cmV0dXJuIFtuZXdQaXRjaCwgY2FsY0FjY2lkZW50YWxdO1xufVxuXG52YXIgYWNjaWRlbnRhbHMgPSB7XG5cdGRibGZsYXQ6IC0yLFxuXHRmbGF0OiAtMSxcblx0bmF0dXJhbDogMCxcblx0c2hhcnA6IDEsXG5cdGRibHNoYXJwOiAyXG59O1xudmFyIGFjY2lkZW50YWxzMiA9IHtcblx0XCItMlwiOiBcImRibGZsYXRcIixcblx0XCItMVwiOiBcImZsYXRcIixcblx0XCIwXCI6IFwibmF0dXJhbFwiLFxuXHRcIjFcIjogXCJzaGFycFwiLFxuXHRcIjJcIjogXCJkYmxzaGFycFwiXG59O1xudHJhbnNwb3NlLm5vdGUgPSBmdW5jdGlvbihtdWx0aWxpbmVWYXJzLCBlbCkge1xuXHQvLyB0aGUgXCJlbFwiIHRoYXQgaXMgcGFzc2VkIGluIGhhcyBlbC5hY2NpZGVudGFsLCBhbmQgZWwucGl0Y2guIFwicGl0Y2hcIiBpcyB0aGUgdmVydGljYWwgcG9zaXRpb24gKDA9bWlkZGxlIEMpXG5cdC8vIGxvY2FsVHJhbnNwb3NlIGlzIHRoZSBudW1iZXIgb2YgaGFsZiBzdGVwc1xuXHQvLyBsb2NhbFRyYW5zcG9zZVZlcnRpY2FsTW92ZW1lbnQgaXMgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIHRvIG1vdmUuXG5cdGlmICghbXVsdGlsaW5lVmFycy5sb2NhbFRyYW5zcG9zZSlcblx0XHRyZXR1cm47XG5cdHZhciBvcmlnUGl0Y2ggPSBlbC5waXRjaDtcblx0ZWwucGl0Y2ggPSBlbC5waXRjaCArIG11bHRpbGluZVZhcnMubG9jYWxUcmFuc3Bvc2VWZXJ0aWNhbE1vdmVtZW50O1xuXG5cdGlmIChlbC5hY2NpZGVudGFsKSB7XG5cdFx0dmFyIHJldCA9IGFjY2lkZW50YWxDaGFuZ2Uob3JpZ1BpdGNoLCBlbC5waXRjaCwgZWwuYWNjaWRlbnRhbCwgbXVsdGlsaW5lVmFycy5nbG9iYWxUcmFuc3Bvc2VPcmlnS2V5U2lnLCBtdWx0aWxpbmVWYXJzLnRhcmdldEtleSk7XG5cdFx0ZWwucGl0Y2ggPSByZXRbMF07XG5cdFx0ZWwuYWNjaWRlbnRhbCA9IGFjY2lkZW50YWxzMltyZXRbMV1dO1xuXHR9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhbnNwb3NlO1xuIiwiLypnbG9iYWwgd2luZG93ICovXG5cbnZhciBwYXJzZUNvbW1vbiA9IHJlcXVpcmUoJy4vYWJjX2NvbW1vbicpO1xudmFyIHBhcnNlRGlyZWN0aXZlID0gcmVxdWlyZSgnLi9hYmNfcGFyc2VfZGlyZWN0aXZlJyk7XG52YXIgdHJhbnNwb3NlID0gcmVxdWlyZSgnLi9hYmNfdHJhbnNwb3NlJyk7XG5cbnZhciBwYXJzZUtleVZvaWNlID0ge307XG5cbihmdW5jdGlvbigpIHtcblx0dmFyIHRva2VuaXplcjtcblx0dmFyIHdhcm47XG5cdHZhciBtdWx0aWxpbmVWYXJzO1xuXHR2YXIgdHVuZTtcblx0cGFyc2VLZXlWb2ljZS5pbml0aWFsaXplID0gZnVuY3Rpb24odG9rZW5pemVyXywgd2Fybl8sIG11bHRpbGluZVZhcnNfLCB0dW5lXykge1xuXHRcdHRva2VuaXplciA9IHRva2VuaXplcl87XG5cdFx0d2FybiA9IHdhcm5fO1xuXHRcdG11bHRpbGluZVZhcnMgPSBtdWx0aWxpbmVWYXJzXztcblx0XHR0dW5lID0gdHVuZV87XG5cdH07XG5cblx0cGFyc2VLZXlWb2ljZS5zdGFuZGFyZEtleSA9IGZ1bmN0aW9uKGtleU5hbWUsIHJvb3QsIGFjYywgbG9jYWxUcmFuc3Bvc2UpIHtcblx0XHR2YXIga2V5MXNoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ2YnfTtcblx0XHR2YXIga2V5MnNoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ2MnfTtcblx0XHR2YXIga2V5M3NoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ2cnfTtcblx0XHR2YXIga2V5NHNoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ2QnfTtcblx0XHR2YXIga2V5NXNoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ0EnfTtcblx0XHR2YXIga2V5NnNoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ2UnfTtcblx0XHR2YXIga2V5N3NoYXJwID0ge2FjYzogJ3NoYXJwJywgbm90ZTogJ0InfTtcblx0XHR2YXIga2V5MWZsYXQgPSB7YWNjOiAnZmxhdCcsIG5vdGU6ICdCJ307XG5cdFx0dmFyIGtleTJmbGF0ID0ge2FjYzogJ2ZsYXQnLCBub3RlOiAnZSd9O1xuXHRcdHZhciBrZXkzZmxhdCA9IHthY2M6ICdmbGF0Jywgbm90ZTogJ0EnfTtcblx0XHR2YXIga2V5NGZsYXQgPSB7YWNjOiAnZmxhdCcsIG5vdGU6ICdkJ307XG5cdFx0dmFyIGtleTVmbGF0ID0ge2FjYzogJ2ZsYXQnLCBub3RlOiAnRyd9O1xuXHRcdHZhciBrZXk2ZmxhdCA9IHthY2M6ICdmbGF0Jywgbm90ZTogJ2MnfTtcblx0XHR2YXIga2V5N2ZsYXQgPSB7YWNjOiAnZmxhdCcsIG5vdGU6ICdGJ307XG5cblx0XHR2YXIga2V5cyA9IHtcblx0XHRcdCdDIyc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwLCBrZXk1c2hhcnAsIGtleTZzaGFycCwga2V5N3NoYXJwIF0sXG5cdFx0XHQnQSNtJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCwga2V5NnNoYXJwLCBrZXk3c2hhcnAgXSxcblx0XHRcdCdHI01peCc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwLCBrZXk1c2hhcnAsIGtleTZzaGFycCwga2V5N3NoYXJwIF0sXG5cdFx0XHQnRCNEb3InOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAsIGtleTdzaGFycCBdLFxuXHRcdFx0J0UjUGhyJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCwga2V5NnNoYXJwLCBrZXk3c2hhcnAgXSxcblx0XHRcdCdGI0x5ZCc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwLCBrZXk1c2hhcnAsIGtleTZzaGFycCwga2V5N3NoYXJwIF0sXG5cdFx0XHQnQiNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAsIGtleTdzaGFycCBdLFxuXG5cdFx0XHQnRiMnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAgXSxcblx0XHRcdCdEI20nOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAgXSxcblx0XHRcdCdDI01peCc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwLCBrZXk1c2hhcnAsIGtleTZzaGFycCBdLFxuXHRcdFx0J0cjRG9yJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCwga2V5NnNoYXJwIF0sXG5cdFx0XHQnQSNQaHInOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAgXSxcblx0XHRcdCdCTHlkJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCwga2V5NnNoYXJwIF0sXG5cdFx0XHQnRSNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAgXSxcblxuXHRcdFx0J0InOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwIF0sXG5cdFx0XHQnRyNtJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCBdLFxuXHRcdFx0J0YjTWl4JzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCBdLFxuXHRcdFx0J0MjRG9yJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCBdLFxuXHRcdFx0J0QjUGhyJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAsIGtleTVzaGFycCBdLFxuXHRcdFx0J0VMeWQnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwIF0sXG5cdFx0XHQnQSNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwIF0sXG5cblx0XHRcdCdFJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAgXSxcblx0XHRcdCdDI20nOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCBdLFxuXHRcdFx0J0JNaXgnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCBdLFxuXHRcdFx0J0YjRG9yJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwLCBrZXk0c2hhcnAgXSxcblx0XHRcdCdHI1Bocic6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwIF0sXG5cdFx0XHQnQUx5ZCc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCwga2V5NHNoYXJwIF0sXG5cdFx0XHQnRCNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCBdLFxuXG5cdFx0XHQnQSc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCBdLFxuXHRcdFx0J0YjbSc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAsIGtleTNzaGFycCBdLFxuXHRcdFx0J0VNaXgnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAgXSxcblx0XHRcdCdCRG9yJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwIF0sXG5cdFx0XHQnQyNQaHInOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAgXSxcblx0XHRcdCdETHlkJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCwga2V5M3NoYXJwIF0sXG5cdFx0XHQnRyNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAgXSxcblxuXHRcdFx0J0QnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwIF0sXG5cdFx0XHQnQm0nOiBbIGtleTFzaGFycCwga2V5MnNoYXJwIF0sXG5cdFx0XHQnQU1peCc6IFsga2V5MXNoYXJwLCBrZXkyc2hhcnAgXSxcblx0XHRcdCdFRG9yJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCBdLFxuXHRcdFx0J0YjUGhyJzogWyBrZXkxc2hhcnAsIGtleTJzaGFycCBdLFxuXHRcdFx0J0dMeWQnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwIF0sXG5cdFx0XHQnQyNMb2MnOiBbIGtleTFzaGFycCwga2V5MnNoYXJwIF0sXG5cblx0XHRcdCdHJzogWyBrZXkxc2hhcnAgXSxcblx0XHRcdCdFbSc6IFsga2V5MXNoYXJwIF0sXG5cdFx0XHQnRE1peCc6IFsga2V5MXNoYXJwIF0sXG5cdFx0XHQnQURvcic6IFsga2V5MXNoYXJwIF0sXG5cdFx0XHQnQlBocic6IFsga2V5MXNoYXJwIF0sXG5cdFx0XHQnQ0x5ZCc6IFsga2V5MXNoYXJwIF0sXG5cdFx0XHQnRiNMb2MnOiBbIGtleTFzaGFycCBdLFxuXG5cdFx0XHQnQyc6IFtdLFxuXHRcdFx0J0FtJzogW10sXG5cdFx0XHQnR01peCc6IFtdLFxuXHRcdFx0J0REb3InOiBbXSxcblx0XHRcdCdFUGhyJzogW10sXG5cdFx0XHQnRkx5ZCc6IFtdLFxuXHRcdFx0J0JMb2MnOiBbXSxcblxuXHRcdFx0J0YnOiBbIGtleTFmbGF0IF0sXG5cdFx0XHQnRG0nOiBbIGtleTFmbGF0IF0sXG5cdFx0XHQnQ01peCc6IFsga2V5MWZsYXQgXSxcblx0XHRcdCdHRG9yJzogWyBrZXkxZmxhdCBdLFxuXHRcdFx0J0FQaHInOiBbIGtleTFmbGF0IF0sXG5cdFx0XHQnQmJMeWQnOiBbIGtleTFmbGF0IF0sXG5cdFx0XHQnRUxvYyc6IFsga2V5MWZsYXQgXSxcblxuXHRcdFx0J0JiJzogWyBrZXkxZmxhdCwga2V5MmZsYXQgXSxcblx0XHRcdCdHbSc6IFsga2V5MWZsYXQsIGtleTJmbGF0IF0sXG5cdFx0XHQnRk1peCc6IFsga2V5MWZsYXQsIGtleTJmbGF0IF0sXG5cdFx0XHQnQ0Rvcic6IFsga2V5MWZsYXQsIGtleTJmbGF0IF0sXG5cdFx0XHQnRFBocic6IFsga2V5MWZsYXQsIGtleTJmbGF0IF0sXG5cdFx0XHQnRWJMeWQnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCBdLFxuXHRcdFx0J0FMb2MnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCBdLFxuXG5cdFx0XHQnRWInOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQgXSxcblx0XHRcdCdDbSc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCBdLFxuXHRcdFx0J0JiTWl4JzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0IF0sXG5cdFx0XHQnRkRvcic6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCBdLFxuXHRcdFx0J0dQaHInOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQgXSxcblx0XHRcdCdBYkx5ZCc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCBdLFxuXHRcdFx0J0RMb2MnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQgXSxcblxuXHRcdFx0J0FiJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCBdLFxuXHRcdFx0J0ZtJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCBdLFxuXHRcdFx0J0ViTWl4JzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCBdLFxuXHRcdFx0J0JiRG9yJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCBdLFxuXHRcdFx0J0NQaHInOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0IF0sXG5cdFx0XHQnRGJMeWQnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0IF0sXG5cdFx0XHQnR0xvYyc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQgXSxcblxuXHRcdFx0J0RiJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCwga2V5NWZsYXQgXSxcblx0XHRcdCdCYm0nOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCBdLFxuXHRcdFx0J0FiTWl4JzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCwga2V5NWZsYXQgXSxcblx0XHRcdCdFYkRvcic6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0IF0sXG5cdFx0XHQnRlBocic6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0IF0sXG5cdFx0XHQnR2JMeWQnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCBdLFxuXHRcdFx0J0NMb2MnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCBdLFxuXG5cdFx0XHQnR2InOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCwga2V5NmZsYXQgXSxcblx0XHRcdCdFYm0nOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCwga2V5NmZsYXQgXSxcblx0XHRcdCdEYk1peCc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCBdLFxuXHRcdFx0J0FiRG9yJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCwga2V5NWZsYXQsIGtleTZmbGF0IF0sXG5cdFx0XHQnQmJQaHInOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCwga2V5NmZsYXQgXSxcblx0XHRcdCdDYkx5ZCc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCBdLFxuXHRcdFx0J0ZMb2MnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQsIGtleTRmbGF0LCBrZXk1ZmxhdCwga2V5NmZsYXQgXSxcblxuXHRcdFx0J0NiJzogWyBrZXkxZmxhdCwga2V5MmZsYXQsIGtleTNmbGF0LCBrZXk0ZmxhdCwga2V5NWZsYXQsIGtleTZmbGF0LCBrZXk3ZmxhdCBdLFxuXHRcdFx0J0FibSc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblx0XHRcdCdHYk1peCc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblx0XHRcdCdEYkRvcic6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblx0XHRcdCdFYlBocic6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblx0XHRcdCdGYkx5ZCc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblx0XHRcdCdCYkxvYyc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQsIGtleTVmbGF0LCBrZXk2ZmxhdCwga2V5N2ZsYXQgXSxcblxuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyBhcmUgbm90IGluIHRoZSAyLjAgc3BlYywgYnV0IHNlZW0gbm9ybWFsIGVub3VnaC5cblx0XHRcdC8vIFRPRE8tUEVSOiBUaGVzZSBTT1VORCB0aGUgc2FtZSBhcyB3aGF0J3Mgd3JpdHRlbiwgYnV0IHRoZXkgYXJlbid0IHJpZ2h0XG5cdFx0XHQnQSMnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCBdLFxuXHRcdFx0J0IjJzogW10sXG5cdFx0XHQnRCMnOiBbIGtleTFmbGF0LCBrZXkyZmxhdCwga2V5M2ZsYXQgXSxcblx0XHRcdCdFIyc6IFsga2V5MWZsYXQgXSxcblx0XHRcdCdHIyc6IFsga2V5MWZsYXQsIGtleTJmbGF0LCBrZXkzZmxhdCwga2V5NGZsYXQgXSxcblx0XHRcdCdHYm0nOiBbIGtleTFzaGFycCwga2V5MnNoYXJwLCBrZXkzc2hhcnAsIGtleTRzaGFycCwga2V5NXNoYXJwLCBrZXk2c2hhcnAsIGtleTdzaGFycCBdXG5cdFx0fTtcblxuXHRcdHJldHVybiB0cmFuc3Bvc2Uua2V5U2lnbmF0dXJlKG11bHRpbGluZVZhcnMsIGtleXMsIGtleU5hbWUsIHJvb3QsIGFjYywgbG9jYWxUcmFuc3Bvc2UpO1xuXHR9O1xuXG5cdHZhciBjbGVmTGluZXMgPSB7XG5cdFx0J3RyZWJsZSc6IHsgY2xlZjogJ3RyZWJsZScsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlKzgnOiB7IGNsZWY6ICd0cmVibGUrOCcsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlLTgnOiB7IGNsZWY6ICd0cmVibGUtOCcsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlXjgnOiB7IGNsZWY6ICd0cmVibGUrOCcsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlXzgnOiB7IGNsZWY6ICd0cmVibGUtOCcsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlMSc6IHsgY2xlZjogJ3RyZWJsZScsIHBpdGNoOiAyLCBtaWQ6IDIgfSxcblx0XHQndHJlYmxlMic6IHsgY2xlZjogJ3RyZWJsZScsIHBpdGNoOiA0LCBtaWQ6IDAgfSxcblx0XHQndHJlYmxlMyc6IHsgY2xlZjogJ3RyZWJsZScsIHBpdGNoOiA2LCBtaWQ6IC0yIH0sXG5cdFx0J3RyZWJsZTQnOiB7IGNsZWY6ICd0cmVibGUnLCBwaXRjaDogOCwgbWlkOiAtNCB9LFxuXHRcdCd0cmVibGU1JzogeyBjbGVmOiAndHJlYmxlJywgcGl0Y2g6IDEwLCBtaWQ6IC02IH0sXG5cdFx0J3BlcmMnOiB7IGNsZWY6ICdwZXJjJywgcGl0Y2g6IDYsIG1pZDogMCB9LFxuXHRcdCdub25lJzogeyBjbGVmOiAnbm9uZScsIG1pZDogMCB9LFxuXHRcdCdiYXNzJzogeyBjbGVmOiAnYmFzcycsIHBpdGNoOiA4LCBtaWQ6IC0xMiB9LFxuXHRcdCdiYXNzKzgnOiB7IGNsZWY6ICdiYXNzKzgnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzcy04JzogeyBjbGVmOiAnYmFzcy04JywgcGl0Y2g6IDgsIG1pZDogLTEyIH0sXG5cdFx0J2Jhc3NeOCc6IHsgY2xlZjogJ2Jhc3MrOCcsIHBpdGNoOiA4LCBtaWQ6IC0xMiB9LFxuXHRcdCdiYXNzXzgnOiB7IGNsZWY6ICdiYXNzLTgnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzcysxNic6IHsgY2xlZjogJ2Jhc3MnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzcy0xNic6IHsgY2xlZjogJ2Jhc3MnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzc14xNic6IHsgY2xlZjogJ2Jhc3MnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzc18xNic6IHsgY2xlZjogJ2Jhc3MnLCBwaXRjaDogOCwgbWlkOiAtMTIgfSxcblx0XHQnYmFzczEnOiB7IGNsZWY6ICdiYXNzJywgcGl0Y2g6IDIsIG1pZDogLTYgfSxcblx0XHQnYmFzczInOiB7IGNsZWY6ICdiYXNzJywgcGl0Y2g6IDQsIG1pZDogLTggfSxcblx0XHQnYmFzczMnOiB7IGNsZWY6ICdiYXNzJywgcGl0Y2g6IDYsIG1pZDogLTEwIH0sXG5cdFx0J2Jhc3M0JzogeyBjbGVmOiAnYmFzcycsIHBpdGNoOiA4LCBtaWQ6IC0xMiB9LFxuXHRcdCdiYXNzNSc6IHsgY2xlZjogJ2Jhc3MnLCBwaXRjaDogMTAsIG1pZDogLTE0IH0sXG5cdFx0J3Rlbm9yJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA4LCBtaWQ6IC04IH0sXG5cdFx0J3Rlbm9yMSc6IHsgY2xlZjogJ2FsdG8nLCBwaXRjaDogMiwgbWlkOiAtMiB9LFxuXHRcdCd0ZW5vcjInOiB7IGNsZWY6ICdhbHRvJywgcGl0Y2g6IDQsIG1pZDogLTQgfSxcblx0XHQndGVub3IzJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA2LCBtaWQ6IC02IH0sXG5cdFx0J3Rlbm9yNCc6IHsgY2xlZjogJ2FsdG8nLCBwaXRjaDogOCwgbWlkOiAtOCB9LFxuXHRcdCd0ZW5vcjUnOiB7IGNsZWY6ICdhbHRvJywgcGl0Y2g6IDEwLCBtaWQ6IC0xMCB9LFxuXHRcdCdhbHRvJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA2LCBtaWQ6IC02IH0sXG5cdFx0J2FsdG8xJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiAyLCBtaWQ6IC0yIH0sXG5cdFx0J2FsdG8yJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA0LCBtaWQ6IC00IH0sXG5cdFx0J2FsdG8zJzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA2LCBtaWQ6IC02IH0sXG5cdFx0J2FsdG80JzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiA4LCBtaWQ6IC04IH0sXG5cdFx0J2FsdG81JzogeyBjbGVmOiAnYWx0bycsIHBpdGNoOiAxMCwgbWlkOiAtMTAgfSxcblx0XHQnYWx0bys4JzogeyBjbGVmOiAnYWx0bys4JywgcGl0Y2g6IDYsIG1pZDogLTYgfSxcblx0XHQnYWx0by04JzogeyBjbGVmOiAnYWx0by04JywgcGl0Y2g6IDYsIG1pZDogLTYgfSxcblx0XHQnYWx0b144JzogeyBjbGVmOiAnYWx0bys4JywgcGl0Y2g6IDYsIG1pZDogLTYgfSxcblx0XHQnYWx0b184JzogeyBjbGVmOiAnYWx0by04JywgcGl0Y2g6IDYsIG1pZDogLTYgfVxuXHR9O1xuXG5cdHZhciBjYWxjTWlkZGxlID0gZnVuY3Rpb24oY2xlZiwgb2N0KSB7XG5cdFx0dmFyIHZhbHVlID0gY2xlZkxpbmVzW2NsZWZdO1xuXHRcdHZhciBtaWQgPSB2YWx1ZSA/IHZhbHVlLm1pZCA6IDA7XG5cdFx0cmV0dXJuIG1pZCtvY3Q7XG5cdH07XG5cblx0cGFyc2VLZXlWb2ljZS5maXhDbGVmID0gZnVuY3Rpb24oY2xlZikge1xuXHRcdHZhciB2YWx1ZSA9IGNsZWZMaW5lc1tjbGVmLnR5cGVdO1xuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0Y2xlZi5jbGVmUG9zID0gdmFsdWUucGl0Y2g7XG5cdFx0XHRjbGVmLnR5cGUgPSB2YWx1ZS5jbGVmO1xuXHRcdH1cblx0fTtcblxuXHRwYXJzZUtleVZvaWNlLmRlZXBDb3B5S2V5ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIHJldCA9IHsgYWNjaWRlbnRhbHM6IFtdLCByb290OiBrZXkucm9vdCwgYWNjOiBrZXkuYWNjLCBtb2RlOiBrZXkubW9kZSB9O1xuXHRcdHBhcnNlQ29tbW9uLmVhY2goa2V5LmFjY2lkZW50YWxzLCBmdW5jdGlvbihrKSB7XG5cdFx0cmV0LmFjY2lkZW50YWxzLnB1c2gocGFyc2VDb21tb24uY2xvbmUoaykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cblx0dmFyIHBpdGNoZXMgPSB7QTogNSwgQjogNiwgQzogMCwgRDogMSwgRTogMiwgRjogMywgRzogNCwgYTogMTIsIGI6IDEzLCBjOiA3LCBkOiA4LCBlOiA5LCBmOiAxMCwgZzogMTF9O1xuXG5cdHBhcnNlS2V5Vm9pY2UuYWRkUG9zVG9LZXkgPSBmdW5jdGlvbihjbGVmLCBrZXkpIHtcblx0XHQvLyBTaGlmdCB0aGUga2V5IHNpZ25hdHVyZSBmcm9tIHRoZSB0cmVibGUgcG9zaXRpb25zIHRvIHdoYXRldmVyIHBvc2l0aW9uIGlzIG5lZWRlZCBmb3IgdGhlIGNsZWYuXG5cdFx0Ly8gVGhpcyBtYXkgcHV0IHRoZSBrZXkgc2lnbmF0dXJlIHVubmF0dXJhbGx5IGhpZ2ggb3IgbG93LCBzbyBpZiBpdCBkb2VzLCB0aGVuIHNoaWZ0IGl0LlxuXHRcdHZhciBtaWQgPSBjbGVmLnZlcnRpY2FsUG9zO1xuXHRcdHBhcnNlQ29tbW9uLmVhY2goa2V5LmFjY2lkZW50YWxzLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdHZhciBwaXRjaCA9IHBpdGNoZXNbYWNjLm5vdGVdO1xuXHRcdFx0cGl0Y2ggPSBwaXRjaCAtIG1pZDtcblx0XHRcdGFjYy52ZXJ0aWNhbFBvcyA9IHBpdGNoO1xuXHRcdH0pO1xuXHRcdGlmIChrZXkuaW1wbGllZE5hdHVyYWxzKVxuXHRcdFx0cGFyc2VDb21tb24uZWFjaChrZXkuaW1wbGllZE5hdHVyYWxzLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdFx0dmFyIHBpdGNoID0gcGl0Y2hlc1thY2Mubm90ZV07XG5cdFx0XHRcdHBpdGNoID0gcGl0Y2ggLSBtaWQ7XG5cdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyA9IHBpdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAobWlkIDwgLTEwKSB7XG5cdFx0XHRwYXJzZUNvbW1vbi5lYWNoKGtleS5hY2NpZGVudGFscywgZnVuY3Rpb24oYWNjKSB7XG5cdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPSA3O1xuXHRcdFx0XHRpZiAoYWNjLnZlcnRpY2FsUG9zID49IDExIHx8IChhY2MudmVydGljYWxQb3MgPT09IDEwICYmIGFjYy5hY2MgPT09ICdmbGF0JykpXG5cdFx0XHRcdFx0YWNjLnZlcnRpY2FsUG9zIC09IDc7XG5cdFx0XHRcdGlmIChhY2Mubm90ZSA9PT0gJ0EnICYmIGFjYy5hY2MgPT09ICdzaGFycCcgKVxuXHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPTc7XG5cdFx0XHRcdGlmICgoYWNjLm5vdGUgPT09ICdHJyB8fCBhY2Mubm90ZSA9PT0gJ0YnKSAmJiBhY2MuYWNjID09PSAnZmxhdCcgKVxuXHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPTc7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChrZXkuaW1wbGllZE5hdHVyYWxzKVxuXHRcdFx0XHRwYXJzZUNvbW1vbi5lYWNoKGtleS5pbXBsaWVkTmF0dXJhbHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPSA3O1xuXHRcdFx0XHRcdGlmIChhY2MudmVydGljYWxQb3MgPj0gMTEgfHwgKGFjYy52ZXJ0aWNhbFBvcyA9PT0gMTAgJiYgYWNjLmFjYyA9PT0gJ2ZsYXQnKSlcblx0XHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPSA3O1xuXHRcdFx0XHRcdGlmIChhY2Mubm90ZSA9PT0gJ0EnICYmIGFjYy5hY2MgPT09ICdzaGFycCcgKVxuXHRcdFx0XHRcdFx0YWNjLnZlcnRpY2FsUG9zIC09Nztcblx0XHRcdFx0XHRpZiAoKGFjYy5ub3RlID09PSAnRycgfHwgYWNjLm5vdGUgPT09ICdGJykgJiYgYWNjLmFjYyA9PT0gJ2ZsYXQnIClcblx0XHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPTc7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAobWlkIDwgLTQpIHtcblx0XHRcdHBhcnNlQ29tbW9uLmVhY2goa2V5LmFjY2lkZW50YWxzLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdFx0YWNjLnZlcnRpY2FsUG9zIC09IDc7XG5cdFx0XHRcdGlmIChtaWQgPT09IC04ICYmIChhY2Mubm90ZSA9PT0gJ2YnIHx8IGFjYy5ub3RlID09PSAnZycpICYmIGFjYy5hY2MgPT09ICdzaGFycCcgKVxuXHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPTc7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChrZXkuaW1wbGllZE5hdHVyYWxzKVxuXHRcdFx0XHRwYXJzZUNvbW1vbi5lYWNoKGtleS5pbXBsaWVkTmF0dXJhbHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRcdGFjYy52ZXJ0aWNhbFBvcyAtPSA3O1xuXHRcdFx0XHRcdGlmIChtaWQgPT09IC04ICYmIChhY2Mubm90ZSA9PT0gJ2YnIHx8IGFjYy5ub3RlID09PSAnZycpICYmIGFjYy5hY2MgPT09ICdzaGFycCcgKVxuXHRcdFx0XHRcdFx0YWNjLnZlcnRpY2FsUG9zIC09Nztcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChtaWQgPj0gNykge1xuXHRcdFx0cGFyc2VDb21tb24uZWFjaChrZXkuYWNjaWRlbnRhbHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRhY2MudmVydGljYWxQb3MgKz0gNztcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGtleS5pbXBsaWVkTmF0dXJhbHMpXG5cdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2goa2V5LmltcGxpZWROYXR1cmFscywgZnVuY3Rpb24oYWNjKSB7XG5cdFx0XHRcdFx0YWNjLnZlcnRpY2FsUG9zICs9IDc7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHRwYXJzZUtleVZvaWNlLmZpeEtleSA9IGZ1bmN0aW9uKGNsZWYsIGtleSkge1xuXHRcdHZhciBmaXhlZEtleSA9IHBhcnNlQ29tbW9uLmNsb25lKGtleSk7XG5cdFx0cGFyc2VLZXlWb2ljZS5hZGRQb3NUb0tleShjbGVmLCBmaXhlZEtleSk7XG5cdFx0cmV0dXJuIGZpeGVkS2V5O1xuXHR9O1xuXG5cdHZhciBwYXJzZU1pZGRsZSA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgcCA9IHN0ci5jaGFyQXQoaSsrKTtcblx0XHRpZiAocCA9PT0gJ14nIHx8IHAgPT09ICdfJylcblx0XHRcdHAgPSBzdHIuY2hhckF0KGkrKyk7XG5cdCAgdmFyIG1pZCA9IHBpdGNoZXNbcF07XG5cdFx0aWYgKG1pZCA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0bWlkID0gNjsgLy8gSWYgYSBsZWdhbCBtaWRkbGUgbm90ZSB3YXNuJ3QgcmVjZWl2ZWQsIGp1c3QgaWdub3JlIGl0LlxuXHRcdGZvciAoIDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHN0ci5jaGFyQXQoaSkgPT09ICcsJykgbWlkIC09IDc7XG5cdFx0XHRlbHNlIGlmIChzdHIuY2hhckF0KGkpID09PSBcIidcIikgbWlkICs9IDc7XG5cdFx0XHRlbHNlIGJyZWFrO1xuXHRcdH1cblx0XHRyZXR1cm4geyBtaWQ6IG1pZCAtIDYsIHN0cjogc3RyLnN1YnN0cmluZyhpKSB9O1x0Ly8gV2UgZ2V0IHRoZSBub3RlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0YWZmLiBXZSB3YW50IHRoZSBub3RlIHRoYXQgYXBwZWFycyBhcyB0aGUgZmlyc3QgbGVkZ2VyIGxpbmUgYmVsb3cgdGhlIHN0YWZmLlxuXHR9O1xuXG5cdHZhciBub3JtYWxpemVBY2NpZGVudGFscyA9IGZ1bmN0aW9uKGFjY3MpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFjY3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChhY2NzW2ldLm5vdGUgPT09ICdiJylcblx0XHRcdFx0YWNjc1tpXS5ub3RlID0gJ0InO1xuXHRcdFx0ZWxzZSBpZiAoYWNjc1tpXS5ub3RlID09PSAnYScpXG5cdFx0XHRcdGFjY3NbaV0ubm90ZSA9ICdBJztcblx0XHRcdGVsc2UgaWYgKGFjY3NbaV0ubm90ZSA9PT0gJ0YnKVxuXHRcdFx0XHRhY2NzW2ldLm5vdGUgPSAnZic7XG5cdFx0XHRlbHNlIGlmIChhY2NzW2ldLm5vdGUgPT09ICdFJylcblx0XHRcdFx0YWNjc1tpXS5ub3RlID0gJ2UnO1xuXHRcdFx0ZWxzZSBpZiAoYWNjc1tpXS5ub3RlID09PSAnRCcpXG5cdFx0XHRcdGFjY3NbaV0ubm90ZSA9ICdkJztcblx0XHRcdGVsc2UgaWYgKGFjY3NbaV0ubm90ZSA9PT0gJ0MnKVxuXHRcdFx0XHRhY2NzW2ldLm5vdGUgPSAnYyc7XG5cdFx0XHRlbHNlIGlmIChhY2NzW2ldLm5vdGUgPT09ICdHJyAmJiBhY2NzW2ldLmFjYyA9PT0gJ3NoYXJwJylcblx0XHRcdFx0YWNjc1tpXS5ub3RlID0gJ2cnO1xuXHRcdFx0ZWxzZSBpZiAoYWNjc1tpXS5ub3RlID09PSAnZycgJiYgYWNjc1tpXS5hY2MgPT09ICdmbGF0Jylcblx0XHRcdFx0YWNjc1tpXS5ub3RlID0gJ0cnO1xuXHRcdH1cblx0fTtcblxuXHRwYXJzZUtleVZvaWNlLnBhcnNlS2V5ID0gZnVuY3Rpb24oc3RyKVx0Ly8gKGFuZCBjbGVmKVxuXHR7XG5cdFx0Ly8gcmV0dXJuczpcblx0XHQvL1x0XHR7IGZvdW5kQ2xlZjogdHJ1ZSwgZm91bmRLZXk6IHRydWUgfVxuXHRcdC8vIFNpZGUgZWZmZWN0czpcblx0XHQvL1x0XHRjYWxscyB3YXJuKCkgd2hlbiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvclxuXHRcdC8vXHRcdHNldHMgdGhlc2UgbWVtYmVycyBvZiBtdWx0aWxpbmVWYXJzOlxuXHRcdC8vXHRcdFx0Y2xlZlxuXHRcdC8vXHRcdFx0a2V5XG5cdFx0Ly9cdFx0XHRzdHlsZVxuXHRcdC8vXG5cdFx0Ly8gVGhlIGZvcm1hdCBpczpcblx0XHQvLyBLOiBb4p+oa2V54p+pXSBb4p+obW9kaWZpZXJz4p+pKl1cblx0XHQvLyBtb2RpZmllcnMgYXJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluIGFueSBvcmRlcjpcblx0XHQvLyAgW+KfqGNsZWbin6ldIFttaWRkbGU94p+ocGl0Y2jin6ldIFt0cmFuc3Bvc2U9Wy1d4p+obnVtYmVy4p+pXSBbc3RhZmZsaW5lcz3in6hudW1iZXLin6ldIFtzdGFmZnNjYWxlPeKfqG51bWJlcuKfqV1bc3R5bGU94p+oc3R5bGXin6ldXG5cdFx0Ly8ga2V5IGlzIG5vbmV8SFB8SHB84p+oc3BlY2lmaWVkX2tleeKfqVxuXHRcdC8vIGNsZWYgaXMgW2NsZWY9XSBb4p+oY2xlZiB0eXBl4p+pXSBb4p+obGluZSBudW1iZXLin6ldIFsrOHwtOF1cblx0XHQvLyBzcGVjaWZpZWRfa2V5IGlzIOKfqHBpdGNo4p+pWyN8Yl1bbW9kZShmaXJzdCB0aHJlZSBjaGFycyBhcmUgc2lnbmlmaWNhbnQpXVthY2NpZGVudGFscypdXG5cdFx0aWYgKHN0ci5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIGFuIGVtcHR5IEs6IGZpZWxkIGlzIHRoZSBzYW1lIGFzIEs6bm9uZVxuXHRcdFx0c3RyID0gJ25vbmUnO1xuXHRcdH1cblx0XHR2YXIgdG9rZW5zID0gdG9rZW5pemVyLnRva2VuaXplKHN0ciwgMCwgc3RyLmxlbmd0aCk7XG5cdFx0dmFyIHJldCA9IHt9O1xuXG5cdFx0Ly8gZmlyc3QgdGhlIGtleVxuXHRcdHN3aXRjaCAodG9rZW5zWzBdLnRva2VuKSB7XG5cdFx0XHRjYXNlICdIUCc6XG5cdFx0XHRcdHBhcnNlRGlyZWN0aXZlLmFkZERpcmVjdGl2ZShcImJhZ3BpcGVzXCIpO1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleSA9IHsgcm9vdDogXCJIUFwiLCBhY2NpZGVudGFsczogW10sIGFjYzogXCJcIiwgbW9kZTogXCJcIiB9O1xuXHRcdFx0XHRyZXQuZm91bmRLZXkgPSB0cnVlO1xuXHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdIcCc6XG5cdFx0XHRcdHBhcnNlRGlyZWN0aXZlLmFkZERpcmVjdGl2ZShcImJhZ3BpcGVzXCIpO1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleSA9IHsgcm9vdDogXCJIcFwiLCBhY2NpZGVudGFsczogW3thY2M6ICduYXR1cmFsJywgbm90ZTogJ2cnfSwge2FjYzogJ3NoYXJwJywgbm90ZTogJ2YnfSwge2FjYzogJ3NoYXJwJywgbm90ZTogJ2MnfV0sIGFjYzogXCJcIiwgbW9kZTogXCJcIiB9O1xuXHRcdFx0XHRyZXQuZm91bmRLZXkgPSB0cnVlO1xuXHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdub25lJzpcblx0XHRcdFx0Ly8gd2UgZ290IHRoZSBub25lIGtleSAtIHRoYXQncyB0aGUgc2FtZSBhcyBDIHRvIHVzXG5cdFx0XHRcdG11bHRpbGluZVZhcnMua2V5ID0geyByb290OiBcIm5vbmVcIiwgYWNjaWRlbnRhbHM6IFtdLCBhY2M6IFwiXCIsIG1vZGU6IFwiXCIgfTtcblx0XHRcdFx0cmV0LmZvdW5kS2V5ID0gdHJ1ZTtcblx0XHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dmFyIHJldFBpdGNoID0gdG9rZW5pemVyLmdldEtleVBpdGNoKHRva2Vuc1swXS50b2tlbik7XG5cdFx0XHRcdGlmIChyZXRQaXRjaC5sZW4gPiAwKSB7XG5cdFx0XHRcdFx0cmV0LmZvdW5kS2V5ID0gdHJ1ZTtcblx0XHRcdFx0XHR2YXIgYWNjID0gXCJcIjtcblx0XHRcdFx0XHR2YXIgbW9kZSA9IFwiXCI7XG5cdFx0XHRcdFx0Ly8gVGhlIGFjY2lkZW50YWwgYW5kIG1vZGUgbWlnaHQgYmUgYXR0YWNoZWQgdG8gdGhlIHBpdGNoLCBzbyB3ZSBtaWdodCB3YW50IHRvIGp1c3QgcmVtb3ZlIHRoZSBmaXJzdCBjaGFyYWN0ZXIuXG5cdFx0XHRcdFx0aWYgKHRva2Vuc1swXS50b2tlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdFx0dG9rZW5zWzBdLnRva2VuID0gdG9rZW5zWzBdLnRva2VuLnN1YnN0cmluZygxKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHR2YXIga2V5ID0gcmV0UGl0Y2gudG9rZW47XG5cdFx0XHRcdFx0Ly8gV2UgZ290IGEgcGl0Y2ggdG8gc3RhcnQgd2l0aCwgc28gd2UgbWlnaHQgYWxzbyBoYXZlIGFuIGFjY2lkZW50YWwgYW5kIGEgbW9kZVxuXHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIHJldEFjYyA9IHRva2VuaXplci5nZXRTaGFycEZsYXQodG9rZW5zWzBdLnRva2VuKTtcblx0XHRcdFx0XHRcdGlmIChyZXRBY2MubGVuID4gMCkge1xuXHRcdFx0XHRcdFx0XHRpZiAodG9rZW5zWzBdLnRva2VuLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zWzBdLnRva2VuID0gdG9rZW5zWzBdLnRva2VuLnN1YnN0cmluZygxKTtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0XHRrZXkgKz0gcmV0QWNjLnRva2VuO1xuXHRcdFx0XHRcdFx0XHRhY2MgPSByZXRBY2MudG9rZW47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHJldE1vZGUgPSB0b2tlbml6ZXIuZ2V0TW9kZSh0b2tlbnNbMF0udG9rZW4pO1xuXHRcdFx0XHRcdFx0XHRpZiAocmV0TW9kZS5sZW4gPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0XHRcdFx0a2V5ICs9IHJldE1vZGUudG9rZW47XG5cdFx0XHRcdFx0XHRcdFx0bW9kZSA9IHJldE1vZGUudG9rZW47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEJlIHN1cmUgdGhhdCB0aGUga2V5IHNwZWNpZmllZCBpcyBpbiB0aGUgbGlzdDogbm90IGFsbCBrZXlzIGFyZSBwaHlzaWNhbGx5IHBvc3NpYmxlLCBsaWtlIENibWluLlxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlS2V5Vm9pY2Uuc3RhbmRhcmRLZXkoa2V5LCByZXRQaXRjaC50b2tlbiwgYWNjLCAwKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHdhcm4oXCJVbnN1cHBvcnRlZCBrZXkgc2lnbmF0dXJlOiBcIiArIGtleSwgc3RyLCAwKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBkbyBhIGRlZXAgY29weSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgaXRcblx0XHRcdFx0XHR2YXIgb2xkS2V5ID0gcGFyc2VLZXlWb2ljZS5kZWVwQ29weUtleShtdWx0aWxpbmVWYXJzLmtleSk7XG5cdFx0XHRcdFx0Ly9UT0RPLVBFUjogSEFDSyEgVG8gZ2V0IHRoZSBsb2NhbCB0cmFuc3Bvc2UgdG8gd29yaywgdGhlIHRyYW5zcG9zaXRpb24gaXMgZG9uZSBmb3IgZWFjaCBsaW5lLiBUaGlzIGNhdXNlZCB0aGUgZ2xvYmFsIHRyYW5zcG9zaXRpb24gdmFyaWFibGUgdG8gYmUgZmFjdG9yZWQgaW4gdHdpY2UsIHNvLCBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGF0IHJpZ2h0IG5vdywgSSdtIGp1c3Qgc3VidHJhY3Rpbmcgb25lIG9mIHRoZW0gaGVyZS5cblx0XHRcdFx0XHR2YXIga2V5Q29tcGVuc2F0ZSA9IG11bHRpbGluZVZhcnMuZ2xvYmFsVHJhbnNwb3NlID8gLW11bHRpbGluZVZhcnMuZ2xvYmFsVHJhbnNwb3NlIDogMDtcblx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleSA9IHBhcnNlS2V5Vm9pY2UuZGVlcENvcHlLZXkocGFyc2VLZXlWb2ljZS5zdGFuZGFyZEtleShrZXksIHJldFBpdGNoLnRva2VuLCBhY2MsIGtleUNvbXBlbnNhdGUpKTtcblx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleS5tb2RlID0gbW9kZTtcblx0XHRcdFx0XHRpZiAob2xkS2V5KSB7XG5cdFx0XHRcdFx0XHQvLyBBZGQgbmF0dXJhbCBpbiBhbGwgcGxhY2VzIHRoYXQgdGhlIG9sZCBrZXkgaGFkIGFuIGFjY2lkZW50YWwuXG5cdFx0XHRcdFx0XHR2YXIga2s7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IG11bHRpbGluZVZhcnMua2V5LmFjY2lkZW50YWxzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoa2sgPSAwOyBrayA8IG9sZEtleS5hY2NpZGVudGFscy5sZW5ndGg7IGtrKyspIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAob2xkS2V5LmFjY2lkZW50YWxzW2trXS5ub3RlICYmIG11bHRpbGluZVZhcnMua2V5LmFjY2lkZW50YWxzW2tdLm5vdGUudG9Mb3dlckNhc2UoKSA9PT0gb2xkS2V5LmFjY2lkZW50YWxzW2trXS5ub3RlLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHRcdFx0XHRcdFx0XHRvbGRLZXkuYWNjaWRlbnRhbHNba2tdLm5vdGUgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRmb3IgKGtrID0gMDsga2sgPCBvbGRLZXkuYWNjaWRlbnRhbHMubGVuZ3RoOyBraysrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvbGRLZXkuYWNjaWRlbnRhbHNba2tdLm5vdGUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscylcblx0XHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscy5wdXNoKHsgYWNjOiAnbmF0dXJhbCcsIG5vdGU6IG9sZEtleS5hY2NpZGVudGFsc1tra10ubm90ZSB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXMgb2YgZGVwcmVjYXRlZCBzeW50YXguIElnbm9yZSB0aGVtIGlmIHRoZXkgb2NjdXJcblx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJldDtcblx0XHRpZiAodG9rZW5zWzBdLnRva2VuID09PSAnZXhwJykgdG9rZW5zLnNoaWZ0KCk7XG5cdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiByZXQ7XG5cdFx0aWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJ29jdCcpIHRva2Vucy5zaGlmdCgpO1xuXG5cdFx0Ly8gbm93IHNlZSBpZiB0aGVyZSBhcmUgZXh0cmEgYWNjaWRlbnRhbHNcblx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJldDtcblx0XHR2YXIgYWNjcyA9IHRva2VuaXplci5nZXRLZXlBY2NpZGVudGFsczIodG9rZW5zKTtcblx0XHRpZiAoYWNjcy53YXJuKVxuXHRcdFx0d2FybihhY2NzLndhcm4sIHN0ciwgMCk7XG5cdFx0Ly8gSWYgd2UgaGF2ZSBleHRyYSBhY2NpZGVudGFscywgZmlyc3QgcmVwbGFjZSBvbmVzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHBpdGNoIGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgZW5kLlxuXHRcdGlmIChhY2NzLmFjY3MpIHtcblx0XHRcdGlmICghcmV0LmZvdW5kS2V5KSB7XHRcdC8vIGlmIHRoZXJlIGFyZSBvbmx5IGV4dHJhIGFjY2lkZW50YWxzLCBtYWtlIHN1cmUgdGhpcyBpcyBzZXQuXG5cdFx0XHRcdHJldC5mb3VuZEtleSA9IHRydWU7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMua2V5ID0geyByb290OiBcIm5vbmVcIiwgYWNjOiBcIlwiLCBtb2RlOiBcIlwiLCBhY2NpZGVudGFsczogW10gfTtcblx0XHRcdH1cblx0XHRcdG5vcm1hbGl6ZUFjY2lkZW50YWxzKGFjY3MuYWNjcyk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFjY3MuYWNjcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBtdWx0aWxpbmVWYXJzLmtleS5hY2NpZGVudGFscy5sZW5ndGggJiYgIWZvdW5kOyBqKyspIHtcblx0XHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5rZXkuYWNjaWRlbnRhbHNbal0ubm90ZSA9PT0gYWNjcy5hY2NzW2ldLm5vdGUpIHtcblx0XHRcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmtleS5hY2NpZGVudGFsc1tqXS5hY2MgIT09IGFjY3MuYWNjc1tpXS5hY2MpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjY2lkZW50YWwgaXMgZGlmZmVyZW50LCB0aGVuIHJlcGxhY2UgaXQuIElmIGl0IGlzIHRoZSBzYW1lLCB0aGVuIHRoZSBkZWNsYXJhdGlvbiB3YXMgcmVkdW5kYW50LCBzbyBqdXN0IGlnbm9yZSBpdC5cblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5rZXkuYWNjaWRlbnRhbHNbal0uYWNjID0gYWNjcy5hY2NzW2ldLmFjYztcblx0XHRcdFx0XHRcdFx0aWYgKCFtdWx0aWxpbmVWYXJzLmtleS5leHBsaWNpdEFjY2lkZW50YWxzKVxuXHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHMgPSBbXTtcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5rZXkuZXhwbGljaXRBY2NpZGVudGFscy5wdXNoKGFjY3MuYWNjc1tpXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0XHRpZiAoIW11bHRpbGluZVZhcnMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHMpXG5cdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleS5leHBsaWNpdEFjY2lkZW50YWxzID0gW107XG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5rZXkuZXhwbGljaXRBY2NpZGVudGFscy5wdXNoKGFjY3MuYWNjc1tpXSk7XG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5rZXkuYWNjaWRlbnRhbHMucHVzaChhY2NzLmFjY3NbaV0pO1xuXHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmtleS5pbXBsaWVkTmF0dXJhbHMpIHtcblx0XHRcdFx0XHRcdGZvciAodmFyIGtrayA9IDA7IGtrayA8IG11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscy5sZW5ndGg7IGtraysrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmtleS5pbXBsaWVkTmF0dXJhbHNba2trXS5ub3RlID09PSBhY2NzLmFjY3NbaV0ubm90ZSlcblx0XHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmtleS5pbXBsaWVkTmF0dXJhbHMuc3BsaWNlKGtraywgMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTm93IHNlZSBpZiBhbnkgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgcHJlc2VudC4gVGhleSBoYXZlIHRoZSBmb3JtIFwia2V5PXZhbHVlXCIsIGV4Y2VwdCB0aGF0IFwiY2xlZj1cIiBpcyBvcHRpb25hbFxuXHRcdHZhciB0b2tlbjtcblx0XHR3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcblx0XHRcdHN3aXRjaCAodG9rZW5zWzBdLnRva2VuKSB7XG5cdFx0XHRcdGNhc2UgXCJtXCI6XG5cdFx0XHRcdGNhc2UgXCJtaWRkbGVcIjpcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgPSBhZnRlciBtaWRkbGVcIiwgc3RyLCAwKTsgcmV0dXJuIHJldDsgfVxuXHRcdFx0XHRcdHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0aWYgKHRva2VuLnRva2VuICE9PSBcIj1cIikgeyB3YXJuKFwiRXhwZWN0ZWQgPSBhZnRlciBtaWRkbGVcIiwgc3RyLCB0b2tlbi5zdGFydCk7IGJyZWFrOyB9XG5cdFx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHsgd2FybihcIkV4cGVjdGVkIHBhcmFtZXRlciBhZnRlciBtaWRkbGU9XCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHR2YXIgcGl0Y2ggPSB0b2tlbml6ZXIuZ2V0UGl0Y2hGcm9tVG9rZW5zKHRva2Vucyk7XG5cdFx0XHRcdFx0aWYgKHBpdGNoLndhcm4pXG5cdFx0XHRcdFx0XHR3YXJuKHBpdGNoLndhcm4sIHN0ciwgMCk7XG5cdFx0XHRcdFx0aWYgKHBpdGNoLnBvc2l0aW9uKVxuXHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5jbGVmLnZlcnRpY2FsUG9zID0gcGl0Y2gucG9zaXRpb24gLSA2O1x0Ly8gd2UgZ2V0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBtaWRkbGUgbGluZSwgYnV0IHdhbnQgdG8gb2Zmc2V0IGl0IHRvIHRoZSBmaXJzdCBsZWRnZXIgbGluZS5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInRyYW5zcG9zZVwiOlxuXHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7IHdhcm4oXCJFeHBlY3RlZCA9IGFmdGVyIHRyYW5zcG9zZVwiLCBzdHIsIDApOyByZXR1cm4gcmV0OyB9XG5cdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW4udG9rZW4gIT09IFwiPVwiKSB7IHdhcm4oXCJFeHBlY3RlZCA9IGFmdGVyIHRyYW5zcG9zZVwiLCBzdHIsIHRva2VuLnN0YXJ0KTsgYnJlYWs7IH1cblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgcGFyYW1ldGVyIGFmdGVyIHRyYW5zcG9zZT1cIiwgc3RyLCAwKTsgcmV0dXJuIHJldDsgfVxuXHRcdFx0XHRcdGlmICh0b2tlbnNbMF0udHlwZSAhPT0gJ251bWJlcicpIHsgd2FybihcIkV4cGVjdGVkIG51bWJlciBhZnRlciB0cmFuc3Bvc2VcIiwgc3RyLCB0b2tlbnNbMF0uc3RhcnQpOyBicmVhazsgfVxuXHRcdFx0XHRcdG11bHRpbGluZVZhcnMuY2xlZi50cmFuc3Bvc2UgPSB0b2tlbnNbMF0uaW50dDtcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInN0YWZmbGluZXNcIjpcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgPSBhZnRlciBzdGFmZmxpbmVzXCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50b2tlbiAhPT0gXCI9XCIpIHsgd2FybihcIkV4cGVjdGVkID0gYWZ0ZXIgc3RhZmZsaW5lc1wiLCBzdHIsIHRva2VuLnN0YXJ0KTsgYnJlYWs7IH1cblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgcGFyYW1ldGVyIGFmdGVyIHN0YWZmbGluZXM9XCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHRpZiAodG9rZW5zWzBdLnR5cGUgIT09ICdudW1iZXInKSB7IHdhcm4oXCJFeHBlY3RlZCBudW1iZXIgYWZ0ZXIgc3RhZmZsaW5lc1wiLCBzdHIsIHRva2Vuc1swXS5zdGFydCk7IGJyZWFrOyB9XG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5jbGVmLnN0YWZmbGluZXMgPSB0b2tlbnNbMF0uaW50dDtcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInN0YWZmc2NhbGVcIjpcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgPSBhZnRlciBzdGFmZnNjYWxlXCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50b2tlbiAhPT0gXCI9XCIpIHsgd2FybihcIkV4cGVjdGVkID0gYWZ0ZXIgc3RhZmZzY2FsZVwiLCBzdHIsIHRva2VuLnN0YXJ0KTsgYnJlYWs7IH1cblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgcGFyYW1ldGVyIGFmdGVyIHN0YWZmc2NhbGU9XCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHRpZiAodG9rZW5zWzBdLnR5cGUgIT09ICdudW1iZXInKSB7IHdhcm4oXCJFeHBlY3RlZCBudW1iZXIgYWZ0ZXIgc3RhZmZzY2FsZVwiLCBzdHIsIHRva2Vuc1swXS5zdGFydCk7IGJyZWFrOyB9XG5cdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5jbGVmLnN0YWZmc2NhbGUgPSB0b2tlbnNbMF0uZmxvYXR0O1xuXHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic3R5bGVcIjpcblx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgeyB3YXJuKFwiRXhwZWN0ZWQgPSBhZnRlciBzdHlsZVwiLCBzdHIsIDApOyByZXR1cm4gcmV0OyB9XG5cdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW4udG9rZW4gIT09IFwiPVwiKSB7IHdhcm4oXCJFeHBlY3RlZCA9IGFmdGVyIHN0eWxlXCIsIHN0ciwgdG9rZW4uc3RhcnQpOyBicmVhazsgfVxuXHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7IHdhcm4oXCJFeHBlY3RlZCBwYXJhbWV0ZXIgYWZ0ZXIgc3R5bGU9XCIsIHN0ciwgMCk7IHJldHVybiByZXQ7IH1cblx0XHRcdFx0XHRzd2l0Y2ggKHRva2Vuc1swXS50b2tlbikge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm5vcm1hbFwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcImhhcm1vbmljXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwicmh5dGhtXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwieFwiOlxuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnN0eWxlID0gdG9rZW5zWzBdLnRva2VuO1xuXHRcdFx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR3YXJuKFwiZXJyb3IgcGFyc2luZyBzdHlsZSBlbGVtZW50OiBcIiArIHRva2Vuc1swXS50b2tlbiwgc3RyLCB0b2tlbnNbMF0uc3RhcnQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjbGVmXCI6XG5cdFx0XHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHsgd2FybihcIkV4cGVjdGVkID0gYWZ0ZXIgY2xlZlwiLCBzdHIsIDApOyByZXR1cm4gcmV0OyB9XG5cdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW4udG9rZW4gIT09IFwiPVwiKSB7IHdhcm4oXCJFeHBlY3RlZCA9IGFmdGVyIGNsZWZcIiwgc3RyLCB0b2tlbi5zdGFydCk7IGJyZWFrOyB9XG5cdFx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHsgd2FybihcIkV4cGVjdGVkIHBhcmFtZXRlciBhZnRlciBjbGVmPVwiLCBzdHIsIDApOyByZXR1cm4gcmV0OyB9XG5cdFx0XHRcdFx0Ly9icmVhazsgeWVzLCB3ZSB3YW50IHRvIGZhbGwgdGhyb3VnaC4gVGhhdCBhbGxvd3MgXCJjbGVmPVwiIHRvIGJlIG9wdGlvbmFsLlxuXHRcdFx0XHRjYXNlIFwidHJlYmxlXCI6XG5cdFx0XHRcdGNhc2UgXCJiYXNzXCI6XG5cdFx0XHRcdGNhc2UgXCJhbHRvXCI6XG5cdFx0XHRcdGNhc2UgXCJ0ZW5vclwiOlxuXHRcdFx0XHRjYXNlIFwicGVyY1wiOlxuXHRcdFx0XHRcdC8vIGNsZWYgaXMgW2NsZWY9XSBb4p+oY2xlZiB0eXBl4p+pXSBb4p+obGluZSBudW1iZXLin6ldIFsrOHwtOF1cblx0XHRcdFx0XHR2YXIgY2xlZiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdHN3aXRjaCAoY2xlZi50b2tlbikge1xuXHRcdFx0XHRcdFx0Y2FzZSAndHJlYmxlJzpcblx0XHRcdFx0XHRcdGNhc2UgJ3Rlbm9yJzpcblx0XHRcdFx0XHRcdGNhc2UgJ2FsdG8nOlxuXHRcdFx0XHRcdFx0Y2FzZSAnYmFzcyc6XG5cdFx0XHRcdFx0XHRjYXNlICdwZXJjJzpcblx0XHRcdFx0XHRcdGNhc2UgJ25vbmUnOlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0MnOiBjbGVmLnRva2VuID0gJ2FsdG8nOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0YnOiBjbGVmLnRva2VuID0gJ2Jhc3MnOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0cnOiBjbGVmLnRva2VuID0gJ3RyZWJsZSc7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnYyc6IGNsZWYudG9rZW4gPSAnYWx0byc7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZic6IGNsZWYudG9rZW4gPSAnYmFzcyc7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZyc6IGNsZWYudG9rZW4gPSAndHJlYmxlJzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgY2xlZiBuYW1lLiBGb3VuZCBcIiArIGNsZWYudG9rZW4sIHN0ciwgY2xlZi5zdGFydCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdFx0XHRjbGVmLnRva2VuICs9IHRva2Vuc1swXS50b2tlbjtcblx0XHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA+IDEgJiYgKHRva2Vuc1swXS50b2tlbiA9PT0gJy0nIHx8IHRva2Vuc1swXS50b2tlbiA9PT0gJysnIHx8IHRva2Vuc1swXS50b2tlbiA9PT0gJ14nIHx8IHRva2Vuc1swXS50b2tlbiA9PT0gJ18nKSAmJiB0b2tlbnNbMV0udG9rZW4gPT09ICc4Jykge1xuXHRcdFx0XHRcdFx0Y2xlZi50b2tlbiArPSB0b2tlbnNbMF0udG9rZW4gKyB0b2tlbnNbMV0udG9rZW47XG5cdFx0XHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmNsZWYgPSB7dHlwZTogY2xlZi50b2tlbiwgdmVydGljYWxQb3M6IGNhbGNNaWRkbGUoY2xlZi50b2tlbiwgMCl9O1xuXHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZSAmJiBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS50cmFuc3Bvc2UgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuY2xlZi50cmFuc3Bvc2UgPSBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS50cmFuc3Bvc2U7XG5cdFx0XHRcdFx0cmV0LmZvdW5kQ2xlZiA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0d2FybihcIlVua25vd24gcGFyYW1ldGVyOiBcIiArIHRva2Vuc1swXS50b2tlbiwgc3RyLCB0b2tlbnNbMF0uc3RhcnQpO1xuXHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdHZhciBzZXRDdXJyZW50Vm9pY2UgPSBmdW5jdGlvbihpZCkge1xuXHRcdG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlID0gbXVsdGlsaW5lVmFycy52b2ljZXNbaWRdO1xuXHRcdHR1bmUuc2V0Q3VycmVudFZvaWNlKG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtLCBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5pbmRleCk7XG5cdH07XG5cblx0cGFyc2VLZXlWb2ljZS5wYXJzZVZvaWNlID0gZnVuY3Rpb24obGluZSwgaSwgZSkge1xuXHRcdC8vRmlyc3QgdHJ1bmNhdGUgdGhlIHN0cmluZyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXJhY3RlciBhZnRlciBWOiB0aHJvdWdoIGVpdGhlciB0aGVcblx0XHQvL2VuZCBvZiB0aGUgbGluZSBvciBhICUgY2hhcmFjdGVyLiBUaGVuIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMsIHRvby5cblx0XHR2YXIgcmV0ID0gdG9rZW5pemVyLmdldE1lYXQobGluZSwgaSwgZSk7XG5cdFx0dmFyIHN0YXJ0ID0gcmV0LnN0YXJ0O1xuXHRcdHZhciBlbmQgPSByZXQuZW5kO1xuXHRcdC8vVGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lIGlzIHRoZSBJRC4gSXQgY2FuIGJlIGFueSBub24tc3BhY2Ugc3RyaW5nIGFuZCB0ZXJtaW5hdGVzIGF0IHRoZVxuXHRcdC8vZmlyc3Qgc3BhY2UuXG5cdFx0dmFyIGlkID0gdG9rZW5pemVyLmdldFRva2VuKGxpbmUsIHN0YXJ0LCBlbmQpO1xuXHRcdGlmIChpZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHdhcm4oXCJFeHBlY3RlZCBhIHZvaWNlIGlkXCIsIGxpbmUsIHN0YXJ0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGlzTmV3ID0gZmFsc2U7XG5cdFx0aWYgKG11bHRpbGluZVZhcnMudm9pY2VzW2lkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0gPSB7fTtcblx0XHRcdGlzTmV3ID0gdHJ1ZTtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLnNjb3JlX2lzX3ByZXNlbnQpXG5cdFx0XHRcdHdhcm4oXCJDYW4ndCBoYXZlIGFuIHVua25vd24gVjogaWQgd2hlbiB0aGUgJXNjb3JlIGRpcmVjdGl2ZSBpcyBwcmVzZW50XCIsIGxpbmUsIHN0YXJ0KTtcblx0XHR9XG5cdFx0c3RhcnQgKz0gaWQubGVuZ3RoO1xuXHRcdHN0YXJ0ICs9IHRva2VuaXplci5lYXRXaGl0ZVNwYWNlKGxpbmUsIHN0YXJ0KTtcblxuXHRcdHZhciBzdGFmZkluZm8gPSB7c3RhcnRTdGFmZjogaXNOZXd9O1xuXHRcdHZhciBhZGROZXh0VG9rZW5Ub1N0YWZmSW5mbyA9IGZ1bmN0aW9uKG5hbWUpIHtcblx0XHRcdHZhciBhdHRyID0gdG9rZW5pemVyLmdldFZvaWNlVG9rZW4obGluZSwgc3RhcnQsIGVuZCk7XG5cdFx0XHRpZiAoYXR0ci53YXJuICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCB2YWx1ZSBmb3IgXCIgKyBuYW1lICsgXCIgaW4gdm9pY2U6IFwiICsgYXR0ci53YXJuLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRlbHNlIGlmIChhdHRyLnRva2VuLmxlbmd0aCA9PT0gMCAmJiBsaW5lLmNoYXJBdChzdGFydCkgIT09ICdcIicpXG5cdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCB2YWx1ZSBmb3IgXCIgKyBuYW1lICsgXCIgaW4gdm9pY2VcIiwgbGluZSwgc3RhcnQpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdGFmZkluZm9bbmFtZV0gPSBhdHRyLnRva2VuO1xuXHRcdFx0c3RhcnQgKz0gYXR0ci5sZW47XG5cdFx0fTtcblx0XHR2YXIgYWRkTmV4dFRva2VuVG9Wb2ljZUluZm8gPSBmdW5jdGlvbihpZCwgbmFtZSwgdHlwZSkge1xuXHRcdFx0dmFyIGF0dHIgPSB0b2tlbml6ZXIuZ2V0Vm9pY2VUb2tlbihsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRcdGlmIChhdHRyLndhcm4gIT09IHVuZGVmaW5lZClcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHZhbHVlIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZTogXCIgKyBhdHRyLndhcm4sIGxpbmUsIHN0YXJ0KTtcblx0XHRcdGVsc2UgaWYgKGF0dHIudG9rZW4ubGVuZ3RoID09PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KSAhPT0gJ1wiJylcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHZhbHVlIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZVwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdudW1iZXInKVxuXHRcdFx0XHRcdGF0dHIudG9rZW4gPSBwYXJzZUZsb2F0KGF0dHIudG9rZW4pO1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF1bbmFtZV0gPSBhdHRyLnRva2VuO1xuXHRcdFx0fVxuXHRcdFx0c3RhcnQgKz0gYXR0ci5sZW47XG5cdFx0fTtcblx0XHR2YXIgZ2V0TmV4dFRva2VuID0gZnVuY3Rpb24obmFtZSwgdHlwZSkge1xuXHRcdFx0dmFyIGF0dHIgPSB0b2tlbml6ZXIuZ2V0Vm9pY2VUb2tlbihsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRcdGlmIChhdHRyLndhcm4gIT09IHVuZGVmaW5lZClcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHZhbHVlIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZTogXCIgKyBhdHRyLndhcm4sIGxpbmUsIHN0YXJ0KTtcblx0XHRcdGVsc2UgaWYgKGF0dHIudG9rZW4ubGVuZ3RoID09PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KSAhPT0gJ1wiJylcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHZhbHVlIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZVwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdudW1iZXInKVxuXHRcdFx0XHRcdGF0dHIudG9rZW4gPSBwYXJzZUZsb2F0KGF0dHIudG9rZW4pO1xuXHRcdFx0XHRyZXR1cm4gYXR0ci50b2tlbjtcblx0XHRcdH1cblx0XHRcdHN0YXJ0ICs9IGF0dHIubGVuO1xuXHRcdH07XG5cdFx0dmFyIGFkZE5leHROb3RlVG9rZW5Ub1ZvaWNlSW5mbyA9IGZ1bmN0aW9uKGlkLCBuYW1lKSB7XG5cdFx0XHR2YXIgbm90ZVRvVHJhbnNwb3NpdGlvbiA9IHtcblx0XHRcdFx0XCJfQlwiOiAyLFxuXHRcdFx0XHRcIl9FXCI6IDksXG5cdFx0XHRcdFwiX2JcIjogLTEwLFxuXHRcdFx0XHRcIl9lXCI6IC0zXG5cdFx0XHR9O1xuXHRcdFx0dmFyIGF0dHIgPSB0b2tlbml6ZXIuZ2V0Vm9pY2VUb2tlbihsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRcdGlmIChhdHRyLndhcm4gIT09IHVuZGVmaW5lZClcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBvZiAoX0IsIF9FLCBfYiwgX2UpIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZTogXCIgKyBhdHRyLndhcm4sIGxpbmUsIHN0YXJ0KTtcblx0XHRcdGVsc2UgaWYgKGF0dHIudG9rZW4ubGVuZ3RoID09PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KSAhPT0gJ1wiJylcblx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBvZiAoX0IsIF9FLCBfYiwgX2UpIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZVwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dmFyIHQgPSBub3RlVG9UcmFuc3Bvc2l0aW9uW2F0dHIudG9rZW5dO1xuXHRcdFx0XHRpZiAoIXQpXG5cdFx0XHRcdFx0d2FybihcIkV4cGVjdGVkIG9uZSBvZiAoX0IsIF9FLCBfYiwgX2UpIGZvciBcIiArIG5hbWUgKyBcIiBpbiB2b2ljZVwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF1bbmFtZV0gPSB0O1xuXHRcdFx0fVxuXHRcdFx0c3RhcnQgKz0gYXR0ci5sZW47XG5cdFx0fTtcblxuXHRcdC8vVGhlbiB0aGUgZm9sbG93aW5nIGl0ZW1zIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXI6XG5cdFx0d2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG5cdFx0XHR2YXIgdG9rZW4gPSB0b2tlbml6ZXIuZ2V0Vm9pY2VUb2tlbihsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRcdHN0YXJ0ICs9IHRva2VuLmxlbjtcblxuXHRcdFx0aWYgKHRva2VuLndhcm4pIHtcblx0XHRcdFx0d2FybihcIkVycm9yIHBhcnNpbmcgdm9pY2U6IFwiICsgdG9rZW4ud2FybiwgbGluZSwgc3RhcnQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGF0dHIgPSBudWxsO1xuXHRcdFx0XHRzd2l0Y2ggKHRva2VuLnRva2VuKSB7XG5cdFx0XHRcdFx0Y2FzZSAnY2xlZic6XG5cdFx0XHRcdFx0Y2FzZSAnY2wnOlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9TdGFmZkluZm8oJ2NsZWYnKTtcblx0XHRcdFx0XHRcdC8vIFRPRE8tUEVSOiBjaGVjayBmb3IgYSBsZWdhbCBjbGVmOyBkbyBvY3Rhdml6aW5nXG5cdFx0XHRcdFx0XHR2YXIgb2N0ID0gMDtcblx0Ly9cdFx0XHRcdFx0XHRcdGZvciAodmFyIGlpID0gMDsgaWkgPCBzdGFmZkluZm8uY2xlZi5sZW5ndGg7IGlpKyspIHtcblx0Ly9cdFx0XHRcdFx0XHRcdFx0aWYgKHN0YWZmSW5mby5jbGVmW2lpXSA9PT0gJywnKSBvY3QgLT0gNztcblx0Ly9cdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoc3RhZmZJbmZvLmNsZWZbaWldID09PSBcIidcIikgb2N0ICs9IDc7XG5cdC8vXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoc3RhZmZJbmZvLmNsZWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0ICBzdGFmZkluZm8uY2xlZiA9IHN0YWZmSW5mby5jbGVmLnJlcGxhY2UoL1snLF0vZywgXCJcIik7IC8vJy8vY29tbWVudCBmb3IgZW1hY3MgZm9ybWF0dGluZyBvZiByZWdleHBcblx0XHRcdFx0XHRcdFx0aWYgKHN0YWZmSW5mby5jbGVmLmluZGV4T2YoJysxNicpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdG9jdCArPSAxNDtcblx0XHRcdFx0XHRcdFx0XHRzdGFmZkluZm8uY2xlZiA9IHN0YWZmSW5mby5jbGVmLnJlcGxhY2UoJysxNicsICcnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRzdGFmZkluZm8udmVydGljYWxQb3MgPSBjYWxjTWlkZGxlKHN0YWZmSW5mby5jbGVmLCBvY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHJlYmxlJzpcblx0XHRcdFx0XHRjYXNlICdiYXNzJzpcblx0XHRcdFx0XHRjYXNlICd0ZW5vcic6XG5cdFx0XHRcdFx0Y2FzZSAnYWx0byc6XG5cdFx0XHRcdFx0Y2FzZSAncGVyYyc6XG5cdFx0XHRcdFx0Y2FzZSAnbm9uZSc6XG5cdFx0XHRcdFx0Y2FzZSAndHJlYmxlXFwnJzpcblx0XHRcdFx0XHRjYXNlICdiYXNzXFwnJzpcblx0XHRcdFx0XHRjYXNlICd0ZW5vclxcJyc6XG5cdFx0XHRcdFx0Y2FzZSAnYWx0b1xcJyc6XG5cdFx0XHRcdFx0Y2FzZSAnbm9uZVxcJyc6XG5cdFx0XHRcdFx0Y2FzZSAndHJlYmxlXFwnXFwnJzpcblx0XHRcdFx0XHRjYXNlICdiYXNzXFwnXFwnJzpcblx0XHRcdFx0XHRjYXNlICd0ZW5vclxcJ1xcJyc6XG5cdFx0XHRcdFx0Y2FzZSAnYWx0b1xcJ1xcJyc6XG5cdFx0XHRcdFx0Y2FzZSAnbm9uZVxcJ1xcJyc6XG5cdFx0XHRcdFx0Y2FzZSAndHJlYmxlLCc6XG5cdFx0XHRcdFx0Y2FzZSAnYmFzcywnOlxuXHRcdFx0XHRcdGNhc2UgJ3Rlbm9yLCc6XG5cdFx0XHRcdFx0Y2FzZSAnYWx0bywnOlxuXHRcdFx0XHRcdGNhc2UgJ25vbmUsJzpcblx0XHRcdFx0XHRjYXNlICd0cmVibGUsLCc6XG5cdFx0XHRcdFx0Y2FzZSAnYmFzcywsJzpcblx0XHRcdFx0XHRjYXNlICd0ZW5vciwsJzpcblx0XHRcdFx0XHRjYXNlICdhbHRvLCwnOlxuXHRcdFx0XHRcdGNhc2UgJ25vbmUsLCc6XG5cdFx0XHRcdFx0XHQvLyBUT0RPLVBFUjogaGFuZGxlIHRoZSBvY3RhdmUgaW5kaWNhdG9ycyBvbiB0aGUgY2xlZiBieSBjaGFuZ2luZyB0aGUgbWlkZGxlIHByb3BlcnR5XG5cdFx0XHRcdFx0XHR2YXIgb2N0MiA9IDA7XG5cdC8vXHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpaWkgPSAwOyBpaWkgPCB0b2tlbi50b2tlbi5sZW5ndGg7IGlpaSsrKSB7XG5cdC8vXHRcdFx0XHRcdFx0XHRcdGlmICh0b2tlbi50b2tlbltpaWldID09PSAnLCcpIG9jdDIgLT0gNztcblx0Ly9cdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAodG9rZW4udG9rZW5baWlpXSA9PT0gXCInXCIpIG9jdDIgKz0gNztcblx0Ly9cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHN0YWZmSW5mby5jbGVmID0gdG9rZW4udG9rZW4ucmVwbGFjZSgvWycsXS9nLCBcIlwiKTsgLy8nLy9jb21tZW50IGZvciBlbWFjcyBmb3JtYXR0aW5nIG9mIHJlZ2V4cFxuXHRcdFx0XHRcdFx0c3RhZmZJbmZvLnZlcnRpY2FsUG9zID0gY2FsY01pZGRsZShzdGFmZkluZm8uY2xlZiwgb2N0Mik7XG5cdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0uY2xlZiA9IHRva2VuLnRva2VuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RhdmVzJzpcblx0XHRcdFx0XHRjYXNlICdzdGF2ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnc3R2Jzpcblx0XHRcdFx0XHRcdGFkZE5leHRUb2tlblRvU3RhZmZJbmZvKCdzdGF2ZXMnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JyYWNlJzpcblx0XHRcdFx0XHRjYXNlICdicmMnOlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9TdGFmZkluZm8oJ2JyYWNlJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdicmFja2V0Jzpcblx0XHRcdFx0XHRjYXNlICdicmsnOlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9TdGFmZkluZm8oJ2JyYWNrZXQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRcdGNhc2UgJ25tJzpcblx0XHRcdFx0XHRcdGFkZE5leHRUb2tlblRvU3RhZmZJbmZvKCduYW1lJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdWJuYW1lJzpcblx0XHRcdFx0XHRjYXNlICdzbmFtZSc6XG5cdFx0XHRcdFx0Y2FzZSAnc25tJzpcblx0XHRcdFx0XHRcdGFkZE5leHRUb2tlblRvU3RhZmZJbmZvKCdzdWJuYW1lJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtZXJnZSc6XG5cdFx0XHRcdFx0XHRzdGFmZkluZm8uc3RhcnRTdGFmZiA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RlbSc6XG5cdFx0XHRcdFx0Y2FzZSAnc3RlbXMnOlxuXHRcdFx0XHRcdFx0YXR0ciA9IHRva2VuaXplci5nZXRWb2ljZVRva2VuKGxpbmUsIHN0YXJ0LCBlbmQpO1xuXHRcdFx0XHRcdFx0aWYgKGF0dHIud2FybiAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgdmFsdWUgZm9yIHN0ZW1zIGluIHZvaWNlOiBcIiArIGF0dHIud2FybiwgbGluZSwgc3RhcnQpO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAoYXR0ci50b2tlbiA9PT0gJ3VwJyB8fCBhdHRyLnRva2VuID09PSAnZG93bicpXG5cdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMudm9pY2VzW2lkXS5zdGVtID0gYXR0ci50b2tlbjtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0d2FybihcIkV4cGVjdGVkIHVwIG9yIGRvd24gZm9yIHZvaWNlIHN0ZW1cIiwgbGluZSwgc3RhcnQpO1xuXHRcdFx0XHRcdFx0c3RhcnQgKz0gYXR0ci5sZW47XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd1cCc6XG5cdFx0XHRcdFx0Y2FzZSAnZG93bic6XG5cdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0uc3RlbSA9IHRva2VuLnRva2VuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWlkZGxlJzpcblx0XHRcdFx0XHRjYXNlICdtJzpcblx0XHRcdFx0XHRcdGFkZE5leHRUb2tlblRvU3RhZmZJbmZvKCd2ZXJ0aWNhbFBvcycpO1xuXHRcdFx0XHRcdFx0c3RhZmZJbmZvLnZlcnRpY2FsUG9zID0gcGFyc2VNaWRkbGUoc3RhZmZJbmZvLnZlcnRpY2FsUG9zKS5taWQ7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdnY2hvcmRzJzpcblx0XHRcdFx0XHRjYXNlICdnY2gnOlxuXHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy52b2ljZXNbaWRdLnN1cHByZXNzQ2hvcmRzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdC8vIGdjaG9yZHMgY2FuIHN0YW5kIG9uIGl0cyBvd24sIG9yIGl0IGNvdWxkIGJlIGdjaG9yZHM9MC5cblx0XHRcdFx0XHRcdGF0dHIgPSB0b2tlbml6ZXIuZ2V0Vm9pY2VUb2tlbihsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRcdFx0XHRcdGlmIChhdHRyLnRva2VuID09PSBcIjBcIilcblx0XHRcdFx0XHRcdFx0c3RhcnQgPSBzdGFydCArIGF0dHIubGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3BhY2UnOlxuXHRcdFx0XHRcdGNhc2UgJ3NwYyc6XG5cdFx0XHRcdFx0XHRhZGROZXh0VG9rZW5Ub1N0YWZmSW5mbygnc3BhY2luZycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2NhbGUnOlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9Wb2ljZUluZm8oaWQsICdzY2FsZScsICdudW1iZXInKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Njb3JlJzpcblx0XHRcdFx0XHRcdGFkZE5leHROb3RlVG9rZW5Ub1ZvaWNlSW5mbyhpZCwgJ3Njb3JlVHJhbnNwb3NlJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd0cmFuc3Bvc2UnOlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9Wb2ljZUluZm8oaWQsICd0cmFuc3Bvc2UnLCAnbnVtYmVyJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdGFmZmxpbmVzJzpcblx0XHRcdFx0XHRcdGFkZE5leHRUb2tlblRvVm9pY2VJbmZvKGlkLCAnc3RhZmZsaW5lcycsICdudW1iZXInKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3N0YWZmc2NhbGUnOlxuXHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IFRoaXMgaXMgcGFzc2VkIHRvIHRoZSBlbmdyYXZlciwgYnV0IHRoZSBlbmdyYXZlciBpZ25vcmVzIGl0LlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9Wb2ljZUluZm8oaWQsICdzdGFmZnNjYWxlJywgJ251bWJlcicpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnb2N0YXZlJzpcblx0XHRcdFx0XHRcdC8vIFRPRE8tUEVSOiBUaGlzIGlzIGFjY2VwdGVkLCBidXQgbm90IGltcGxlbWVudGVkLCB5ZXQuXG5cdFx0XHRcdFx0XHRhZGROZXh0VG9rZW5Ub1ZvaWNlSW5mbyhpZCwgJ29jdGF2ZScsICdudW1iZXInKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRcdFx0XHQvLyBUT0RPLVBFUjogVGhpcyBpcyBhY2NlcHRlZCwgYnV0IG5vdCBpbXBsZW1lbnRlZCwgeWV0LlxuXHRcdFx0XHRcdFx0YWRkTmV4dFRva2VuVG9Wb2ljZUluZm8oaWQsICd2b2x1bWUnLCAnbnVtYmVyJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjdWUnOlxuXHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IFRoaXMgaXMgYWNjZXB0ZWQsIGJ1dCBub3QgaW1wbGVtZW50ZWQsIHlldC5cblx0XHRcdFx0XHRcdHZhciBjdWUgPSBnZXROZXh0VG9rZW4oJ2N1ZScsICdzdHJpbmcnKTtcblx0XHRcdFx0XHRcdGlmIChjdWUgPT09ICdvbicpXG5cdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMudm9pY2VzW2lkXS5zY2FsZSA9IDAuNjtcblx0XHRcdFx0XHRcdGVsc2UgbXVsdGlsaW5lVmFycy52b2ljZXNbaWRdLnNjYWxlID0gMTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJzdHlsZVwiOlxuXHRcdFx0XHRcdFx0YXR0ciA9IHRva2VuaXplci5nZXRWb2ljZVRva2VuKGxpbmUsIHN0YXJ0LCBlbmQpO1xuXHRcdFx0XHRcdFx0aWYgKGF0dHIud2FybiAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgdmFsdWUgZm9yIHN0eWxlIGluIHZvaWNlOiBcIiArIGF0dHIud2FybiwgbGluZSwgc3RhcnQpO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAoYXR0ci50b2tlbiA9PT0gJ25vcm1hbCcgfHwgYXR0ci50b2tlbiA9PT0gJ2hhcm1vbmljJyB8fCBhdHRyLnRva2VuID09PSAncmh5dGhtJyB8fCBhdHRyLnRva2VuID09PSAneCcpXG5cdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMudm9pY2VzW2lkXS5zdHlsZSA9IGF0dHIudG9rZW47XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHdhcm4oXCJFeHBlY3RlZCBvbmUgb2YgW25vcm1hbCwgaGFybW9uaWMsIHJoeXRobSwgeF0gZm9yIHZvaWNlIHN0eWxlXCIsIGxpbmUsIHN0YXJ0KTtcblx0XHRcdFx0XHRcdHN0YXJ0ICs9IGF0dHIubGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Ly8gZGVmYXVsdDpcblx0XHRcdFx0XHQvLyBVc2UgdGhpcyB0byBmaW5kIFY6IHVzYWdlcyB0aGF0IGFyZW4ndCBoYW5kbGVkLlxuXHRcdFx0XHRcdC8vIFx0Y29uc29sZS5sb2coXCJwYXJzZSB2b2ljZVwiLCB0b2tlbiwgdHVuZS5tZXRhVGV4dC50aXRsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHN0YXJ0ICs9IHRva2VuaXplci5lYXRXaGl0ZVNwYWNlKGxpbmUsIHN0YXJ0KTtcblx0XHR9XG5cblx0XHQvLyBub3cgd2UndmUgZmlsbGVkIHVwIHN0YWZmSW5mbywgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcyB2b2ljZVxuXHRcdC8vIFRPRE8tUEVSOiBJdCBpcyB1bmNsZWFyIGZyb20gdGhlIHN0YW5kYXJkIGFuZCB0aGUgZXhhbXBsZXMgd2hhdCB0byBkbyB3aXRoIGJyYWNlLCBicmFja2V0LCBhbmQgc3RhdmVzLCBzbyB0aGV5IGFyZSBpZ25vcmVkIGZvciBub3cuXG5cdFx0aWYgKHN0YWZmSW5mby5zdGFydFN0YWZmIHx8IG11bHRpbGluZVZhcnMuc3RhdmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0bXVsdGlsaW5lVmFycy5zdGF2ZXMucHVzaCh7aW5kZXg6IG11bHRpbGluZVZhcnMuc3RhdmVzLmxlbmd0aCwgbWV0ZXI6IG11bHRpbGluZVZhcnMub3JpZ01ldGVyfSk7XG5cdFx0XHRpZiAoIW11bHRpbGluZVZhcnMuc2NvcmVfaXNfcHJlc2VudClcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5zdGF2ZXNbbXVsdGlsaW5lVmFycy5zdGF2ZXMubGVuZ3RoLTFdLm51bVZvaWNlcyA9IDA7XG5cdFx0fVxuXHRcdGlmIChtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0uc3RhZmZOdW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gc3RvcmUgd2hlcmUgdG8gd3JpdGUgdGhpcyBmb3IgcXVpY2sgYWNjZXNzIGxhdGVyLlxuXHRcdFx0bXVsdGlsaW5lVmFycy52b2ljZXNbaWRdLnN0YWZmTnVtID0gbXVsdGlsaW5lVmFycy5zdGF2ZXMubGVuZ3RoLTE7XG5cdFx0XHR2YXIgdmkgPSAwO1xuXHRcdFx0Zm9yKHZhciB2IGluIG11bHRpbGluZVZhcnMudm9pY2VzKSB7XG5cdFx0XHRcdGlmKG11bHRpbGluZVZhcnMudm9pY2VzLmhhc093blByb3BlcnR5KHYpKSB7XG5cdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMudm9pY2VzW3ZdLnN0YWZmTnVtID09PSBtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0uc3RhZmZOdW0pXG5cdFx0XHRcdFx0XHR2aSsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtdWx0aWxpbmVWYXJzLnZvaWNlc1tpZF0uaW5kZXggPSB2aS0xO1xuXHRcdH1cblx0XHR2YXIgcyA9IG11bHRpbGluZVZhcnMuc3RhdmVzW211bHRpbGluZVZhcnMudm9pY2VzW2lkXS5zdGFmZk51bV07XG5cdFx0aWYgKCFtdWx0aWxpbmVWYXJzLnNjb3JlX2lzX3ByZXNlbnQpXG5cdFx0XHRzLm51bVZvaWNlcysrO1xuXHRcdGlmIChzdGFmZkluZm8uY2xlZikgcy5jbGVmID0ge3R5cGU6IHN0YWZmSW5mby5jbGVmLCB2ZXJ0aWNhbFBvczogc3RhZmZJbmZvLnZlcnRpY2FsUG9zfTtcblx0XHRpZiAoc3RhZmZJbmZvLnNwYWNpbmcpIHMuc3BhY2luZ19iZWxvd19vZmZzZXQgPSBzdGFmZkluZm8uc3BhY2luZztcblx0XHRpZiAoc3RhZmZJbmZvLnZlcnRpY2FsUG9zKSBzLnZlcnRpY2FsUG9zID0gc3RhZmZJbmZvLnZlcnRpY2FsUG9zO1xuXG5cdFx0aWYgKHN0YWZmSW5mby5uYW1lKSB7aWYgKHMubmFtZSkgcy5uYW1lLnB1c2goc3RhZmZJbmZvLm5hbWUpOyBlbHNlIHMubmFtZSA9IFsgc3RhZmZJbmZvLm5hbWUgXTt9XG5cdFx0aWYgKHN0YWZmSW5mby5zdWJuYW1lKSB7aWYgKHMuc3VibmFtZSkgcy5zdWJuYW1lLnB1c2goc3RhZmZJbmZvLnN1Ym5hbWUpOyBlbHNlIHMuc3VibmFtZSA9IFsgc3RhZmZJbmZvLnN1Ym5hbWUgXTt9XG5cblx0XHRzZXRDdXJyZW50Vm9pY2UoaWQpO1xuXHR9O1xuXG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlS2V5Vm9pY2U7XG4iLCIvLyAgICBhYmNfcGFyc2VfaGVhZGVyLmpzOiBwYXJzZXMgYSB0aGUgaGVhZGVyIGZpZWxkcyBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGluZyBBQkMgTXVzaWMgTm90YXRpb24gaW50byBhIHVzYWJsZSBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBQYXVsIFJvc2VuIChwYXVsIGF0IHBhdWxyb3NlbiBkb3QgbmV0KVxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vKmdsb2JhbCB3aW5kb3cgKi9cblxudmFyIHBhcnNlQ29tbW9uID0gcmVxdWlyZSgnLi9hYmNfY29tbW9uJyk7XG52YXIgcGFyc2VEaXJlY3RpdmUgPSByZXF1aXJlKCcuL2FiY19wYXJzZV9kaXJlY3RpdmUnKTtcbnZhciBwYXJzZUtleVZvaWNlID0gcmVxdWlyZSgnLi9hYmNfcGFyc2Vfa2V5X3ZvaWNlJyk7XG5cbnZhciBQYXJzZUhlYWRlciA9IGZ1bmN0aW9uKHRva2VuaXplciwgd2FybiwgbXVsdGlsaW5lVmFycywgdHVuZSkge1xuXHR0aGlzLnJlc2V0ID0gZnVuY3Rpb24odG9rZW5pemVyLCB3YXJuLCBtdWx0aWxpbmVWYXJzLCB0dW5lKSB7XG5cdFx0cGFyc2VLZXlWb2ljZS5pbml0aWFsaXplKHRva2VuaXplciwgd2FybiwgbXVsdGlsaW5lVmFycywgdHVuZSk7XG5cdFx0cGFyc2VEaXJlY3RpdmUuaW5pdGlhbGl6ZSh0b2tlbml6ZXIsIHdhcm4sIG11bHRpbGluZVZhcnMsIHR1bmUpO1xuXHR9O1xuXHR0aGlzLnJlc2V0KHRva2VuaXplciwgd2FybiwgbXVsdGlsaW5lVmFycywgdHVuZSk7XG5cblx0dGhpcy5zZXRUaXRsZSA9IGZ1bmN0aW9uKHRpdGxlKSB7XG5cdFx0aWYgKG11bHRpbGluZVZhcnMuaGFzTWFpblRpdGxlKVxuXHRcdFx0dHVuZS5hZGRTdWJ0aXRsZSh0b2tlbml6ZXIudHJhbnNsYXRlU3RyaW5nKHRva2VuaXplci5zdHJpcENvbW1lbnQodGl0bGUpKSk7XHQvLyBkaXNwbGF5IHNlY29uZGFyeSB0aXRsZVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR2YXIgdGl0bGVTdHIgPSB0b2tlbml6ZXIudHJhbnNsYXRlU3RyaW5nKHRva2VuaXplci50aGVSZXZlcnNlcih0b2tlbml6ZXIuc3RyaXBDb21tZW50KHRpdGxlKSkpO1xuXHRcdFx0aWYgKG11bHRpbGluZVZhcnMudGl0bGVjYXBzKVxuXHRcdFx0XHR0aXRsZVN0ciA9IHRpdGxlU3RyLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHR0dW5lLmFkZE1ldGFUZXh0KFwidGl0bGVcIiwgdGl0bGVTdHIpO1xuXHRcdFx0bXVsdGlsaW5lVmFycy5oYXNNYWluVGl0bGUgPSB0cnVlO1xuXHRcdH1cblx0fTtcblxuXHR0aGlzLnNldE1ldGVyID0gZnVuY3Rpb24obGluZSkge1xuXHRcdGxpbmUgPSB0b2tlbml6ZXIuc3RyaXBDb21tZW50KGxpbmUpO1xuXHRcdGlmIChsaW5lID09PSAnQycpIHtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID09PSB0cnVlKSB7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSAwLjEyNTtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt0eXBlOiAnY29tbW9uX3RpbWUnfTtcblx0XHR9IGVsc2UgaWYgKGxpbmUgPT09ICdDfCcpIHtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID09PSB0cnVlKSB7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSAwLjEyNTtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt0eXBlOiAnY3V0X3RpbWUnfTtcblx0XHR9IGVsc2UgaWYgKGxpbmUgPT09ICdvJykge1xuXHRcdFx0aWYgKG11bHRpbGluZVZhcnMuaGF2ZW50X3NldF9sZW5ndGggPT09IHRydWUpIHtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5kZWZhdWx0X2xlbmd0aCA9IDAuMTI1O1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge3R5cGU6ICd0ZW1wdXNfcGVyZmVjdHVtJ307XG5cdFx0fSBlbHNlIGlmIChsaW5lID09PSAnYycpIHtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID09PSB0cnVlKSB7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSAwLjEyNTtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt0eXBlOiAndGVtcHVzX2ltcGVyZmVjdHVtJ307XG5cdFx0fSBlbHNlIGlmIChsaW5lID09PSAnby4nKSB7XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmRlZmF1bHRfbGVuZ3RoID0gMC4xMjU7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuaGF2ZW50X3NldF9sZW5ndGggPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7dHlwZTogJ3RlbXB1c19wZXJmZWN0dW1fcHJvbGF0aW8nfTtcblx0XHR9IGVsc2UgaWYgKGxpbmUgPT09ICdjLicpIHtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID09PSB0cnVlKSB7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSAwLjEyNTtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt0eXBlOiAndGVtcHVzX2ltcGVyZmVjdHVtX3Byb2xhdGlvJ307XG5cdFx0fSBlbHNlIGlmIChsaW5lLmxlbmd0aCA9PT0gMCB8fCBsaW5lLnRvTG93ZXJDYXNlKCkgPT09ICdub25lJykge1xuXHRcdFx0aWYgKG11bHRpbGluZVZhcnMuaGF2ZW50X3NldF9sZW5ndGggPT09IHRydWUpIHtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5kZWZhdWx0X2xlbmd0aCA9IDAuMTI1O1xuXHRcdFx0XHRtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHZhciB0b2tlbnMgPSB0b2tlbml6ZXIudG9rZW5pemUobGluZSwgMCwgbGluZS5sZW5ndGgpO1xuXHRcdFx0Ly8gdGhlIGZvcm0gaXMgW29wZW5fcGFyZW5dIGRlY2ltYWwgWyBwbHVzfGRvdCBkZWNpbWFsIF0uLi4gW2Nsb3NlX3BhcmVuXSBzbGFzaCBkZWNpbWFsIFtwbHVzIHNhbWVfYXNfYmVmb3JlXVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dmFyIHBhcnNlTnVtID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gaGFuZGxlcyB0aGlzIG11Y2g6IFtvcGVuX3BhcmVuXSBkZWNpbWFsIFsgcGx1c3xkb3QgZGVjaW1hbCBdLi4uIFtjbG9zZV9wYXJlbl1cblx0XHRcdFx0XHR2YXIgcmV0ID0ge3ZhbHVlOiAwLCBudW06IFwiXCJ9O1xuXG5cdFx0XHRcdFx0dmFyIHRvayA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2sudG9rZW4gPT09ICcoJylcblx0XHRcdFx0XHRcdHRvayA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdHdoaWxlICgxKSB7XG5cdFx0XHRcdFx0XHRpZiAodG9rLnR5cGUgIT09ICdudW1iZXInKSB0aHJvdyBcIkV4cGVjdGVkIHRvcCBudW1iZXIgb2YgbWV0ZXJcIjtcblx0XHRcdFx0XHRcdHJldC52YWx1ZSArPSBwYXJzZUludCh0b2sudG9rZW4pO1xuXHRcdFx0XHRcdFx0cmV0Lm51bSArPSB0b2sudG9rZW47XG5cdFx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCB8fCB0b2tlbnNbMF0udG9rZW4gPT09ICcvJykgcmV0dXJuIHJldDtcblx0XHRcdFx0XHRcdHRvayA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0aWYgKHRvay50b2tlbiA9PT0gJyknKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IHRva2Vuc1swXS50b2tlbiA9PT0gJy8nKSByZXR1cm4gcmV0O1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcIlVuZXhwZWN0ZWQgcGFyZW4gaW4gbWV0ZXJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0b2sudG9rZW4gIT09ICcuJyAmJiB0b2sudG9rZW4gIT09ICcrJykgdGhyb3cgXCJFeHBlY3RlZCB0b3AgbnVtYmVyIG9mIG1ldGVyXCI7XG5cdFx0XHRcdFx0XHRyZXQubnVtICs9IHRvay50b2tlbjtcblx0XHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB0aHJvdyBcIkV4cGVjdGVkIHRvcCBudW1iZXIgb2YgbWV0ZXJcIjtcblx0XHRcdFx0XHRcdHRvayA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gcmV0O1x0Ly8ganVzdCB0byBzdXBwcmVzcyB3YXJuaW5nXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIHBhcnNlRnJhY3Rpb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQvLyBoYW5kbGVzIHRoaXMgbXVjaDogcGFyc2VOdW0gc2xhc2ggZGVjaW1hbFxuXHRcdFx0XHRcdHZhciByZXQgPSBwYXJzZU51bSgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gcmV0O1xuXHRcdFx0XHRcdHZhciB0b2sgPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rLnRva2VuICE9PSAnLycpIHRocm93IFwiRXhwZWN0ZWQgc2xhc2ggaW4gbWV0ZXJcIjtcblx0XHRcdFx0XHR0b2sgPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rLnR5cGUgIT09ICdudW1iZXInKSB0aHJvdyBcIkV4cGVjdGVkIGJvdHRvbSBudW1iZXIgb2YgbWV0ZXJcIjtcblx0XHRcdFx0XHRyZXQuZGVuID0gdG9rLnRva2VuO1xuXHRcdFx0XHRcdHJldC52YWx1ZSA9IHJldC52YWx1ZSAvIHBhcnNlSW50KHJldC5kZW4pO1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHRocm93IFwiRXhwZWN0ZWQgbWV0ZXIgZGVmaW5pdGlvbiBpbiBNOiBsaW5lXCI7XG5cdFx0XHRcdHZhciBtZXRlciA9IHt0eXBlOiAnc3BlY2lmaWVkJywgdmFsdWU6IFsgXX07XG5cdFx0XHRcdHZhciB0b3RhbExlbmd0aCA9IDA7XG5cdFx0XHRcdHdoaWxlICgxKSB7XG5cdFx0XHRcdFx0dmFyIHJldCA9IHBhcnNlRnJhY3Rpb24oKTtcblx0XHRcdFx0XHR0b3RhbExlbmd0aCArPSByZXQudmFsdWU7XG5cdFx0XHRcdFx0dmFyIG12ID0geyBudW06IHJldC5udW0gfTtcblx0XHRcdFx0XHRpZiAocmV0LmRlbiAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0bXYuZGVuID0gcmV0LmRlbjtcblx0XHRcdFx0XHRtZXRlci52YWx1ZS5wdXNoKG12KTtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG5cdFx0XHRcdFx0Ly92YXIgdG9rID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0Ly9pZiAodG9rLnRva2VuICE9PSAnKycpIHRocm93IFwiRXh0cmEgY2hhcmFjdGVycyBpbiBNOiBsaW5lXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSB0b3RhbExlbmd0aCA8IDAuNzUgPyAwLjA2MjUgOiAwLjEyNTtcblx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1ldGVyO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR3YXJuKGUsIGxpbmUsIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHR0aGlzLmNhbGNUZW1wbyA9IGZ1bmN0aW9uKHJlbFRlbXBvKSB7XG5cdFx0dmFyIGR1ciA9IDEvNDtcblx0XHRpZiAobXVsdGlsaW5lVmFycy5tZXRlciAmJiBtdWx0aWxpbmVWYXJzLm1ldGVyLnR5cGUgPT09ICdzcGVjaWZpZWQnKSB7XG5cdFx0XHRkdXIgPSAxIC8gcGFyc2VJbnQobXVsdGlsaW5lVmFycy5tZXRlci52YWx1ZVswXS5kZW4pO1xuXHRcdH0gZWxzZSBpZiAobXVsdGlsaW5lVmFycy5vcmlnTWV0ZXIgJiYgbXVsdGlsaW5lVmFycy5vcmlnTWV0ZXIudHlwZSA9PT0gJ3NwZWNpZmllZCcpIHtcblx0XHRcdGR1ciA9IDEgLyBwYXJzZUludChtdWx0aWxpbmVWYXJzLm9yaWdNZXRlci52YWx1ZVswXS5kZW4pO1xuXHRcdH1cblx0XHQvL3ZhciBkdXIgPSBtdWx0aWxpbmVWYXJzLmRlZmF1bHRfbGVuZ3RoID8gbXVsdGlsaW5lVmFycy5kZWZhdWx0X2xlbmd0aCA6IDE7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZWxUZW1wby5kdXJhdGlvbjsgaSsrKVxuXHRcdFx0cmVsVGVtcG8uZHVyYXRpb25baV0gPSBkdXIgKiByZWxUZW1wby5kdXJhdGlvbltpXTtcblx0XHRyZXR1cm4gcmVsVGVtcG87XG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVGVtcG8gPSBmdW5jdGlvbigpIHtcblx0XHRpZiAobXVsdGlsaW5lVmFycy50ZW1wbykge1x0Ly8gSWYgdGhlcmUncyBhIHRlbXBvIHdhaXRpbmcgdG8gYmUgcmVzb2x2ZWRcblx0XHRcdHRoaXMuY2FsY1RlbXBvKG11bHRpbGluZVZhcnMudGVtcG8pO1xuXHRcdFx0dHVuZS5tZXRhVGV4dC50ZW1wbyA9IG11bHRpbGluZVZhcnMudGVtcG87XG5cdFx0XHRkZWxldGUgbXVsdGlsaW5lVmFycy50ZW1wbztcblx0XHR9XG5cdH07XG5cblx0dGhpcy5hZGRVc2VyRGVmaW5pdGlvbiA9IGZ1bmN0aW9uKGxpbmUsIHN0YXJ0LCBlbmQpIHtcblx0XHR2YXIgZXF1YWxzID0gbGluZS5pbmRleE9mKCc9Jywgc3RhcnQpO1xuXHRcdGlmIChlcXVhbHMgPT09IC0xKSB7XG5cdFx0XHR3YXJuKFwiTmVlZCBhbiA9IGluIGEgbWFjcm8gZGVmaW5pdGlvblwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGJlZm9yZSA9IHBhcnNlQ29tbW9uLnN0cmlwKGxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBlcXVhbHMpKTtcblx0XHR2YXIgYWZ0ZXIgPSBwYXJzZUNvbW1vbi5zdHJpcChsaW5lLnN1YnN0cmluZyhlcXVhbHMrMSkpO1xuXG5cdFx0aWYgKGJlZm9yZS5sZW5ndGggIT09IDEpIHtcblx0XHRcdHdhcm4oXCJNYWNybyBkZWZpbml0aW9ucyBjYW4gb25seSBiZSBvbmUgY2hhcmFjdGVyXCIsIGxpbmUsIHN0YXJ0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGxlZ2FsQ2hhcnMgPSBcIkhJSktMTU5PUFFSU1RVVldYWWhpamtsbW5vcHFyc3R1dnd+XCI7XG5cdFx0aWYgKGxlZ2FsQ2hhcnMuaW5kZXhPZihiZWZvcmUpID09PSAtMSkge1xuXHRcdFx0d2FybihcIk1hY3JvIGRlZmluaXRpb25zIG11c3QgYmUgSC1ZLCBoLXcsIG9yIHRpbGRlXCIsIGxpbmUsIHN0YXJ0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGFmdGVyLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0d2FybihcIk1pc3NpbmcgbWFjcm8gZGVmaW5pdGlvblwiLCBsaW5lLCBzdGFydCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChtdWx0aWxpbmVWYXJzLm1hY3JvcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0bXVsdGlsaW5lVmFycy5tYWNyb3MgPSB7fTtcblx0XHRtdWx0aWxpbmVWYXJzLm1hY3Jvc1tiZWZvcmVdID0gYWZ0ZXI7XG5cdH07XG5cblx0dGhpcy5zZXREZWZhdWx0TGVuZ3RoID0gZnVuY3Rpb24obGluZSwgc3RhcnQsIGVuZCkge1xuXHRcdHZhciBsZW4gPSBwYXJzZUNvbW1vbi5nc3ViKGxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBcIiBcIiwgXCJcIik7XG5cdFx0dmFyIGxlbl9hcnIgPSBsZW4uc3BsaXQoJy8nKTtcblx0XHRpZiAobGVuX2Fyci5sZW5ndGggPT09IDIpIHtcblx0XHRcdHZhciBuID0gcGFyc2VJbnQobGVuX2FyclswXSk7XG5cdFx0XHR2YXIgZCA9IHBhcnNlSW50KGxlbl9hcnJbMV0pO1xuXHRcdFx0aWYgKGQgPiAwKSB7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggPSBuIC8gZDtcdC8vIGEgd2hvbGUgbm90ZSBpcyAxXG5cdFx0XHRcdG11bHRpbGluZVZhcnMuaGF2ZW50X3NldF9sZW5ndGggPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGxlbl9hcnIubGVuZ3RoID09PSAxICYmIGxlbl9hcnJbMF0gPT09ICcxJykge1xuXHRcdFx0bXVsdGlsaW5lVmFycy5kZWZhdWx0X2xlbmd0aCA9IDE7XG5cdFx0XHRtdWx0aWxpbmVWYXJzLmhhdmVudF9zZXRfbGVuZ3RoID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cblx0dmFyIHRlbXBvU3RyaW5nID0ge1xuXG5cdFx0bGFyZ2hpc3NpbW86IDIwLFxuXHRcdGFkYWdpc3NpbW86IDI0LFxuXHRcdHNvc3RlbnV0bzogMjgsXG5cdFx0Z3JhdmU6IDMyLFxuXHRcdGxhcmdvOiA0MCxcblx0XHRsZW50bzogNTAsXG5cdFx0bGFyZ2hldHRvOiA2MCxcblx0XHRhZGFnaW86IDY4LFxuXHRcdGFkYWdpZXR0bzogNzQsXG5cdFx0YW5kYW50ZTogODAsXG5cdFx0YW5kYW50aW5vOiA4OCxcblx0XHRcIm1hcmNpYSBtb2RlcmF0b1wiOiA4NCxcblx0XHRcImFuZGFudGUgbW9kZXJhdG9cIjogMTAwLFxuXHRcdG1vZGVyYXRvOiAxMTIsXG5cdFx0YWxsZWdyZXR0bzogMTE2LFxuXHRcdFwiYWxsZWdybyBtb2RlcmF0b1wiOiAxMjAsXG5cdFx0YWxsZWdybzogMTI2LFxuXHRcdGFuaW1hdG86IDEzMixcblx0XHRhZ2l0YXRvOiAxNDAsXG5cdFx0dmVsb2NlOiAxNDgsXG5cdFx0XCJtb3NzbyB2aXZvXCI6IDE1Nixcblx0XHR2aXZhY2U6IDE2NCxcblx0XHR2aXZhY2lzc2ltbzogMTcyLFxuXHRcdGFsbGVncmlzc2ltbzogMTc2LFxuXHRcdHByZXN0bzogMTg0LFxuXHRcdHByZXN0aXNzaW1vOiAyMTAsXG5cdH07XG5cblx0dGhpcy5zZXRUZW1wbyA9IGZ1bmN0aW9uKGxpbmUsIHN0YXJ0LCBlbmQpIHtcblx0XHQvL1EgLSB0ZW1wbzsgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbm90ZXMgcGVyIG1pbnV0ZSwgZS5nLiBJZlxuXHRcdC8vdGhlIG1ldGVyIGRlbm9taW5hdG9yIGlzIGEgNCBub3RlIHRoZW4gUToxMjAgb3IgUTpDPTEyMFxuXHRcdC8vaXMgMTIwIHF1YXJ0ZXIgbm90ZXMgcGVyIG1pbnV0ZS4gU2ltaWxhcmx5ICBROkMzPTQwIHdvdWxkIGJlIDQwXG5cdFx0Ly9kb3R0ZWQgaGFsZiBub3RlcyBwZXIgbWludXRlLiBBbiBhYnNvbHV0ZSB0ZW1wbyBtYXkgYWxzbyBiZVxuXHRcdC8vc2V0LCBlLmcuIFE6MS84PTEyMCBpcyAxMjAgZWlnaHRoIG5vdGVzIHBlciBtaW51dGUsXG5cdFx0Ly9pcnJlc3BlY3RpdmUgb2YgdGhlIG1ldGVyJ3MgZGVub21pbmF0b3IuXG5cdFx0Ly9cblx0XHQvLyBUaGlzIGlzIGVpdGhlciBhIG51bWJlciwgXCJDPW51bWJlclwiLCBcIkNudW1iZXI9bnVtYmVyXCIsIG9yIGZyYWN0aW9uIFtmcmFjdGlvbi4uLl09bnVtYmVyXG5cdFx0Ly8gSXQgZGVwZW5kcyBvbiB0aGUgTTogZmllbGQsIHdoaWNoIG1heSBlaXRoZXIgbm90IGJlIHByZXNlbnQsIG9yIG1heSBhcHBlYXIgYWZ0ZXIgdGhpcy5cblx0XHQvLyBJZiBNOiBpcyBub3QgcHJlc2VudCwgYW4gZWlnaHRoIG5vdGUgaXMgdXNlZC5cblx0XHQvLyBUaGF0IG1lYW5zIHRoYXQgdGhpcyBmaWVsZCBjYW4ndCBiZSBjYWxjdWxhdGVkIHVudGlsIHRoZSBlbmQsIGlmIGl0IGlzIHRoZSBmaXJzdCB0aHJlZSB0eXBlcywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB3ZSdsbCBzZWUgYW4gTTogZmllbGQuXG5cdFx0Ly8gU28sIGlmIGl0IGlzIHRoZSBmb3VydGggdHlwZSwgc2V0IGl0IGhlcmUsIG90aGVyd2lzZSwgc2F2ZSB0aGUgaW5mbyBpbiB0aGUgbXVsdGlsaW5lVmFycy5cblx0XHQvLyBUaGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB3ZSBrZWVwIGFyZSB0aGUgZHVyYXRpb24gYW5kIHRoZSBicG0uIEluIHRoZSBmaXJzdCB0d28gZm9ybXMsIHRoZSBkdXJhdGlvbiBpcyAxLlxuXHRcdC8vIEluIGFkZGl0aW9uLCBhIHF1b3RlZCBzdHJpbmcgbWF5IGJvdGggcHJlY2VkZSBhbmQgZm9sbG93LiBJZiBhIHF1b3RlZCBzdHJpbmcgaXMgcHJlc2VudCwgdGhlbiB0aGUgZHVyYXRpb24gcGFydCBpcyBvcHRpb25hbC5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHRva2VucyA9IHRva2VuaXplci50b2tlbml6ZShsaW5lLCBzdGFydCwgZW5kKTtcblxuXHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHRocm93IFwiTWlzc2luZyBwYXJhbWV0ZXIgaW4gUTogZmllbGRcIjtcblxuXHRcdFx0dmFyIHRlbXBvID0ge307XG5cdFx0XHR2YXIgZGVsYXlTZXQgPSB0cnVlO1xuXHRcdFx0dmFyIHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3F1b3RlJykge1xuXHRcdFx0XHR0ZW1wby5wcmVTdHJpbmcgPSB0b2tlbi50b2tlbjtcblx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcdC8vIEl0J3Mgb2sgdG8ganVzdCBnZXQgYSBzdHJpbmcgZm9yIHRoZSB0ZW1wb1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdHJpbmcgaXMgYSB3ZWxsLWtub3duIHRlbXBvLCBwdXQgaW4gdGhlIGJwbVxuXHRcdFx0XHRcdGlmICh0ZW1wb1N0cmluZ1t0ZW1wby5wcmVTdHJpbmcudG9Mb3dlckNhc2UoKV0pIHtcblx0XHRcdFx0XHRcdHRlbXBvLmJwbSA9IHRlbXBvU3RyaW5nW3RlbXBvLnByZVN0cmluZy50b0xvd2VyQ2FzZSgpXTtcblx0XHRcdFx0XHRcdHRlbXBvLnN1cHByZXNzQnBtID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHt0eXBlOiAnaW1tZWRpYXRlJywgdGVtcG86IHRlbXBvfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRva2VuLnR5cGUgPT09ICdhbHBoYScgJiYgdG9rZW4udG9rZW4gPT09ICdDJylcdCB7IC8vIGVpdGhlciB0eXBlIDIgb3IgdHlwZSAzXG5cdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB0aHJvdyBcIk1pc3NpbmcgdGVtcG8gYWZ0ZXIgQyBpbiBROiBmaWVsZFwiO1xuXHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3B1bmN0JyAmJiB0b2tlbi50b2tlbiA9PT0gJz0nKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHR5cGUgMiBmb3JtYXQuIFRoZSBkdXJhdGlvbiBpcyBhbiBpbXBsaWVkIDFcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgdGhyb3cgXCJNaXNzaW5nIHRlbXBvIGFmdGVyID0gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAnbnVtYmVyJykgdGhyb3cgXCJFeHBlY3RlZCBudW1iZXIgYWZ0ZXIgPSBpbiBROiBmaWVsZFwiO1xuXHRcdFx0XHRcdHRlbXBvLmR1cmF0aW9uID0gWzFdO1xuXHRcdFx0XHRcdHRlbXBvLmJwbSA9IHBhcnNlSW50KHRva2VuLnRva2VuKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSB0eXBlIDMgZm9ybWF0LlxuXHRcdFx0XHRcdHRlbXBvLmR1cmF0aW9uID0gW3BhcnNlSW50KHRva2VuLnRva2VuKV07XG5cdFx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHRocm93IFwiTWlzc2luZyA9IGFmdGVyIGR1cmF0aW9uIGluIFE6IGZpZWxkXCI7XG5cdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW4udHlwZSAhPT0gJ3B1bmN0JyB8fCB0b2tlbi50b2tlbiAhPT0gJz0nKSB0aHJvdyBcIkV4cGVjdGVkID0gYWZ0ZXIgZHVyYXRpb24gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgdGhyb3cgXCJNaXNzaW5nIHRlbXBvIGFmdGVyID0gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAnbnVtYmVyJykgdGhyb3cgXCJFeHBlY3RlZCBudW1iZXIgYWZ0ZXIgPSBpbiBROiBmaWVsZFwiO1xuXHRcdFx0XHRcdHRlbXBvLmJwbSA9IHBhcnNlSW50KHRva2VuLnRva2VuKTtcblx0XHRcdFx0fSBlbHNlIHRocm93IFwiRXhwZWN0ZWQgbnVtYmVyIG9yIGVxdWFsIGFmdGVyIEMgaW4gUTogZmllbGRcIjtcblxuXHRcdFx0fSBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnbnVtYmVyJykge1x0Ly8gZWl0aGVyIHR5cGUgMSBvciB0eXBlIDRcblx0XHRcdFx0dmFyIG51bSA9IHBhcnNlSW50KHRva2VuLnRva2VuKTtcblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDAgfHwgdG9rZW5zWzBdLnR5cGUgPT09ICdxdW90ZScpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHR5cGUgMVxuXHRcdFx0XHRcdHRlbXBvLmR1cmF0aW9uID0gWzFdO1xuXHRcdFx0XHRcdHRlbXBvLmJwbSA9IG51bTtcblx0XHRcdFx0fSBlbHNlIHtcdC8vIFRoaXMgaXMgdHlwZSA0XG5cdFx0XHRcdFx0ZGVsYXlTZXQgPSBmYWxzZTtcblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAncHVuY3QnICYmIHRva2VuLnRva2VuICE9PSAnLycpIHRocm93IFwiRXhwZWN0ZWQgZnJhY3Rpb24gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHR0b2tlbiA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAnbnVtYmVyJykgdGhyb3cgXCJFeHBlY3RlZCBmcmFjdGlvbiBpbiBROiBmaWVsZFwiO1xuXHRcdFx0XHRcdHZhciBkZW4gPSBwYXJzZUludCh0b2tlbi50b2tlbik7XG5cdFx0XHRcdFx0dGVtcG8uZHVyYXRpb24gPSBbbnVtL2Rlbl07XG5cdFx0XHRcdFx0Ly8gV2UgZ290IHRoZSBmaXJzdCBmcmFjdGlvbiwga2VlcCBnZXR0aW5nIG1vcmUgYXMgbG9uZyBhcyB3ZSBmaW5kIHRoZW0uXG5cdFx0XHRcdFx0d2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICAmJiB0b2tlbnNbMF0udG9rZW4gIT09ICc9JyAmJiB0b2tlbnNbMF0udHlwZSAhPT0gJ3F1b3RlJykge1xuXHRcdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAnbnVtYmVyJykgdGhyb3cgXCJFeHBlY3RlZCBmcmFjdGlvbiBpbiBROiBmaWVsZFwiO1xuXHRcdFx0XHRcdFx0bnVtID0gcGFyc2VJbnQodG9rZW4udG9rZW4pO1xuXHRcdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRcdGlmICh0b2tlbi50eXBlICE9PSAncHVuY3QnICYmIHRva2VuLnRva2VuICE9PSAnLycpIHRocm93IFwiRXhwZWN0ZWQgZnJhY3Rpb24gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHRcdHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0XHRpZiAodG9rZW4udHlwZSAhPT0gJ251bWJlcicpIHRocm93IFwiRXhwZWN0ZWQgZnJhY3Rpb24gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHRcdGRlbiA9IHBhcnNlSW50KHRva2VuLnRva2VuKTtcblx0XHRcdFx0XHRcdHRlbXBvLmR1cmF0aW9uLnB1c2gobnVtL2Rlbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdFx0aWYgKHRva2VuLnR5cGUgIT09ICdwdW5jdCcgJiYgdG9rZW4udG9rZW4gIT09ICc9JykgdGhyb3cgXCJFeHBlY3RlZCA9IGluIFE6IGZpZWxkXCI7XG5cdFx0XHRcdFx0dG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAodG9rZW4udHlwZSAhPT0gJ251bWJlcicpIHRocm93IFwiRXhwZWN0ZWQgdGVtcG8gaW4gUTogZmllbGRcIjtcblx0XHRcdFx0XHR0ZW1wby5icG0gPSBwYXJzZUludCh0b2tlbi50b2tlbik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB0aHJvdyBcIlVua25vd24gdmFsdWUgaW4gUTogZmllbGRcIjtcblx0XHRcdGlmICh0b2tlbnMubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdGlmICh0b2tlbi50eXBlID09PSAncXVvdGUnKSB7XG5cdFx0XHRcdFx0dGVtcG8ucG9zdFN0cmluZyA9IHRva2VuLnRva2VuO1xuXHRcdFx0XHRcdHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggIT09IDApIHRocm93IFwiVW5leHBlY3RlZCBzdHJpbmcgYXQgZW5kIG9mIFE6IGZpZWxkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5wcmludFRlbXBvID09PSBmYWxzZSlcblx0XHRcdFx0dGVtcG8uc3VwcHJlc3MgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHt0eXBlOiBkZWxheVNldD8nZGVsYXlTZXQnOidpbW1lZGlhdGUnLCB0ZW1wbzogdGVtcG99O1xuXHRcdH0gY2F0Y2ggKG1zZykge1xuXHRcdFx0d2Fybihtc2csIGxpbmUsIHN0YXJ0KTtcblx0XHRcdHJldHVybiB7dHlwZTogJ25vbmUnfTtcblx0XHR9XG5cdH07XG5cblx0dGhpcy5sZXR0ZXJfdG9faW5saW5lX2hlYWRlciA9IGZ1bmN0aW9uKGxpbmUsIGkpXG5cdHtcblx0XHR2YXIgd3MgPSB0b2tlbml6ZXIuZWF0V2hpdGVTcGFjZShsaW5lLCBpKTtcblx0XHRpICs9d3M7XG5cdFx0aWYgKGxpbmUubGVuZ3RoID49IGkrNSAmJiBsaW5lLmNoYXJBdChpKSA9PT0gJ1snICYmIGxpbmUuY2hhckF0KGkrMikgPT09ICc6Jykge1xuXHRcdFx0dmFyIGUgPSBsaW5lLmluZGV4T2YoJ10nLCBpKTtcblx0XHRcdHZhciBzdGFydENoYXIgPSBtdWx0aWxpbmVWYXJzLmlDaGFyICsgaTtcblx0XHRcdHZhciBlbmRDaGFyID0gbXVsdGlsaW5lVmFycy5pQ2hhciArIGUgKyAxO1xuXHRcdFx0c3dpdGNoKGxpbmUuc3Vic3RyaW5nKGksIGkrMykpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgXCJbSTpcIjpcblx0XHRcdFx0XHR2YXIgZXJyID0gcGFyc2VEaXJlY3RpdmUuYWRkRGlyZWN0aXZlKGxpbmUuc3Vic3RyaW5nKGkrMywgZSkpO1xuXHRcdFx0XHRcdGlmIChlcnIpIHdhcm4oZXJyLCBsaW5lLCBpKTtcblx0XHRcdFx0XHRyZXR1cm4gWyBlLWkrMSt3cyBdO1xuXHRcdFx0XHRjYXNlIFwiW006XCI6XG5cdFx0XHRcdFx0dmFyIG1ldGVyID0gdGhpcy5zZXRNZXRlcihsaW5lLnN1YnN0cmluZyhpKzMsIGUpKTtcblx0XHRcdFx0XHRpZiAodHVuZS5oYXNCZWdpbk11c2ljKCkgJiYgbWV0ZXIpXG5cdFx0XHRcdFx0XHR0dW5lLmFwcGVuZFN0YXJ0aW5nRWxlbWVudCgnbWV0ZXInLCBzdGFydENoYXIsIGVuZENoYXIsIG1ldGVyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm1ldGVyID0gbWV0ZXI7XG5cdFx0XHRcdFx0cmV0dXJuIFsgZS1pKzErd3MgXTtcblx0XHRcdFx0Y2FzZSBcIltLOlwiOlxuXHRcdFx0XHRcdHZhciByZXN1bHQgPSBwYXJzZUtleVZvaWNlLnBhcnNlS2V5KGxpbmUuc3Vic3RyaW5nKGkrMywgZSkpO1xuXHRcdFx0XHRcdGlmIChyZXN1bHQuZm91bmRDbGVmICYmIHR1bmUuaGFzQmVnaW5NdXNpYygpKVxuXHRcdFx0XHRcdFx0dHVuZS5hcHBlbmRTdGFydGluZ0VsZW1lbnQoJ2NsZWYnLCBzdGFydENoYXIsIGVuZENoYXIsIG11bHRpbGluZVZhcnMuY2xlZik7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdC5mb3VuZEtleSAmJiB0dW5lLmhhc0JlZ2luTXVzaWMoKSlcblx0XHRcdFx0XHRcdHR1bmUuYXBwZW5kU3RhcnRpbmdFbGVtZW50KCdrZXknLCBzdGFydENoYXIsIGVuZENoYXIsIHBhcnNlS2V5Vm9pY2UuZml4S2V5KG11bHRpbGluZVZhcnMuY2xlZiwgbXVsdGlsaW5lVmFycy5rZXkpKTtcblx0XHRcdFx0XHRyZXR1cm4gWyBlLWkrMSt3cyBdO1xuXHRcdFx0XHRjYXNlIFwiW1A6XCI6XG5cdFx0XHRcdFx0aWYgKHR1bmUubGluZXMubGVuZ3RoIDw9IHR1bmUubGluZU51bSlcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMucGFydEZvck5leHRMaW5lID0geyB0aXRsZTogbGluZS5zdWJzdHJpbmcoaSszLCBlKSwgc3RhcnRDaGFyOiBzdGFydENoYXIsIGVuZENoYXI6IGVuZENoYXIgfTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0dW5lLmFwcGVuZEVsZW1lbnQoJ3BhcnQnLCBzdGFydENoYXIsIGVuZENoYXIsIHt0aXRsZTogbGluZS5zdWJzdHJpbmcoaSszLCBlKX0pO1xuXHRcdFx0XHRcdHJldHVybiBbIGUtaSsxK3dzIF07XG5cdFx0XHRcdGNhc2UgXCJbTDpcIjpcblx0XHRcdFx0XHR0aGlzLnNldERlZmF1bHRMZW5ndGgobGluZSwgaSszLCBlKTtcblx0XHRcdFx0XHRyZXR1cm4gWyBlLWkrMSt3cyBdO1xuXHRcdFx0XHRjYXNlIFwiW1E6XCI6XG5cdFx0XHRcdFx0aWYgKGUgPiAwKSB7XG5cdFx0XHRcdFx0XHR2YXIgdGVtcG8gPSB0aGlzLnNldFRlbXBvKGxpbmUsIGkrMywgZSk7XG5cdFx0XHRcdFx0XHRpZiAodGVtcG8udHlwZSA9PT0gJ2RlbGF5U2V0JykgdHVuZS5hcHBlbmRFbGVtZW50KCd0ZW1wbycsIHN0YXJ0Q2hhciwgZW5kQ2hhciwgdGhpcy5jYWxjVGVtcG8odGVtcG8udGVtcG8pKTtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKHRlbXBvLnR5cGUgPT09ICdpbW1lZGlhdGUnKSB0dW5lLmFwcGVuZEVsZW1lbnQoJ3RlbXBvJywgc3RhcnRDaGFyLCBlbmRDaGFyLCB0ZW1wby50ZW1wbyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlLWkrMSt3cywgbGluZS5jaGFyQXQoaSsxKSwgbGluZS5zdWJzdHJpbmcoaSszLCBlKV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiW1Y6XCI6XG5cdFx0XHRcdFx0aWYgKGUgPiAwKSB7XG5cdFx0XHRcdFx0XHRwYXJzZUtleVZvaWNlLnBhcnNlVm9pY2UobGluZSwgaSszLCBlKTtcblx0XHRcdFx0XHRcdC8vc3RhcnROZXdMaW5lKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlLWkrMSt3cywgbGluZS5jaGFyQXQoaSsxKSwgbGluZS5zdWJzdHJpbmcoaSszLCBlKV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gVE9ETzogY29tcGxhaW4gYWJvdXQgdW5oYW5kbGVkIGhlYWRlclxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gWyAwIF07XG5cdH07XG5cblx0dGhpcy5sZXR0ZXJfdG9fYm9keV9oZWFkZXIgPSBmdW5jdGlvbihsaW5lLCBpKVxuXHR7XG5cdFx0aWYgKGxpbmUubGVuZ3RoID49IGkrMykge1xuXHRcdFx0c3dpdGNoKGxpbmUuc3Vic3RyaW5nKGksIGkrMikpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgXCJJOlwiOlxuXHRcdFx0XHRcdHZhciBlcnIgPSBwYXJzZURpcmVjdGl2ZS5hZGREaXJlY3RpdmUobGluZS5zdWJzdHJpbmcoaSsyKSk7XG5cdFx0XHRcdFx0aWYgKGVycikgd2FybihlcnIsIGxpbmUsIGkpO1xuXHRcdFx0XHRcdHJldHVybiBbIGxpbmUubGVuZ3RoIF07XG5cdFx0XHRcdGNhc2UgXCJNOlwiOlxuXHRcdFx0XHRcdHZhciBtZXRlciA9IHRoaXMuc2V0TWV0ZXIobGluZS5zdWJzdHJpbmcoaSsyKSk7XG5cdFx0XHRcdFx0aWYgKHR1bmUuaGFzQmVnaW5NdXNpYygpICYmIG1ldGVyKVxuXHRcdFx0XHRcdFx0dHVuZS5hcHBlbmRTdGFydGluZ0VsZW1lbnQoJ21ldGVyJywgbXVsdGlsaW5lVmFycy5pQ2hhciArIGksIG11bHRpbGluZVZhcnMuaUNoYXIgKyBsaW5lLmxlbmd0aCwgbWV0ZXIpO1xuXHRcdFx0XHRcdHJldHVybiBbIGxpbmUubGVuZ3RoIF07XG5cdFx0XHRcdGNhc2UgXCJLOlwiOlxuXHRcdFx0XHRcdHZhciByZXN1bHQgPSBwYXJzZUtleVZvaWNlLnBhcnNlS2V5KGxpbmUuc3Vic3RyaW5nKGkrMikpO1xuXHRcdFx0XHRcdGlmIChyZXN1bHQuZm91bmRDbGVmICYmIHR1bmUuaGFzQmVnaW5NdXNpYygpKVxuXHRcdFx0XHRcdFx0dHVuZS5hcHBlbmRTdGFydGluZ0VsZW1lbnQoJ2NsZWYnLCBtdWx0aWxpbmVWYXJzLmlDaGFyICsgaSwgbXVsdGlsaW5lVmFycy5pQ2hhciArIGxpbmUubGVuZ3RoLCBtdWx0aWxpbmVWYXJzLmNsZWYpO1xuXHRcdFx0XHRcdGlmIChyZXN1bHQuZm91bmRLZXkgJiYgdHVuZS5oYXNCZWdpbk11c2ljKCkpXG5cdFx0XHRcdFx0XHR0dW5lLmFwcGVuZFN0YXJ0aW5nRWxlbWVudCgna2V5JywgbXVsdGlsaW5lVmFycy5pQ2hhciArIGksIG11bHRpbGluZVZhcnMuaUNoYXIgKyBsaW5lLmxlbmd0aCwgcGFyc2VLZXlWb2ljZS5maXhLZXkobXVsdGlsaW5lVmFycy5jbGVmLCBtdWx0aWxpbmVWYXJzLmtleSkpO1xuXHRcdFx0XHRcdHJldHVybiBbIGxpbmUubGVuZ3RoIF07XG5cdFx0XHRcdGNhc2UgXCJQOlwiOlxuXHRcdFx0XHRcdGlmICh0dW5lLmhhc0JlZ2luTXVzaWMoKSlcblx0XHRcdFx0XHRcdHR1bmUuYXBwZW5kRWxlbWVudCgncGFydCcsIG11bHRpbGluZVZhcnMuaUNoYXIgKyBpLCBtdWx0aWxpbmVWYXJzLmlDaGFyICsgbGluZS5sZW5ndGgsIHt0aXRsZTogbGluZS5zdWJzdHJpbmcoaSsyKX0pO1xuXHRcdFx0XHRcdHJldHVybiBbIGxpbmUubGVuZ3RoIF07XG5cdFx0XHRcdGNhc2UgXCJMOlwiOlxuXHRcdFx0XHRcdHRoaXMuc2V0RGVmYXVsdExlbmd0aChsaW5lLCBpKzIsIGxpbmUubGVuZ3RoKTtcblx0XHRcdFx0XHRyZXR1cm4gWyBsaW5lLmxlbmd0aCBdO1xuXHRcdFx0XHRjYXNlIFwiUTpcIjpcblx0XHRcdFx0XHR2YXIgZSA9IGxpbmUuaW5kZXhPZignXFx4MTInLCBpKzIpO1xuXHRcdFx0XHRcdGlmIChlID09PSAtMSkgZSA9IGxpbmUubGVuZ3RoO1xuXHRcdFx0XHRcdHZhciB0ZW1wbyA9IHRoaXMuc2V0VGVtcG8obGluZSwgaSsyLCBlKTtcblx0XHRcdFx0XHRpZiAodGVtcG8udHlwZSA9PT0gJ2RlbGF5U2V0JykgdHVuZS5hcHBlbmRFbGVtZW50KCd0ZW1wbycsIG11bHRpbGluZVZhcnMuaUNoYXIgKyBpLCBtdWx0aWxpbmVWYXJzLmlDaGFyICsgbGluZS5sZW5ndGgsIHRoaXMuY2FsY1RlbXBvKHRlbXBvLnRlbXBvKSk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGVtcG8udHlwZSA9PT0gJ2ltbWVkaWF0ZScpIHR1bmUuYXBwZW5kRWxlbWVudCgndGVtcG8nLCBtdWx0aWxpbmVWYXJzLmlDaGFyICsgaSwgbXVsdGlsaW5lVmFycy5pQ2hhciArIGxpbmUubGVuZ3RoLCB0ZW1wby50ZW1wbyk7XG5cdFx0XHRcdHJldHVybiBbIGUsIGxpbmUuY2hhckF0KGkpLCBwYXJzZUNvbW1vbi5zdHJpcChsaW5lLnN1YnN0cmluZyhpKzIpKV07XG5cdFx0XHRcdGNhc2UgXCJWOlwiOlxuXHRcdFx0XHRcdHBhcnNlS2V5Vm9pY2UucGFyc2VWb2ljZShsaW5lLCBpKzIsIGxpbmUubGVuZ3RoKTtcbi8vXHRcdFx0XHRcdFx0c3RhcnROZXdMaW5lKCk7XG5cdFx0XHRcdFx0cmV0dXJuIFsgbGluZS5sZW5ndGgsIGxpbmUuY2hhckF0KGkpLCBwYXJzZUNvbW1vbi5zdHJpcChsaW5lLnN1YnN0cmluZyhpKzIpKV07XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gVE9ETzogY29tcGxhaW4gYWJvdXQgdW5oYW5kbGVkIGhlYWRlclxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gWyAwIF07XG5cdH07XG5cblx0dmFyIG1ldGFUZXh0SGVhZGVycyA9IHtcblx0XHRBOiAnYXV0aG9yJyxcblx0XHRCOiAnYm9vaycsXG5cdFx0QzogJ2NvbXBvc2VyJyxcblx0XHREOiAnZGlzY29ncmFwaHknLFxuXHRcdEY6ICd1cmwnLFxuXHRcdEc6ICdncm91cCcsXG5cdFx0STogJ2luc3RydWN0aW9uJyxcblx0XHROOiAnbm90ZXMnLFxuXHRcdE86ICdvcmlnaW4nLFxuXHRcdFI6ICdyaHl0aG0nLFxuXHRcdFM6ICdzb3VyY2UnLFxuXHRcdFc6ICd1bmFsaWduZWRXb3JkcycsXG5cdFx0WjogJ3RyYW5zY3JpcHRpb24nXG5cdH07XG5cblx0dGhpcy5wYXJzZUhlYWRlciA9IGZ1bmN0aW9uKGxpbmUpIHtcblx0XHRpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChsaW5lLCAnJSUnKSkge1xuXHRcdFx0dmFyIGVyciA9IHBhcnNlRGlyZWN0aXZlLmFkZERpcmVjdGl2ZShsaW5lLnN1YnN0cmluZygyKSk7XG5cdFx0XHRpZiAoZXJyKSB3YXJuKGVyciwgbGluZSwgMik7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHRcdHZhciBpID0gbGluZS5pbmRleE9mKCclJyk7XG5cdFx0aWYgKGkgPj0gMClcblx0XHRcdGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBpKTtcblx0XHRsaW5lID0gbGluZS5yZXBsYWNlKC9cXHMrJC8sICcnKTtcblxuXHRcdGlmIChsaW5lLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiB7fTtcblxuXHRcdGlmIChsaW5lLmxlbmd0aCA+PSAyKSB7XG5cdFx0XHRpZiAobGluZS5jaGFyQXQoMSkgPT09ICc6Jykge1xuXHRcdFx0XHR2YXIgbmV4dExpbmUgPSBcIlwiO1xuXHRcdFx0XHRpZiAobGluZS5pbmRleE9mKCdcXHgxMicpID49IDAgJiYgbGluZS5jaGFyQXQoMCkgIT09ICd3Jykge1x0Ly8gdzogaXMgdGhlIG9ubHkgaGVhZGVyIGZpZWxkIHRoYXQgY2FuIGhhdmUgYSBjb250aW51YXRpb24uXG5cdFx0XHRcdFx0bmV4dExpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJ1xceDEyJykrMSk7XG5cdFx0XHRcdFx0bGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZignXFx4MTInKSk7XHQvL1RoaXMgaGFuZGxlcyBhIGNvbnRpbnVhdGlvbiBtYXJrIG9uIGEgaGVhZGVyIGZpZWxkXG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIGZpZWxkID0gbWV0YVRleHRIZWFkZXJzW2xpbmUuY2hhckF0KDApXTtcblx0XHRcdFx0aWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZmllbGQgPT09ICd1bmFsaWduZWRXb3JkcycpXG5cdFx0XHRcdFx0XHR0dW5lLmFkZE1ldGFUZXh0QXJyYXkoZmllbGQsIHBhcnNlRGlyZWN0aXZlLnBhcnNlRm9udENoYW5nZUxpbmUodG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh0b2tlbml6ZXIuc3RyaXBDb21tZW50KGxpbmUuc3Vic3RyaW5nKDIpKSkpKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0dW5lLmFkZE1ldGFUZXh0KGZpZWxkLCB0b2tlbml6ZXIudHJhbnNsYXRlU3RyaW5nKHRva2VuaXplci5zdHJpcENvbW1lbnQobGluZS5zdWJzdHJpbmcoMikpKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBzdGFydENoYXIgPSBtdWx0aWxpbmVWYXJzLmlDaGFyO1xuXHRcdFx0XHRcdHZhciBlbmRDaGFyID0gc3RhcnRDaGFyICsgbGluZS5sZW5ndGg7XG5cdFx0XHRcdFx0c3dpdGNoKGxpbmUuY2hhckF0KDApKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNhc2UgICdIJzpcblx0XHRcdFx0XHRcdFx0dHVuZS5hZGRNZXRhVGV4dChcImhpc3RvcnlcIiwgdG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh0b2tlbml6ZXIuc3RyaXBDb21tZW50KGxpbmUuc3Vic3RyaW5nKDIpKSkpO1xuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmlzX2luX2hpc3RvcnkgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgICdLJzpcblx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgdGhlIGtleSBpcyB0aGUgbGFzdCB0aGluZyB0aGF0IGNhbiBoYXBwZW4gaW4gdGhlIGhlYWRlciwgd2UgY2FuIHJlc29sdmUgdGhlIHRlbXBvIG5vd1xuXHRcdFx0XHRcdFx0XHR0aGlzLnJlc29sdmVUZW1wbygpO1xuXHRcdFx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gcGFyc2VLZXlWb2ljZS5wYXJzZUtleShsaW5lLnN1YnN0cmluZygyKSk7XG5cdFx0XHRcdFx0XHRcdGlmICghbXVsdGlsaW5lVmFycy5pc19pbl9oZWFkZXIgJiYgdHVuZS5oYXNCZWdpbk11c2ljKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0LmZvdW5kQ2xlZilcblx0XHRcdFx0XHRcdFx0XHRcdHR1bmUuYXBwZW5kU3RhcnRpbmdFbGVtZW50KCdjbGVmJywgc3RhcnRDaGFyLCBlbmRDaGFyLCBtdWx0aWxpbmVWYXJzLmNsZWYpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyZXN1bHQuZm91bmRLZXkpXG5cdFx0XHRcdFx0XHRcdFx0XHR0dW5lLmFwcGVuZFN0YXJ0aW5nRWxlbWVudCgna2V5Jywgc3RhcnRDaGFyLCBlbmRDaGFyLCBwYXJzZUtleVZvaWNlLmZpeEtleShtdWx0aWxpbmVWYXJzLmNsZWYsIG11bHRpbGluZVZhcnMua2V5KSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5pc19pbl9oZWFkZXIgPSBmYWxzZTtcdC8vIFRoZSBmaXJzdCBrZXkgc2lnbmlmaWVzIHRoZSBlbmQgb2YgdGhlIGhlYWRlci5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICAnTCc6XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0RGVmYXVsdExlbmd0aChsaW5lLCAyLCBsaW5lLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAgJ00nOlxuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm9yaWdNZXRlciA9IG11bHRpbGluZVZhcnMubWV0ZXIgPSB0aGlzLnNldE1ldGVyKGxpbmUuc3Vic3RyaW5nKDIpKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICAnUCc6XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE8tUEVSOiBUaGVyZSBpcyBtb3JlIHRvIGRvIHdpdGggcGFydHMsIGJ1dCB0aGUgd3JpdGVyIGRvZXNuJ3QgY2FyZS5cblx0XHRcdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMuaXNfaW5faGVhZGVyKVxuXHRcdFx0XHRcdFx0XHRcdHR1bmUuYWRkTWV0YVRleHQoXCJwYXJ0T3JkZXJcIiwgdG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh0b2tlbml6ZXIuc3RyaXBDb21tZW50KGxpbmUuc3Vic3RyaW5nKDIpKSkpO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5wYXJ0Rm9yTmV4dExpbmUgPSB7IHRpdGxlOiB0b2tlbml6ZXIudHJhbnNsYXRlU3RyaW5nKHRva2VuaXplci5zdHJpcENvbW1lbnQobGluZS5zdWJzdHJpbmcoMikpKSwgc3RhcnRDaGFyOiBzdGFydENoYXIsIGVuZENoYXI6IGVuZENoYXJ9O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgICdRJzpcblx0XHRcdFx0XHRcdFx0dmFyIHRlbXBvID0gdGhpcy5zZXRUZW1wbyhsaW5lLCAyLCBsaW5lLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZW1wby50eXBlID09PSAnZGVsYXlTZXQnKSBtdWx0aWxpbmVWYXJzLnRlbXBvID0gdGVtcG8udGVtcG87XG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgKHRlbXBvLnR5cGUgPT09ICdpbW1lZGlhdGUnKSB0dW5lLm1ldGFUZXh0LnRlbXBvID0gdGVtcG8udGVtcG87XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAgJ1QnOlxuXHRcdFx0XHRcdFx0XHR0aGlzLnNldFRpdGxlKGxpbmUuc3Vic3RyaW5nKDIpKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdVJzpcblx0XHRcdFx0XHRcdFx0dGhpcy5hZGRVc2VyRGVmaW5pdGlvbihsaW5lLCAyLCBsaW5lLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAgJ1YnOlxuXHRcdFx0XHRcdFx0XHRwYXJzZUtleVZvaWNlLnBhcnNlVm9pY2UobGluZSwgMiwgbGluZS5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIW11bHRpbGluZVZhcnMuaXNfaW5faGVhZGVyKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7bmV3bGluZTogdHJ1ZX07XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAgJ3MnOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge3N5bWJvbHM6IHRydWV9O1xuXHRcdFx0XHRcdFx0Y2FzZSAgJ3cnOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge3dvcmRzOiB0cnVlfTtcblx0XHRcdFx0XHRcdGNhc2UgJ1gnOlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0UnOlxuXHRcdFx0XHRcdFx0Y2FzZSAnbSc6XG5cdFx0XHRcdFx0XHRcdHdhcm4oXCJJZ25vcmVkIGhlYWRlclwiLCBsaW5lLCAwKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHQvLyBJdCB3YXNuJ3QgYSByZWNvZ25pemVkIGhlYWRlciB2YWx1ZSwgc28gcGFyc2UgaXQgYXMgbXVzaWMuXG5cdFx0XHRcdFx0XHRcdGlmIChuZXh0TGluZS5sZW5ndGgpXG5cdFx0XHRcdFx0XHRcdFx0bmV4dExpbmUgPSBcIlxceDEyXCIgKyBuZXh0TGluZTtcblx0XHRcdFx0XHRcdFx0Ly9wYXJzZVJlZ3VsYXJNdXNpY0xpbmUobGluZStuZXh0TGluZSk7XG5cdFx0XHRcdFx0XHRcdC8vbmV4dExpbmUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge3JlZ3VsYXI6IHRydWUsIHN0cjogbGluZStuZXh0TGluZX07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuZXh0TGluZS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdHJldHVybiB7cmVjdXJzZTogdHJ1ZSwgc3RyOiBuZXh0TGluZX07XG5cdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlIGhhdmUgYSByZWd1bGFyIGxpbmUgb2YgbXVsc2ljXG5cdFx0cmV0dXJuIHtyZWd1bGFyOiB0cnVlLCBzdHI6IGxpbmV9O1xuXHR9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZUhlYWRlcjtcbiIsIi8vICAgIGFiY190b2tlbml6ZXIuanM6IHRva2VuaXplcyBhbiBBQkMgTXVzaWMgTm90YXRpb24gc3RyaW5nIHRvIHN1cHBvcnQgYWJjX3BhcnNlLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggUGF1bCBSb3NlbiAocGF1bCBhdCBwYXVscm9zZW4gZG90IG5ldClcbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHBhcnNlQ29tbW9uID0gcmVxdWlyZSgnLi9hYmNfY29tbW9uJyk7XG5cbi8vIHRoaXMgaXMgYSBzZXJpZXMgb2YgZnVuY3Rpb25zIHRoYXQgZ2V0IGEgcGFydGljdWxhciBlbGVtZW50IG91dCBvZiB0aGUgcGFzc2VkIHN0cmVhbS5cbi8vIHRoZSByZXR1cm4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkLCBzbyAwIG1lYW5zIHRoYXQgdGhlIGVsZW1lbnQgd2Fzbid0IGZvdW5kLlxuLy8gYWxzbyByZXR1cm5lZCBpcyB0aGUgZWxlbWVudCBmb3VuZC4gVGhpcyBtYXkgYmUgYSBkaWZmZXJlbnQgbGVuZ3RoIGJlY2F1c2Ugc3BhY2VzIG1heSBiZSBjb25zdW1lZCB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBzdHJpbmcuXG4vLyBUaGUgcmV0dXJuIHN0cnVjdHVyZSBmb3IgbW9zdCBjYWxscyBpcyB7IGxlbjogbnVtX2NoYXJzX2NvbnN1bWVkLCB0b2tlbjogc3RyIH1cbnZhciBUb2tlbml6ZXIgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5za2lwV2hpdGVTcGFjZSA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG5cdFx0ICBpZiAoIXRoaXMuaXNXaGl0ZVNwYWNlKHN0ci5jaGFyQXQoaSkpKVxuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdFx0cmV0dXJuIHN0ci5sZW5ndGg7XHQvLyBJdCBtdXN0IGhhdmUgYmVlbiBhbGwgd2hpdGUgc3BhY2Vcblx0fTtcblx0dmFyIGZpbmlzaGVkID0gZnVuY3Rpb24oc3RyLCBpKSB7XG5cdFx0cmV0dXJuIGkgPj0gc3RyLmxlbmd0aDtcblx0fTtcblx0dGhpcy5lYXRXaGl0ZVNwYWNlID0gZnVuY3Rpb24obGluZSwgaW5kZXgpIHtcblx0XHRmb3IgKHZhciBpID0gaW5kZXg7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG5cdFx0ICBpZiAoIXRoaXMuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckF0KGkpKSlcblx0XHRcdFx0cmV0dXJuIGktaW5kZXg7XG5cdFx0fVxuXHRcdHJldHVybiBpLWluZGV4O1xuXHR9O1xuXG5cdC8vIFRoaXMganVzdCBnZXRzIHRoZSBiYXNpYyBwaXRjaCBsZXR0ZXIsIGlnbm9yaW5nIGxlYWRpbmcgc3BhY2VzLCBhbmQgbm9ybWFsaXppbmcgaXQgdG8gYSBjYXBpdGFsXG5cdHRoaXMuZ2V0S2V5UGl0Y2ggPSBmdW5jdGlvbihzdHIpIHtcblx0XHR2YXIgaSA9IHRoaXMuc2tpcFdoaXRlU3BhY2Uoc3RyKTtcblx0XHRpZiAoZmluaXNoZWQoc3RyLCBpKSlcblx0XHRcdHJldHVybiB7bGVuOiAwfTtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpIHtcblx0XHRcdGNhc2UgJ0EnOnJldHVybiB7bGVuOiBpKzEsIHRva2VuOiAnQSd9O1xuXHRcdFx0Y2FzZSAnQic6cmV0dXJuIHtsZW46IGkrMSwgdG9rZW46ICdCJ307XG5cdFx0XHRjYXNlICdDJzpyZXR1cm4ge2xlbjogaSsxLCB0b2tlbjogJ0MnfTtcblx0XHRcdGNhc2UgJ0QnOnJldHVybiB7bGVuOiBpKzEsIHRva2VuOiAnRCd9O1xuXHRcdFx0Y2FzZSAnRSc6cmV0dXJuIHtsZW46IGkrMSwgdG9rZW46ICdFJ307XG5cdFx0XHRjYXNlICdGJzpyZXR1cm4ge2xlbjogaSsxLCB0b2tlbjogJ0YnfTtcblx0XHRcdGNhc2UgJ0cnOnJldHVybiB7bGVuOiBpKzEsIHRva2VuOiAnRyd9O1xuLy9cdFx0XHRjYXNlICdhJzpyZXR1cm4ge2xlbjogaSsxLCB0b2tlbjogJ0EnfTtcbi8vXHRcdFx0Y2FzZSAnYic6cmV0dXJuIHtsZW46IGkrMSwgdG9rZW46ICdCJ307XG4vL1x0XHRcdGNhc2UgJ2MnOnJldHVybiB7bGVuOiBpKzEsIHRva2VuOiAnQyd9O1xuLy9cdFx0XHRjYXNlICdkJzpyZXR1cm4ge2xlbjogaSsxLCB0b2tlbjogJ0QnfTtcbi8vXHRcdFx0Y2FzZSAnZSc6cmV0dXJuIHtsZW46IGkrMSwgdG9rZW46ICdFJ307XG4vL1x0XHRcdGNhc2UgJ2YnOnJldHVybiB7bGVuOiBpKzEsIHRva2VuOiAnRid9O1xuLy9cdFx0XHRjYXNlICdnJzpyZXR1cm4ge2xlbjogaSsxLCB0b2tlbjogJ0cnfTtcblx0XHR9XG5cdFx0cmV0dXJuIHtsZW46IDB9O1xuXHR9O1xuXG5cdC8vIFRoaXMganVzdCBnZXRzIHRoZSBiYXNpYyBhY2NpZGVudGFsLCBpZ25vcmluZyBsZWFkaW5nIHNwYWNlcywgYW5kIG9ubHkgdGhlIG9uZXMgdGhhdCBhcHBlYXIgaW4gYSBrZXlcblx0dGhpcy5nZXRTaGFycEZsYXQgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZiAoc3RyID09PSAnYmFzcycpXG5cdFx0XHRyZXR1cm4ge2xlbjogMH07XG5cdFx0c3dpdGNoIChzdHIuY2hhckF0KDApKSB7XG5cdFx0XHRjYXNlICcjJzpyZXR1cm4ge2xlbjogMSwgdG9rZW46ICcjJ307XG5cdFx0XHRjYXNlICdiJzpyZXR1cm4ge2xlbjogMSwgdG9rZW46ICdiJ307XG5cdFx0fVxuXHRcdHJldHVybiB7bGVuOiAwfTtcblx0fTtcblxuXHR0aGlzLmdldE1vZGUgPSBmdW5jdGlvbihzdHIpIHtcblx0XHR2YXIgc2tpcEFscGhhID0gZnVuY3Rpb24oc3RyLCBzdGFydCkge1xuXHRcdFx0Ly8gVGhpcyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBub24tYWxwaGFiZXRpYyBjaGFyLCBvciB0aGUgZW50aXJlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIG5vdCBmb3VuZC5cblx0XHQgIHdoaWxlIChzdGFydCA8IHN0ci5sZW5ndGggJiYgKChzdHIuY2hhckF0KHN0YXJ0KSA+PSAnYScgJiYgc3RyLmNoYXJBdChzdGFydCkgPD0gJ3onKSB8fCAoc3RyLmNoYXJBdChzdGFydCkgPj0gJ0EnICYmIHN0ci5jaGFyQXQoc3RhcnQpIDw9ICdaJykpKVxuXHRcdFx0XHRzdGFydCsrO1xuXHRcdFx0cmV0dXJuIHN0YXJ0O1xuXHRcdH07XG5cblx0XHR2YXIgaSA9IHRoaXMuc2tpcFdoaXRlU3BhY2Uoc3RyKTtcblx0XHRpZiAoZmluaXNoZWQoc3RyLCBpKSlcblx0XHRcdHJldHVybiB7bGVuOiAwfTtcblx0XHR2YXIgZmlyc3RUaHJlZSA9IHN0ci5zdWJzdHJpbmcoaSxpKzMpLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKGZpcnN0VGhyZWUubGVuZ3RoID4gMSAmJiBmaXJzdFRocmVlLmNoYXJBdCgxKSA9PT0gJyAnIHx8IGZpcnN0VGhyZWUuY2hhckF0KDEpID09PSAnXicgfHwgZmlyc3RUaHJlZS5jaGFyQXQoMSkgPT09ICdfJyB8fCBmaXJzdFRocmVlLmNoYXJBdCgxKSA9PT0gJz0nKSBmaXJzdFRocmVlID0gZmlyc3RUaHJlZS5jaGFyQXQoMCk7XHQvLyBUaGlzIHdpbGwgaGFuZGxlIHRoZSBjYXNlIG9mICdtJ1xuXHRcdHN3aXRjaCAoZmlyc3RUaHJlZSkge1xuXHRcdFx0Y2FzZSAnbWl4JzpyZXR1cm4ge2xlbjogc2tpcEFscGhhKHN0ciwgaSksIHRva2VuOiAnTWl4J307XG5cdFx0XHRjYXNlICdkb3InOnJldHVybiB7bGVuOiBza2lwQWxwaGEoc3RyLCBpKSwgdG9rZW46ICdEb3InfTtcblx0XHRcdGNhc2UgJ3Bocic6cmV0dXJuIHtsZW46IHNraXBBbHBoYShzdHIsIGkpLCB0b2tlbjogJ1Bocid9O1xuXHRcdFx0Y2FzZSAnbHlkJzpyZXR1cm4ge2xlbjogc2tpcEFscGhhKHN0ciwgaSksIHRva2VuOiAnTHlkJ307XG5cdFx0XHRjYXNlICdsb2MnOnJldHVybiB7bGVuOiBza2lwQWxwaGEoc3RyLCBpKSwgdG9rZW46ICdMb2MnfTtcblx0XHRcdGNhc2UgJ2Flbyc6cmV0dXJuIHtsZW46IHNraXBBbHBoYShzdHIsIGkpLCB0b2tlbjogJ20nfTtcblx0XHRcdGNhc2UgJ21haic6cmV0dXJuIHtsZW46IHNraXBBbHBoYShzdHIsIGkpLCB0b2tlbjogJyd9O1xuXHRcdFx0Y2FzZSAnaW9uJzpyZXR1cm4ge2xlbjogc2tpcEFscGhhKHN0ciwgaSksIHRva2VuOiAnJ307XG5cdFx0XHRjYXNlICdtaW4nOnJldHVybiB7bGVuOiBza2lwQWxwaGEoc3RyLCBpKSwgdG9rZW46ICdtJ307XG5cdFx0XHRjYXNlICdtJzpyZXR1cm4ge2xlbjogc2tpcEFscGhhKHN0ciwgaSksIHRva2VuOiAnbSd9O1xuXHRcdH1cblx0XHRyZXR1cm4ge2xlbjogMH07XG5cdH07XG5cblx0dGhpcy5nZXRDbGVmID0gZnVuY3Rpb24oc3RyLCBiRXhwbGljaXRPbmx5KSB7XG5cdFx0dmFyIHN0ck9yaWcgPSBzdHI7XG5cdFx0dmFyIGkgPSB0aGlzLnNraXBXaGl0ZVNwYWNlKHN0cik7XG5cdFx0aWYgKGZpbmlzaGVkKHN0ciwgaSkpXG5cdFx0XHRyZXR1cm4ge2xlbjogMH07XG5cdFx0Ly8gVGhlIHdvcmQgJ2NsZWYnIGlzIG9wdGlvbmFsLCBidXQgaWYgaXQgYXBwZWFycywgYSBjbGVmIE1VU1QgYXBwZWFyXG5cdFx0dmFyIG5lZWRzQ2xlZiA9IGZhbHNlO1xuXHRcdHZhciBzdHJDbGVmID0gc3RyLnN1YnN0cmluZyhpKTtcblx0XHRpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChzdHJDbGVmLCAnY2xlZj0nKSkge1xuXHRcdFx0bmVlZHNDbGVmID0gdHJ1ZTtcblx0XHRcdHN0ckNsZWYgPSBzdHJDbGVmLnN1YnN0cmluZyg1KTtcblx0XHRcdGkgKz0gNTtcblx0XHR9XG5cdFx0aWYgKHN0ckNsZWYubGVuZ3RoID09PSAwICYmIG5lZWRzQ2xlZilcblx0XHRcdHJldHVybiB7bGVuOiBpKzUsIHdhcm46IFwiTm8gY2xlZiBzcGVjaWZpZWQ6IFwiICsgc3RyT3JpZ307XG5cblx0XHR2YXIgaiA9IHRoaXMuc2tpcFdoaXRlU3BhY2Uoc3RyQ2xlZik7XG5cdFx0aWYgKGZpbmlzaGVkKHN0ckNsZWYsIGopKVxuXHRcdFx0cmV0dXJuIHtsZW46IDB9O1xuXHRcdGlmIChqID4gMCkge1xuXHRcdFx0aSArPSBqO1xuXHRcdFx0c3RyQ2xlZiA9IHN0ckNsZWYuc3Vic3RyaW5nKGopO1xuXHRcdH1cblx0XHR2YXIgbmFtZSA9IG51bGw7XG5cdFx0aWYgKHBhcnNlQ29tbW9uLnN0YXJ0c1dpdGgoc3RyQ2xlZiwgJ3RyZWJsZScpKVxuXHRcdFx0bmFtZSA9ICd0cmVibGUnO1xuXHRcdGVsc2UgaWYgKHBhcnNlQ29tbW9uLnN0YXJ0c1dpdGgoc3RyQ2xlZiwgJ2Jhc3MzJykpXG5cdFx0XHRuYW1lID0gJ2Jhc3MzJztcblx0XHRlbHNlIGlmIChwYXJzZUNvbW1vbi5zdGFydHNXaXRoKHN0ckNsZWYsICdiYXNzJykpXG5cdFx0XHRuYW1lID0gJ2Jhc3MnO1xuXHRcdGVsc2UgaWYgKHBhcnNlQ29tbW9uLnN0YXJ0c1dpdGgoc3RyQ2xlZiwgJ3Rlbm9yJykpXG5cdFx0XHRuYW1lID0gJ3Rlbm9yJztcblx0XHRlbHNlIGlmIChwYXJzZUNvbW1vbi5zdGFydHNXaXRoKHN0ckNsZWYsICdhbHRvMicpKVxuXHRcdFx0bmFtZSA9ICdhbHRvMic7XG5cdFx0ZWxzZSBpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChzdHJDbGVmLCAnYWx0bzEnKSlcblx0XHRcdG5hbWUgPSAnYWx0bzEnO1xuXHRcdGVsc2UgaWYgKHBhcnNlQ29tbW9uLnN0YXJ0c1dpdGgoc3RyQ2xlZiwgJ2FsdG8nKSlcblx0XHRcdG5hbWUgPSAnYWx0byc7XG5cdFx0ZWxzZSBpZiAoIWJFeHBsaWNpdE9ubHkgJiYgKG5lZWRzQ2xlZiAmJiBwYXJzZUNvbW1vbi5zdGFydHNXaXRoKHN0ckNsZWYsICdub25lJykpKVxuXHRcdFx0bmFtZSA9ICdub25lJztcblx0XHRlbHNlIGlmIChwYXJzZUNvbW1vbi5zdGFydHNXaXRoKHN0ckNsZWYsICdwZXJjJykpXG5cdFx0XHRuYW1lID0gJ3BlcmMnO1xuXHRcdGVsc2UgaWYgKCFiRXhwbGljaXRPbmx5ICYmIChuZWVkc0NsZWYgJiYgcGFyc2VDb21tb24uc3RhcnRzV2l0aChzdHJDbGVmLCAnQycpKSlcblx0XHRcdG5hbWUgPSAndGVub3InO1xuXHRcdGVsc2UgaWYgKCFiRXhwbGljaXRPbmx5ICYmIChuZWVkc0NsZWYgJiYgcGFyc2VDb21tb24uc3RhcnRzV2l0aChzdHJDbGVmLCAnRicpKSlcblx0XHRcdG5hbWUgPSAnYmFzcyc7XG5cdFx0ZWxzZSBpZiAoIWJFeHBsaWNpdE9ubHkgJiYgKG5lZWRzQ2xlZiAmJiBwYXJzZUNvbW1vbi5zdGFydHNXaXRoKHN0ckNsZWYsICdHJykpKVxuXHRcdFx0bmFtZSA9ICd0cmVibGUnO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7bGVuOiBpKzUsIHdhcm46IFwiVW5rbm93biBjbGVmIHNwZWNpZmllZDogXCIgKyBzdHJPcmlnfTtcblxuXHRcdHN0ckNsZWYgPSBzdHJDbGVmLnN1YnN0cmluZyhuYW1lLmxlbmd0aCk7XG5cdFx0aiA9IHRoaXMuaXNNYXRjaChzdHJDbGVmLCAnKzgnKTtcblx0XHRpZiAoaiA+IDApXG5cdFx0XHRuYW1lICs9IFwiKzhcIjtcblx0XHRlbHNlIHtcblx0XHRcdGogPSB0aGlzLmlzTWF0Y2goc3RyQ2xlZiwgJy04Jyk7XG5cdFx0XHRpZiAoaiA+IDApXG5cdFx0XHRcdG5hbWUgKz0gXCItOFwiO1xuXHRcdH1cblx0XHRyZXR1cm4ge2xlbjogaStuYW1lLmxlbmd0aCwgdG9rZW46IG5hbWUsIGV4cGxpY2l0OiBuZWVkc0NsZWZ9O1xuXHR9O1xuXG5cdC8vIFRoaXMgcmV0dXJucyBvbmUgb2YgdGhlIGxlZ2FsIGJhciBsaW5lc1xuXHQvLyBUaGlzIGlzIGNhbGxlZCBhbG90IGFuZCB0aGVyZSBpcyBubyBvYnZpb3VzIHRva2VuYWJsZSBpdGVtcywgc28gdGhpcyBpcyBicm9rZW4gYXBhcnQuXG5cdHRoaXMuZ2V0QmFyTGluZSA9IGZ1bmN0aW9uKGxpbmUsIGkpIHtcblx0XHRzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG5cdFx0XHRjYXNlICddJzpcblx0XHRcdFx0KytpO1xuXHRcdFx0XHRzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnfCc6IHJldHVybiB7bGVuOiAyLCB0b2tlbjogXCJiYXJfdGhpY2tfdGhpblwifTtcblx0XHRcdFx0XHRjYXNlICdbJzpcblx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHRcdGlmICgobGluZS5jaGFyQXQoaSkgPj0gJzEnICYmIGxpbmUuY2hhckF0KGkpIDw9ICc5JykgfHwgbGluZS5jaGFyQXQoaSkgPT09ICdcIicpXG5cdFx0XHRcdFx0XHRcdHJldHVybiB7bGVuOiAyLCB0b2tlbjogXCJiYXJfaW52aXNpYmxlXCJ9O1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtsZW46IDEsIHdhcm46IFwiVW5rbm93biBiYXIgc3ltYm9sXCJ9O1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMSwgdG9rZW46IFwiYmFyX2ludmlzaWJsZVwifTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzonOlxuXHRcdFx0XHQrK2k7XG5cdFx0XHRcdHN3aXRjaCAobGluZS5jaGFyQXQoaSkpIHtcblx0XHRcdFx0XHRjYXNlICc6JzogcmV0dXJuIHtsZW46IDIsIHRva2VuOiBcImJhcl9kYmxfcmVwZWF0XCJ9O1xuXHRcdFx0XHRcdGNhc2UgJ3wnOlx0Ly8gOnxcblx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHRcdHN3aXRjaCAobGluZS5jaGFyQXQoaSkpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAnXSc6XHQvLyA6fF1cblx0XHRcdFx0XHRcdFx0XHQrK2k7XG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChsaW5lLmNoYXJBdChpKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnfCc6XHQvLyA6fF18XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KGkpID09PSAnOicpICByZXR1cm4ge2xlbjogNSwgdG9rZW46IFwiYmFyX2RibF9yZXBlYXRcIn07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7bGVuOiAzLCB0b2tlbjogXCJiYXJfcmlnaHRfcmVwZWF0XCJ9O1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtsZW46IDMsIHRva2VuOiBcImJhcl9yaWdodF9yZXBlYXRcIn07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICd8JzpcdC8vIDp8fFxuXHRcdFx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGluZS5jaGFyQXQoaSkgPT09ICc6JykgIHJldHVybiB7bGVuOiA0LCB0b2tlbjogXCJiYXJfZGJsX3JlcGVhdFwifTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMywgdG9rZW46IFwiYmFyX3JpZ2h0X3JlcGVhdFwifTtcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMiwgdG9rZW46IFwiYmFyX3JpZ2h0X3JlcGVhdFwifTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMSwgd2FybjogXCJVbmtub3duIGJhciBzeW1ib2xcIn07XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdbJzpcdC8vIFtcblx0XHRcdFx0KytpO1xuXHRcdFx0XHRpZiAobGluZS5jaGFyQXQoaSkgPT09ICd8Jykge1x0Ly8gW3xcblx0XHRcdFx0XHQrK2k7XG5cdFx0XHRcdFx0c3dpdGNoIChsaW5lLmNoYXJBdChpKSkge1xuXHRcdFx0XHRcdFx0Y2FzZSAnOic6IHJldHVybiB7bGVuOiAzLCB0b2tlbjogXCJiYXJfbGVmdF9yZXBlYXRcIn07XG5cdFx0XHRcdFx0XHRjYXNlICddJzogcmV0dXJuIHtsZW46IDMsIHRva2VuOiBcImJhcl9pbnZpc2libGVcIn07XG5cdFx0XHRcdFx0XHRkZWZhdWx0OiByZXR1cm4ge2xlbjogMiwgdG9rZW46IFwiYmFyX3RoaWNrX3RoaW5cIn07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICgobGluZS5jaGFyQXQoaSkgPj0gJzEnICYmIGxpbmUuY2hhckF0KGkpIDw9ICc5JykgfHwgbGluZS5jaGFyQXQoaSkgPT09ICdcIicpXG5cdFx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMSwgdG9rZW46IFwiYmFyX2ludmlzaWJsZVwifTtcblx0XHRcdFx0XHRyZXR1cm4ge2xlbjogMH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd8JzpcdC8vIHxcblx0XHRcdFx0KytpO1xuXHRcdFx0XHRzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnXSc6IHJldHVybiB7bGVuOiAyLCB0b2tlbjogXCJiYXJfdGhpbl90aGlja1wifTtcblx0XHRcdFx0XHRjYXNlICd8JzogLy8gfHxcblx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHRcdGlmIChsaW5lLmNoYXJBdChpKSA9PT0gJzonKSByZXR1cm4ge2xlbjogMywgdG9rZW46IFwiYmFyX2xlZnRfcmVwZWF0XCJ9O1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtsZW46IDIsIHRva2VuOiBcImJhcl90aGluX3RoaW5cIn07XG5cdFx0XHRcdFx0Y2FzZSAnOic6XHQvLyB8OlxuXHRcdFx0XHRcdFx0dmFyIGNvbG9ucyA9IDA7XG5cdFx0XHRcdFx0XHR3aGlsZSAobGluZS5jaGFyQXQoaStjb2xvbnMpID09PSAnOicpIGNvbG9ucysrO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgbGVuOiAxK2NvbG9ucywgdG9rZW46IFwiYmFyX2xlZnRfcmVwZWF0XCJ9O1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHJldHVybiB7bGVuOiAxLCB0b2tlbjogXCJiYXJfdGhpblwifTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIHtsZW46IDB9O1xuXHR9O1xuXG5cdC8vIHRoaXMgcmV0dXJucyBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgbGVnYWxDaGFycyBzdHJpbmdcblx0dGhpcy5nZXRUb2tlbk9mID0gZnVuY3Rpb24oc3RyLCBsZWdhbENoYXJzKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChsZWdhbENoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChpKSkgPCAwKVxuXHRcdFx0XHRyZXR1cm4ge2xlbjogaSwgdG9rZW46IHN0ci5zdWJzdHJpbmcoMCwgaSl9O1xuXHRcdH1cblx0XHRyZXR1cm4ge2xlbjogaSwgdG9rZW46IHN0cn07XG5cdH07XG5cblx0dGhpcy5nZXRUb2tlbiA9IGZ1bmN0aW9uKHN0ciwgc3RhcnQsIGVuZCkge1xuXHRcdC8vIFRoaXMgcmV0dXJucyB0aGUgbmV4dCBzZXQgb2YgY2hhcnMgdGhhdCBkb2Vzbid0IGNvbnRhaW4gc3BhY2VzXG5cdFx0dmFyIGkgPSBzdGFydDtcblx0XHR3aGlsZSAoaSA8IGVuZCAmJiAhdGhpcy5pc1doaXRlU3BhY2Uoc3RyLmNoYXJBdChpKSkpXG5cdFx0XHRpKys7XG5cdFx0cmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuXHR9O1xuXG5cdC8vIFRoaXMganVzdCBzZWVzIGlmIHRoZSBuZXh0IHRva2VuIGlzIHRoZSB3b3JkIHBhc3NlZCBpbiwgd2l0aCBwb3NzaWJsZSBsZWFkaW5nIHNwYWNlc1xuXHR0aGlzLmlzTWF0Y2ggPSBmdW5jdGlvbihzdHIsIG1hdGNoKSB7XG5cdFx0dmFyIGkgPSB0aGlzLnNraXBXaGl0ZVNwYWNlKHN0cik7XG5cdFx0aWYgKGZpbmlzaGVkKHN0ciwgaSkpXG5cdFx0XHRyZXR1cm4gMDtcblx0XHRpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChzdHIuc3Vic3RyaW5nKGkpLCBtYXRjaCkpXG5cdFx0XHRyZXR1cm4gaSttYXRjaC5sZW5ndGg7XG5cdFx0cmV0dXJuIDA7XG5cdH07XG5cblx0dGhpcy5nZXRQaXRjaEZyb21Ub2tlbnMgPSBmdW5jdGlvbih0b2tlbnMpIHtcblx0XHR2YXIgcmV0ID0geyB9O1xuXHRcdHZhciBwaXRjaGVzID0ge0E6IDUsIEI6IDYsIEM6IDAsIEQ6IDEsIEU6IDIsIEY6IDMsIEc6IDQsIGE6IDEyLCBiOiAxMywgYzogNywgZDogOCwgZTogOSwgZjogMTAsIGc6IDExfTtcblx0XHRyZXQucG9zaXRpb24gPSBwaXRjaGVzW3Rva2Vuc1swXS50b2tlbl07XG5cdFx0aWYgKHJldC5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0cmV0dXJuIHsgd2FybjogXCJQaXRjaCBleHBlY3RlZC4gRm91bmQ6IFwiICsgdG9rZW5zWzBdLnRva2VuIH07XG5cdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0d2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcblx0XHRcdHN3aXRjaCAodG9rZW5zWzBdLnRva2VuKSB7XG5cdFx0XHRcdGNhc2UgJywnOiByZXQucG9zaXRpb24gLT0gNzsgdG9rZW5zLnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdcXCcnOiByZXQucG9zaXRpb24gKz0gNzsgdG9rZW5zLnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdHRoaXMuZ2V0S2V5QWNjaWRlbnRhbHMyID0gZnVuY3Rpb24odG9rZW5zKSB7XG5cdFx0dmFyIGFjY3M7XG5cdFx0Ly8gZmluZCBhbmQgc3RyaXAgb2ZmIGFsbCBhY2NpZGVudGFscyBpbiB0aGUgdG9rZW4gbGlzdFxuXHRcdHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0dmFyIGFjYztcblx0XHRcdGlmICh0b2tlbnNbMF0udG9rZW4gPT09ICdeJykge1xuXHRcdFx0XHRhY2MgPSAnc2hhcnAnO1xuXHRcdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiB7YWNjczogYWNjcywgd2FybjogJ0V4cGVjdGVkIG5vdGUgbmFtZSBhZnRlciAnICsgYWNjfTtcblx0XHRcdFx0c3dpdGNoICh0b2tlbnNbMF0udG9rZW4pIHtcblx0XHRcdFx0XHRjYXNlICdeJzogYWNjID0gJ2RibHNoYXJwJzsgdG9rZW5zLnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJy8nOiBhY2MgPSAncXVhcnRlcnNoYXJwJzsgdG9rZW5zLnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJz0nKSB7XG5cdFx0XHRcdGFjYyA9ICduYXR1cmFsJztcblx0XHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJ18nKSB7XG5cdFx0XHRcdGFjYyA9ICdmbGF0Jztcblx0XHRcdFx0dG9rZW5zLnNoaWZ0KCk7XG5cdFx0XHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4ge2FjY3M6IGFjY3MsIHdhcm46ICdFeHBlY3RlZCBub3RlIG5hbWUgYWZ0ZXIgJyArIGFjY307XG5cdFx0XHRcdHN3aXRjaCAodG9rZW5zWzBdLnRva2VuKSB7XG5cdFx0XHRcdFx0Y2FzZSAnXyc6IGFjYyA9ICdkYmxmbGF0JzsgdG9rZW5zLnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJy8nOiBhY2MgPSAncXVhcnRlcmZsYXQnOyB0b2tlbnMuc2hpZnQoKTsgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vdCBhbiBhY2NpZGVudGFsLCB3ZSdsbCBhc3N1bWUgdGhhdCBhIGxhdGVyIHBhcnNlIHdpbGwgcmVjb2duaXplIGl0LlxuXHRcdFx0XHRyZXR1cm4geyBhY2NzOiBhY2NzIH07XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHthY2NzOiBhY2NzLCB3YXJuOiAnRXhwZWN0ZWQgbm90ZSBuYW1lIGFmdGVyICcgKyBhY2N9O1xuXHRcdFx0c3dpdGNoICh0b2tlbnNbMF0udG9rZW4uY2hhckF0KDApKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlICdhJzpcblx0XHRcdFx0Y2FzZSAnYic6XG5cdFx0XHRcdGNhc2UgJ2MnOlxuXHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0Y2FzZSAnZSc6XG5cdFx0XHRcdGNhc2UgJ2YnOlxuXHRcdFx0XHRjYXNlICdnJzpcblx0XHRcdFx0Y2FzZSAnQSc6XG5cdFx0XHRcdGNhc2UgJ0InOlxuXHRcdFx0XHRjYXNlICdDJzpcblx0XHRcdFx0Y2FzZSAnRCc6XG5cdFx0XHRcdGNhc2UgJ0UnOlxuXHRcdFx0XHRjYXNlICdGJzpcblx0XHRcdFx0Y2FzZSAnRyc6XG5cdFx0XHRcdFx0aWYgKGFjY3MgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdGFjY3MgPSBbXTtcblx0XHRcdFx0XHRhY2NzLnB1c2goeyBhY2M6IGFjYywgbm90ZTogdG9rZW5zWzBdLnRva2VuLmNoYXJBdCgwKSB9KTtcblx0XHRcdFx0XHRpZiAodG9rZW5zWzBdLnRva2VuLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRcdHRva2Vucy5zaGlmdCgpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRva2Vuc1swXS50b2tlbiA9IHRva2Vuc1swXS50b2tlbi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmV0dXJuIHthY2NzOiBhY2NzLCB3YXJuOiAnRXhwZWN0ZWQgbm90ZSBuYW1lIGFmdGVyICcgKyBhY2MgKyAnIEZvdW5kOiAnICsgdG9rZW5zWzBdLnRva2VuIH07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7IGFjY3M6IGFjY3MgfTtcblx0fTtcblxuXHQvLyBUaGlzIGdldHMgYW4gYWNjaWRlbnRhbCBtYXJraW5nIGZvciB0aGUga2V5IHNpZ25hdHVyZS4gSXQgaGFzIHRoZSBhY2NpZGVudGFsIHRoZW4gdGhlIHBpdGNoIGxldHRlci5cblx0dGhpcy5nZXRLZXlBY2NpZGVudGFsID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIGFjY1RyYW5zbGF0aW9uID0ge1xuXHRcdFx0J14nOiAnc2hhcnAnLFxuXHRcdFx0J15eJzogJ2RibHNoYXJwJyxcblx0XHRcdCc9JzogJ25hdHVyYWwnLFxuXHRcdFx0J18nOiAnZmxhdCcsXG5cdFx0XHQnX18nOiAnZGJsZmxhdCcsXG5cdFx0XHQnXy8nOiAncXVhcnRlcmZsYXQnLFxuXHRcdFx0J14vJzogJ3F1YXJ0ZXJzaGFycCdcblx0XHR9O1xuXHRcdHZhciBpID0gdGhpcy5za2lwV2hpdGVTcGFjZShzdHIpO1xuXHRcdGlmIChmaW5pc2hlZChzdHIsIGkpKVxuXHRcdFx0cmV0dXJuIHtsZW46IDB9O1xuXHRcdHZhciBhY2MgPSBudWxsO1xuXHRcdHN3aXRjaCAoc3RyLmNoYXJBdChpKSlcblx0XHR7XG5cdFx0XHRjYXNlICdeJzpcblx0XHRcdGNhc2UgJ18nOlxuXHRcdFx0Y2FzZSAnPSc6XG5cdFx0XHRcdGFjYyA9IHN0ci5jaGFyQXQoaSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpyZXR1cm4ge2xlbjogMH07XG5cdFx0fVxuXHRcdGkrKztcblx0XHRpZiAoZmluaXNoZWQoc3RyLCBpKSlcblx0XHRcdHJldHVybiB7bGVuOiAxLCB3YXJuOiAnRXhwZWN0ZWQgbm90ZSBuYW1lIGFmdGVyIGFjY2lkZW50YWwnfTtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpXG5cdFx0e1xuXHRcdFx0Y2FzZSAnYSc6XG5cdFx0XHRjYXNlICdiJzpcblx0XHRcdGNhc2UgJ2MnOlxuXHRcdFx0Y2FzZSAnZCc6XG5cdFx0XHRjYXNlICdlJzpcblx0XHRcdGNhc2UgJ2YnOlxuXHRcdFx0Y2FzZSAnZyc6XG5cdFx0XHRjYXNlICdBJzpcblx0XHRcdGNhc2UgJ0InOlxuXHRcdFx0Y2FzZSAnQyc6XG5cdFx0XHRjYXNlICdEJzpcblx0XHRcdGNhc2UgJ0UnOlxuXHRcdFx0Y2FzZSAnRic6XG5cdFx0XHRjYXNlICdHJzpcblx0XHRcdFx0cmV0dXJuIHtsZW46IGkrMSwgdG9rZW46IHthY2M6IGFjY1RyYW5zbGF0aW9uW2FjY10sIG5vdGU6IHN0ci5jaGFyQXQoaSl9fTtcblx0XHRcdGNhc2UgJ14nOlxuXHRcdFx0Y2FzZSAnXyc6XG5cdFx0XHRjYXNlICcvJzpcblx0XHRcdFx0YWNjICs9IHN0ci5jaGFyQXQoaSk7XG5cdFx0XHRcdGkrKztcblx0XHRcdFx0aWYgKGZpbmlzaGVkKHN0ciwgaSkpXG5cdFx0XHRcdFx0cmV0dXJuIHtsZW46IDIsIHdhcm46ICdFeHBlY3RlZCBub3RlIG5hbWUgYWZ0ZXIgYWNjaWRlbnRhbCd9O1xuXHRcdFx0XHRzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjYXNlICdhJzpcblx0XHRcdFx0XHRjYXNlICdiJzpcblx0XHRcdFx0XHRjYXNlICdjJzpcblx0XHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRjYXNlICdlJzpcblx0XHRcdFx0XHRjYXNlICdmJzpcblx0XHRcdFx0XHRjYXNlICdnJzpcblx0XHRcdFx0XHRjYXNlICdBJzpcblx0XHRcdFx0XHRjYXNlICdCJzpcblx0XHRcdFx0XHRjYXNlICdDJzpcblx0XHRcdFx0XHRjYXNlICdEJzpcblx0XHRcdFx0XHRjYXNlICdFJzpcblx0XHRcdFx0XHRjYXNlICdGJzpcblx0XHRcdFx0XHRjYXNlICdHJzpcblx0XHRcdFx0XHRcdHJldHVybiB7bGVuOiBpKzEsIHRva2VuOiB7YWNjOiBhY2NUcmFuc2xhdGlvblthY2NdLCBub3RlOiBzdHIuY2hhckF0KGkpfX07XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiB7bGVuOiAyLCB3YXJuOiAnRXhwZWN0ZWQgbm90ZSBuYW1lIGFmdGVyIGFjY2lkZW50YWwnfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB7bGVuOiAxLCB3YXJuOiAnRXhwZWN0ZWQgbm90ZSBuYW1lIGFmdGVyIGFjY2lkZW50YWwnfTtcblx0XHR9XG5cdH07XG5cblx0dGhpcy5pc1doaXRlU3BhY2UgPSBmdW5jdGlvbihjaCkge1xuXHRcdHJldHVybiBjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJ1xceDEyJztcblx0fTtcblxuXHR0aGlzLmdldE1lYXQgPSBmdW5jdGlvbihsaW5lLCBzdGFydCwgZW5kKSB7XG5cdFx0Ly8gVGhpcyByZW1vdmVzIGFueSBjb21tZW50cyBzdGFydGluZyB3aXRoICclJyBhbmQgdHJpbXMgdGhlIGVuZHMgb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRoZXJlIGFyZSBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cblx0XHQvLyBpdCByZXR1cm5zIGp1c3QgdGhlIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVycyB0aGF0IGNvbnRhaW4gdGhlIG1lYXQuXG5cdFx0dmFyIGNvbW1lbnQgPSBsaW5lLmluZGV4T2YoJyUnLCBzdGFydCk7XG5cdFx0aWYgKGNvbW1lbnQgPj0gMCAmJiBjb21tZW50IDwgZW5kKVxuXHRcdFx0ZW5kID0gY29tbWVudDtcblx0XHR3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKGxpbmUuY2hhckF0KHN0YXJ0KSA9PT0gJyAnIHx8IGxpbmUuY2hhckF0KHN0YXJ0KSA9PT0gJ1xcdCcgfHwgbGluZS5jaGFyQXQoc3RhcnQpID09PSAnXFx4MTInKSlcblx0XHRcdHN0YXJ0Kys7XG5cdFx0d2hpbGUgKHN0YXJ0IDwgZW5kICYmIChsaW5lLmNoYXJBdChlbmQtMSkgPT09ICcgJyB8fCBsaW5lLmNoYXJBdChlbmQtMSkgPT09ICdcXHQnIHx8IGxpbmUuY2hhckF0KGVuZC0xKSA9PT0gJ1xceDEyJykpXG5cdFx0XHRlbmQtLTtcblx0XHRyZXR1cm4ge3N0YXJ0OiBzdGFydCwgZW5kOiBlbmR9O1xuXHR9O1xuXG5cdHZhciBpc0xldHRlciA9IGZ1bmN0aW9uKGNoKSB7XG5cdFx0cmV0dXJuIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7XG5cdH07XG5cblx0dmFyIGlzTnVtYmVyID0gZnVuY3Rpb24oY2gpIHtcblx0XHRyZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpO1xuXHR9O1xuXG5cdHRoaXMudG9rZW5pemUgPSBmdW5jdGlvbihsaW5lLCBzdGFydCwgZW5kLCBhbHBoYVVudGlsV2hpdGVTcGFjZSkge1xuXHRcdC8vIHRoaXMgcmV0dXJucyBhbGwgdGhlIHRva2VucyBpbnNpZGUgdGhlIHBhc3NlZCBzdHJpbmcuIEEgdG9rZW4gaXMgYSBwdW5jdHVhdGlvbiBtYXJrLCBhIHN0cmluZyBvZiBkaWdpdHMsIGEgc3RyaW5nIG9mIGxldHRlcnMuXG5cdFx0Ly8gIFF1b3RlZCBzdHJpbmdzIGFyZSBvbmUgdG9rZW4uXG5cdFx0Ly8gIElmIHRoZXJlIGlzIGEgbWludXMgc2lnbiBuZXh0IHRvIGEgbnVtYmVyLCB0aGVuIGl0IGlzIGluY2x1ZGVkIGluIHRoZSBudW1iZXIuXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYSBwZXJpb2QgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBudW1iZXIsIHdpdGggYSBudW1iZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nLCB0aGVuIGEgZmxvYXQgaXMgcmV0dXJuZWQuXG5cdFx0Ly8gVGhlIHR5cGUgb2YgdG9rZW4gaXMgcmV0dXJuZWQ6IHF1b3RlLCBhbHBoYSwgbnVtYmVyLCBwdW5jdFxuXHRcdC8vIElmIGFscGhhVW50aWxXaGl0ZVNwYWNlIGlzIHRydWUsIHRoZW4gdGhlIGJlaGF2aW9yIG9mIHRoZSBhbHBoYSB0b2tlbiBjaGFuZ2VzLlxuXG5cdFx0dmFyIHJldCA9IHRoaXMuZ2V0TWVhdChsaW5lLCBzdGFydCwgZW5kKTtcblx0XHRzdGFydCA9IHJldC5zdGFydDtcblx0XHRlbmQgPSByZXQuZW5kO1xuXHRcdHZhciB0b2tlbnMgPSBbXTtcblx0XHR2YXIgaTtcblx0XHR3aGlsZSAoc3RhcnQgPCBlbmQpIHtcblx0XHRcdGlmIChsaW5lLmNoYXJBdChzdGFydCkgPT09ICdcIicpIHtcblx0XHRcdFx0aSA9IHN0YXJ0KzE7XG5cdFx0XHRcdHdoaWxlIChpIDwgZW5kICYmIGxpbmUuY2hhckF0KGkpICE9PSAnXCInKSBpKys7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHsgdHlwZTogJ3F1b3RlJywgdG9rZW46IGxpbmUuc3Vic3RyaW5nKHN0YXJ0KzEsIGkpLCBzdGFydDogc3RhcnQrMSwgZW5kOiBpfSk7XG5cdFx0XHRcdGkrKztcblx0XHRcdH0gZWxzZSBpZiAoaXNMZXR0ZXIobGluZS5jaGFyQXQoc3RhcnQpKSkge1xuXHRcdFx0XHRpID0gc3RhcnQrMTtcblx0XHRcdFx0aWYgKGFscGhhVW50aWxXaGl0ZVNwYWNlKVxuXHRcdFx0XHRcdHdoaWxlIChpIDwgZW5kICYmICF0aGlzLmlzV2hpdGVTcGFjZShsaW5lLmNoYXJBdChpKSkpIGkrKztcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHdoaWxlIChpIDwgZW5kICYmIGlzTGV0dGVyKGxpbmUuY2hhckF0KGkpKSkgaSsrO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7IHR5cGU6ICdhbHBoYScsIHRva2VuOiBsaW5lLnN1YnN0cmluZyhzdGFydCwgaSksIGNvbnRpbnVlSWQ6IGlzTnVtYmVyKGxpbmUuY2hhckF0KGkpKSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGl9KTtcblx0XHRcdFx0c3RhcnQgPSBpICsgMTtcblx0XHRcdH0gZWxzZSBpZiAobGluZS5jaGFyQXQoc3RhcnQpID09PSAnLicgJiYgaXNOdW1iZXIobGluZS5jaGFyQXQoaSsxKSkpIHtcblx0XHRcdFx0aSA9IHN0YXJ0KzE7XG5cdFx0XHRcdHZhciBpbnQyID0gbnVsbDtcblx0XHRcdFx0dmFyIGZsb2F0MiA9IG51bGw7XG5cdFx0XHRcdHdoaWxlIChpIDwgZW5kICYmIGlzTnVtYmVyKGxpbmUuY2hhckF0KGkpKSkgaSsrO1xuXG5cdFx0XHRcdGZsb2F0MiA9IHBhcnNlRmxvYXQobGluZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goeyB0eXBlOiAnbnVtYmVyJywgdG9rZW46IGxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBpKSwgaW50dDogaW50MiwgZmxvYXR0OiBmbG9hdDIsIGNvbnRpbnVlSWQ6IGlzTGV0dGVyKGxpbmUuY2hhckF0KGkpKSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGl9KTtcblx0XHRcdFx0c3RhcnQgPSBpICsgMTtcblx0XHRcdH0gZWxzZSBpZiAoaXNOdW1iZXIobGluZS5jaGFyQXQoc3RhcnQpKSB8fCAobGluZS5jaGFyQXQoc3RhcnQpID09PSAnLScgJiYgaXNOdW1iZXIobGluZS5jaGFyQXQoaSsxKSkpKSB7XG5cdFx0XHRcdGkgPSBzdGFydCsxO1xuXHRcdFx0XHR2YXIgaW50dCA9IG51bGw7XG5cdFx0XHRcdHZhciBmbG9hdHQgPSBudWxsO1xuXHRcdFx0XHR3aGlsZSAoaSA8IGVuZCAmJiBpc051bWJlcihsaW5lLmNoYXJBdChpKSkpIGkrKztcblx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KGkpID09PSAnLicgJiYgaXNOdW1iZXIobGluZS5jaGFyQXQoaSsxKSkpIHtcblx0XHRcdFx0XHRpKys7XG5cdFx0XHRcdFx0d2hpbGUgKGkgPCBlbmQgJiYgaXNOdW1iZXIobGluZS5jaGFyQXQoaSkpKSBpKys7XG5cdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdGludHQgPSBwYXJzZUludChsaW5lLnN1YnN0cmluZyhzdGFydCwgaSkpO1xuXG5cdFx0XHRcdGZsb2F0dCA9IHBhcnNlRmxvYXQobGluZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goeyB0eXBlOiAnbnVtYmVyJywgdG9rZW46IGxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBpKSwgaW50dDogaW50dCwgZmxvYXR0OiBmbG9hdHQsIGNvbnRpbnVlSWQ6IGlzTGV0dGVyKGxpbmUuY2hhckF0KGkpKSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGl9KTtcblx0XHRcdFx0c3RhcnQgPSBpICsgMTtcblx0XHRcdH0gZWxzZSBpZiAobGluZS5jaGFyQXQoc3RhcnQpID09PSAnICcgfHwgbGluZS5jaGFyQXQoc3RhcnQpID09PSAnXFx0Jykge1xuXHRcdFx0XHRpID0gc3RhcnQrMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHsgdHlwZTogJ3B1bmN0JywgdG9rZW46IGxpbmUuY2hhckF0KHN0YXJ0KSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IHN0YXJ0KzF9KTtcblx0XHRcdFx0aSA9IHN0YXJ0KzE7XG5cdFx0XHR9XG5cdFx0XHRzdGFydCA9IGk7XG5cdFx0fVxuXHRcdHJldHVybiB0b2tlbnM7XG5cdH07XG5cblx0dGhpcy5nZXRWb2ljZVRva2VuID0gZnVuY3Rpb24obGluZSwgc3RhcnQsIGVuZCkge1xuXHRcdC8vIFRoaXMgZmluZHMgdGhlIG5leHQgdG9rZW4uIEEgdG9rZW4gaXMgZGVsaW1pdGVkIGJ5IGEgc3BhY2Ugb3IgYW4gZXF1YWwgc2lnbi4gSWYgaXQgc3RhcnRzIHdpdGggYSBxdW90ZSwgdGhlbiB0aGUgcG9ydGlvbiBiZXR3ZWVuIHRoZSBxdW90ZXMgaXMgcmV0dXJuZWQuXG5cdFx0dmFyIGkgPSBzdGFydDtcblx0XHR3aGlsZSAoaSA8IGVuZCAmJiB0aGlzLmlzV2hpdGVTcGFjZShsaW5lLmNoYXJBdChpKSkgfHwgbGluZS5jaGFyQXQoaSkgPT09ICc9Jylcblx0XHRcdGkrKztcblxuXHRcdGlmIChsaW5lLmNoYXJBdChpKSA9PT0gJ1wiJykge1xuXHRcdFx0dmFyIGNsb3NlID0gbGluZS5pbmRleE9mKCdcIicsIGkrMSk7XG5cdFx0XHRpZiAoY2xvc2UgPT09IC0xIHx8IGNsb3NlID49IGVuZClcblx0XHRcdFx0cmV0dXJuIHtsZW46IDEsIGVycjogXCJNaXNzaW5nIGNsb3NlIHF1b3RlXCJ9O1xuXHRcdFx0cmV0dXJuIHtsZW46IGNsb3NlLXN0YXJ0KzEsIHRva2VuOiB0aGlzLnRyYW5zbGF0ZVN0cmluZyhsaW5lLnN1YnN0cmluZyhpKzEsIGNsb3NlKSl9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgaWkgPSBpO1xuXHRcdFx0d2hpbGUgKGlpIDwgZW5kICYmICF0aGlzLmlzV2hpdGVTcGFjZShsaW5lLmNoYXJBdChpaSkpICYmIGxpbmUuY2hhckF0KGlpKSAhPT0gJz0nKVxuXHRcdFx0XHRpaSsrO1xuXHRcdFx0cmV0dXJuIHtsZW46IGlpLXN0YXJ0KzEsIHRva2VuOiBsaW5lLnN1YnN0cmluZyhpLCBpaSl9O1xuXHRcdH1cblx0fTtcblxuXHR2YXIgY2hhck1hcCA9IHtcblx0XHRcImBhXCI6ICfDoCcsIFwiJ2FcIjogXCLDoVwiLCBcIl5hXCI6IFwiw6JcIiwgXCJ+YVwiOiBcIsOjXCIsIFwiXFxcImFcIjogXCLDpFwiLCBcIm9hXCI6IFwiw6VcIiwgXCJhYVwiOiBcIsOlXCIsIFwiPWFcIjogXCLEgVwiLCBcInVhXCI6IFwixINcIiwgXCI7YVwiOiBcIsSFXCIsXG5cdFx0XCJgZVwiOiAnw6gnLCBcIidlXCI6IFwiw6lcIiwgXCJeZVwiOiBcIsOqXCIsIFwiXFxcImVcIjogXCLDq1wiLCBcIj1lXCI6IFwixJNcIiwgXCJ1ZVwiOiBcIsSVXCIsIFwiO2VcIjogXCLEmVwiLCBcIi5lXCI6IFwixJdcIixcblx0XHRcImBpXCI6ICfDrCcsIFwiJ2lcIjogXCLDrVwiLCBcIl5pXCI6IFwiw65cIiwgXCJcXFwiaVwiOiBcIsOvXCIsIFwiPWlcIjogXCLEq1wiLCBcInVpXCI6IFwixK1cIiwgXCI7aVwiOiBcIsSvXCIsXG5cdFx0XCJgb1wiOiAnw7InLCBcIidvXCI6IFwiw7NcIiwgXCJeb1wiOiBcIsO0XCIsIFwifm9cIjogXCLDtVwiLCBcIlxcXCJvXCI6IFwiw7ZcIiwgXCI9b1wiOiBcIsWNXCIsIFwidW9cIjogXCLFj1wiLCBcIi9vXCI6IFwiw7hcIixcblx0XHRcImB1XCI6ICfDuScsIFwiJ3VcIjogXCLDulwiLCBcIl51XCI6IFwiw7tcIiwgXCJ+dVwiOiBcIsWpXCIsIFwiXFxcInVcIjogXCLDvFwiLCBcIm91XCI6IFwixa9cIiwgXCI9dVwiOiBcIsWrXCIsIFwidXVcIjogXCLFrVwiLCBcIjt1XCI6IFwixbNcIixcblx0XHRcImBBXCI6ICfDgCcsIFwiJ0FcIjogXCLDgVwiLCBcIl5BXCI6IFwiw4JcIiwgXCJ+QVwiOiBcIsODXCIsIFwiXFxcIkFcIjogXCLDhFwiLCBcIm9BXCI6IFwiw4VcIiwgXCJBQVwiOiBcIsOFXCIsIFwiPUFcIjogXCLEgFwiLCBcInVBXCI6IFwixIJcIiwgXCI7QVwiOiBcIsSEXCIsXG5cdFx0XCJgRVwiOiAnw4gnLCBcIidFXCI6IFwiw4lcIiwgXCJeRVwiOiBcIsOKXCIsIFwiXFxcIkVcIjogXCLDi1wiLCBcIj1FXCI6IFwixJJcIiwgXCJ1RVwiOiBcIsSUXCIsIFwiO0VcIjogXCLEmFwiLCBcIi5FXCI6IFwixJZcIixcblx0XHRcImBJXCI6ICfDjCcsIFwiJ0lcIjogXCLDjVwiLCBcIl5JXCI6IFwiw45cIiwgXCJ+SVwiOiBcIsSoXCIsIFwiXFxcIklcIjogXCLDj1wiLCBcIj1JXCI6IFwixKpcIiwgXCJ1SVwiOiBcIsSsXCIsIFwiO0lcIjogXCLErlwiLCBcIi5JXCI6IFwixLBcIixcblx0XHRcImBPXCI6ICfDkicsIFwiJ09cIjogXCLDk1wiLCBcIl5PXCI6IFwiw5RcIiwgXCJ+T1wiOiBcIsOVXCIsIFwiXFxcIk9cIjogXCLDllwiLCBcIj1PXCI6IFwixYxcIiwgXCJ1T1wiOiBcIsWOXCIsIFwiL09cIjogXCLDmFwiLFxuXHRcdFwiYFVcIjogJ8OZJywgXCInVVwiOiBcIsOaXCIsIFwiXlVcIjogXCLDm1wiLCBcIn5VXCI6IFwixahcIiwgXCJcXFwiVVwiOiBcIsOcXCIsIFwib1VcIjogXCLFrlwiLCBcIj1VXCI6IFwixapcIiwgXCJ1VVwiOiBcIsWsXCIsIFwiO1VcIjogXCLFslwiLFxuXHRcdFwiYWVcIjogXCLDplwiLCBcIkFFXCI6IFwiw4ZcIiwgXCJvZVwiOiBcIsWTXCIsIFwiT0VcIjogXCLFklwiLCBcInNzXCI6IFwiw59cIixcblx0XHRcIidjXCI6IFwixIdcIiwgXCJeY1wiOiBcIsSJXCIsIFwidWNcIjogXCLEjVwiLCBcImNjXCI6IFwiw6dcIiwgXCIuY1wiOiBcIsSLXCIsIFwiY0NcIjogXCLDh1wiLCBcIidDXCI6IFwixIZcIiwgXCJeQ1wiOiBcIsSIXCIsIFwidUNcIjogXCLEjFwiLCBcIi5DXCI6IFwixIpcIixcblx0XHRcIn5OXCI6IFwiw5FcIiwgXCJ+blwiOiBcIsOxXCIsXG5cdFx0XCI9c1wiOiBcIsWhXCIsIFwidnNcIjogXCLFoVwiLFxuXHRcdFwiREhcIjogXCLDkFwiLCBcImRoXCI6IFwiw7BcIixcblx0XHRcIkhPXCI6IFwixZBcIiwgXCJIb1wiOiBcIsWRXCIsIFwiSFVcIjogXCLFsFwiLCBcIkh1XCI6IFwixbFcIixcblx0XHRcIidZXCI6IFwiw51cIiwgXCIneVwiOiBcIsO9XCIsIFwiXllcIjogXCLFtlwiLCBcIl55XCI6IFwixbdcIiwgXCJcXFwiWVwiOiBcIsW4XCIsIFwiXFxcInlcIjogXCLDv1wiLFxuXHRcdFwidlNcIjogXCLFoFwiLCBcInZaXCI6IFwixb1cIiwgXCJ2elwiOiAnxb4nXG5cbi8vIE1vcmUgY2hhcnM6IMSyIMSzIMSOIMSPIMSQIMSRIMScIMSdIMSeIMSfIMSgIMShIMSiIMSjIMSkIMSlIMSmIMSnIMS0IMS1IMS2IMS3IMS4IMS5IMS6IMS7IMS8IMS9IMS+IMS/IMWAIMWBIMWCIMWDIMWEIMWFIMWGIMWHIMWIIMWJIMWKIMWLIMWUIMWVIMWWIMWXIMWYIMWZIMWaIMWbIMWcIMWdIMWeIMWfIMWgIMWiIMWjIMWkIMWlIMWmIMWnIMW0IMW1IMW5IMW6IMW7IMW8IMW9XG5cdH07XG5cdHZhciBjaGFyTWFwMSA9IHtcblx0XHRcIiNcIjogXCLima9cIixcblx0XHRcImJcIjogXCLima1cIixcblx0XHRcIj1cIjogXCLima5cIlxuXHR9O1xuXHR2YXIgY2hhck1hcDIgPSB7XG5cdFx0XCIyMDFcIjogXCLima9cIixcblx0XHRcIjIwMlwiOiBcIuKZrVwiLFxuXHRcdFwiMjAzXCI6IFwi4pmuXCIsXG5cdFx0XCIyNDFcIjogXCLCoVwiLFxuXHRcdFwiMjQyXCI6IFwiwqJcIiwgXCIyNTJcIjogXCJhXCIsIFwiMjYyXCI6IFwiMlwiLCBcIjI3MlwiOiBcIm9cIiwgXCIzMDJcIjogXCLDglwiLCBcIjMxMlwiOiBcIsOKXCIsIFwiMzIyXCI6IFwiw5JcIiwgXCIzMzJcIjogXCLDmlwiLCBcIjM0MlwiOiBcIsOiXCIsIFwiMzUyXCI6IFwiw6pcIiwgXCIzNjJcIjogXCLDslwiLCBcIjM3MlwiOiBcIsO6XCIsXG5cdFx0XCIyNDNcIjogXCLCo1wiLCBcIjI1M1wiOiBcIsKrXCIsIFwiMjYzXCI6IFwiM1wiLCBcIjI3M1wiOiBcIsK7XCIsIFwiMzAzXCI6IFwiw4NcIiwgXCIzMTNcIjogXCLDi1wiLCBcIjMyM1wiOiBcIsOTXCIsIFwiMzMzXCI6IFwiw5tcIiwgXCIzNDNcIjogXCLDo1wiLCBcIjM1M1wiOiBcIsOrXCIsIFwiMzYzXCI6IFwiw7NcIiwgXCIzNzNcIjogXCLDu1wiLFxuXHRcdFwiMjQ0XCI6IFwiwqRcIiwgXCIyNTRcIjogXCLCrFwiLCBcIjI2NFwiOiBcIiAgzIFcIiwgXCIyNzRcIjogXCIx4oGENFwiLCBcIjMwNFwiOiBcIsOEXCIsIFwiMzE0XCI6IFwiw4xcIiwgXCIzMjRcIjogXCLDlFwiLCBcIjMzNFwiOiBcIsOcXCIsIFwiMzQ0XCI6IFwiw6RcIiwgXCIzNTRcIjogXCLDrFwiLCBcIjM2NFwiOiBcIsO0XCIsIFwiMzc0XCI6IFwiw7xcIixcblx0XHRcIjI0NVwiOiBcIsKlXCIsIFwiMjU1XCI6IFwiLVwiLCBcIjI2NVwiOiBcIs68XCIsIFwiMjc1XCI6IFwiMeKBhDJcIiwgXCIzMDVcIjogXCLDhVwiLCBcIjMxNVwiOiBcIsONXCIsIFwiMzI1XCI6IFwiw5VcIiwgXCIzMzVcIjogXCLDnVwiLCAgXCIzNDVcIjogXCLDpVwiLCBcIjM1NVwiOiBcIsOtXCIsIFwiMzY1XCI6IFwiw7VcIiwgXCIzNzVcIjogXCLDvVwiLFxuXHRcdFwiMjQ2XCI6IFwiwqZcIiwgXCIyNTZcIjogXCLCrlwiLCBcIjI2NlwiOiBcIsK2XCIsIFwiMjc2XCI6IFwiM+KBhDRcIiwgXCIzMDZcIjogXCLDhlwiLCBcIjMxNlwiOiBcIsOOXCIsIFwiMzI2XCI6IFwiw5ZcIiwgXCIzMzZcIjogXCLDnlwiLCBcIjM0NlwiOiBcIsOmXCIsIFwiMzU2XCI6IFwiw65cIiwgXCIzNjZcIjogXCLDtlwiLCBcIjM3NlwiOiBcIsO+XCIsXG5cdFx0XCIyNDdcIjogXCLCp1wiLCBcIjI1N1wiOiBcIiDMhFwiLCBcIjI2N1wiOiBcIsK3XCIsIFwiMjc3XCI6IFwiwr9cIiwgXCIzMDdcIjogXCLDh1wiLCBcIjMxN1wiOiBcIsOPXCIsIFwiMzI3XCI6IFwiw5dcIiwgXCIzMzdcIjogXCLDn1wiLCBcIjM0N1wiOiBcIsOnXCIsIFwiMzU3XCI6IFwiw69cIiwgXCIzNjdcIjogXCLDt1wiLCBcIjM3N1wiOiBcIsO/XCIsXG5cdFx0XCIyNTBcIjogXCIgzIhcIiwgXCIyNjBcIjogXCLCsFwiLCBcIjI3MFwiOiBcIiDMp1wiLCBcIjMwMFwiOiBcIsOAXCIsIFwiMzEwXCI6IFwiw4hcIiwgXCIzMjBcIjogXCLDkFwiLCBcIjMzMFwiOiBcIsOYXCIsIFwiMzQwXCI6IFwiw6BcIiwgXCIzNTBcIjogXCLDqFwiLCBcIjM2MFwiOiBcIsOwXCIsIFwiMzcwXCI6IFwiw7hcIixcblx0XHRcIjI1MVwiOiBcIsKpXCIsIFwiMjYxXCI6IFwiwrFcIiwgXCIyNzFcIjogXCIxXCIsIFwiMzAxXCI6IFwiw4FcIiwgXCIzMTFcIjogXCLDiVwiLCBcIjMyMVwiOiBcIsORXCIsIFwiMzMxXCI6IFwiw5lcIiwgXCIzNDFcIjogXCLDoVwiLCBcIjM1MVwiOiBcIsOpXCIsIFwiMzYxXCI6IFwiw7FcIiwgXCIzNzFcIjogXCLDuVwiIH07XG5cdHRoaXMudHJhbnNsYXRlU3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIGFyciA9IHN0ci5zcGxpdCgnXFxcXCcpO1xuXHRcdGlmIChhcnIubGVuZ3RoID09PSAxKSByZXR1cm4gc3RyO1xuXHRcdHZhciBvdXQgPSBudWxsO1xuXHRcdHBhcnNlQ29tbW9uLmVhY2goYXJyLCBmdW5jdGlvbihzKSB7XG5cdFx0XHRpZiAob3V0ID09PSBudWxsKVxuXHRcdFx0XHRvdXQgPSBzO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHZhciBjID0gY2hhck1hcFtzLnN1YnN0cmluZygwLCAyKV07XG5cdFx0XHRcdGlmIChjICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0b3V0ICs9IGMgKyBzLnN1YnN0cmluZygyKTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0YyA9IGNoYXJNYXAyW3Muc3Vic3RyaW5nKDAsIDMpXTtcblx0XHRcdFx0XHRpZiAoYyAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0b3V0ICs9IGMgKyBzLnN1YnN0cmluZygzKTtcblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdGMgPSBjaGFyTWFwMVtzLnN1YnN0cmluZygwLCAxKV07XG5cdFx0XHRcdFx0XHRpZiAoYyAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHRvdXQgKz0gYyArIHMuc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgKz0gXCJcXFxcXCIgKyBzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvdXQ7XG5cdH07XG5cdHRoaXMuZ2V0TnVtYmVyID0gZnVuY3Rpb24obGluZSwgaW5kZXgpIHtcblx0XHR2YXIgbnVtID0gMDtcblx0XHR3aGlsZSAoaW5kZXggPCBsaW5lLmxlbmd0aCkge1xuXHRcdFx0c3dpdGNoIChsaW5lLmNoYXJBdChpbmRleCkpIHtcblx0XHRcdFx0Y2FzZSAnMCc6bnVtID0gbnVtKjEwO2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzEnOm51bSA9IG51bSoxMCsxO2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzInOm51bSA9IG51bSoxMCsyO2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzMnOm51bSA9IG51bSoxMCszO2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzQnOm51bSA9IG51bSoxMCs0O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzUnOm51bSA9IG51bSoxMCs1O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzYnOm51bSA9IG51bSoxMCs2O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzcnOm51bSA9IG51bSoxMCs3O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzgnOm51bSA9IG51bSoxMCs4O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzknOm51bSA9IG51bSoxMCs5O2luZGV4Kys7YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmV0dXJuIHtudW06IG51bSwgaW5kZXg6IGluZGV4fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtudW06IG51bSwgaW5kZXg6IGluZGV4fTtcblx0fTtcblxuXHR0aGlzLmdldEZyYWN0aW9uID0gZnVuY3Rpb24obGluZSwgaW5kZXgpIHtcblx0XHR2YXIgbnVtID0gMTtcblx0XHR2YXIgZGVuID0gMTtcblx0XHRpZiAobGluZS5jaGFyQXQoaW5kZXgpICE9PSAnLycpIHtcblx0XHRcdHZhciByZXQgPSB0aGlzLmdldE51bWJlcihsaW5lLCBpbmRleCk7XG5cdFx0XHRudW0gPSByZXQubnVtO1xuXHRcdFx0aW5kZXggPSByZXQuaW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsaW5lLmNoYXJBdChpbmRleCkgPT09ICcvJykge1xuXHRcdFx0aW5kZXgrKztcblx0XHRcdGlmIChsaW5lLmNoYXJBdChpbmRleCkgPT09ICcvJykge1xuXHRcdFx0XHR2YXIgZGl2ID0gMC41O1xuXHRcdFx0XHR3aGlsZSAobGluZS5jaGFyQXQoaW5kZXgrKykgPT09ICcvJylcblx0XHRcdFx0XHRkaXYgPSBkaXYgLzI7XG5cdFx0XHRcdHJldHVybiB7dmFsdWU6IG51bSAqIGRpdiwgaW5kZXg6IGluZGV4LTF9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGlTYXZlID0gaW5kZXg7XG5cdFx0XHRcdHZhciByZXQyID0gdGhpcy5nZXROdW1iZXIobGluZSwgaW5kZXgpO1xuXHRcdFx0XHRpZiAocmV0Mi5udW0gPT09IDAgJiYgaVNhdmUgPT09IGluZGV4KVx0Ly8gSWYgd2UgZGlkbid0IHVzZSBhbnkgY2hhcmFjdGVycywgaXQgaXMgYW4gaW1wbGllZCAyXG5cdFx0XHRcdFx0cmV0Mi5udW0gPSAyO1xuXHRcdFx0XHRpZiAocmV0Mi5udW0gIT09IDApXG5cdFx0XHRcdFx0ZGVuID0gcmV0Mi5udW07XG5cdFx0XHRcdGluZGV4ID0gcmV0Mi5pbmRleDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge3ZhbHVlOiBudW0vZGVuLCBpbmRleDogaW5kZXh9O1xuXHR9O1xuXG5cdHRoaXMudGhlUmV2ZXJzZXIgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZiAocGFyc2VDb21tb24uZW5kc1dpdGgoc3RyLCBcIiwgVGhlXCIpKVxuXHRcdFx0cmV0dXJuIFwiVGhlIFwiICsgc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoLTUpO1xuXHRcdGlmIChwYXJzZUNvbW1vbi5lbmRzV2l0aChzdHIsIFwiLCBBXCIpKVxuXHRcdFx0cmV0dXJuIFwiQSBcIiArIHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aC0zKTtcblx0XHRyZXR1cm4gc3RyO1xuXHR9O1xuXG5cdHRoaXMuc3RyaXBDb21tZW50ID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIGkgPSBzdHIuaW5kZXhPZignJScpO1xuXHRcdGlmIChpID49IDApXG5cdFx0XHRyZXR1cm4gcGFyc2VDb21tb24uc3RyaXAoc3RyLnN1YnN0cmluZygwLCBpKSk7XG5cdFx0cmV0dXJuIHBhcnNlQ29tbW9uLnN0cmlwKHN0cik7XG5cdH07XG5cblx0dGhpcy5nZXRJbnQgPSBmdW5jdGlvbihzdHIpIHtcblx0XHQvLyBUaGlzIHBhcnNlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgZm9yIGEgbnVtYmVyIGFuZCByZXR1cm5zIHsgdmFsdWU6IG51bSwgZGlnaXRzOiBudW0gfVxuXHRcdC8vIElmIGRpZ2l0cyBpcyAwLCB0aGVuIHRoZSBzdHJpbmcgZGlkbid0IHBvaW50IHRvIGEgbnVtYmVyLlxuXHRcdHZhciB4ID0gcGFyc2VJbnQoc3RyKTtcblx0XHRpZiAoaXNOYU4oeCkpXG5cdFx0XHRyZXR1cm4ge2RpZ2l0czogMH07XG5cdFx0dmFyIHMgPSBcIlwiICsgeDtcblx0XHR2YXIgaSA9IHN0ci5pbmRleE9mKHMpO1x0Ly8gVGhpcyBpcyB0byBhY2NvdW50IGZvciBsZWFkaW5nIHNwYWNlc1xuXHRcdHJldHVybiB7dmFsdWU6IHgsIGRpZ2l0czogaStzLmxlbmd0aH07XG5cdH07XG5cblx0dGhpcy5nZXRGbG9hdCA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdC8vIFRoaXMgcGFyc2VzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBmb3IgYSBudW1iZXIgYW5kIHJldHVybnMgeyB2YWx1ZTogbnVtLCBkaWdpdHM6IG51bSB9XG5cdFx0Ly8gSWYgZGlnaXRzIGlzIDAsIHRoZW4gdGhlIHN0cmluZyBkaWRuJ3QgcG9pbnQgdG8gYSBudW1iZXIuXG5cdFx0dmFyIHggPSBwYXJzZUZsb2F0KHN0cik7XG5cdFx0aWYgKGlzTmFOKHgpKVxuXHRcdFx0cmV0dXJuIHtkaWdpdHM6IDB9O1xuXHRcdHZhciBzID0gXCJcIiArIHg7XG5cdFx0dmFyIGkgPSBzdHIuaW5kZXhPZihzKTtcdC8vIFRoaXMgaXMgdG8gYWNjb3VudCBmb3IgbGVhZGluZyBzcGFjZXNcblx0XHRyZXR1cm4ge3ZhbHVlOiB4LCBkaWdpdHM6IGkrcy5sZW5ndGh9O1xuXHR9O1xuXG5cdHRoaXMuZ2V0TWVhc3VyZW1lbnQgPSBmdW5jdGlvbih0b2tlbnMpIHtcblx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXNlZDogMCB9O1xuXHRcdHZhciB1c2VkID0gMTtcblx0XHR2YXIgbnVtID0gJyc7XG5cdFx0aWYgKHRva2Vuc1swXS50b2tlbiA9PT0gJy0nKSB7XG5cdFx0XHR0b2tlbnMuc2hpZnQoKTtcblx0XHRcdG51bSA9ICctJztcblx0XHRcdHVzZWQrKztcblx0XHR9XG5cdFx0ZWxzZSBpZiAodG9rZW5zWzBdLnR5cGUgIT09ICdudW1iZXInKSByZXR1cm4geyB1c2VkOiAwIH07XG5cdFx0bnVtICs9IHRva2Vucy5zaGlmdCgpLnRva2VuO1xuXHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4geyB1c2VkOiAxLCB2YWx1ZTogcGFyc2VJbnQobnVtKSB9O1xuXHRcdHZhciB4ID0gdG9rZW5zLnNoaWZ0KCk7XG5cdFx0aWYgKHgudG9rZW4gPT09ICcuJykge1xuXHRcdFx0dXNlZCsrO1xuXHRcdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiB7IHVzZWQ6IHVzZWQsIHZhbHVlOiBwYXJzZUludChudW0pIH07XG5cdFx0XHRpZiAodG9rZW5zWzBdLnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdHggPSB0b2tlbnMuc2hpZnQoKTtcblx0XHRcdFx0bnVtID0gbnVtICsgJy4nICsgeC50b2tlbjtcblx0XHRcdFx0dXNlZCsrO1xuXHRcdFx0XHRpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXNlZDogdXNlZCwgdmFsdWU6IHBhcnNlRmxvYXQobnVtKSB9O1xuXHRcdFx0fVxuXHRcdFx0eCA9IHRva2Vucy5zaGlmdCgpO1xuXHRcdH1cblx0XHRzd2l0Y2ggKHgudG9rZW4pIHtcblx0XHRcdGNhc2UgJ3B0JzogcmV0dXJuIHsgdXNlZDogdXNlZCsxLCB2YWx1ZTogcGFyc2VGbG9hdChudW0pIH07XG5cdFx0XHRjYXNlICdjbSc6IHJldHVybiB7IHVzZWQ6IHVzZWQrMSwgdmFsdWU6IHBhcnNlRmxvYXQobnVtKS8yLjU0KjcyIH07XG5cdFx0XHRjYXNlICdpbic6IHJldHVybiB7IHVzZWQ6IHVzZWQrMSwgdmFsdWU6IHBhcnNlRmxvYXQobnVtKSo3MiB9O1xuXHRcdFx0ZGVmYXVsdDogdG9rZW5zLnVuc2hpZnQoeCk7IHJldHVybiB7IHVzZWQ6IHVzZWQsIHZhbHVlOiBwYXJzZUZsb2F0KG51bSkgfTtcblx0XHR9XG5cdFx0cmV0dXJuIHsgdXNlZDogMCB9O1xuXHR9O1xuXHR2YXIgc3Vic3RJbkNob3JkID0gZnVuY3Rpb24oc3RyKVxuXHR7XG5cdFx0d2hpbGUgKCBzdHIuaW5kZXhPZihcIlxcXFxuXCIpICE9PSAtMSlcblx0XHR7XG5cdFx0XHRzdHIgPSBzdHIucmVwbGFjZShcIlxcXFxuXCIsIFwiXFxuXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9O1xuXHR0aGlzLmdldEJyYWNrZXR0ZWRTdWJzdHJpbmcgPSBmdW5jdGlvbihsaW5lLCBpLCBtYXhFcnJvckNoYXJzLCBfbWF0Y2hDaGFyKVxuXHR7XG5cdFx0Ly8gVGhpcyBleHRyYWN0cyB0aGUgc3ViIHN0cmluZyBieSBsb29raW5nIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIHNlYXJjaGluZyBmb3IgdGhhdFxuXHRcdC8vIGNoYXJhY3RlciBsYXRlciBpbiB0aGUgbGluZSAob3Igc2VhcmNoIGZvciB0aGUgb3B0aW9uYWwgX21hdGNoQ2hhcikuXG5cdFx0Ly8gRm9yIGluc3RhbmNlLCBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgcXVvdGUgaXQgd2lsbCBsb29rIGZvclxuXHRcdC8vIHRoZSBlbmQgcXVvdGUuIElmIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgcmVhY2hlZCwgdGhlbiBvbmx5IHVwIHRvIHRoZSBkZWZhdWx0IG51bWJlclxuXHRcdC8vIG9mIGNoYXJhY3RlcnMgYXJlIHJldHVybmVkLCBzbyB0aGF0IGEgbWlzc2luZyBlbmQgcXVvdGUgd29uJ3QgZWF0IHVwIHRoZSBlbnRpcmUgbGluZS5cblx0XHQvLyBJdCByZXR1cm5zIHRoZSBzdWJzdHJpbmcgYW5kIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb25zdW1lZC5cblx0XHQvLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29uc3VtZWQgaXMgbm9ybWFsbHkgdHdvIG1vcmUgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgc3Vic3RyaW5nLFxuXHRcdC8vIGJ1dCBpbiB0aGUgZXJyb3IgY2FzZSBpdCBtaWdodCBub3QgYmUuXG5cdFx0dmFyIG1hdGNoQ2hhciA9IF9tYXRjaENoYXIgfHwgbGluZS5jaGFyQXQoaSk7XG5cdFx0dmFyIHBvcyA9IGkrMTtcblx0XHR3aGlsZSAoKHBvcyA8IGxpbmUubGVuZ3RoKSAmJiAobGluZS5jaGFyQXQocG9zKSAhPT0gbWF0Y2hDaGFyKSlcblx0XHRcdCsrcG9zO1xuXHRcdGlmIChsaW5lLmNoYXJBdChwb3MpID09PSBtYXRjaENoYXIpXG5cdFx0XHRyZXR1cm4gW3Bvcy1pKzEsc3Vic3RJbkNob3JkKGxpbmUuc3Vic3RyaW5nKGkrMSwgcG9zKSksIHRydWVdO1xuXHRcdGVsc2VcdC8vIHdlIGhpdCB0aGUgZW5kIG9mIGxpbmUsIHNvIHdlJ2xsIGp1c3QgcGljayBhbiBhcmJpdHJhcnkgbnVtIG9mIGNoYXJzIHNvIHRoZSBsaW5lIGRvZXNuJ3QgZGlzYXBwZWFyLlxuXHRcdHtcblx0XHRcdHBvcyA9IGkrbWF4RXJyb3JDaGFycztcblx0XHRcdGlmIChwb3MgPiBsaW5lLmxlbmd0aC0xKVxuXHRcdFx0XHRwb3MgPSBsaW5lLmxlbmd0aC0xO1xuXHRcdFx0cmV0dXJuIFtwb3MtaSsxLCBzdWJzdEluQ2hvcmQobGluZS5zdWJzdHJpbmcoaSsxLCBwb3MpKSwgZmFsc2VdO1xuXHRcdH1cblx0fTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5pemVyO1xuIiwiLy8gICAgd3JhcF9saW5lcy5qczogZG9lcyBsaW5lIHdyYXAgb24gYW4gYWxyZWFkeSBwYXJzZWQgdHVuZS5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxOCBQYXVsIFJvc2VuIChwYXVsIGF0IHBhdWxyb3NlbiBkb3QgbmV0KVxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiB3cmFwTGluZXModHVuZSwgbGluZUJyZWFrcykge1xuXHRpZiAoIWxpbmVCcmVha3MgfHwgdHVuZS5saW5lcy5sZW5ndGggPT09IDApXG5cdFx0cmV0dXJuO1xuXG5cdC8vIHR1bmUubGluZXMgY29udGFpbnMgbmVzdGVkIGFycmF5czogdGhlcmUgaXMgYW4gYXJyYXkgb2YgbGluZXMgKHRoYXQncyB0aGUgcGFydCB0aGlzIGZ1bmN0aW9uIHJld3JpdGVzKSxcblx0Ly8gdGhlcmUgaXMgYW4gYXJyYXkgb2Ygc3RhZmZzIHBlciBsaW5lIChmb3IgaW5zdGFuY2UsIHBpYW5vIHdpbGwgaGF2ZSAyLCBvcmNoZXN0cmEgd2lsbCBoYXZlIG1hbnkpXG5cdC8vIHRoZXJlIGlzIGFuIGFycmF5IG9mIHZvaWNlcyBwZXIgc3RhZmYgKGZvciBpbnN0YW5jZSwgNC1wYXJ0IGhhcm1vbnkgbWlnaHQgaGF2ZSBiYXNzIGFuZCB0ZW5vciBvbiBhIHNpbmdsZSBzdGFmZilcblx0Ly8gVGhlIG1lYXN1cmUgbnVtYmVycyBzdGFydCBhdCB6ZXJvIGZvciBlYWNoIHN0YWZmLCBidXQgb24gdGhlIHN1Y2NlZWRpbmcgbGluZXMsIHRoZSBtZWFzdXJlIG51bWJlcnMgYXJlIHJlc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuXG5cdHZhciBuZXdMaW5lcyA9IFtdO1xuXHQvLyBrZWVwIHRyYWNrIG9mIG91ciBjb3VudGVycyBmb3IgZWFjaCBzdGFmZiBhbmQgdm9pY2Vcblx0dmFyIHN0YXJ0TmV3TGluZSA9IFtdO1xuXHR2YXIgY3VycmVudExpbmUgPSBbXTtcblx0dmFyIG1lYXN1cmVOdW1iZXIgPSBbXTtcblx0dmFyIG1lYXN1cmVNYXJrZXIgPSBbXTtcblx0dmFyIGxhc3RNZXRlciA9ICcnO1xuXHR2YXIgdm9pY2VTdGFydCA9IHt9O1xuXHR2YXIgbGluZXNXaXRob3V0U3RhZmYgPSAwO1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdHVuZS5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBsaW5lID0gdHVuZS5saW5lc1tpXTtcblx0XHRpZiAobGluZS5zdGFmZikge1xuXHRcdFx0dmFyIHN0YWZmcyA9IGxpbmUuc3RhZmY7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHN0YWZmcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoc3RhcnROZXdMaW5lW2pdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzdGFydE5ld0xpbmVbal0gPSBbXTtcblx0XHRcdFx0XHRjdXJyZW50TGluZVtqXSA9IFtdO1xuXHRcdFx0XHRcdG1lYXN1cmVOdW1iZXJbal0gPSBbXTtcblx0XHRcdFx0XHRtZWFzdXJlTWFya2VyW2pdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIHN0YWZmID0gc3RhZmZzW2pdO1xuXHRcdFx0XHR2YXIgdm9pY2VzID0gc3RhZmYudm9pY2VzO1xuXHRcdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IHZvaWNlcy5sZW5ndGg7IGsrKykge1xuXHRcdFx0XHRcdGlmIChzdGFydE5ld0xpbmVbal1ba10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0c3RhcnROZXdMaW5lW2pdW2tdID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGN1cnJlbnRMaW5lW2pdW2tdID0gMDtcblx0XHRcdFx0XHRcdG1lYXN1cmVOdW1iZXJbal1ba10gPSAwO1xuXHRcdFx0XHRcdFx0bWVhc3VyZU1hcmtlcltqXVtrXSA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5lc1dpdGhvdXRTdGFmZiA+IDApIGN1cnJlbnRMaW5lW2pdW2tdICs9IGxpbmVzV2l0aG91dFN0YWZmO1xuXHRcdFx0XHRcdHZhciB2b2ljZSA9IHZvaWNlc1trXTtcblx0XHRcdFx0XHRmb3IgKHZhciBlID0gMDsgZSA8IHZvaWNlLmxlbmd0aDsgZSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoc3RhcnROZXdMaW5lW2pdW2tdKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghbmV3TGluZXNbY3VycmVudExpbmVbal1ba11dKVxuXHRcdFx0XHRcdFx0XHRcdG5ld0xpbmVzW2N1cnJlbnRMaW5lW2pdW2tdXSA9IHsgc3RhZmY6IFtdIH07XG5cdFx0XHRcdFx0XHRcdGlmICghbmV3TGluZXNbY3VycmVudExpbmVbal1ba11dLnN0YWZmW2pdKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmV3TGluZXNbY3VycmVudExpbmVbal1ba11dLnN0YWZmW2pdID0ge3ZvaWNlczogW119O1xuXHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBzdGFmZikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHN0YWZmLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGtleSA9PT0gJ21ldGVyJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXdMaW5lcy5sZW5ndGggPT09IDEgfHwgbGFzdE1ldGVyICE9PSBKU09OLnN0cmluZ2lmeShzdGFmZltrZXldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFzdE1ldGVyID0gSlNPTi5zdHJpbmdpZnkoc3RhZmZba2V5XSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuZXdMaW5lc1tjdXJyZW50TGluZVtqXVtrXV0uc3RhZmZbal1ba2V5XSA9IHN0YWZmW2tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGtleSAhPT0gJ3ZvaWNlcycpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuZXdMaW5lc1tjdXJyZW50TGluZVtqXVtrXV0uc3RhZmZbal1ba2V5XSA9IHN0YWZmW2tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG1lYXN1cmVNYXJrZXJbal1ba10pXG5cdFx0XHRcdFx0XHRcdFx0bmV3TGluZXNbY3VycmVudExpbmVbal1ba11dLnN0YWZmW2pdLmJhck51bWJlciA9IG1lYXN1cmVNYXJrZXJbal1ba107XG5cdFx0XHRcdFx0XHRcdHN0YXJ0TmV3TGluZVtqXVtrXSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFyIGVsZW1lbnQgPSB2b2ljZVtlXTtcblx0XHRcdFx0XHRcdGlmICghbmV3TGluZXNbY3VycmVudExpbmVbal1ba11dLnN0YWZmW2pdLnZvaWNlc1trXSkge1xuXHRcdFx0XHRcdFx0XHRuZXdMaW5lc1tjdXJyZW50TGluZVtqXVtrXV0uc3RhZmZbal0udm9pY2VzW2tdID0gW107XG5cdFx0XHRcdFx0XHRcdGZvciAodmFyIHN0YXJ0SXRlbSBpbiB2b2ljZVN0YXJ0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHZvaWNlU3RhcnQuaGFzT3duUHJvcGVydHkoc3RhcnRJdGVtKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3TGluZXNbY3VycmVudExpbmVbal1ba11dLnN0YWZmW2pdLnZvaWNlc1trXS5wdXNoKHZvaWNlU3RhcnRbc3RhcnRJdGVtXSlcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG5ld0xpbmVzW2N1cnJlbnRMaW5lW2pdW2tdXS5zdGFmZltqXS52b2ljZXNba10ucHVzaChlbGVtZW50KTtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmVsX3R5cGUgPT09ICdzdGVtJykge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgbmljZSB0cmljayB0byBqdXN0IHBheSBhdHRlbnRpb24gdG8gdGhlIGxhc3Qgc2V0dGluZyBvZiBlYWNoIHR5cGUuXG5cdFx0XHRcdFx0XHRcdHZvaWNlU3RhcnRbZWxlbWVudC5lbF90eXBlXSA9IGVsZW1lbnQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmVsX3R5cGUgPT09ICdiYXInKSB7XG5cdFx0XHRcdFx0XHRcdG1lYXN1cmVOdW1iZXJbal1ba10rKztcblx0XHRcdFx0XHRcdFx0aWYgKGxpbmVCcmVha3NbbWVhc3VyZU51bWJlcltqXVtrXV0pIHtcblx0XHRcdFx0XHRcdFx0XHRzdGFydE5ld0xpbmVbal1ba10gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRMaW5lW2pdW2tdKys7XG5cdFx0XHRcdFx0XHRcdFx0bWVhc3VyZU1hcmtlcltqXVtrXSA9IGVsZW1lbnQuYmFyTnVtYmVyO1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBlbGVtZW50LmJhck51bWJlcjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsaW5lc1dpdGhvdXRTdGFmZiA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld0xpbmVzLnB1c2gobGluZSk7XG5cdFx0XHRsaW5lc1dpdGhvdXRTdGFmZisrO1xuXHRcdH1cblx0fVxuXHR0dW5lLmxpbmVzID0gbmV3TGluZXM7XG59XG5cbmZ1bmN0aW9uIGZyZWVGb3JtTGluZUJyZWFrcyh3aWR0aHMsIGxpbmVCcmVha1BvaW50KSB7XG5cdHZhciBsaW5lQnJlYWtzID0gW107XG5cdHZhciB0b3RhbHMgPSBbXTtcblx0dmFyIHRvdGFsVGhpc0xpbmUgPSAwO1xuXHQvLyBydW4gdGhyb3VnaCBlYWNoIG1lYXN1cmUgYW5kIHNlZSBpZiB0aGUgYWNjdW11bGF0aW9uIGlzIGxlc3MgdGhhbiB0aGUgaWRlYWwuXG5cdC8vIGlmIGl0IHBhc3NlcyB0aGUgaWRlYWwsIHRoZW4gc2VlIHdoZXRoZXIgdGhlIGxhc3Qgb3IgdGhpcyBvbmUgaXMgY2xvc2VyIHRvIHRoZSBpZGVhbC5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aHMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgd2lkdGggPSB3aWR0aHNbaV07XG5cdFx0dmFyIGF0dGVtcHRlZFdpZHRoID0gdG90YWxUaGlzTGluZSArIHdpZHRoO1xuXHRcdGlmIChhdHRlbXB0ZWRXaWR0aCA8IGxpbmVCcmVha1BvaW50KVxuXHRcdFx0dG90YWxUaGlzTGluZSA9IGF0dGVtcHRlZFdpZHRoO1xuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gVGhpcyBqdXN0IHBhc3NlZCB0aGUgaWRlYWwsIHNvIHNlZSB3aGV0aGVyIHRoZSBwcmV2aW91cyBvciB0aGUgY3VycmVudCBudW1iZXIgb2YgbWVhc3VyZXMgaXMgY2xvc2VyLlxuXHRcdFx0dmFyIG9sZERpc3RhbmNlID0gbGluZUJyZWFrUG9pbnQgLSB0b3RhbFRoaXNMaW5lO1xuXHRcdFx0dmFyIG5ld0Rpc3RhbmNlID0gYXR0ZW1wdGVkV2lkdGggLSBsaW5lQnJlYWtQb2ludDtcblx0XHRcdGlmIChvbGREaXN0YW5jZSA8IG5ld0Rpc3RhbmNlICYmIHRvdGFsVGhpc0xpbmUgPiAwKSB7XG5cdFx0XHRcdGxpbmVCcmVha3MucHVzaChpIC0gMSk7XG5cdFx0XHRcdHRvdGFscy5wdXNoKE1hdGgucm91bmQodG90YWxUaGlzTGluZSAtIHdpZHRoKSk7XG5cdFx0XHRcdHRvdGFsVGhpc0xpbmUgPSB3aWR0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChpIDwgd2lkdGhzLmxlbmd0aC0xKSB7XG5cdFx0XHRcdFx0bGluZUJyZWFrcy5wdXNoKGkpO1xuXHRcdFx0XHRcdHRvdGFscy5wdXNoKE1hdGgucm91bmQodG90YWxUaGlzTGluZSkpO1xuXHRcdFx0XHRcdHRvdGFsVGhpc0xpbmUgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHRvdGFscy5wdXNoKE1hdGgucm91bmQodG90YWxUaGlzTGluZSkpO1xuXHRyZXR1cm4geyBsaW5lQnJlYWtzOiBsaW5lQnJlYWtzLCB0b3RhbHM6IHRvdGFscyB9O1xufVxuXG4vLyBmdW5jdGlvbiBjcmVhdGVMaW5lVGVzdEFycmF5KG51bUxpbmVzLCBudW1NZWFzdXJlcywgbWF4TWVhc3VyZXNQZXJMaW5lLCBtaW5NZWFzdXJlc1BlckxpbmUpIHtcbi8vIFx0dmFyIHRyaWVzID0gW107XG4vLyBcdC8vIFRvIGdldCBhbGwgdGhlIGl0ZXJhdGlvbnMsIGl0IGlzIGV2ZXJ5IGRpZ2l0IGluIGEgcGFydGljdWxhciBiYXNlLW51bWJlcmluZyBzeXN0ZW0uXG4vLyBcdC8vIFRoYXQgaXMsIHdlIHdhbnQgdG8gZ2VuZXJhdGUgZXZlcnkgbnVtYmVyIHRoYXQgaXMgKG51bUxpbmVzLTEpIGRpZ2l0cywgaW4gYmFzZSAobWF4LW1pbisxKVxuLy8gXHQvLyBGb3IgaW5zdGFuY2UsIGZvciA1IGxpbmVzIHdoZXJlIHRoZSBtaW4gaXMgNiBhbmQgbWF4IGlzIDgsIHdlIHdhbnQgZXZlciBjb21iaW5hdGlvbiBvZiA0IGRpZ2l0cyBpbiBiYXNlIDMuXG4vLyBcdHZhciBiYXNlID0gbWF4TWVhc3VyZXNQZXJMaW5lIC0gbWluTWVhc3VyZXNQZXJMaW5lICsgMTtcbi8vIFx0dmFyIGRpZ2l0cyA9IG51bUxpbmVzIC0gMTsgLy8gVGhlIGxhc3QgZGlnaXQgaXMgZml4ZWQ6IGl0IGlzIHdoYXQgZXZlciBpcyBuZWVkZWQgdG8gc3VtIHVwIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbWVhc3VyZXMuXG4vLyBcdHZhciBkb25lID0gZmFsc2U7XG4vLyBcdHZhciBpdGVyID0gMDtcbi8vIFx0d2hpbGUgKCFkb25lKSB7XG4vLyBcdFx0dmFyIGF0dGVtcHQgPSBbXTtcbi8vIFx0XHR2YXIgbnVtID0gaXRlcjtcbi8vIFx0XHR2YXIgdG90YWwgPSAwO1xuLy8gXHRcdGZvciAodmFyIGQgPSBkaWdpdHMgLSAxOyBkID49IDA7IGQtLSkge1xuLy8gXHRcdFx0YXR0ZW1wdFtkXSA9IChudW0gJSBiYXNlKSArIG1pbk1lYXN1cmVzUGVyTGluZTtcbi8vIFx0XHRcdG51bSA9IE1hdGguZmxvb3IobnVtIC8gYmFzZSk7XG4vLyBcdFx0XHR0b3RhbCArPSBhdHRlbXB0W2RdO1xuLy8gXHRcdH1cbi8vIFx0XHRpZiAobnVtID4gMClcbi8vIFx0XHRcdGRvbmUgPSB0cnVlOyAvLyBjb250aW51ZSB1bnRpbCB3ZSBleGNlZWQgdGhlIGdyZWF0ZXN0IG51bWJlci4gV2Uga25vdyBiZWNhdXNlIHRoZXJlIGlzIGEgcmVtYWluZXIuXG4vLyBcdFx0ZWxzZSB7XG4vLyBcdFx0XHR2YXIgbGFzdExpbmUgPSBudW1NZWFzdXJlcyAtIHRvdGFsO1xuLy8gXHRcdFx0aWYgKGxhc3RMaW5lID49IG1pbk1lYXN1cmVzUGVyTGluZSAmJiBsYXN0TGluZSA8PSBtYXhNZWFzdXJlc1BlckxpbmUpIHtcbi8vIFx0XHRcdFx0YXR0ZW1wdFtkaWdpdHNdID0gbGFzdExpbmU7XG4vLyBcdFx0XHRcdHRyaWVzLnB1c2goYXR0ZW1wdCk7XG4vLyBcdFx0XHR9XG4vLyBcdFx0XHRpdGVyKys7XG4vLyBcdFx0fVxuLy8gXHR9XG4vLyBcdHJldHVybiB0cmllcztcbi8vIH1cblxuLy8gZnVuY3Rpb24gZ2V0VmFyaWFuY2UoYXR0ZW1wdCwgaWRlYWxMaW5lQnJlYWssIHdpZHRocywgYWxsb3dhYmxlT3ZlcmFnZSkge1xuLy8gXHR2YXIgbWVhc3VyZU51bWJlciA9IDA7XG4vLyBcdHZhciB0aGlzV29yc3RWYXJpYW5jZSA9IDA7XG4vLyBcdGZvciAodmFyIGogPSAwOyBqIDwgYXR0ZW1wdC5sZW5ndGg7IGorKykge1xuLy8gXHRcdHZhciBsaW5lV2lkdGggPSAwO1xuLy8gXHRcdHZhciBtZWFzdXJlc1RoaXNMaW5lID0gYXR0ZW1wdFtqXTtcbi8vIFx0XHRmb3IgKHZhciBrID0gMDsgayA8IG1lYXN1cmVzVGhpc0xpbmU7IGsrKykge1xuLy8gXHRcdFx0bGluZVdpZHRoICs9IHdpZHRoc1ttZWFzdXJlTnVtYmVyKytdO1xuLy8gXHRcdH1cbi8vIFx0XHRpZiAobGluZVdpZHRoID4gYWxsb3dhYmxlT3ZlcmFnZSlcbi8vIFx0XHRcdHJldHVybiBudWxsO1xuLy8gXHRcdHZhciB2YXJpYW5jZSA9IE1hdGguYWJzKGxpbmVXaWR0aCAtIGlkZWFsTGluZUJyZWFrKTtcbi8vIFx0XHRpZiAodmFyaWFuY2UgPiB0aGlzV29yc3RWYXJpYW5jZSlcbi8vIFx0XHRcdHRoaXNXb3JzdFZhcmlhbmNlID0gdmFyaWFuY2U7XG4vLyBcdH1cbi8vIFx0cmV0dXJuIHRoaXNXb3JzdFZhcmlhbmNlO1xuLy8gfVxuXG4vLyBmdW5jdGlvbiBnZXRNYXhWYXJpYW5jZSh3aWR0aHMsIGxpbmVCcmVha1BvaW50LCBsaW5lQnJlYWtzKSB7XG4vLyBcdHZhciBtYXhWYXJpYW5jZSA9IDA7XG4vLyBcdHZhciBudW1MaW5lcyA9IGxpbmVCcmVha3MubGVuZ3RoICsgMTsgLy8gdGhlIGxhc3QgbGluZSBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQgYnJlYWtcbi8vIFx0dmFyIG1lYXN1cmVOdW1iZXIgPSAwO1xuLy8gXHR2YXIgdG90YWxzID0gW107XG4vLyBcdGZvciAodmFyIGkgPSAwOyBpIDw9IGxpbmVCcmVha3MubGVuZ3RoOyBpKyspIHtcbi8vIFx0XHR2YXIgYnJlYWtNZWFzdXJlID0gKGkgPT09IGxpbmVCcmVha3MubGVuZ3RoKSA/IHdpZHRocy5sZW5ndGggOiBsaW5lQnJlYWtzW2ldO1xuLy8gXHRcdHZhciB0aGlzVG90YWwgPSAwO1xuLy8gXHRcdGZvciAodmFyIGogPSBtZWFzdXJlTnVtYmVyOyBqIDwgYnJlYWtNZWFzdXJlOyBqKyspIHtcbi8vIFx0XHRcdHRoaXNUb3RhbCArPSB3aWR0aHNbal07XG4vLyBcdFx0fVxuLy8gXHRcdG1lYXN1cmVOdW1iZXIgPSBicmVha01lYXN1cmU7XG4vLyBcdFx0dmFyIHRoaXNWYXJpYW5jZSA9IHRoaXNUb3RhbCA8PSBsaW5lQnJlYWtQb2ludCA/IGxpbmVCcmVha1BvaW50IC0gdGhpc1RvdGFsIDogMTAwMDAwMDtcbi8vIFx0XHR0b3RhbHMucHVzaCh7dG90YWw6IHRoaXNUb3RhbCwgdmFyaWFuY2U6IHRoaXNWYXJpYW5jZX0pXG4vLyBcdFx0bWF4VmFyaWFuY2UgPSBNYXRoLm1heChtYXhWYXJpYW5jZSwgdGhpc1ZhcmlhbmNlKTtcbi8vIFx0fVxuLy9cbi8vIFx0Y29uc29sZS5sb2cobGluZUJyZWFrUG9pbnQsIHRvdGFscylcbi8vIFx0cmV0dXJuIG1heFZhcmlhbmNlO1xuLy8gfVxuXG5mdW5jdGlvbiBnZXRWYXJpYW5jZSh3aWR0aHMsIGxpbmVCcmVha3MpIHtcblx0dmFyIG51bUxpbmVzID0gbGluZUJyZWFrcy5sZW5ndGggKyAxOyAvLyB0aGUgbGFzdCBsaW5lIGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBicmVha1xuXHR2YXIgYXZnID0gd2lkdGhzLnRvdGFsIC8gbnVtTGluZXM7XG5cdHZhciBsYXJnZXN0VmFyaWFuY2UgPSAwO1xuXHR2YXIgbWVhc3VyZU51bWJlciA9IDA7XG5cdGZvciAodmFyIGkgPSAwOyBpIDw9IGxpbmVCcmVha3MubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgYnJlYWtNZWFzdXJlID0gKGkgPT09IGxpbmVCcmVha3MubGVuZ3RoKSA/IHdpZHRocy5tZWFzdXJlV2lkdGhzLmxlbmd0aC0xIDogbGluZUJyZWFrc1tpXTtcblx0XHR2YXIgdGhpc1ZhcmlhbmNlID0gbGluZVZhcmlhbmNlKHdpZHRocy5tZWFzdXJlV2lkdGhzLCBtZWFzdXJlTnVtYmVyLCBicmVha01lYXN1cmUsIGF2Zyk7XG5cdFx0bWVhc3VyZU51bWJlciA9IGJyZWFrTWVhc3VyZSsxO1xuXHRcdGxhcmdlc3RWYXJpYW5jZSA9IE1hdGgubWF4KGxhcmdlc3RWYXJpYW5jZSwgdGhpc1ZhcmlhbmNlKTtcblx0fVxuXG5cdHJldHVybiBsYXJnZXN0VmFyaWFuY2U7XG59XG5cbi8vIGZ1bmN0aW9uIGdldEF2Z1ZhcmlhbmNlKHdpZHRocywgbGluZUJyZWFrUG9pbnQsIGxpbmVCcmVha3MpIHtcbi8vIFx0dmFyIHRvdGFsVmFyaWFuY2UgPSAwO1xuLy8gXHR2YXIgbnVtTGluZXMgPSBsaW5lQnJlYWtzLmxlbmd0aCArIDE7IC8vIHRoZSBsYXN0IGxpbmUgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGJyZWFrXG4vLyBcdHZhciBtZWFzdXJlTnVtYmVyID0gMDtcbi8vIFx0Zm9yICh2YXIgaSA9IDA7IGkgPD0gbGluZUJyZWFrcy5sZW5ndGg7IGkrKykge1xuLy8gXHRcdHZhciBicmVha01lYXN1cmUgPSAoaSA9PT0gbGluZUJyZWFrcy5sZW5ndGgpID8gd2lkdGhzLmxlbmd0aCA6IGxpbmVCcmVha3NbaV07XG4vLyBcdFx0dmFyIHRoaXNUb3RhbCA9IDA7XG4vLyBcdFx0Zm9yICh2YXIgaiA9IG1lYXN1cmVOdW1iZXI7IGogPCBicmVha01lYXN1cmU7IGorKykge1xuLy8gXHRcdFx0dGhpc1RvdGFsICs9IHdpZHRoc1tqXTtcbi8vIFx0XHR9XG4vLyBcdFx0bWVhc3VyZU51bWJlciA9IGJyZWFrTWVhc3VyZTtcbi8vIFx0XHR2YXIgdGhpc1ZhcmlhbmNlID0gTWF0aC5hYnMobGluZUJyZWFrUG9pbnQgLSB0aGlzVG90YWwpO1xuLy8gXHRcdHRvdGFsVmFyaWFuY2UgKz0gdGhpc1ZhcmlhbmNlO1xuLy8gXHR9XG4vL1xuLy8gXHRyZXR1cm4gdG90YWxWYXJpYW5jZSAvIG51bUxpbmVzO1xuLy8gfVxuXG5mdW5jdGlvbiBsaW5lVmFyaWFuY2Uod2lkdGhzLCBzdGFydCwgZW5kLCBhdmcpIHtcblx0dmFyIHRoaXNUb3RhbCA9IGxpbmVXaWR0aCh3aWR0aHMsIHN0YXJ0LCBlbmQpO1xuXHR2YXIgdGhpc1ZhcmlhbmNlID0gTWF0aC5hYnMoYXZnIC0gdGhpc1RvdGFsKTtcblx0cmV0dXJuIHRoaXNWYXJpYW5jZTtcbn1cblxuZnVuY3Rpb24gbGluZVdpZHRoKHdpZHRocywgc3RhcnQsIGVuZCkge1xuXHR2YXIgdGhpc1RvdGFsID0gMDtcblx0Zm9yICh2YXIgaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKVxuXHRcdHRoaXNUb3RhbCArPSB3aWR0aHNbal07XG5cdHJldHVybiB0aGlzVG90YWw7XG59XG5cbi8vIFRPRE8tUEVSOiBGb3IgbG9uZyBwaWVjZXMgb2YgbXVzaWMsIHRoaXMgY2FuIGdldCBsb25nLCBzbyBzdG9wIGZpbmRpbmcgdGhlIGNvbWJpbmF0aW9ucyBhdCBhbiBhcmJpdHJhcnkgcGxhY2UuXG5mdW5jdGlvbiBnZXRBdHRlbXB0cyh3aWR0aHMsIHN0YXJ0LCBsaW5lc0xlZnQsIG1pbiwgbWF4LCBsYXN0TGluZXMpIHtcblx0dmFyIE1BWF9DT01CSU5BVElPTlMgPSAxMjAwO1xuXHR2YXIgYWNjID0gMDtcblx0dmFyIGF0dGVtcHRzID0gW107XG5cdGZvciAodmFyIGkgPSBzdGFydDsgaSA8IHdpZHRocy5sZW5ndGggJiYgYWNjIDwgbWF4OyBpKyspIHtcblx0XHRhY2MgKz0gd2lkdGhzW2ldO1xuXHRcdGlmIChhY2MgPiBtYXgpXG5cdFx0XHRicmVhaztcblx0XHRpZiAoYWNjID4gbWluKSB7XG5cdFx0XHRpZiAobGluZXNMZWZ0ID4gMCAmJiBhdHRlbXB0cy5sZW5ndGggPCBNQVhfQ09NQklOQVRJT05TKSB7XG5cdFx0XHRcdHZhciBuZXh0TGluZXMgPSBnZXRBdHRlbXB0cyh3aWR0aHMsIGkgKyAxLCBsaW5lc0xlZnQgLSAxLCBtaW4sIG1heCwgbGFzdExpbmVzKTtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBuZXh0TGluZXMubGVuZ3RoOyBqKyspXG5cdFx0XHRcdFx0YXR0ZW1wdHMucHVzaChbaV0uY29uY2F0KG5leHRMaW5lc1tqXSkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGxpbmVzTGVmdCA9PT0gMSAmJiBsYXN0TGluZXMuaW5kZXhPZihpKSA+PSAwKVxuXHRcdFx0XHRhdHRlbXB0cy5wdXNoKFtpXSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhdHRlbXB0cztcbn1cblxuZnVuY3Rpb24gbGFzdExpbmVQb3NzaWJpbGl0aWVzKHdpZHRocywgc3RhcnQsIG1pbiwgbWF4KSB7XG5cdHZhciBhY2MgPSAwO1xuXHR2YXIgcG9zc2liaWxpdGllcyA9IFtdO1xuXHRmb3IgKHZhciBpID0gd2lkdGhzLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuXHRcdGFjYyArPSB3aWR0aHNbaV07XG5cdFx0aWYgKGFjYyA+IG1heClcblx0XHRcdGJyZWFrO1xuXHRcdGlmIChhY2MgPiBtaW4gJiYgaSA8IHN0YXJ0KSB7XG5cdFx0XHRwb3NzaWJpbGl0aWVzLnB1c2goaS0xKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHBvc3NpYmlsaXRpZXM7XG59XG5cbmZ1bmN0aW9uIGNsb25lKGFycikge1xuXHR2YXIgbmV3QXJyID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdG5ld0Fyci5wdXNoKGFycltpXSk7XG5cdHJldHVybiBuZXdBcnI7XG59XG5cbmZ1bmN0aW9uIG9uZVRyeShtZWFzdXJlV2lkdGhzLCBpZGVhbFdpZHRocywgYWNjdW11bGF0b3IsIGxpbmVBY2N1bXVsYXRvciwgbGluZVdpZHRocywgbGFzdFZhcmlhbmNlLCBoaWdoZXN0VmFyaWFuY2UsIGN1cnJMaW5lLCBsaW5lQnJlYWtzLCBzdGFydEluZGV4LCBvdGhlclRyaWVzKSB7XG5cdGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgbWVhc3VyZVdpZHRocy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBtZWFzdXJlV2lkdGggPSBtZWFzdXJlV2lkdGhzW2ldO1xuXHRcdGFjY3VtdWxhdG9yICs9IG1lYXN1cmVXaWR0aDtcblx0XHRsaW5lQWNjdW11bGF0b3IgKz0gbWVhc3VyZVdpZHRoO1xuXHRcdHZhciB0aGlzVmFyaWFuY2UgPSBNYXRoLmFicyhhY2N1bXVsYXRvciAtIGlkZWFsV2lkdGhzW2N1cnJMaW5lXSk7XG5cdFx0dmFyIHZhcmlhbmNlSXNDbG9zZSA9IE1hdGguYWJzKHRoaXNWYXJpYW5jZSAtIGxhc3RWYXJpYW5jZSkgPCBpZGVhbFdpZHRoc1swXSAvIDEwOyAvLyBzZWUgaWYgdGhlIGRpZmZlcmVuY2UgaXMgbGVzcyB0aGFuIDEwJSwgaWYgc28sIHJ1biB0aGUgdGVzdCBib3RoIHdheXMuXG5cdFx0aWYgKHZhcmlhbmNlSXNDbG9zZSkge1xuXHRcdFx0aWYgKHRoaXNWYXJpYW5jZSA8IGxhc3RWYXJpYW5jZSkge1xuXHRcdFx0XHQvLyBBbHNvIGF0dGVtcHQgb25lIGxlc3MgbWVhc3VyZSBvbiB0aGUgY3VycmVudCBsaW5lIC0gc29tZXRpbWVzIHRoYXQgd29ya3Mgb3V0IGJldHRlci5cblx0XHRcdFx0dmFyIG5ld1dpZHRocyA9IGNsb25lKGxpbmVXaWR0aHMpO1xuXHRcdFx0XHR2YXIgbmV3QnJlYWtzID0gY2xvbmUobGluZUJyZWFrcyk7XG5cdFx0XHRcdG5ld0JyZWFrcy5wdXNoKGktMSk7XG5cdFx0XHRcdG5ld1dpZHRocy5wdXNoKGxpbmVBY2N1bXVsYXRvciAtIG1lYXN1cmVXaWR0aCk7XG5cdFx0XHRcdG90aGVyVHJpZXMucHVzaCh7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3I6IGFjY3VtdWxhdG9yLFxuXHRcdFx0XHRcdGxpbmVBY2N1bXVsYXRvcjogbWVhc3VyZVdpZHRoLFxuXHRcdFx0XHRcdGxpbmVXaWR0aHM6IG5ld1dpZHRocyxcblx0XHRcdFx0XHRsYXN0VmFyaWFuY2U6IE1hdGguYWJzKGFjY3VtdWxhdG9yIC0gaWRlYWxXaWR0aHNbY3VyckxpbmUrMV0pLFxuXHRcdFx0XHRcdGhpZ2hlc3RWYXJpYW5jZTogTWF0aC5tYXgoaGlnaGVzdFZhcmlhbmNlLCBsYXN0VmFyaWFuY2UpLFxuXHRcdFx0XHRcdGN1cnJMaW5lOiBjdXJyTGluZSsxLFxuXHRcdFx0XHRcdGxpbmVCcmVha3M6IG5ld0JyZWFrcyxcblx0XHRcdFx0XHRzdGFydEluZGV4OiBpKzF9KTtcblx0XHRcdH0gZWxzZSBpZiAodGhpc1ZhcmlhbmNlID4gbGFzdFZhcmlhbmNlICYmIGkgPCBtZWFzdXJlV2lkdGhzLmxlbmd0aC0xKSB7XG5cdFx0XHRcdC8vIEFsc28gYXR0ZW1wdCBvbmUgZXh0cmEgbWVhc3VyZSBvbiB0aGlzIGxpbmUuXG5cdFx0XHRcdG5ld1dpZHRocyA9IGNsb25lKGxpbmVXaWR0aHMpO1xuXHRcdFx0XHRuZXdCcmVha3MgPSBjbG9uZShsaW5lQnJlYWtzKTtcblx0XHRcdFx0Ly8gbmV3QnJlYWtzW25ld0JyZWFrcy5sZW5ndGgtMV0gPSBpO1xuXHRcdFx0XHQvLyBuZXdXaWR0aHNbbmV3V2lkdGhzLmxlbmd0aC0xXSA9IGxpbmVBY2N1bXVsYXRvcjtcblx0XHRcdFx0b3RoZXJUcmllcy5wdXNoKHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcjogYWNjdW11bGF0b3IsXG5cdFx0XHRcdFx0bGluZUFjY3VtdWxhdG9yOiBsaW5lQWNjdW11bGF0b3IsXG5cdFx0XHRcdFx0bGluZVdpZHRoczogbmV3V2lkdGhzLFxuXHRcdFx0XHRcdGxhc3RWYXJpYW5jZTogdGhpc1ZhcmlhbmNlLFxuXHRcdFx0XHRcdGhpZ2hlc3RWYXJpYW5jZTogTWF0aC5tYXgoaGlnaGVzdFZhcmlhbmNlLCB0aGlzVmFyaWFuY2UpLFxuXHRcdFx0XHRcdGN1cnJMaW5lOiBjdXJyTGluZSxcblx0XHRcdFx0XHRsaW5lQnJlYWtzOiBuZXdCcmVha3MsXG5cdFx0XHRcdFx0c3RhcnRJbmRleDogaSsxfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0aGlzVmFyaWFuY2UgPiBsYXN0VmFyaWFuY2UpIHtcblx0XHRcdGxpbmVCcmVha3MucHVzaChpIC0gMSk7XG5cdFx0XHRjdXJyTGluZSsrO1xuXHRcdFx0aGlnaGVzdFZhcmlhbmNlID0gTWF0aC5tYXgoaGlnaGVzdFZhcmlhbmNlLCBsYXN0VmFyaWFuY2UpO1xuXHRcdFx0bGFzdFZhcmlhbmNlID0gTWF0aC5hYnMoYWNjdW11bGF0b3IgLSBpZGVhbFdpZHRoc1tjdXJyTGluZV0pO1xuXHRcdFx0bGluZVdpZHRocy5wdXNoKGxpbmVBY2N1bXVsYXRvciAtIG1lYXN1cmVXaWR0aCk7XG5cdFx0XHRsaW5lQWNjdW11bGF0b3IgPSBtZWFzdXJlV2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxhc3RWYXJpYW5jZSA9IHRoaXNWYXJpYW5jZTtcblx0XHR9XG5cdH1cblx0bGluZVdpZHRocy5wdXNoKGxpbmVBY2N1bXVsYXRvcik7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplTGluZVdpZHRocyh3aWR0aHMsIGxpbmVCcmVha1BvaW50LCBsaW5lQnJlYWtzLCBleHBsYW5hdGlvbikge1xuXHQvL1x0ZmlndXJlIG91dCBob3cgbWFueSBsaW5lcyAtIFRoYXQncyBvbmUgbW9yZSB0aGFuIHdhcyB0cmllZCBiZWZvcmUuXG5cdHZhciBudW1MaW5lcyA9IE1hdGguY2VpbCh3aWR0aHMudG90YWwgLyBsaW5lQnJlYWtQb2ludCkgKyAxO1xuXG5cdC8vXHRnZXQgdGhlIGlkZWFsIHdpZHRoIGZvciBhIGxpbmUgKGN1bXVsYXRpdmUgd2lkdGggLyBudW0gbGluZXMpIC0gYXBwcm94IHRoZSBzYW1lIGFzIGxpbmVCcmVha1BvaW50IGV4Y2VwdCBmb3Igcm91bmRpbmdcblx0dmFyIGlkZWFsV2lkdGggPSBNYXRoLmZsb29yKHdpZHRocy50b3RhbCAvIG51bUxpbmVzKTtcblxuXHQvL1x0Z2V0IGVhY2ggaWRlYWwgbGluZSB3aWR0aCAoMSppZGVhbCwgMippZGVhbCwgMyppZGVhbCwgZXRjKVxuXHR2YXIgaWRlYWxXaWR0aHMgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBudW1MaW5lczsgaSsrKVxuXHRcdGlkZWFsV2lkdGhzLnB1c2goaWRlYWxXaWR0aCooaSsxKSk7XG5cblx0Ly9cdGZyb20gZmlyc3QgbWVhc3VyZSwgc3RlcCB0aHJvdWdoIGFjY3VtLiBXaWR0aHMgdW50aWwgdGhlIGFicyBvZiB0aGUgaWRlYWwgaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG9uZS5cblx0Ly8gVGhpcyBjYW4gc29tZXRpbWVzIGxvb2sgZnVubnkgaW4gZWRnZSBjYXNlcywgc28gd2hlbiB0aGUgbGVuZ3RoIGlzIHdpdGhpbiAxMCUsIHRyeSBvbmUgbW9yZSBvciBvbmUgbGVzcyB0byBzZWUgd2hpY2ggaXMgYmV0dGVyLlxuXHQvLyBUaGlzIGlzIGJldHRlciB0aGFuIHRyeWluZyBhbGwgdGhlIHBvc3NpYmlsaXRpZXMgYmVjYXVzZSB0aGF0IHdvdWxkIGdldCB0byBiZSBhIGh1Z2UgbnVtYmVyIGZvciBldmVuIGEgbWVkaXVtIHNpemUgcGllY2UuXG5cdC8vIFRoaXMgbWV0aG9kIHNlZW1zIHRvIG5ldmVyIGdlbmVyYXRlIG1vcmUgdGhhbiBhYm91dCAxNiB0cmllcyBhbmQgaXQgaXMgdXN1YWxseSA0IG9yIGxlc3MuXG5cdHZhciBvdGhlclRyaWVzID0gW107XG5cdG90aGVyVHJpZXMucHVzaCh7XG5cdFx0YWNjdW11bGF0b3I6IDAsXG5cdFx0bGluZUFjY3VtdWxhdG9yOiAwLFxuXHRcdGxpbmVXaWR0aHM6IFtdLFxuXHRcdGxhc3RWYXJpYW5jZTogOTk5OTk5LFxuXHRcdGhpZ2hlc3RWYXJpYW5jZTogMCxcblx0XHRjdXJyTGluZTogMCxcblx0XHRsaW5lQnJlYWtzOiBbXSwgLy8gVGhlc2UgYXJlIHRoZSB6ZXJvLWJhc2VkIGxhc3QgbWVhc3VyZSBvbiBlYWNoIGxpbmVcblx0XHRzdGFydEluZGV4OiAwfSk7XG5cdHZhciBpbmRleCA9IDA7XG5cdHdoaWxlIChpbmRleCA8IG90aGVyVHJpZXMubGVuZ3RoKSB7XG5cdFx0b25lVHJ5KHdpZHRocy5tZWFzdXJlV2lkdGhzLFxuXHRcdFx0aWRlYWxXaWR0aHMsXG5cdFx0XHRvdGhlclRyaWVzW2luZGV4XS5hY2N1bXVsYXRvcixcblx0XHRcdG90aGVyVHJpZXNbaW5kZXhdLmxpbmVBY2N1bXVsYXRvcixcblx0XHRcdG90aGVyVHJpZXNbaW5kZXhdLmxpbmVXaWR0aHMsXG5cdFx0XHRvdGhlclRyaWVzW2luZGV4XS5sYXN0VmFyaWFuY2UsXG5cdFx0XHRvdGhlclRyaWVzW2luZGV4XS5oaWdoZXN0VmFyaWFuY2UsXG5cdFx0XHRvdGhlclRyaWVzW2luZGV4XS5jdXJyTGluZSxcblx0XHRcdG90aGVyVHJpZXNbaW5kZXhdLmxpbmVCcmVha3MsXG5cdFx0XHRvdGhlclRyaWVzW2luZGV4XS5zdGFydEluZGV4LFxuXHRcdFx0b3RoZXJUcmllcyk7XG5cdFx0aW5kZXgrKztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgb3RoZXJUcmllcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBvdGhlclRyeSA9IG90aGVyVHJpZXNbaV07XG5cdFx0b3RoZXJUcnkudmFyaWFuY2VzID0gW107XG5cdFx0b3RoZXJUcnkuYXZlVmFyaWFuY2UgPSAwO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgb3RoZXJUcnkubGluZVdpZHRocy5sZW5ndGg7IGorKykge1xuXHRcdFx0dmFyIGxpbmVXaWR0aCA9IG90aGVyVHJ5LmxpbmVXaWR0aHNbal07XG5cdFx0XHRvdGhlclRyeS52YXJpYW5jZXMucHVzaChsaW5lV2lkdGggLSBpZGVhbFdpZHRoc1swXSk7XG5cdFx0XHRvdGhlclRyeS5hdmVWYXJpYW5jZSArPSBNYXRoLmFicyhsaW5lV2lkdGggLSBpZGVhbFdpZHRoc1swXSk7XG5cdFx0fVxuXHRcdG90aGVyVHJ5LmF2ZVZhcmlhbmNlID0gIG90aGVyVHJ5LmF2ZVZhcmlhbmNlIC8gb3RoZXJUcnkubGluZVdpZHRocy5sZW5ndGg7XG5cdFx0ZXhwbGFuYXRpb24uYXR0ZW1wdHMucHVzaCh7IHR5cGU6IFwib3B0aW1pemVMaW5lV2lkdGhzXCIsIGxpbmVCcmVha3M6IG90aGVyVHJ5LmxpbmVCcmVha3MsIHZhcmlhbmNlczogb3RoZXJUcnkudmFyaWFuY2VzLCBhdmVWYXJpYW5jZTogb3RoZXJUcnkuYXZlVmFyaWFuY2UsIHdpZHRoczogd2lkdGhzLm1lYXN1cmVXaWR0aHMgfSk7XG5cdH1cblx0dmFyIHNtYWxsZXN0ID0gOTk5OTk5OTtcblx0dmFyIHNtYWxsZXN0SW5kZXggPSAtMTtcblx0Zm9yIChpID0gMDsgaSA8IG90aGVyVHJpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdGhlclRyeSA9IG90aGVyVHJpZXNbaV07XG5cdFx0aWYgKG90aGVyVHJ5LmF2ZVZhcmlhbmNlIDwgc21hbGxlc3QpIHtcblx0XHRcdHNtYWxsZXN0ID0gb3RoZXJUcnkuYXZlVmFyaWFuY2U7XG5cdFx0XHRzbWFsbGVzdEluZGV4ID0gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgZmFpbGVkOiBmYWxzZSwgbGluZUJyZWFrczogb3RoZXJUcmllc1tzbWFsbGVzdEluZGV4XS5saW5lQnJlYWtzLCB2YXJpYW5jZTogb3RoZXJUcmllc1tzbWFsbGVzdEluZGV4XS5oaWdoZXN0VmFyaWFuY2UgfTtcbn1cbi8vIFx0Ly8gSW5zdGVhZCBvZiBoYXZpbmcgdG8gdHJ5IGFsbCB0aGUgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyB0byBmaW5kIHRoZSBiZXN0LCB3ZSBzdGFydCB3aXRoIGFuIGltcG9ydGFudCBwaWVjZSBvZiBrbm93bGVkZ2UgYWJvdXQgdGhlIGxpbmVCcmVha3Mgd2UgYXJlIGdpdmVuOlxuLy8gXHQvLyBJZiB0aGVyZSBpcyBhIGxpbmUgdG9vIHNob3J0LCBpdCBpcyB0aGUgbGFzdCBvbmUuXG4vLyBcdC8vIFNvLCBsZXQncyBqdXN0IGRvIGEgY291cGxlIG9mIHR3ZWFrcyB0byBzZWUgaG93IGl0IHdvcmtzIHRvIGFkZCBvbmUgb3IgdHdvIG1lYXN1cmVzIHRvIHRoZSBsYXN0IGxpbmUuXG4vLyBcdHZhciBhdmcgPSB3aWR0aHMudG90YWwgLyAobGluZUJyZWFrcy5sZW5ndGggKyAxKTtcbi8vIFx0dmFyIHZhcmlhbmNlID0gZ2V0VmFyaWFuY2Uod2lkdGhzLCBsaW5lQnJlYWtzKTtcbi8vIFx0dmFyIHZhcmlhbmNlUGN0ID0gdmFyaWFuY2UvbGluZUJyZWFrUG9pbnQqMTAwO1xuLy9cbi8vIFx0aWYgKGxpbmVCcmVha3MubGVuZ3RoID09PSAwKVxuLy8gXHRcdHJldHVybiB7IGZhaWxlZDogdHJ1ZSwgcmVhc29uOiBcIk9ubHkgb25lIGxpbmUuXCIgfTtcbi8vXG4vLyBcdHZhciBsYXN0TGluZVN0YXJ0ID0gbGluZUJyZWFrc1tsaW5lQnJlYWtzLmxlbmd0aC0xXSsxO1xuLy8gXHR2YXIgbGFzdExpbmVWYXJpYW5jZSA9IGxpbmVWYXJpYW5jZSh3aWR0aHMubWVhc3VyZVdpZHRocywgbGFzdExpbmVTdGFydCwgd2lkdGhzLm1lYXN1cmVXaWR0aHMubGVuZ3RoLCBhdmcpO1xuLy8gXHRpZiAodmFyaWFuY2UgPiBsYXN0TGluZVZhcmlhbmNlKVxuLy8gXHRcdHJldHVybiB7IGZhaWxlZDogdHJ1ZSwgcmVhc29uOiBcIkxhc3QgbGluZSBpcyBub3QgdG9vIHNob3J0LlwiIH07XG4vL1xuLy8gXHQvLyBMZXQncyBnZXQgYSBsaXN0IG9mIGFsbCBjb21iaW5hdGlvbnMgdGhhdCBoYXZlIGEgcG9zc2liaWxpdHkgb2Ygd29ya2luZy4gVGhhdCBpcywgYWxsIGNvbWJpbmF0aW9ucyB3aGVyZSBubyBsaW5lIGhhcyBhIHZhcmlhbmNlIGxhcmdlciB0aGFuIFwidmFyaWFuY2VcIi5cbi8vIFx0dmFyIGxhc3RMaW5lcyA9IGxhc3RMaW5lUG9zc2liaWxpdGllcyh3aWR0aHMubWVhc3VyZVdpZHRocywgbGFzdExpbmVTdGFydCwgYXZnIC0gdmFyaWFuY2UsIGF2ZyArIHZhcmlhbmNlKTtcbi8vIFx0dmFyIGF0dGVtcHRzID0gZ2V0QXR0ZW1wdHMod2lkdGhzLm1lYXN1cmVXaWR0aHMsIDAsIGxpbmVCcmVha3MubGVuZ3RoLCBhdmcgLSB2YXJpYW5jZSwgYXZnICsgdmFyaWFuY2UsIGxhc3RMaW5lcyk7XG4vLyBcdC8vY29uc29sZS5sb2coYXR0ZW1wdHMsIGF2ZyAtIHZhcmlhbmNlLCBhdmcgKyB2YXJpYW5jZSk7XG4vL1xuLy8gXHR2YXIgZmFpbGVkID0gdHJ1ZTtcbi8vIFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhdHRlbXB0cy5sZW5ndGg7IGkrKykge1xuLy8gXHRcdHZhciBuZXdWYXJpYW5jZSA9IGdldFZhcmlhbmNlKHdpZHRocywgYXR0ZW1wdHNbaV0pO1xuLy8gXHRcdGlmIChuZXdWYXJpYW5jZSA8IHZhcmlhbmNlKSB7XG4vLyBcdFx0XHRleHBsYW5hdGlvbi5hdHRlbXB0cy5wdXNoKHtcbi8vIFx0XHRcdFx0dHlwZTogXCJPcHRpbWl6ZSB0cnlcIiwgbGluZUJyZWFrczogYXR0ZW1wdHNbaV0sXG4vLyBcdFx0XHRcdHZhcmlhbmNlOiBNYXRoLnJvdW5kKHZhcmlhbmNlKSwgbmV3VmFyaWFuY2U6IE1hdGgucm91bmQobmV3VmFyaWFuY2UpLFxuLy8gXHRcdFx0XHR0b3RhbEF0dGVtcHRzOiBhdHRlbXB0cy5sZW5ndGhcbi8vIFx0XHRcdH0pO1xuLy8gXHRcdFx0dmFyaWFuY2UgPSBuZXdWYXJpYW5jZTtcbi8vIFx0XHRcdGxpbmVCcmVha3MgPSBhdHRlbXB0c1tpXTtcbi8vIFx0XHRcdGZhaWxlZCA9IGZhbHNlO1xuLy8gXHRcdH1cbi8vIFx0fVxuLy8gXHRpZiAoZmFpbGVkKSB7XG4vLyBcdFx0ZXhwbGFuYXRpb24uYXR0ZW1wdHMucHVzaCh7IHR5cGU6IFwiT3B0aW1pemUgdHJ5XCIsIGxpbmVCcmVha3M6IGxpbmVCcmVha3MsIHZhcmlhbmNlOiB2YXJpYW5jZSwgcmVhc29uOiBcIk5vbmUgb2YgdGhlIFwiICsgYXR0ZW1wdHMubGVuZ3RoICsgXCIgYXR0ZW1wdHMgd2VyZSBiZXR0ZXIuXCIgfSk7XG4vLyBcdFx0Ly8gVE9ETy1QRVI6IFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGp1c3QgdHJ5IHRvIG1vdmUgb25lIG1lYXN1cmUgZG93biBhbmQgc2VlIGlmIGl0IGhlbHBzLlxuLy8gXHRcdGlmIChsaW5lQnJlYWtzLmxlbmd0aCA+IDApIHtcbi8vIFx0XHRcdHZhciBhdHRlbXB0ID0gW10uY29uY2F0KGxpbmVCcmVha3MpO1xuLy8gXHRcdFx0YXR0ZW1wdFthdHRlbXB0Lmxlbmd0aCAtIDFdLS07XG4vLyBcdFx0XHRuZXdWYXJpYW5jZSA9IGdldFZhcmlhbmNlKHdpZHRocywgYXR0ZW1wdCk7XG4vLyBcdFx0XHRleHBsYW5hdGlvbi5hdHRlbXB0cy5wdXNoKHtcbi8vIFx0XHRcdFx0dHlwZTogXCJPcHRpbWl6ZSBsYXN0IHRyeVwiLCBsaW5lQnJlYWtzOiBhdHRlbXB0c1tpXSxcbi8vIFx0XHRcdFx0dmFyaWFuY2U6IE1hdGgucm91bmQodmFyaWFuY2UpLCBuZXdWYXJpYW5jZTogTWF0aC5yb3VuZChuZXdWYXJpYW5jZSksXG4vLyBcdFx0XHRcdHRvdGFsQXR0ZW1wdHM6IGF0dGVtcHRzLmxlbmd0aFxuLy8gXHRcdFx0fSk7XG4vLyBcdFx0XHRpZiAobmV3VmFyaWFuY2UgPCB2YXJpYW5jZSkge1xuLy8gXHRcdFx0XHR2YXJpYW5jZSA9IG5ld1ZhcmlhbmNlO1xuLy8gXHRcdFx0XHRsaW5lQnJlYWtzID0gYXR0ZW1wdDtcbi8vIFx0XHRcdFx0ZmFpbGVkID0gZmFsc2U7XG4vLyBcdFx0XHR9XG4vLyBcdFx0fVxuLy8gXHR9XG4vLyBcdC8vIExldCdzIHNxdWVlemUgdGhlIGxpbmUgc3VjY2Vzc2l2ZWx5IHVudGlsIGl0IHNwaWxscyBvbnRvIGFuIGV4dHJhIGxpbmUsIHRoZW4gdGFrZSB0aGUgb3B0aW9uIHdpdGggdGhlIGxvd2VzdCB2YXJpYW5jZVxuLy8gXHQvLyB2YXIgdGFyZ2V0TnVtTGluZXMgPSBsaW5lQnJlYWtzLmxlbmd0aDtcbi8vIFx0Ly8gdmFyIG5ld051bUxpbmVzID0gdGFyZ2V0TnVtTGluZXM7XG4vLyBcdC8vIHZhciBUUllfSU5DUkVNRU5UID0gMTtcbi8vIFx0Ly8gdmFyIHRyeUJyZWFrUG9pbnQgPSBsaW5lQnJlYWtQb2ludCAtIFRSWV9JTkNSRU1FTlQ7XG4vLyBcdC8vIHZhciBmYWlsZWQgPSB0cnVlO1xuLy8gXHQvLyB3aGlsZSAodGFyZ2V0TnVtTGluZXMgPT09IG5ld051bUxpbmVzICYmIHRyeUJyZWFrUG9pbnQgPiA1MCkge1xuLy8gXHQvLyBcdHZhciBmZiA9IGZyZWVGb3JtTGluZUJyZWFrcyh3aWR0aHMubWVhc3VyZVdpZHRocywgdHJ5QnJlYWtQb2ludCk7XG4vLyBcdC8vIFx0bmV3TnVtTGluZXMgPSBmZi5saW5lQnJlYWtzLmxlbmd0aDtcbi8vIFx0Ly8gXHRpZiAobmV3TnVtTGluZXMgPT09IHRhcmdldE51bUxpbmVzKSB7XG4vLyBcdC8vIFx0XHR2YXIgbmV3VmFyaWFuY2UgPSBnZXRWYXJpYW5jZSh3aWR0aHMsIGZmLmxpbmVCcmVha3MpO1xuLy8gXHQvLyBcdFx0dmFyIG5ld1ZhcmlhbmNlUGN0ID0gbmV3VmFyaWFuY2UvdHJ5QnJlYWtQb2ludCoxMDA7XG4vLyBcdC8vIFx0XHRleHBsYW5hdGlvbi5hdHRlbXB0cy5wdXNoKHt0eXBlOiBcIk9wdGltaXplIHRyeVwiLCB0cnlCcmVha1BvaW50OiBNYXRoLnJvdW5kKHRyeUJyZWFrUG9pbnQpLCBsaW5lQnJlYWtzOiBmZi5saW5lQnJlYWtzLCB0b3RhbHM6IGZmLnRvdGFscyxcbi8vIFx0Ly8gXHRcdFx0dmFyaWFuY2U6IE1hdGgucm91bmQodmFyaWFuY2UpLCBuZXdWYXJpYW5jZTogTWF0aC5yb3VuZChuZXdWYXJpYW5jZSksIHZhcmlhbmNlUGN0OiBNYXRoLnJvdW5kKHZhcmlhbmNlUGN0KSwgbmV3VmFyaWFuY2VQY3Q6IE1hdGgucm91bmQobmV3VmFyaWFuY2VQY3QpXG4vLyBcdC8vIFx0XHR9KTtcbi8vIFx0Ly8gXHRcdGlmIChuZXdWYXJpYW5jZVBjdCA8IHZhcmlhbmNlUGN0KSB7XG4vLyBcdC8vIFx0XHRcdHZhcmlhbmNlUGN0ID0gbmV3VmFyaWFuY2VQY3Q7XG4vLyBcdC8vIFx0XHRcdGxpbmVCcmVha3MgPSBmZi5saW5lQnJlYWtzO1xuLy8gXHQvLyBcdFx0XHRmYWlsZWQgPSBmYWxzZTtcbi8vIFx0Ly8gXHRcdH1cbi8vIFx0Ly8gXHR9IGVsc2Uge1xuLy8gXHQvLyBcdFx0ZXhwbGFuYXRpb24uYXR0ZW1wdHMucHVzaCh7dHlwZTogXCJPcHRpbWl6ZSB0cnlcIiwgZXhwbGFuYXRpb246IFwiRXhjZWVkZWQgbnVtYmVyIG9mIGxpbmVzLlwiICwgdHJ5QnJlYWtQb2ludDogTWF0aC5yb3VuZCh0cnlCcmVha1BvaW50KSwgbGluZUJyZWFrczogZmYubGluZUJyZWFrcywgdG90YWxzOiBmZi50b3RhbHMsIHZhcmlhbmNlOiB2YXJpYW5jZSwgYXZnOiBhdmcsIHZhcmlhbmNlUGN0OiB2YXJpYW5jZVBjdH0pO1xuLy8gXHQvLyBcdH1cbi8vIFx0Ly8gXHR0cnlCcmVha1BvaW50IC09IFRSWV9JTkNSRU1FTlQ7XG4vLyBcdC8vIH1cbi8vXG4vLyBcdHJldHVybiB7IGZhaWxlZDogZmFpbGVkLCBsaW5lQnJlYWtzOiBsaW5lQnJlYWtzLCB2YXJpYW5jZTogdmFyaWFuY2UgfTtcbi8vIH1cblxuLy8gZnVuY3Rpb24gZml4ZWROdW1MaW5lc0JyZWFrcyh3aWR0aHMsIG51bUxpbmVzLCBhbGxvd092ZXIsIGFsbG93YWJsZVZhcmlhbmNlKSB7XG4vLyBcdHZhciBpZGVhbExpbmVCcmVhayA9IHdpZHRocy50b3RhbCAvIG51bUxpbmVzO1xuLy8gXHQvLyBJZiBhbGwgdGhlIG1lYXN1cmVzIGhhZCB0aGUgc2FtZSBhbW91bnQgb2Ygc3R1ZmYsIHRoZW4gdGhlIGF2ZSB3b3VsZCBiZSBjb3JyZWN0LlxuLy8gXHQvLyBXZSB3aWxsIHRlc3QgYWxsIHRoZSBjb21iaW5hdGlvbnMgZnJvbSBvbmUgbGVzcyB0byBvbmUgbW9yZSB0aGFuIHRoZSBhdmVyYWdlLlxuLy8gXHR2YXIgYXZlcmFnZU1lYXN1cmVzUGVyTGluZSA9IE1hdGgucm91bmQod2lkdGhzLm1lYXN1cmVXaWR0aHMubGVuZ3RoIC8gbnVtTGluZXMpO1xuLy8gXHR2YXIgbWluTWVhc3VyZXNQZXJMaW5lID0gTWF0aC5tYXgoYXZlcmFnZU1lYXN1cmVzUGVyTGluZSAtIDEsIDEpO1xuLy8gXHR2YXIgbWF4TWVhc3VyZXNQZXJMaW5lID0gYXZlcmFnZU1lYXN1cmVzUGVyTGluZSArIDE7XG4vLyBcdHZhciB0cmllcyA9IGNyZWF0ZUxpbmVUZXN0QXJyYXkobnVtTGluZXMsIHdpZHRocy5tZWFzdXJlV2lkdGhzLmxlbmd0aCwgbWF4TWVhc3VyZXNQZXJMaW5lLCBtaW5NZWFzdXJlc1BlckxpbmUpO1xuLy8gXHRjb25zb2xlLmxvZyhcImZpeGVkTnVtTGluZXNCcmVha3MgdGVzdHMgKFwiK21pbk1lYXN1cmVzUGVyTGluZSsnLScrbWF4TWVhc3VyZXNQZXJMaW5lK1wiKVwiLCBudW1MaW5lcywgdHJpZXMubGVuZ3RoKVxuLy9cbi8vIFx0Ly8gRm9yIGVhY2ggcG9zc2libGUgbnVtYmVyIG9mIG1lYXN1cmVzIHBlciBsaW5lLCBzZWUgd2hpY2ggaGFzIHRoZSBjbG9zZXN0IHNwYWNpbmcgdG8gdGhlIGlkZWFsLlxuLy8gXHR2YXIgYmVzdENhc2UgPSAtMTtcbi8vIFx0dmFyIGJlc3RDYXNlVmFyaWFuY2UgPSAxMDAwMDAwO1xuLy8gXHRmb3IgKHZhciBpID0gMCA7IGkgPCB0cmllcy5sZW5ndGg7IGkrKykge1xuLy8gXHRcdHZhciBhdHRlbXB0ID0gdHJpZXNbaV07XG4vLyBcdFx0dmFyIHZhcmlhbmNlID0gZ2V0VmFyaWFuY2UoYXR0ZW1wdCwgaWRlYWxMaW5lQnJlYWssIHdpZHRocy5tZWFzdXJlV2lkdGhzLCBhbGxvd092ZXIgPyBhbGxvd2FibGVWYXJpYW5jZSA6IDApO1xuLy8gXHRcdGlmICh2YXJpYW5jZSAhPT0gbnVsbCkge1xuLy8gXHRcdFx0aWYgKHZhcmlhbmNlIDwgYmVzdENhc2VWYXJpYW5jZSkge1xuLy8gXHRcdFx0XHRiZXN0Q2FzZVZhcmlhbmNlID0gdmFyaWFuY2U7XG4vLyBcdFx0XHRcdGJlc3RDYXNlID0gaTtcbi8vIFx0XHRcdH1cbi8vIFx0XHR9XG4vLyBcdH1cbi8vIFx0dmFyIGZhaWxlZCA9IHRydWU7XG4vLyBcdC8vIEZvciBkZWJ1Z2dpbmcsIHJlY3JlYXRlIHRoZSBsaW5lIHdpZHRoc1xuLy8gXHR2YXIgdG90YWxzID0gW107XG4vLyBcdGlmIChiZXN0Q2FzZSA+PSAwKSB7XG4vLyBcdFx0ZmFpbGVkID0gZmFsc2U7XG4vLyBcdFx0dmFyIGluZGV4ID0gMDtcbi8vIFx0XHRmb3IgKGkgPSAwOyBpIDwgdHJpZXNbYmVzdENhc2VdLmxlbmd0aDsgaSsrKSB7XG4vLyBcdFx0XHR2YXIgdG90YWwgPSAwO1xuLy8gXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0cmllc1tiZXN0Q2FzZV1baV07IGorKykge1xuLy8gXHRcdFx0XHR0b3RhbCArPSB3aWR0aHMubWVhc3VyZVdpZHRoc1tpbmRleCsrXTtcbi8vIFx0XHRcdH1cbi8vIFx0XHRcdHRvdGFscy5wdXNoKE1hdGgucm91bmQodG90YWwpKTtcbi8vIFx0XHR9XG4vLyBcdFx0Ly8gV2Ugbm93IGhhdmUgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIG1lYXN1cmVzIHBlciBsaW5lLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGFic29sdXRlIG1lYXN1cmUgbnVtYmVyIHRvIGJyZWFrIG9uLlxuLy8gXHRcdGlmICh0cmllc1tiZXN0Q2FzZV0ubGVuZ3RoID4gMCkge1xuLy8gXHRcdFx0dHJpZXNbYmVzdENhc2VdWzBdLS07IC8vIFRoZSByZXN1bHRzIHNob3VsZCBjb250YWluIHRoZSBsYXN0IG1lYXN1cmUgbnVtYmVyIG9uIHRoZSBsaW5lLCB6ZXJvLWJhc2VkLlxuLy8gXHRcdFx0Zm9yIChpID0gMTsgaSA8IHRyaWVzW2Jlc3RDYXNlXS5sZW5ndGg7IGkrKylcbi8vIFx0XHRcdFx0dHJpZXNbYmVzdENhc2VdW2ldICs9IHRyaWVzW2Jlc3RDYXNlXVtpIC0gMV07IC8vIFRoaXMgc2V0cyB0aGUgemVyby1iYXNlZCBtZWFzdXJlIG51bWJlclxuLy8gXHRcdFx0Ly8gVGhlIGxhc3QgbGluZSBpcyBpbXBsaWVkIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHJldHVybiBpdFxuLy8gXHRcdFx0dHJpZXNbYmVzdENhc2VdLnBvcCgpO1xuLy8gXHRcdH1cbi8vIFx0fVxuLy8gXHRyZXR1cm4geyBmYWlsZWQ6IGZhaWxlZCwgbGluZUJyZWFrczogdHJpZXNbYmVzdENhc2VdLCBiZXN0Q2FzZVZhcmlhbmNlOiBNYXRoLnJvdW5kKGJlc3RDYXNlVmFyaWFuY2UpLCB0b3RhbHM6IHRvdGFscyB9O1xuLy8gfVxuXG5mdW5jdGlvbiBmaXhlZE1lYXN1cmVMaW5lQnJlYWtzKHdpZHRocywgbGluZUJyZWFrUG9pbnQsIHByZWZlcnJlZE1lYXN1cmVzUGVyTGluZSkge1xuXHR2YXIgbGluZUJyZWFrcyA9IFtdO1xuXHR2YXIgdG90YWxzID0gW107XG5cdHZhciB0aGlzV2lkdGggPSAwO1xuXHR2YXIgZmFpbGVkID0gZmFsc2U7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dGhpc1dpZHRoICs9IHdpZHRoc1tpXTtcblx0XHRpZiAodGhpc1dpZHRoID4gbGluZUJyZWFrUG9pbnQpIHtcblx0XHRcdGZhaWxlZCA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChpICUgcHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lID09PSAocHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lLTEpKSB7XG5cdFx0XHRpZiAoaSAhPT0gd2lkdGhzLmxlbmd0aC0xKSAvLyBEb24ndCBib3RoZXIgcHV0dGluZyBhIGxpbmUgYnJlYWsgZm9yIHRoZSBsYXN0IGxpbmUgLSBpdCdzIGFscmVhZHkgYSBicmVhay5cblx0XHRcdFx0bGluZUJyZWFrcy5wdXNoKGkpO1xuXHRcdFx0dG90YWxzLnB1c2goTWF0aC5yb3VuZCh0aGlzV2lkdGgpKTtcblx0XHRcdHRoaXNXaWR0aCA9IDA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IGZhaWxlZDogZmFpbGVkLCB0b3RhbHM6IHRvdGFscywgbGluZUJyZWFrczogbGluZUJyZWFrcyB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZXZpc2VkVHVuZShsaW5lQnJlYWtzLCBzdGFmZldpZHRoLCBhYmNTdHJpbmcsIHBhcmFtcywgUGFyc2UpIHtcblx0dmFyIGFiY1BhcnNlciA9IG5ldyBQYXJzZSgpO1xuXHR2YXIgcmV2aXNlZFBhcmFtcyA9IHtcblx0XHRsaW5lQnJlYWtzOiBsaW5lQnJlYWtzLFxuXHRcdHN0YWZmd2lkdGg6IHN0YWZmV2lkdGhcblx0fTtcblx0Zm9yICh2YXIga2V5IGluIHBhcmFtcykge1xuXHRcdGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkgIT09ICd3cmFwJyAmJiBrZXkgIT09ICdzdGFmZndpZHRoJykge1xuXHRcdFx0cmV2aXNlZFBhcmFtc1trZXldID0gcGFyYW1zW2tleV07XG5cdFx0fVxuXHR9XG5cblx0YWJjUGFyc2VyLnBhcnNlKGFiY1N0cmluZywgcmV2aXNlZFBhcmFtcyk7XG5cdHJldHVybiB7IHR1bmU6IGFiY1BhcnNlci5nZXRUdW5lKCksIHJldmlzZWRQYXJhbXM6IHJldmlzZWRQYXJhbXMgfTtcbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVXcmFwcyh0dW5lLCB3aWR0aHMsIGFiY1N0cmluZywgcGFyYW1zLCBQYXJzZSwgZW5ncmF2ZXJfY29udHJvbGxlcikge1xuXHQvLyBGb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggY2FuIGdvIG9uIHRoZSBsaW5lLCBpdCBkZXBlbmRzIG9uIHRoZSB3aWR0aCBvZiB0aGUgbGluZS4gSXQgaXMgYSBjb252ZW5pZW5jZSB0byBqdXN0IGRpdmlkZSBpdCBoZXJlXG5cdC8vIGJ5IHRoZSBtaW5pbXVtIHNwYWNpbmcgaW5zdGVhZCBvZiBtdWx0aXBseWluZyB0aGUgbWluIHNwYWNpbmcgbGF0ZXIuXG5cdC8vIFRoZSBzY2FsaW5nIHdvcmtzIGRpZmZlcmVudGx5OiB0aGlzIGlzIGRvbmUgYnkgY2hhbmdpbmcgdGhlIHNjYWxpbmcgb2YgdGhlIG91dGVyIFNWRywgc28gdGhlIHNjYWxpbmcgbmVlZHMgdG8gYmUgY29tcGVuc2F0ZWRcblx0Ly8gZm9yIGhlcmUsIGJlY2F1c2UgdGhlIGFjdHVhbCB3aWR0aCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjYWxjdWxhdGVkIG51bWJlcnMuXG5cblx0Ly8gSWYgdGhlIGRlc2lyZWQgd2lkdGggaXMgbGVzcyB0aGFuIHRoZSBtYXJnaW4sIGp1c3QgcHVudCBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCB0dW5lXG5cdGlmIChwYXJhbXMuc3RhZmZ3aWR0aCA8IHdpZHRocy5sZWZ0KSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGV4cGxhbmF0aW9uOiBcIlN0YWZmd2lkdGggaXMgbmFycm93ZXIgdGhhbiB0aGUgbWFyZ2luXCIsXG5cdFx0XHR0dW5lOiB0dW5lLFxuXHRcdFx0cmV2aXNlZFBhcmFtczogcGFyYW1zXG5cdFx0fTtcblx0fVxuXHR2YXIgc2NhbGUgPSBwYXJhbXMuc2NhbGUgPyBNYXRoLm1heChwYXJhbXMuc2NhbGUsIDAuMSkgOiAxO1xuXHR2YXIgbWluU3BhY2luZyA9IHBhcmFtcy53cmFwLm1pblNwYWNpbmcgPyBNYXRoLm1heChwYXJzZUZsb2F0KHBhcmFtcy53cmFwLm1pblNwYWNpbmcpLCAxKSA6IDE7XG5cdHZhciBtaW5TcGFjaW5nTGltaXQgPSBwYXJhbXMud3JhcC5taW5TcGFjaW5nTGltaXQgPyBNYXRoLm1heChwYXJzZUZsb2F0KHBhcmFtcy53cmFwLm1pblNwYWNpbmdMaW1pdCksIDEpIDogbWluU3BhY2luZyAtIDAuMTtcblx0dmFyIG1heFNwYWNpbmcgPSBwYXJhbXMud3JhcC5tYXhTcGFjaW5nID8gTWF0aC5tYXgocGFyc2VGbG9hdChwYXJhbXMud3JhcC5tYXhTcGFjaW5nKSwgMSkgOiB1bmRlZmluZWQ7XG5cdGlmIChwYXJhbXMud3JhcC5sYXN0TGluZUxpbWl0ICYmICFtYXhTcGFjaW5nKVxuXHRcdG1heFNwYWNpbmcgPSBNYXRoLm1heChwYXJzZUZsb2F0KHBhcmFtcy53cmFwLmxhc3RMaW5lTGltaXQpLCAxKTtcblx0dmFyIHRhcmdldEhlaWdodCA9IHBhcmFtcy53cmFwLnRhcmdldEhlaWdodCA/IE1hdGgubWF4KHBhcnNlSW50KHBhcmFtcy53cmFwLnRhcmdldEhlaWdodCwgMTApLCAxMDApIDogdW5kZWZpbmVkO1xuXHR2YXIgcHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lID0gcGFyYW1zLndyYXAucHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lID8gTWF0aC5tYXgocGFyc2VJbnQocGFyYW1zLndyYXAucHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lLCAxMCksIDEpIDogdW5kZWZpbmVkO1xuXG5cdHZhciBsaW5lQnJlYWtQb2ludCA9IChwYXJhbXMuc3RhZmZ3aWR0aCAtIHdpZHRocy5sZWZ0KSAvIG1pblNwYWNpbmcgLyBzY2FsZTtcblx0dmFyIG1pbkxpbmVTaXplID0gKHBhcmFtcy5zdGFmZndpZHRoIC0gd2lkdGhzLmxlZnQpIC8gbWF4U3BhY2luZyAvIHNjYWxlO1xuXHR2YXIgYWxsb3dhYmxlVmFyaWFuY2UgPSAocGFyYW1zLnN0YWZmd2lkdGggLSB3aWR0aHMubGVmdCkgLyBtaW5TcGFjaW5nTGltaXQgLyBzY2FsZTtcblx0dmFyIGV4cGxhbmF0aW9uID0geyB3aWR0aHM6IHdpZHRocywgbGluZUJyZWFrUG9pbnQ6IGxpbmVCcmVha1BvaW50LCBtaW5MaW5lU2l6ZTogbWluTGluZVNpemUsIGF0dGVtcHRzOiBbXSwgc3RhZmZXaWR0aDogcGFyYW1zLnN0YWZmd2lkdGgsIG1pbldpZHRoOiBNYXRoLnJvdW5kKGFsbG93YWJsZVZhcmlhbmNlKSB9O1xuXG5cdC8vIElmIHRoZXJlIGlzIGEgcHJlZmVycmVkIG51bWJlciBvZiBtZWFzdXJlcyBwZXIgbGluZSwgdGVzdCB0aGF0IGZpcnN0LiBJZiBub25lIG9mIHRoZSBsaW5lcyBpcyB0b28gbG9uZywgdGhlbiB3ZSdyZSBmaW5pc2hlZC5cblx0dmFyIGxpbmVCcmVha3MgPSBudWxsO1xuXHRpZiAocHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lKSB7XG5cdFx0dmFyIGYgPSBmaXhlZE1lYXN1cmVMaW5lQnJlYWtzKHdpZHRocy5tZWFzdXJlV2lkdGhzLCBsaW5lQnJlYWtQb2ludCwgcHJlZmVycmVkTWVhc3VyZXNQZXJMaW5lKTtcblx0XHRleHBsYW5hdGlvbi5hdHRlbXB0cy5wdXNoKHsgdHlwZTogXCJGaXhlZCBNZWFzdXJlcyBQZXIgTGluZVwiLCBwcmVmZXJyZWRNZWFzdXJlc1BlckxpbmU6IHByZWZlcnJlZE1lYXN1cmVzUGVyTGluZSwgbGluZUJyZWFrczogZi5saW5lQnJlYWtzLCBmYWlsZWQ6IGYuZmFpbGVkLCB0b3RhbHM6IGYudG90YWxzIH0pO1xuXHRcdGlmICghZi5mYWlsZWQpXG5cdFx0XHRsaW5lQnJlYWtzID0gZi5saW5lQnJlYWtzO1xuXHR9XG5cblx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBsaW5lQnJlYWtzIHlldCwgdXNlIHRoZSBmcmVlIGZvcm0gbWV0aG9kIG9mIGxpbmUgYnJlYWtzLlxuXHQvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGVpdGhlciBpZiBQcmVmZXJyZWQgTWVhc3VyZXMgaXMgbm90IHVzZWQsIG9yIGlmIHRoZSBtdXNpYyBpcyBqdXN0IHdlaXJkIC0gbGlrZSBhIHNpbmdsZSBtZWFzdXJlIGlzIHdheSB0b28gY3Jvd2RlZC5cblx0aWYgKCFsaW5lQnJlYWtzKSB7XG5cdFx0dmFyIGZmID0gZnJlZUZvcm1MaW5lQnJlYWtzKHdpZHRocy5tZWFzdXJlV2lkdGhzLCBsaW5lQnJlYWtQb2ludCk7XG5cdFx0ZXhwbGFuYXRpb24uYXR0ZW1wdHMucHVzaCh7IHR5cGU6IFwiRnJlZSBGb3JtXCIsIGxpbmVCcmVha3M6IGZmLmxpbmVCcmVha3MsIHRvdGFsczogZmYudG90YWxzIH0pO1xuXHRcdGxpbmVCcmVha3MgPSBmZi5saW5lQnJlYWtzO1xuXG5cdFx0Ly8gV2Ugbm93IGhhdmUgYW4gYWNjZXB0YWJsZSBudW1iZXIgb2YgbGluZXMsIGJ1dCB0aGUgbWVhc3VyZXMgbWF5IG5vdCBiZSBvcHRpbWFsbHkgZGlzdHJpYnV0ZWQuIFNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBkaXN0cmlidXRpb24uXG5cdFx0ZmYgPSBvcHRpbWl6ZUxpbmVXaWR0aHMod2lkdGhzLCBsaW5lQnJlYWtQb2ludCwgbGluZUJyZWFrcywgZXhwbGFuYXRpb24pO1xuXHRcdGV4cGxhbmF0aW9uLmF0dGVtcHRzLnB1c2goeyB0eXBlOiBcIk9wdGltaXplXCIsIGZhaWxlZDogZmYuZmFpbGVkLCByZWFzb246IGZmLnJlYXNvbiwgbGluZUJyZWFrczogZmYubGluZUJyZWFrcywgdG90YWxzOiBmZi50b3RhbHMgfSk7XG5cdFx0aWYgKCFmZi5mYWlsZWQpXG5cdFx0XHRsaW5lQnJlYWtzID0gZmYubGluZUJyZWFrcztcblx0fVxuXG5cdC8vIElmIHRoZSB2ZXJ0aWNhbCBzcGFjZSBleGNlZWRzIHRhcmdldEhlaWdodCwgcmVtb3ZlIGEgbGluZSBhbmQgdHJ5IGFnYWluLiBJZiB0aGF0IGlzIHRvbyBjcm93ZGVkLCB0aGVuIGRvbid0IHVzZSBpdC5cblx0dmFyIHN0YWZmV2lkdGggPSBwYXJhbXMuc3RhZmZ3aWR0aDtcblx0dmFyIHJldCA9IGdldFJldmlzZWRUdW5lKGxpbmVCcmVha3MsIHN0YWZmV2lkdGgsIGFiY1N0cmluZywgcGFyYW1zLCBQYXJzZSk7XG5cdHZhciBuZXdXaWR0aHMgPSBlbmdyYXZlcl9jb250cm9sbGVyLmdldE1lYXN1cmVXaWR0aHMocmV0LnR1bmUpO1xuXHR2YXIgZ290VHVuZSA9IHRydWU7IC8vIElmIHdlIGFkanVzdCB0aGUgbnVtIGxpbmVzLCBzZXQgdGhpcyB0byBmYWxzZVxuXHRleHBsYW5hdGlvbi5hdHRlbXB0cy5wdXNoKHt0eXBlOiBcImhlaWdodENoZWNrXCIsIGhlaWdodDogbmV3V2lkdGhzLmhlaWdodCB9KTtcblxuXHQvLyBcdGlmIGFsbCBvZiB0aGUgbGluZXMgYXJlIHRvbyBzcGFyc2UsIG1ha2UgdGhlIHdpZHRoIG5hcnJvd2VyLlxuXHQvLyBUT0RPLVBFUjogaW1wbGVtZW50IHRoaXMgY2FzZS5cblxuXHQvLyBJZiBvbmUgbGluZSBhbmQgdGhlIHNwYWNpbmcgaXMgPiBtYXhTcGFjaW5nLCBtYWtlIHRoZSB3aWR0aCBuYXJyb3dlci5cblx0aWYgKGxpbmVCcmVha3MubGVuZ3RoID09PSAwICYmIG1pbkxpbmVTaXplID4gd2lkdGhzLnRvdGFsKSB7XG5cdFx0c3RhZmZXaWR0aCA9ICh3aWR0aHMudG90YWwgKiBtYXhTcGFjaW5nICogc2NhbGUpICsgd2lkdGhzLmxlZnQ7XG5cdFx0ZXhwbGFuYXRpb24uYXR0ZW1wdHMucHVzaCh7dHlwZTogXCJ0b28gc3BhcnNlXCIsIG5ld1dpZHRoOiBNYXRoLnJvdW5kKHN0YWZmV2lkdGgpfSlcblx0XHRnb3RUdW5lID0gZmFsc2U7XG5cdH1cblxuXHQvLyBpZiAocmV0LmxpbmVCcmVha3MubGVuZ3RoID09PSAwKSB7XG5cdC8vIFx0Ly8gRXZlcnl0aGluZyBmaXRzIG9uIG9uZSBsaW5lLCBzbyBzZWUgaWYgdGhlcmUgaXMgVE9PIG11Y2ggc3BhY2UgYW5kIHRoZSBzdGFmZiB3aWR0aCBuZWVkcyB0byBiZSBzaG9ydGVuZWQuXG5cdC8vIFx0aWYgKG1pbkxpbmVTaXplID4gMCAmJiByZXQudG90YWxUaGlzTGluZSA+IDAgJiYgcmV0LnRvdGFsVGhpc0xpbmUgPCBtaW5MaW5lU2l6ZSlcblx0Ly8gXHRcdHN0YWZmV2lkdGggPSBzdGFmZldpZHRoIC8gKG1pbkxpbmVTaXplIC8gcmV0LnRvdGFsVGhpc0xpbmUpO1xuXHQvLyB9IGVsc2UgaWYgKHJldC50b3RhbFRoaXNMaW5lIDwgbWluTGluZVNpemUpIHtcblx0Ly8gXHQvLyB0aGUgbGFzdCBsaW5lIGlzIHRvbyBzaG9ydCwgc28gYXR0ZW1wdCB0byByZWRpc3RyaWJ1dGUgYnkgY2hhbmdpbmcgdGhlIG1pbi5cblx0Ly8gXHQvLyBXZSB3aWxsIHRyeSBtb3JlIGFuZCBsZXNzIHNwYWNlIGFsdGVybmF0aXZlbHkuIFRoZSBzcGFjZSBjYW4ndCBiZSBsZXNzIHRoYW4gMS4wLCBhbmQgd2UnbGwgdHJ5IGluIDAuMSBpbmNyZW1lbnRzLlxuXHQvLyBcdHZhciBtaW5UcnlzID0gW107XG5cdC8vIFx0aWYgKG1pblNwYWNpbmcgPiAxLjEpXG5cdC8vIFx0XHRtaW5UcnlzLnB1c2gobWluU3BhY2luZyAtIDAuMSk7XG5cdC8vIFx0bWluVHJ5cy5wdXNoKG1pblNwYWNpbmcgKyAwLjEpO1xuXHQvLyBcdGlmIChtaW5TcGFjaW5nID4gMS4yKVxuXHQvLyBcdFx0bWluVHJ5cy5wdXNoKG1pblNwYWNpbmcgLSAwLjIpO1xuXHQvLyBcdG1pblRyeXMucHVzaChtaW5TcGFjaW5nICsgMC4yKTtcblx0Ly8gXHRpZiAobWluU3BhY2luZyA+IDEuMylcblx0Ly8gXHRcdG1pblRyeXMucHVzaChtaW5TcGFjaW5nIC0gMC4zKTtcblx0Ly8gXHRtaW5UcnlzLnB1c2gobWluU3BhY2luZyArIDAuMyk7XG5cdC8vIFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtaW5UcnlzLmxlbmd0aCAmJiByZXQudG90YWxUaGlzTGluZSA8IG1pbkxpbmVTaXplOyBpKyspIHtcblx0Ly8gXHRcdGxpbmVCcmVha1BvaW50ID0gKHBhcmFtcy5zdGFmZndpZHRoIC0gd2lkdGhzLmxlZnQpIC8gbWluVHJ5c1tpXSAvIHNjYWxlO1xuXHQvLyBcdFx0cmV0ID0gY2FsY0xpbmVCcmVha3Mod2lkdGhzLm1lYXN1cmVXaWR0aHMsIGxpbmVCcmVha1BvaW50KTtcblx0Ly8gXHR9XG5cdC8vIH1cblxuXHRpZiAoIWdvdFR1bmUpXG5cdFx0cmV0ID0gZ2V0UmV2aXNlZFR1bmUobGluZUJyZWFrcywgc3RhZmZXaWR0aCwgYWJjU3RyaW5nLCBwYXJhbXMsIFBhcnNlKTtcblx0cmV0LmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG5cdHJldHVybiByZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyB3cmFwTGluZXM6IHdyYXBMaW5lcywgY2FsY0xpbmVXcmFwczogY2FsY0xpbmVXcmFwcyB9O1xuIiwiLy8gICAgYWJjX3R1bmUuanM6IGEgY29tcHV0ZXIgdXNhYmxlIGludGVybmFsIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIHR1bmUuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBQYXVsIFJvc2VuIChwYXVsIGF0IHBhdWxyb3NlbiBkb3QgbmV0KVxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgcGFyc2VDb21tb24gPSByZXF1aXJlKCcuLi9wYXJzZS9hYmNfY29tbW9uJyk7XG52YXIgcGFyc2VLZXlWb2ljZSA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19wYXJzZV9rZXlfdm9pY2UnKTtcbnZhciBzcGFjaW5nID0gcmVxdWlyZSgnLi4vd3JpdGUvYWJjX3NwYWNpbmcnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBkYXRhIGZvciBhIHNpbmdsZSBBQkMgdHVuZS4gSXQgaXMgY3JlYXRlZCBhbmQgcG9wdWxhdGVkIGJ5IHRoZSB3aW5kb3cuQUJDSlMucGFyc2UuUGFyc2UgY2xhc3MuXG4gKiBBbHNvIGtub3duIGFzIHRoZSBBQkNKUyBBYnN0cmFjdCBTeW50YXggVHJlZVxuICogQGFsdGVybmF0ZUNsYXNzTmFtZSBBQkNKUy5UdW5lXG4gKi9cbnZhciBUdW5lID0gZnVuY3Rpb24oKSB7XG5cdC8vIFRoZSBzdHJ1Y3R1cmUgY29uc2lzdHMgb2YgYSBoYXNoIHdpdGggdGhlIGZvbGxvd2luZyB0d28gaXRlbXM6XG5cdC8vIG1ldGFUZXh0OiBhIGhhc2ggb2Yge2tleSwgdmFsdWV9LCB3aGVyZSBrZXkgaXMgb25lIG9mOiB0aXRsZSwgYXV0aG9yLCByaHl0aG0sIHNvdXJjZSwgdHJhbnNjcmlwdGlvbiwgdW5hbGlnbmVkV29yZHMsIGV0Yy4uLlxuXHQvLyB0ZW1wbzogeyBub3RlTGVuZ3RoOiBudW1iZXIgKGUuZy4gLjEyNSksIGJwbTogbnVtYmVyIH1cblx0Ly8gbGluZXM6IGFuIGFycmF5IG9mIGVsZW1lbnRzLCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly9cblx0Ly8gU1RBRkY6IGFycmF5IG9mIGVsZW1lbnRzXG5cdC8vIFNVQlRJVExFOiBzdHJpbmdcblx0Ly9cblx0Ly8gVE9ETzogYWN0dWFsbHksIHRoZSBzdGFydCBhbmQgZW5kIGNoYXIgc2hvdWxkIG1vZGlmeSBlYWNoIHBhcnQgb2YgdGhlIG5vdGUgdHlwZVxuXHQvLyBUaGUgZWxlbWVudHMgYWxsIGhhdmUgYSB0eXBlIGZpZWxkIGFuZCBhIHN0YXJ0IGFuZCBlbmQgY2hhclxuXHQvLyBmaWVsZC4gVGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyBkZXBlbmQgb24gdGhlIHR5cGUgYW5kIGFyZSBsaXN0ZWQgYmVsb3c6XG5cdC8vIFJFU1Q6IGR1cmF0aW9uPTEsMiw0LDg7IGNob3JkOiBzdHJpbmdcblx0Ly8gTk9URTogYWNjaWRlbnRhbD1ub25lLGRibF9mbGF0LGZsYXQsbmF0dXJhbCxzaGFycCxkYmxfc2hhcnBcblx0Ly9cdFx0cGl0Y2g6IFwiQ1wiIGlzIDAuIFRoZSBudW1iZXJzIHJlZmVyIHRvIHRoZSBwaXRjaCBsZXR0ZXIuXG5cdC8vXHRcdGR1cmF0aW9uOiAuNSAoc2l4dGVlbnRoKSwgLjc1IChkb3R0ZWQgc2l4dGVlbnRoKSwgMSAoZWlnaHRoKSwgMS41IChkb3R0ZWQgZWlnaHRoKVxuXHQvL1x0XHRcdDIgKHF1YXJ0ZXIpLCAzIChkb3R0ZWQgcXVhcnRlciksIDQgKGhhbGYpLCA2IChkb3R0ZWQgaGFsZikgOCAod2hvbGUpXG5cdC8vXHRcdGNob3JkOiB7IG5hbWU6Y2hvcmQsIHBvc2l0aW9uOiBvbmUgb2YgJ2RlZmF1bHQnLCAnYWJvdmUnLCAnYmVsb3cnIH1cblx0Ly9cdFx0ZW5kX2JlYW0gPSB0cnVlIG9yIHVuZGVmaW5lZCBpZiB0aGlzIGlzIHRoZSBsYXN0IG5vdGUgaW4gYSBiZWFtLlxuXHQvL1x0XHRseXJpYzogYXJyYXkgb2YgeyBzeWxsYWJsZTogeHh4LCBkaXZpZGVyOiBvbmUgb2YgXCIgLV9cIiB9XG5cdC8vXHRcdHN0YXJ0VGllID0gdHJ1ZXx1bmRlZmluZWRcblx0Ly9cdFx0ZW5kVGllID0gdHJ1ZXx1bmRlZmluZWRcblx0Ly9cdFx0c3RhcnRUcmlwbGV0ID0gbnVtIDwtIHRoYXQgaXMgdGhlIG51bWJlciB0byBwcmludFxuXHQvL1x0XHRlbmRUcmlwbGV0ID0gdHJ1ZXx1bmRlZmluZWQgKHRoZSBsYXN0IG5vdGUgb2YgdGhlIHRyaXBsZXQpXG5cdC8vIFRPRE86IGFjdHVhbGx5LCBkZWNvcmF0aW9uIHNob3VsZCBiZSBhbiBhcnJheS5cblx0Ly9cdFx0ZGVjb3JhdGlvbjogdXBib3csIGRvd25ib3csIGFjY2VudFxuXHQvLyBCQVI6IHR5cGU9YmFyX3RoaW4sIGJhcl90aGluX3RoaWNrLCBiYXJfdGhpbl90aGluLCBiYXJfdGhpY2tfdGhpbiwgYmFyX3JpZ2h0X3JlcGVhdCwgYmFyX2xlZnRfcmVwZWF0LCBiYXJfZG91YmxlX3JlcGVhdFxuXHQvL1x0bnVtYmVyOiAxIG9yIDI6IGlmIGl0IGlzIHRoZSBzdGFydCBvZiBhIGZpcnN0IG9yIHNlY29uZCBlbmRpbmdcblx0Ly8gQ0xFRjogdHlwZT10cmVibGUsYmFzc1xuXHQvLyBLRVktU0lHOlxuXHQvL1x0XHRhY2NpZGVudGFsc1tdOiB7IGFjYzpzaGFycHxkYmxzaGFycHxuYXR1cmFsfGZsYXR8ZGJsZmxhdCwgIG5vdGU6YXxifGN8ZHxlfGZ8ZyB9XG5cdC8vIE1FVEVSOiB0eXBlOiBjb21tb25fdGltZSxjdXRfdGltZSxzcGVjaWZpZWRcblx0Ly9cdFx0aWYgc3BlY2lmaWVkLCB7IG51bTogOTksIGRlbjogOTkgfVxuXG5cdHRoaXMuZ2V0QmVhdExlbmd0aCA9IGZ1bmN0aW9uKCkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmYpIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmxpbmVzW2ldLnN0YWZmLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmZbal0ubWV0ZXIpIHtcblx0XHRcdFx0XHRcdHZhciBtZXRlciA9IHRoaXMubGluZXNbaV0uc3RhZmZbal0ubWV0ZXI7XG5cdFx0XHRcdFx0XHRpZiAobWV0ZXIudHlwZSA9PT0gXCJzcGVjaWZpZWRcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAobWV0ZXIudmFsdWUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBudW0gPSBwYXJzZUludChtZXRlci52YWx1ZVswXS5udW0sIDEwKTtcblx0XHRcdFx0XHRcdFx0XHR2YXIgZGVuID0gcGFyc2VJbnQobWV0ZXIudmFsdWVbMF0uZGVuLCAxMCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG51bSA9PT0gMyAmJiBkZW4gPT09IDgpIHJldHVybiAzLzg7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG51bSA9PT0gNiAmJiBkZW4gPT09IDgpIHJldHVybiAzLzg7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG51bSA9PT0gNiAmJiBkZW4gPT09IDQpIHJldHVybiAzLzQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG51bSA9PT0gOSAmJiBkZW4gPT09IDgpIHJldHVybiAzLzg7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG51bSA9PT0gMTIgJiYgZGVuID09PSA4KSByZXR1cm4gMy84O1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAxL2Rlbjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIDEvNDsgLy8gTm8gbWV0ZXIgd2FzIHNwZWNpZmllZCwgc28gdXNlIHRoaXMgZGVmYXVsdFxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtZXRlci50eXBlID09PSAnY3V0X3RpbWUnKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAxLzI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gMS80OyAvLyBUT0RPLVBFUjogdGhpcyB3b3JrcyBmb3IgY29tbW9uIHRpbWUsIGJ1dCBub3QgZm9yIHRoZSBhbmNpZW50IG1ldGVycy5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIDEvNDsgLy8gTm8gbWV0ZXIgd2FzIHNwZWNpZmllZCwgc28gdXNlIHRoaXMgZGVmYXVsdFxuXHR9O1xuXG5cdHRoaXMuZ2V0UGlja3VwTGVuZ3RoID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHBpY2t1cExlbmd0aCA9IDA7XG5cdFx0dmFyIGJhckxlbmd0aCA9IHRoaXMuZ2V0QmFyTGVuZ3RoKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy5saW5lc1tpXS5zdGFmZikge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGluZXNbaV0uc3RhZmYubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRmb3IgKHZhciB2ID0gMDsgdiA8IHRoaXMubGluZXNbaV0uc3RhZmZbal0udm9pY2VzLmxlbmd0aDsgdisrKSB7XG5cdFx0XHRcdFx0XHR2YXIgdm9pY2UgPSB0aGlzLmxpbmVzW2ldLnN0YWZmW2pdLnZvaWNlc1t2XTtcblx0XHRcdFx0XHRcdHZhciBoYXNOb3RlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR2YXIgdHJpcGxldE11bHRpcGxpZXIgPSAxO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgZWwgPSAwOyBlbCA8IHZvaWNlLmxlbmd0aDsgZWwrKykge1xuXHRcdFx0XHRcdFx0XHR2YXIgaXNTcGFjZXIgPSB2b2ljZVtlbF0ucmVzdCAmJiB2b2ljZVtlbF0ucmVzdC50eXBlID09PSBcInNwYWNlclwiO1xuXHRcdFx0XHRcdFx0XHRpZiAodm9pY2VbZWxdLnN0YXJ0VHJpcGxldClcblx0XHRcdFx0XHRcdFx0XHR0cmlwbGV0TXVsdGlwbGllciA9IHZvaWNlW2VsXS50cmlwbGV0TXVsdGlwbGllcjtcblx0XHRcdFx0XHRcdFx0aWYgKHZvaWNlW2VsXS5kdXJhdGlvbiAmJiAhaXNTcGFjZXIpXG5cdFx0XHRcdFx0XHRcdFx0cGlja3VwTGVuZ3RoICs9IHZvaWNlW2VsXS5kdXJhdGlvbiAqIHRyaXBsZXRNdWx0aXBsaWVyO1xuXHRcdFx0XHRcdFx0XHRpZiAodm9pY2VbZWxdLmVuZFRyaXBsZXQpXG5cdFx0XHRcdFx0XHRcdFx0dHJpcGxldE11bHRpcGxpZXIgPSAxO1xuXHRcdFx0XHRcdFx0XHRpZiAocGlja3VwTGVuZ3RoID49IGJhckxlbmd0aClcblx0XHRcdFx0XHRcdFx0XHRwaWNrdXBMZW5ndGggLT0gYmFyTGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRpZiAodm9pY2VbZWxdLmVsX3R5cGUgPT09ICdiYXInKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwaWNrdXBMZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBwaWNrdXBMZW5ndGg7XG5cdH07XG5cblx0dGhpcy5nZXRCYXJMZW5ndGggPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWV0ZXIgPSB0aGlzLmdldE1ldGVyRnJhY3Rpb24oKTtcblx0XHRyZXR1cm4gbWV0ZXIubnVtIC8gbWV0ZXIuZGVuO1xuXHR9O1xuXG5cdHRoaXMubWlsbGlzZWNvbmRzUGVyTWVhc3VyZSA9IGZ1bmN0aW9uKGJwbU92ZXJyaWRlKSB7XG5cdFx0dmFyIGJwbTtcblx0XHRpZiAoYnBtT3ZlcnJpZGUpIHtcblx0XHRcdGJwbSA9IGJwbU92ZXJyaWRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdGVtcG8gPSB0aGlzLm1ldGFUZXh0ID8gdGhpcy5tZXRhVGV4dC50ZW1wbyA6IG51bGw7XG5cdFx0XHRicG0gPSB0aGlzLmdldEJwbSh0ZW1wbyk7XG5cdFx0fVxuXHRcdGlmIChicG0gPD0gMClcblx0XHRcdGJwbSA9IDE7IC8vIEkgZG9uJ3QgdGhpbmsgdGhpcyBjYW4gaGFwcGVuLCBidXQgd2UgZG9uJ3Qgd2FudCBhIHBvc3NpYmlsaXR5IG9mIGRpdmlkaW5nIGJ5IHplcm8uXG5cblx0XHR2YXIgYmVhdHNQZXJNZWFzdXJlID0gdGhpcy5nZXRCZWF0c1Blck1lYXN1cmUoKTtcblxuXHRcdHZhciBtaW51dGVzUGVyTWVhc3VyZSA9IGJlYXRzUGVyTWVhc3VyZSAvIGJwbTtcblx0XHRyZXR1cm4gbWludXRlc1Blck1lYXN1cmUgKiA2MDAwMDtcblx0fTtcblxuXHR0aGlzLmdldEJlYXRzUGVyTWVhc3VyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBiZWF0c1Blck1lYXN1cmU7XG5cdFx0dmFyIG1ldGVyID0gdGhpcy5nZXRNZXRlckZyYWN0aW9uKCk7XG5cdFx0aWYgKG1ldGVyLmRlbiA9PT0gOCkge1xuXHRcdFx0YmVhdHNQZXJNZWFzdXJlID0gbWV0ZXIubnVtIC8gMztcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmVhdHNQZXJNZWFzdXJlID0gbWV0ZXIubnVtO1xuXHRcdH1cblx0XHRpZiAoYmVhdHNQZXJNZWFzdXJlIDw9IDApIC8vIFRoaXMgcHJvYmFibHkgd29uJ3QgaGFwcGVuIGluIGFueSBub3JtYWwgY2FzZSAtIGJ1dCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBtZXRlciBjb3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIG5vbnNlbnNpY2FsLlxuXHRcdFx0YmVhdHNQZXJNZWFzdXJlID0gMTtcblx0XHRyZXR1cm4gYmVhdHNQZXJNZWFzdXJlO1xuXHR9O1xuXG5cdHRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy52ZXJzaW9uID0gXCIxLjAuMVwiO1xuXHRcdHRoaXMubWVkaWEgPSBcInNjcmVlblwiO1xuXHRcdHRoaXMubWV0YVRleHQgPSB7fTtcblx0XHR0aGlzLmZvcm1hdHRpbmcgPSB7fTtcblx0XHR0aGlzLmxpbmVzID0gW107XG5cdFx0dGhpcy5zdGFmZk51bSA9IDA7XG5cdFx0dGhpcy52b2ljZU51bSA9IDA7XG5cdFx0dGhpcy5saW5lTnVtID0gMDtcblx0fTtcblxuXHR0aGlzLnJlc29sdmVPdmVybGF5cyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtYWRlQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldO1xuXHRcdFx0aWYgKGxpbmUuc3RhZmYpIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLnN0YWZmLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0dmFyIHN0YWZmID0gbGluZS5zdGFmZltqXTtcblx0XHRcdFx0XHR2YXIgb3ZlcmxheVZvaWNlID0gW107XG5cdFx0XHRcdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBzdGFmZi52b2ljZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRcdHZhciB2b2ljZSA9IHN0YWZmLnZvaWNlc1trXTtcblx0XHRcdFx0XHRcdG92ZXJsYXlWb2ljZS5wdXNoKHsgaGFzT3ZlcmxheTogZmFsc2UsIHZvaWNlOiBbXSwgc25pcDogW119KTtcblx0XHRcdFx0XHRcdHZhciBkdXJhdGlvblRoaXNCYXIgPSAwO1xuXHRcdFx0XHRcdFx0dmFyIGluT3ZlcmxheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0dmFyIHNuaXBTdGFydCA9IC0xO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIga2sgPSAwOyBrayA8IHZvaWNlLmxlbmd0aDsga2srKykge1xuXHRcdFx0XHRcdFx0XHR2YXIgZXZlbnQgPSB2b2ljZVtra107XG5cdFx0XHRcdFx0XHRcdGlmIChldmVudC5lbF90eXBlID09PSBcIm92ZXJsYXlcIiAmJiAhaW5PdmVybGF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0bWFkZUNoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGluT3ZlcmxheSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0c25pcFN0YXJ0ID0ga2s7XG5cdFx0XHRcdFx0XHRcdFx0b3ZlcmxheVZvaWNlW2tdLmhhc092ZXJsYXkgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGV2ZW50LmVsX3R5cGUgPT09IFwiYmFyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5PdmVybGF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBkZWxldGUgdGhlIG92ZXJsYXkgZXZlbnRzIGZyb20gdGhpcyBhcnJheSB3aXRob3V0IG1lc3NpbmcgdXAgdGhpcyBsb29wLlxuXHRcdFx0XHRcdFx0XHRcdFx0aW5PdmVybGF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdmVybGF5Vm9pY2Vba10uc25pcC5wdXNoKHsgc3RhcnQ6IHNuaXBTdGFydCwgbGVuOiBrayAtIHNuaXBTdGFydH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0b3ZlcmxheVZvaWNlW2tdLnZvaWNlLnB1c2goZXZlbnQpOyAvLyBBbHNvIGVuZCB0aGUgb3ZlcmxheSB3aXRoIHRoZSBiYXJsaW5lLlxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIGtlZXBzIHRoZSB2b2ljZXMgbGluZWQgdXA6IGlmIHRoZSBvdmVybGF5IGlzbid0IGluIHRoZSBmaXJzdCBtZWFzdXJlIHRoZW4gd2UgbmVlZCBhIGJ1bmNoIG9mIGludmlzaWJsZSByZXN0cy5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChkdXJhdGlvblRoaXNCYXIgPiAwKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvdmVybGF5Vm9pY2Vba10udm9pY2UucHVzaCh7IGVsX3R5cGU6IFwibm90ZVwiLCBkdXJhdGlvbjogZHVyYXRpb25UaGlzQmFyLCByZXN0OiB7dHlwZTogXCJpbnZpc2libGVcIn0sIHN0YXJ0Q2hhcjogZXZlbnQuc3RhcnRDaGFyLCBlbmRDaGFyOiBldmVudC5lbmRDaGFyIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0b3ZlcmxheVZvaWNlW2tdLnZvaWNlLnB1c2goZXZlbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvblRoaXNCYXIgPSAwO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGV2ZW50LmVsX3R5cGUgPT09IFwibm90ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGluT3ZlcmxheSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b3ZlcmxheVZvaWNlW2tdLnZvaWNlLnB1c2goZXZlbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvblRoaXNCYXIgKz0gZXZlbnQuZHVyYXRpb247XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGV2ZW50LmVsX3R5cGUgPT09IFwic2NhbGVcIiB8fCBldmVudC5lbF90eXBlID09PSBcInN0ZW1cIiB8fCBldmVudC5lbF90eXBlID09PSBcIm92ZXJsYXlcIiB8fCBldmVudC5lbF90eXBlID09PSBcInN0eWxlXCIgfHwgZXZlbnQuZWxfdHlwZSA9PT0gXCJ0cmFuc3Bvc2VcIikge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZXNlIHR5cGVzIG9mIGV2ZW50cyBhcmUgZHVwbGljYXRlZCBvbiB0aGUgb3ZlcmxheSBsYXllci5cblx0XHRcdFx0XHRcdFx0XHRvdmVybGF5Vm9pY2Vba10udm9pY2UucHVzaChldmVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvdmVybGF5Vm9pY2Vba10uaGFzT3ZlcmxheSAmJiBvdmVybGF5Vm9pY2Vba10uc25pcC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0Ly8gdGhlcmUgd2FzIG5vIGNsb3NpbmcgYmFyLCBzbyB3ZSBkaWRuJ3Qgc2V0IHRoZSBzbmlwIGFtb3VudC5cblx0XHRcdFx0XHRcdFx0b3ZlcmxheVZvaWNlW2tdLnNuaXAucHVzaCh7IHN0YXJ0OiBzbmlwU3RhcnQsIGxlbjogdm9pY2UubGVuZ3RoIC0gc25pcFN0YXJ0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvciAoayA9IDA7IGsgPCBvdmVybGF5Vm9pY2UubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRcdHZhciBvdiA9IG92ZXJsYXlWb2ljZVtrXTtcblx0XHRcdFx0XHRcdGlmIChvdi5oYXNPdmVybGF5KSB7XG5cdFx0XHRcdFx0XHRcdHN0YWZmLnZvaWNlcy5wdXNoKG92LnZvaWNlKTtcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIga2trID0gb3Yuc25pcC5sZW5ndGgtMTsga2trID49IDA7IGtray0tKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHNuaXAgPSBvdi5zbmlwW2tra107XG5cdFx0XHRcdFx0XHRcdFx0c3RhZmYudm9pY2VzW2tdLnNwbGljZShzbmlwLnN0YXJ0LCBzbmlwLmxlbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGVuZGluZyBtYXJrcyBmcm9tIHRoZSBvdmVybGF5IHZvaWNlIHNvIHRoZXkgYXJlIG5vdCByZXBlYXRlZFxuXHRcdFx0XHRcdFx0XHRmb3IgKGtrayA9IDA7IGtrayA8IHN0YWZmLnZvaWNlc1tzdGFmZi52b2ljZXMubGVuZ3RoLTFdLmxlbmd0aDsga2trKyspIHtcblx0XHRcdFx0XHRcdFx0XHRzdGFmZi52b2ljZXNbc3RhZmYudm9pY2VzLmxlbmd0aC0xXVtra2tdID0gcGFyc2VDb21tb24uY2xvbmUoc3RhZmYudm9pY2VzW3N0YWZmLnZvaWNlcy5sZW5ndGgtMV1ba2trXSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGVsID0gc3RhZmYudm9pY2VzW3N0YWZmLnZvaWNlcy5sZW5ndGgtMV1ba2trXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWwuZWxfdHlwZSA9PT0gJ2JhcicgJiYgZWwuc3RhcnRFbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5zdGFydEVuZGluZztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsLmVsX3R5cGUgPT09ICdiYXInICYmIGVsLmVuZEVuZGluZylcblx0XHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5lbmRFbmRpbmc7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1hZGVDaGFuZ2VzO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGZpeFRpdGxlcyhsaW5lcykge1xuXHRcdC8vIFdlIG1pZ2h0IGhhdmUgbmFtZSBhbmQgc3VibmFtZSBkZWZpbmVkLiBXZSBub3cga25vdyB3aGF0IGxpbmUgZXZlcnl0aGluZyBpcyBvbiwgc28gd2UgY2FuIGRldGVybWluZSB3aGljaCB0byB1c2UuXG5cdFx0dmFyIGZpcnN0TXVzaWNMaW5lID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgbGluZSA9IGxpbmVzW2ldO1xuXHRcdFx0aWYgKGxpbmUuc3RhZmYpIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLnN0YWZmLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0dmFyIHN0YWZmID0gbGluZS5zdGFmZltqXTtcblx0XHRcdFx0XHRpZiAoc3RhZmYudGl0bGUpIHtcblx0XHRcdFx0XHRcdHZhciBoYXNBVGl0bGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgc3RhZmYudGl0bGUubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHN0YWZmLnRpdGxlW2tdKSB7XG5cdFx0XHRcdFx0XHRcdHN0YWZmLnRpdGxlW2tdID0gKGZpcnN0TXVzaWNMaW5lKSA/IHN0YWZmLnRpdGxlW2tdLm5hbWUgOiBzdGFmZi50aXRsZVtrXS5zdWJuYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3RhZmYudGl0bGVba10pXG5cdFx0XHRcdFx0XHRcdFx0aGFzQVRpdGxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhZmYudGl0bGVba10gPSAnJztcblx0XHRcdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRcdFx0c3RhZmYudGl0bGVba10gPSAnJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghaGFzQVRpdGxlKVxuXHRcdFx0XHRcdFx0XHRkZWxldGUgc3RhZmYudGl0bGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZpcnN0TXVzaWNMaW5lID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5jbGVhblVwID0gZnVuY3Rpb24oZGVmV2lkdGgsIGRlZkxlbmd0aCwgYmFyc3BlcnN0YWZmLCBzdGFmZm5vbm90ZSwgY3VyclNsdXIpIHtcblx0XHR0aGlzLmNsb3NlTGluZSgpO1x0Ly8gQ2xvc2UgdGhlIGxhc3QgbGluZS5cblxuXHRcdC8vIElmIHRoZSB0ZW1wbyB3YXMgY3JlYXRlZCB3aXRoIGEgc3RyaW5nIGxpa2UgXCJBbGxlZ3JvXCIsIHRoZW4gdGhlIGR1cmF0aW9uIG9mIGEgYmVhdCBuZWVkcyB0byBiZSBzZXQgYXQgdGhlIGxhc3QgbW9tZW50LCB3aGVuIGl0IGlzIG1vc3QgbGlrZWx5IGtub3duLlxuXHRcdGlmICh0aGlzLm1ldGFUZXh0LnRlbXBvICYmIHRoaXMubWV0YVRleHQudGVtcG8uYnBtICYmICF0aGlzLm1ldGFUZXh0LnRlbXBvLmR1cmF0aW9uKVxuXHRcdFx0dGhpcy5tZXRhVGV4dC50ZW1wby5kdXJhdGlvbiA9IFsgdGhpcy5nZXRCZWF0TGVuZ3RoKCkgXTtcblxuXHRcdC8vIFJlbW92ZSBhbnkgYmxhbmsgbGluZXNcblx0XHR2YXIgYW55RGVsZXRlZCA9IGZhbHNlO1xuXHRcdHZhciBpLCBzLCB2O1xuXHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy5saW5lc1tpXS5zdGFmZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHZhciBoYXNBbnkgPSBmYWxzZTtcblx0XHRcdFx0Zm9yIChzID0gMDsgcyA8IHRoaXMubGluZXNbaV0uc3RhZmYubGVuZ3RoOyBzKyspIHtcblx0XHRcdFx0XHRpZiAodGhpcy5saW5lc1tpXS5zdGFmZltzXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRhbnlEZWxldGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMubGluZXNbaV0uc3RhZmZbc10gPSBudWxsO1xuXHRcdFx0XHRcdFx0Ly90aGlzLmxpbmVzW2ldLnN0YWZmW3NdID0geyB2b2ljZXM6IFtdfTtcdC8vIFRPRE8tUEVSOiBUaGVyZSB3YXMgYSBwYXJ0IG1pc3NpbmcgaW4gdGhlIGFiYyBtdXNpYy4gSG93IHNob3VsZCB3ZSByZWNvdmVyP1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmb3IgKHYgPSAwOyB2IDwgdGhpcy5saW5lc1tpXS5zdGFmZltzXS52b2ljZXMubGVuZ3RoOyB2KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmZbc10udm9pY2VzW3ZdID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5saW5lc1tpXS5zdGFmZltzXS52b2ljZXNbdl0gPSBbXTtcdC8vIFRPRE8tUEVSOiBUaGVyZSB3YXMgYSBwYXJ0IG1pc3NpbmcgaW4gdGhlIGFiYyBtdXNpYy4gSG93IHNob3VsZCB3ZSByZWNvdmVyP1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuY29udGFpbnNOb3Rlcyh0aGlzLmxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XSkpIGhhc0FueSA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghaGFzQW55KSB7XG5cdFx0XHRcdFx0dGhpcy5saW5lc1tpXSA9IG51bGw7XG5cdFx0XHRcdFx0YW55RGVsZXRlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGFueURlbGV0ZWQpIHtcblx0XHRcdHRoaXMubGluZXMgPSBwYXJzZUNvbW1vbi5jb21wYWN0KHRoaXMubGluZXMpO1xuXHRcdFx0cGFyc2VDb21tb24uZWFjaCh0aGlzLmxpbmVzLCBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRcdGlmIChsaW5lLnN0YWZmKVxuXHRcdFx0XHRcdGxpbmUuc3RhZmYgPSBwYXJzZUNvbW1vbi5jb21wYWN0KGxpbmUuc3RhZmYpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgd2UgZXhjZWVkZWQgdGhlIG51bWJlciBvZiBiYXJzIGFsbG93ZWQgb24gYSBsaW5lLCB0aGVuIGZvcmNlIGEgbmV3IGxpbmVcblx0XHRpZiAoYmFyc3BlcnN0YWZmKSB7XG5cdFx0XHR3aGlsZSAod3JhcE11c2ljTGluZXModGhpcy5saW5lcywgYmFyc3BlcnN0YWZmKSkge1xuXHRcdFx0XHQvLyBUaGlzIHdpbGwga2VlcCB3cmFwcGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwaWVjZS5cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSB3ZXJlIHBhc3NlZCBzdGFmZm5vbm90ZSwgdGhlbiB3ZSB3YW50IHRvIGdldCByaWQgb2YgYWxsIHN0YWZmcyB0aGF0IGNvbnRhaW4gb25seSByZXN0cy5cblx0XHRpZiAoc3RhZmZub25vdGUpIHtcblx0XHRcdGFueURlbGV0ZWQgPSBmYWxzZTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICh0aGlzLmxpbmVzW2ldLnN0YWZmICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRmb3IgKHMgPSAwOyBzIDwgdGhpcy5saW5lc1tpXS5zdGFmZi5sZW5ndGg7IHMrKykge1xuXHRcdFx0XHRcdFx0dmFyIGtlZXBUaGlzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRmb3IgKHYgPSAwOyB2IDwgdGhpcy5saW5lc1tpXS5zdGFmZltzXS52b2ljZXMubGVuZ3RoOyB2KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuY29udGFpbnNOb3Rlc1N0cmljdCh0aGlzLmxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XSkpIHtcblx0XHRcdFx0XHRcdFx0XHRrZWVwVGhpcyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICgha2VlcFRoaXMpIHtcblx0XHRcdFx0XHRcdFx0YW55RGVsZXRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMubGluZXNbaV0uc3RhZmZbc10gPSBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGFueURlbGV0ZWQpIHtcblx0XHRcdFx0cGFyc2VDb21tb24uZWFjaCh0aGlzLmxpbmVzLCBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmUuc3RhZmYpXG5cdFx0XHRcdFx0XHRsaW5lLnN0YWZmID0gcGFyc2VDb21tb24uY29tcGFjdChsaW5lLnN0YWZmKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zml4VGl0bGVzKHRoaXMubGluZXMpO1xuXG5cdFx0Ly8gUmVtb3ZlIHRoZSB0ZW1wb3Jhcnkgd29ya2luZyB2YXJpYWJsZXNcblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmYpIHtcblx0XHRcdFx0Zm9yIChzID0gMDsgcyA8IHRoaXMubGluZXNbaV0uc3RhZmYubGVuZ3RoOyBzKyspXG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5saW5lc1tpXS5zdGFmZltzXS53b3JraW5nQ2xlZjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgb3ZlcmxheXMsIGNyZWF0ZSBuZXcgdm9pY2VzIGZvciB0aGVtLlxuXHRcdHdoaWxlICh0aGlzLnJlc29sdmVPdmVybGF5cygpKSB7XG5cdFx0XHQvLyBrZWVwIHJlc29sdmluZyBvdmVybGF5cyBhcyBsb25nIGFzIGFueSBhcmUgZm91bmQuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2xlYW5VcFNsdXJzSW5MaW5lKGxpbmUpIHtcblx0XHRcdHZhciB4O1xuLy9cdFx0XHR2YXIgbHlyID0gbnVsbDtcdC8vIFRPRE8tUEVSOiBkZWJ1Z2dpbmcuXG5cblx0XHRcdHZhciBhZGRFbmRTbHVyID0gZnVuY3Rpb24ob2JqLCBudW0sIGNob3JkUG9zKSB7XG5cdFx0XHRcdGlmIChjdXJyU2x1cltjaG9yZFBvc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIGlzbid0IGFuIGV4YWN0IG1hdGNoIGZvciBub3RlIHBvc2l0aW9uLCBidXQgd2UnbGwgdGFrZSBhbnkgb3RoZXIgb3BlbiBzbHVyLlxuXHRcdFx0XHRcdGZvciAoeCA9IDA7IHggPCBjdXJyU2x1ci5sZW5ndGg7IHgrKykge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJTbHVyW3hdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Y2hvcmRQb3MgPSB4O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGN1cnJTbHVyW2Nob3JkUG9zXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR2YXIgb2ZmTnVtID0gY2hvcmRQb3MqMTAwKzE7XG5cdFx0XHRcdFx0XHRwYXJzZUNvbW1vbi5lYWNoKG9iai5lbmRTbHVyLCBmdW5jdGlvbih4KSB7IGlmIChvZmZOdW0gPT09IHgpIC0tb2ZmTnVtOyB9KTtcblx0XHRcdFx0XHRcdGN1cnJTbHVyW2Nob3JkUG9zXSA9IFtvZmZOdW1dO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgc2x1ck51bTtcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBudW07IGkrKykge1xuXHRcdFx0XHRcdHNsdXJOdW0gPSBjdXJyU2x1cltjaG9yZFBvc10ucG9wKCk7XG5cdFx0XHRcdFx0b2JqLmVuZFNsdXIucHVzaChzbHVyTnVtKTtcbi8vXHRcdFx0XHRcdGx5ci5zeWxsYWJsZSArPSAnPCcgKyBzbHVyTnVtO1x0Ly8gVE9ETy1QRVI6IGRlYnVnZ2luZ1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjdXJyU2x1cltjaG9yZFBvc10ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdGRlbGV0ZSBjdXJyU2x1cltjaG9yZFBvc107XG5cdFx0XHRcdHJldHVybiBzbHVyTnVtO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGFkZFN0YXJ0U2x1ciA9IGZ1bmN0aW9uKG9iaiwgbnVtLCBjaG9yZFBvcywgdXNlZE51bXMpIHtcblx0XHRcdFx0b2JqLnN0YXJ0U2x1ciA9IFtdO1xuXHRcdFx0XHRpZiAoY3VyclNsdXJbY2hvcmRQb3NdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjdXJyU2x1cltjaG9yZFBvc10gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgbmV4dE51bSA9IGNob3JkUG9zKjEwMCsxO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKHVzZWROdW1zKSB7XG5cdFx0XHRcdFx0XHRwYXJzZUNvbW1vbi5lYWNoKHVzZWROdW1zLCBmdW5jdGlvbih4KSB7IGlmIChuZXh0TnVtID09PSB4KSArK25leHROdW07IH0pO1xuXHRcdFx0XHRcdFx0cGFyc2VDb21tb24uZWFjaCh1c2VkTnVtcywgZnVuY3Rpb24oeCkgeyBpZiAobmV4dE51bSA9PT0geCkgKytuZXh0TnVtOyB9KTtcblx0XHRcdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2godXNlZE51bXMsIGZ1bmN0aW9uKHgpIHsgaWYgKG5leHROdW0gPT09IHgpICsrbmV4dE51bTsgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2goY3VyclNsdXJbY2hvcmRQb3NdLCBmdW5jdGlvbih4KSB7IGlmIChuZXh0TnVtID09PSB4KSArK25leHROdW07IH0pO1xuXHRcdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2goY3VyclNsdXJbY2hvcmRQb3NdLCBmdW5jdGlvbih4KSB7IGlmIChuZXh0TnVtID09PSB4KSArK25leHROdW07IH0pO1xuXG5cdFx0XHRcdFx0Y3VyclNsdXJbY2hvcmRQb3NdLnB1c2gobmV4dE51bSk7XG5cdFx0XHRcdFx0b2JqLnN0YXJ0U2x1ci5wdXNoKHsgbGFiZWw6IG5leHROdW0gfSk7XG4vL1x0XHRcdFx0XHRseXIuc3lsbGFibGUgKz0gJyAnICsgbmV4dE51bSArICc+JztcdC8vIFRPRE8tUEVSOmRlYnVnZ2luZ1xuXHRcdFx0XHRcdG5leHROdW0rKztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBlbCA9IGxpbmVbaV07XG4vL1x0XHRcdFx0aWYgKGVsLmx5cmljID09PSB1bmRlZmluZWQpXHQvLyBUT0RPLVBFUjogZGVidWdnaW5nXG4vL1x0XHRcdFx0XHRlbC5seXJpYyA9IFt7IGRpdmlkZXI6ICctJyB9XTtcdC8vIFRPRE8tUEVSOiBkZWJ1Z2dpbmdcbi8vXHRcdFx0XHRseXIgPSBlbC5seXJpY1swXTtcdC8vIFRPRE8tUEVSOiBkZWJ1Z2dpbmdcbi8vXHRcdFx0XHRseXIuc3lsbGFibGUgPSAnJztcdC8vIFRPRE8tUEVSOiBkZWJ1Z2dpbmdcblx0XHRcdFx0aWYgKGVsLmVsX3R5cGUgPT09ICdub3RlJykge1xuXHRcdFx0XHRcdGlmIChlbC5ncmFjZW5vdGVzKSB7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBnID0gMDsgZyA8IGVsLmdyYWNlbm90ZXMubGVuZ3RoOyBnKyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKGVsLmdyYWNlbm90ZXNbZ10uZW5kU2x1cikge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBnZyA9IGVsLmdyYWNlbm90ZXNbZ10uZW5kU2x1cjtcblx0XHRcdFx0XHRcdFx0XHRlbC5ncmFjZW5vdGVzW2ddLmVuZFNsdXIgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBnZ2cgPSAwOyBnZ2cgPCBnZzsgZ2dnKyspXG5cdFx0XHRcdFx0XHRcdFx0XHRhZGRFbmRTbHVyKGVsLmdyYWNlbm90ZXNbZ10sIDEsIDIwKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoZWwuZ3JhY2Vub3Rlc1tnXS5zdGFydFNsdXIpIHtcblx0XHRcdFx0XHRcdFx0XHR4ID0gZWwuZ3JhY2Vub3Rlc1tnXS5zdGFydFNsdXI7XG5cdFx0XHRcdFx0XHRcdFx0YWRkU3RhcnRTbHVyKGVsLmdyYWNlbm90ZXNbZ10sIHgsIDIwKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZWwuZW5kU2x1cikge1xuXHRcdFx0XHRcdFx0eCA9IGVsLmVuZFNsdXI7XG5cdFx0XHRcdFx0XHRlbC5lbmRTbHVyID0gW107XG5cdFx0XHRcdFx0XHRhZGRFbmRTbHVyKGVsLCB4LCAwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGVsLnN0YXJ0U2x1cikge1xuXHRcdFx0XHRcdFx0eCA9IGVsLnN0YXJ0U2x1cjtcblx0XHRcdFx0XHRcdGFkZFN0YXJ0U2x1cihlbCwgeCwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChlbC5waXRjaGVzKSB7XG5cdFx0XHRcdFx0XHR2YXIgdXNlZE51bXMgPSBbXTtcblx0XHRcdFx0XHRcdGZvciAodmFyIHAgPSAwOyBwIDwgZWwucGl0Y2hlcy5sZW5ndGg7IHArKykge1xuXHRcdFx0XHRcdFx0XHRpZiAoZWwucGl0Y2hlc1twXS5lbmRTbHVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGsgPSBlbC5waXRjaGVzW3BdLmVuZFNsdXI7XG5cdFx0XHRcdFx0XHRcdFx0ZWwucGl0Y2hlc1twXS5lbmRTbHVyID0gW107XG5cdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBrOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBzbHVyTnVtID0gYWRkRW5kU2x1cihlbC5waXRjaGVzW3BdLCAxLCBwKzEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dXNlZE51bXMucHVzaChzbHVyTnVtKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGZvciAocCA9IDA7IHAgPCBlbC5waXRjaGVzLmxlbmd0aDsgcCsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbC5waXRjaGVzW3BdLnN0YXJ0U2x1cikge1xuXHRcdFx0XHRcdFx0XHRcdHggPSBlbC5waXRjaGVzW3BdLnN0YXJ0U2x1cjtcblx0XHRcdFx0XHRcdFx0XHRhZGRTdGFydFNsdXIoZWwucGl0Y2hlc1twXSwgeCwgcCsxLCB1c2VkTnVtcyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIENvcnJlY3QgZm9yIHRoZSB3ZWlyZCBncmFjZW5vdGUgY2FzZSB3aGVyZSAoe2d9YSkgc2hvdWxkIG1hdGNoLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIGVuZCBzbHVyIHdhcyBhbHJlYWR5IGFzc2lnbmVkIHRvIHRoZSBub3RlLCBhbmQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gdGhlIGZpcnN0IG5vdGUgb2YgdGhlIGdyYWNlcy5cblx0XHRcdFx0XHRcdGlmIChlbC5ncmFjZW5vdGVzICYmIGVsLnBpdGNoZXNbMF0uZW5kU2x1ciAmJiBlbC5waXRjaGVzWzBdLmVuZFNsdXJbMF0gPT09IDEwMCAmJiBlbC5waXRjaGVzWzBdLnN0YXJ0U2x1cikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZWwuZ3JhY2Vub3Rlc1swXS5lbmRTbHVyKVxuXHRcdFx0XHRcdFx0XHRcdGVsLmdyYWNlbm90ZXNbMF0uZW5kU2x1ci5wdXNoKGVsLnBpdGNoZXNbMF0uc3RhcnRTbHVyWzBdLmxhYmVsKTtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGVsLmdyYWNlbm90ZXNbMF0uZW5kU2x1ciA9IFtlbC5waXRjaGVzWzBdLnN0YXJ0U2x1clswXS5sYWJlbF07XG5cdFx0XHRcdFx0XHRcdGlmIChlbC5waXRjaGVzWzBdLmVuZFNsdXIubGVuZ3RoID09PSAxKVxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5waXRjaGVzWzBdLmVuZFNsdXI7XG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGVsLnBpdGNoZXNbMF0uZW5kU2x1clswXSA9PT0gMTAwKVxuXHRcdFx0XHRcdFx0XHRcdGVsLnBpdGNoZXNbMF0uZW5kU2x1ci5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIChlbC5waXRjaGVzWzBdLmVuZFNsdXJbZWwucGl0Y2hlc1swXS5lbmRTbHVyLmxlbmd0aC0xXSA9PT0gMTAwKVxuXHRcdFx0XHRcdFx0XHRcdGVsLnBpdGNoZXNbMF0uZW5kU2x1ci5wb3AoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGN1cnJTbHVyWzFdLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgY3VyclNsdXJbMV07XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRjdXJyU2x1clsxXS5wb3AoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUT0RPLVBFUjogVGhpcyBjb3VsZCBiZSBkb25lIGZhc3RlciBhcyB3ZSBnbyBpbnN0ZWFkIG9mIGFzIHRoZSBsYXN0IHN0ZXAuXG5cdFx0ZnVuY3Rpb24gZml4Q2xlZlBsYWNlbWVudChlbCkge1xuXHRcdFx0cGFyc2VLZXlWb2ljZS5maXhDbGVmKGVsKTtcblx0XHRcdC8vaWYgKGVsLmVsX3R5cGUgPT09ICdjbGVmJykge1xuLy9cdFx0XHRcdHZhciBtaW4gPSAtMjtcbi8vXHRcdFx0XHR2YXIgbWF4ID0gNTtcbi8vXHRcdFx0XHRzd2l0Y2goZWwudHlwZSkge1xuLy9cdFx0XHRcdFx0Y2FzZSAndHJlYmxlKzgnOlxuLy9cdFx0XHRcdFx0Y2FzZSAndHJlYmxlLTgnOlxuLy9cdFx0XHRcdFx0XHRicmVhaztcbi8vXHRcdFx0XHRcdGNhc2UgJ2Jhc3MnOlxuLy9cdFx0XHRcdFx0Y2FzZSAnYmFzcys4Jzpcbi8vXHRcdFx0XHRcdGNhc2UgJ2Jhc3MtOCc6XG4vL1x0XHRcdFx0XHRcdGVsLnZlcnRpY2FsUG9zID0gMjAgKyBlbC52ZXJ0aWNhbFBvczsgbWluICs9IDY7IG1heCArPSA2O1xuLy9cdFx0XHRcdFx0XHRicmVhaztcbi8vXHRcdFx0XHRcdGNhc2UgJ3Rlbm9yJzpcbi8vXHRcdFx0XHRcdGNhc2UgJ3Rlbm9yKzgnOlxuLy9cdFx0XHRcdFx0Y2FzZSAndGVub3ItOCc6XG4vL1x0XHRcdFx0XHRcdGVsLnZlcnRpY2FsUG9zID0gLSBlbC52ZXJ0aWNhbFBvczsgbWluID0gLTQwOyBtYXggPSA0MDtcbi8vLy9cdFx0XHRcdFx0XHRlbC52ZXJ0aWNhbFBvcys9MjsgbWluICs9IDY7IG1heCArPSA2O1xuLy9cdFx0XHRcdFx0XHRicmVhaztcbi8vXHRcdFx0XHRcdGNhc2UgJ2FsdG8nOlxuLy9cdFx0XHRcdFx0Y2FzZSAnYWx0bys4Jzpcbi8vXHRcdFx0XHRcdGNhc2UgJ2FsdG8tOCc6XG4vL1x0XHRcdFx0XHRcdGVsLnZlcnRpY2FsUG9zID0gLSBlbC52ZXJ0aWNhbFBvczsgbWluID0gLTQwOyBtYXggPSA0MDtcbi8vLy9cdFx0XHRcdFx0XHRlbC52ZXJ0aWNhbFBvcy09MjsgbWluICs9IDQ7IG1heCArPSA0O1xuLy9cdFx0XHRcdFx0XHRicmVhaztcbi8vXHRcdFx0XHR9XG4vL1x0XHRcdFx0aWYgKGVsLnZlcnRpY2FsUG9zIDwgbWluKSB7XG4vL1x0XHRcdFx0XHR3aGlsZSAoZWwudmVydGljYWxQb3MgPCBtaW4pXG4vL1x0XHRcdFx0XHRcdGVsLnZlcnRpY2FsUG9zICs9IDc7XG4vL1x0XHRcdFx0fSBlbHNlIGlmIChlbC52ZXJ0aWNhbFBvcyA+IG1heCkge1xuLy9cdFx0XHRcdFx0d2hpbGUgKGVsLnZlcnRpY2FsUG9zID4gbWF4KVxuLy9cdFx0XHRcdFx0XHRlbC52ZXJ0aWNhbFBvcyAtPSA3O1xuLy9cdFx0XHRcdH1cblx0XHRcdC8vfVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHdyYXBNdXNpY0xpbmVzKGxpbmVzLCBiYXJzcGVyc3RhZmYpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAobGluZXNbaV0uc3RhZmYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGZvciAocyA9IDA7IHMgPCBsaW5lc1tpXS5zdGFmZi5sZW5ndGg7IHMrKykge1xuXHRcdFx0XHRcdFx0dmFyIHBlcm1hbmVudEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKHYgPSAwOyB2IDwgbGluZXNbaV0uc3RhZmZbc10udm9pY2VzLmxlbmd0aDsgdisrKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB2b2ljZSA9IGxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XTtcblx0XHRcdFx0XHRcdFx0dmFyIGJhck51bVRoaXNMaW5lID0gMDtcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgbiA9IDA7IG4gPCB2b2ljZS5sZW5ndGg7IG4rKykge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh2b2ljZVtuXS5lbF90eXBlID09PSAnYmFyJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmFyTnVtVGhpc0xpbmUrKztcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChiYXJOdW1UaGlzTGluZSA+PSBiYXJzcGVyc3RhZmYpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcHVzaCBldmVyeXRoaW5nIGVsc2UgdG8gdGhlIG5leHQgbGluZSwgaWYgdGhlcmUgaXMgYW55dGhpbmcgZWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRoZXJlIGlzIGEgbmV4dCBsaW5lLiBJZiB0aGVyZSBpc24ndCBhIG5leHQgbGluZSwgY3JlYXRlIG9uZS5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG4gPCB2b2ljZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIG5leHRMaW5lID0gZ2V0TmV4dE11c2ljTGluZShsaW5lcywgaSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TGluZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaW5lc1tpXSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGluZXMucHVzaChwYXJzZUNvbW1vbi5jbG9uZShjcCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bmV4dExpbmUgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIHNzID0gMDsgc3MgPCBuZXh0TGluZS5zdGFmZi5sZW5ndGg7IHNzKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgdnYgPSAwOyB2diA8IG5leHRMaW5lLnN0YWZmW3NzXS52b2ljZXMubGVuZ3RoOyB2disrKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5leHRMaW5lLnN0YWZmW3NzXS52b2ljZXNbdnZdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBzdGFydEVsZW1lbnQgPSBuICsgMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgc2VjdGlvbiA9IGxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XS5zbGljZShzdGFydEVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XSA9IGxpbmVzW2ldLnN0YWZmW3NdLnZvaWNlc1t2XS5zbGljZSgwLCBzdGFydEVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5leHRMaW5lLnN0YWZmW3NdLnZvaWNlc1t2XSA9IHBlcm1hbmVudEl0ZW1zLmNvbmNhdChzZWN0aW9uLmNvbmNhdChuZXh0TGluZS5zdGFmZltzXS52b2ljZXNbdl0pKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIXZvaWNlW25dLmR1cmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwZXJtYW5lbnRJdGVtcy5wdXNoKHZvaWNlW25dKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXROZXh0TXVzaWNMaW5lKGxpbmVzLCBjdXJyZW50TGluZSkge1xuXHRcdFx0Y3VycmVudExpbmUrKztcblx0XHRcdHdoaWxlIChsaW5lcy5sZW5ndGggPiBjdXJyZW50TGluZSkge1xuXHRcdFx0XHRpZiAobGluZXNbY3VycmVudExpbmVdLnN0YWZmKVxuXHRcdFx0XHRcdHJldHVybiBsaW5lc1tjdXJyZW50TGluZV07XG5cdFx0XHRcdGN1cnJlbnRMaW5lKys7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKHRoaXMubGluZU51bSA9IDA7IHRoaXMubGluZU51bSA8IHRoaXMubGluZXMubGVuZ3RoOyB0aGlzLmxpbmVOdW0rKykge1xuXHRcdFx0dmFyIHN0YWZmID0gdGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmO1xuXHRcdFx0aWYgKHN0YWZmKSB7XG5cdFx0XHRcdGZvciAodGhpcy5zdGFmZk51bSA9IDA7IHRoaXMuc3RhZmZOdW0gPCBzdGFmZi5sZW5ndGg7IHRoaXMuc3RhZmZOdW0rKykge1xuXHRcdFx0XHRcdGlmIChzdGFmZlt0aGlzLnN0YWZmTnVtXS5jbGVmKVxuXHRcdFx0XHRcdFx0Zml4Q2xlZlBsYWNlbWVudChzdGFmZlt0aGlzLnN0YWZmTnVtXS5jbGVmKTtcblx0XHRcdFx0XHRmb3IgKHRoaXMudm9pY2VOdW0gPSAwOyB0aGlzLnZvaWNlTnVtIDwgc3RhZmZbdGhpcy5zdGFmZk51bV0udm9pY2VzLmxlbmd0aDsgdGhpcy52b2ljZU51bSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgdm9pY2UgPSBzdGFmZlt0aGlzLnN0YWZmTnVtXS52b2ljZXNbdGhpcy52b2ljZU51bV07XG5cdFx0XHRcdFx0XHRjbGVhblVwU2x1cnNJbkxpbmUodm9pY2UpO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRpZiAodm9pY2Vbal0uZWxfdHlwZSA9PT0gJ2NsZWYnKVxuXHRcdFx0XHRcdFx0XHRcdGZpeENsZWZQbGFjZW1lbnQodm9pY2Vbal0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZvaWNlLmxlbmd0aCA+IDAgJiYgdm9pY2Vbdm9pY2UubGVuZ3RoLTFdLmJhck51bWJlcikge1xuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCBoYW5nIGEgYmFyIG51bWJlciBvbiB0aGUgbGFzdCBiYXIgbGluZTogaXQgc2hvdWxkIGdvIG9uIHRoZSBuZXh0IGxpbmUuXG5cdFx0XHRcdFx0XHRcdHZhciBuZXh0TGluZSA9IGdldE5leHRNdXNpY0xpbmUodGhpcy5saW5lcywgdGhpcy5saW5lTnVtKTtcblx0XHRcdFx0XHRcdFx0aWYgKG5leHRMaW5lKVxuXHRcdFx0XHRcdFx0XHRcdG5leHRMaW5lLnN0YWZmWzBdLmJhck51bWJlciA9IHZvaWNlW3ZvaWNlLmxlbmd0aC0xXS5iYXJOdW1iZXI7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB2b2ljZVt2b2ljZS5sZW5ndGgtMV0uYmFyTnVtYmVyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5mb3JtYXR0aW5nLnBhZ2V3aWR0aClcblx0XHRcdHRoaXMuZm9ybWF0dGluZy5wYWdld2lkdGggPSBkZWZXaWR0aDtcblx0XHRpZiAoIXRoaXMuZm9ybWF0dGluZy5wYWdlaGVpZ2h0KVxuXHRcdFx0dGhpcy5mb3JtYXR0aW5nLnBhZ2VoZWlnaHQgPSBkZWZMZW5ndGg7XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB0aGF0IHRoZSBvdXRzaWRlIGRvZXNuJ3QgbmVlZCB0byBrbm93IGFib3V0XG5cdFx0ZGVsZXRlIHRoaXMuc3RhZmZOdW07XG5cdFx0ZGVsZXRlIHRoaXMudm9pY2VOdW07XG5cdFx0ZGVsZXRlIHRoaXMubGluZU51bTtcblx0XHRkZWxldGUgdGhpcy5wb3RlbnRpYWxTdGFydEJlYW07XG5cdFx0ZGVsZXRlIHRoaXMucG90ZW50aWFsRW5kQmVhbTtcblx0XHRkZWxldGUgdGhpcy52c2tpcFBlbmRpbmc7XG5cblx0XHRyZXR1cm4gY3VyclNsdXI7XG5cdH07XG5cblx0dGhpcy5yZXNldCgpO1xuXG5cdHRoaXMuZ2V0TGFzdE5vdGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dICYmIHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZiAmJiB0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0gJiZcblx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS52b2ljZXNbdGhpcy52b2ljZU51bV0pIHtcblx0XHRcdGZvciAodmFyIGkgPSB0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0udm9pY2VzW3RoaXMudm9pY2VOdW1dLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHR2YXIgZWwgPSB0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0udm9pY2VzW3RoaXMudm9pY2VOdW1dW2ldO1xuXHRcdFx0XHRpZiAoZWwuZWxfdHlwZSA9PT0gJ25vdGUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdHRoaXMuYWRkVGllVG9MYXN0Tm90ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFRPRE8tUEVSOiBpZiB0aGlzIGlzIGEgY2hvcmQsIHdoaWNoIG5vdGU/XG5cdFx0dmFyIGVsID0gdGhpcy5nZXRMYXN0Tm90ZSgpO1xuXHRcdGlmIChlbCAmJiBlbC5waXRjaGVzICYmIGVsLnBpdGNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0ZWwucGl0Y2hlc1swXS5zdGFydFRpZSA9IHt9O1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHR0aGlzLmdldER1cmF0aW9uID0gZnVuY3Rpb24oZWwpIHtcblx0XHRpZiAoZWwuZHVyYXRpb24pIHJldHVybiBlbC5kdXJhdGlvbjtcblx0XHQvL2lmIChlbC5waXRjaGVzICYmIGVsLnBpdGNoZXMubGVuZ3RoID4gMCkgcmV0dXJuIGVsLnBpdGNoZXNbMF0uZHVyYXRpb247XG5cdFx0cmV0dXJuIDA7XG5cdH07XG5cblx0dGhpcy5jbG9zZUxpbmUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5wb3RlbnRpYWxTdGFydEJlYW0gJiYgdGhpcy5wb3RlbnRpYWxFbmRCZWFtKSB7XG5cdFx0XHR0aGlzLnBvdGVudGlhbFN0YXJ0QmVhbS5zdGFydEJlYW0gPSB0cnVlO1xuXHRcdFx0dGhpcy5wb3RlbnRpYWxFbmRCZWFtLmVuZEJlYW0gPSB0cnVlO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5wb3RlbnRpYWxTdGFydEJlYW07XG5cdFx0ZGVsZXRlIHRoaXMucG90ZW50aWFsRW5kQmVhbTtcblx0fTtcblxuXHR0aGlzLmFwcGVuZEVsZW1lbnQgPSBmdW5jdGlvbih0eXBlLCBzdGFydENoYXIsIGVuZENoYXIsIGhhc2hQYXJhbXMpXG5cdHtcblx0XHR2YXIgVGhpcyA9IHRoaXM7XG5cdFx0dmFyIHB1c2hOb3RlID0gZnVuY3Rpb24oaHApIHtcblx0XHRcdHZhciBjdXJyU3RhZmYgPSBUaGlzLmxpbmVzW1RoaXMubGluZU51bV0uc3RhZmZbVGhpcy5zdGFmZk51bV07XG5cdFx0XHRpZiAoIWN1cnJTdGFmZikge1xuXHRcdFx0XHQvLyBUT0RPLVBFUjogVGhpcyBwcmV2ZW50cyBhIGNyYXNoLCBidXQgaXQgZHJvcHMgdGhlIGVsZW1lbnQuIE5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gc3RhcnQgYSBuZXcgbGluZSwgb3IgZGVsYXkgYWRkaW5nIHRoaXMuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChocC5waXRjaGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dmFyIG1pZCA9IGN1cnJTdGFmZi53b3JraW5nQ2xlZi52ZXJ0aWNhbFBvcztcblx0XHRcdFx0cGFyc2VDb21tb24uZWFjaChocC5waXRjaGVzLCBmdW5jdGlvbihwKSB7IHAudmVydGljYWxQb3MgPSBwLnBpdGNoIC0gbWlkOyB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChocC5ncmFjZW5vdGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dmFyIG1pZDIgPSBjdXJyU3RhZmYud29ya2luZ0NsZWYudmVydGljYWxQb3M7XG5cdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2goaHAuZ3JhY2Vub3RlcywgZnVuY3Rpb24ocCkgeyBwLnZlcnRpY2FsUG9zID0gcC5waXRjaCAtIG1pZDI7IH0pO1xuXHRcdFx0fVxuXHRcdFx0Y3VyclN0YWZmLnZvaWNlc1tUaGlzLnZvaWNlTnVtXS5wdXNoKGhwKTtcblx0XHR9O1xuXHRcdGhhc2hQYXJhbXMuZWxfdHlwZSA9IHR5cGU7XG5cdFx0aWYgKHN0YXJ0Q2hhciAhPT0gbnVsbClcblx0XHRcdGhhc2hQYXJhbXMuc3RhcnRDaGFyID0gc3RhcnRDaGFyO1xuXHRcdGlmIChlbmRDaGFyICE9PSBudWxsKVxuXHRcdFx0aGFzaFBhcmFtcy5lbmRDaGFyID0gZW5kQ2hhcjtcblx0XHR2YXIgZW5kQmVhbUhlcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFRoaXMucG90ZW50aWFsU3RhcnRCZWFtLnN0YXJ0QmVhbSA9IHRydWU7XG5cdFx0XHRoYXNoUGFyYW1zLmVuZEJlYW0gPSB0cnVlO1xuXHRcdFx0ZGVsZXRlIFRoaXMucG90ZW50aWFsU3RhcnRCZWFtO1xuXHRcdFx0ZGVsZXRlIFRoaXMucG90ZW50aWFsRW5kQmVhbTtcblx0XHR9O1xuXHRcdHZhciBlbmRCZWFtTGFzdCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKFRoaXMucG90ZW50aWFsU3RhcnRCZWFtICE9PSB1bmRlZmluZWQgJiYgVGhpcy5wb3RlbnRpYWxFbmRCZWFtICE9PSB1bmRlZmluZWQpIHtcdC8vIERvIHdlIGhhdmUgYSBzZXQgb2Ygbm90ZXMgdG8gYmVhbT9cblx0XHRcdFx0VGhpcy5wb3RlbnRpYWxTdGFydEJlYW0uc3RhcnRCZWFtID0gdHJ1ZTtcblx0XHRcdFx0VGhpcy5wb3RlbnRpYWxFbmRCZWFtLmVuZEJlYW0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIFRoaXMucG90ZW50aWFsU3RhcnRCZWFtO1xuXHRcdFx0ZGVsZXRlIFRoaXMucG90ZW50aWFsRW5kQmVhbTtcblx0XHR9O1xuXHRcdGlmICh0eXBlID09PSAnbm90ZScpIHsgLy8gJiYgKGhhc2hQYXJhbXMucmVzdCAhPT0gdW5kZWZpbmVkIHx8IGhhc2hQYXJhbXMuZW5kX2JlYW0gPT09IHVuZGVmaW5lZCkpIHtcblx0XHRcdC8vIE5vdywgYWRkIHRoZSBzdGFydEJlYW0gYW5kIGVuZEJlYW0gd2hlcmUgaXQgaXMgbmVlZGVkLlxuXHRcdFx0Ly8gZW5kX2JlYW0gaXMgYWxyZWFkeSBzZXQgb24gdGhlIHBsYWNlcyB3aGVyZSB0aGVyZSBpcyBhIGZvcmNlZCBlbmRfYmVhbS4gV2UnbGwgcmVtb3ZlIHRoYXQgaGVyZSBhZnRlciB1c2luZyB0aGF0IGluZm8uXG5cdFx0XHQvLyB0aGlzLnBvdGVudGlhbFN0YXJ0QmVhbSBlaXRoZXIgcG9pbnRzIHRvIG51bGwgb3IgdGhlIHN0YXJ0IGJlYW0uXG5cdFx0XHQvLyB0aGlzLnBvdGVudGlhbEVuZEJlYW0gZWl0aGVyIHBvaW50cyB0byBudWxsIG9yIHRoZSBzdGFydCBiZWFtLlxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIGJlYW0gYnJlYWsgKG5vdGUgaXMgbG9uZ2VyIHRoYW4gYSBxdWFydGVyLCBvciBhbiBlbmRfYmVhbSBpcyBvbiB0aGlzIGVsZW1lbnQpLCB0aGVuIHNldCB0aGUgYmVhbSBpZiB3ZSBoYXZlIG9uZS5cblx0XHRcdC8vIHJlc2V0IHRoZSB2YXJpYWJsZXMgZm9yIHRoZSBuZXh0IG5vdGVzLlxuXHRcdFx0dmFyIGR1ciA9IFRoaXMuZ2V0RHVyYXRpb24oaGFzaFBhcmFtcyk7XG5cdFx0XHRpZiAoZHVyID49IDAuMjUpIHtcdC8vIFRoZSBiZWFtIGVuZHMgb24gdGhlIG5vdGUgYmVmb3JlIHRoaXMuXG5cdFx0XHRcdGVuZEJlYW1MYXN0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGhhc2hQYXJhbXMuZm9yY2VfZW5kX2JlYW1fbGFzdCAmJiBUaGlzLnBvdGVudGlhbFN0YXJ0QmVhbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGVuZEJlYW1MYXN0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGhhc2hQYXJhbXMuZW5kX2JlYW0gJiYgVGhpcy5wb3RlbnRpYWxTdGFydEJlYW0gIT09IHVuZGVmaW5lZCkge1x0Ly8gdGhlIGJlYW0gaXMgZm9yY2VkIHRvIGVuZCBvbiB0aGlzIG5vdGUsIHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBzcGFjZSBpbiB0aGUgQUJDXG5cdFx0XHRcdGlmIChoYXNoUGFyYW1zLnJlc3QgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRlbmRCZWFtSGVyZSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZW5kQmVhbUxhc3QoKTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzaFBhcmFtcy5yZXN0ID09PSB1bmRlZmluZWQpIHtcdC8vIHRoaXMgYSBzaG9ydCBub3RlIGFuZCB3ZSBhcmVuJ3QgYWJvdXQgdG8gZW5kIHRoZSBiZWFtXG5cdFx0XHRcdGlmIChUaGlzLnBvdGVudGlhbFN0YXJ0QmVhbSA9PT0gdW5kZWZpbmVkKSB7XHQvLyBXZSBhcmVuJ3QgY29sbGVjdGluZyBub3RlcyBmb3IgYSBiZWFtLCBzbyBzdGFydCBoZXJlLlxuXHRcdFx0XHRcdGlmICghaGFzaFBhcmFtcy5lbmRfYmVhbSkge1xuXHRcdFx0XHRcdFx0VGhpcy5wb3RlbnRpYWxTdGFydEJlYW0gPSBoYXNoUGFyYW1zO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIFRoaXMucG90ZW50aWFsRW5kQmVhbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0VGhpcy5wb3RlbnRpYWxFbmRCZWFtID0gaGFzaFBhcmFtcztcdC8vIENvbnRpbnVlIHRoZSBiZWFtaW5nLCBsb29rIGZvciB0aGUgZW5kIG5leHQgbm90ZS5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyAgZW5kX2JlYW0gZ29lcyBvbiByZXN0cyBhbmQgbm90ZXMgd2hpY2ggcHJlY2VkZSByZXN0cyBfZXhjZXB0XyB3aGVuIGEgcmVzdCAob3Igc2V0IG9mIGFkamFjZW50IHJlc3RzKSBoYXMgbm9ybWFsIG5vdGVzIG9uIGJvdGggc2lkZXMgKG5vIHNwYWNlcylcbi8vXHRcdFx0aWYgKGhhc2hQYXJhbXMucmVzdCAhPT0gdW5kZWZpbmVkKVxuLy9cdFx0XHR7XG4vL1x0XHRcdFx0aGFzaFBhcmFtcy5lbmRfYmVhbSA9IHRydWU7XG4vL1x0XHRcdFx0dmFyIGVsMiA9IHRoaXMuZ2V0TGFzdE5vdGUoKTtcbi8vXHRcdFx0XHRpZiAoZWwyKSBlbDIuZW5kX2JlYW0gPSB0cnVlO1xuLy9cdFx0XHRcdC8vIFRPRE8tUEVSOiBpbXBsZW1lbnQgZXhjZXB0aW9uIG1lbnRpb25lZCBpbiB0aGUgY29tbWVudC5cbi8vXHRcdFx0fVxuXHRcdH0gZWxzZSB7XHQvLyBJdCdzIG5vdCBhIG5vdGUsIHNvIHRoZXJlIGRlZmluaXRlbHkgaXNuJ3QgYmVhbWluZyBhZnRlciBpdC5cblx0XHRcdGVuZEJlYW1MYXN0KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSBoYXNoUGFyYW1zLmVuZF9iZWFtO1x0Ly8gV2UgZG9uJ3Qgd2FudCB0aGlzIHRlbXBvcmFyeSB2YXJpYWJsZSBoYW5naW5nIGFyb3VuZC5cblx0XHRkZWxldGUgaGFzaFBhcmFtcy5mb3JjZV9lbmRfYmVhbV9sYXN0O1x0Ly8gV2UgZG9uJ3Qgd2FudCB0aGlzIHRlbXBvcmFyeSB2YXJpYWJsZSBoYW5naW5nIGFyb3VuZC5cblx0XHRwdXNoTm90ZShoYXNoUGFyYW1zKTtcblx0fTtcblxuXHR0aGlzLmFwcGVuZFN0YXJ0aW5nRWxlbWVudCA9IGZ1bmN0aW9uKHR5cGUsIHN0YXJ0Q2hhciwgZW5kQ2hhciwgaGFzaFBhcmFtczIpXG5cdHtcblx0XHQvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGJlYW1pbmcsIHRoZW4gZW5kIHRoZSBiZWFtLlxuXHRcdHRoaXMuY2xvc2VMaW5lKCk7XG5cblx0XHQvLyBXZSBvbmx5IGV2ZXIgd2FudCBpbXBsaWVkIG5hdHVyYWxzIHRoZSBmaXJzdCB0aW1lLlxuXHRcdHZhciBpbXBsaWVkTmF0dXJhbHM7XG5cdFx0aWYgKHR5cGUgPT09ICdrZXknKSB7XG5cdFx0XHRpbXBsaWVkTmF0dXJhbHMgPSBoYXNoUGFyYW1zMi5pbXBsaWVkTmF0dXJhbHM7XG5cdFx0XHRkZWxldGUgaGFzaFBhcmFtczIuaW1wbGllZE5hdHVyYWxzO1xuXHRcdFx0ZGVsZXRlIGhhc2hQYXJhbXMyLmV4cGxpY2l0QWNjaWRlbnRhbHM7XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgdGhlIG9iamVjdCBiZWNhdXNlIGl0IHdpbGwgYmUgc3RpY2tpbmcgYXJvdW5kIGZvciB0aGUgbmV4dCBsaW5lIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBleHRyYSBmaWVsZHMgaW4gaXQuXG5cdFx0dmFyIGhhc2hQYXJhbXMgPSBwYXJzZUNvbW1vbi5jbG9uZShoYXNoUGFyYW1zMik7XG5cblx0XHRpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmKSB7IC8vIGJlIHN1cmUgdGhhdCB3ZSBhcmUgb24gYSBtdXNpYyB0eXBlIGxpbmUgYmVmb3JlIGRvaW5nIHRoZSBmb2xsb3dpbmcuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoaXMgc3RhZmYsIHRoZW4gd2UgbWlnaHQgaGF2ZSB0byBpbml0aWFsaXplIHRoZSBzdGFmZiwgZmlyc3QuXG5cdFx0XHRpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmLmxlbmd0aCA8PSB0aGlzLnN0YWZmTnVtKSB7XG5cdFx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXSA9IHt9O1xuXHRcdFx0XHR0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0uY2xlZiA9IHBhcnNlQ29tbW9uLmNsb25lKHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlswXS5jbGVmKTtcblx0XHRcdFx0dGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmW3RoaXMuc3RhZmZOdW1dLmtleSA9IHBhcnNlQ29tbW9uLmNsb25lKHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlswXS5rZXkpO1xuXHRcdFx0XHRpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmWzBdLm1ldGVyKVxuXHRcdFx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS5tZXRlciA9IHBhcnNlQ29tbW9uLmNsb25lKHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlswXS5tZXRlcik7XG5cdFx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS53b3JraW5nQ2xlZiA9IHBhcnNlQ29tbW9uLmNsb25lKHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlswXS53b3JraW5nQ2xlZik7XG5cdFx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS52b2ljZXMgPSBbW11dO1xuXHRcdFx0fVxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIGNsZWYgdHlwZSwgdGhlbiB3ZSByZXBsYWNlIHRoZSB3b3JraW5nIGNsZWYgb24gdGhlIGxpbmUuIFRoaXMgaXMga2VwdCBzZXBhcmF0ZSBmcm9tXG5cdFx0XHQvLyB0aGUgY2xlZiBpbiBjYXNlIHRoZXJlIGlzIGFuIGlubGluZSBjbGVmIGZpZWxkLiBXZSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3Jcblx0XHRcdC8vIHRoZSBub3RlIGlzLlxuXHRcdFx0aWYgKHR5cGUgPT09ICdjbGVmJykge1xuXHRcdFx0XHR0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0ud29ya2luZ0NsZWYgPSBoYXNoUGFyYW1zO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVzZSBlbGVtZW50cyBzaG91bGQgbm90IGJlIGFkZGVkIHR3aWNlLCBzbyBpZiB0aGUgZWxlbWVudCBleGlzdHMgb24gdGhpcyBsaW5lIHdpdGhvdXQgYSBub3RlIG9yIGJhciBiZWZvcmUgaXQsIGp1c3QgcmVwbGFjZSB0aGUgc3RhZmYgdmVyc2lvbi5cblx0XHRcdHZhciB2b2ljZSA9IHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS52b2ljZXNbdGhpcy52b2ljZU51bV07XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHZvaWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICh2b2ljZVtpXS5lbF90eXBlID09PSAnbm90ZScgfHwgdm9pY2VbaV0uZWxfdHlwZSA9PT0gJ2JhcicpIHtcblx0XHRcdFx0XHRoYXNoUGFyYW1zLmVsX3R5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdGhhc2hQYXJhbXMuc3RhcnRDaGFyID0gc3RhcnRDaGFyO1xuXHRcdFx0XHRcdGhhc2hQYXJhbXMuZW5kQ2hhciA9IGVuZENoYXI7XG5cdFx0XHRcdFx0aWYgKGltcGxpZWROYXR1cmFscylcblx0XHRcdFx0XHRcdGhhc2hQYXJhbXMuYWNjaWRlbnRhbHMgPSBpbXBsaWVkTmF0dXJhbHMuY29uY2F0KGhhc2hQYXJhbXMuYWNjaWRlbnRhbHMpO1xuXHRcdFx0XHRcdHZvaWNlLnB1c2goaGFzaFBhcmFtcyk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2b2ljZVtpXS5lbF90eXBlID09PSB0eXBlKSB7XG5cdFx0XHRcdFx0aGFzaFBhcmFtcy5lbF90eXBlID0gdHlwZTtcblx0XHRcdFx0XHRoYXNoUGFyYW1zLnN0YXJ0Q2hhciA9IHN0YXJ0Q2hhcjtcblx0XHRcdFx0XHRoYXNoUGFyYW1zLmVuZENoYXIgPSBlbmRDaGFyO1xuXHRcdFx0XHRcdGlmIChpbXBsaWVkTmF0dXJhbHMpXG5cdFx0XHRcdFx0XHRoYXNoUGFyYW1zLmFjY2lkZW50YWxzID0gaW1wbGllZE5hdHVyYWxzLmNvbmNhdChoYXNoUGFyYW1zLmFjY2lkZW50YWxzKTtcblx0XHRcdFx0XHR2b2ljZVtpXSA9IGhhc2hQYXJhbXM7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXZSBkaWRuJ3Qgc2VlIGVpdGhlciB0aGF0IHR5cGUgb3IgYSBub3RlLCBzbyByZXBsYWNlIHRoZSBlbGVtZW50IHRvIHRoZSBzdGFmZi5cblx0XHRcdHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXVt0eXBlXSA9IGhhc2hQYXJhbXMyO1xuXHRcdH1cblx0fTtcblxuXHR0aGlzLmdldE51bUxpbmVzID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubGluZXMubGVuZ3RoO1xuXHR9O1xuXG5cdHRoaXMucHVzaExpbmUgPSBmdW5jdGlvbihoYXNoKSB7XG5cdFx0aWYgKHRoaXMudnNraXBQZW5kaW5nKSB7XG5cdFx0XHRoYXNoLnZza2lwID0gdGhpcy52c2tpcFBlbmRpbmc7XG5cdFx0XHRkZWxldGUgdGhpcy52c2tpcFBlbmRpbmc7XG5cdFx0fVxuXHRcdHRoaXMubGluZXMucHVzaChoYXNoKTtcblx0fTtcblxuXHR0aGlzLmFkZFN1YnRpdGxlID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dGhpcy5wdXNoTGluZSh7c3VidGl0bGU6IHN0cn0pO1xuXHR9O1xuXG5cdHRoaXMuYWRkU3BhY2luZyA9IGZ1bmN0aW9uKG51bSkge1xuXHRcdHRoaXMudnNraXBQZW5kaW5nID0gbnVtO1xuXHR9O1xuXG5cdHRoaXMuYWRkTmV3UGFnZSA9IGZ1bmN0aW9uKG51bSkge1xuXHRcdHRoaXMucHVzaExpbmUoe25ld3BhZ2U6IG51bX0pO1xuXHR9O1xuXG5cdHRoaXMuYWRkU2VwYXJhdG9yID0gZnVuY3Rpb24oc3BhY2VBYm92ZSwgc3BhY2VCZWxvdywgbGluZUxlbmd0aCkge1xuXHRcdHRoaXMucHVzaExpbmUoe3NlcGFyYXRvcjoge3NwYWNlQWJvdmU6IHNwYWNlQWJvdmUsIHNwYWNlQmVsb3c6IHNwYWNlQmVsb3csIGxpbmVMZW5ndGg6IGxpbmVMZW5ndGh9fSk7XG5cdH07XG5cblx0dGhpcy5hZGRUZXh0ID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0dGhpcy5wdXNoTGluZSh7dGV4dDogc3RyfSk7XG5cdH07XG5cblx0dGhpcy5hZGRDZW50ZXJlZCA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHRoaXMucHVzaExpbmUoe3RleHQ6IFt7dGV4dDogc3RyLCBjZW50ZXI6IHRydWUgfV19KTtcblx0fTtcblxuXHR0aGlzLmNvbnRhaW5zTm90ZXMgPSBmdW5jdGlvbih2b2ljZSkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdm9pY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICh2b2ljZVtpXS5lbF90eXBlID09PSAnbm90ZScgfHwgdm9pY2VbaV0uZWxfdHlwZSA9PT0gJ2JhcicpXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0dGhpcy5jb250YWluc05vdGVzU3RyaWN0ID0gZnVuY3Rpb24odm9pY2UpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHZvaWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodm9pY2VbaV0uZWxfdHlwZSA9PT0gJ25vdGUnICYmIHZvaWNlW2ldLnJlc3QgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuLy9cdGFueVZvaWNlQ29udGFpbnNOb3RlczogZnVuY3Rpb24obGluZSkge1xuLy9cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLnN0YWZmLnZvaWNlcy5sZW5ndGg7IGkrKykge1xuLy9cdFx0XHRpZiAodGhpcy5jb250YWluc05vdGVzKGxpbmUuc3RhZmYudm9pY2VzW2ldKSlcbi8vXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbi8vXHRcdH1cbi8vXHRcdHJldHVybiBmYWxzZTtcbi8vXHR9LFxuXHR0aGlzLmNoYW5nZVZvaWNlU2NhbGUgPSBmdW5jdGlvbihzY2FsZSkge1xuXHRcdHZhciBUaGlzID0gdGhpcztcblx0XHRUaGlzLmFwcGVuZEVsZW1lbnQoJ3NjYWxlJywgbnVsbCwgbnVsbCwgeyBzaXplOiBzY2FsZX0gKTtcblx0fTtcblxuXHR0aGlzLnN0YXJ0TmV3TGluZSA9IGZ1bmN0aW9uKHBhcmFtcykge1xuXHRcdC8vIElmIHRoZSBwb2ludGVkIHRvIGxpbmUgZG9lc24ndCBleGlzdCwganVzdCBjcmVhdGUgdGhhdC4gSWYgdGhlIGxpbmUgZG9lcyBleGlzdCwgYnV0IGRvZXNuJ3QgaGF2ZSBhbnkgbXVzaWMgb24gaXQsIGp1c3QgdXNlIGl0LlxuXHRcdC8vIElmIGl0IGRvZXMgZXhpc3QgYW5kIGhhcyBtdXNpYywgdGhlbiBpbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyLiBJZiB0aGUgbmV3IGVsZW1lbnQgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0LlxuXHRcdHZhciBUaGlzID0gdGhpcztcblx0XHR0aGlzLmNsb3NlTGluZSgpO1x0Ly8gQ2xvc2UgdGhlIHByZXZpb3VzIGxpbmUuXG5cdFx0dmFyIGNyZWF0ZVZvaWNlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG5cdFx0XHR2YXIgdGhpc1N0YWZmID0gVGhpcy5saW5lc1tUaGlzLmxpbmVOdW1dLnN0YWZmW1RoaXMuc3RhZmZOdW1dO1xuXHRcdFx0dGhpc1N0YWZmLnZvaWNlc1tUaGlzLnZvaWNlTnVtXSA9IFtdO1xuXHRcdFx0aWYgKCF0aGlzU3RhZmYudGl0bGUpXG5cdFx0XHRcdHRoaXNTdGFmZi50aXRsZSA9IFtdO1xuXHRcdFx0dGhpc1N0YWZmLnRpdGxlW1RoaXMudm9pY2VOdW1dID0geyBuYW1lOiBwYXJhbXMubmFtZSwgc3VibmFtZTogcGFyYW1zLnN1Ym5hbWUgfTtcblx0XHRcdGlmIChwYXJhbXMuc3R5bGUpXG5cdFx0XHRcdFRoaXMuYXBwZW5kRWxlbWVudCgnc3R5bGUnLCBudWxsLCBudWxsLCB7aGVhZDogcGFyYW1zLnN0eWxlfSk7XG5cdFx0XHRpZiAocGFyYW1zLnN0ZW0pXG5cdFx0XHRcdFRoaXMuYXBwZW5kRWxlbWVudCgnc3RlbScsIG51bGwsIG51bGwsIHtkaXJlY3Rpb246IHBhcmFtcy5zdGVtfSk7XG5cdFx0XHRlbHNlIGlmIChUaGlzLnZvaWNlTnVtID4gMCkge1xuXHRcdFx0XHRpZiAodGhpc1N0YWZmLnZvaWNlc1swXSE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXNTdGFmZi52b2ljZXNbMF0ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzU3RhZmYudm9pY2VzWzBdLmVsX3R5cGUgPT09ICdzdGVtJylcblx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RlbSA9IHsgZWxfdHlwZTogJ3N0ZW0nLCBkaXJlY3Rpb246ICd1cCcgfTtcblx0XHRcdFx0XHRcdHRoaXNTdGFmZi52b2ljZXNbMF0uc3BsaWNlKDAsMCxzdGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0VGhpcy5hcHBlbmRFbGVtZW50KCdzdGVtJywgbnVsbCwgbnVsbCwge2RpcmVjdGlvbjogJ2Rvd24nfSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLnNjYWxlKVxuXHRcdFx0XHRUaGlzLmFwcGVuZEVsZW1lbnQoJ3NjYWxlJywgbnVsbCwgbnVsbCwgeyBzaXplOiBwYXJhbXMuc2NhbGV9ICk7XG5cdFx0fTtcblx0XHR2YXIgY3JlYXRlU3RhZmYgPSBmdW5jdGlvbihwYXJhbXMpIHtcblx0XHRcdGlmIChwYXJhbXMua2V5ICYmIHBhcmFtcy5rZXkuaW1wbGllZE5hdHVyYWxzKSB7XG5cdFx0XHRcdHBhcmFtcy5rZXkuYWNjaWRlbnRhbHMgPSBwYXJhbXMua2V5LmFjY2lkZW50YWxzLmNvbmNhdChwYXJhbXMua2V5LmltcGxpZWROYXR1cmFscyk7XG5cdFx0XHRcdGRlbGV0ZSBwYXJhbXMua2V5LmltcGxpZWROYXR1cmFscztcblx0XHRcdH1cblxuXHRcdFx0VGhpcy5saW5lc1tUaGlzLmxpbmVOdW1dLnN0YWZmW1RoaXMuc3RhZmZOdW1dID0ge3ZvaWNlczogWyBdLCBjbGVmOiBwYXJhbXMuY2xlZiwga2V5OiBwYXJhbXMua2V5LCB3b3JraW5nQ2xlZjogcGFyYW1zLmNsZWYgfTtcblx0XHRcdGlmIChwYXJhbXMuc3RhZmZsaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFRoaXMubGluZXNbVGhpcy5saW5lTnVtXS5zdGFmZltUaGlzLnN0YWZmTnVtXS5jbGVmLnN0YWZmbGluZXMgPSBwYXJhbXMuc3RhZmZsaW5lcztcblx0XHRcdFx0VGhpcy5saW5lc1tUaGlzLmxpbmVOdW1dLnN0YWZmW1RoaXMuc3RhZmZOdW1dLndvcmtpbmdDbGVmLnN0YWZmbGluZXMgPSBwYXJhbXMuc3RhZmZsaW5lcztcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMuc3RhZmZzY2FsZSkge1xuXHRcdFx0XHRUaGlzLmxpbmVzW1RoaXMubGluZU51bV0uc3RhZmZbVGhpcy5zdGFmZk51bV0uc3RhZmZzY2FsZSA9IHBhcmFtcy5zdGFmZnNjYWxlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50cmlwbGV0Zm9udCkgVGhpcy5saW5lc1tUaGlzLmxpbmVOdW1dLnN0YWZmW1RoaXMuc3RhZmZOdW1dLnRyaXBsZXRmb250ID0gcGFyYW1zLnRyaXBsZXRmb250O1xuXHRcdFx0aWYgKHBhcmFtcy52b2NhbGZvbnQpIFRoaXMubGluZXNbVGhpcy5saW5lTnVtXS5zdGFmZltUaGlzLnN0YWZmTnVtXS52b2NhbGZvbnQgPSBwYXJhbXMudm9jYWxmb250O1xuXHRcdFx0aWYgKHBhcmFtcy5icmFja2V0KSBUaGlzLmxpbmVzW1RoaXMubGluZU51bV0uc3RhZmZbVGhpcy5zdGFmZk51bV0uYnJhY2tldCA9IHBhcmFtcy5icmFja2V0O1xuXHRcdFx0aWYgKHBhcmFtcy5icmFjZSkgVGhpcy5saW5lc1tUaGlzLmxpbmVOdW1dLnN0YWZmW1RoaXMuc3RhZmZOdW1dLmJyYWNlID0gcGFyYW1zLmJyYWNlO1xuXHRcdFx0aWYgKHBhcmFtcy5jb25uZWN0QmFyTGluZXMpIFRoaXMubGluZXNbVGhpcy5saW5lTnVtXS5zdGFmZltUaGlzLnN0YWZmTnVtXS5jb25uZWN0QmFyTGluZXMgPSBwYXJhbXMuY29ubmVjdEJhckxpbmVzO1xuXHRcdFx0aWYgKHBhcmFtcy5iYXJOdW1iZXIpIFRoaXMubGluZXNbVGhpcy5saW5lTnVtXS5zdGFmZltUaGlzLnN0YWZmTnVtXS5iYXJOdW1iZXIgPSBwYXJhbXMuYmFyTnVtYmVyO1xuXHRcdFx0Y3JlYXRlVm9pY2UocGFyYW1zKTtcblx0XHRcdC8vIFNvbWUgc3R1ZmYganVzdCBoYXBwZW5zIGZvciB0aGUgZmlyc3Qgdm9pY2Vcblx0XHRcdGlmIChwYXJhbXMucGFydClcblx0XHRcdFx0VGhpcy5hcHBlbmRFbGVtZW50KCdwYXJ0JywgcGFyYW1zLnBhcnQuc3RhcnRDaGFyLCBwYXJhbXMucGFydC5lbmRDaGFyLCB7dGl0bGU6IHBhcmFtcy5wYXJ0LnRpdGxlfSk7XG5cdFx0XHRpZiAocGFyYW1zLm1ldGVyICE9PSB1bmRlZmluZWQpIFRoaXMubGluZXNbVGhpcy5saW5lTnVtXS5zdGFmZltUaGlzLnN0YWZmTnVtXS5tZXRlciA9IHBhcmFtcy5tZXRlcjtcblx0XHR9O1xuXHRcdHZhciBjcmVhdGVMaW5lID0gZnVuY3Rpb24ocGFyYW1zKSB7XG5cdFx0XHRUaGlzLmxpbmVzW1RoaXMubGluZU51bV0gPSB7c3RhZmY6IFtdfTtcblx0XHRcdGNyZWF0ZVN0YWZmKHBhcmFtcyk7XG5cdFx0fTtcblx0XHRpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dID09PSB1bmRlZmluZWQpIGNyZWF0ZUxpbmUocGFyYW1zKTtcblx0XHRlbHNlIGlmICh0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5saW5lTnVtKys7XG5cdFx0XHR0aGlzLnN0YXJ0TmV3TGluZShwYXJhbXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmW3RoaXMuc3RhZmZOdW1dID09PSB1bmRlZmluZWQpIGNyZWF0ZVN0YWZmKHBhcmFtcyk7XG5cdFx0ZWxzZSBpZiAodGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmW3RoaXMuc3RhZmZOdW1dLnZvaWNlc1t0aGlzLnZvaWNlTnVtXSA9PT0gdW5kZWZpbmVkKSBjcmVhdGVWb2ljZShwYXJhbXMpO1xuXHRcdGVsc2UgaWYgKCF0aGlzLmNvbnRhaW5zTm90ZXModGhpcy5saW5lc1t0aGlzLmxpbmVOdW1dLnN0YWZmW3RoaXMuc3RhZmZOdW1dLnZvaWNlc1t0aGlzLnZvaWNlTnVtXSkpIHJldHVybjtcblx0XHRlbHNlIHtcblx0XHRcdHRoaXMubGluZU51bSsrO1xuXHRcdFx0dGhpcy5zdGFydE5ld0xpbmUocGFyYW1zKTtcblx0XHR9XG5cdH07XG5cblx0dGhpcy5zZXRCYXJOdW1iZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihiYXJOdW1iZXIpIHtcblx0XHQvLyBJZiB0aGlzIGlzIGNhbGxlZCByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgdGhlbiBjb3JyZWN0IHRoZSBtZWFzdXJlIG51bWJlciB0aGF0IGlzIGFscmVhZHkgd3JpdHRlbi5cblx0XHQvLyBJZiB0aGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbWVhc3VyZSwgdGhlbiBjb3JyZWN0IHRoZSBtZWFzdXJlIG51bWJlciB0aGF0IHdhcyBqdXN0IGNyZWF0ZWQuXG5cdFx0Ly8gSWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBhIG1lYXN1cmUsIHRoZW4gc3VidHJhY3Qgb25lIGZyb20gaXQsIGJlY2F1c2UgaXQgd2lsbCBiZSBpbmNyZW1lbnRlZCBiZWZvcmUgYXBwbGllZC5cblx0XHR2YXIgY3VycmVudFZvaWNlID0gdGhpcy5nZXRDdXJyZW50Vm9pY2UoKTtcblx0XHRpZiAoY3VycmVudFZvaWNlICYmIGN1cnJlbnRWb2ljZS5sZW5ndGggPiAwKSB7XG5cdFx0XHR2YXIgbGFzdEVsZW1lbnQgPSBjdXJyZW50Vm9pY2VbY3VycmVudFZvaWNlLmxlbmd0aC0xXTtcblx0XHRcdGlmIChsYXN0RWxlbWVudC5lbF90eXBlID09PSAnYmFyJykge1xuXHRcdFx0XHRpZiAobGFzdEVsZW1lbnQuYmFyTnVtYmVyICE9PSB1bmRlZmluZWQpIC8vIHRoZSBtZWFzdXJlIG51bWJlciBtaWdodCBub3QgYmUgd3JpdHRlbiBmb3IgdGhpcyBiYXIsIGRvbid0IG92ZXJyaWRlIHRoYXQuXG5cdFx0XHRcdFx0bGFzdEVsZW1lbnQuYmFyTnVtYmVyID0gYmFyTnVtYmVyO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHJldHVybiBiYXJOdW1iZXItMTtcblx0XHR9XG5cdFx0cmV0dXJuIGJhck51bWJlcjtcblx0fTtcblxuXHR0aGlzLmhhc0JlZ2luTXVzaWMgPSBmdW5jdGlvbigpIHtcblx0XHQvLyByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBleGlzdHMgYXQgbGVhc3Qgb25lIGxpbmUgdGhhdCBjb250YWlucyBcInN0YWZmXCJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICh0aGlzLmxpbmVzW2ldLnN0YWZmKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdHRoaXMuaXNGaXJzdExpbmUgPSBmdW5jdGlvbihpbmRleCkge1xuXHRcdGZvciAodmFyIGkgPSBpbmRleC0xOyBpID49IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmYgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblxuXHR0aGlzLmdldE1ldGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgbGluZSA9IHRoaXMubGluZXNbaV07XG5cdFx0XHRpZiAobGluZS5zdGFmZikge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUuc3RhZmYubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHR2YXIgbWV0ZXIgPSBsaW5lLnN0YWZmW2pdLm1ldGVyO1xuXHRcdFx0XHRcdGlmIChtZXRlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1ldGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geyB0eXBlOiBcImNvbW1vbl90aW1lXCIgfTtcblx0fTtcblxuXHR0aGlzLmdldE1ldGVyRnJhY3Rpb24gPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWV0ZXIgPSB0aGlzLmdldE1ldGVyKCk7XG5cdFx0dmFyIG51bSA9IDQ7XG5cdFx0dmFyIGRlbiA9IDQ7XG5cdFx0aWYgKG1ldGVyKSB7XG5cdFx0XHRpZiAobWV0ZXIudHlwZSA9PT0gJ3NwZWNpZmllZCcpIHtcblx0XHRcdFx0bnVtID0gcGFyc2VJbnQobWV0ZXIudmFsdWVbMF0ubnVtLCAxMCk7XG5cdFx0XHRcdGRlbiA9IHBhcnNlSW50KG1ldGVyLnZhbHVlWzBdLmRlbiwxMCk7XG5cdFx0XHR9IGVsc2UgaWYgKG1ldGVyLnR5cGUgPT09ICdjdXRfdGltZScpIHtcblx0XHRcdFx0bnVtID0gMjtcblx0XHRcdFx0ZGVuID0gMjtcblx0XHRcdH0gZWxzZSBpZiAobWV0ZXIudHlwZSA9PT0gJ2NvbW1vbl90aW1lJykge1xuXHRcdFx0XHRudW0gPSA0O1xuXHRcdFx0XHRkZW4gPSA0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLm1ldGVyID0geyBudW06IG51bSwgZGVuOiBkZW4gfTtcblx0XHRyZXR1cm4gdGhpcy5tZXRlcjsgLy8gVE9ETy1QRVI6IGlzIHRoaXMgc2F2ZWQgdmFsdWUgdXNlZCBhbnl3aGVyZT8gQSBnZXQgZnVuY3Rpb24gc2hvdWxkbid0IGNoYW5nZSBzdGF0ZS5cblx0fTtcblxuXHR0aGlzLmdldEtleVNpZ25hdHVyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldO1xuXHRcdFx0aWYgKGxpbmUuc3RhZmYpIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLnN0YWZmLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmUuc3RhZmZbal0ua2V5KVxuXHRcdFx0XHRcdFx0cmV0dXJuIGxpbmUuc3RhZmZbal0ua2V5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7ICB9O1xuXHR9O1xuXG5cdHRoaXMuZ2V0Q3VycmVudFZvaWNlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubGluZXNbdGhpcy5saW5lTnVtXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGluZXNbdGhpcy5saW5lTnVtXS5zdGFmZlt0aGlzLnN0YWZmTnVtXS52b2ljZXNbdGhpcy52b2ljZU51bV0gIT09IHVuZGVmaW5lZClcblx0XHRcdHJldHVybiB0aGlzLmxpbmVzW3RoaXMubGluZU51bV0uc3RhZmZbdGhpcy5zdGFmZk51bV0udm9pY2VzW3RoaXMudm9pY2VOdW1dO1xuXHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdH07XG5cblx0dGhpcy5zZXRDdXJyZW50Vm9pY2UgPSBmdW5jdGlvbihzdGFmZk51bSwgdm9pY2VOdW0pIHtcblx0XHR0aGlzLnN0YWZmTnVtID0gc3RhZmZOdW07XG5cdFx0dGhpcy52b2ljZU51bSA9IHZvaWNlTnVtO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmYpIHtcblx0XHRcdFx0aWYgKHRoaXMubGluZXNbaV0uc3RhZmZbc3RhZmZOdW1dID09PSB1bmRlZmluZWQgfHwgdGhpcy5saW5lc1tpXS5zdGFmZltzdGFmZk51bV0udm9pY2VzW3ZvaWNlTnVtXSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0IXRoaXMuY29udGFpbnNOb3Rlcyh0aGlzLmxpbmVzW2ldLnN0YWZmW3N0YWZmTnVtXS52b2ljZXNbdm9pY2VOdW1dICkpIHtcblx0XHRcdFx0XHR0aGlzLmxpbmVOdW0gPSAgaTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5saW5lTnVtID0gIGk7XG5cdH07XG5cblx0dGhpcy5hZGRNZXRhVGV4dCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcblx0XHRpZiAodGhpcy5tZXRhVGV4dFtrZXldID09PSB1bmRlZmluZWQpXG5cdFx0XHR0aGlzLm1ldGFUZXh0W2tleV0gPSB2YWx1ZTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLm1ldGFUZXh0W2tleV0gKz0gXCJcXG5cIiArIHZhbHVlO1xuXHR9O1xuXG5cdHRoaXMuYWRkTWV0YVRleHRBcnJheSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcblx0XHRpZiAodGhpcy5tZXRhVGV4dFtrZXldID09PSB1bmRlZmluZWQpXG5cdFx0XHR0aGlzLm1ldGFUZXh0W2tleV0gPSBbdmFsdWVdO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubWV0YVRleHRba2V5XS5wdXNoKHZhbHVlKTtcblx0fTtcblx0dGhpcy5hZGRNZXRhVGV4dE9iaiA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcblx0XHR0aGlzLm1ldGFUZXh0W2tleV0gPSB2YWx1ZTtcblx0fTtcblxuXHRmdW5jdGlvbiBhZGRWZXJ0aWNhbEluZm8odGltaW5nRXZlbnRzKSB7XG5cdFx0Ly8gQWRkIHZlcnRpY2FsIGluZm8gdG8gdGhlIGJhciBldmVudHM6IHB1dCB0aGUgbmV4dCBldmVudCdzIHRvcCwgYW5kIHRoZSBldmVudCBhZnRlciB0aGUgbmV4dCBtZWFzdXJlJ3MgdG9wLlxuXHRcdHZhciBsYXN0QmFyVG9wO1xuXHRcdHZhciBsYXN0QmFyQm90dG9tO1xuXHRcdHZhciBsYXN0RXZlbnRUb3A7XG5cdFx0dmFyIGxhc3RFdmVudEJvdHRvbTtcblx0XHRmb3IgKHZhciBlID0gdGltaW5nRXZlbnRzLmxlbmd0aCAtIDE7IGUgPj0gMDsgZS0tKSB7XG5cdFx0XHR2YXIgZXYgPSB0aW1pbmdFdmVudHNbZV07XG5cdFx0XHRpZiAoZXYudHlwZSA9PT0gJ2JhcicpIHtcblx0XHRcdFx0ZXYudG9wID0gbGFzdEV2ZW50VG9wO1xuXHRcdFx0XHRldi5uZXh0VG9wID0gbGFzdEJhclRvcDtcblx0XHRcdFx0bGFzdEJhclRvcCA9IGxhc3RFdmVudFRvcDtcblxuXHRcdFx0XHRldi5ib3R0b20gPSBsYXN0RXZlbnRCb3R0b207XG5cdFx0XHRcdGV2Lm5leHRCb3R0b20gPSBsYXN0QmFyQm90dG9tO1xuXHRcdFx0XHRsYXN0QmFyQm90dG9tID0gbGFzdEV2ZW50Qm90dG9tO1xuXHRcdFx0fSBlbHNlIGlmIChldi50eXBlID09PSAnZXZlbnQnKSB7XG5cdFx0XHRcdGxhc3RFdmVudFRvcCA9IGV2LnRvcDtcblx0XHRcdFx0bGFzdEV2ZW50Qm90dG9tID0gZXYudG9wICsgZXYuaGVpZ2h0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VTb3J0ZWRBcnJheShoYXNoKSB7XG5cdFx0dmFyIGFyciA9IFtdO1xuXHRcdGZvciAodmFyIGsgaW4gaGFzaCkge1xuXHRcdFx0aWYgKGhhc2guaGFzT3duUHJvcGVydHkoaykpXG5cdFx0XHRcdGFyci5wdXNoKGhhc2hba10pO1xuXHRcdH1cblx0XHRhcnIgPSBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0dmFyIGRpZmYgPSBhLm1pbGxpc2Vjb25kcyAtIGIubWlsbGlzZWNvbmRzO1xuXHRcdFx0Ly8gaWYgdGhlIGV2ZW50cyBoYXZlIHRoZSBzYW1lIHRpbWUsIG1ha2Ugc3VyZSBhIGJhciBjb21lcyBiZWZvcmUgYSBub3RlXG5cdFx0XHRpZiAoZGlmZiAhPT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gZGlmZjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYS50eXBlID09PSBcImJhclwiID8gLTEgOiAxO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhcnI7XG5cdH1cblxuXHR0aGlzLmFkZEVsZW1lbnRUb0V2ZW50cyA9IGZ1bmN0aW9uKGV2ZW50SGFzaCwgZWxlbWVudCwgdm9pY2VUaW1lTWlsbGlzZWNvbmRzLCB0b3AsIGhlaWdodCwgbGluZSwgbWVhc3VyZU51bWJlciwgdGltZURpdmlkZXIsIGlzVGllZFN0YXRlLCBuZXh0SXNCYXIpIHtcblx0XHRpZiAoZWxlbWVudC5oaW50KVxuXHRcdFx0cmV0dXJuIHsgaXNUaWVkU3RhdGU6IHVuZGVmaW5lZCwgZHVyYXRpb246IDAgfTtcblx0XHR2YXIgcmVhbER1cmF0aW9uID0gZWxlbWVudC5kdXJhdGlvbkNsYXNzID8gZWxlbWVudC5kdXJhdGlvbkNsYXNzIDogZWxlbWVudC5kdXJhdGlvbjtcblx0XHRpZiAoZWxlbWVudC5hYmNlbGVtLnJlc3QgJiYgZWxlbWVudC5hYmNlbGVtLnJlc3QudHlwZSA9PT0gXCJzcGFjZXJcIilcblx0XHRcdHJlYWxEdXJhdGlvbiA9IDA7XG5cdFx0aWYgKHJlYWxEdXJhdGlvbiA+IDApIHtcblx0XHRcdHZhciBlcyA9IFtdO1xuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgYW4gaW52aXNpYmxlIHJlc3QsIHRoZW4gdGhlcmUgYXJlIG5vdCBlbGVtZW50cywgc28gZG9uJ3QgcHVzaCBhIG51bGwgb25lLlxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50LmVsZW1zZXQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQuZWxlbXNldFtpXSAhPT0gbnVsbClcblx0XHRcdFx0XHRlcy5wdXNoKGVsZW1lbnQuZWxlbXNldFtpXSk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgaXNUaWVkVG9OZXh0ID0gZWxlbWVudC5zdGFydFRpZTtcblx0XHRcdGlmIChpc1RpZWRTdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyBpc1RpZWRTdGF0ZV0uZWxlbWVudHMucHVzaChlcyk7IC8vIEFkZCB0aGUgdGllZCBub3RlIHRvIHRoZSBmaXJzdCBub3RlIHRoYXQgaXQgaXMgdGllZCB0b1xuXHRcdFx0XHRpZiAobmV4dElzQmFyKSB7XG5cdFx0XHRcdFx0aWYgKCFldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXSkge1xuXHRcdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiZXZlbnRcIixcblx0XHRcdFx0XHRcdFx0bWlsbGlzZWNvbmRzOiB2b2ljZVRpbWVNaWxsaXNlY29uZHMsXG5cdFx0XHRcdFx0XHRcdGxpbmU6IGxpbmUsXG5cdFx0XHRcdFx0XHRcdG1lYXN1cmVOdW1iZXI6IG1lYXN1cmVOdW1iZXIsXG5cdFx0XHRcdFx0XHRcdHRvcDogdG9wLFxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRcdFx0XHRcdFx0bGVmdDogbnVsbCxcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDAsXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnRzOiBbXSxcblx0XHRcdFx0XHRcdFx0c3RhcnRDaGFyOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRlbmRDaGFyOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRzdGFydENoYXJBcnJheTogW10sXG5cdFx0XHRcdFx0XHRcdGVuZENoYXJBcnJheTogW11cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1lYXN1cmVTdGFydCA9IHRydWU7XG5cdFx0XHRcdFx0bmV4dElzQmFyID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFpc1RpZWRUb05leHQpXG5cdFx0XHRcdFx0aXNUaWVkU3RhdGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgbGFzdCBub3RlIHdhc24ndCB0aWVkLlxuXHRcdFx0XHRpZiAoIWV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdKSB7XG5cdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10gPSB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImV2ZW50XCIsXG5cdFx0XHRcdFx0XHRtaWxsaXNlY29uZHM6IHZvaWNlVGltZU1pbGxpc2Vjb25kcyxcblx0XHRcdFx0XHRcdGxpbmU6IGxpbmUsXG5cdFx0XHRcdFx0XHRtZWFzdXJlTnVtYmVyOiBtZWFzdXJlTnVtYmVyLFxuXHRcdFx0XHRcdFx0dG9wOiB0b3AsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRcdFx0XHRcdGxlZnQ6IGVsZW1lbnQueCxcblx0XHRcdFx0XHRcdHdpZHRoOiBlbGVtZW50LncsXG5cdFx0XHRcdFx0XHRlbGVtZW50czogW2VzXSxcblx0XHRcdFx0XHRcdHN0YXJ0Q2hhcjogZWxlbWVudC5hYmNlbGVtLnN0YXJ0Q2hhcixcblx0XHRcdFx0XHRcdGVuZENoYXI6IGVsZW1lbnQuYWJjZWxlbS5lbmRDaGFyLFxuXHRcdFx0XHRcdFx0c3RhcnRDaGFyQXJyYXk6IFtlbGVtZW50LmFiY2VsZW0uc3RhcnRDaGFyXSxcblx0XHRcdFx0XHRcdGVuZENoYXJBcnJheTogW2VsZW1lbnQuYWJjZWxlbS5lbmRDaGFyXSxcblx0XHRcdFx0XHRcdG1pZGlQaXRjaGVzOiBlbGVtZW50LmFiY2VsZW0ubWlkaVBpdGNoZXMgPyBwYXJzZUNvbW1vbi5jbG9uZUFycmF5KGVsZW1lbnQuYWJjZWxlbS5taWRpUGl0Y2hlcykgOiBbXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQuYWJjZWxlbS5taWRpR3JhY2VOb3RlUGl0Y2hlcylcblx0XHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1pZGlHcmFjZU5vdGVQaXRjaGVzID0gcGFyc2VDb21tb24uY2xvbmVBcnJheShlbGVtZW50LmFiY2VsZW0ubWlkaUdyYWNlTm90ZVBpdGNoZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdm9pY2UgdGhlbiB0d28gbm90ZXMgY2FuIGZhbGwgYXQgdGhlIHNhbWUgdGltZS4gVXN1YWxseSB0aGV5IHdvdWxkIGJlIGxpbmVkIHVwIGluIHRoZSBzYW1lIHBsYWNlLCBidXQgaWYgaXQgaXMgYSB3aG9sZSByZXN0LCB0aGVuIGl0IGlzIHBsYWNlZCBmdW5ueS4gSW4gYW55IGNhc2UsIHRoZSBsZWZ0IG1vc3QgZWxlbWVudCB3aW5zLlxuXHRcdFx0XHRcdGlmIChldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5sZWZ0KVxuXHRcdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10ubGVmdCA9IE1hdGgubWluKGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLmxlZnQsIGVsZW1lbnQueCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10ubGVmdCA9IGVsZW1lbnQueDtcblx0XHRcdFx0XHRldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5lbGVtZW50cy5wdXNoKGVzKTtcblx0XHRcdFx0XHRldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5zdGFydENoYXJBcnJheS5wdXNoKGVsZW1lbnQuYWJjZWxlbS5zdGFydENoYXIpO1xuXHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLmVuZENoYXJBcnJheS5wdXNoKGVsZW1lbnQuYWJjZWxlbS5lbmRDaGFyKTtcblx0XHRcdFx0XHRpZiAoZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10uc3RhcnRDaGFyID09PSBudWxsKVxuXHRcdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10uc3RhcnRDaGFyID1lbGVtZW50LmFiY2VsZW0uc3RhcnRDaGFyO1xuXHRcdFx0XHRcdGlmIChldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5lbmRDaGFyID09PSBudWxsKVxuXHRcdFx0XHRcdFx0ZXZlbnRIYXNoW1wiZXZlbnRcIiArIHZvaWNlVGltZU1pbGxpc2Vjb25kc10uZW5kQ2hhciA9ZWxlbWVudC5hYmNlbGVtLmVuZENoYXI7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQuYWJjZWxlbS5taWRpUGl0Y2hlcyAmJiBlbGVtZW50LmFiY2VsZW0ubWlkaVBpdGNoZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1pZGlQaXRjaGVzKVxuXHRcdFx0XHRcdFx0XHRldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5taWRpUGl0Y2hlcyA9IFtdO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50LmFiY2VsZW0ubWlkaVBpdGNoZXMubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1pZGlQaXRjaGVzLnB1c2goZWxlbWVudC5hYmNlbGVtLm1pZGlQaXRjaGVzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQuYWJjZWxlbS5taWRpR3JhY2VOb3RlUGl0Y2hlcyAmJiBlbGVtZW50LmFiY2VsZW0ubWlkaUdyYWNlTm90ZVBpdGNoZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1pZGlHcmFjZU5vdGVQaXRjaGVzKVxuXHRcdFx0XHRcdFx0XHRldmVudEhhc2hbXCJldmVudFwiICsgdm9pY2VUaW1lTWlsbGlzZWNvbmRzXS5taWRpR3JhY2VOb3RlUGl0Y2hlcyA9IFtdO1xuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBlbGVtZW50LmFiY2VsZW0ubWlkaUdyYWNlTm90ZVBpdGNoZXMubGVuZ3RoOyBqKyspXG5cdFx0XHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1pZGlHcmFjZU5vdGVQaXRjaGVzLnB1c2goZWxlbWVudC5hYmNlbGVtLm1pZGlHcmFjZU5vdGVQaXRjaGVzW2pdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5leHRJc0Jhcikge1xuXHRcdFx0XHRcdGV2ZW50SGFzaFtcImV2ZW50XCIgKyB2b2ljZVRpbWVNaWxsaXNlY29uZHNdLm1lYXN1cmVTdGFydCA9IHRydWU7XG5cdFx0XHRcdFx0bmV4dElzQmFyID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlzVGllZFRvTmV4dClcblx0XHRcdFx0XHRpc1RpZWRTdGF0ZSA9IHZvaWNlVGltZU1pbGxpc2Vjb25kcztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHsgaXNUaWVkU3RhdGU6IGlzVGllZFN0YXRlLCBkdXJhdGlvbjogcmVhbER1cmF0aW9uIC8gdGltZURpdmlkZXIsIG5leHRJc0JhcjogbmV4dElzQmFyIHx8IGVsZW1lbnQudHlwZSA9PT0gJ2JhcicgfTtcblx0fTtcblxuXHR0aGlzLm1ha2VWb2ljZXNBcnJheSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEZpcnN0IG1ha2UgYSBuZXcgYXJyYXkgdGhhdCBpcyBhcnJhbmdlZCBieSB2b2ljZSBzbyB0aGF0IHRoZSByZXBlYXRzIHRoYXQgc3BhbiBkaWZmZXJlbnQgbGluZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LlxuXHRcdHZhciB2b2ljZXNBcnIgPSBbXTtcblx0XHRmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IHRoaXMuZW5ncmF2ZXIuc3RhZmZncm91cHMubGVuZ3RoOyBsaW5lKyspIHtcblx0XHRcdHZhciBncm91cCA9IHRoaXMuZW5ncmF2ZXIuc3RhZmZncm91cHNbbGluZV07XG5cdFx0XHR2YXIgZmlyc3RTdGFmZiA9IGdyb3VwLnN0YWZmc1swXTtcblx0XHRcdHZhciBtaWRkbGVDID0gZmlyc3RTdGFmZi5hYnNvbHV0ZVk7XG5cdFx0XHR2YXIgdG9wID0gbWlkZGxlQyAtIGZpcnN0U3RhZmYudG9wICogc3BhY2luZy5TVEVQO1xuXHRcdFx0dmFyIGxhc3RTdGFmZiA9IGdyb3VwLnN0YWZmc1tncm91cC5zdGFmZnMubGVuZ3RoIC0gMV07XG5cdFx0XHRtaWRkbGVDID0gbGFzdFN0YWZmLmFic29sdXRlWTtcblx0XHRcdHZhciBib3R0b20gPSBtaWRkbGVDIC0gbGFzdFN0YWZmLmJvdHRvbSAqIHNwYWNpbmcuU1RFUDtcblx0XHRcdHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cblx0XHRcdHZhciB2b2ljZXMgPSBncm91cC52b2ljZXM7XG5cdFx0XHRmb3IgKHZhciB2ID0gMDsgdiA8IHZvaWNlcy5sZW5ndGg7IHYrKykge1xuXHRcdFx0XHR2YXIgbWVhc3VyZU51bWJlciA9IDA7XG5cdFx0XHRcdHZhciBub3RlRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKCF2b2ljZXNBcnJbdl0pXG5cdFx0XHRcdFx0dm9pY2VzQXJyW3ZdID0gW107XG5cdFx0XHRcdHZhciBlbGVtZW50cyA9IHZvaWNlc1t2XS5jaGlsZHJlbjtcblx0XHRcdFx0Zm9yICh2YXIgZWxlbSA9IDA7IGVsZW0gPCBlbGVtZW50cy5sZW5ndGg7IGVsZW0rKykge1xuXHRcdFx0XHRcdHZvaWNlc0Fyclt2XS5wdXNoKHt0b3A6IHRvcCwgaGVpZ2h0OiBoZWlnaHQsIGxpbmU6IGxpbmUsIG1lYXN1cmVOdW1iZXI6IG1lYXN1cmVOdW1iZXIsIGVsZW06IGVsZW1lbnRzW2VsZW1dfSk7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnRzW2VsZW1dLnR5cGUgPT09ICdiYXInICYmIG5vdGVGb3VuZCkgLy8gQ291bnQgdGhlIG1lYXN1cmVzIGJ5IGNvdW50aW5nIHRoZSBiYXIgbGluZXMsIGJ1dCBza2lwIGEgYmFyIGxpbmUgdGhhdCBhcHBlYXJzIGF0IHRoZSBsZWZ0IG9mIHRoZSBtdXNpYywgYmVmb3JlIGFueSBub3Rlcy5cblx0XHRcdFx0XHRcdG1lYXN1cmVOdW1iZXIrKztcblx0XHRcdFx0XHRpZiAoZWxlbWVudHNbZWxlbV0udHlwZSA9PT0gJ25vdGUnIHx8IGVsZW1lbnRzW2VsZW1dLnR5cGUgPT09ICdyZXN0Jylcblx0XHRcdFx0XHRcdG5vdGVGb3VuZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZvaWNlc0Fycjtcblx0fTtcblxuXHR0aGlzLnNldHVwRXZlbnRzID0gZnVuY3Rpb24oc3RhcnRpbmdEZWxheSwgdGltZURpdmlkZXIsIGJwbSkge1xuXHRcdHZhciB0aW1pbmdFdmVudHMgPSBbXTtcblxuXHRcdHZhciBldmVudEhhc2ggPSB7fTtcblx0XHQvLyBUaGUgdGltZSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwaWVjZS5cblx0XHQvLyBUaGUgdW5pdHMgd2UgYXJlIHNjYW5uaW5nIGFyZSBpbiBub3RhdGlvbiB1bml0cyAoaS5lLiAwLjI1IGlzIGEgcXVhcnRlciBub3RlKVxuXHRcdHZhciB0aW1lID0gc3RhcnRpbmdEZWxheTtcblx0XHR2YXIgaXNUaWVkU3RhdGU7XG5cdFx0dmFyIG5leHRJc0JhciA9IHRydWU7XG5cdFx0dmFyIHZvaWNlcyA9IHRoaXMubWFrZVZvaWNlc0FycmF5KCk7XG5cdFx0Zm9yICh2YXIgdiA9IDA7IHYgPCB2b2ljZXMubGVuZ3RoOyB2KyspIHtcblx0XHRcdHZhciB2b2ljZVRpbWUgPSB0aW1lO1xuXHRcdFx0dmFyIHZvaWNlVGltZU1pbGxpc2Vjb25kcyA9IE1hdGgucm91bmQodm9pY2VUaW1lICogMTAwMCk7XG5cdFx0XHR2YXIgc3RhcnRpbmdSZXBlYXRFbGVtID0gMDtcblx0XHRcdHZhciBlbmRpbmdSZXBlYXRFbGVtID0gLTE7XG5cdFx0XHR2YXIgZWxlbWVudHMgPSB2b2ljZXNbdl07XG5cdFx0XHRmb3IgKHZhciBlbGVtID0gMDsgZWxlbSA8IGVsZW1lbnRzLmxlbmd0aDsgZWxlbSsrKSB7XG5cdFx0XHRcdHZhciBlbGVtZW50ID0gZWxlbWVudHNbZWxlbV0uZWxlbTtcblx0XHRcdFx0aWYgKGVsZW1lbnQuYWJjZWxlbS5lbF90eXBlID09PSBcInRlbXBvXCIpIHtcblx0XHRcdFx0XHR2YXIgYnBtID0gdGhpcy5nZXRCcG0oZWxlbWVudC5hYmNlbGVtKTtcblx0XHRcdFx0XHR2YXIgYmVhdExlbmd0aCA9IHRoaXMuZ2V0QmVhdExlbmd0aCgpO1xuXHRcdFx0XHRcdHZhciBiZWF0c1BlclNlY29uZCA9IGJwbSAvIDYwO1xuXHRcdFx0XHRcdHRpbWVEaXZpZGVyID0gYmVhdExlbmd0aCAqIGJlYXRzUGVyU2Vjb25kO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciByZXQgPSB0aGlzLmFkZEVsZW1lbnRUb0V2ZW50cyhldmVudEhhc2gsIGVsZW1lbnQsIHZvaWNlVGltZU1pbGxpc2Vjb25kcywgZWxlbWVudHNbZWxlbV0udG9wLCBlbGVtZW50c1tlbGVtXS5oZWlnaHQsIGVsZW1lbnRzW2VsZW1dLmxpbmUsIGVsZW1lbnRzW2VsZW1dLm1lYXN1cmVOdW1iZXIsIHRpbWVEaXZpZGVyLCBpc1RpZWRTdGF0ZSwgbmV4dElzQmFyKTtcblx0XHRcdFx0aXNUaWVkU3RhdGUgPSByZXQuaXNUaWVkU3RhdGU7XG5cdFx0XHRcdG5leHRJc0JhciA9IHJldC5uZXh0SXNCYXI7XG5cdFx0XHRcdHZvaWNlVGltZSArPSByZXQuZHVyYXRpb247XG5cdFx0XHRcdHZvaWNlVGltZU1pbGxpc2Vjb25kcyA9IE1hdGgucm91bmQodm9pY2VUaW1lICogMTAwMCk7XG5cdFx0XHRcdGlmIChlbGVtZW50LnR5cGUgPT09ICdiYXInKSB7XG5cdFx0XHRcdFx0dmFyIGJhclR5cGUgPSBlbGVtZW50LmFiY2VsZW0udHlwZTtcblx0XHRcdFx0XHR2YXIgZW5kUmVwZWF0ID0gKGJhclR5cGUgPT09IFwiYmFyX3JpZ2h0X3JlcGVhdFwiIHx8IGJhclR5cGUgPT09IFwiYmFyX2RibF9yZXBlYXRcIik7XG5cdFx0XHRcdFx0dmFyIHN0YXJ0RW5kaW5nID0gKGVsZW1lbnQuYWJjZWxlbS5zdGFydEVuZGluZyA9PT0gJzEnKTtcblx0XHRcdFx0XHR2YXIgc3RhcnRSZXBlYXQgPSAoYmFyVHlwZSA9PT0gXCJiYXJfbGVmdF9yZXBlYXRcIiB8fCBiYXJUeXBlID09PSBcImJhcl9kYmxfcmVwZWF0XCIgfHwgYmFyVHlwZSA9PT0gXCJiYXJfcmlnaHRfcmVwZWF0XCIpO1xuXHRcdFx0XHRcdGlmIChlbmRSZXBlYXQpIHtcblx0XHRcdFx0XHRcdGlmIChlbmRpbmdSZXBlYXRFbGVtID09PSAtMSlcblx0XHRcdFx0XHRcdFx0ZW5kaW5nUmVwZWF0RWxlbSA9IGVsZW07XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBlbDIgPSBzdGFydGluZ1JlcGVhdEVsZW07IGVsMiA8IGVuZGluZ1JlcGVhdEVsZW07IGVsMisrKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBlbGVtZW50MiA9IGVsZW1lbnRzW2VsMl0uZWxlbTtcblx0XHRcdFx0XHRcdFx0cmV0ID0gdGhpcy5hZGRFbGVtZW50VG9FdmVudHMoZXZlbnRIYXNoLCBlbGVtZW50Miwgdm9pY2VUaW1lTWlsbGlzZWNvbmRzLCBlbGVtZW50c1tlbDJdLnRvcCwgZWxlbWVudHNbZWwyXS5oZWlnaHQsIGVsZW1lbnRzW2VsMl0ubGluZSwgZWxlbWVudHNbZWwyXS5tZWFzdXJlTnVtYmVyLCB0aW1lRGl2aWRlciwgaXNUaWVkU3RhdGUsIG5leHRJc0Jhcik7XG5cdFx0XHRcdFx0XHRcdGlzVGllZFN0YXRlID0gcmV0LmlzVGllZFN0YXRlO1xuXHRcdFx0XHRcdFx0XHRuZXh0SXNCYXIgPSByZXQubmV4dElzQmFyO1xuXHRcdFx0XHRcdFx0XHR2b2ljZVRpbWUgKz0gcmV0LmR1cmF0aW9uO1xuXHRcdFx0XHRcdFx0XHR2b2ljZVRpbWVNaWxsaXNlY29uZHMgPSBNYXRoLnJvdW5kKHZvaWNlVGltZSAqIDEwMDApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bmV4dElzQmFyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGVuZGluZ1JlcGVhdEVsZW0gPSAtMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHN0YXJ0RW5kaW5nKVxuXHRcdFx0XHRcdFx0ZW5kaW5nUmVwZWF0RWxlbSA9IGVsZW07XG5cdFx0XHRcdFx0aWYgKHN0YXJ0UmVwZWF0KVxuXHRcdFx0XHRcdFx0c3RhcnRpbmdSZXBlYXRFbGVtID0gZWxlbTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBub3cgd2UgaGF2ZSBhbGwgdGhlIGV2ZW50cywgYnV0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB2b2ljZXMgdGhlbiB0aGVyZSBtYXkgYmUgZXZlbnRzIG91dCBvZiBvcmRlciBvciBkdXBsaWNhdGVkLCBzbyBub3JtYWxpemUgaXQuXG5cdFx0dGltaW5nRXZlbnRzID0gbWFrZVNvcnRlZEFycmF5KGV2ZW50SGFzaCk7XG5cdFx0YWRkVmVydGljYWxJbmZvKHRpbWluZ0V2ZW50cyk7XG5cdFx0dGltaW5nRXZlbnRzLnB1c2goeyB0eXBlOiBcImVuZFwiLCBtaWxsaXNlY29uZHM6IHZvaWNlVGltZU1pbGxpc2Vjb25kcyB9KTtcblx0XHR0aGlzLmFkZFVzZWZ1bENhbGxiYWNrSW5mbyh0aW1pbmdFdmVudHMsIGJwbSk7XG5cdFx0cmV0dXJuIHRpbWluZ0V2ZW50cztcblx0fTtcblxuXHR0aGlzLmFkZFVzZWZ1bENhbGxiYWNrSW5mbyA9IGZ1bmN0aW9uKHRpbWluZ0V2ZW50cywgYnBtKSB7XG5cdFx0dmFyIG1pbGxpc2Vjb25kc1Blck1lYXN1cmUgPSB0aGlzLm1pbGxpc2Vjb25kc1Blck1lYXN1cmUoYnBtKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRpbWluZ0V2ZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGV2ID0gdGltaW5nRXZlbnRzW2ldO1xuXHRcdFx0ZXYubWlsbGlzZWNvbmRzUGVyTWVhc3VyZSA9IG1pbGxpc2Vjb25kc1Blck1lYXN1cmU7XG5cdFx0fVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGdldFZlcnRpY2FsKGdyb3VwKSB7XG5cdFx0dmFyIHZvaWNlcyA9IGdyb3VwLnZvaWNlcztcblx0XHR2YXIgZmlyc3RTdGFmZiA9IGdyb3VwLnN0YWZmc1swXTtcblx0XHR2YXIgbWlkZGxlQyA9IGZpcnN0U3RhZmYuYWJzb2x1dGVZO1xuXHRcdHZhciB0b3AgPSBtaWRkbGVDIC0gZmlyc3RTdGFmZi50b3Aqc3BhY2luZy5TVEVQO1xuXHRcdHZhciBsYXN0U3RhZmYgPSBncm91cC5zdGFmZnNbZ3JvdXAuc3RhZmZzLmxlbmd0aC0xXTtcblx0XHRtaWRkbGVDID0gbGFzdFN0YWZmLmFic29sdXRlWTtcblx0XHR2YXIgYm90dG9tID0gbWlkZGxlQyAtIGxhc3RTdGFmZi5ib3R0b20qc3BhY2luZy5TVEVQO1xuXHRcdHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cdFx0cmV0dXJuIHsgdG9wOiB0b3AsIGhlaWdodDogaGVpZ2h0IH07XG5cdH1cblxuXHR0aGlzLmdldEJwbSA9IGZ1bmN0aW9uKHRlbXBvKSB7XG5cdFx0dmFyIGJwbTtcblx0XHRpZiAodGVtcG8pIHtcblx0XHRcdGJwbSA9IHRlbXBvLmJwbTtcblx0XHRcdHZhciBiZWF0TGVuZ3RoID0gdGhpcy5nZXRCZWF0TGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3RhdGVkQmVhdExlbmd0aCA9IHRlbXBvLmR1cmF0aW9uICYmIHRlbXBvLmR1cmF0aW9uLmxlbmd0aCA+IDAgPyB0ZW1wby5kdXJhdGlvblswXSA6IGJlYXRMZW5ndGg7XG5cdFx0XHRicG0gPSBicG0gKiBzdGF0ZWRCZWF0TGVuZ3RoIC8gYmVhdExlbmd0aDtcblx0XHR9XG5cdFx0aWYgKCFicG0pIHtcblx0XHRcdGJwbSA9IDE4MDtcblx0XHRcdC8vIENvbXBlbnNhdGUgZm9yIGNvbXBvdW5kIG1ldGVyLCB3aGVyZSB0aGUgYmVhdCBpc24ndCBhIGJlYXQuXG5cdFx0XHR2YXIgbWV0ZXIgPSB0aGlzLmdldE1ldGVyRnJhY3Rpb24oKTtcblx0XHRcdGlmIChtZXRlciAmJiBtZXRlci5kZW4gPT09IDgpIHtcblx0XHRcdFx0YnBtID0gMTIwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYnBtO1xuXHR9O1xuXG5cdHRoaXMuc2V0VGltaW5nID0gZnVuY3Rpb24gKGJwbSwgbWVhc3VyZXNPZkRlbGF5KSB7XG5cdFx0aWYgKCFicG0pIHtcblx0XHRcdHZhciB0ZW1wbyA9IHRoaXMubWV0YVRleHQgPyB0aGlzLm1ldGFUZXh0LnRlbXBvIDogbnVsbDtcblx0XHRcdGJwbSA9IHRoaXMuZ2V0QnBtKHRlbXBvKTtcblx0XHR9XG5cblx0XHR2YXIgYmVhdExlbmd0aCA9IHRoaXMuZ2V0QmVhdExlbmd0aCgpO1xuXHRcdHZhciBiZWF0c1BlclNlY29uZCA9IGJwbSAvIDYwO1xuXG5cdFx0dmFyIG1lYXN1cmVMZW5ndGggPSB0aGlzLmdldEJhckxlbmd0aCgpO1xuXG5cdFx0dmFyIHN0YXJ0aW5nRGVsYXkgPSBtZWFzdXJlTGVuZ3RoIC8gYmVhdExlbmd0aCAqIG1lYXN1cmVzT2ZEZWxheSAvIGJlYXRzUGVyU2Vjb25kO1xuXHRcdGlmIChzdGFydGluZ0RlbGF5KVxuXHRcdFx0c3RhcnRpbmdEZWxheSAtPSB0aGlzLmdldFBpY2t1cExlbmd0aCgpIC8gYmVhdExlbmd0aCAvIGJlYXRzUGVyU2Vjb25kO1xuXHRcdHZhciB0aW1lRGl2aWRlciA9IGJlYXRMZW5ndGggKiBiZWF0c1BlclNlY29uZDtcblxuXHRcdHRoaXMubm90ZVRpbWluZ3MgPSB0aGlzLnNldHVwRXZlbnRzKHN0YXJ0aW5nRGVsYXksIHRpbWVEaXZpZGVyLCBicG0pO1xuXHR9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUdW5lO1xuIiwiLy8gICAgYWJjX3BhcnNlLmpzOiBwYXJzZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIEFCQyBNdXNpYyBOb3RhdGlvbiBpbnRvIGEgdXNhYmxlIGludGVybmFsIHN0cnVjdHVyZS5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IFBhdWwgUm9zZW4gKHBhdWwgYXQgcGF1bHJvc2VuIGRvdCBuZXQpXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8qZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgcGFyc2VDb21tb24gPSByZXF1aXJlKCcuL2FiY19jb21tb24nKTtcbnZhciBwYXJzZURpcmVjdGl2ZSA9IHJlcXVpcmUoJy4vYWJjX3BhcnNlX2RpcmVjdGl2ZScpO1xudmFyIFBhcnNlSGVhZGVyID0gcmVxdWlyZSgnLi9hYmNfcGFyc2VfaGVhZGVyJyk7XG52YXIgcGFyc2VLZXlWb2ljZSA9IHJlcXVpcmUoJy4vYWJjX3BhcnNlX2tleV92b2ljZScpO1xudmFyIFRva2VuaXplciA9IHJlcXVpcmUoJy4vYWJjX3Rva2VuaXplcicpO1xudmFyIHRyYW5zcG9zZSA9IHJlcXVpcmUoJy4vYWJjX3RyYW5zcG9zZScpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuL3dyYXBfbGluZXMnKTtcblxudmFyIFR1bmUgPSByZXF1aXJlKCcuLi9kYXRhL2FiY190dW5lJyk7XG5cbnZhciBQYXJzZSA9IGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIHR1bmUgPSBuZXcgVHVuZSgpO1xuXHR2YXIgdG9rZW5pemVyID0gbmV3IFRva2VuaXplcigpO1xuXG5cdHRoaXMuZ2V0VHVuZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmb3JtYXR0aW5nOiB0dW5lLmZvcm1hdHRpbmcsXG5cdFx0XHRsaW5lczogdHVuZS5saW5lcyxcblx0XHRcdG1lZGlhOiB0dW5lLm1lZGlhLFxuXHRcdFx0bWV0YVRleHQ6IHR1bmUubWV0YVRleHQsXG5cdFx0XHR2ZXJzaW9uOiB0dW5lLnZlcnNpb24sXG5cblx0XHRcdGFkZEVsZW1lbnRUb0V2ZW50czogdHVuZS5hZGRFbGVtZW50VG9FdmVudHMsXG5cdFx0XHRhZGRVc2VmdWxDYWxsYmFja0luZm86IHR1bmUuYWRkVXNlZnVsQ2FsbGJhY2tJbmZvLFxuXHRcdFx0Z2V0QmFyTGVuZ3RoOiB0dW5lLmdldEJhckxlbmd0aCxcblx0XHRcdGdldEJlYXRMZW5ndGg6IHR1bmUuZ2V0QmVhdExlbmd0aCxcblx0XHRcdGdldEJlYXRzUGVyTWVhc3VyZTogdHVuZS5nZXRCZWF0c1Blck1lYXN1cmUsXG5cdFx0XHRnZXRCcG06IHR1bmUuZ2V0QnBtLFxuXHRcdFx0Z2V0TWV0ZXI6IHR1bmUuZ2V0TWV0ZXIsXG5cdFx0XHRnZXRNZXRlckZyYWN0aW9uOiB0dW5lLmdldE1ldGVyRnJhY3Rpb24sXG5cdFx0XHRnZXRQaWNrdXBMZW5ndGg6IHR1bmUuZ2V0UGlja3VwTGVuZ3RoLFxuXHRcdFx0Z2V0S2V5U2lnbmF0dXJlOiB0dW5lLmdldEtleVNpZ25hdHVyZSxcblx0XHRcdG1ha2VWb2ljZXNBcnJheTogdHVuZS5tYWtlVm9pY2VzQXJyYXksXG5cdFx0XHRtaWxsaXNlY29uZHNQZXJNZWFzdXJlOiB0dW5lLm1pbGxpc2Vjb25kc1Blck1lYXN1cmUsXG5cdFx0XHRzZXR1cEV2ZW50czogdHVuZS5zZXR1cEV2ZW50cyxcblx0XHRcdHNldFRpbWluZzogdHVuZS5zZXRUaW1pbmdcblx0XHR9O1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGFkZFBvc2l0aW9uaW5nKGVsLCB0eXBlLCB2YWx1ZSkge1xuXHRcdGlmICghZWwucG9zaXRpb25pbmcpIGVsLnBvc2l0aW9uaW5nID0ge307XG5cdFx0ZWwucG9zaXRpb25pbmdbdHlwZV0gPSB2YWx1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGFkZEZvbnQoZWwsIHR5cGUsIHZhbHVlKSB7XG5cdFx0aWYgKCFlbC5mb250cykgZWwuZm9udHMgPSB7fTtcblx0XHRlbC5mb250c1t0eXBlXSA9IHZhbHVlO1xuXHR9XG5cblx0dmFyIG11bHRpbGluZVZhcnMgPSB7XG5cdFx0cmVzZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Zm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykge1xuXHRcdFx0XHRpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkgJiYgdHlwZW9mIHRoaXNbcHJvcGVydHldICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpc1twcm9wZXJ0eV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuaUNoYXIgPSAwO1xuXHRcdFx0dGhpcy5rZXkgPSB7YWNjaWRlbnRhbHM6IFtdLCByb290OiAnbm9uZScsIGFjYzogJycsIG1vZGU6ICcnIH07XG5cdFx0XHR0aGlzLm1ldGVyID0gbnVsbDsgLy8gaWYgbm8gbWV0ZXIgaXMgc3BlY2lmaWVkLCBmcmVlIG1ldGVyIGlzIGFzc3VtZWRcblx0XHRcdHRoaXMub3JpZ01ldGVyID0gbnVsbDtcdC8vIHRoaXMgaXMgZm9yIG5ldyB2b2ljZXMgdGhhdCBhcmUgY3JlYXRlZCBhZnRlciB3ZSBzZXQgdGhlIG1ldGVyLlxuXHRcdFx0dGhpcy5oYXNNYWluVGl0bGUgPSBmYWxzZTtcblx0XHRcdHRoaXMuZGVmYXVsdF9sZW5ndGggPSAwLjEyNTtcblx0XHRcdHRoaXMuY2xlZiA9IHsgdHlwZTogJ3RyZWJsZScsIHZlcnRpY2FsUG9zOiAwIH07XG5cdFx0XHR0aGlzLm5leHRfbm90ZV9kdXJhdGlvbiA9IDA7XG5cdFx0XHR0aGlzLnN0YXJ0X25ld19saW5lID0gdHJ1ZTtcblx0XHRcdHRoaXMuaXNfaW5faGVhZGVyID0gdHJ1ZTtcblx0XHRcdHRoaXMuaXNfaW5faGlzdG9yeSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5wYXJ0Rm9yTmV4dExpbmUgPSB7fTtcblx0XHRcdHRoaXMuaGF2ZW50X3NldF9sZW5ndGggPSB0cnVlO1xuXHRcdFx0dGhpcy52b2ljZXMgPSB7fTtcblx0XHRcdHRoaXMuc3RhdmVzID0gW107XG5cdFx0XHR0aGlzLm1hY3JvcyA9IHt9O1xuXHRcdFx0dGhpcy5jdXJyQmFyTnVtYmVyID0gMTtcblx0XHRcdHRoaXMuYmFyQ291bnRlciA9IHt9O1xuXHRcdFx0dGhpcy5pblRleHRCbG9jayA9IGZhbHNlO1xuXHRcdFx0dGhpcy5pblBzQmxvY2sgPSBmYWxzZTtcblx0XHRcdHRoaXMuaWdub3JlZERlY29yYXRpb25zID0gW107XG5cdFx0XHR0aGlzLnRleHRCbG9jayA9IFwiXCI7XG5cdFx0XHR0aGlzLnNjb3JlX2lzX3ByZXNlbnQgPSBmYWxzZTtcdC8vIENhbid0IGhhdmUgb3JpZ2luYWwgVjogbGluZXMgd2hlbiB0aGVyZSBpcyB0aGUgc2NvcmUgZGlyZWN0aXZlXG5cdFx0XHR0aGlzLmluRW5kaW5nID0gZmFsc2U7XG5cdFx0XHR0aGlzLmluVGllID0gW107XG5cdFx0XHR0aGlzLmluVGllQ2hvcmQgPSB7fTtcblx0XHRcdHRoaXMudm9jYWxQb3NpdGlvbiA9IFwiYXV0b1wiO1xuXHRcdFx0dGhpcy5keW5hbWljUG9zaXRpb24gPSBcImF1dG9cIjtcblx0XHRcdHRoaXMuY2hvcmRQb3NpdGlvbiA9IFwiYXV0b1wiO1xuXHRcdFx0dGhpcy5vcm5hbWVudFBvc2l0aW9uID0gXCJhdXRvXCI7XG5cdFx0XHR0aGlzLnZvbHVtZVBvc2l0aW9uID0gXCJhdXRvXCI7XG5cdFx0XHR0aGlzLm9wZW5TbHVycyA9IFtdO1xuXHRcdFx0dGhpcy5mcmVlZ2Nob3JkID0gZmFsc2U7XG5cdFx0fSxcblx0XHRkaWZmZXJlbnRGb250OiBmdW5jdGlvbih0eXBlLCBkZWZhdWx0Rm9udHMpIHtcblx0XHRcdGlmICh0aGlzW3R5cGVdLmRlY29yYXRpb24gIT09IGRlZmF1bHRGb250c1t0eXBlXS5kZWNvcmF0aW9uKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0aGlzW3R5cGVdLmZhY2UgIT09IGRlZmF1bHRGb250c1t0eXBlXS5mYWNlKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0aGlzW3R5cGVdLnNpemUgIT09IGRlZmF1bHRGb250c1t0eXBlXS5zaXplKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0aGlzW3R5cGVdLnN0eWxlICE9PSBkZWZhdWx0Rm9udHNbdHlwZV0uc3R5bGUpIHJldHVybiB0cnVlO1xuXHRcdFx0aWYgKHRoaXNbdHlwZV0ud2VpZ2h0ICE9PSBkZWZhdWx0Rm9udHNbdHlwZV0ud2VpZ2h0KSByZXR1cm4gdHJ1ZTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFkZEZvcm1hdHRpbmdPcHRpb25zOiBmdW5jdGlvbihlbCwgZGVmYXVsdEZvbnRzLCBlbFR5cGUpIHtcblx0XHRcdGlmIChlbFR5cGUgPT09ICdub3RlJykge1xuXHRcdFx0XHRpZiAodGhpcy52b2NhbFBvc2l0aW9uICE9PSAnYXV0bycpIGFkZFBvc2l0aW9uaW5nKGVsLCAndm9jYWxQb3NpdGlvbicsIHRoaXMudm9jYWxQb3NpdGlvbik7XG5cdFx0XHRcdGlmICh0aGlzLmR5bmFtaWNQb3NpdGlvbiAhPT0gJ2F1dG8nKSBhZGRQb3NpdGlvbmluZyhlbCwgJ2R5bmFtaWNQb3NpdGlvbicsIHRoaXMuZHluYW1pY1Bvc2l0aW9uKTtcblx0XHRcdFx0aWYgKHRoaXMuY2hvcmRQb3NpdGlvbiAhPT0gJ2F1dG8nKSBhZGRQb3NpdGlvbmluZyhlbCwgJ2Nob3JkUG9zaXRpb24nLCB0aGlzLmNob3JkUG9zaXRpb24pO1xuXHRcdFx0XHRpZiAodGhpcy5vcm5hbWVudFBvc2l0aW9uICE9PSAnYXV0bycpIGFkZFBvc2l0aW9uaW5nKGVsLCAnb3JuYW1lbnRQb3NpdGlvbicsIHRoaXMub3JuYW1lbnRQb3NpdGlvbik7XG5cdFx0XHRcdGlmICh0aGlzLnZvbHVtZVBvc2l0aW9uICE9PSAnYXV0bycpIGFkZFBvc2l0aW9uaW5nKGVsLCAndm9sdW1lUG9zaXRpb24nLCB0aGlzLnZvbHVtZVBvc2l0aW9uKTtcblx0XHRcdFx0aWYgKHRoaXMuZGlmZmVyZW50Rm9udChcImFubm90YXRpb25mb250XCIsIGRlZmF1bHRGb250cykpIGFkZEZvbnQoZWwsICdhbm5vdGF0aW9uZm9udCcsIHRoaXMuYW5ub3RhdGlvbmZvbnQpO1xuXHRcdFx0XHRpZiAodGhpcy5kaWZmZXJlbnRGb250KFwiZ2Nob3JkZm9udFwiLCBkZWZhdWx0Rm9udHMpKSBhZGRGb250KGVsLCAnZ2Nob3JkZm9udCcsIHRoaXMuZ2Nob3JkZm9udCk7XG5cdFx0XHRcdGlmICh0aGlzLmRpZmZlcmVudEZvbnQoXCJ2b2NhbGZvbnRcIiwgZGVmYXVsdEZvbnRzKSkgYWRkRm9udChlbCwgJ3ZvY2FsZm9udCcsIHRoaXMudm9jYWxmb250KTtcblx0XHRcdFx0aWYgKHRoaXMuZGlmZmVyZW50Rm9udChcInRyaXBsZXRmb250XCIsIGRlZmF1bHRGb250cykpIGFkZEZvbnQoZWwsICd0cmlwbGV0Zm9udCcsIHRoaXMudHJpcGxldGZvbnQpO1xuXHRcdFx0fSBlbHNlIGlmIChlbFR5cGUgPT09ICdiYXInKSB7XG5cdFx0XHRcdGlmICh0aGlzLmR5bmFtaWNQb3NpdGlvbiAhPT0gJ2F1dG8nKSBhZGRQb3NpdGlvbmluZyhlbCwgJ2R5bmFtaWNQb3NpdGlvbicsIHRoaXMuZHluYW1pY1Bvc2l0aW9uKTtcblx0XHRcdFx0aWYgKHRoaXMuY2hvcmRQb3NpdGlvbiAhPT0gJ2F1dG8nKSBhZGRQb3NpdGlvbmluZyhlbCwgJ2Nob3JkUG9zaXRpb24nLCB0aGlzLmNob3JkUG9zaXRpb24pO1xuXHRcdFx0XHRpZiAodGhpcy5vcm5hbWVudFBvc2l0aW9uICE9PSAnYXV0bycpIGFkZFBvc2l0aW9uaW5nKGVsLCAnb3JuYW1lbnRQb3NpdGlvbicsIHRoaXMub3JuYW1lbnRQb3NpdGlvbik7XG5cdFx0XHRcdGlmICh0aGlzLnZvbHVtZVBvc2l0aW9uICE9PSAnYXV0bycpIGFkZFBvc2l0aW9uaW5nKGVsLCAndm9sdW1lUG9zaXRpb24nLCB0aGlzLnZvbHVtZVBvc2l0aW9uKTtcblx0XHRcdFx0aWYgKHRoaXMuZGlmZmVyZW50Rm9udChcIm1lYXN1cmVmb250XCIsIGRlZmF1bHRGb250cykpIGFkZEZvbnQoZWwsICdtZWFzdXJlZm9udCcsIHRoaXMubWVhc3VyZWZvbnQpO1xuXHRcdFx0XHRpZiAodGhpcy5kaWZmZXJlbnRGb250KFwicmVwZWF0Zm9udFwiLCBkZWZhdWx0Rm9udHMpKSBhZGRGb250KGVsLCAncmVwZWF0Zm9udCcsIHRoaXMucmVwZWF0Zm9udCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhZGRXYXJuaW5nID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0aWYgKCFtdWx0aWxpbmVWYXJzLndhcm5pbmdzKVxuXHRcdFx0bXVsdGlsaW5lVmFycy53YXJuaW5ncyA9IFtdO1xuXHRcdG11bHRpbGluZVZhcnMud2FybmluZ3MucHVzaChzdHIpO1xuXHR9O1xuXG5cdHZhciBhZGRXYXJuaW5nT2JqZWN0ID0gZnVuY3Rpb24od2FybmluZ09iamVjdCkge1xuXHRcdGlmICghbXVsdGlsaW5lVmFycy53YXJuaW5nT2JqZWN0cylcblx0XHRcdG11bHRpbGluZVZhcnMud2FybmluZ09iamVjdHMgPSBbXTtcblx0XHRtdWx0aWxpbmVWYXJzLndhcm5pbmdPYmplY3RzLnB1c2god2FybmluZ09iamVjdCk7XG5cdH07XG5cblx0dmFyIGVuY29kZSA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciByZXQgPSBwYXJzZUNvbW1vbi5nc3ViKHN0ciwgJ1xceDEyJywgJyAnKTtcblx0XHRyZXQgPSBwYXJzZUNvbW1vbi5nc3ViKHJldCwgJyYnLCAnJmFtcDsnKTtcblx0XHRyZXQgPSBwYXJzZUNvbW1vbi5nc3ViKHJldCwgJzwnLCAnJmx0OycpO1xuXHRcdHJldHVybiBwYXJzZUNvbW1vbi5nc3ViKHJldCwgJz4nLCAnJmd0OycpO1xuXHR9O1xuXG5cdHZhciB3YXJuID0gZnVuY3Rpb24oc3RyLCBsaW5lLCBjb2xfbnVtKSB7XG5cdFx0aWYgKCFsaW5lKSBsaW5lID0gXCIgXCI7XG5cdFx0dmFyIGJhZF9jaGFyID0gbGluZS5jaGFyQXQoY29sX251bSk7XG5cdFx0aWYgKGJhZF9jaGFyID09PSAnICcpXG5cdFx0XHRiYWRfY2hhciA9IFwiU1BBQ0VcIjtcblx0XHR2YXIgY2xlYW5fbGluZSA9IGVuY29kZShsaW5lLnN1YnN0cmluZygwLCBjb2xfbnVtKSkgK1xuXHRcdFx0JzxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXNpemU6MS4zZW07Zm9udC13ZWlnaHQ6Ym9sZDtcIj4nICsgYmFkX2NoYXIgKyAnPC9zcGFuPicgK1xuXHRcdFx0ZW5jb2RlKGxpbmUuc3Vic3RyaW5nKGNvbF9udW0rMSkpO1xuXHRcdGFkZFdhcm5pbmcoXCJNdXNpYyBMaW5lOlwiICsgdHVuZS5nZXROdW1MaW5lcygpICsgXCI6XCIgKyAoY29sX251bSsxKSArICc6ICcgKyBzdHIgKyBcIjogIFwiICsgY2xlYW5fbGluZSk7XG5cdFx0YWRkV2FybmluZ09iamVjdCh7bWVzc2FnZTpzdHIsIGxpbmU6bGluZSwgc3RhcnRDaGFyOiBtdWx0aWxpbmVWYXJzLmlDaGFyICsgY29sX251bSwgY29sdW1uOiBjb2xfbnVtfSk7XG5cdH07XG5cdHZhciBoZWFkZXIgPSBuZXcgUGFyc2VIZWFkZXIodG9rZW5pemVyLCB3YXJuLCBtdWx0aWxpbmVWYXJzLCB0dW5lKTtcblxuXHR0aGlzLmdldFdhcm5pbmdzID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG11bHRpbGluZVZhcnMud2FybmluZ3M7XG5cdH07XG5cdHRoaXMuZ2V0V2FybmluZ09iamVjdHMgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbXVsdGlsaW5lVmFycy53YXJuaW5nT2JqZWN0cztcblx0fTtcblxuXHR2YXIgbGV0dGVyX3RvX2Nob3JkID0gZnVuY3Rpb24obGluZSwgaSlcblx0e1xuXHRcdGlmIChsaW5lLmNoYXJBdChpKSA9PT0gJ1wiJylcblx0XHR7XG5cdFx0XHR2YXIgY2hvcmQgPSB0b2tlbml6ZXIuZ2V0QnJhY2tldHRlZFN1YnN0cmluZyhsaW5lLCBpLCA1KTtcblx0XHRcdGlmICghY2hvcmRbMl0pXG5cdFx0XHRcdHdhcm4oXCJNaXNzaW5nIHRoZSBjbG9zaW5nIHF1b3RlIHdoaWxlIHBhcnNpbmcgdGhlIGNob3JkIHN5bWJvbFwiLCBsaW5lICwgaSk7XG5cdFx0XHQvLyBJZiBpdCBzdGFydHMgd2l0aCBeLCB0aGVuIHRoZSBjaG9yZCBhcHBlYXJzIGFib3ZlLlxuXHRcdFx0Ly8gSWYgaXQgc3RhcnRzIHdpdGggXyB0aGVuIHRoZSBjaG9yZCBhcHBlYXJzIGJlbG93LlxuXHRcdFx0Ly8gKG5vdGUgdGhhdCB0aGUgMi4wIGRyYWZ0IHN0YW5kYXJkIGRlZmluZXMgdGhlbSBhcyBub3QgY2hvcmRzLCBidXQgYW5ub3RhdGlvbnMgYW5kIGFsc28gZGVmaW5lcyBALilcblx0XHRcdGlmIChjaG9yZFswXSA+IDAgJiYgY2hvcmRbMV0ubGVuZ3RoID4gMCAmJiBjaG9yZFsxXS5jaGFyQXQoMCkgPT09ICdeJykge1xuXHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnN1YnN0cmluZygxKTtcblx0XHRcdFx0Y2hvcmRbMl0gPSAnYWJvdmUnO1xuXHRcdFx0fSBlbHNlIGlmIChjaG9yZFswXSA+IDAgJiYgY2hvcmRbMV0ubGVuZ3RoID4gMCAmJiBjaG9yZFsxXS5jaGFyQXQoMCkgPT09ICdfJykge1xuXHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnN1YnN0cmluZygxKTtcblx0XHRcdFx0Y2hvcmRbMl0gPSAnYmVsb3cnO1xuXHRcdFx0fSBlbHNlIGlmIChjaG9yZFswXSA+IDAgJiYgY2hvcmRbMV0ubGVuZ3RoID4gMCAmJiBjaG9yZFsxXS5jaGFyQXQoMCkgPT09ICc8Jykge1xuXHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnN1YnN0cmluZygxKTtcblx0XHRcdFx0Y2hvcmRbMl0gPSAnbGVmdCc7XG5cdFx0XHR9IGVsc2UgaWYgKGNob3JkWzBdID4gMCAmJiBjaG9yZFsxXS5sZW5ndGggPiAwICYmIGNob3JkWzFdLmNoYXJBdCgwKSA9PT0gJz4nKSB7XG5cdFx0XHRcdGNob3JkWzFdID0gY2hvcmRbMV0uc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHRjaG9yZFsyXSA9ICdyaWdodCc7XG5cdFx0XHR9IGVsc2UgaWYgKGNob3JkWzBdID4gMCAmJiBjaG9yZFsxXS5sZW5ndGggPiAwICYmIGNob3JkWzFdLmNoYXJBdCgwKSA9PT0gJ0AnKSB7XG5cdFx0XHRcdC8vIEAtMTUsNS43XG5cdFx0XHRcdGNob3JkWzFdID0gY2hvcmRbMV0uc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR2YXIgeCA9IHRva2VuaXplci5nZXRGbG9hdChjaG9yZFsxXSk7XG5cdFx0XHRcdGlmICh4LmRpZ2l0cyA9PT0gMClcblx0XHRcdFx0XHR3YXJuKFwiTWlzc2luZyBmaXJzdCBwb3NpdGlvbiBpbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5ub3RhdGlvbi5cIiwgbGluZSAsIGkpO1xuXHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnN1YnN0cmluZyh4LmRpZ2l0cyk7XG5cdFx0XHRcdGlmIChjaG9yZFsxXVswXSAhPT0gJywnKVxuXHRcdFx0XHRcdHdhcm4oXCJNaXNzaW5nIGNvbW1hIGFic29sdXRlbHkgcG9zaXRpb25lZCBhbm5vdGF0aW9uLlwiLCBsaW5lICwgaSk7XG5cdFx0XHRcdGNob3JkWzFdID0gY2hvcmRbMV0uc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR2YXIgeSA9IHRva2VuaXplci5nZXRGbG9hdChjaG9yZFsxXSk7XG5cdFx0XHRcdGlmICh5LmRpZ2l0cyA9PT0gMClcblx0XHRcdFx0XHR3YXJuKFwiTWlzc2luZyBzZWNvbmQgcG9zaXRpb24gaW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFubm90YXRpb24uXCIsIGxpbmUgLCBpKTtcblx0XHRcdFx0Y2hvcmRbMV0gPSBjaG9yZFsxXS5zdWJzdHJpbmcoeS5kaWdpdHMpO1xuXHRcdFx0XHR2YXIgd3MgPSB0b2tlbml6ZXIuc2tpcFdoaXRlU3BhY2UoY2hvcmRbMV0pO1xuXHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnN1YnN0cmluZyh3cyk7XG5cdFx0XHRcdGNob3JkWzJdID0gbnVsbDtcblx0XHRcdFx0Y2hvcmRbM10gPSB7IHg6IHgudmFsdWUsIHk6IHkudmFsdWUgfTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmZyZWVnY2hvcmQgIT09IHRydWUpIHtcblx0XHRcdFx0XHRjaG9yZFsxXSA9IGNob3JkWzFdLnJlcGxhY2UoLyhbQUJDREVGRzAtOV0pYi9nLCBcIiQx4pmtXCIpO1xuXHRcdFx0XHRcdGNob3JkWzFdID0gY2hvcmRbMV0ucmVwbGFjZSgvKFtBQkNERUZHMC05XSkjL2csIFwiJDHima9cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2hvcmRbMl0gPSAnZGVmYXVsdCc7XG5cdFx0XHRcdGNob3JkWzFdID0gdHJhbnNwb3NlLmNob3JkTmFtZShtdWx0aWxpbmVWYXJzLCBjaG9yZFsxXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hvcmQ7XG5cdFx0fVxuXHRcdHJldHVybiBbMCwgXCJcIl07XG5cdH07XG5cblx0dmFyIGxlZ2FsQWNjZW50cyA9IFsgXCJ0cmlsbFwiLCBcImxvd2VybW9yZGVudFwiLCBcInVwcGVybW9yZGVudFwiLCBcIm1vcmRlbnRcIiwgXCJwcmFsbHRyaWxsZXJcIiwgXCJhY2NlbnRcIixcblx0XHRcImZlcm1hdGFcIiwgXCJpbnZlcnRlZGZlcm1hdGFcIiwgXCJ0ZW51dG9cIiwgXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCIrXCIsIFwid2VkZ2VcIixcblx0XHRcIm9wZW5cIiwgXCJ0aHVtYlwiLCBcInNuYXBcIiwgXCJ0dXJuXCIsIFwicm9sbFwiLCBcImJyZWF0aFwiLCBcInNob3J0cGhyYXNlXCIsIFwibWVkaXVtcGhyYXNlXCIsIFwibG9uZ3BocmFzZVwiLFxuXHRcdFwic2Vnbm9cIiwgXCJjb2RhXCIsIFwiRC5TLlwiLCBcIkQuQy5cIiwgXCJmaW5lXCIsXG5cdFx0XCJzbGlkZVwiLCBcIl5cIiwgXCJtYXJjYXRvXCIsXG5cdFx0XCJ1cGJvd1wiLCBcImRvd25ib3dcIiwgXCIvXCIsIFwiLy9cIiwgXCIvLy9cIiwgXCIvLy8vXCIsIFwidHJlbTFcIiwgXCJ0cmVtMlwiLCBcInRyZW0zXCIsIFwidHJlbTRcIixcblx0XHRcInR1cm54XCIsIFwiaW52ZXJ0ZWR0dXJuXCIsIFwiaW52ZXJ0ZWR0dXJueFwiLCBcInRyaWxsKFwiLCBcInRyaWxsKVwiLCBcImFycGVnZ2lvXCIsIFwieHN0ZW1cIiwgXCJtYXJrXCIsIFwidW1hcmNhdG9cIixcblx0XHRcInN0eWxlPW5vcm1hbFwiLCBcInN0eWxlPWhhcm1vbmljXCIsIFwic3R5bGU9cmh5dGhtXCIsIFwic3R5bGU9eFwiXG5cdF07XG5cdHZhciB2b2x1bWVEZWNvcmF0aW9ucyA9IFsgXCJwXCIsIFwicHBcIiwgXCJmXCIsIFwiZmZcIiwgXCJtZlwiLCBcIm1wXCIsIFwicHBwXCIsIFwicHBwcFwiLCAgXCJmZmZcIiwgXCJmZmZmXCIsIFwic2Z6XCIgXTtcblx0dmFyIGR5bmFtaWNEZWNvcmF0aW9ucyA9IFtcImNyZXNjZW5kbyhcIiwgXCJjcmVzY2VuZG8pXCIsIFwiZGltaW51ZW5kbyhcIiwgXCJkaW1pbnVlbmRvKVwiXTtcblxuXHR2YXIgYWNjZW50UHNldWRvbnltcyA9IFsgW1wiPFwiLCBcImFjY2VudFwiXSwgW1wiPlwiLCBcImFjY2VudFwiXSwgW1widHJcIiwgXCJ0cmlsbFwiXSxcblx0XHRbXCJwbHVzXCIsIFwiK1wiXSwgWyBcImVtcGhhc2lzXCIsIFwiYWNjZW50XCJdLFxuXHRcdFsgXCJeXCIsIFwidW1hcmNhdG9cIiBdLCBbIFwibWFyY2F0b1wiLCBcInVtYXJjYXRvXCIgXSBdO1xuXHR2YXIgYWNjZW50RHluYW1pY1BzZXVkb255bXMgPSBbIFtcIjwoXCIsIFwiY3Jlc2NlbmRvKFwiXSwgW1wiPClcIiwgXCJjcmVzY2VuZG8pXCJdLFxuXHRcdFtcIj4oXCIsIFwiZGltaW51ZW5kbyhcIl0sIFtcIj4pXCIsIFwiZGltaW51ZW5kbylcIl0gXTtcblx0dmFyIGxldHRlcl90b19hY2NlbnQgPSBmdW5jdGlvbihsaW5lLCBpKVxuXHR7XG5cdFx0dmFyIG1hY3JvID0gbXVsdGlsaW5lVmFycy5tYWNyb3NbbGluZS5jaGFyQXQoaSldO1xuXG5cdFx0aWYgKG1hY3JvICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChtYWNyby5jaGFyQXQoMCkgPT09ICchJyB8fCBtYWNyby5jaGFyQXQoMCkgPT09ICcrJylcblx0XHRcdFx0bWFjcm8gPSBtYWNyby5zdWJzdHJpbmcoMSk7XG5cdFx0XHRpZiAobWFjcm8uY2hhckF0KG1hY3JvLmxlbmd0aC0xKSA9PT0gJyEnIHx8IG1hY3JvLmNoYXJBdChtYWNyby5sZW5ndGgtMSkgPT09ICcrJylcblx0XHRcdFx0bWFjcm8gPSBtYWNyby5zdWJzdHJpbmcoMCwgbWFjcm8ubGVuZ3RoLTEpO1xuXHRcdFx0aWYgKHBhcnNlQ29tbW9uLmRldGVjdChsZWdhbEFjY2VudHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRcdHJldHVybiAobWFjcm8gPT09IGFjYyk7XG5cdFx0XHRcdH0pKVxuXHRcdFx0XHRyZXR1cm4gWyAxLCBtYWNybyBdO1xuXHRcdFx0ZWxzZSBpZiAocGFyc2VDb21tb24uZGV0ZWN0KHZvbHVtZURlY29yYXRpb25zLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdFx0XHRyZXR1cm4gKG1hY3JvID09PSBhY2MpO1xuXHRcdFx0XHR9KSkge1xuXHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy52b2x1bWVQb3NpdGlvbiA9PT0gJ2hpZGRlbicpXG5cdFx0XHRcdFx0bWFjcm8gPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gWzEsIG1hY3JvXTtcblx0XHRcdH0gZWxzZSBpZiAocGFyc2VDb21tb24uZGV0ZWN0KGR5bmFtaWNEZWNvcmF0aW9ucywgZnVuY3Rpb24oYWNjKSB7XG5cdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMuZHluYW1pY1Bvc2l0aW9uID09PSAnaGlkZGVuJylcblx0XHRcdFx0XHRcdG1hY3JvID0gXCJcIjtcblx0XHRcdFx0XHRyZXR1cm4gKG1hY3JvID09PSBhY2MpO1xuXHRcdFx0XHR9KSkge1xuXHRcdFx0XHRyZXR1cm4gWzEsIG1hY3JvXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghcGFyc2VDb21tb24uZGV0ZWN0KG11bHRpbGluZVZhcnMuaWdub3JlZERlY29yYXRpb25zLCBmdW5jdGlvbihkZWMpIHtcblx0XHRcdFx0XHRyZXR1cm4gKG1hY3JvID09PSBkZWMpO1xuXHRcdFx0XHR9KSlcblx0XHRcdFx0XHR3YXJuKFwiVW5rbm93biBtYWNybzogXCIgKyBtYWNybywgbGluZSwgaSk7XG5cdFx0XHRcdHJldHVybiBbMSwgJycgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c3dpdGNoIChsaW5lLmNoYXJBdChpKSlcblx0XHR7XG5cdFx0XHRjYXNlICcuJzpyZXR1cm4gWzEsICdzdGFjY2F0byddO1xuXHRcdFx0Y2FzZSAndSc6cmV0dXJuIFsxLCAndXBib3cnXTtcblx0XHRcdGNhc2UgJ3YnOnJldHVybiBbMSwgJ2Rvd25ib3cnXTtcblx0XHRcdGNhc2UgJ34nOnJldHVybiBbMSwgJ2lyaXNocm9sbCddO1xuXHRcdFx0Y2FzZSAnISc6XG5cdFx0XHRjYXNlICcrJzpcblx0XHRcdFx0dmFyIHJldCA9IHRva2VuaXplci5nZXRCcmFja2V0dGVkU3Vic3RyaW5nKGxpbmUsIGksIDUpO1xuXHRcdFx0XHQvLyBCZSBzdXJlIHRoYXQgdGhlIGFjY2VudCBpcyByZWNvZ25pemFibGUuXG5cdFx0XHRpZiAocmV0WzFdLmxlbmd0aCA+IDAgJiYgKHJldFsxXS5jaGFyQXQoMCkgPT09ICdeJyB8fCByZXRbMV0uY2hhckF0KDApID09PSdfJykpXG5cdFx0XHRcdFx0cmV0WzFdID0gcmV0WzFdLnN1YnN0cmluZygxKTtcdC8vIFRPRE8tUEVSOiBUaGUgdGVzdCBmaWxlcyBoYXZlIGluZGljYXRvcnMgZm9yY2luZyB0aGUgb3JuYW1lbnQgdG8gdGhlIHRvcCBvciBib3R0b20sIGJ1dCB0aGF0IGlzbid0IGluIHRoZSBzdGFuZGFyZC4gV2UnbGwganVzdCBpZ25vcmUgdGhlbS5cblx0XHRcdFx0aWYgKHBhcnNlQ29tbW9uLmRldGVjdChsZWdhbEFjY2VudHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRcdHJldHVybiAocmV0WzFdID09PSBhY2MpO1xuXHRcdFx0XHR9KSlcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHRpZiAocGFyc2VDb21tb24uZGV0ZWN0KHZvbHVtZURlY29yYXRpb25zLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdFx0XHRcdHJldHVybiAocmV0WzFdID09PSBhY2MpO1xuXHRcdFx0XHRcdH0pKSB7XG5cdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMudm9sdW1lUG9zaXRpb24gPT09ICdoaWRkZW4nIClcblx0XHRcdFx0XHRcdHJldFsxXSA9ICcnO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyc2VDb21tb24uZGV0ZWN0KGR5bmFtaWNEZWNvcmF0aW9ucywgZnVuY3Rpb24oYWNjKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKHJldFsxXSA9PT0gYWNjKTtcblx0XHRcdFx0XHR9KSkge1xuXHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmR5bmFtaWNQb3NpdGlvbiA9PT0gJ2hpZGRlbicgKVxuXHRcdFx0XHRcdFx0cmV0WzFdID0gJyc7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHBhcnNlQ29tbW9uLmRldGVjdChhY2NlbnRQc2V1ZG9ueW1zLCBmdW5jdGlvbihhY2MpIHtcblx0XHRcdFx0XHRpZiAocmV0WzFdID09PSBhY2NbMF0pIHtcblx0XHRcdFx0XHRcdHJldFsxXSA9IGFjY1sxXTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9KSlcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0XHRcdGlmIChwYXJzZUNvbW1vbi5kZXRlY3QoYWNjZW50RHluYW1pY1BzZXVkb255bXMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0XHRcdGlmIChyZXRbMV0gPT09IGFjY1swXSkge1xuXHRcdFx0XHRcdFx0cmV0WzFdID0gYWNjWzFdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pKSB7XG5cdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMuZHluYW1pY1Bvc2l0aW9uID09PSAnaGlkZGVuJyApXG5cdFx0XHRcdFx0XHRyZXRbMV0gPSAnJztcblx0XHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV2UgZGlkbid0IGZpbmQgdGhlIGFjY2VudCBpbiB0aGUgbGlzdCwgc28gY29uc3VtZSB0aGUgc3BhY2UsIGJ1dCBkb24ndCByZXR1cm4gYW4gYWNjZW50LlxuXHRcdFx0XHQvLyBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0aGF0ICEgd2FzIHVzZWQgYXMgYSBsaW5lIGJyZWFrLCBzbyBhY2NlcHQgdGhhdC5cblx0XHRcdGlmIChsaW5lLmNoYXJBdChpKSA9PT0gJyEnICYmIChyZXRbMF0gPT09IDEgfHwgbGluZS5jaGFyQXQoaStyZXRbMF0tMSkgIT09ICchJykpXG5cdFx0XHRcdFx0cmV0dXJuIFsxLCBudWxsIF07XG5cdFx0XHRcdHdhcm4oXCJVbmtub3duIGRlY29yYXRpb246IFwiICsgcmV0WzFdLCBsaW5lLCBpKTtcblx0XHRcdFx0cmV0WzFdID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdGNhc2UgJ0gnOnJldHVybiBbMSwgJ2Zlcm1hdGEnXTtcblx0XHRcdGNhc2UgJ0onOnJldHVybiBbMSwgJ3NsaWRlJ107XG5cdFx0XHRjYXNlICdMJzpyZXR1cm4gWzEsICdhY2NlbnQnXTtcblx0XHRcdGNhc2UgJ00nOnJldHVybiBbMSwgJ21vcmRlbnQnXTtcblx0XHRcdGNhc2UgJ08nOnJldHVyblsxLCAnY29kYSddO1xuXHRcdFx0Y2FzZSAnUCc6cmV0dXJuWzEsICdwcmFsbHRyaWxsZXInXTtcblx0XHRcdGNhc2UgJ1InOnJldHVybiBbMSwgJ3JvbGwnXTtcblx0XHRcdGNhc2UgJ1MnOnJldHVybiBbMSwgJ3NlZ25vJ107XG5cdFx0XHRjYXNlICdUJzpyZXR1cm4gWzEsICd0cmlsbCddO1xuXHRcdH1cblx0XHRyZXR1cm4gWzAsIDBdO1xuXHR9O1xuXG5cdHZhciBsZXR0ZXJfdG9fc3BhY2VyID0gZnVuY3Rpb24obGluZSwgaSlcblx0e1xuXHRcdHZhciBzdGFydCA9IGk7XG5cdFx0d2hpbGUgKHRva2VuaXplci5pc1doaXRlU3BhY2UobGluZS5jaGFyQXQoaSkpKVxuXHRcdFx0aSsrO1xuXHRcdHJldHVybiBbIGktc3RhcnQgXTtcblx0fTtcblxuXHQvLyByZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgYmFyIGxpbmVcblx0Ly8gdGhlIG51bWJlciBvZiB0aGUgcmVwZWF0XG5cdC8vIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZCB1cFxuXHQvLyBpZiAwIGlzIHJldHVybmVkLCB0aGVuIHRoZSBuZXh0IGVsZW1lbnQgd2FzIG5vdCBhIGJhciBsaW5lXG5cdHZhciBsZXR0ZXJfdG9fYmFyID0gZnVuY3Rpb24obGluZSwgY3Vycl9wb3MpXG5cdHtcblx0XHR2YXIgcmV0ID0gdG9rZW5pemVyLmdldEJhckxpbmUobGluZSwgY3Vycl9wb3MpO1xuXHRcdGlmIChyZXQubGVuID09PSAwKVxuXHRcdFx0cmV0dXJuIFswLFwiXCJdO1xuXHRcdGlmIChyZXQud2Fybikge1xuXHRcdFx0d2FybihyZXQud2FybiwgbGluZSwgY3Vycl9wb3MpO1xuXHRcdFx0cmV0dXJuIFtyZXQubGVuLFwiXCJdO1xuXHRcdH1cblxuXHRcdC8vIE5vdyBzZWUgaWYgdGhpcyBpcyBhIHJlcGVhdGVkIGVuZGluZ1xuXHRcdC8vIEEgcmVwZWF0ZWQgZW5kaW5nIGlzIGFsbCBvZiB0aGUgY2hhcmFjdGVycyAxLDIsMyw0LDUsNiw3LDgsOSwwLC0sIGFuZCBjb21tYVxuXHRcdC8vIEl0IGNhbiBhbHNvIG9wdGlvbmFsbHkgc3RhcnQgd2l0aCAnWycsIHdoaWNoIGlzIGlnbm9yZWQuXG5cdFx0Ly8gQWxzbywgaXQgY2FuIGhhdmUgd2hpdGUgc3BhY2UgYmVmb3JlIHRoZSAnWycuXG5cdFx0Zm9yICh2YXIgd3MgPSAwOyB3cyA8IGxpbmUubGVuZ3RoOyB3cysrKVxuXHRcdFx0aWYgKGxpbmUuY2hhckF0KGN1cnJfcG9zICsgcmV0LmxlbiArIHdzKSAhPT0gJyAnKVxuXHRcdFx0XHRicmVhaztcblx0XHR2YXIgb3JpZ19iYXJfbGVuID0gcmV0Lmxlbjtcblx0XHRpZiAobGluZS5jaGFyQXQoY3Vycl9wb3MrcmV0Lmxlbit3cykgPT09ICdbJykge1xuXHRcdFx0cmV0LmxlbiArPSB3cyArIDE7XG5cdFx0fVxuXG5cdFx0Ly8gSXQgY2FuIGFsc28gYmUgYSBxdW90ZWQgc3RyaW5nLiBJdCBpcyB1bmNsZWFyIHdoZXRoZXIgdGhhdCBjb25zdHJ1Y3QgcmVxdWlyZXMgJ1snLCBidXQgaXQgc2VlbXMgbGlrZSBpdCB3b3VsZC4gb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2VkIHdpdGggYSByZWd1bGFyIGNob3JkLlxuXHRcdGlmIChsaW5lLmNoYXJBdChjdXJyX3BvcytyZXQubGVuKSA9PT0gJ1wiJyAmJiBsaW5lLmNoYXJBdChjdXJyX3BvcytyZXQubGVuLTEpID09PSAnWycpIHtcblx0XHRcdHZhciBlbmRpbmcgPSB0b2tlbml6ZXIuZ2V0QnJhY2tldHRlZFN1YnN0cmluZyhsaW5lLCBjdXJyX3BvcytyZXQubGVuLCA1KTtcblx0XHRcdHJldHVybiBbcmV0LmxlbitlbmRpbmdbMF0sIHJldC50b2tlbiwgZW5kaW5nWzFdXTtcblx0XHR9XG5cdFx0dmFyIHJldFJlcCA9IHRva2VuaXplci5nZXRUb2tlbk9mKGxpbmUuc3Vic3RyaW5nKGN1cnJfcG9zK3JldC5sZW4pLCBcIjEyMzQ1Njc4OTAtLFwiKTtcblx0XHRpZiAocmV0UmVwLmxlbiA9PT0gMCB8fCByZXRSZXAudG9rZW5bMF0gPT09ICctJylcblx0XHRcdHJldHVybiBbb3JpZ19iYXJfbGVuLCByZXQudG9rZW5dO1xuXG5cdFx0cmV0dXJuIFtyZXQubGVuK3JldFJlcC5sZW4sIHJldC50b2tlbiwgcmV0UmVwLnRva2VuXTtcblx0fTtcblxuXHR2YXIgdHJpcGxldFEgPSB7XG5cdFx0MjogMyxcblx0XHQzOiAyLFxuXHRcdDQ6IDMsXG5cdFx0NTogMiwgLy8gVE9ETy1QRVI6IG5vdCBoYW5kbGluZyA2Lzggcmh5dGhtIHlldFxuXHRcdDY6IDIsXG5cdFx0NzogMiwgLy8gVE9ETy1QRVI6IG5vdCBoYW5kbGluZyA2Lzggcmh5dGhtIHlldFxuXHRcdDg6IDMsXG5cdFx0OTogMiAvLyBUT0RPLVBFUjogbm90IGhhbmRsaW5nIDYvOCByaHl0aG0geWV0XG5cdH07XG5cdHZhciBsZXR0ZXJfdG9fb3Blbl9zbHVyc19hbmRfdHJpcGxldHMgPSAgZnVuY3Rpb24obGluZSwgaSkge1xuXHRcdC8vIGNvbnN1bWUgc3BhY2VzLCBhbmQgbG9vayBmb3IgYWxsIHRoZSBvcGVuIHBhcmVucy4gSWYgdGhlcmUgaXMgYSBudW1iZXIgYWZ0ZXIgdGhlIG9wZW4gcGFyZW4sXG5cdFx0Ly8gdGhhdCBpcyBhIHRyaXBsZXQuIE90aGVyd2lzZSB0aGF0IGlzIGEgc2x1ci4gQ29sbGVjdCBhbGwgdGhlIHNsdXJzIGFuZCB0aGUgZmlyc3QgdHJpcGxldC5cblx0XHR2YXIgcmV0ID0ge307XG5cdFx0dmFyIHN0YXJ0ID0gaTtcblx0XHR3aGlsZSAobGluZS5jaGFyQXQoaSkgPT09ICcoJyB8fCB0b2tlbml6ZXIuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckF0KGkpKSkge1xuXHRcdFx0aWYgKGxpbmUuY2hhckF0KGkpID09PSAnKCcpIHtcblx0XHRcdFx0aWYgKGkrMSA8IGxpbmUubGVuZ3RoICYmIChsaW5lLmNoYXJBdChpKzEpID49ICcyJyAmJiBsaW5lLmNoYXJBdChpKzEpIDw9ICc5JykpIHtcblx0XHRcdFx0XHRpZiAocmV0LnRyaXBsZXQgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdHdhcm4oXCJDYW4ndCBuZXN0IHRyaXBsZXRzXCIsIGxpbmUsIGkpO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0LnRyaXBsZXQgPSBsaW5lLmNoYXJBdChpKzEpIC0gJzAnO1xuXHRcdFx0XHRcdFx0cmV0LnRyaXBsZXRRID0gdHJpcGxldFFbcmV0LnRyaXBsZXRdO1xuXHRcdFx0XHRcdFx0cmV0Lm51bV9ub3RlcyA9IHJldC50cmlwbGV0O1xuXHRcdFx0XHRcdFx0aWYgKGkrMiA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGkrMikgPT09ICc6Jykge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZXhwZWN0aW5nIFwiKHA6cTpyXCIgb3IgXCIocDpxXCIgb3IgXCIocDo6clwiXG5cdFx0XHRcdFx0XHRcdC8vIFRoYXQgaXM6IFwicHV0IHAgbm90ZXMgaW50byB0aGUgdGltZSBvZiBxIGZvciB0aGUgbmV4dCByIG5vdGVzXCJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgciBpcyBtaXNzaW5nLCB0aGVuIGl0IGlzIGVxdWFsIHRvIHAuXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHEgaXMgbWlzc2luZywgaXQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoaXMgdGFibGU6XG5cdFx0XHRcdFx0XHRcdC8vICgyIG5vdGVzIGluIHRoZSB0aW1lIG9mIDNcblx0XHRcdFx0XHRcdFx0Ly8gKDMgbm90ZXMgaW4gdGhlIHRpbWUgb2YgMlxuXHRcdFx0XHRcdFx0XHQvLyAoNCBub3RlcyBpbiB0aGUgdGltZSBvZiAzXG5cdFx0XHRcdFx0XHRcdC8vICg1IG5vdGVzIGluIHRoZSB0aW1lIG9mIG4gfCBpZiB0aW1lIHNpZyBpcyAoNi84LCA5LzgsIDEyLzgpLCBuPTMsIGVsc2Ugbj0yXG5cdFx0XHRcdFx0XHRcdC8vICg2IG5vdGVzIGluIHRoZSB0aW1lIG9mIDJcblx0XHRcdFx0XHRcdFx0Ly8gKDcgbm90ZXMgaW4gdGhlIHRpbWUgb2YgblxuXHRcdFx0XHRcdFx0XHQvLyAoOCBub3RlcyBpbiB0aGUgdGltZSBvZiAzXG5cdFx0XHRcdFx0XHRcdC8vICg5IG5vdGVzIGluIHRoZSB0aW1lIG9mIG5cblx0XHRcdFx0XHRcdFx0aWYgKGkrMyA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGkrMykgPT09ICc6Jykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBzZWNvbmQgbnVtYmVyLCAncScsIGlzIG5vdCBwcmVzZW50LlxuXHRcdFx0XHRcdFx0XHRcdGlmIChpKzQgPCBsaW5lLmxlbmd0aCAmJiAobGluZS5jaGFyQXQoaSs0KSA+PSAnMScgJiYgbGluZS5jaGFyQXQoaSs0KSA8PSAnOScpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXQubnVtX25vdGVzID0gbGluZS5jaGFyQXQoaSs0KSAtICcwJztcblx0XHRcdFx0XHRcdFx0XHRcdGkgKz0gMztcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdHdhcm4oXCJleHBlY3RlZCBudW1iZXIgYWZ0ZXIgdGhlIHR3byBjb2xvbnMgYWZ0ZXIgdGhlIHRyaXBsZXQgdG8gbWFyayB0aGUgZHVyYXRpb25cIiwgbGluZSwgaSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaSszIDwgbGluZS5sZW5ndGggJiYgKGxpbmUuY2hhckF0KGkrMykgPj0gJzEnICYmIGxpbmUuY2hhckF0KGkrMykgPD0gJzknKSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldC50cmlwbGV0USA9IGxpbmUuY2hhckF0KGkrMykgLSAnMCc7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGkrNCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGkrNCkgPT09ICc6Jykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGkrNSA8IGxpbmUubGVuZ3RoICYmIChsaW5lLmNoYXJBdChpKzUpID49ICcxJyAmJiBsaW5lLmNoYXJBdChpKzUpIDw9ICc5JykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0Lm51bV9ub3RlcyA9IGxpbmUuY2hhckF0KGkrNSkgLSAnMCc7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGkgKz0gNDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0aSArPSAyO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRcdFx0d2FybihcImV4cGVjdGVkIG51bWJlciBhZnRlciB0aGUgdHJpcGxldCB0byBtYXJrIHRoZSBkdXJhdGlvblwiLCBsaW5lLCBpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aSsrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGlmIChyZXQuc3RhcnRTbHVyID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRyZXQuc3RhcnRTbHVyID0gMTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXQuc3RhcnRTbHVyKys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGkrKztcblx0XHR9XG5cdFx0cmV0LmNvbnN1bWVkID0gaS1zdGFydDtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdHZhciBhZGRXb3JkcyA9IGZ1bmN0aW9uKGxpbmUsIHdvcmRzKSB7XG5cdFx0aWYgKCFsaW5lKSB7IHdhcm4oXCJDYW4ndCBhZGQgd29yZHMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lIG9mIG11c2ljXCIsIGxpbmUsIDApOyByZXR1cm47IH1cblx0XHR3b3JkcyA9IHBhcnNlQ29tbW9uLnN0cmlwKHdvcmRzKTtcblx0XHRpZiAod29yZHMuY2hhckF0KHdvcmRzLmxlbmd0aC0xKSAhPT0gJy0nKVxuXHRcdFx0d29yZHMgPSB3b3JkcyArICcgJztcdC8vIEp1c3QgbWFrZXMgaXQgZWFzaWVyIHRvIHBhcnNlIGJlbG93LCBzaW5jZSBldmVyeSB3b3JkIGhhcyBhIGRpdmlkZXIgYWZ0ZXIgaXQuXG5cdFx0dmFyIHdvcmRfbGlzdCA9IFtdO1xuXHRcdC8vIGZpcnN0IG1ha2UgYSBsaXN0IG9mIHdvcmRzIGZyb20gdGhlIHN0cmluZyB3ZSBhcmUgcGFzc2VkLiBBIHdvcmQgaXMgZGl2aWRlZCBvbiBlaXRoZXIgYSBzcGFjZSBvciBkYXNoLlxuXHRcdHZhciBsYXN0X2RpdmlkZXIgPSAwO1xuXHRcdHZhciByZXBsYWNlID0gZmFsc2U7XG5cdFx0dmFyIGFkZFdvcmQgPSBmdW5jdGlvbihpKSB7XG5cdFx0XHR2YXIgd29yZCA9IHBhcnNlQ29tbW9uLnN0cmlwKHdvcmRzLnN1YnN0cmluZyhsYXN0X2RpdmlkZXIsIGkpKTtcblx0XHRcdGxhc3RfZGl2aWRlciA9IGkrMTtcblx0XHRcdGlmICh3b3JkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKHJlcGxhY2UpXG5cdFx0XHRcdFx0d29yZCA9IHBhcnNlQ29tbW9uLmdzdWIod29yZCwnficsICcgJyk7XG5cdFx0XHRcdHZhciBkaXYgPSB3b3Jkcy5jaGFyQXQoaSk7XG5cdFx0XHRcdGlmIChkaXYgIT09ICdfJyAmJiBkaXYgIT09ICctJylcblx0XHRcdFx0XHRkaXYgPSAnICc7XG5cdFx0XHRcdHdvcmRfbGlzdC5wdXNoKHtzeWxsYWJsZTogdG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh3b3JkKSwgZGl2aWRlcjogZGl2fSk7XG5cdFx0XHRcdHJlcGxhY2UgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzd2l0Y2ggKHdvcmRzLmNoYXJBdChpKSkge1xuXHRcdFx0XHRjYXNlICcgJzpcblx0XHRcdFx0Y2FzZSAnXFx4MTInOlxuXHRcdFx0XHRcdGFkZFdvcmQoaSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJy0nOlxuXHRcdFx0XHRcdGlmICghYWRkV29yZChpKSAmJiB3b3JkX2xpc3QubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0cGFyc2VDb21tb24ubGFzdCh3b3JkX2xpc3QpLmRpdmlkZXIgPSAnLSc7XG5cdFx0XHRcdFx0XHR3b3JkX2xpc3QucHVzaCh7c2tpcDogdHJ1ZSwgdG86ICduZXh0J30pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnXyc6XG5cdFx0XHRcdFx0YWRkV29yZChpKTtcblx0XHRcdFx0XHR3b3JkX2xpc3QucHVzaCh7c2tpcDogdHJ1ZSwgdG86ICdzbHVyJ30pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICcqJzpcblx0XHRcdFx0XHRhZGRXb3JkKGkpO1xuXHRcdFx0XHRcdHdvcmRfbGlzdC5wdXNoKHtza2lwOiB0cnVlLCB0bzogJ25leHQnfSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3wnOlxuXHRcdFx0XHRcdGFkZFdvcmQoaSk7XG5cdFx0XHRcdFx0d29yZF9saXN0LnB1c2goe3NraXA6IHRydWUsIHRvOiAnYmFyJ30pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd+Jzpcblx0XHRcdFx0XHRyZXBsYWNlID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgaW5TbHVyID0gZmFsc2U7XG5cdFx0cGFyc2VDb21tb24uZWFjaChsaW5lLCBmdW5jdGlvbihlbCkge1xuXHRcdFx0aWYgKHdvcmRfbGlzdC5sZW5ndGggIT09IDApIHtcblx0XHRcdFx0aWYgKHdvcmRfbGlzdFswXS5za2lwKSB7XG5cdFx0XHRcdFx0c3dpdGNoICh3b3JkX2xpc3RbMF0udG8pIHtcblx0XHRcdFx0XHRcdGNhc2UgJ25leHQnOiBpZiAoZWwuZWxfdHlwZSA9PT0gJ25vdGUnICYmIGVsLnBpdGNoZXMgIT09IG51bGwgJiYgIWluU2x1cikgd29yZF9saXN0LnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc2x1cic6IGlmIChlbC5lbF90eXBlID09PSAnbm90ZScgJiYgZWwucGl0Y2hlcyAhPT0gbnVsbCkgd29yZF9saXN0LnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnYmFyJzogaWYgKGVsLmVsX3R5cGUgPT09ICdiYXInKSB3b3JkX2xpc3Quc2hpZnQoKTsgYnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChlbC5lbF90eXBlICE9PSAnYmFyJykge1xuXHRcdFx0XHRcdFx0aWYgKGVsLmx5cmljID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdGVsLmx5cmljID0gW3tzeWxsYWJsZTogXCJcIiwgZGl2aWRlcjogXCIgXCJ9XTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0ZWwubHlyaWMucHVzaCh7c3lsbGFibGU6IFwiXCIsIGRpdmlkZXI6IFwiIFwifSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChlbC5lbF90eXBlID09PSAnbm90ZScgJiYgZWwucmVzdCA9PT0gdW5kZWZpbmVkICYmICFpblNsdXIpIHtcblx0XHRcdFx0XHRcdHZhciBseXJpYyA9IHdvcmRfbGlzdC5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0aWYgKGx5cmljLnN5bGxhYmxlKVxuXHRcdFx0XHRcdFx0XHRseXJpYy5zeWxsYWJsZSA9IGx5cmljLnN5bGxhYmxlLnJlcGxhY2UoLyArL2csJ1xceEEwJyk7XG5cdFx0XHRcdFx0XHRpZiAoZWwubHlyaWMgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdFx0ZWwubHlyaWMgPSBbIGx5cmljIF07XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGVsLmx5cmljLnB1c2gobHlyaWMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXG5cdHZhciBhZGRTeW1ib2xzID0gZnVuY3Rpb24obGluZSwgd29yZHMpIHtcblx0XHQvLyBUT0RPLVBFUjogQ3VycmVudGx5IGNvcGllZCBmcm9tIHc6IGxpbmUuIFRoaXMgbmVlZHMgdG8gYmUgcmVhZCBhcyBzeW1ib2xzIGluc3RlYWQuXG5cdFx0aWYgKCFsaW5lKSB7IHdhcm4oXCJDYW4ndCBhZGQgc3ltYm9scyBiZWZvcmUgdGhlIGZpcnN0IGxpbmUgb2YgbXVzaWNcIiwgbGluZSwgMCk7IHJldHVybjsgfVxuXHRcdHdvcmRzID0gcGFyc2VDb21tb24uc3RyaXAod29yZHMpO1xuXHRcdGlmICh3b3Jkcy5jaGFyQXQod29yZHMubGVuZ3RoLTEpICE9PSAnLScpXG5cdFx0XHR3b3JkcyA9IHdvcmRzICsgJyAnO1x0Ly8gSnVzdCBtYWtlcyBpdCBlYXNpZXIgdG8gcGFyc2UgYmVsb3csIHNpbmNlIGV2ZXJ5IHdvcmQgaGFzIGEgZGl2aWRlciBhZnRlciBpdC5cblx0XHR2YXIgd29yZF9saXN0ID0gW107XG5cdFx0Ly8gZmlyc3QgbWFrZSBhIGxpc3Qgb2Ygd29yZHMgZnJvbSB0aGUgc3RyaW5nIHdlIGFyZSBwYXNzZWQuIEEgd29yZCBpcyBkaXZpZGVkIG9uIGVpdGhlciBhIHNwYWNlIG9yIGRhc2guXG5cdFx0dmFyIGxhc3RfZGl2aWRlciA9IDA7XG5cdFx0dmFyIHJlcGxhY2UgPSBmYWxzZTtcblx0XHR2YXIgYWRkV29yZCA9IGZ1bmN0aW9uKGkpIHtcblx0XHRcdHZhciB3b3JkID0gcGFyc2VDb21tb24uc3RyaXAod29yZHMuc3Vic3RyaW5nKGxhc3RfZGl2aWRlciwgaSkpO1xuXHRcdFx0bGFzdF9kaXZpZGVyID0gaSsxO1xuXHRcdFx0aWYgKHdvcmQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpZiAocmVwbGFjZSlcblx0XHRcdFx0XHR3b3JkID0gcGFyc2VDb21tb24uZ3N1Yih3b3JkLCAnficsICcgJyk7XG5cdFx0XHRcdHZhciBkaXYgPSB3b3Jkcy5jaGFyQXQoaSk7XG5cdFx0XHRcdGlmIChkaXYgIT09ICdfJyAmJiBkaXYgIT09ICctJylcblx0XHRcdFx0XHRkaXYgPSAnICc7XG5cdFx0XHRcdHdvcmRfbGlzdC5wdXNoKHtzeWxsYWJsZTogdG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh3b3JkKSwgZGl2aWRlcjogZGl2fSk7XG5cdFx0XHRcdHJlcGxhY2UgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzd2l0Y2ggKHdvcmRzLmNoYXJBdChpKSkge1xuXHRcdFx0XHRjYXNlICcgJzpcblx0XHRcdFx0Y2FzZSAnXFx4MTInOlxuXHRcdFx0XHRcdGFkZFdvcmQoaSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJy0nOlxuXHRcdFx0XHRcdGlmICghYWRkV29yZChpKSAmJiB3b3JkX2xpc3QubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0cGFyc2VDb21tb24ubGFzdCh3b3JkX2xpc3QpLmRpdmlkZXIgPSAnLSc7XG5cdFx0XHRcdFx0XHR3b3JkX2xpc3QucHVzaCh7c2tpcDogdHJ1ZSwgdG86ICduZXh0J30pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnXyc6XG5cdFx0XHRcdFx0YWRkV29yZChpKTtcblx0XHRcdFx0XHR3b3JkX2xpc3QucHVzaCh7c2tpcDogdHJ1ZSwgdG86ICdzbHVyJ30pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICcqJzpcblx0XHRcdFx0XHRhZGRXb3JkKGkpO1xuXHRcdFx0XHRcdHdvcmRfbGlzdC5wdXNoKHtza2lwOiB0cnVlLCB0bzogJ25leHQnfSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3wnOlxuXHRcdFx0XHRcdGFkZFdvcmQoaSk7XG5cdFx0XHRcdFx0d29yZF9saXN0LnB1c2goe3NraXA6IHRydWUsIHRvOiAnYmFyJ30pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd+Jzpcblx0XHRcdFx0XHRyZXBsYWNlID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgaW5TbHVyID0gZmFsc2U7XG5cdFx0cGFyc2VDb21tb24uZWFjaChsaW5lLCBmdW5jdGlvbihlbCkge1xuXHRcdFx0aWYgKHdvcmRfbGlzdC5sZW5ndGggIT09IDApIHtcblx0XHRcdFx0aWYgKHdvcmRfbGlzdFswXS5za2lwKSB7XG5cdFx0XHRcdFx0c3dpdGNoICh3b3JkX2xpc3RbMF0udG8pIHtcblx0XHRcdFx0XHRcdGNhc2UgJ25leHQnOiBpZiAoZWwuZWxfdHlwZSA9PT0gJ25vdGUnICYmIGVsLnBpdGNoZXMgIT09IG51bGwgJiYgIWluU2x1cikgd29yZF9saXN0LnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc2x1cic6IGlmIChlbC5lbF90eXBlID09PSAnbm90ZScgJiYgZWwucGl0Y2hlcyAhPT0gbnVsbCkgd29yZF9saXN0LnNoaWZ0KCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnYmFyJzogaWYgKGVsLmVsX3R5cGUgPT09ICdiYXInKSB3b3JkX2xpc3Quc2hpZnQoKTsgYnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChlbC5lbF90eXBlID09PSAnbm90ZScgJiYgZWwucmVzdCA9PT0gdW5kZWZpbmVkICYmICFpblNsdXIpIHtcblx0XHRcdFx0XHRcdHZhciBseXJpYyA9IHdvcmRfbGlzdC5zaGlmdCgpO1xuXHRcdFx0XHRcdFx0aWYgKGVsLmx5cmljID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdGVsLmx5cmljID0gWyBseXJpYyBdO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRlbC5seXJpYy5wdXNoKGx5cmljKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHR2YXIgZ2V0QnJva2VuUmh5dGhtID0gZnVuY3Rpb24obGluZSwgaW5kZXgpIHtcblx0XHRzd2l0Y2ggKGxpbmUuY2hhckF0KGluZGV4KSkge1xuXHRcdFx0Y2FzZSAnPic6XG5cdFx0XHRpZiAoaW5kZXggPCBsaW5lLmxlbmd0aCAtIDEgJiYgbGluZS5jaGFyQXQoaW5kZXgrMSkgPT09ICc+JylcdC8vIGRvdWJsZSA+PlxuXHRcdFx0XHRcdHJldHVybiBbMiwgMS43NSwgMC4yNV07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gWzEsIDEuNSwgMC41XTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdGlmIChpbmRleCA8IGxpbmUubGVuZ3RoIC0gMSAmJiBsaW5lLmNoYXJBdChpbmRleCsxKSA9PT0gJzwnKVx0Ly8gZG91YmxlIDw8XG5cdFx0XHRcdFx0cmV0dXJuIFsyLCAwLjI1LCAxLjc1XTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJldHVybiBbMSwgMC41LCAxLjVdO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cblx0Ly8gVE9ETy1QRVI6IG1ha2UgdGhpcyBhIG1ldGhvZCBpbiBlbC5cblx0dmFyIGFkZEVuZEJlYW0gPSBmdW5jdGlvbihlbCkge1xuXHRcdGlmIChlbC5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIGVsLmR1cmF0aW9uIDwgMC4yNSlcblx0XHRcdGVsLmVuZF9iZWFtID0gdHJ1ZTtcblx0XHRyZXR1cm4gZWw7XG5cdH07XG5cblx0dmFyIHBpdGNoZXMgPSB7QTogNSwgQjogNiwgQzogMCwgRDogMSwgRTogMiwgRjogMywgRzogNCwgYTogMTIsIGI6IDEzLCBjOiA3LCBkOiA4LCBlOiA5LCBmOiAxMCwgZzogMTF9O1xuXHR2YXIgcmVzdHMgPSB7eDogJ2ludmlzaWJsZScsIHk6ICdzcGFjZXInLCB6OiAncmVzdCcsIFo6ICdtdWx0aW1lYXN1cmUnIH07XG5cdHZhciBnZXRDb3JlTm90ZSA9IGZ1bmN0aW9uKGxpbmUsIGluZGV4LCBlbCwgY2FuSGF2ZUJyb2tlblJoeXRobSkge1xuXHRcdC8vdmFyIGVsID0geyBzdGFydENoYXI6IGluZGV4IH07XG5cdFx0dmFyIGlzQ29tcGxldGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuXHRcdFx0cmV0dXJuIChzdGF0ZSA9PT0gJ29jdGF2ZScgfHwgc3RhdGUgPT09ICdkdXJhdGlvbicgfHwgc3RhdGUgPT09ICdaZHVyYXRpb24nIHx8IHN0YXRlID09PSAnYnJva2VuX3JoeXRobScgfHwgc3RhdGUgPT09ICdlbmRfc2x1cicpO1xuXHRcdH07XG5cdFx0dmFyIHN0YXRlID0gJ3N0YXJ0U2x1cic7XG5cdFx0dmFyIGR1cmF0aW9uU2V0QnlQcmV2aW91c05vdGUgPSBmYWxzZTtcblx0XHR3aGlsZSAoMSkge1xuXHRcdFx0c3dpdGNoKGxpbmUuY2hhckF0KGluZGV4KSkge1xuXHRcdFx0XHRjYXNlICcoJzpcblx0XHRcdFx0XHRpZiAoc3RhdGUgPT09ICdzdGFydFNsdXInKSB7XG5cdFx0XHRcdFx0XHRpZiAoZWwuc3RhcnRTbHVyID09PSB1bmRlZmluZWQpIGVsLnN0YXJ0U2x1ciA9IDE7IGVsc2UgZWwuc3RhcnRTbHVyKys7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpc0NvbXBsZXRlKHN0YXRlKSkge2VsLmVuZENoYXIgPSBpbmRleDtyZXR1cm4gZWw7fVxuXHRcdFx0XHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJyknOlxuXHRcdFx0XHRcdGlmIChpc0NvbXBsZXRlKHN0YXRlKSkge1xuXHRcdFx0XHRcdFx0aWYgKGVsLmVuZFNsdXIgPT09IHVuZGVmaW5lZCkgZWwuZW5kU2x1ciA9IDE7IGVsc2UgZWwuZW5kU2x1cisrO1xuXHRcdFx0XHRcdH0gZWxzZSByZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnXic6XG5cdFx0XHRcdFx0aWYgKHN0YXRlID09PSAnc3RhcnRTbHVyJykge2VsLmFjY2lkZW50YWwgPSAnc2hhcnAnO3N0YXRlID0gJ3NoYXJwMic7fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHN0YXRlID09PSAnc2hhcnAyJykge2VsLmFjY2lkZW50YWwgPSAnZGJsc2hhcnAnO3N0YXRlID0gJ3BpdGNoJzt9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoaXNDb21wbGV0ZShzdGF0ZSkpIHtlbC5lbmRDaGFyID0gaW5kZXg7cmV0dXJuIGVsO31cblx0XHRcdFx0XHRlbHNlIHJldHVybiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdfJzpcblx0XHRcdFx0XHRpZiAoc3RhdGUgPT09ICdzdGFydFNsdXInKSB7ZWwuYWNjaWRlbnRhbCA9ICdmbGF0JztzdGF0ZSA9ICdmbGF0Mic7fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHN0YXRlID09PSAnZmxhdDInKSB7ZWwuYWNjaWRlbnRhbCA9ICdkYmxmbGF0JztzdGF0ZSA9ICdwaXRjaCc7fVxuXHRcdFx0XHRcdGVsc2UgaWYgKGlzQ29tcGxldGUoc3RhdGUpKSB7ZWwuZW5kQ2hhciA9IGluZGV4O3JldHVybiBlbDt9XG5cdFx0XHRcdFx0ZWxzZSByZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnPSc6XG5cdFx0XHRcdFx0aWYgKHN0YXRlID09PSAnc3RhcnRTbHVyJykge2VsLmFjY2lkZW50YWwgPSAnbmF0dXJhbCc7c3RhdGUgPSAncGl0Y2gnO31cblx0XHRcdFx0XHRlbHNlIGlmIChpc0NvbXBsZXRlKHN0YXRlKSkge2VsLmVuZENoYXIgPSBpbmRleDtyZXR1cm4gZWw7fVxuXHRcdFx0XHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0EnOlxuXHRcdFx0XHRjYXNlICdCJzpcblx0XHRcdFx0Y2FzZSAnQyc6XG5cdFx0XHRcdGNhc2UgJ0QnOlxuXHRcdFx0XHRjYXNlICdFJzpcblx0XHRcdFx0Y2FzZSAnRic6XG5cdFx0XHRcdGNhc2UgJ0cnOlxuXHRcdFx0XHRjYXNlICdhJzpcblx0XHRcdFx0Y2FzZSAnYic6XG5cdFx0XHRcdGNhc2UgJ2MnOlxuXHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0Y2FzZSAnZSc6XG5cdFx0XHRcdGNhc2UgJ2YnOlxuXHRcdFx0XHRjYXNlICdnJzpcblx0XHRcdFx0XHRpZiAoc3RhdGUgPT09ICdzdGFydFNsdXInIHx8IHN0YXRlID09PSAnc2hhcnAyJyB8fCBzdGF0ZSA9PT0gJ2ZsYXQyJyB8fCBzdGF0ZSA9PT0gJ3BpdGNoJykge1xuXHRcdFx0XHRcdFx0ZWwucGl0Y2ggPSBwaXRjaGVzW2xpbmUuY2hhckF0KGluZGV4KV07XG5cdFx0XHRcdFx0XHR0cmFuc3Bvc2Uubm90ZShtdWx0aWxpbmVWYXJzLCBlbCk7XG5cdFx0XHRcdFx0XHRzdGF0ZSA9ICdvY3RhdmUnO1xuXHRcdFx0XHRcdFx0Ly8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgdmFsaWQgbm90ZS4gVGhlIHJlc3QgaXMgb3B0aW9uYWwuIFNldCB0aGUgZHVyYXRpb24gaW4gY2FzZSB3ZSBkb24ndCBnZXQgb25lIGJlbG93XG5cdFx0XHRcdFx0XHRpZiAoY2FuSGF2ZUJyb2tlblJoeXRobSAmJiBtdWx0aWxpbmVWYXJzLm5leHRfbm90ZV9kdXJhdGlvbiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRlbC5kdXJhdGlvbiA9IG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGggKiBtdWx0aWxpbmVWYXJzLm5leHRfbm90ZV9kdXJhdGlvbjtcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5uZXh0X25vdGVfZHVyYXRpb24gPSAwO1xuXHRcdFx0XHRcdFx0XHRkdXJhdGlvblNldEJ5UHJldmlvdXNOb3RlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0XHRlbC5kdXJhdGlvbiA9IG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGg7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGUgY2xlZiBpcyBwZXJjdXNzaW9uLCB0aGVyZSBpcyBwcm9iYWJseSBzb21lIHRyYW5zbGF0aW9uIG9mIHRoZSBwaXRjaCB0byBhIHBhcnRpY3VsYXIgZHJ1bSBraXQgaXRlbS5cblx0XHRcdFx0XHRcdGlmICgobXVsdGlsaW5lVmFycy5jbGVmICYmIG11bHRpbGluZVZhcnMuY2xlZi50eXBlID09PSBcInBlcmNcIikgfHxcblx0XHRcdFx0XHRcdFx0KG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlICYmIG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLmNsZWYgPT09IFwicGVyY1wiKSkge1xuXHRcdFx0XHRcdFx0XHR2YXIga2V5ID0gbGluZS5jaGFyQXQoaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZWwuYWNjaWRlbnRhbCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBhY2NNYXAgPSB7ICdkYmxmbGF0JzogJ19fJywgJ2ZsYXQnOiAnXycsICduYXR1cmFsJzogJz0nLCAnc2hhcnAnOiAnXicsICdkYmxzaGFycCc6ICdeXid9O1xuXHRcdFx0XHRcdFx0XHRcdGtleSA9IGFjY01hcFtlbC5hY2NpZGVudGFsXSArIGtleTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodHVuZS5mb3JtYXR0aW5nICYmIHR1bmUuZm9ybWF0dGluZy5taWRpICYmIHR1bmUuZm9ybWF0dGluZy5taWRpLmRydW1tYXApXG5cdFx0XHRcdFx0XHRcdFx0ZWwubWlkaXBpdGNoID0gdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW1hcFtrZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDb21wbGV0ZShzdGF0ZSkpIHtlbC5lbmRDaGFyID0gaW5kZXg7cmV0dXJuIGVsO31cblx0XHRcdFx0XHRlbHNlIHJldHVybiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICcsJzpcblx0XHRcdFx0XHRpZiAoc3RhdGUgPT09ICdvY3RhdmUnKSB7ZWwucGl0Y2ggLT0gNzt9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoaXNDb21wbGV0ZShzdGF0ZSkpIHtlbC5lbmRDaGFyID0gaW5kZXg7cmV0dXJuIGVsO31cblx0XHRcdFx0XHRlbHNlIHJldHVybiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdcXCcnOlxuXHRcdFx0XHRcdGlmIChzdGF0ZSA9PT0gJ29jdGF2ZScpIHtlbC5waXRjaCArPSA3O31cblx0XHRcdFx0XHRlbHNlIGlmIChpc0NvbXBsZXRlKHN0YXRlKSkge2VsLmVuZENoYXIgPSBpbmRleDtyZXR1cm4gZWw7fVxuXHRcdFx0XHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3gnOlxuXHRcdFx0XHRjYXNlICd5Jzpcblx0XHRcdFx0Y2FzZSAneic6XG5cdFx0XHRcdGNhc2UgJ1onOlxuXHRcdFx0XHRcdGlmIChzdGF0ZSA9PT0gJ3N0YXJ0U2x1cicpIHtcblx0XHRcdFx0XHRcdGVsLnJlc3QgPSB7IHR5cGU6IHJlc3RzW2xpbmUuY2hhckF0KGluZGV4KV0gfTtcblx0XHRcdFx0XHRcdC8vIFRoZXJlIHNob3VsZG4ndCBiZSBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgbm90ZXMgaGF2ZS4gSWYgc29tZSBzbmVhayBpbiBkdWUgdG8gYmFkIHN5bnRheCBpbiB0aGUgYWJjIGZpbGUsXG5cdFx0XHRcdFx0XHQvLyBqdXN0IG5peCB0aGVtIGhlcmUuXG5cdFx0XHRcdFx0XHRkZWxldGUgZWwuYWNjaWRlbnRhbDtcblx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5zdGFydFNsdXI7XG5cdFx0XHRcdFx0XHRkZWxldGUgZWwuc3RhcnRUaWU7XG5cdFx0XHRcdFx0XHRkZWxldGUgZWwuZW5kU2x1cjtcblx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5lbmRUaWU7XG5cdFx0XHRcdFx0XHRkZWxldGUgZWwuZW5kX2JlYW07XG5cdFx0XHRcdFx0XHRkZWxldGUgZWwuZ3JhY2Vfbm90ZXM7XG5cdFx0XHRcdFx0XHQvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSB2YWxpZCBub3RlLiBUaGUgcmVzdCBpcyBvcHRpb25hbC4gU2V0IHRoZSBkdXJhdGlvbiBpbiBjYXNlIHdlIGRvbid0IGdldCBvbmUgYmVsb3dcblx0XHRcdFx0XHRcdGlmIChlbC5yZXN0LnR5cGUgPT09ICdtdWx0aW1lYXN1cmUnKSB7XG5cdFx0XHRcdFx0XHRcdGVsLmR1cmF0aW9uID0gMTtcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSAnWmR1cmF0aW9uJztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjYW5IYXZlQnJva2VuUmh5dGhtICYmIG11bHRpbGluZVZhcnMubmV4dF9ub3RlX2R1cmF0aW9uICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBtdWx0aWxpbmVWYXJzLmRlZmF1bHRfbGVuZ3RoICogbXVsdGlsaW5lVmFycy5uZXh0X25vdGVfZHVyYXRpb247XG5cdFx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5uZXh0X25vdGVfZHVyYXRpb24gPSAwO1xuXHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uU2V0QnlQcmV2aW91c05vdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRlbC5kdXJhdGlvbiA9IG11bHRpbGluZVZhcnMuZGVmYXVsdF9sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gJ2R1cmF0aW9uJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzQ29tcGxldGUoc3RhdGUpKSB7ZWwuZW5kQ2hhciA9IGluZGV4O3JldHVybiBlbDt9XG5cdFx0XHRcdFx0ZWxzZSByZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnMSc6XG5cdFx0XHRcdGNhc2UgJzInOlxuXHRcdFx0XHRjYXNlICczJzpcblx0XHRcdFx0Y2FzZSAnNCc6XG5cdFx0XHRcdGNhc2UgJzUnOlxuXHRcdFx0XHRjYXNlICc2Jzpcblx0XHRcdFx0Y2FzZSAnNyc6XG5cdFx0XHRcdGNhc2UgJzgnOlxuXHRcdFx0XHRjYXNlICc5Jzpcblx0XHRcdFx0Y2FzZSAnMCc6XG5cdFx0XHRcdGNhc2UgJy8nOlxuXHRcdFx0XHRcdGlmIChzdGF0ZSA9PT0gJ29jdGF2ZScgfHwgc3RhdGUgPT09ICdkdXJhdGlvbicpIHtcblx0XHRcdFx0XHRcdHZhciBmcmFjdGlvbiA9IHRva2VuaXplci5nZXRGcmFjdGlvbihsaW5lLCBpbmRleCk7XG5cdFx0XHRcdFx0XHQvL2lmICghZHVyYXRpb25TZXRCeVByZXZpb3VzTm90ZSlcblx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBlbC5kdXJhdGlvbiAqIGZyYWN0aW9uLnZhbHVlO1xuXHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IFdlIGNhbiB0ZXN0IHRoZSByZXR1cm5lZCBkdXJhdGlvbiBoZXJlIGFuZCBnaXZlIGEgd2FybmluZyBpZiBpdCBpc24ndCB0aGUgb25lIGV4cGVjdGVkLlxuXHRcdFx0XHRcdFx0ZWwuZW5kQ2hhciA9IGZyYWN0aW9uLmluZGV4O1xuXHRcdFx0XHRcdFx0d2hpbGUgKGZyYWN0aW9uLmluZGV4IDwgbGluZS5sZW5ndGggJiYgKHRva2VuaXplci5pc1doaXRlU3BhY2UobGluZS5jaGFyQXQoZnJhY3Rpb24uaW5kZXgpKSB8fCBsaW5lLmNoYXJBdChmcmFjdGlvbi5pbmRleCkgPT09ICctJykpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KGZyYWN0aW9uLmluZGV4KSA9PT0gJy0nKVxuXHRcdFx0XHRcdFx0XHRcdGVsLnN0YXJ0VGllID0ge307XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRlbCA9IGFkZEVuZEJlYW0oZWwpO1xuXHRcdFx0XHRcdFx0XHRmcmFjdGlvbi5pbmRleCsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aW5kZXggPSBmcmFjdGlvbi5pbmRleC0xO1xuXHRcdFx0XHRcdFx0c3RhdGUgPSAnYnJva2VuX3JoeXRobSc7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gJ3NoYXJwMicpIHtcblx0XHRcdFx0XHRcdGVsLmFjY2lkZW50YWwgPSAncXVhcnRlcnNoYXJwJztzdGF0ZSA9ICdwaXRjaCc7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2ZsYXQyJykge1xuXHRcdFx0XHRcdFx0ZWwuYWNjaWRlbnRhbCA9ICdxdWFydGVyZmxhdCc7c3RhdGUgPSAncGl0Y2gnO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhdGUgPT09ICdaZHVyYXRpb24nKSB7XG5cdFx0XHRcdFx0XHR2YXIgbnVtID0gdG9rZW5pemVyLmdldE51bWJlcihsaW5lLCBpbmRleCk7XG5cdFx0XHRcdFx0XHRlbC5kdXJhdGlvbiA9IG51bS5udW07XG5cdFx0XHRcdFx0XHRlbC5lbmRDaGFyID0gbnVtLmluZGV4O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHRcdH0gZWxzZSByZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnLSc6XG5cdFx0XHRcdFx0aWYgKHN0YXRlID09PSAnc3RhcnRTbHVyJykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCBzbyBpdCBtdXN0IGhhdmUgYmVlbiBtZWFudCBmb3IgdGhlIHByZXZpb3VzIG5vdGUuIENvcnJlY3QgdGhhdCBoZXJlLlxuXHRcdFx0XHRcdFx0dHVuZS5hZGRUaWVUb0xhc3ROb3RlKCk7XG5cdFx0XHRcdFx0XHRlbC5lbmRUaWUgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhdGUgPT09ICdvY3RhdmUnIHx8IHN0YXRlID09PSAnZHVyYXRpb24nIHx8IHN0YXRlID09PSAnZW5kX3NsdXInKSB7XG5cdFx0XHRcdFx0XHRlbC5zdGFydFRpZSA9IHt9O1xuXHRcdFx0XHRcdFx0aWYgKCFkdXJhdGlvblNldEJ5UHJldmlvdXNOb3RlICYmIGNhbkhhdmVCcm9rZW5SaHl0aG0pXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gJ2Jyb2tlbl9yaHl0aG0nO1xuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFBlZWsgYWhlYWQgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiBJZiBpdCBpcyBhIHNwYWNlLCB0aGVuIHdlIGhhdmUgYW4gZW5kIGJlYW0uXG5cdFx0XHRcdFx0XHRcdGlmICh0b2tlbml6ZXIuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckF0KGluZGV4ICsgMSkpKVxuXHRcdFx0XHRcdFx0XHRcdGFkZEVuZEJlYW0oZWwpO1xuXHRcdFx0XHRcdFx0XHRlbC5lbmRDaGFyID0gaW5kZXgrMTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhdGUgPT09ICdicm9rZW5fcmh5dGhtJykge2VsLmVuZENoYXIgPSBpbmRleDtyZXR1cm4gZWw7fVxuXHRcdFx0XHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJyAnOlxuXHRcdFx0XHRjYXNlICdcXHQnOlxuXHRcdFx0XHRcdGlmIChpc0NvbXBsZXRlKHN0YXRlKSkge1xuXHRcdFx0XHRcdFx0ZWwuZW5kX2JlYW0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0Ly8gbG9vayBhaGVhZCB0byBzZWUgaWYgdGhlcmUgaXMgYSB0aWVcblx0XHRcdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KGluZGV4KSA9PT0gJy0nKVxuXHRcdFx0XHRcdFx0XHRcdGVsLnN0YXJ0VGllID0ge307XG5cdFx0XHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0XHR9IHdoaWxlIChpbmRleCA8IGxpbmUubGVuZ3RoICYmICh0b2tlbml6ZXIuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckF0KGluZGV4KSkgfHwgbGluZS5jaGFyQXQoaW5kZXgpID09PSAnLScpKTtcblx0XHRcdFx0XHRcdGVsLmVuZENoYXIgPSBpbmRleDtcblx0XHRcdFx0XHRcdGlmICghZHVyYXRpb25TZXRCeVByZXZpb3VzTm90ZSAmJiBjYW5IYXZlQnJva2VuUmh5dGhtICYmIChsaW5lLmNoYXJBdChpbmRleCkgPT09ICc8JyB8fCBsaW5lLmNoYXJBdChpbmRleCkgPT09ICc+JykpIHtcdC8vIFRPRE8tUEVSOiBEb24ndCBuZWVkIHRoZSB0ZXN0IGZvciA8IGFuZCA+LCBidXQgdGhhdCBtYWtlcyB0aGUgZW5kQ2hhciB3b3JrIG91dCBmb3IgdGhlIHJlZ3Jlc3Npb24gdGVzdC5cblx0XHRcdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSAnYnJva2VuX3JoeXRobSc7XG5cdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHJldHVybiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0Y2FzZSAnPCc6XG5cdFx0XHRcdFx0aWYgKGlzQ29tcGxldGUoc3RhdGUpKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2FuSGF2ZUJyb2tlblJoeXRobSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgYnIyID0gZ2V0QnJva2VuUmh5dGhtKGxpbmUsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0aW5kZXggKz0gYnIyWzBdIC0gMTtcdC8vIGluZGV4IGdldHMgaW5jcmVtZW50ZWQgYmVsb3csIHNvIHdlJ2xsIGxldCB0aGF0IGhhcHBlblxuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm5leHRfbm90ZV9kdXJhdGlvbiA9IGJyMlsyXTtcblx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBicjJbMV0qZWwuZHVyYXRpb247XG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gJ2VuZF9zbHVyJztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGVsLmVuZENoYXIgPSBpbmRleDtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYgKGlzQ29tcGxldGUoc3RhdGUpKSB7XG5cdFx0XHRcdFx0XHRlbC5lbmRDaGFyID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXgrKztcblx0XHRcdGlmIChpbmRleCA9PT0gbGluZS5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKGlzQ29tcGxldGUoc3RhdGUpKSB7ZWwuZW5kQ2hhciA9IGluZGV4O3JldHVybiBlbDt9XG5cdFx0XHRcdGVsc2UgcmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHN0YXJ0TmV3TGluZSgpIHtcblx0XHR2YXIgcGFyYW1zID0geyBzdGFydENoYXI6IC0xLCBlbmRDaGFyOiAtMX07XG5cdFx0aWYgKG11bHRpbGluZVZhcnMucGFydEZvck5leHRMaW5lLnRpdGxlKVxuXHRcdFx0cGFyYW1zLnBhcnQgPSBtdWx0aWxpbmVWYXJzLnBhcnRGb3JOZXh0TGluZTtcblx0XHRwYXJhbXMuY2xlZiA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlICYmIG11bHRpbGluZVZhcnMuc3RhdmVzW211bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtXS5jbGVmICE9PSB1bmRlZmluZWQgPyBwYXJzZUNvbW1vbi5jbG9uZShtdWx0aWxpbmVWYXJzLnN0YXZlc1ttdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGFmZk51bV0uY2xlZikgOiBwYXJzZUNvbW1vbi5jbG9uZShtdWx0aWxpbmVWYXJzLmNsZWYpO1xuXHRcdHZhciBzY29yZVRyYW5zcG9zZSA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlID8gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc2NvcmVUcmFuc3Bvc2UgOiAwO1xuXHRcdHBhcmFtcy5rZXkgPSBwYXJzZUtleVZvaWNlLnN0YW5kYXJkS2V5KG11bHRpbGluZVZhcnMua2V5LnJvb3QrbXVsdGlsaW5lVmFycy5rZXkuYWNjK211bHRpbGluZVZhcnMua2V5Lm1vZGUsIG11bHRpbGluZVZhcnMua2V5LnJvb3QsIG11bHRpbGluZVZhcnMua2V5LmFjYywgc2NvcmVUcmFuc3Bvc2UpO1xuXHRcdHBhcmFtcy5rZXkubW9kZSA9IG11bHRpbGluZVZhcnMua2V5Lm1vZGU7XG5cdFx0aWYgKG11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscylcblx0XHRcdHBhcmFtcy5rZXkuaW1wbGllZE5hdHVyYWxzID0gbXVsdGlsaW5lVmFycy5rZXkuaW1wbGllZE5hdHVyYWxzO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmtleS5leHBsaWNpdEFjY2lkZW50YWxzKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG11bHRpbGluZVZhcnMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGFyYW1zLmtleS5hY2NpZGVudGFscy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdGlmIChwYXJhbXMua2V5LmFjY2lkZW50YWxzW2pdLm5vdGUgPT09IG11bHRpbGluZVZhcnMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHNbaV0ubm90ZSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIG5vdGUgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCwgb3ZlcnJpZGUgaXQgd2l0aCB0aGUgbmV3IHZhbHVlXG5cdFx0XHRcdFx0XHRwYXJhbXMua2V5LmFjY2lkZW50YWxzW2pdLmFjYyA9IG11bHRpbGluZVZhcnMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHNbaV0uYWNjO1xuXHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWZvdW5kKVxuXHRcdFx0XHRcdHBhcmFtcy5rZXkuYWNjaWRlbnRhbHMucHVzaChtdWx0aWxpbmVWYXJzLmtleS5leHBsaWNpdEFjY2lkZW50YWxzW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bXVsdGlsaW5lVmFycy50YXJnZXRLZXkgPSBwYXJhbXMua2V5O1xuXHRcdGlmIChwYXJhbXMua2V5LmV4cGxpY2l0QWNjaWRlbnRhbHMpXG5cdFx0XHRkZWxldGUgcGFyYW1zLmtleS5leHBsaWNpdEFjY2lkZW50YWxzO1xuXHRcdHBhcnNlS2V5Vm9pY2UuYWRkUG9zVG9LZXkocGFyYW1zLmNsZWYsIHBhcmFtcy5rZXkpO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLm1ldGVyICE9PSBudWxsKSB7XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UpIHtcblx0XHRcdFx0cGFyc2VDb21tb24uZWFjaChtdWx0aWxpbmVWYXJzLnN0YXZlcywgZnVuY3Rpb24oc3QpIHtcblx0XHRcdFx0XHRzdC5tZXRlciA9IG11bHRpbGluZVZhcnMubWV0ZXI7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXJhbXMubWV0ZXIgPSBtdWx0aWxpbmVWYXJzLnN0YXZlc1ttdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGFmZk51bV0ubWV0ZXI7XG5cdFx0XHRcdG11bHRpbGluZVZhcnMuc3RhdmVzW211bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtXS5tZXRlciA9IG51bGw7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0cGFyYW1zLm1ldGVyID0gbXVsdGlsaW5lVmFycy5tZXRlcjtcblx0XHRcdG11bHRpbGluZVZhcnMubWV0ZXIgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UgJiYgbXVsdGlsaW5lVmFycy5zdGF2ZXNbbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc3RhZmZOdW1dLm1ldGVyKSB7XG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBlYWNoIHZvaWNlIGdldHMgdGhlIG1ldGVyIG1hcmtpbmcuXG5cdFx0XHRwYXJhbXMubWV0ZXIgPSBtdWx0aWxpbmVWYXJzLnN0YXZlc1ttdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGFmZk51bV0ubWV0ZXI7XG5cdFx0XHRtdWx0aWxpbmVWYXJzLnN0YXZlc1ttdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGFmZk51bV0ubWV0ZXIgPSBudWxsO1xuXHRcdH1cblx0XHRpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UgJiYgbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UubmFtZSlcblx0XHRcdHBhcmFtcy5uYW1lID0gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UubmFtZTtcblx0XHRpZiAobXVsdGlsaW5lVmFycy52b2NhbGZvbnQpXG5cdFx0XHRwYXJhbXMudm9jYWxmb250ID0gbXVsdGlsaW5lVmFycy52b2NhbGZvbnQ7XG5cdFx0aWYgKG11bHRpbGluZVZhcnMudHJpcGxldGZvbnQpXG5cdFx0XHRwYXJhbXMudHJpcGxldGZvbnQgPSBtdWx0aWxpbmVWYXJzLnRyaXBsZXRmb250O1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLnN0eWxlKVxuXHRcdFx0cGFyYW1zLnN0eWxlID0gbXVsdGlsaW5lVmFycy5zdHlsZTtcblx0XHRpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UpIHtcblx0XHRcdHZhciBzdGFmZiA9IG11bHRpbGluZVZhcnMuc3RhdmVzW211bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtXTtcblx0XHRcdGlmIChzdGFmZi5icmFjZSkgcGFyYW1zLmJyYWNlID0gc3RhZmYuYnJhY2U7XG5cdFx0XHRpZiAoc3RhZmYuYnJhY2tldCkgcGFyYW1zLmJyYWNrZXQgPSBzdGFmZi5icmFja2V0O1xuXHRcdFx0aWYgKHN0YWZmLmNvbm5lY3RCYXJMaW5lcykgcGFyYW1zLmNvbm5lY3RCYXJMaW5lcyA9IHN0YWZmLmNvbm5lY3RCYXJMaW5lcztcblx0XHRcdGlmIChzdGFmZi5uYW1lKSBwYXJhbXMubmFtZSA9IHN0YWZmLm5hbWVbbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UuaW5kZXhdO1xuXHRcdFx0aWYgKHN0YWZmLnN1Ym5hbWUpIHBhcmFtcy5zdWJuYW1lID0gc3RhZmYuc3VibmFtZVttdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5pbmRleF07XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc3RlbSlcblx0XHRcdFx0cGFyYW1zLnN0ZW0gPSBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGVtO1xuXHRcdFx0aWYgKG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmbGluZXMpXG5cdFx0XHRcdHBhcmFtcy5zdGFmZmxpbmVzID0gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc3RhZmZsaW5lcztcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdGFmZnNjYWxlKVxuXHRcdFx0XHRwYXJhbXMuc3RhZmZzY2FsZSA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmc2NhbGU7XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc2NhbGUpXG5cdFx0XHRcdHBhcmFtcy5zY2FsZSA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnNjYWxlO1xuXHRcdFx0aWYgKG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0eWxlKVxuXHRcdFx0XHRwYXJhbXMuc3R5bGUgPSBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5zdHlsZTtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS50cmFuc3Bvc2UpXG5cdFx0XHRcdHBhcmFtcy5jbGVmLnRyYW5zcG9zZSA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnRyYW5zcG9zZTtcblx0XHR9XG5cdFx0dmFyIGlzRmlyc3RWb2ljZSA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlID09PSB1bmRlZmluZWQgfHwgKG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtID09PSAgMCAmJiBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZS5pbmRleCA9PT0gIDApO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmJhck51bWJlcnMgPT09IDAgJiYgaXNGaXJzdFZvaWNlICYmIG11bHRpbGluZVZhcnMuY3VyckJhck51bWJlciAhPT0gMSlcblx0XHRcdHBhcmFtcy5iYXJOdW1iZXIgPSBtdWx0aWxpbmVWYXJzLmN1cnJCYXJOdW1iZXI7XG5cdFx0dHVuZS5zdGFydE5ld0xpbmUocGFyYW1zKTtcblx0XHRpZiAobXVsdGlsaW5lVmFycy5rZXkuaW1wbGllZE5hdHVyYWxzKVxuXHRcdFx0ZGVsZXRlIG11bHRpbGluZVZhcnMua2V5LmltcGxpZWROYXR1cmFscztcblxuXHRcdG11bHRpbGluZVZhcnMucGFydEZvck5leHRMaW5lID0ge307XG5cdH1cblxuXHR2YXIgbGV0dGVyX3RvX2dyYWNlID0gIGZ1bmN0aW9uKGxpbmUsIGkpIHtcblx0XHQvLyBHcmFjZSBub3RlcyBhcmUgYW4gYXJyYXkgb2Y6IHN0YXJ0c2x1ciwgbm90ZSwgZW5kc2x1ciwgc3BhY2U7IHdoZXJlIG5vdGUgaXMgYWNjaWRlbnRhbCwgcGl0Y2gsIGR1cmF0aW9uXG5cdFx0aWYgKGxpbmUuY2hhckF0KGkpID09PSAneycpIHtcblx0XHRcdC8vIGZldGNoIHRoZSBncmFjZW5vdGVzIHN0cmluZyBhbmQgY29uc3VtZSB0aGF0IGludG8gdGhlIGFycmF5XG5cdFx0XHR2YXIgZ3JhID0gdG9rZW5pemVyLmdldEJyYWNrZXR0ZWRTdWJzdHJpbmcobGluZSwgaSwgMSwgJ30nKTtcblx0XHRcdGlmICghZ3JhWzJdKVxuXHRcdFx0XHR3YXJuKFwiTWlzc2luZyB0aGUgY2xvc2luZyAnfScgd2hpbGUgcGFyc2luZyBncmFjZSBub3RlXCIsIGxpbmUsIGkpO1xuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBzbHVyIGFmdGVyIHRoZSBncmFjZSBjb25zdHJ1Y3Rpb24sIHRoZW4gbW92ZSBpdCB0byB0aGUgbGFzdCBub3RlIGluc2lkZSB0aGUgZ3JhY2UgY29uc3RydWN0aW9uXG5cdFx0XHRpZiAobGluZVtpK2dyYVswXV0gPT09ICcpJykge1xuXHRcdFx0XHRncmFbMF0rKztcblx0XHRcdFx0Z3JhWzFdICs9ICcpJztcblx0XHRcdH1cblxuXHRcdFx0dmFyIGdyYWNlbm90ZXMgPSBbXTtcblx0XHRcdHZhciBpaSA9IDA7XG5cdFx0XHR2YXIgaW5UaWUgPSBmYWxzZTtcblx0XHRcdHdoaWxlIChpaSA8IGdyYVsxXS5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGFjY2lhY2NhdHVyYSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoZ3JhWzFdLmNoYXJBdChpaSkgPT09ICcvJykge1xuXHRcdFx0XHRcdGFjY2lhY2NhdHVyYSA9IHRydWU7XG5cdFx0XHRcdFx0aWkrKztcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgbm90ZSA9IGdldENvcmVOb3RlKGdyYVsxXSwgaWksIHt9LCBmYWxzZSk7XG5cdFx0XHRcdGlmIChub3RlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIGdyYWNlIG5vdGUgZHVyYXRpb25zIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIGRlZmF1bHQgbGVuZ3RoOiB0aGV5IHNob3VsZCBiZSBiYXNlZCBvbiAxLzE2LCBzbyBpZiB0aGF0IGlzbid0IHRoZSBkZWZhdWx0LCB0aGVuIG11bHRpcGx5IGhlcmUuXG5cdFx0XHRcdFx0bm90ZS5kdXJhdGlvbiA9IG5vdGUuZHVyYXRpb24gLyAobXVsdGlsaW5lVmFycy5kZWZhdWx0X2xlbmd0aCAqIDgpO1xuXHRcdFx0XHRcdGlmIChhY2NpYWNjYXR1cmEpXG5cdFx0XHRcdFx0XHRub3RlLmFjY2lhY2NhdHVyYSA9IHRydWU7XG5cdFx0XHRcdFx0Z3JhY2Vub3Rlcy5wdXNoKG5vdGUpO1xuXG5cdFx0XHRcdFx0aWYgKGluVGllKSB7XG5cdFx0XHRcdFx0XHRub3RlLmVuZFRpZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRpblRpZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobm90ZS5zdGFydFRpZSlcblx0XHRcdFx0XHRcdGluVGllID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlpICA9IG5vdGUuZW5kQ2hhcjtcblx0XHRcdFx0XHRkZWxldGUgbm90ZS5lbmRDaGFyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgYnV0IG5vdGVzIG9yIGEgc3BhY2UgaGVyZSwgc28gcmVwb3J0IGFuIGVycm9yXG5cdFx0XHRcdFx0aWYgKGdyYVsxXS5jaGFyQXQoaWkpID09PSAnICcpIHtcblx0XHRcdFx0XHRcdGlmIChncmFjZW5vdGVzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdGdyYWNlbm90ZXNbZ3JhY2Vub3Rlcy5sZW5ndGgtMV0uZW5kX2JlYW0gPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0d2FybihcIlVua25vd24gY2hhcmFjdGVyICdcIiArIGdyYVsxXS5jaGFyQXQoaWkpICsgXCInIHdoaWxlIHBhcnNpbmcgZ3JhY2Ugbm90ZVwiLCBsaW5lLCBpKTtcblx0XHRcdFx0XHRpaSsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZ3JhY2Vub3Rlcy5sZW5ndGgpXG5cdFx0XHRcdHJldHVybiBbZ3JhWzBdLCBncmFjZW5vdGVzXTtcblx0XHR9XG5cdFx0cmV0dXJuIFsgMCBdO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGxldHRlcl90b19vdmVybGF5KGxpbmUsIGkpIHtcblx0XHRpZiAobGluZS5jaGFyQXQoaSkgPT09ICcmJykge1xuXHRcdFx0dmFyIHN0YXJ0ID0gaTtcblx0XHRcdHdoaWxlIChsaW5lLmNoYXJBdChpKSAmJiBsaW5lLmNoYXJBdChpKSAhPT0gJzonICYmIGxpbmUuY2hhckF0KGkpICE9PSAnfCcpXG5cdFx0XHRcdGkrKztcblx0XHRcdHJldHVybiBbIGktc3RhcnQsIGxpbmUuc3Vic3RyaW5nKHN0YXJ0KzEsIGkpIF07XG5cdFx0fVxuXHRcdHJldHVybiBbIDAgXTtcblx0fVxuXG5cdGZ1bmN0aW9uIGR1cmF0aW9uT2ZNZWFzdXJlKG11bHRpbGluZVZhcnMpIHtcblx0XHQvLyBUT0RPLVBFUjogVGhpcyBjb3VsZCBiZSBtb3JlIGNvbXBsaWNhdGVkIGlmIG9uZSBvZiB0aGUgdW51c3VhbCBtZWFzdXJlcyBpcyB1c2VkLlxuXHRcdHZhciBtZXRlciA9IG11bHRpbGluZVZhcnMub3JpZ01ldGVyO1xuXHRcdGlmICghbWV0ZXIgfHwgbWV0ZXIudHlwZSAhPT0gJ3NwZWNpZmllZCcpXG5cdFx0XHRyZXR1cm4gMTtcblx0XHRpZiAoIW1ldGVyLnZhbHVlIHx8IG1ldGVyLnZhbHVlLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiAxO1xuXHRcdHJldHVybiBwYXJzZUludChtZXRlci52YWx1ZVswXS5udW0sIDEwKSAvIHBhcnNlSW50KG1ldGVyLnZhbHVlWzBdLmRlbiwgMTApO1xuXHR9XG5cblx0Ly9cblx0Ly8gUGFyc2UgbGluZSBvZiBtdXNpY1xuXHQvL1xuXHQvLyBUaGlzIGlzIGEgc3RyZWFtIG9mIDwoYmFyLW1hcmtpbmd8aGVhZGVyfG5vdGUtZ3JvdXApLi4uPiBpbiBhbnkgb3JkZXIsIHdpdGggb3B0aW9uYWwgc3BhY2VzIGJldHdlZW4gZWFjaCBlbGVtZW50XG5cdC8vIGNvcmUtbm90ZSBpcyA8b3Blbi1zbHVyLCBhY2NpZGVudGFsLCBwaXRjaDpyZXF1aXJlZCwgb2N0YXZlLCBkdXJhdGlvbiwgY2xvc2Utc2x1ciZ8dGllPiB3aXRoIG5vIHNwYWNlcyB3aXRoaW4gdGhhdFxuXHQvLyBjaG9yZCBpcyA8b3Blbi1icmFja2V0OnJlcXVpcmVkLCBjb3JlLW5vdGU6cmVxdWlyZWQuLi4gY2xvc2UtYnJhY2tldDpyZXF1aXJlZCBkdXJhdGlvbj4gd2l0aCBubyBzcGFjZXMgd2l0aGluIHRoYXRcblx0Ly8gZ3JhY2Utbm90ZXMgaXMgPG9wZW4tYnJhY2U6cmVxdWlyZWQsIChvcGVuLXNsdXJ8Y29yZS1ub3RlOnJlcXVpcmVkfGNsb3NlLXNsdXIpLi4uLCBjbG9zZS1icmFjZTpyZXF1aXJlZD4gc3BhY2VzIGFyZSBhbGxvd2VkXG5cdC8vIG5vdGUtZ3JvdXAgaXMgPGdyYWNlLW5vdGVzLCBjaG9yZCBzeW1ib2xzJnxkZWNvcmF0aW9ucy4uLiwgZ3JhY2Utbm90ZXMsIHNsdXImfHRyaXBsZXQsIGNob3JkfGNvcmUtbm90ZSwgZW5kLXNsdXJ8dGllPiBzcGFjZXMgYXJlIGFsbG93ZWQgYmV0d2VlbiBpdGVtc1xuXHQvLyBiYXItbWFya2luZyBpcyA8YW1wZXJzYW5kPiBvciA8Y2hvcmQgc3ltYm9scyZ8ZGVjb3JhdGlvbnMuLi4sIGJhcjpyZXF1aXJlZD4gc3BhY2VzIGFsbG93ZWRcblx0Ly8gaGVhZGVyIGlzIDxvcGVuLWJyYWNrZXQ6cmVxdWlyZWQsIEt8TXxMfFY6cmVxdWlyZWQsIGNvbG9uOnJlcXVpcmVkLCBmaWVsZDpyZXF1aXJlZCwgY2xvc2UtYnJhY2tldDpyZXF1aXJlZD4gc3BhY2VzIGNhbiBvY2N1ciBiZXR3ZWVuIHRoZSBjb2xvbiwgaW4gdGhlIGZpZWxkLCBhbmQgYmVmb3JlIHRoZSBjbG9zZSBicmFja2V0XG5cdC8vIGhlYWRlciBjYW4gYWxzbyBiZSB0aGUgb25seSB0aGluZyBvbiBhIGxpbmUuIFRoaXMgaXMgdHJ1ZSBldmVuIGlmIGl0IGlzIGEgY29udGludWF0aW9uIGxpbmUuIEluIHRoaXMgY2FzZSB0aGUgYnJhY2tldHMgYXJlIG5vdCByZXF1aXJlZC5cblx0Ly8gYSBzcGFjZSBpcyBhIGJhY2stdGljaywgYSBzcGFjZSwgb3IgYSB0YWIuIElmIGl0IGlzIGEgYmFjay10aWNrLCB0aGVuIHRoZXJlIGlzIG5vIGVuZC1iZWFtLlxuXG5cdC8vIExpbmUgcHJlcHJvY2Vzc2luZzogYW55dGhpbmcgYWZ0ZXIgYSAlIGlzIGlnbm9yZWQgKHRoZSBkb3VibGUgJSUgc2hvdWxkIGhhdmUgYmVlbiB0YWtlbiBjYXJlIG9mIGJlZm9yZSB0aGlzKVxuXHQvLyBUaGVuLCBhbGwgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZSBpZ25vcmVkLlxuXHQvLyBJZiB0aGVyZSB3YXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgdGhlIFxcbiB3YXMgcmVwbGFjZWQgYnkgYSBcXHIgYW5kIHRoZSBcXCB3YXMgcmVwbGFjZWQgYnkgYSBzcGFjZS4gVGhpcyBhbGxvd3MgdGhlIGNvbnN0cnVjdFxuXHQvLyBvZiBoYXZpbmcgYSBoZWFkZXIgbWlkLWxpbmUgY29uY2VwdHVhbGx5LCBidXQgYWN0dWFsbHkgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiBUaGlzIGlzIGVxdWl2b2xlbnQgdG8gcHV0dGluZyB0aGUgaGVhZGVyIGluIFsgXS5cblxuXHQvLyBUT0RPLVBFUjogSG93IHRvIGhhbmRsZSAhIGZvciBsaW5lIGJyZWFrP1xuXHQvLyBUT0RPLVBFUjogZG90cyBiZWZvcmUgYmFyLCBkb3RzIGJlZm9yZSBzbHVyXG5cdC8vIFRPRE8tUEVSOiBVOiByZWRlZmluYWJsZSBzeW1ib2xzLlxuXG5cdC8vIEFtYmlndW91cyBzeW1ib2xzOlxuXHQvLyBcIltcIiBjYW4gYmUgdGhlIHN0YXJ0IG9mIGEgY2hvcmQsIHRoZSBzdGFydCBvZiBhIGhlYWRlciBlbGVtZW50IG9yIHBhcnQgb2YgYSBiYXIgbGluZS5cblx0Ly8gLS0tIGlmIGl0IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwifFwiLCBpdCBpcyBhIGJhciBsaW5lXG5cdC8vIC0tLSBpZiBpdCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBLOiBMOiBNOiBWOiBpdCBpcyBhIGhlYWRlciAobm90ZTogdGhlcmUgYXJlIG90aGVyIGhlYWRlcnMgbWVudGlvbmVkIGluIHRoZSBzdGFuZGFyZCwgYnV0IEknbSBub3Qgc3VyZSBob3cgdGhleSB3b3VsZCBiZSB1c2VkLilcblx0Ly8gLS0tIG90aGVyd2lzZSBpdCBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgY2hvcmRcblx0Ly8gXCIoXCIgY2FuIGJlIHRoZSBzdGFydCBvZiBhIHNsdXIgb3IgYSB0cmlwbGV0XG5cdC8vIC0tLSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhIG51bWJlciBmcm9tIDItOSwgdGhlbiBpdCBpcyBhIHRyaXBsZXRcblx0Ly8gLS0tIG90aGVyd2lzZSBpdCBpcyBhIHNsdXJcblx0Ly8gXCJdXCJcblx0Ly8gLS0tIGlmIHRoZXJlIGlzIGEgY2hvcmQgb3BlbiwgdGhlbiB0aGlzIGlzIHRoZSBjbG9zZVxuXHQvLyAtLS0gaWYgaXQgaXMgYWZ0ZXIgYSBbfCwgdGhlbiBpdCBpcyBhbiBpbnZpc2libGUgYmFyIGxpbmVcblx0Ly8gLS0tIG90aGVyd2lzZSwgaXQgaXMgcGFyIG9mIGEgYmFyXG5cdC8vIFwiLlwiIGNhbiBiZSBhIGJhciBtb2RpZmllciBvciBhIHNsdXIgbW9kaWZpZXIsIG9yIGEgZGVjb3JhdGlvblxuXHQvLyAtLS0gaWYgaXQgY29tZXMgaW1tZWRpYXRlbHkgYmVmb3JlIGEgYmFyLCBpdCBpcyBhIGJhciBtb2RpZmllclxuXHQvLyAtLS0gaWYgaXQgY29tZXMgaW1tZWRpYXRlbHkgYmVmb3JlIGEgc2x1ciwgaXQgaXMgYSBzbHVyIG1vZGlmaWVyXG5cdC8vIC0tLSBvdGhlcndpc2UgaXQgaXMgYSBkZWNvcmF0aW9uIGZvciB0aGUgbmV4dCBub3RlLlxuXHQvLyBudW1iZXI6XG5cdC8vIC0tLSBpZiBpdCBpcyBhZnRlciBhIGJhciwgd2l0aCBubyBzcGFjZSwgaXQgaXMgYW4gZW5kaW5nIG1hcmtlclxuXHQvLyAtLS0gaWYgaXQgaXMgYWZ0ZXIgYSAoIHdpdGggbm8gc3BhY2UsIGl0IGlzIGEgdHJpcGxldCBjb3VudFxuXHQvLyAtLS0gaWYgaXQgaXMgYWZ0ZXIgYSBwaXRjaCBvciBvY3RhdmUgb3Igc2xhc2gsIHRoZW4gaXQgaXMgYSBkdXJhdGlvblxuXG5cdC8vIFVuYW1iaWd1b3VzIHN5bWJvbHMgKGV4Y2VwdCBpbnNpZGUgcXVvdGVkIHN0cmluZ3MpOlxuXHQvLyB2ZXJ0aWNhbC1iYXIsIGNvbG9uOiBwYXJ0IG9mIGEgYmFyXG5cdC8vIEFCQ0RFRkdhYmNkZWZnOiBwaXRjaFxuXHQvLyB4eXpaOiByZXN0XG5cdC8vIGNvbW1hLCBwcmltZTogb2N0YXZlXG5cdC8vIGNsb3NlLXBhcmVuOiBlbmQtc2x1clxuXHQvLyBoeXBoZW46IHRpZVxuXHQvLyB0aWxkZSwgdiwgdSwgYmFuZywgcGx1cywgVEhMTVBTTzogZGVjb3JhdGlvblxuXHQvLyBjYXJhdCwgdW5kZXJzY29yZSwgZXF1YWw6IGFjY2lkZW50YWxcblx0Ly8gYW1wZXJzYW5kOiB0aW1lIHJlc2V0XG5cdC8vIG9wZW4tY3VybHksIGNsb3NlLWN1cmx5OiBncmFjZSBub3Rlc1xuXHQvLyBkb3VibGUtcXVvdGU6IGNob3JkIHN5bWJvbFxuXHQvLyBsZXNzLXRoYW4sIGdyZWF0ZXItdGhhbiwgc2xhc2g6IGR1cmF0aW9uXG5cdC8vIGJhY2stdGljaywgc3BhY2UsIHRhYjogc3BhY2Vcblx0dmFyIG5vbkRlY29yYXRpb25zID0gXCJBQkNERUZHYWJjZGVmZ3h5elpbXXxeX3tcIjtcdC8vIHVzZSB0aGlzIHRvIHByZXNjcmVlbiBzbyB3ZSBkb24ndCBoYXZlIHRvIGxvb2sgZm9yIGEgZGVjb3JhdGlvbiBhdCBldmVyeSBub3RlLlxuXG5cdHZhciBwYXJzZVJlZ3VsYXJNdXNpY0xpbmUgPSBmdW5jdGlvbihsaW5lKSB7XG5cdFx0aGVhZGVyLnJlc29sdmVUZW1wbygpO1xuXHRcdC8vbXVsdGlsaW5lVmFycy5oYXZlbnRfc2V0X2xlbmd0aCA9IGZhbHNlO1x0Ly8gVG8gbGF0ZSB0byBzZXQgdGhpcyBub3cuXG5cdFx0bXVsdGlsaW5lVmFycy5pc19pbl9oZWFkZXIgPSBmYWxzZTtcdC8vIFdlIHNob3VsZCBoYXZlIGdvdHRlbiBhIGtleSBoZWFkZXIgYnkgbm93LCBidXQganVzdCBpbiBjYXNlLCB0aGlzIGlzIGRlZmluaXRlbHkgb3V0IG9mIHRoZSBoZWFkZXIuXG5cdFx0dmFyIGkgPSAwO1xuXHRcdHZhciBzdGFydE9mTGluZSA9IG11bHRpbGluZVZhcnMuaUNoYXI7XG5cdFx0Ly8gc2VlIGlmIHRoZXJlIGlzIG5vdGhpbmcgYnV0IGEgY29tbWVudCBvbiB0aGlzIGxpbmUuIElmIHNvLCBqdXN0IGlnbm9yZSBpdC4gQSBmdWxsIGxpbmUgY29tbWVudCBpcyBvcHRpb25hbCB3aGl0ZSBzcGFjZSBmb2xsb3dlZCBieSAlXG5cdFx0d2hpbGUgKHRva2VuaXplci5pc1doaXRlU3BhY2UobGluZS5jaGFyQXQoaSkpICYmIGkgPCBsaW5lLmxlbmd0aClcblx0XHRcdGkrKztcblx0XHRpZiAoaSA9PT0gbGluZS5sZW5ndGggfHwgbGluZS5jaGFyQXQoaSkgPT09ICclJylcblx0XHRcdHJldHVybjtcblxuXHRcdC8vIFN0YXJ0IHdpdGggdGhlIHN0YW5kYXJkIHN0YWZmLCBjbGVmIGFuZCBrZXkgc3ltYm9scyBvbiBlYWNoIGxpbmVcblx0XHR2YXIgZGVsYXlTdGFydE5ld0xpbmUgPSBtdWx0aWxpbmVWYXJzLnN0YXJ0X25ld19saW5lO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmNvbnRpbnVlYWxsID09PSB1bmRlZmluZWQpXG5cdFx0XHRtdWx0aWxpbmVWYXJzLnN0YXJ0X25ld19saW5lID0gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0XHRtdWx0aWxpbmVWYXJzLnN0YXJ0X25ld19saW5lID0gZmFsc2U7XG5cdFx0dmFyIHRyaXBsZXROb3Rlc0xlZnQgPSAwO1xuXG5cdFx0Ly8gU2VlIGlmIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgaGVhZGVyIGZpZWxkXG5cdFx0dmFyIHJldEhlYWRlciA9IGhlYWRlci5sZXR0ZXJfdG9fYm9keV9oZWFkZXIobGluZSwgaSk7XG5cdFx0aWYgKHJldEhlYWRlclswXSA+IDApIHtcblx0XHRcdGkgKz0gcmV0SGVhZGVyWzBdO1xuXHRcdFx0aWYgKHJldEhlYWRlclsxXSA9PT0gJ1YnKVxuXHRcdFx0XHRkZWxheVN0YXJ0TmV3TGluZSA9IHRydWU7IC8vIGZpeGVzIGJ1ZyBvbiB0aGlzOiBjW1Y6Ml1kXG5cdFx0XHQvLyBUT0RPLVBFUjogSGFuZGxlIGlubGluZSBoZWFkZXJzXG5cdFx0fVxuXHRcdHZhciBlbCA9IHsgfTtcblxuXHRcdHZhciBvdmVybGF5TGV2ZWwgPSAwO1xuXHRcdHdoaWxlIChpIDwgbGluZS5sZW5ndGgpXG5cdFx0e1xuXHRcdFx0dmFyIHN0YXJ0SSA9IGk7XG5cdFx0XHRpZiAobGluZS5jaGFyQXQoaSkgPT09ICclJylcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdHZhciByZXRJbmxpbmVIZWFkZXIgPSBoZWFkZXIubGV0dGVyX3RvX2lubGluZV9oZWFkZXIobGluZSwgaSk7XG5cdFx0XHRpZiAocmV0SW5saW5lSGVhZGVyWzBdID4gMCkge1xuXHRcdFx0XHRcdGkgKz0gcmV0SW5saW5lSGVhZGVyWzBdO1xuXHRcdFx0XHRcdGlmIChyZXRJbmxpbmVIZWFkZXJbMV0gPT09ICdWJylcblx0XHRcdFx0XHRcdGRlbGF5U3RhcnROZXdMaW5lID0gdHJ1ZTsgLy8gZml4ZXMgYnVnIG9uIHRoaXM6IGNbVjoyXWRcblx0XHRcdFx0XHQvLyBUT0RPLVBFUjogSGFuZGxlIGlubGluZSBoZWFkZXJzXG5cdFx0XHRcdFx0Ly9tdWx0aWxpbmVWYXJzLnN0YXJ0X25ld19saW5lID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXYWl0IHVudGlsIGhlcmUgdG8gYWN0dWFsbHkgc3RhcnQgdGhlIGxpbmUgYmVjYXVzZSB3ZSBrbm93IHdlJ3JlIHBhc3QgdGhlIGlubGluZSBzdGF0ZW1lbnRzLlxuXHRcdFx0XHRpZiAoZGVsYXlTdGFydE5ld0xpbmUpIHtcblx0XHRcdFx0XHRzdGFydE5ld0xpbmUoKTtcblx0XHRcdFx0XHRkZWxheVN0YXJ0TmV3TGluZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBkZWNpZGUgaWYgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBhIGJhci1tYXJraW5nIG9yIGEgbm90ZS1ncm91cC5cblx0XHRcdFx0Ly8gVW5mb3J0dW5hdGVseSwgdGhhdCBpcyBhbWJpZ3VvdXMuIEJvdGggY2FuIGNvbnRhaW4gY2hvcmQgc3ltYm9scyBhbmQgZGVjb3JhdGlvbnMuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgZ3JhY2Ugbm90ZSBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBjaG9yZCBzeW1ib2xzIGFuZCBkZWNvcmF0aW9ucywgdGhlbiBpdCBpcyBkZWZpbml0ZWx5IGEgbm90ZS1ncm91cC5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBiYXIgbWFya2VyLCBpdCBpcyBkZWZpbml0ZWx5IGEgYmFyLW1hcmtpbmcuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGVpdGhlciBhIGNvcmUtbm90ZSBvciBjaG9yZCwgaXQgaXMgZGVmaW5pdGVseSBhIG5vdGUtZ3JvdXAuXG5cdFx0XHRcdC8vIFNvLCBsb29wIHdoaWxlIHdlIGZpbmQgZ3JhY2Utbm90ZXMsIGNob3Jkcy1zeW1ib2xzLCBvciBkZWNvcmF0aW9ucy4gW0l0IGlzIGFuIGVycm9yIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBncmFjZS1ub3RlIGdyb3VwIGluIGEgcm93OyB0aGUgb3RoZXJzIGNhbiBiZSBtdWx0aXBsZV1cblx0XHRcdFx0Ly8gVGhlbiwgaWYgdGhlcmUgaXMgYSBncmFjZS1ub3RlLCB3ZSBrbm93IHdoZXJlIHRvIGdvLlxuXHRcdFx0XHQvLyBFbHNlIHNlZSBpZiB3ZSBoYXZlIGEgY2hvcmQsIGNvcmUtbm90ZSwgc2x1ciwgdHJpcGxldCwgb3IgYmFyLlxuXG5cdFx0XHRcdHZhciByZXQ7XG5cdFx0XHRcdHdoaWxlICgxKSB7XG5cdFx0XHRcdFx0cmV0ID0gdG9rZW5pemVyLmVhdFdoaXRlU3BhY2UobGluZSwgaSk7XG5cdFx0XHRcdFx0aWYgKHJldCA+IDApIHtcblx0XHRcdFx0XHRcdGkgKz0gcmV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaSA+IDAgJiYgbGluZS5jaGFyQXQoaS0xKSA9PT0gJ1xceDEyJykge1xuXHRcdFx0XHRcdFx0Ly8gdGhlcmUgaXMgb25lIGNhc2Ugd2hlcmUgYSBsaW5lIGNvbnRpbnVhdGlvbiBpc24ndCB0aGUgc2FtZSBhcyBiZWluZyBvbiB0aGUgc2FtZSBsaW5lLCBhbmQgdGhhdCBpcyBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgaXQgaXMgYSBoZWFkZXIuXG5cdFx0XHRcdFx0XHRyZXQgPSBoZWFkZXIubGV0dGVyX3RvX2JvZHlfaGVhZGVyKGxpbmUsIGkpO1xuXHRcdFx0XHRcdFx0aWYgKHJldFswXSA+IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJldFsxXSA9PT0gJ1YnKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0TmV3TGluZSgpOyAvLyBmaXhlcyBidWcgb24gdGhpczogY1xcXFxuVjoyXVxcXFxuZFxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBpbnNlcnQgaGVhZGVyIGhlcmVcblx0XHRcdFx0XHRcdFx0aSA9IHJldFswXTtcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5zdGFydF9uZXdfbGluZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBnYXRoZXIgYWxsIHRoZSBncmFjZSBub3RlcywgY2hvcmQgc3ltYm9scyBhbmQgZGVjb3JhdGlvbnNcblx0XHRcdFx0XHRyZXQgPSBsZXR0ZXJfdG9fc3BhY2VyKGxpbmUsIGkpO1xuXHRcdFx0XHRcdGlmIChyZXRbMF0gPiAwKSB7XG5cdFx0XHRcdFx0XHRpICs9IHJldFswXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXQgPSBsZXR0ZXJfdG9fY2hvcmQobGluZSwgaSk7XG5cdFx0XHRcdFx0aWYgKHJldFswXSA+IDApIHtcblx0XHRcdFx0XHRcdC8vIFRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgY2hvcmQgaGVyZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IHBvc2l0aW9ucy5cblx0XHRcdFx0XHRcdC8vIElmIHR3byBjaG9yZHMgaGF2ZSB0aGUgc2FtZSBwb3NpdGlvbiwgdGhlbiBjb25uZWN0IHRoZW0gd2l0aCBuZXdsaW5lLlxuXHRcdFx0XHRcdFx0aWYgKCFlbC5jaG9yZClcblx0XHRcdFx0XHRcdFx0ZWwuY2hvcmQgPSBbXTtcblx0XHRcdFx0XHRcdHZhciBjaG9yZE5hbWUgPSB0b2tlbml6ZXIudHJhbnNsYXRlU3RyaW5nKHJldFsxXSk7XG5cdFx0XHRcdFx0XHRjaG9yZE5hbWUgPSBjaG9yZE5hbWUucmVwbGFjZSgvOy9nLCBcIlxcblwiKTtcblx0XHRcdFx0XHRcdHZhciBhZGRlZENob3JkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBjaSA9IDA7IGNpIDwgZWwuY2hvcmQubGVuZ3RoOyBjaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbC5jaG9yZFtjaV0ucG9zaXRpb24gPT09IHJldFsyXSkge1xuXHRcdFx0XHRcdFx0XHRcdGFkZGVkQ2hvcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGVsLmNob3JkW2NpXS5uYW1lICs9IFwiXFxuXCIgKyBjaG9yZE5hbWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhZGRlZENob3JkID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAocmV0WzJdID09PSBudWxsICYmIHJldFszXSlcblx0XHRcdFx0XHRcdFx0XHRlbC5jaG9yZC5wdXNoKHtuYW1lOiBjaG9yZE5hbWUsIHJlbF9wb3NpdGlvbjogcmV0WzNdfSk7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRlbC5jaG9yZC5wdXNoKHtuYW1lOiBjaG9yZE5hbWUsIHBvc2l0aW9uOiByZXRbMl19KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aSArPSByZXRbMF07XG5cdFx0XHRcdFx0XHR2YXIgaWkgPSB0b2tlbml6ZXIuc2tpcFdoaXRlU3BhY2UobGluZS5zdWJzdHJpbmcoaSkpO1xuXHRcdFx0XHRcdFx0aWYgKGlpID4gMClcblx0XHRcdFx0XHRcdFx0ZWwuZm9yY2VfZW5kX2JlYW1fbGFzdCA9IHRydWU7XG5cdFx0XHRcdFx0XHRpICs9IGlpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAobm9uRGVjb3JhdGlvbnMuaW5kZXhPZihsaW5lLmNoYXJBdChpKSkgPT09IC0xKVxuXHRcdFx0XHRcdFx0XHRyZXQgPSBsZXR0ZXJfdG9fYWNjZW50KGxpbmUsIGkpO1xuXHRcdFx0XHRcdFx0ZWxzZSByZXQgPSBbIDAgXTtcblx0XHRcdFx0XHRcdGlmIChyZXRbMF0gPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXRbMV0gPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoaSArIDEgPCBsaW5lLmxlbmd0aClcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0TmV3TGluZSgpO1x0Ly8gVGhlcmUgd2FzIGEgISBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lLiBTdGFydCBhIG5ldyBsaW5lIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFmdGVyIGl0LlxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHJldFsxXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHJldFsxXS5pbmRleE9mKFwic3R5bGU9XCIpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5zdHlsZSA9IHJldFsxXS5zdWJzdHIoNik7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbC5kZWNvcmF0aW9uID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsLmRlY29yYXRpb24gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGVsLmRlY29yYXRpb24ucHVzaChyZXRbMV0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpICs9IHJldFswXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldCA9IGxldHRlcl90b19ncmFjZShsaW5lLCBpKTtcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IEJlIHN1cmUgdGhlcmUgYXJlbid0IGFscmVhZHkgZ3JhY2Ugbm90ZXMgZGVmaW5lZC4gVGhhdCBpcyBhbiBlcnJvci5cblx0XHRcdFx0XHRcdFx0aWYgKHJldFswXSA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRlbC5ncmFjZW5vdGVzID0gcmV0WzFdO1xuXHRcdFx0XHRcdFx0XHRcdGkgKz0gcmV0WzBdO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBsZXR0ZXJfdG9fYmFyKGxpbmUsIGkpO1xuXHRcdFx0XHRpZiAocmV0WzBdID4gMCkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZGVmaW5pdGVseSBhIGJhclxuXHRcdFx0XHRcdG92ZXJsYXlMZXZlbCA9IDA7XG5cdFx0XHRcdFx0aWYgKGVsLmdyYWNlbm90ZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBncmFjZSBub3RlIHRvIGFuIGludmlzaWJsZSBub3RlXG5cdFx0XHRcdFx0XHRlbC5yZXN0ID0geyB0eXBlOiAnc3BhY2VyJyB9O1xuXHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSAwLjEyNTsgLy8gVE9ETy1QRVI6IEkgZG9uJ3QgdGhpbmsgdGhlIGR1cmF0aW9uIG9mIHRoaXMgbWF0dGVycyBtdWNoLCBidXQgZmlndXJlIG91dCBpZiBpdCBkb2VzLlxuXHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5hZGRGb3JtYXR0aW5nT3B0aW9ucyhlbCwgdHVuZS5mb3JtYXR0aW5nLCAnbm90ZScpO1xuXHRcdFx0XHRcdFx0dHVuZS5hcHBlbmRFbGVtZW50KCdub3RlJywgc3RhcnRPZkxpbmUraSwgc3RhcnRPZkxpbmUraStyZXRbMF0sIGVsKTtcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMubWVhc3VyZU5vdEVtcHR5ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGVsID0ge307XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBiYXIgPSB7dHlwZTogcmV0WzFdfTtcblx0XHRcdFx0XHRpZiAoYmFyLnR5cGUubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0d2FybihcIlVua25vd24gYmFyIHR5cGVcIiwgbGluZSwgaSk7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5pbkVuZGluZyAmJiBiYXIudHlwZSAhPT0gJ2Jhcl90aGluJykge1xuXHRcdFx0XHRcdFx0XHRiYXIuZW5kRW5kaW5nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5pbkVuZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHJldFsyXSkge1xuXHRcdFx0XHRcdFx0XHRiYXIuc3RhcnRFbmRpbmcgPSByZXRbMl07XG5cdFx0XHRcdFx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmluRW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdGJhci5lbmRFbmRpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmluRW5kaW5nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChlbC5kZWNvcmF0aW9uICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdGJhci5kZWNvcmF0aW9uID0gZWwuZGVjb3JhdGlvbjtcblx0XHRcdFx0XHRcdGlmIChlbC5jaG9yZCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHRiYXIuY2hvcmQgPSBlbC5jaG9yZDtcblx0XHRcdFx0XHRcdGlmIChiYXIuc3RhcnRFbmRpbmcgJiYgbXVsdGlsaW5lVmFycy5iYXJGaXJzdEVuZGluZ051bSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmJhckZpcnN0RW5kaW5nTnVtID0gbXVsdGlsaW5lVmFycy5jdXJyQmFyTnVtYmVyO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAoYmFyLnN0YXJ0RW5kaW5nICYmIGJhci5lbmRFbmRpbmcgJiYgbXVsdGlsaW5lVmFycy5iYXJGaXJzdEVuZGluZ051bSlcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5jdXJyQmFyTnVtYmVyID0gbXVsdGlsaW5lVmFycy5iYXJGaXJzdEVuZGluZ051bTtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKGJhci5lbmRFbmRpbmcpXG5cdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuYmFyRmlyc3RFbmRpbmdOdW0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRpZiAoYmFyLnR5cGUgIT09ICdiYXJfaW52aXNpYmxlJyAmJiBtdWx0aWxpbmVWYXJzLm1lYXN1cmVOb3RFbXB0eSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgaXNGaXJzdFZvaWNlID0gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UgPT09IHVuZGVmaW5lZCB8fCAobXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2Uuc3RhZmZOdW0gPT09ICAwICYmIG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLmluZGV4ID09PSAgMCk7XG5cdFx0XHRcdFx0XHRcdGlmIChpc0ZpcnN0Vm9pY2UpIHtcblx0XHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLmN1cnJCYXJOdW1iZXIrKztcblx0XHRcdFx0XHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5iYXJOdW1iZXJzICYmIG11bHRpbGluZVZhcnMuY3VyckJhck51bWJlciAlIG11bHRpbGluZVZhcnMuYmFyTnVtYmVycyA9PT0gMClcblx0XHRcdFx0XHRcdFx0XHRcdGJhci5iYXJOdW1iZXIgPSBtdWx0aWxpbmVWYXJzLmN1cnJCYXJOdW1iZXI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuYWRkRm9ybWF0dGluZ09wdGlvbnMoZWwsIHR1bmUuZm9ybWF0dGluZywgJ2JhcicpO1xuXHRcdFx0XHRcdFx0dHVuZS5hcHBlbmRFbGVtZW50KCdiYXInLCBzdGFydE9mTGluZStpLCBzdGFydE9mTGluZStpK3JldFswXSwgYmFyKTtcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMubWVhc3VyZU5vdEVtcHR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRlbCA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpICs9IHJldFswXTtcblx0XHRcdFx0XHR2YXIgY3YgPSBtdWx0aWxpbmVWYXJzLmN1cnJlbnRWb2ljZSA/IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlLnN0YWZmTnVtICsgJy0nICsgbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UuaW5kZXggOiAnT05MWSc7XG5cdFx0XHRcdFx0Ly8gaWYgKG11bHRpbGluZVZhcnMubGluZUJyZWFrcykge1xuXHRcdFx0XHRcdC8vIFx0aWYgKCFtdWx0aWxpbmVWYXJzLmJhckNvdW50ZXJbY3ZdKVxuXHRcdFx0XHRcdC8vIFx0XHRtdWx0aWxpbmVWYXJzLmJhckNvdW50ZXJbY3ZdID0gMDtcblx0XHRcdFx0XHQvLyBcdHZhciBicmVha05vdyA9IG11bHRpbGluZVZhcnMubGluZUJyZWFrc1snJyttdWx0aWxpbmVWYXJzLmJhckNvdW50ZXJbY3ZdXTtcblx0XHRcdFx0XHQvLyBcdG11bHRpbGluZVZhcnMuYmFyQ291bnRlcltjdl0rKztcblx0XHRcdFx0XHQvLyBcdGlmIChicmVha05vdylcblx0XHRcdFx0XHQvLyBcdFx0c3RhcnROZXdMaW5lKCk7XG5cdFx0XHRcdFx0Ly8gfVxuXHRcdFx0XHR9IGVsc2UgaWYgKGxpbmVbaV0gPT09ICcmJykge1x0Ly8gYmFja3RyYWNrIHRvIGJlZ2lubmluZyBvZiBtZWFzdXJlXG5cdFx0XHRcdFx0cmV0ID0gbGV0dGVyX3RvX292ZXJsYXkobGluZSwgaSk7XG5cdFx0XHRcdFx0aWYgKHJldFswXSA+IDApIHtcblx0XHRcdFx0XHRcdHR1bmUuYXBwZW5kRWxlbWVudCgnb3ZlcmxheScsIHN0YXJ0T2ZMaW5lLCBzdGFydE9mTGluZSsxLCB7fSk7XG5cdFx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdFx0XHRvdmVybGF5TGV2ZWwrKztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGRlZmluaXRlbHkgYSBub3RlIGdyb3VwXG5cdFx0XHRcdFx0Ly9cblx0XHRcdFx0XHQvLyBMb29rIGZvciBhcyBtYW55IG9wZW4gc2x1cnMgYW5kIHRyaXBsZXRzIGFzIHRoZXJlIGFyZS4gKE5vdGU6IG9ubHkgdGhlIGZpcnN0IHRyaXBsZXQgaXMgdmFsaWQuKVxuXHRcdFx0XHRcdHJldCA9IGxldHRlcl90b19vcGVuX3NsdXJzX2FuZF90cmlwbGV0cyhsaW5lLCBpKTtcblx0XHRcdFx0XHRpZiAocmV0LmNvbnN1bWVkID4gMCkge1xuXHRcdFx0XHRcdFx0aWYgKHJldC5zdGFydFNsdXIgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdFx0ZWwuc3RhcnRTbHVyID0gcmV0LnN0YXJ0U2x1cjtcblx0XHRcdFx0XHRcdGlmIChyZXQudHJpcGxldCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0cmlwbGV0Tm90ZXNMZWZ0ID4gMClcblx0XHRcdFx0XHRcdFx0XHR3YXJuKFwiQ2FuJ3QgbmVzdCB0cmlwbGV0c1wiLCBsaW5lLCBpKTtcblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0ZWwuc3RhcnRUcmlwbGV0ID0gcmV0LnRyaXBsZXQ7XG5cdFx0XHRcdFx0XHRcdFx0ZWwudHJpcGxldE11bHRpcGxpZXIgPSByZXQudHJpcGxldFEgLyByZXQudHJpcGxldDtcblx0XHRcdFx0XHRcdFx0XHR0cmlwbGV0Tm90ZXNMZWZ0ID0gcmV0Lm51bV9ub3RlcyA9PT0gdW5kZWZpbmVkID8gcmV0LnRyaXBsZXQgOiByZXQubnVtX25vdGVzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpICs9IHJldC5jb25zdW1lZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgY2hvcmRzLlxuXHRcdFx0XHRcdGlmIChsaW5lLmNoYXJBdChpKSA9PT0gJ1snKSB7XG5cdFx0XHRcdFx0XHR2YXIgY2hvcmRTdGFydENoYXIgPSBpO1xuXHRcdFx0XHRcdFx0aSsrO1xuXHRcdFx0XHRcdFx0dmFyIGNob3JkRHVyYXRpb24gPSBudWxsO1xuXHRcdFx0XHRcdFx0dmFyIHJlbWVtYmVyRW5kQmVhbSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHR2YXIgZG9uZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCFkb25lKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhY2NlbnQgPSBsZXR0ZXJfdG9fYWNjZW50KGxpbmUsIGkpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYWNjZW50WzBdID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGkgKz0gYWNjZW50WzBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dmFyIGNob3JkTm90ZSA9IGdldENvcmVOb3RlKGxpbmUsIGksIHt9LCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChjaG9yZE5vdGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWNjZW50WzBdID4gMCkgeyAvLyBJZiB3ZSBmb3VuZCBhIGRlY29yYXRpb24gYWJvdmUsIGl0IG1vZGlmaWVzIHRoZSBlbnRpcmUgY2hvcmQuIFwic3R5bGVcIiBpcyBoYW5kbGVkIGJlbG93LlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjY2VudFsxXS5pbmRleE9mKFwic3R5bGU9XCIpICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbC5kZWNvcmF0aW9uID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuZGVjb3JhdGlvbiA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5kZWNvcmF0aW9uLnB1c2goYWNjZW50WzFdKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNob3JkTm90ZS5lbmRfYmVhbSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuZW5kX2JlYW0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIGNob3JkTm90ZS5lbmRfYmVhbTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsLnBpdGNoZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBjaG9yZE5vdGUuZHVyYXRpb247XG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5waXRjaGVzID0gWyBjaG9yZE5vdGUgXTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2VcdC8vIEp1c3QgaWdub3JlIHRoZSBub3RlIGxlbmd0aHMgb2YgYWxsIGJ1dCB0aGUgZmlyc3Qgbm90ZS4gVGhlIHN0YW5kYXJkIGlzbid0IGNsZWFyIGhlcmUsIGJ1dCB0aGlzIHNlZW1zIGxlc3MgY29uZnVzaW5nLlxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwucGl0Y2hlcy5wdXNoKGNob3JkTm90ZSk7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIGNob3JkTm90ZS5kdXJhdGlvbjtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWNjZW50WzBdID4gMCkgeyAvLyBJZiB3ZSBmb3VuZCBhIHN0eWxlIGFib3ZlLCBpdCBtb2RpZmllcyB0aGUgaW5kaXZpZHVhbCBwaXRjaCwgbm90IHRoZSBlbnRpcmUgY2hvcmQuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWNjZW50WzFdLmluZGV4T2YoXCJzdHlsZT1cIikgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwucGl0Y2hlc1tlbC5waXRjaGVzLmxlbmd0aC0xXS5zdHlsZSA9IGFjY2VudFsxXS5zdWJzdHIoNik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG11bHRpbGluZVZhcnMuaW5UaWVDaG9yZFtlbC5waXRjaGVzLmxlbmd0aF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNob3JkTm90ZS5lbmRUaWUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5pblRpZUNob3JkW2VsLnBpdGNoZXMubGVuZ3RoXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNob3JkTm90ZS5zdGFydFRpZSlcblx0XHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuaW5UaWVDaG9yZFtlbC5waXRjaGVzLmxlbmd0aF0gPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdFx0aSAgPSBjaG9yZE5vdGUuZW5kQ2hhcjtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgY2hvcmROb3RlLmVuZENoYXI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGluZS5jaGFyQXQoaSkgPT09ICcgJykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gY2hvcmRzLCBidXQgd2UgY2FuIHJlY292ZXIgZnJvbSBpdCBieSBpZ25vcmluZyBpdC5cblx0XHRcdFx0XHRcdFx0XHR3YXJuKFwiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBjaG9yZHNcIiwgbGluZSwgaSk7XG5cdFx0XHRcdFx0XHRcdFx0aSsrO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChpIDwgbGluZS5sZW5ndGggJiYgbGluZS5jaGFyQXQoaSkgPT09ICddJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY29uc3VtZSB0aGUgY2xvc2UgYnJhY2tldFxuXHRcdFx0XHRcdFx0XHRcdFx0aSsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5uZXh0X25vdGVfZHVyYXRpb24gIT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBlbC5kdXJhdGlvbiAqIG11bHRpbGluZVZhcnMubmV4dF9ub3RlX2R1cmF0aW9uO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm5leHRfbm90ZV9kdXJhdGlvbiA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChpc0luVGllKG11bHRpbGluZVZhcnMsICBvdmVybGF5TGV2ZWwsIGVsKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJzZUNvbW1vbi5lYWNoKGVsLnBpdGNoZXMsIGZ1bmN0aW9uKHBpdGNoKSB7IHBpdGNoLmVuZFRpZSA9IHRydWU7IH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZXRJc0luVGllKG11bHRpbGluZVZhcnMsICBvdmVybGF5TGV2ZWwsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRyaXBsZXROb3Rlc0xlZnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyaXBsZXROb3Rlc0xlZnQtLTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRyaXBsZXROb3Rlc0xlZnQgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5lbmRUcmlwbGV0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcG9zdENob3JkRG9uZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGkgPCBsaW5lLmxlbmd0aCAmJiAhcG9zdENob3JkRG9uZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnICc6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnXFx0Jzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFkZEVuZEJlYW0oZWwpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnKSc6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWwuZW5kU2x1ciA9PT0gdW5kZWZpbmVkKSBlbC5lbmRTbHVyID0gMTsgZWxzZSBlbC5lbmRTbHVyKys7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlICctJzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcnNlQ29tbW9uLmVhY2goZWwucGl0Y2hlcywgZnVuY3Rpb24ocGl0Y2gpIHsgcGl0Y2guc3RhcnRUaWUgPSB7fTsgfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZXRJc0luVGllKG11bHRpbGluZVZhcnMsICBvdmVybGF5TGV2ZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnPic6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnPCc6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgYnIyID0gZ2V0QnJva2VuUmh5dGhtKGxpbmUsIGkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aSArPSBicjJbMF0gLSAxO1x0Ly8gaW5kZXggZ2V0cyBpbmNyZW1lbnRlZCBiZWxvdywgc28gd2UnbGwgbGV0IHRoYXQgaGFwcGVuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm5leHRfbm90ZV9kdXJhdGlvbiA9IGJyMlsyXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaG9yZER1cmF0aW9uKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaG9yZER1cmF0aW9uID0gY2hvcmREdXJhdGlvbiAqIGJyMlsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hvcmREdXJhdGlvbiA9IGJyMlsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzEnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzInOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzMnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzQnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzUnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzYnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzcnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzgnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJzknOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJy8nOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGZyYWN0aW9uID0gdG9rZW5pemVyLmdldEZyYWN0aW9uKGxpbmUsIGkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hvcmREdXJhdGlvbiA9IGZyYWN0aW9uLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aSA9IGZyYWN0aW9uLmluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KGkpID09PSAnICcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlbWVtYmVyRW5kQmVhbSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobGluZS5jaGFyQXQoaSkgPT09ICctJyB8fCBsaW5lLmNoYXJBdChpKSA9PT0gJyknIHx8IGxpbmUuY2hhckF0KGkpID09PSAnICcgfHwgbGluZS5jaGFyQXQoaSkgPT09ICc8JyB8fCBsaW5lLmNoYXJBdChpKSA9PT0gJz4nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpLS07IC8vIFN1YnRyYWN0aW5nIG9uZSBiZWNhdXNlIG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJlbG93XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBvc3RDaG9yZERvbmUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBvc3RDaG9yZERvbmUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFwb3N0Q2hvcmREb25lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aSsrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHR3YXJuKFwiRXhwZWN0ZWQgJ10nIHRvIGVuZCB0aGUgY2hvcmRzXCIsIGxpbmUsIGkpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsLnBpdGNoZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNob3JkRHVyYXRpb24gIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuZHVyYXRpb24gPSBlbC5kdXJhdGlvbiAqIGNob3JkRHVyYXRpb247XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZW1lbWJlckVuZEJlYW0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWRkRW5kQmVhbShlbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuYWRkRm9ybWF0dGluZ09wdGlvbnMoZWwsIHR1bmUuZm9ybWF0dGluZywgJ25vdGUnKTtcblx0XHRcdFx0XHRcdFx0XHRcdHR1bmUuYXBwZW5kRWxlbWVudCgnbm90ZScsIHN0YXJ0T2ZMaW5lK2Nob3JkU3RhcnRDaGFyLCBzdGFydE9mTGluZStpLCBlbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLm1lYXN1cmVOb3RFbXB0eSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbCA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFNpbmdsZSBwaXRjaFxuXHRcdFx0XHRcdFx0dmFyIGVsMiA9IHt9O1xuXHRcdFx0XHRcdFx0dmFyIGNvcmUgPSBnZXRDb3JlTm90ZShsaW5lLCBpLCBlbDIsIHRydWUpO1xuXHRcdFx0XHRcdFx0aWYgKGVsMi5lbmRUaWUgIT09IHVuZGVmaW5lZCkgc2V0SXNJblRpZShtdWx0aWxpbmVWYXJzLCAgb3ZlcmxheUxldmVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdGlmIChjb3JlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb3JlLnBpdGNoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRlbC5waXRjaGVzID0gWyB7IH0gXTtcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPLVBFUjogc3RyYWlnaHRlbiB0aGlzIG91dCBzbyB0aGVyZSBpcyBub3Qgc28gbXVjaCBjb3B5aW5nOiBnZXRDb3JlTm90ZSBzaG91bGRuJ3QgY2hhbmdlIGUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvcmUuYWNjaWRlbnRhbCAhPT0gdW5kZWZpbmVkKSBlbC5waXRjaGVzWzBdLmFjY2lkZW50YWwgPSBjb3JlLmFjY2lkZW50YWw7XG5cdFx0XHRcdFx0XHRcdFx0ZWwucGl0Y2hlc1swXS5waXRjaCA9IGNvcmUucGl0Y2g7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvcmUubWlkaXBpdGNoKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwucGl0Y2hlc1swXS5taWRpcGl0Y2ggPSBjb3JlLm1pZGlwaXRjaDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29yZS5lbmRTbHVyICE9PSB1bmRlZmluZWQpIGVsLnBpdGNoZXNbMF0uZW5kU2x1ciA9IGNvcmUuZW5kU2x1cjtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29yZS5lbmRUaWUgIT09IHVuZGVmaW5lZCkgZWwucGl0Y2hlc1swXS5lbmRUaWUgPSBjb3JlLmVuZFRpZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29yZS5zdGFydFNsdXIgIT09IHVuZGVmaW5lZCkgZWwucGl0Y2hlc1swXS5zdGFydFNsdXIgPSBjb3JlLnN0YXJ0U2x1cjtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWwuc3RhcnRTbHVyICE9PSB1bmRlZmluZWQpIGVsLnBpdGNoZXNbMF0uc3RhcnRTbHVyID0gZWwuc3RhcnRTbHVyO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb3JlLnN0YXJ0VGllICE9PSB1bmRlZmluZWQpIGVsLnBpdGNoZXNbMF0uc3RhcnRUaWUgPSBjb3JlLnN0YXJ0VGllO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChlbC5zdGFydFRpZSAhPT0gdW5kZWZpbmVkKSBlbC5waXRjaGVzWzBdLnN0YXJ0VGllID0gZWwuc3RhcnRUaWU7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0ZWwucmVzdCA9IGNvcmUucmVzdDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29yZS5lbmRTbHVyICE9PSB1bmRlZmluZWQpIGVsLmVuZFNsdXIgPSBjb3JlLmVuZFNsdXI7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvcmUuZW5kVGllICE9PSB1bmRlZmluZWQpIGVsLnJlc3QuZW5kVGllID0gY29yZS5lbmRUaWU7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvcmUuc3RhcnRTbHVyICE9PSB1bmRlZmluZWQpIGVsLnN0YXJ0U2x1ciA9IGNvcmUuc3RhcnRTbHVyO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb3JlLnN0YXJ0VGllICE9PSB1bmRlZmluZWQpIGVsLnJlc3Quc3RhcnRUaWUgPSBjb3JlLnN0YXJ0VGllO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChlbC5zdGFydFRpZSAhPT0gdW5kZWZpbmVkKSBlbC5yZXN0LnN0YXJ0VGllID0gZWwuc3RhcnRUaWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoY29yZS5jaG9yZCAhPT0gdW5kZWZpbmVkKSBlbC5jaG9yZCA9IGNvcmUuY2hvcmQ7XG5cdFx0XHRcdFx0XHRcdGlmIChjb3JlLmR1cmF0aW9uICE9PSB1bmRlZmluZWQpIGVsLmR1cmF0aW9uID0gY29yZS5kdXJhdGlvbjtcblx0XHRcdFx0XHRcdFx0aWYgKGNvcmUuZGVjb3JhdGlvbiAhPT0gdW5kZWZpbmVkKSBlbC5kZWNvcmF0aW9uID0gY29yZS5kZWNvcmF0aW9uO1xuXHRcdFx0XHRcdFx0XHRpZiAoY29yZS5ncmFjZU5vdGVzICE9PSB1bmRlZmluZWQpIGVsLmdyYWNlTm90ZXMgPSBjb3JlLmdyYWNlTm90ZXM7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBlbC5zdGFydFNsdXI7XG5cdFx0XHRcdFx0XHRcdGlmIChpc0luVGllKG11bHRpbGluZVZhcnMsICBvdmVybGF5TGV2ZWwsIGVsKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChlbC5waXRjaGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVsLnBpdGNoZXNbMF0uZW5kVGllID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsLnJlc3QudHlwZSAhPT0gJ3NwYWNlcicpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVsLnJlc3QuZW5kVGllID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0c2V0SXNJblRpZShtdWx0aWxpbmVWYXJzLCAgb3ZlcmxheUxldmVsLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKGNvcmUuc3RhcnRUaWUgfHwgZWwuc3RhcnRUaWUpXG5cdFx0XHRcdFx0XHRcdFx0c2V0SXNJblRpZShtdWx0aWxpbmVWYXJzLCAgb3ZlcmxheUxldmVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0aSAgPSBjb3JlLmVuZENoYXI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRyaXBsZXROb3Rlc0xlZnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dHJpcGxldE5vdGVzTGVmdC0tO1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0cmlwbGV0Tm90ZXNMZWZ0ID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5lbmRUcmlwbGV0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoY29yZS5lbmRfYmVhbSlcblx0XHRcdFx0XHRcdFx0XHRhZGRFbmRCZWFtKGVsKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIHdob2xlIHJlc3QsIHRoZW4gaXQgc2hvdWxkIGJlIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVhc3VyZSwgbm90IGl0J3Mgb3duIGR1cmF0aW9uLiBXZSBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHRpbWUgc2lnbmF0dXJlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gNC80LCB0aG91Z2gsIHRoZW4gYSB3aG9sZSByZXN0IGhhcyBubyBzcGVjaWFsIHRyZWF0bWVudC5cblx0XHRcdFx0XHRcdFx0aWYgKGVsLnJlc3QgJiYgZWwucmVzdC50eXBlID09PSAncmVzdCcgJiYgZWwuZHVyYXRpb24gPT09IDEgJiYgZHVyYXRpb25PZk1lYXN1cmUobXVsdGlsaW5lVmFycykgPD0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdGVsLnJlc3QudHlwZSA9ICd3aG9sZSc7XG5cblx0XHRcdFx0XHRcdFx0XHRlbC5kdXJhdGlvbiA9IGR1cmF0aW9uT2ZNZWFzdXJlKG11bHRpbGluZVZhcnMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5hZGRGb3JtYXR0aW5nT3B0aW9ucyhlbCwgdHVuZS5mb3JtYXR0aW5nLCAnbm90ZScpO1xuXHRcdFx0XHRcdFx0XHR0dW5lLmFwcGVuZEVsZW1lbnQoJ25vdGUnLCBzdGFydE9mTGluZStzdGFydEksIHN0YXJ0T2ZMaW5lK2ksIGVsKTtcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy5tZWFzdXJlTm90RW1wdHkgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRlbCA9IHt9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChpID09PSBzdGFydEkpIHtcdC8vIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBzbyBpZ25vcmUgaXQuXG5cdFx0XHRcdFx0XHRpZiAobGluZS5jaGFyQXQoaSkgIT09ICcgJyAmJiBsaW5lLmNoYXJBdChpKSAhPT0gJ2AnKVxuXHRcdFx0XHRcdFx0XHR3YXJuKFwiVW5rbm93biBjaGFyYWN0ZXIgaWdub3JlZFwiLCBsaW5lLCBpKTtcblx0XHRcdFx0XHRcdGkrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGlzSW5UaWUgPSBmdW5jdGlvbihtdWx0aWxpbmVWYXJzLCBvdmVybGF5TGV2ZWwsIGVsKSB7XG5cdFx0aWYgKG11bHRpbGluZVZhcnMuaW5UaWVbb3ZlcmxheUxldmVsXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdC8vIElmIHRoaXMgaXMgc2luZ2xlIHZvaWNlIG11c2ljIHRoZW4gdGhlIHZvaWNlIGluZGV4IGlzbid0IHNldCwgc28gd2UgdXNlIHRoZSBmaXJzdCB2b2ljZS5cblx0XHR2YXIgdm9pY2VJbmRleCA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlID8gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UuaW5kZXggOiAwO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmluVGllW292ZXJsYXlMZXZlbF1bdm9pY2VJbmRleF0pIHtcblx0XHRcdGlmIChlbC5waXRjaGVzICE9PSB1bmRlZmluZWQgfHwgZWwucmVzdC50eXBlICE9PSAnc3BhY2VyJylcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHR2YXIgc2V0SXNJblRpZSA9ZnVuY3Rpb24obXVsdGlsaW5lVmFycywgb3ZlcmxheUxldmVsLCB2YWx1ZSkge1xuXHRcdC8vIElmIHRoaXMgaXMgc2luZ2xlIHZvaWNlIG11c2ljIHRoZW4gdGhlIHZvaWNlIGluZGV4IGlzbid0IHNldCwgc28gd2UgdXNlIHRoZSBmaXJzdCB2b2ljZS5cblx0XHR2YXIgdm9pY2VJbmRleCA9IG11bHRpbGluZVZhcnMuY3VycmVudFZvaWNlID8gbXVsdGlsaW5lVmFycy5jdXJyZW50Vm9pY2UuaW5kZXggOiAwO1xuXHRcdGlmIChtdWx0aWxpbmVWYXJzLmluVGllW292ZXJsYXlMZXZlbF0gPT09IHVuZGVmaW5lZClcblx0XHRcdG11bHRpbGluZVZhcnMuaW5UaWVbb3ZlcmxheUxldmVsXSA9IFtdO1xuXHRcdG11bHRpbGluZVZhcnMuaW5UaWVbb3ZlcmxheUxldmVsXVt2b2ljZUluZGV4XSA9IHZhbHVlO1xuXHR9O1xuXG5cdHZhciBwYXJzZUxpbmUgPSBmdW5jdGlvbihsaW5lKSB7XG5cdFx0dmFyIHJldCA9IGhlYWRlci5wYXJzZUhlYWRlcihsaW5lKTtcblx0XHRpZiAocmV0LnJlZ3VsYXIpXG5cdFx0XHRwYXJzZVJlZ3VsYXJNdXNpY0xpbmUocmV0LnN0cik7XG5cdFx0aWYgKHJldC5uZXdsaW5lKVxuXHRcdFx0c3RhcnROZXdMaW5lKCk7XG5cdFx0aWYgKHJldC53b3Jkcylcblx0XHRcdGFkZFdvcmRzKHR1bmUuZ2V0Q3VycmVudFZvaWNlKCksIGxpbmUuc3Vic3RyaW5nKDIpKTtcblx0XHRpZiAocmV0LnN5bWJvbHMpXG5cdFx0XHRhZGRTeW1ib2xzKHR1bmUuZ2V0Q3VycmVudFZvaWNlKCksIGxpbmUuc3Vic3RyaW5nKDIpKTtcblx0XHRpZiAocmV0LnJlY3Vyc2UpXG5cdFx0XHRwYXJzZUxpbmUocmV0LnN0cik7XG5cdH07XG5cblx0ZnVuY3Rpb24gYXBwZW5kTGFzdE1lYXN1cmUodm9pY2UsIG5leHRWb2ljZSkge1xuXHRcdHZvaWNlLnB1c2goe1xuXHRcdFx0ZWxfdHlwZTogJ2hpbnQnXG5cdFx0fSk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Vm9pY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBlbGVtZW50ID0gbmV4dFZvaWNlW2ldO1xuXHRcdFx0dmFyIGhpbnQgPSBwYXJzZUNvbW1vbi5jbG9uZShlbGVtZW50KTtcblx0XHRcdHZvaWNlLnB1c2goaGludCk7XG5cdFx0XHRpZiAoZWxlbWVudC5lbF90eXBlID09PSAnYmFyJylcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkSGludE1lYXN1cmUoc3RhZmYsIG5leHRTdGFmZikge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3RhZmYubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBzdGF2ZSA9IHN0YWZmW2ldO1xuXHRcdFx0dmFyIG5leHRTdGF2ZSA9IG5leHRTdGFmZltpXTtcblx0XHRcdGlmIChuZXh0U3RhdmUpIHsgLy8gQmUgc3VyZSB0aGVyZSBpcyB0aGUgc2FtZSBudW1iZXIgb2Ygc3RhdmVzIG9uIHRoZSBuZXh0IGxpbmUuXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgbmV4dFN0YXZlLnZvaWNlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdHZhciBuZXh0Vm9pY2UgPSBuZXh0U3RhdmUudm9pY2VzW2pdO1xuXHRcdFx0XHRcdHZhciB2b2ljZSA9IHN0YXZlLnZvaWNlc1tqXTtcblx0XHRcdFx0XHRpZiAodm9pY2UpIHsgLy8gQmUgc3VyZSB0aGVyZSBhcmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZvaWNlcyBvbiB0aGUgcHJldmlvdXMgbGluZS5cblx0XHRcdFx0XHRcdGFwcGVuZExhc3RNZWFzdXJlKHZvaWNlLCBuZXh0Vm9pY2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZEhpbnRNZWFzdXJlcygpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHR1bmUubGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBsaW5lID0gdHVuZS5saW5lc1tpXS5zdGFmZjtcblx0XHRcdGlmIChsaW5lKSB7XG5cdFx0XHRcdHZhciBqID0gaSsxO1xuXHRcdFx0XHR3aGlsZSAoaiA8IHR1bmUubGluZXMubGVuZ3RoICYmIHR1bmUubGluZXNbal0uc3RhZmYgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdGlmIChqIDwgdHVuZS5saW5lcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgbmV4dExpbmUgPSB0dW5lLmxpbmVzW2pdLnN0YWZmO1xuXHRcdFx0XHRcdGFkZEhpbnRNZWFzdXJlKGxpbmUsIG5leHRMaW5lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMucGFyc2UgPSBmdW5jdGlvbihzdHJUdW5lLCBzd2l0Y2hlcywgc3RhcnRQb3MpIHtcblx0XHQvLyB0aGUgc3dpdGNoZXMgYXJlIG9wdGlvbmFsIGFuZCBjYXVzZSBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGUgdHVuZSBpcyBwYXJzZWQuXG5cdFx0Ly8gc3dpdGNoZXMuaGVhZGVyX29ubHkgOiBzdG9wIHBhcnNpbmcgd2hlbiB0aGUgaGVhZGVyIGlzIGZpbmlzaGVkXG5cdFx0Ly8gc3dpdGNoZXMuc3RvcF9vbl93YXJuaW5nIDogc3RvcCBhdCB0aGUgZmlyc3Qgd2FybmluZyBlbmNvdW50ZXJlZC5cblx0XHQvLyBzd2l0Y2hlcy5wcmludDogZm9ybWF0IGZvciB0aGUgcGFnZSBpbnN0ZWFkIG9mIHRoZSBicm93c2VyLlxuXHRcdC8vIHN3aXRjaGVzLmZvcm1hdDogYSBoYXNoIG9mIHRoZSBkZXNpcmVkIGZvcm1hdHRpbmcgY29tbWFuZHMuXG5cdFx0Ly8gc3dpdGNoZXMuaGludF9tZWFzdXJlczogcHV0IHRoZSBuZXh0IG1lYXN1cmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLlxuXHRcdC8vIHN3aXRjaGVzLnRyYW5zcG9zZTogY2hhbmdlIHRoZSBrZXkgc2lnbmF0dXJlLCBjaG9yZHMsIGFuZCBub3RlcyBieSBhIG51bWJlciBvZiBoYWxmLXN0ZXBzLlxuXHRcdGlmICghc3dpdGNoZXMpIHN3aXRjaGVzID0ge307XG5cdFx0aWYgKCFzdGFydFBvcykgc3RhcnRQb3MgPSAwO1xuXHRcdHR1bmUucmVzZXQoKTtcblx0XHRpZiAoc3dpdGNoZXMucHJpbnQpXG5cdFx0XHR0dW5lLm1lZGlhID0gJ3ByaW50Jztcblx0XHRtdWx0aWxpbmVWYXJzLnJlc2V0KCk7XG5cdFx0bXVsdGlsaW5lVmFycy5pQ2hhciA9IHN0YXJ0UG9zO1xuXHRcdGlmIChzd2l0Y2hlcy52aXN1YWxUcmFuc3Bvc2UpIHtcblx0XHRcdG11bHRpbGluZVZhcnMuZ2xvYmFsVHJhbnNwb3NlID0gcGFyc2VJbnQoc3dpdGNoZXMudmlzdWFsVHJhbnNwb3NlKTtcblx0XHRcdGlmIChtdWx0aWxpbmVWYXJzLmdsb2JhbFRyYW5zcG9zZSA9PT0gMClcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5nbG9iYWxUcmFuc3Bvc2UgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlXG5cdFx0XHRtdWx0aWxpbmVWYXJzLmdsb2JhbFRyYW5zcG9zZSA9IHVuZGVmaW5lZDtcblx0XHRpZiAoc3dpdGNoZXMubGluZUJyZWFrcykge1xuXHRcdFx0Ly8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIHRoZSBsaW5lIGJyZWFrcyBmb3IgZWFzeSB0ZXN0aW5nLlxuXHRcdFx0Ly8gVGhlIGxpbmUgYnJlYWsgbnVtYmVycyBhcmUgMC1iYXNlZCBhbmQgdGhleSByZWZsZWN0IHRoZSBsYXN0IG1lYXN1cmUgb2YgdGhlIGN1cnJlbnQgbGluZS5cblx0XHRcdG11bHRpbGluZVZhcnMubGluZUJyZWFrcyA9IHt9O1xuXHRcdFx0Ly9tdWx0aWxpbmVWYXJzLmNvbnRpbnVlYWxsID0gdHJ1ZTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3dpdGNoZXMubGluZUJyZWFrcy5sZW5ndGg7IGkrKylcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5saW5lQnJlYWtzWycnKyhzd2l0Y2hlcy5saW5lQnJlYWtzW2ldKzEpXSA9IHRydWU7IC8vIEFkZCAxIHNvIHRoYXQgdGhlIGxpbmUgYnJlYWsgaXMgdGhlIGZpcnN0IG1lYXN1cmUgb2YgdGhlIG5leHQgbGluZS5cblx0XHR9XG5cdFx0aGVhZGVyLnJlc2V0KHRva2VuaXplciwgd2FybiwgbXVsdGlsaW5lVmFycywgdHVuZSk7XG5cblx0XHQvLyBUYWtlIGNhcmUgb2Ygd2hhdGV2ZXIgbGluZSBlbmRpbmdzIGNvbWUgb3VyIHdheVxuXHRcdHN0clR1bmUgPSBwYXJzZUNvbW1vbi5nc3ViKHN0clR1bmUsICdcXHJcXG4nLCAnXFxuJyk7XG5cdFx0c3RyVHVuZSA9IHBhcnNlQ29tbW9uLmdzdWIoc3RyVHVuZSwgJ1xccicsICdcXG4nKTtcblx0XHRzdHJUdW5lICs9ICdcXG4nO1x0Ly8gVGFja2VkIG9uIHRlbXBvcmFyaWx5IHRvIG1ha2UgdGhlIGxhc3QgbGluZSBjb250aW51YXRpb24gd29ya1xuXHRcdHN0clR1bmUgPSBzdHJUdW5lLnJlcGxhY2UoL1xcblxcXFwuKlxcbi9nLCBcIlxcblwiKTtcdC8vIGdldCByaWQgb2YgbGF0ZXggY29tbWFuZHMuXG5cdFx0dmFyIGNvbnRpbnVhdGlvblJlcGxhY2VtZW50ID0gZnVuY3Rpb24oYWxsLCBiYWNrc2xhc2gsIGNvbW1lbnQpe1xuXHRcdFx0dmFyIHNwYWNlcyA9IFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjtcblx0XHRcdHZhciBwYWRkaW5nID0gY29tbWVudCA/IHNwYWNlcy5zdWJzdHJpbmcoMCwgY29tbWVudC5sZW5ndGgpIDogXCJcIjtcblx0XHRcdHJldHVybiBiYWNrc2xhc2ggKyBcIiBcXHgxMlwiICsgcGFkZGluZztcblx0XHR9O1xuXHRcdHN0clR1bmUgPSBzdHJUdW5lLnJlcGxhY2UoL1xcXFwoWyBcXHRdKikoJS4qKSpcXG4vZywgY29udGludWF0aW9uUmVwbGFjZW1lbnQpO1x0Ly8gdGFrZSBjYXJlIG9mIGxpbmUgY29udGludWF0aW9ucyByaWdodCBhd2F5LCBidXQga2VlcCB0aGUgc2FtZSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuXHRcdHZhciBsaW5lcyA9IHN0clR1bmUuc3BsaXQoJ1xcbicpO1xuXHRcdGlmIChwYXJzZUNvbW1vbi5sYXN0KGxpbmVzKS5sZW5ndGggPT09IDApXHQvLyByZW1vdmUgdGhlIGJsYW5rIGxpbmUgd2UgYWRkZWQgYWJvdmUuXG5cdFx0XHRsaW5lcy5wb3AoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHN3aXRjaGVzLmZvcm1hdCkge1xuXHRcdFx0XHRwYXJzZURpcmVjdGl2ZS5nbG9iYWxGb3JtYXR0aW5nKHN3aXRjaGVzLmZvcm1hdCk7XG5cdFx0XHR9XG5cdFx0XHRwYXJzZUNvbW1vbi5lYWNoKGxpbmVzLCAgZnVuY3Rpb24obGluZSkge1xuXHRcdFx0XHRpZiAoc3dpdGNoZXMuaGVhZGVyX29ubHkgJiYgbXVsdGlsaW5lVmFycy5pc19pbl9oZWFkZXIgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHRocm93IFwibm9ybWFsX2Fib3J0XCI7XG5cdFx0XHRcdGlmIChzd2l0Y2hlcy5zdG9wX29uX3dhcm5pbmcgJiYgbXVsdGlsaW5lVmFycy53YXJuaW5ncylcblx0XHRcdFx0XHR0aHJvdyBcIm5vcm1hbF9hYm9ydFwiO1xuXHRcdFx0XHRpZiAobXVsdGlsaW5lVmFycy5pc19pbl9oaXN0b3J5KSB7XG5cdFx0XHRcdFx0aWYgKGxpbmUuY2hhckF0KDEpID09PSAnOicpIHtcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuaXNfaW5faGlzdG9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0cGFyc2VMaW5lKGxpbmUpO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0dHVuZS5hZGRNZXRhVGV4dChcImhpc3RvcnlcIiwgdG9rZW5pemVyLnRyYW5zbGF0ZVN0cmluZyh0b2tlbml6ZXIuc3RyaXBDb21tZW50KGxpbmUpKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAobXVsdGlsaW5lVmFycy5pblRleHRCbG9jaykge1xuXHRcdFx0XHRcdGlmIChwYXJzZUNvbW1vbi5zdGFydHNXaXRoKGxpbmUsIFwiJSVlbmR0ZXh0XCIpKSB7XG5cdFx0XHRcdFx0XHQvL3R1bmUuYWRkTWV0YVRleHQoXCJ0ZXh0QmxvY2tcIiwgbXVsdGlsaW5lVmFycy50ZXh0QmxvY2spO1xuXHRcdFx0XHRcdFx0dHVuZS5hZGRUZXh0KG11bHRpbGluZVZhcnMudGV4dEJsb2NrKTtcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuaW5UZXh0QmxvY2sgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChsaW5lLCBcIiUlXCIpKVxuXHRcdFx0XHRcdFx0XHRtdWx0aWxpbmVWYXJzLnRleHRCbG9jayArPSAnICcgKyBsaW5lLnN1YnN0cmluZygyKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0bXVsdGlsaW5lVmFycy50ZXh0QmxvY2sgKz0gJyAnICsgbGluZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAobXVsdGlsaW5lVmFycy5pblBzQmxvY2spIHtcblx0XHRcdFx0XHRpZiAocGFyc2VDb21tb24uc3RhcnRzV2l0aChsaW5lLCBcIiUlZW5kcHNcIikpIHtcblx0XHRcdFx0XHRcdC8vIEp1c3QgaWdub3JlIHBvc3RzY3JpcHRcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMuaW5Qc0Jsb2NrID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdG11bHRpbGluZVZhcnMudGV4dEJsb2NrICs9ICcgJyArIGxpbmU7XG5cdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdHBhcnNlTGluZShsaW5lKTtcblx0XHRcdFx0bXVsdGlsaW5lVmFycy5pQ2hhciArPSBsaW5lLmxlbmd0aCArIDE7XG5cdFx0XHR9KTtcblx0XHRcdHZhciBwaCA9IDExKjcyO1xuXHRcdFx0dmFyIHBsID0gOC41KjcyO1xuXHRcdFx0c3dpdGNoIChtdWx0aWxpbmVWYXJzLnBhcGVyc2l6ZSkge1xuXHRcdFx0XHQvL2Nhc2UgXCJsZXR0ZXJcIjogcGggPSAxMSo3MjsgcGwgPSA4LjUqNzI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibGVnYWxcIjogcGggPSAxNCo3MjsgcGwgPSA4LjUqNzI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiQTRcIjogcGggPSAxMS43KjcyOyBwbCA9IDguMyo3MjsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAobXVsdGlsaW5lVmFycy5sYW5kc2NhcGUpIHtcblx0XHRcdFx0dmFyIHggPSBwaDtcblx0XHRcdFx0cGggPSBwbDtcblx0XHRcdFx0cGwgPSB4O1xuXHRcdFx0fVxuXHRcdFx0bXVsdGlsaW5lVmFycy5vcGVuU2x1cnMgPSB0dW5lLmNsZWFuVXAocGwsIHBoLCBtdWx0aWxpbmVWYXJzLmJhcnNwZXJzdGFmZiwgbXVsdGlsaW5lVmFycy5zdGFmZm5vbm90ZSwgbXVsdGlsaW5lVmFycy5vcGVuU2x1cnMpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0aWYgKGVyciAhPT0gXCJub3JtYWxfYWJvcnRcIilcblx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0XHRpZiAoc3dpdGNoZXMuaGludF9tZWFzdXJlcykge1xuXHRcdFx0YWRkSGludE1lYXN1cmVzKCk7XG5cdFx0fVxuXG5cdFx0d3JhcC53cmFwTGluZXModHVuZSwgbXVsdGlsaW5lVmFycy5saW5lQnJlYWtzKTtcblx0fTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUGFyc2U7XG4iLCIvLyAgICBhYmNfdHVuZWJvb2suanM6IHNwbGl0cyBhIHN0cmluZyByZXByZXNlbnRpbmcgQUJDIE11c2ljIE5vdGF0aW9uIGludG8gaW5kaXZpZHVhbCB0dW5lcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IFBhdWwgUm9zZW4gKHBhdWwgYXQgcGF1bHJvc2VuIGRvdCBuZXQpXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8qZ2xvYmFsIGRvY3VtZW50ICovXG4vKmdsb2JhbCB3aW5kb3csIEFCQ0pTLCBjb25zb2xlICovXG5cbnZhciBwYXJzZUNvbW1vbiA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19jb21tb24nKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19wYXJzZScpO1xuXG52YXIgdHVuZWJvb2sgPSB7fTtcblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR0dW5lYm9vay5udW1iZXJPZlR1bmVzID0gZnVuY3Rpb24oYWJjKSB7XG5cdFx0dmFyIHR1bmVzID0gYWJjLnNwbGl0KFwiXFxuWDpcIik7XG5cdFx0dmFyIG51bSA9IHR1bmVzLmxlbmd0aDtcblx0XHRpZiAobnVtID09PSAwKSBudW0gPSAxO1xuXHRcdHJldHVybiBudW07XG5cdH07XG5cblx0dmFyIFR1bmVCb29rID0gdHVuZWJvb2suVHVuZUJvb2sgPSBmdW5jdGlvbihib29rKSB7XG5cdFx0dmFyIFRoaXMgPSB0aGlzO1xuXHRcdHZhciBkaXJlY3RpdmVzID0gXCJcIjtcblx0XHRib29rID0gcGFyc2VDb21tb24uc3RyaXAoYm9vayk7XG5cdFx0dmFyIHR1bmVzID0gYm9vay5zcGxpdChcIlxcblg6XCIpO1xuXHRcdGZvciAodmFyIGkgPSAxOyBpIDwgdHVuZXMubGVuZ3RoOyBpKyspXHQvLyBQdXQgYmFjayB0aGUgWDogdGhhdCB3ZSBsb3N0IHdoZW4gc3BsaXR0aW5nIHRoZSB0dW5lcy5cblx0XHRcdHR1bmVzW2ldID0gXCJYOlwiICsgdHVuZXNbaV07XG5cdFx0Ly8gS2VlcCB0cmFjayBvZiB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGVhY2ggdHVuZSBzdGFydHMgd2l0aC5cblx0XHR2YXIgcG9zID0gMDtcblx0XHRUaGlzLnR1bmVzID0gW107XG5cdFx0cGFyc2VDb21tb24uZWFjaCh0dW5lcywgZnVuY3Rpb24odHVuZSkge1xuXHRcdFx0VGhpcy50dW5lcy5wdXNoKHsgYWJjOiB0dW5lLCBzdGFydFBvczogcG9zfSk7XG5cdFx0XHRwb3MgKz0gdHVuZS5sZW5ndGggKyAxOyAvLyBXZSBhbHNvIGxvc3QgYSBuZXdsaW5lIHdoZW4gc3BsaXR0aW5nLCBzbyBjb3VudCB0aGF0LlxuXHRcdH0pO1xuXHRcdGlmIChUaGlzLnR1bmVzLmxlbmd0aCA+IDEgJiYgIXBhcnNlQ29tbW9uLnN0YXJ0c1dpdGgoVGhpcy50dW5lc1swXS5hYmMsICdYOicpKSB7XHQvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0dW5lLCB0aGUgWDogbWlnaHQgYmUgbWlzc2luZywgb3RoZXJ3aXNlIGFzc3VtZSB0aGUgdG9wIG9mIHRoZSBmaWxlIGlzIFwiaW50ZXJ0dW5lXCJcblx0XHRcdC8vIFRoZXJlIGNvdWxkIGJlIGZpbGUtd2lkZSBkaXJlY3RpdmVzIGluIHRoaXMsIGlmIHNvLCB3ZSBuZWVkIHRvIGluc2VydCBpdCBpbnRvIGVhY2ggdHVuZS4gV2UgY2FuIHByb2JhYmx5IGdldCBhd2F5IHdpdGhcblx0XHRcdC8vIGp1c3QgbG9va2luZyBmb3IgZmlsZS13aWRlIGRpcmVjdGl2ZXMgaGVyZSAoYmVmb3JlIHRoZSBmaXJzdCB0dW5lKSBhbmQgaW5zZXJ0aW5nIHRoZW0gYXQgdGhlIGJvdHRvbSBvZiBlYWNoIHR1bmUsIHNpbmNlXG5cdFx0XHQvLyB0aGUgdHVuZSBpcyBwYXJzZWQgYWxsIGF0IG9uY2UuIFRoZSBkaXJlY3RpdmVzIHdpbGwgYmUgc2VlbiBiZWZvcmUgdGhlIGVuZ3JhdmVyIGJlZ2lucyBwcm9jZXNzaW5nLlxuXHRcdFx0dmFyIGRpciA9IFRoaXMudHVuZXMuc2hpZnQoKTtcblx0XHRcdHZhciBhcnJEaXIgPSBkaXIuYWJjLnNwbGl0KCdcXG4nKTtcblx0XHRcdHBhcnNlQ29tbW9uLmVhY2goYXJyRGlyLCBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRcdGlmIChwYXJzZUNvbW1vbi5zdGFydHNXaXRoKGxpbmUsICclJScpKVxuXHRcdFx0XHRcdGRpcmVjdGl2ZXMgKz0gbGluZSArICdcXG4nO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdFRoaXMuaGVhZGVyID0gZGlyZWN0aXZlcztcblxuXHRcdC8vIE5vdywgdGhlIHR1bmUgZW5kcyBhdCBhIGJsYW5rIGxpbmUsIHNvIHRydW5jYXRlIGl0IGlmIG5lZWRlZC4gVGhlcmUgbWF5IGJlIFwiaW50ZXJ0dW5lXCIgc3R1ZmYuXG5cdFx0cGFyc2VDb21tb24uZWFjaChUaGlzLnR1bmVzLCBmdW5jdGlvbih0dW5lKSB7XG5cdFx0XHR2YXIgZW5kID0gdHVuZS5hYmMuaW5kZXhPZignXFxuXFxuJyk7XG5cdFx0XHRpZiAoZW5kID4gMClcblx0XHRcdFx0dHVuZS5hYmMgPSB0dW5lLmFiYy5zdWJzdHJpbmcoMCwgZW5kKTtcblx0XHRcdHR1bmUucHVyZSA9IHR1bmUuYWJjO1xuXHRcdFx0dHVuZS5hYmMgPSBkaXJlY3RpdmVzICsgdHVuZS5hYmM7XG5cblx0XHRcdC8vIGZvciB0aGUgdXNlcidzIGNvbnZlbmllbmNlLCBwYXJzZSBhbmQgc3RvcmUgdGhlIHRpdGxlIHNlcGFyYXRlbHkuIFRoZSB0aXRsZSBpcyBiZXR3ZWVuIHRoZSBmaXJzdCBUOiBhbmQgdGhlIG5leHQgXFxuXG5cdFx0XHR2YXIgdGl0bGUgPSB0dW5lLnB1cmUuc3BsaXQoXCJUOlwiKTtcblx0XHRcdGlmICh0aXRsZS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHRpdGxlID0gdGl0bGVbMV0uc3BsaXQoXCJcXG5cIik7XG5cdFx0XHRcdHR1bmUudGl0bGUgPSB0aXRsZVswXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0dHVuZS50aXRsZSA9IFwiXCI7XG5cblx0XHRcdC8vIGZvciB0aGUgdXNlcidzIGNvbnZlbmllbmNlLCBwYXJzZSBhbmQgc3RvcmUgdGhlIGlkIHNlcGFyYXRlbHkuIFRoZSBpZCBpcyBiZXR3ZWVuIHRoZSBmaXJzdCBYOiBhbmQgdGhlIG5leHQgXFxuXG5cdFx0XHR2YXIgaWQgPSB0dW5lLnB1cmUuc3Vic3RyaW5nKDIsIHR1bmUucHVyZS5pbmRleE9mKFwiXFxuXCIpKTtcblx0XHRcdHR1bmUuaWQgPSBpZC5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG5cdFx0fSk7XG5cdH07XG5cblx0VHVuZUJvb2sucHJvdG90eXBlLmdldFR1bmVCeUlkID0gZnVuY3Rpb24oaWQpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHVuZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICh0aGlzLnR1bmVzW2ldLmlkID09PSAnJytpZClcblx0XHRcdFx0cmV0dXJuIHRoaXMudHVuZXNbaV07XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXG5cdFR1bmVCb29rLnByb3RvdHlwZS5nZXRUdW5lQnlUaXRsZSA9IGZ1bmN0aW9uKHRpdGxlKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnR1bmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy50dW5lc1tpXS50aXRsZSA9PT0gdGl0bGUpXG5cdFx0XHRcdHJldHVybiB0aGlzLnR1bmVzW2ldO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHR0dW5lYm9vay5wYXJzZU9ubHkgPSBmdW5jdGlvbihhYmMsIHBhcmFtcykge1xuXHRcdHZhciB0dW5lcyA9IFtdO1xuXHRcdHZhciBudW1UdW5lcyA9IHR1bmVib29rLm51bWJlck9mVHVuZXMoYWJjKTtcblxuXHRcdC8vIHRoaXMganVzdCBuZWVkcyB0byBiZSBwYXNzZWQgaW4gYmVjYXVzZSB0aGlzIHRlbGxzIHRoZSBlbmdpbmUgaG93IG1hbnkgdHVuZXMgdG8gcHJvY2Vzcy5cblx0XHR2YXIgb3V0cHV0ID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBudW1UdW5lczsgaSsrKSB7XG5cdFx0XHRvdXRwdXQucHVzaCgxKTtcblx0XHR9XG5cdFx0ZnVuY3Rpb24gY2FsbGJhY2soKSB7XG5cdFx0XHQvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHdpdGggdGhlIHBhcnNlZCB0dW5lcy5cblx0XHR9XG5cdFx0cmV0dXJuIHR1bmVib29rLnJlbmRlckVuZ2luZShjYWxsYmFjaywgb3V0cHV0LCBhYmMsIHBhcmFtcyk7XG5cdH07XG5cblx0dHVuZWJvb2sucmVuZGVyRW5naW5lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBvdXRwdXQsIGFiYywgcGFyYW1zKSB7XG5cdFx0dmFyIHJldCA9IFtdO1xuXHRcdHZhciBpc0FycmF5ID0gZnVuY3Rpb24odGVzdE9iamVjdCkge1xuXHRcdFx0cmV0dXJuIHRlc3RPYmplY3QgJiYgISh0ZXN0T2JqZWN0LnByb3BlcnR5SXNFbnVtZXJhYmxlKCdsZW5ndGgnKSkgJiYgdHlwZW9mIHRlc3RPYmplY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0ZXN0T2JqZWN0Lmxlbmd0aCA9PT0gJ251bWJlcic7XG5cdFx0fTtcblxuXHRcdC8vIGNoZWNrIGFuZCBub3JtYWxpemUgaW5wdXQgcGFyYW1ldGVyc1xuXHRcdGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCB8fCBhYmMgPT09IHVuZGVmaW5lZClcblx0XHRcdHJldHVybjtcblx0XHRpZiAoIWlzQXJyYXkob3V0cHV0KSlcblx0XHRcdG91dHB1dCA9IFsgb3V0cHV0IF07XG5cdFx0aWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0cGFyYW1zID0ge307XG5cdFx0dmFyIGN1cnJlbnRUdW5lID0gcGFyYW1zLnN0YXJ0aW5nVHVuZSA/IHBhcnNlSW50KHBhcmFtcy5zdGFydGluZ1R1bmUsIDEwKSA6IDA7XG5cblx0XHQvLyBwYXJzZSB0aGUgYWJjIHN0cmluZ1xuXHRcdHZhciBib29rID0gbmV3IFR1bmVCb29rKGFiYyk7XG5cdFx0dmFyIGFiY1BhcnNlciA9IG5ldyBQYXJzZSgpO1xuXG5cdFx0Ly8gb3V0cHV0IGVhY2ggdHVuZSwgaWYgaXQgZXhpc3RzLiBPdGhlcndpc2UgY2xlYXIgdGhlIGRpdi5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGRpdiA9IG91dHB1dFtpXTtcblx0XHRcdGlmIChkaXYgPT09IFwiKlwiKSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgZm9yIFwiaGVhZGxlc3NcIiByZW5kZXJpbmc6IGRvaW5nIHRoZSB3b3JrIGJ1dCBub3Qgc2hvd2luZyB0aGUgc3ZnLlxuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YoZGl2KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0ZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2KTtcblx0XHRcdGlmIChkaXYpIHtcblx0XHRcdFx0aWYgKGN1cnJlbnRUdW5lID49IDAgJiYgY3VycmVudFR1bmUgPCBib29rLnR1bmVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFiY1BhcnNlci5wYXJzZShib29rLnR1bmVzW2N1cnJlbnRUdW5lXS5hYmMsIHBhcmFtcywgYm9vay50dW5lc1tjdXJyZW50VHVuZV0uc3RhcnRQb3MgLSBib29rLmhlYWRlci5sZW5ndGgpO1xuXHRcdFx0XHRcdHZhciB0dW5lID0gYWJjUGFyc2VyLmdldFR1bmUoKTtcblx0XHRcdFx0XHR2YXIgb3ZlcnJpZGUgPSBjYWxsYmFjayhkaXYsIHR1bmUsIGksIGJvb2sudHVuZXNbY3VycmVudFR1bmVdLmFiYyk7XG5cdFx0XHRcdFx0cmV0LnB1c2gob3ZlcnJpZGUgPyBvdmVycmlkZSA6IHR1bmUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChkaXYuaGFzT3duUHJvcGVydHkoJ2lubmVySFRNTCcpKVxuXHRcdFx0XHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUdW5lKys7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cblx0ZnVuY3Rpb24gZmxhdHRlblR1bmUodHVuZU9iaikge1xuXHRcdC8vIFRoaXMgcmVtb3ZlcyB0aGUgbGluZSBicmVha3MgYW5kIHJlbW92ZXMgdGhlIG5vbi1tdXNpYyBsaW5lcy5cblx0XHR2YXIgc3RhdmVzID0gW107XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0dW5lT2JqLmxpbmVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHR2YXIgbGluZSA9IHR1bmVPYmoubGluZXNbal07XG5cdFx0XHRpZiAobGluZS5zdGFmZikge1xuXHRcdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGxpbmUuc3RhZmYubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHR2YXIgc3RhZmYgPSBsaW5lLnN0YWZmW2tdO1xuXHRcdFx0XHRcdGlmICghc3RhdmVzW2tdKVxuXHRcdFx0XHRcdFx0c3RhdmVzW2tdID0gc3RhZmY7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0YWZmLnZvaWNlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRpZiAoc3RhdmVzW2tdLnZvaWNlc1tpXSlcblx0XHRcdFx0XHRcdFx0XHRzdGF2ZXNba10udm9pY2VzW2ldID0gc3RhdmVzW2tdLnZvaWNlc1tpXS5jb25jYXQoc3RhZmYudm9pY2VzW2ldKTtcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IElmIHN0YXZlc1trXS52b2ljZXNbaV0gZG9lc24ndCBleGlzdCwgdGhhdCBtZWFucyBhIHZvaWNlIGFwcGVhcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHR1bmUuIFRoYXQgaXNuJ3QgaGFuZGxlZCB5ZXQuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzdGF2ZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBtZWFzdXJlc1BhcnNlcihzdGFmZiwgdHVuZSkge1xuXHRcdHZhciB2b2ljZXMgPSBbXTtcblx0XHR2YXIgbGFzdENob3JkID0gbnVsbDtcblx0XHR2YXIgbWVhc3VyZVN0YXJ0Q2hvcmQgPSBudWxsO1xuXHRcdHZhciBmcmFnU3RhcnQgPSBudWxsO1xuXHRcdHZhciBoYXNOb3RlcyA9IGZhbHNlO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdGFmZi52b2ljZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB2b2ljZSA9IHN0YWZmLnZvaWNlc1tpXTtcblx0XHRcdHZvaWNlcy5wdXNoKFtdKTtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2UubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB2b2ljZVtqXTtcblx0XHRcdFx0aWYgKGZyYWdTdGFydCA9PT0gbnVsbCAmJiBlbGVtLnN0YXJ0Q2hhciA+PSAwKSB7XG5cdFx0XHRcdFx0ZnJhZ1N0YXJ0ID0gZWxlbS5zdGFydENoYXI7XG5cdFx0XHRcdFx0aWYgKGVsZW0uY2hvcmQgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdG1lYXN1cmVTdGFydENob3JkID0gbGFzdENob3JkO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdG1lYXN1cmVTdGFydENob3JkID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZWxlbS5jaG9yZClcblx0XHRcdFx0XHRsYXN0Q2hvcmQgPSBlbGVtO1xuXHRcdFx0XHRpZiAoZWxlbS5lbF90eXBlID09PSAnYmFyJykge1xuXHRcdFx0XHRcdGlmIChoYXNOb3Rlcykge1xuXHRcdFx0XHRcdFx0dmFyIGZyYWcgPSB0dW5lLmFiYy5zdWJzdHJpbmcoZnJhZ1N0YXJ0LCBlbGVtLmVuZENoYXIpO1xuXHRcdFx0XHRcdFx0dmFyIG1lYXN1cmUgPSB7YWJjOiBmcmFnfTtcblx0XHRcdFx0XHRcdGxhc3RDaG9yZCA9IG1lYXN1cmVTdGFydENob3JkICYmIG1lYXN1cmVTdGFydENob3JkLmNob3JkICYmIG1lYXN1cmVTdGFydENob3JkLmNob3JkLmxlbmd0aCA+IDAgPyBtZWFzdXJlU3RhcnRDaG9yZC5jaG9yZFswXS5uYW1lIDogbnVsbDtcblx0XHRcdFx0XHRcdGlmIChsYXN0Q2hvcmQpXG5cdFx0XHRcdFx0XHRcdG1lYXN1cmUubGFzdENob3JkID0gbGFzdENob3JkO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW0uc3RhcnRFbmRpbmcpXG5cdFx0XHRcdFx0XHRcdG1lYXN1cmUuc3RhcnRFbmRpbmcgPSBlbGVtLnN0YXJ0RW5kaW5nO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW0uZW5kRW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRtZWFzdXJlLmVuZEVuZGluZyA9IGVsZW0uZW5kRW5kaW5nO1xuXHRcdFx0XHRcdFx0dm9pY2VzW2ldLnB1c2gobWVhc3VyZSk7XG5cdFx0XHRcdFx0XHRmcmFnU3RhcnQgPSBudWxsO1xuXHRcdFx0XHRcdFx0aGFzTm90ZXMgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZWxlbS5lbF90eXBlID09PSAnbm90ZScpIHtcblx0XHRcdFx0XHRoYXNOb3RlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZvaWNlcztcblx0fVxuXG5cdHR1bmVib29rLmV4dHJhY3RNZWFzdXJlcyA9IGZ1bmN0aW9uKGFiYykge1xuXHRcdHZhciB0dW5lcyA9IFtdO1xuXHRcdHZhciBib29rID0gbmV3IFR1bmVCb29rKGFiYyk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBib29rLnR1bmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdHVuZSA9IGJvb2sudHVuZXNbaV07XG5cdFx0XHR2YXIgYXJyID0gdHVuZS5hYmMuc3BsaXQoXCJLOlwiKTtcblx0XHRcdHZhciBhcnIyID0gYXJyWzFdLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0dmFyIGhlYWRlciA9IGFyclswXSArIFwiSzpcIiArIGFycjJbMF0gKyBcIlxcblwiO1xuXHRcdFx0dmFyIGxhc3RDaG9yZCA9IG51bGw7XG5cdFx0XHR2YXIgbWVhc3VyZVN0YXJ0Q2hvcmQgPSBudWxsO1xuXHRcdFx0dmFyIGZyYWdTdGFydCA9IG51bGw7XG5cdFx0XHR2YXIgbWVhc3VyZXMgPSBbXTtcblx0XHRcdHZhciBoYXNOb3RlcyA9IGZhbHNlO1xuXHRcdFx0dmFyIHR1bmVPYmogPSB0dW5lYm9vay5wYXJzZU9ubHkodHVuZS5hYmMpWzBdO1xuXHRcdFx0dmFyIGhhc1BpY2t1cCA9IHR1bmVPYmouZ2V0UGlja3VwTGVuZ3RoKCkgPiAwO1xuXHRcdFx0Ly8gdmFyIHN0YXZlcyA9IGZsYXR0ZW5UdW5lKHR1bmVPYmopO1xuXHRcdFx0Ly8gZm9yICh2YXIgcyA9IDA7IHMgPCBzdGF2ZXMubGVuZ3RoOyBzKyspIHtcblx0XHRcdC8vIFx0dmFyIHZvaWNlcyA9IG1lYXN1cmVzUGFyc2VyKHN0YXZlc1tzXSwgdHVuZSk7XG5cdFx0XHQvLyBcdGlmIChzID09PSAwKVxuXHRcdFx0Ly8gXHRcdG1lYXN1cmVzID0gdm9pY2VzO1xuXHRcdFx0Ly8gXHRlbHNlIHtcblx0XHRcdC8vIFx0XHRmb3IgKHZhciBzcyA9IDA7IHNzIDwgdm9pY2VzLmxlbmd0aDsgc3MrKykge1xuXHRcdFx0Ly8gXHRcdFx0dmFyIHZvaWNlID0gdm9pY2VzW3NzXTtcblx0XHRcdC8vIFx0XHRcdGlmIChtZWFzdXJlcy5sZW5ndGggPD0gc3MpXG5cdFx0XHQvLyBcdFx0XHRcdG1lYXN1cmVzLnB1c2goW10pO1xuXHRcdFx0Ly8gXHRcdFx0dmFyIG1lYXN1cmVWb2ljZSA9IG1lYXN1cmVzW3NzXTtcblx0XHRcdC8vIFx0XHRcdGZvciAodmFyIHNzcyA9IDA7IHNzcyA8IHZvaWNlLmxlbmd0aDsgc3NzKyspIHtcblx0XHRcdC8vIFx0XHRcdFx0aWYgKG1lYXN1cmVWb2ljZS5sZW5ndGggPiBzc3MpXG5cdFx0XHQvLyBcdFx0XHRcdFx0bWVhc3VyZVZvaWNlW3Nzc10uYWJjICs9IFwiXFxuXCIgKyB2b2ljZVtzc3NdLmFiYztcblx0XHRcdC8vIFx0XHRcdFx0ZWxzZVxuXHRcdFx0Ly8gXHRcdFx0XHRcdG1lYXN1cmVzLnB1c2godm9pY2Vbc3NzXSk7XG5cdFx0XHQvLyBcdFx0XHR9XG5cdFx0XHQvLyBcdFx0fVxuXHRcdFx0Ly8gXHR9XG5cdFx0XHQvLyBcdGNvbnNvbGUubG9nKHZvaWNlcyk7XG5cdFx0XHQvLyB9XG5cdFx0XHQvLyBtZWFzdXJlcyA9IG1lYXN1cmVzWzBdO1xuXG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHR1bmVPYmoubGluZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0dmFyIGxpbmUgPSB0dW5lT2JqLmxpbmVzW2pdO1xuXHRcdFx0XHRpZiAobGluZS5zdGFmZikge1xuXHRcdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgMSAvKmxpbmUuc3RhZmYubGVuZ3RoKi87IGsrKykge1xuXHRcdFx0XHRcdFx0dmFyIHN0YWZmID0gbGluZS5zdGFmZltrXTtcblx0XHRcdFx0XHRcdGZvciAodmFyIGtrID0gMDsga2sgPCAxIC8qc3RhZmYudm9pY2VzLmxlbmd0aCovOyBraysrKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB2b2ljZSA9IHN0YWZmLnZvaWNlc1tra107XG5cdFx0XHRcdFx0XHRcdGZvciAodmFyIGtrayA9IDA7IGtrayA8IHZvaWNlLmxlbmd0aDsga2trKyspIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgZWxlbSA9IHZvaWNlW2tra107XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZyYWdTdGFydCA9PT0gbnVsbCAmJiBlbGVtLnN0YXJ0Q2hhciA+PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmcmFnU3RhcnQgPSBlbGVtLnN0YXJ0Q2hhcjtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtLmNob3JkID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lYXN1cmVTdGFydENob3JkID0gbGFzdENob3JkO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtZWFzdXJlU3RhcnRDaG9yZCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtLmNob3JkKVxuXHRcdFx0XHRcdFx0XHRcdFx0bGFzdENob3JkID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlbS5lbF90eXBlID09PSAnYmFyJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGhhc05vdGVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBmcmFnID0gdHVuZS5hYmMuc3Vic3RyaW5nKGZyYWdTdGFydCwgZWxlbS5lbmRDaGFyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIG1lYXN1cmUgPSB7YWJjOiBmcmFnfTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFzdENob3JkID0gbWVhc3VyZVN0YXJ0Q2hvcmQgJiYgbWVhc3VyZVN0YXJ0Q2hvcmQuY2hvcmQgJiYgbWVhc3VyZVN0YXJ0Q2hvcmQuY2hvcmQubGVuZ3RoID4gMCA/IG1lYXN1cmVTdGFydENob3JkLmNob3JkWzBdLm5hbWUgOiBudWxsO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdENob3JkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lYXN1cmUubGFzdENob3JkID0gbGFzdENob3JkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlbS5zdGFydEVuZGluZylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZWFzdXJlLnN0YXJ0RW5kaW5nID0gZWxlbS5zdGFydEVuZGluZztcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW0uZW5kRW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lYXN1cmUuZW5kRW5kaW5nID0gZWxlbS5lbmRFbmRpbmc7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZyYWdTdGFydCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhhc05vdGVzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGVtLmVsX3R5cGUgPT09ICdub3RlJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aGFzTm90ZXMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dHVuZXMucHVzaCh7XG5cdFx0XHRcdGhlYWRlcjogaGVhZGVyLFxuXHRcdFx0XHRtZWFzdXJlczogbWVhc3VyZXMsXG5cdFx0XHRcdGhhc1BpY2t1cDogaGFzUGlja3VwXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHR1bmVzO1xuXHR9O1xufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0dW5lYm9vaztcbiIsIi8vICAgIGFiY19hYnNvbHV0ZV9lbGVtZW50LmpzOiBEZWZpbml0aW9uIG9mIHRoZSBBYnNvbHV0ZUVsZW1lbnQgY2xhc3MuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBzcGFjaW5nID0gcmVxdWlyZSgnLi9hYmNfc3BhY2luZycpO1xuXG4vLyBkdXJhdGlvbiAtIGFjdHVhbCBtdXNpY2FsIGR1cmF0aW9uIC0gZGlmZmVyZW50IGZyb20gbm90ZWhlYWQgZHVyYXRpb24gaW4gdHJpcGxldHMuIHJlZmVyIHRvIGFiY2VsZW0gdG8gZ2V0IHRoZSBub3RlaGVhZCBkdXJhdGlvblxuLy8gbWluc3BhY2luZyAtIHNwYWNpbmcgd2hpY2ggbXVzdCBiZSB0YWtlbiBvbiB0b3Agb2YgdGhlIHdpZHRoIGRlZmluZWQgYnkgdGhlIGR1cmF0aW9uXG4vLyB0eXBlIGlzIGEgbWV0YS10eXBlIGZvciB0aGUgZWxlbWVudC4gSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJhd2luZywgYnV0IGl0IGlzIHVzZWZ1bCB0byBtYWtlIHNlbWFudGljIHNlbnNlIG9mIHRoZSBlbGVtZW50LiBGb3IgaW5zdGFuY2UsIGl0IGNhbiBiZSB1c2VkIGluIHRoZSBlbGVtZW50J3MgY2xhc3MgbmFtZS5cbnZhciBBYnNvbHV0ZUVsZW1lbnQgPSBmdW5jdGlvbiBBYnNvbHV0ZUVsZW1lbnQoYWJjZWxlbSwgZHVyYXRpb24sIG1pbnNwYWNpbmcsIHR5cGUsIHR1bmVOdW1iZXIsIG9wdGlvbnMpIHtcblx0Ly9jb25zb2xlLmxvZyhcIkFic29sdXRlOlwiLGFiY2VsZW0sIHR5cGUpO1xuXHRpZiAoIW9wdGlvbnMpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHR0aGlzLnR1bmVOdW1iZXIgPSB0dW5lTnVtYmVyO1xuXHR0aGlzLmFiY2VsZW0gPSBhYmNlbGVtO1xuXHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cdHRoaXMuZHVyYXRpb25DbGFzcyA9IG9wdGlvbnMuZHVyYXRpb25DbGFzc092ZXJpZGUgPyBvcHRpb25zLmR1cmF0aW9uQ2xhc3NPdmVyaWRlIDogdGhpcy5kdXJhdGlvbjtcblx0dGhpcy5taW5zcGFjaW5nID0gbWluc3BhY2luZyB8fCAwO1xuXHR0aGlzLnggPSAwO1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cdHRoaXMuaGVhZHMgPSBbXTtcblx0dGhpcy5leHRyYSA9IFtdO1xuXHR0aGlzLmV4dHJhdyA9IDA7XG5cdC8vdGhpcy5kZWNzID0gW107XG5cdHRoaXMudyA9IDA7XG5cdHRoaXMucmlnaHQgPSBbXTtcblx0dGhpcy5pbnZpc2libGUgPSBmYWxzZTtcblx0dGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG5cdHRoaXMudG9wID0gdW5kZWZpbmVkO1xuXHR0aGlzLnR5cGUgPSB0eXBlO1xuXHQvLyB0aGVzZSBhcmUgdGhlIGhlaWdodHMgb2YgYWxsIG9mIHRoZSB2ZXJ0aWNhbCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIHBsYWNlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuXHQvLyB0aGUgdmVydGljYWwgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgYWJvdmUgaXM6IHRlbXBvLCBwYXJ0LCB2b2x1bWUvZHluYW1pYywgZW5kaW5nL2Nob3JkLCBseXJpY1xuXHQvLyB0aGUgdmVydGljYWwgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgYmVsb3cgaXM6IGx5cmljLCBjaG9yZCwgdm9sdW1lL2R5bmFtaWNcblx0dGhpcy5zcGVjaWFsWSA9IHtcblx0XHR0ZW1wb0hlaWdodEFib3ZlOiAwLFxuXHRcdHBhcnRIZWlnaHRBYm92ZTogMCxcblx0XHR2b2x1bWVIZWlnaHRBYm92ZTogMCxcblx0XHRkeW5hbWljSGVpZ2h0QWJvdmU6IDAsXG5cdFx0ZW5kaW5nSGVpZ2h0QWJvdmU6IDAsXG5cdFx0Y2hvcmRIZWlnaHRBYm92ZTogMCxcblx0XHRseXJpY0hlaWdodEFib3ZlOiAwLFxuXG5cdFx0bHlyaWNIZWlnaHRCZWxvdzogMCxcblx0XHRjaG9yZEhlaWdodEJlbG93OiAwLFxuXHRcdHZvbHVtZUhlaWdodEJlbG93OiAwLFxuXHRcdGR5bmFtaWNIZWlnaHRCZWxvdzogMFxuXHR9O1xufTtcblxuLy8gRm9yIGVhY2ggb2YgdGhlIHJlbGF0aXZlIGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgcGxhY2VkIGluIGFkdmFuY2UgKGJlY2F1c2UgdGhlaXIgdmVydGljYWwgcGxhY2VtZW50IGRlcGVuZHMgb24gZXZlcnl0aGluZ1xuLy8gZWxzZSBvbiB0aGUgbGluZSksIHRoaXMgaXRlcmF0ZXMgdGhyb3VnaCB0aGVtIGFuZCBzZXRzIHRoZWlyIHBpdGNoLiBCeSB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCwgc3BlY2lhbFlSZXNvbHZlZCBjb250YWlucyBhXG4vLyBoYXNoIHdpdGggdGhlIHZlcnRpY2FsIHBsYWNlbWVudCAoaW4gcGl0Y2ggdW5pdHMpIGZvciBlYWNoIHR5cGUuXG4vLyBUT0RPLVBFUjogSSB0aGluayB0aGlzIG5lZWRzIHRvIGJlIHNlcGFyYXRlZCBieSBcImFib3ZlXCIgYW5kIFwiYmVsb3dcIi4gSG93IGRvIHdlIGtub3cgdGhhdCBmb3IgZHluYW1pY3MgYXQgdGhlIHBvaW50IHdoZXJlIHRoZXkgYXJlIGJlaW5nIGRlZmluZWQsIHRob3VnaD8gV2UgbmVlZCBhIHBhc3MgdGhyb3VnaCBhbGwgdGhlIHJlbGF0aXZlIGVsZW1lbnRzIHRvIHNldCBcImFib3ZlXCIgYW5kIFwiYmVsb3dcIi5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzID0gZnVuY3Rpb24oc3BlY2lhbFlSZXNvbHZlZCkge1xuXHQvLyBzcGVjaWFsWVJlc29sdmVkIGNvbnRhaW5zIHRoZSBhY3R1YWwgcGl0Y2ggZm9yIGVhY2ggb2YgdGhlIGNsYXNzZXMgb2YgZWxlbWVudHMuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG5cdFx0Zm9yICh2YXIga2V5IGluIHRoaXMuc3BlY2lhbFkpIHsgLy8gZm9yIGVhY2ggY2xhc3Mgb2YgZWxlbWVudCB0aGF0IG5lZWRzIHRvIGJlIHBsYWNlZCB2ZXJ0aWNhbGx5XG5cdFx0XHRpZiAodGhpcy5zcGVjaWFsWS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdGlmIChjaGlsZFtrZXldKSB7IC8vIElmIHRoaXMgcmVsYXRpdmUgZWxlbWVudCBoYXMgZGVmaW5lZCBhIGhlaWdodCBmb3IgdGhpcyBjbGFzcyBvZiBlbGVtZW50XG5cdFx0XHRcdFx0Y2hpbGQucGl0Y2ggPSBzcGVjaWFsWVJlc29sdmVkW2tleV07XG5cdFx0XHRcdFx0aWYgKGNoaWxkLnRvcCA9PT0gdW5kZWZpbmVkKSB7IC8vIFRPRE8tUEVSOiBIQUNLISBOb3Qgc3VyZSB0aGlzIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyB0aGlzLlxuXHRcdFx0XHRcdFx0Y2hpbGQuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzKHNwZWNpYWxZUmVzb2x2ZWQpO1xuXHRcdFx0XHRcdFx0dGhpcy5wdXNoVG9wKGNoaWxkLnRvcCk7XG5cdFx0XHRcdFx0XHR0aGlzLnB1c2hCb3R0b20oY2hpbGQuYm90dG9tKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuZ2V0TWluV2lkdGggPSBmdW5jdGlvbiAoKSB7IC8vIGFic29sdXRlIHNwYWNlIHRha2VuIHRvIHRoZSByaWdodCBvZiB0aGUgbm90ZVxuXHRyZXR1cm4gdGhpcy53O1xufTtcblxuQWJzb2x1dGVFbGVtZW50LnByb3RvdHlwZS5nZXRFeHRyYVdpZHRoID0gZnVuY3Rpb24gKCkgeyAvLyBzcGFjZSBuZWVkZWQgdG8gdGhlIGxlZnQgb2YgdGhlIG5vdGVcblx0cmV0dXJuIC10aGlzLmV4dHJhdztcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuYWRkRXh0cmEgPSBmdW5jdGlvbiAoZXh0cmEpIHtcblx0aWYgKGV4dHJhLmR4PHRoaXMuZXh0cmF3KSB0aGlzLmV4dHJhdyA9IGV4dHJhLmR4O1xuXHR0aGlzLmV4dHJhW3RoaXMuZXh0cmEubGVuZ3RoXSA9IGV4dHJhO1xuXHR0aGlzLmFkZENoaWxkKGV4dHJhKTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuYWRkSGVhZCA9IGZ1bmN0aW9uIChoZWFkKSB7XG5cdGlmIChoZWFkLmR4PHRoaXMuZXh0cmF3KSB0aGlzLmV4dHJhdyA9IGhlYWQuZHg7XG5cdHRoaXMuaGVhZHNbdGhpcy5oZWFkcy5sZW5ndGhdID0gaGVhZDtcblx0dGhpcy5hZGRSaWdodChoZWFkKTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuYWRkUmlnaHQgPSBmdW5jdGlvbiAocmlnaHQpIHtcblx0aWYgKHJpZ2h0LmR4K3JpZ2h0Lnc+dGhpcy53KSB0aGlzLncgPSByaWdodC5keCtyaWdodC53O1xuXHR0aGlzLnJpZ2h0W3RoaXMucmlnaHQubGVuZ3RoXSA9IHJpZ2h0O1xuXHR0aGlzLmFkZENoaWxkKHJpZ2h0KTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuYWRkQ2VudGVyZWQgPSBmdW5jdGlvbiAoZWxlbSkge1xuXHR2YXIgaGFsZiA9IGVsZW0udy8yO1xuXHRpZiAoLWhhbGY8dGhpcy5leHRyYXcpIHRoaXMuZXh0cmF3ID0gLWhhbGY7XG5cdHRoaXMuZXh0cmFbdGhpcy5leHRyYS5sZW5ndGhdID0gZWxlbTtcblx0aWYgKGVsZW0uZHgraGFsZj50aGlzLncpIHRoaXMudyA9IGVsZW0uZHgraGFsZjtcblx0dGhpcy5yaWdodFt0aGlzLnJpZ2h0Lmxlbmd0aF0gPSBlbGVtO1xuXHR0aGlzLmFkZENoaWxkKGVsZW0pO1xufTtcblxuQWJzb2x1dGVFbGVtZW50LnByb3RvdHlwZS5zZXRMaW1pdCA9IGZ1bmN0aW9uKG1lbWJlciwgY2hpbGQpIHtcblx0aWYgKCFjaGlsZFttZW1iZXJdKSByZXR1cm47XG5cdGlmICghdGhpcy5zcGVjaWFsWVttZW1iZXJdKVxuXHRcdHRoaXMuc3BlY2lhbFlbbWVtYmVyXSA9IGNoaWxkW21lbWJlcl07XG5cdGVsc2Vcblx0XHR0aGlzLnNwZWNpYWxZW21lbWJlcl0gPSBNYXRoLm1heCh0aGlzLnNwZWNpYWxZW21lbWJlcl0sIGNoaWxkW21lbWJlcl0pO1xufTtcblxuQWJzb2x1dGVFbGVtZW50LnByb3RvdHlwZS5hZGRDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuXHQvL2NvbnNvbGUubG9nKFwiUmVsYXRpdmU6XCIsY2hpbGQpO1xuXHRjaGlsZC5wYXJlbnQgPSB0aGlzO1xuXHR0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IGNoaWxkO1xuXHR0aGlzLnB1c2hUb3AoY2hpbGQudG9wKTtcblx0dGhpcy5wdXNoQm90dG9tKGNoaWxkLmJvdHRvbSk7XG5cdHRoaXMuc2V0TGltaXQoJ3RlbXBvSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ3BhcnRIZWlnaHRBYm92ZScsIGNoaWxkKTtcblx0dGhpcy5zZXRMaW1pdCgndm9sdW1lSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2R5bmFtaWNIZWlnaHRBYm92ZScsIGNoaWxkKTtcblx0dGhpcy5zZXRMaW1pdCgnZW5kaW5nSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2Nob3JkSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2x5cmljSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2x5cmljSGVpZ2h0QmVsb3cnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2Nob3JkSGVpZ2h0QmVsb3cnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ3ZvbHVtZUhlaWdodEJlbG93JywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdkeW5hbWljSGVpZ2h0QmVsb3cnLCBjaGlsZCk7XG59O1xuXG5BYnNvbHV0ZUVsZW1lbnQucHJvdG90eXBlLnB1c2hUb3AgPSBmdW5jdGlvbiAodG9wKSB7XG5cdGlmICh0b3AgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLnRvcCA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0dGhpcy50b3AgPSB0b3A7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy50b3AgPSBNYXRoLm1heCh0b3AsIHRoaXMudG9wKTtcblx0fVxufTtcblxuQWJzb2x1dGVFbGVtZW50LnByb3RvdHlwZS5wdXNoQm90dG9tID0gZnVuY3Rpb24gKGJvdHRvbSkge1xuXHRpZiAoYm90dG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodGhpcy5ib3R0b20gPT09IHVuZGVmaW5lZClcblx0XHRcdHRoaXMuYm90dG9tID0gYm90dG9tO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuYm90dG9tID0gTWF0aC5taW4oYm90dG9tLCB0aGlzLmJvdHRvbSk7XG5cdH1cbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuc2V0WCA9IGZ1bmN0aW9uICh4KSB7XG5cdHRoaXMueCA9IHg7XG5cdGZvciAodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuXHRcdHRoaXMuY2hpbGRyZW5baV0uc2V0WCh4KTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuc2V0SGludCA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5oaW50ID0gdHJ1ZTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChyZW5kZXJlciwgYmFydG9wKSB7XG5cdGlmICh0aGlzLmludmlzaWJsZSkgcmV0dXJuO1xuXHR0aGlzLmVsZW1zZXQgPSBbXTtcblx0cmVuZGVyZXIuYmVnaW5Hcm91cCgpO1xuXHRmb3IgKHZhciBpPTA7IGk8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdGlmICgvKkFCQ0pTLndyaXRlLmRlYnVnUGxhY2VtZW50Ki9mYWxzZSkge1xuXHRcdFx0aWYgKHRoaXMuY2hpbGRyZW5baV0ua2xhc3MgPT09ICdvcm5hbWVudCcpXG5cdFx0XHRcdHJlbmRlcmVyLnByaW50U2hhZGVkQm94KHRoaXMueCwgcmVuZGVyZXIuY2FsY1kodGhpcy5jaGlsZHJlbltpXS50b3ApLCB0aGlzLncsIHJlbmRlcmVyLmNhbGNZKHRoaXMuY2hpbGRyZW5baV0uYm90dG9tKS1yZW5kZXJlci5jYWxjWSh0aGlzLmNoaWxkcmVuW2ldLnRvcCksIFwicmdiKDAsMCwyMDApXCIsIDAuMyk7XG5cdFx0fVxuXHRcdHZhciBlbCA9IHRoaXMuY2hpbGRyZW5baV0uZHJhdyhyZW5kZXJlcixiYXJ0b3ApO1xuXHRcdGlmIChlbClcblx0XHRcdHRoaXMuZWxlbXNldC5wdXNoKGVsKTtcblx0fVxuXHR2YXIga2xhc3MgPSB0aGlzLnR5cGU7XG5cdGlmICh0aGlzLnR5cGUgPT09ICdub3RlJyB8fCB0aGlzLnR5cGUgPT09ICdyZXN0Jykge1xuXHRcdGtsYXNzICs9ICcgZCcgKyB0aGlzLmR1cmF0aW9uQ2xhc3M7XG5cdFx0a2xhc3MgPSBrbGFzcy5yZXBsYWNlKC9cXC4vZywgJy0nKTtcblx0XHRpZiAodGhpcy5hYmNlbGVtLnBpdGNoZXMpIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5hYmNlbGVtLnBpdGNoZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0a2xhc3MgKz0gJyBwJyArIHRoaXMuYWJjZWxlbS5waXRjaGVzW2pdLnBpdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR2YXIgZyA9IHJlbmRlcmVyLmVuZEdyb3VwKGtsYXNzKTtcblx0aWYgKGcpXG5cdFx0dGhpcy5lbGVtc2V0LnB1c2goZyk7XG5cdGlmICh0aGlzLmtsYXNzKVxuXHRcdHRoaXMuc2V0Q2xhc3MoXCJtYXJrXCIsIFwiXCIsIFwiIzAwZmYwMFwiKTtcblx0aWYgKHRoaXMuaGludClcblx0XHR0aGlzLnNldENsYXNzKFwiYWJjanMtaGludFwiLCBcIlwiLCBudWxsKTtcblx0dmFyIG9wYWNpdHkgPSAvKkFCQ0pTLndyaXRlLmRlYnVnUGxhY2VtZW50Ki9mYWxzZSA/IDAuMyA6IDA7IC8vIENyZWF0ZSB0cmFuc3BhcmVudCBib3ggdGhhdCBlbmNvbXBhc3NlcyB0aGUgZWxlbWVudCwgYW5kIG5vdCBzbyB0cmFuc3BhcmVudCB0byBkZWJ1ZyBpdC5cblx0dmFyIHRhcmdldCA9IHJlbmRlcmVyLnByaW50U2hhZGVkQm94KHRoaXMueCwgcmVuZGVyZXIuY2FsY1kodGhpcy50b3ApLCB0aGlzLncsIHJlbmRlcmVyLmNhbGNZKHRoaXMuYm90dG9tKS1yZW5kZXJlci5jYWxjWSh0aGlzLnRvcCksIFwiIzAwMDAwMFwiLCBvcGFjaXR5KTtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgY29udHJvbGxlciA9IHJlbmRlcmVyLmNvbnRyb2xsZXI7XG5cdHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xuXHRcdHZhciBjbGFzc2VzID0gW107XG5cdFx0aWYgKHNlbGYuZWxlbXNldCkge1xuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmVsZW1zZXQubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0dmFyIGVzID0gc2VsZi5lbGVtc2V0W2pdO1xuXHRcdFx0XHRpZiAoZXMpXG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGVzLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29udHJvbGxlci5ub3RpZnlTZWxlY3Qoc2VsZiwgc2VsZi50dW5lTnVtYmVyLCBjbGFzc2VzKTtcblx0fSk7XG5cdHRoaXMuYWJjZWxlbS5hYnNlbGVtID0gdGhpcztcblxuXHR2YXIgc3RlcCA9IHNwYWNpbmcuU1RFUDtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuaXNJRT0vKkBjY19vbiFAKi9mYWxzZTsvL0lFIGRldGVjdG9yXG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUuc2V0Q2xhc3MgPSBmdW5jdGlvbiAoYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBjb2xvcikge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbXNldC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBlbCA9IHRoaXMuZWxlbXNldFtpXTtcblx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGNvbG9yKTtcblx0XHR2YXIga2xzID0gZWwuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG5cdFx0aWYgKCFrbHMpIGtscyA9IFwiXCI7XG5cdFx0a2xzID0ga2xzLnJlcGxhY2UocmVtb3ZlQ2xhc3MsIFwiXCIpO1xuXHRcdGtscyA9IGtscy5yZXBsYWNlKGFkZENsYXNzLCBcIlwiKTtcblx0XHRpZiAoYWRkQ2xhc3MubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKGtscy5sZW5ndGggPiAwICYmIGtscy5jaGFyQXQoa2xzLmxlbmd0aCAtIDEpICE9PSAnICcpIGtscyArPSBcIiBcIjtcblx0XHRcdGtscyArPSBhZGRDbGFzcztcblx0XHR9XG5cdFx0ZWwuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwga2xzKTtcblx0fVxufTtcblxuQWJzb2x1dGVFbGVtZW50LnByb3RvdHlwZS5oaWdobGlnaHQgPSBmdW5jdGlvbiAoa2xhc3MsIGNvbG9yKSB7XG5cdGlmIChrbGFzcyA9PT0gdW5kZWZpbmVkKVxuXHRcdGtsYXNzID0gXCJhYmNqcy1ub3RlX3NlbGVjdGVkXCI7XG5cdGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKVxuXHRcdGNvbG9yID0gXCIjZmYwMDAwXCI7XG5cdHRoaXMuc2V0Q2xhc3Moa2xhc3MsIFwiXCIsIGNvbG9yKTtcbn07XG5cbkFic29sdXRlRWxlbWVudC5wcm90b3R5cGUudW5oaWdobGlnaHQgPSBmdW5jdGlvbiAoa2xhc3MsIGNvbG9yKSB7XG5cdGlmIChrbGFzcyA9PT0gdW5kZWZpbmVkKVxuXHRcdGtsYXNzID0gXCJhYmNqcy1ub3RlX3NlbGVjdGVkXCI7XG5cdGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKVxuXHRcdGNvbG9yID0gXCIjMDAwMDAwXCI7XG5cdHRoaXMuc2V0Q2xhc3MoXCJcIiwga2xhc3MsIGNvbG9yKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQWJzb2x1dGVFbGVtZW50O1xuIiwiLy8gICAgYWJjX3JlbGF0aXZlX2VsZW1lbnQuanM6IERlZmluaXRpb24gb2YgdGhlIFJlbGF0aXZlRWxlbWVudCBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIFJlbGF0aXZlRWxlbWVudCA9IGZ1bmN0aW9uIFJlbGF0aXZlRWxlbWVudChjLCBkeCwgdywgcGl0Y2gsIG9wdCkge1xuXHRvcHQgPSBvcHQgfHwge307XG5cdHRoaXMueCA9IDA7XG5cdHRoaXMuYyA9IGM7ICAgICAgLy8gY2hhcmFjdGVyIG9yIHBhdGggb3Igc3RyaW5nXG5cdHRoaXMuZHggPSBkeDsgICAgLy8gcmVsYXRpdmUgeCBwb3NpdGlvblxuXHR0aGlzLncgPSB3OyAgICAgIC8vIG1pbmltdW0gd2lkdGggdGFrZW4gdXAgYnkgdGhpcyBlbGVtZW50IChjYW4gaW5jbHVkZSBncmF0dWl0b3VzIHNwYWNlKVxuXHR0aGlzLnBpdGNoID0gcGl0Y2g7IC8vIHJlbGF0aXZlIHkgcG9zaXRpb24gYnkgcGl0Y2hcblx0dGhpcy5zY2FsZXggPSBvcHQuc2NhbGV4IHx8IDE7IC8vIHNob3VsZCB0aGUgY2hhcmFjdGVyL3BhdGggYmUgc2NhbGVkP1xuXHR0aGlzLnNjYWxleSA9IG9wdC5zY2FsZXkgfHwgMTsgLy8gc2hvdWxkIHRoZSBjaGFyYWN0ZXIvcGF0aCBiZSBzY2FsZWQ/XG5cdHRoaXMudHlwZSA9IG9wdC50eXBlIHx8IFwic3ltYm9sXCI7IC8vIGNoZWFwIHR5cGVzLlxuXHR0aGlzLnBpdGNoMiA9IG9wdC5waXRjaDI7XG5cdHRoaXMubGluZXdpZHRoID0gb3B0LmxpbmV3aWR0aDtcblx0dGhpcy5rbGFzcyA9IG9wdC5rbGFzcztcblx0dGhpcy50b3AgPSBwaXRjaDtcblx0aWYgKHRoaXMucGl0Y2gyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5waXRjaDIgPiB0aGlzLnRvcCkgdGhpcy50b3AgPSB0aGlzLnBpdGNoMjtcblx0dGhpcy5ib3R0b20gPSBwaXRjaDtcblx0aWYgKHRoaXMucGl0Y2gyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5waXRjaDIgPCB0aGlzLmJvdHRvbSkgdGhpcy5ib3R0b20gPSB0aGlzLnBpdGNoMjtcblx0aWYgKG9wdC50aGlja25lc3MpIHtcblx0XHR0aGlzLnRvcCArPSBvcHQudGhpY2tuZXNzLzI7XG5cdFx0dGhpcy5ib3R0b20gLT0gb3B0LnRoaWNrbmVzcy8yO1xuXHR9XG5cdGlmIChvcHQuc3RlbUhlaWdodCkge1xuXHRcdGlmIChvcHQuc3RlbUhlaWdodCA+IDApXG5cdFx0XHR0aGlzLnRvcCArPSBvcHQuc3RlbUhlaWdodDtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmJvdHRvbSArPSBvcHQuc3RlbUhlaWdodDtcblx0fVxuXHQvL2lmICh0aGlzLnR5cGUgPT09IFwic3ltYm9sXCIpIHtcblx0Ly9cdHZhciBvZmZzZXQgPSBnbHlwaHMuZ2V0WUNvcnIodGhpcy5jKTtcblx0Ly9cdHRoaXMudG9wICs9IG9mZnNldDtcblx0Ly9cdHRoaXMuYm90dG9tICs9IG9mZnNldDtcblx0Ly99XG5cdHRoaXMuaGVpZ2h0ID0gb3B0LmhlaWdodCA/IG9wdC5oZWlnaHQgOiA0OyAvLyBUaGUgKzEgaXMgdG8gZ2l2ZSBhIGxpdHRsZSBiaXQgb2YgcGFkZGluZy5cblx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5ID0gZmFsc2U7XG5cdHN3aXRjaCAodGhpcy50eXBlKSB7XG5cdFx0Y2FzZSBcImRlYnVnXCI6XG5cdFx0XHR0aGlzLmNob3JkSGVpZ2h0QWJvdmUgPSB0aGlzLmhlaWdodDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJseXJpY1wiOlxuXHRcdFx0aWYgKG9wdC5wb3NpdGlvbiAmJiBvcHQucG9zaXRpb24gPT09ICdiZWxvdycpXG5cdFx0XHRcdHRoaXMubHlyaWNIZWlnaHRCZWxvdyA9IHRoaXMuaGVpZ2h0O1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmx5cmljSGVpZ2h0QWJvdmUgPSB0aGlzLmhlaWdodDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJjaG9yZFwiOlxuXHRcdFx0aWYgKG9wdC5wb3NpdGlvbiAmJiBvcHQucG9zaXRpb24gPT09ICdiZWxvdycpXG5cdFx0XHRcdHRoaXMuY2hvcmRIZWlnaHRCZWxvdyA9IHRoaXMuaGVpZ2h0O1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmNob3JkSGVpZ2h0QWJvdmUgPSB0aGlzLmhlaWdodDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJ0ZXh0XCI6XG5cdFx0XHRpZiAodGhpcy5waXRjaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChvcHQucG9zaXRpb24gJiYgb3B0LnBvc2l0aW9uID09PSAnYmVsb3cnKVxuXHRcdFx0XHRcdHRoaXMuY2hvcmRIZWlnaHRCZWxvdyA9IHRoaXMuaGVpZ2h0O1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5jaG9yZEhlaWdodEFib3ZlID0gdGhpcy5oZWlnaHQ7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5ID0gdHJ1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJwYXJ0XCI6IHRoaXMucGFydEhlaWdodEFib3ZlID0gdGhpcy5oZWlnaHQ7IGJyZWFrO1xuXHR9XG59O1xuXG5SZWxhdGl2ZUVsZW1lbnQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuXHR0aGlzLnggPSB4K3RoaXMuZHg7XG59O1xuXG5SZWxhdGl2ZUVsZW1lbnQucHJvdG90eXBlLnNldFVwcGVyQW5kTG93ZXJFbGVtZW50cyA9IGZ1bmN0aW9uKHBvc2l0aW9uWSkge1xuXHRzd2l0Y2godGhpcy50eXBlKSB7XG5cdFx0Y2FzZSBcInBhcnRcIjpcblx0XHRcdHRoaXMudG9wID0gcG9zaXRpb25ZLnBhcnRIZWlnaHRBYm92ZSArIHRoaXMuaGVpZ2h0O1xuXHRcdFx0dGhpcy5ib3R0b20gPSBwb3NpdGlvblkucGFydEhlaWdodEFib3ZlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcInRleHRcIjpcblx0XHRjYXNlIFwiY2hvcmRcIjpcblx0XHRcdGlmICh0aGlzLmNob3JkSGVpZ2h0QWJvdmUpIHtcblx0XHRcdFx0dGhpcy50b3AgPSBwb3NpdGlvblkuY2hvcmRIZWlnaHRBYm92ZTtcblx0XHRcdFx0dGhpcy5ib3R0b20gPSBwb3NpdGlvblkuY2hvcmRIZWlnaHRBYm92ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMudG9wID0gcG9zaXRpb25ZLmNob3JkSGVpZ2h0QmVsb3c7XG5cdFx0XHRcdHRoaXMuYm90dG9tID0gcG9zaXRpb25ZLmNob3JkSGVpZ2h0QmVsb3c7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwibHlyaWNcIjpcblx0XHRcdGlmICh0aGlzLmx5cmljSGVpZ2h0QWJvdmUpIHtcblx0XHRcdFx0dGhpcy50b3AgPSBwb3NpdGlvblkubHlyaWNIZWlnaHRBYm92ZTtcblx0XHRcdFx0dGhpcy5ib3R0b20gPSBwb3NpdGlvblkubHlyaWNIZWlnaHRBYm92ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMudG9wID0gcG9zaXRpb25ZLmx5cmljSGVpZ2h0QmVsb3c7XG5cdFx0XHRcdHRoaXMuYm90dG9tID0gcG9zaXRpb25ZLmx5cmljSGVpZ2h0QmVsb3c7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiZGVidWdcIjpcblx0XHRcdHRoaXMudG9wID0gcG9zaXRpb25ZLmNob3JkSGVpZ2h0QWJvdmU7XG5cdFx0XHR0aGlzLmJvdHRvbSA9IHBvc2l0aW9uWS5jaG9yZEhlaWdodEFib3ZlO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKHRoaXMucGl0Y2ggPT09IHVuZGVmaW5lZCB8fCB0aGlzLnRvcCA9PT0gdW5kZWZpbmVkKVxuXHRcdHdpbmRvdy5jb25zb2xlLmVycm9yKFwiUmVsYXRpdmVFbGVtZW50IHBvc2l0aW9uIG5vdCBzZXQuXCIsIHRoaXMudHlwZSwgdGhpcy5waXRjaCwgdGhpcy50b3AsIHBvc2l0aW9uWSk7XG59O1xuXG5SZWxhdGl2ZUVsZW1lbnQucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAocmVuZGVyZXIsIGJhcnRvcCkge1xuXHRpZiAodGhpcy5waXRjaCA9PT0gdW5kZWZpbmVkKVxuXHRcdHdpbmRvdy5jb25zb2xlLmVycm9yKHRoaXMudHlwZSArIFwiIFJlbGF0aXZlIEVsZW1lbnQgeS1jb29yZGluYXRlIG5vdCBzZXQuXCIpO1xuXHR2YXIgeSA9IHJlbmRlcmVyLmNhbGNZKHRoaXMucGl0Y2gpO1xuXHRzd2l0Y2godGhpcy50eXBlKSB7XG5cdFx0Y2FzZSBcInN5bWJvbFwiOlxuXHRcdFx0aWYgKHRoaXMuYz09PW51bGwpIHJldHVybiBudWxsO1xuXHRcdFx0dmFyIGtsYXNzID0gXCJzeW1ib2xcIjtcblx0XHRcdGlmICh0aGlzLmtsYXNzKSBrbGFzcyArPSBcIiBcIiArIHRoaXMua2xhc3M7XG5cdFx0XHR0aGlzLmdyYXBoZWxlbSA9IHJlbmRlcmVyLnByaW50U3ltYm9sKHRoaXMueCwgdGhpcy5waXRjaCwgdGhpcy5jLCB0aGlzLnNjYWxleCwgdGhpcy5zY2FsZXksIHJlbmRlcmVyLmFkZENsYXNzZXMoa2xhc3MpKTsgYnJlYWs7XG5cdFx0Y2FzZSBcImRlYnVnXCI6XG5cdFx0XHR0aGlzLmdyYXBoZWxlbSA9IHJlbmRlcmVyLnJlbmRlclRleHQodGhpcy54LCByZW5kZXJlci5jYWxjWSgxNSksIFwiXCIrdGhpcy5jLCBcImRlYnVnZm9udFwiLCAnZGVidWctbXNnJywgJ3N0YXJ0Jyk7IGJyZWFrO1xuXHRcdGNhc2UgXCJiYXJOdW1iZXJcIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucmVuZGVyVGV4dCh0aGlzLngsIHksIFwiXCIrdGhpcy5jLCBcIm1lYXN1cmVmb250XCIsICdiYXItbnVtYmVyJywgXCJtaWRkbGVcIik7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwibHlyaWNcIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucmVuZGVyVGV4dCh0aGlzLngsIHksIHRoaXMuYywgXCJ2b2NhbGZvbnRcIiwgJ2x5cmljJywgXCJtaWRkbGVcIik7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiY2hvcmRcIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucmVuZGVyVGV4dCh0aGlzLngsIHksIHRoaXMuYywgJ2djaG9yZGZvbnQnLCBcImNob3JkXCIsIFwibWlkZGxlXCIpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImRlY29yYXRpb25cIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucmVuZGVyVGV4dCh0aGlzLngsIHksIHRoaXMuYywgJ2Fubm90YXRpb25mb250JywgXCJhbm5vdGF0aW9uXCIsIFwibWlkZGxlXCIsIHRydWUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcInRleHRcIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucmVuZGVyVGV4dCh0aGlzLngsIHksIHRoaXMuYywgJ2Fubm90YXRpb25mb250JywgXCJhbm5vdGF0aW9uXCIsIFwic3RhcnRcIiwgdGhpcy5jZW50ZXJWZXJ0aWNhbGx5KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJtdWx0aW1lYXN1cmUtdGV4dFwiOlxuXHRcdFx0dGhpcy5ncmFwaGVsZW0gPSByZW5kZXJlci5yZW5kZXJUZXh0KHRoaXMueCt0aGlzLncvMiwgeSwgdGhpcy5jLCAndGVtcG9mb250JywgXCJyZXN0XCIsIFwibWlkZGxlXCIsIGZhbHNlKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJwYXJ0XCI6XG5cdFx0XHR0aGlzLmdyYXBoZWxlbSA9IHJlbmRlcmVyLnJlbmRlclRleHQodGhpcy54LCB5LCB0aGlzLmMsICdwYXJ0c2ZvbnQnLCBcInBhcnRcIiwgXCJzdGFydFwiKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJiYXJcIjpcblx0XHRcdHRoaXMuZ3JhcGhlbGVtID0gcmVuZGVyZXIucHJpbnRTdGVtKHRoaXMueCwgdGhpcy5saW5ld2lkdGgsIHksIChiYXJ0b3ApP2JhcnRvcDpyZW5kZXJlci5jYWxjWSh0aGlzLnBpdGNoMikpOyBicmVhazsgLy8gYmFydG9wIGNhbid0IGJlIDBcblx0XHRjYXNlIFwic3RlbVwiOlxuXHRcdFx0dGhpcy5ncmFwaGVsZW0gPSByZW5kZXJlci5wcmludFN0ZW0odGhpcy54LCB0aGlzLmxpbmV3aWR0aCwgeSwgcmVuZGVyZXIuY2FsY1kodGhpcy5waXRjaDIpKTsgYnJlYWs7XG5cdFx0Y2FzZSBcImxlZGdlclwiOlxuXHRcdFx0dGhpcy5ncmFwaGVsZW0gPSByZW5kZXJlci5wcmludFN0YXZlTGluZSh0aGlzLngsIHRoaXMueCt0aGlzLncsIHRoaXMucGl0Y2gpOyBicmVhaztcblx0fVxuXHRpZiAodGhpcy5zY2FsZXghPT0xICYmIHRoaXMuZ3JhcGhlbGVtKSB7XG5cdFx0cmVuZGVyZXIuc2NhbGVFeGlzdGluZ0VsZW0odGhpcy5ncmFwaGVsZW0sIHRoaXMuc2NhbGV4LCB0aGlzLnNjYWxleSwgdGhpcy54LCB5KTtcblx0fVxuXHRyZXR1cm4gdGhpcy5ncmFwaGVsZW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlbGF0aXZlRWxlbWVudDtcbiIsIi8vICAgIGFiY19iZWFtX2VsZW1lbnQuanM6IERlZmluaXRpb24gb2YgdGhlIEJlYW1FbGVtIGNsYXNzLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSBhbmQgUGF1bCBSb3NlblxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQWJzb2x1dGVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfYWJzb2x1dGVfZWxlbWVudCcpO1xudmFyIFJlbGF0aXZlRWxlbWVudCA9IHJlcXVpcmUoJy4vYWJjX3JlbGF0aXZlX2VsZW1lbnQnKTtcbnZhciBzcGFjaW5nID0gcmVxdWlyZSgnLi9hYmNfc3BhY2luZycpO1xuXG52YXIgZ2V0RHVybG9nID0gZnVuY3Rpb24oZHVyYXRpb24pIHtcbiAgICAgICAgLy8gVE9ETy1QRVI6IFRoaXMgaXMgYSBoYWNrIHRvIHByZXZlbnQgYSBDaHJvbWUgbG9ja3VwLiBEdXJhdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGRlZmluZWQgYWxyZWFkeSxcbiAgICAgICAgLy8gYnV0IHRoZXJlJ3MgZGVmaW5pdGVseSBhIGNhc2Ugd2hlcmUgaXQgaXNuJ3QuIFtQcm9iYWJseSBzb21ldGhpbmcgdG8gZG8gd2l0aCB0cmlwbGV0cy5dXG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbi8vICAgICAgICBjb25zb2xlLmxvZyhcImdldER1cmxvZzogXCIgKyBkdXJhdGlvbik7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgubG9nKGR1cmF0aW9uKS9NYXRoLmxvZygyKSk7XG59O1xuXG5cbi8vIE1vc3QgZWxlbWVudHMgb24gdGhlIHBhZ2UgYXJlIHJlbGF0ZWQgdG8gYSBwYXJ0aWN1bGFyIGFic29sdXRlIGVsZW1lbnQgLS0gbm90ZXMsIHJlc3RzLCBiYXJzLCBldGMuIEJlYW1zLCBob3dldmVyLCBzcGFuIG11bHRpcGxlIGVsZW1lbnRzLlxuLy8gVGhpcyBtZWFucyB0aGF0IGJlYW1zIGNhbid0IGJlIGxhaWQgb3V0IHVudGlsIHRoZSBhYnNvbHV0ZSBlbGVtZW50cyBhcmUgcGxhY2VkLiBUaGVyZSBpcyB0aGUgZnVydGhlciBjb21wbGljYXRpb24gdGhhdCB0aGUgc3RlbXMgZm9yIGJlYW1lZFxuLy8gbm90ZXMgY2FuJ3QgYmUgbGFpZCBvdXQgdW50aWwgdGhlIGJlYW1zIGFyZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IGxvbmcgdGhleSB3aWxsIGJlIHVudGlsIHdlIGtub3cgdGhlIHNsb3BlIG9mIHRoZSBiZWFtIGFuZCB0aGUgaG9yaXpvbnRhbFxuLy8gc3BhY2luZyBvZiB0aGUgYWJzb2x1dGUgZWxlbWVudHMuXG4vL1xuLy8gU28sIHdoZW4gYSBiZWFtIGlzIGRldGVjdGVkLCBhIEJlYW1FbGVtIGlzIGNyZWF0ZWQsIHRoZW4gYWxsIG5vdGVzIGJlbG9uZ2luZyB0byB0aGF0IGJlYW0gYXJlIGFkZGVkIHRvIGl0LiBUaGVzZSBub3RlcyBhcmUgbm90IGdpdmVuIHN0ZW1zIGF0IHRoYXQgdGltZS5cbi8vIFRoZW4sIGFmdGVyIHRoZSBob3Jpem9udGFsIGxheW91dCBpcyBjb21wbGV0ZSwgYWxsIG9mIHRoZSBCZWFtRWxlbSBhcmUgaXRlcmF0ZWQgdG8gc2V0IHRoZSBiZWFtIHBvc2l0aW9uLCB0aGVuIGFsbCBvZiB0aGUgbm90ZXMgdGhhdCBhcmUgYmVhbWVkIGFyZSBnaXZlblxuLy8gc3RlbXMuIEFmdGVyIHRoYXQsIHdlIGFyZSByZWFkeSBmb3IgdGhlIGRyYXdpbmcgc3RlcC5cblxuLy8gVGhlcmUgYXJlIHRocmVlIHBoYXNlczogdGhlIHNldHVwIHBoYXNlLCB3aGVuIG5ldyBlbGVtZW50cyBhcmUgYmVpbmcgZGlzY292ZXJlZCwgdGhlIGxheW91dCBwaGFzZSwgd2hlbiBldmVyeXRoaW5nIGlzIGNhbGN1bGF0ZWQsIGFuZCB0aGUgZHJhd2luZyBwaGFzZSxcbi8vIHdoZW4gdGhlIG9iamVjdCBpcyBub3QgY2hhbmdlZCwgYnV0IGlzIHVzZWQgdG8gcHV0IHRoZSBlbGVtZW50cyBvbiB0aGUgcGFnZS5cblxudmFyIEJlYW1FbGVtO1xuXG4oZnVuY3Rpb24oKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdC8vXG5cdC8vIFNldHVwIHBoYXNlXG5cdC8vXG5cdEJlYW1FbGVtID0gZnVuY3Rpb24gQmVhbUVsZW0oc3RlbUhlaWdodCwgdHlwZSwgZmxhdCkge1xuXHRcdC8vIHR5cGUgaXMgXCJncmFjZVwiLCBcInVwXCIsIFwiZG93blwiLCBvciB1bmRlZmluZWQuIGZsYXQgaXMgdXNlZCB0byBmb3JjZSBmbGF0IGJlYW1zLCBhcyBpdCBjb21tb25seSBmb3VuZCBpbiB0aGUgZ3JhY2Ugbm90ZXMgb2YgYmFncGlwZSBtdXNpYy5cblx0XHR0aGlzLmlzZmxhdCA9IGZsYXQ7XG5cdFx0dGhpcy5pc2dyYWNlID0gKHR5cGUgJiYgdHlwZSA9PT0gXCJncmFjZVwiKTtcblx0XHR0aGlzLmZvcmNldXAgPSB0aGlzLmlzZ3JhY2UgfHwgKHR5cGUgJiYgdHlwZSA9PT0gXCJ1cFwiKTtcblx0XHR0aGlzLmZvcmNlZG93biA9ICh0eXBlICYmIHR5cGUgPT09IFwiZG93blwiKTtcblx0XHR0aGlzLmVsZW1zID0gW107IC8vIGFsbCB0aGUgQWJzb2x1dGVFbGVtZW50cyB0aGF0IHRoaXMgYmVhbSB0b3VjaGVzLiBJdCBtYXkgaW5jbHVkZSBlbWJlZGRlZCByZXN0cy5cblx0XHR0aGlzLnRvdGFsID0gMDtcblx0XHR0aGlzLmFsbHJlc3RzID0gdHJ1ZTtcblx0XHR0aGlzLnN0ZW1IZWlnaHQgPSBzdGVtSGVpZ2h0O1xuXHRcdHRoaXMuYmVhbXMgPSBbXTsgLy8gRHVyaW5nIHRoZSBsYXlvdXQgcGhhc2UsIHRoaXMgd2lsbCBiZWNvbWUgYSBsaXN0IG9mIHRoZSBiZWFtcyB0aGF0IG5lZWQgdG8gYmUgZHJhd24uXG5cdH07XG5cblx0QmVhbUVsZW0ucHJvdG90eXBlLnNldEhpbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5oaW50ID0gdHJ1ZTtcblx0fTtcblxuXHRCZWFtRWxlbS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oYWJzZWxlbSkge1xuXHRcdHZhciBwaXRjaCA9IGFic2VsZW0uYWJjZWxlbS5hdmVyYWdlcGl0Y2g7XG5cdFx0aWYgKHBpdGNoID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gZG9uJ3QgaW5jbHVkZSBlbGVtZW50cyBsaWtlIHNwYWNlcnMgaW4gYmVhbXNcblx0XHR0aGlzLmFsbHJlc3RzID0gdGhpcy5hbGxyZXN0cyAmJiBhYnNlbGVtLmFiY2VsZW0ucmVzdDtcblx0XHRhYnNlbGVtLmJlYW0gPSB0aGlzO1xuXHRcdHRoaXMuZWxlbXMucHVzaChhYnNlbGVtKTtcblx0XHQvL3ZhciBwaXRjaCA9IGFic2VsZW0uYWJjZWxlbS5hdmVyYWdlcGl0Y2g7XG5cdFx0dGhpcy50b3RhbCArPSBwaXRjaDsgLy8gVE9ETyBDSE9SRCAoZ2V0IHBpdGNoZXMgZnJvbSBhYnNlbGVtLmhlYWRzKVxuXHRcdGlmICh0aGlzLm1pbiA9PT0gdW5kZWZpbmVkIHx8IGFic2VsZW0uYWJjZWxlbS5taW5waXRjaCA8IHRoaXMubWluKSB7XG5cdFx0XHR0aGlzLm1pbiA9IGFic2VsZW0uYWJjZWxlbS5taW5waXRjaDtcblx0XHR9XG5cdFx0aWYgKHRoaXMubWF4ID09PSB1bmRlZmluZWQgfHwgYWJzZWxlbS5hYmNlbGVtLm1heHBpdGNoID4gdGhpcy5tYXgpIHtcblx0XHRcdHRoaXMubWF4ID0gYWJzZWxlbS5hYmNlbGVtLm1heHBpdGNoO1xuXHRcdH1cblx0fTtcblxuXHR2YXIgbWlkZGxlTGluZSA9IDY7XHQvLyBoYXJkY29kZWQgNiBpcyBCXG5cblx0QmVhbUVsZW0ucHJvdG90eXBlLmNhbGNEaXIgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5mb3JjZXVwKSByZXR1cm4gdHJ1ZTtcblx0XHRpZiAodGhpcy5mb3JjZWRvd24pIHJldHVybiBmYWxzZTtcblx0XHR2YXIgYXZlcmFnZSA9IGNhbGNBdmVyYWdlKHRoaXMudG90YWwsIHRoaXMuZWxlbXMubGVuZ3RoKTtcblx0XHRyZXR1cm4gYXZlcmFnZSA8IG1pZGRsZUxpbmU7XG5cdH07XG5cblx0Ly9cblx0Ly8gbGF5b3V0IHBoYXNlXG5cdC8vXG5cdEJlYW1FbGVtLnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5lbGVtcy5sZW5ndGggPT09IDAgfHwgdGhpcy5hbGxyZXN0cykgcmV0dXJuO1xuXG5cdFx0dGhpcy5zdGVtc1VwID0gdGhpcy5jYWxjRGlyKCk7IC8vIFRydWUgbWVhbnMgdGhlIHN0ZW1zIGFyZSBmYWNpbmcgdXAuXG5cdFx0dmFyIGR5ID0gY2FsY0R5KHRoaXMuc3RlbXNVcCwgdGhpcy5pc2dyYWNlKTsgLy8gVGhpcyBpcyB0aGUgd2lkdGggb2YgdGhlIGJlYW0gbGluZS5cblxuXHRcdC8vIGNyZWF0ZSB0aGUgbWFpbiBiZWFtXG5cdFx0dmFyIGZpcnN0RWxlbWVudCA9IHRoaXMuZWxlbXNbMF07XG5cdFx0dmFyIGxhc3RFbGVtZW50ID0gdGhpcy5lbGVtc1t0aGlzLmVsZW1zLmxlbmd0aCAtIDFdO1xuXHRcdHZhciBtaW5TdGVtSGVpZ2h0ID0gMDsgLy8gVGhlIGZvbGxvd2luZyBpcyB0byBsZWF2ZSBzcGFjZSBmb3IgXCIhLy8vIVwiIG1hcmtzLlxuXHRcdHZhciByZWZlcmVuY2VQaXRjaCA9IHRoaXMuc3RlbXNVcCA/IGZpcnN0RWxlbWVudC5hYmNlbGVtLm1heHBpdGNoIDogZmlyc3RFbGVtZW50LmFiY2VsZW0ubWlucGl0Y2g7XG5cdFx0bWluU3RlbUhlaWdodCA9IG1pblN0ZW0oZmlyc3RFbGVtZW50LCB0aGlzLnN0ZW1zVXAsIHJlZmVyZW5jZVBpdGNoLCBtaW5TdGVtSGVpZ2h0KTtcblx0XHRtaW5TdGVtSGVpZ2h0ID0gbWluU3RlbShsYXN0RWxlbWVudCwgdGhpcy5zdGVtc1VwLCByZWZlcmVuY2VQaXRjaCwgbWluU3RlbUhlaWdodCk7XG5cdFx0bWluU3RlbUhlaWdodCA9IE1hdGgubWF4KHRoaXMuc3RlbUhlaWdodCwgbWluU3RlbUhlaWdodCArIDMpOyAvLyBUT0RPLVBFUjogVGhlIDMgaXMgdGhlIHdpZHRoIG9mIGEgMTZ0aCBiZWFtLiBUaGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgYmVhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuXHRcdHZhciB5UG9zID0gY2FsY1lQb3ModGhpcy50b3RhbCwgdGhpcy5lbGVtcy5sZW5ndGgsIG1pblN0ZW1IZWlnaHQsIHRoaXMuc3RlbXNVcCwgZmlyc3RFbGVtZW50LmFiY2VsZW0uYXZlcmFnZXBpdGNoLCBsYXN0RWxlbWVudC5hYmNlbGVtLmF2ZXJhZ2VwaXRjaCwgdGhpcy5pc2ZsYXQsIHRoaXMubWluLCB0aGlzLm1heCwgdGhpcy5pc2dyYWNlKTtcblx0XHR2YXIgeFBvcyA9IGNhbGNYUG9zKHRoaXMuc3RlbXNVcCwgZmlyc3RFbGVtZW50LCBsYXN0RWxlbWVudCk7XG5cdFx0dGhpcy5iZWFtcy5wdXNoKHsgc3RhcnRYOiB4UG9zWzBdLCBlbmRYOiB4UG9zWzFdLCBzdGFydFk6IHlQb3NbMF0sIGVuZFk6IHlQb3NbMV0sIGR5OiBkeSB9KTtcblxuXHRcdC8vIGNyZWF0ZSB0aGUgcmVzdCBvZiB0aGUgYmVhbXMgKGluIHRoZSBjYXNlIG9mIDEvMTZ0aCBub3RlcywgZXRjLlxuXHRcdHZhciBiZWFtcyA9IGNyZWF0ZUFkZGl0aW9uYWxCZWFtcyh0aGlzLmVsZW1zLCB0aGlzLnN0ZW1zVXAsIHRoaXMuYmVhbXNbMF0sIHRoaXMuaXNncmFjZSwgZHkpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmVhbXMubGVuZ3RoOyBpKyspXG5cdFx0XHR0aGlzLmJlYW1zLnB1c2goYmVhbXNbaV0pO1xuXG5cdFx0Ly8gTm93IHRoYXQgdGhlIG1haW4gYmVhbSBpcyBkZWZpbmVkLCB3ZSBrbm93IGhvdyB0YWxsIHRoZSBzdGVtcyBzaG91bGQgYmUsIHNvIGNyZWF0ZSB0aGVtIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUgb3JpZ2luYWwgbm90ZXMuXG5cdFx0Y3JlYXRlU3RlbXModGhpcy5lbGVtcywgdGhpcy5zdGVtc1VwLCB0aGlzLmJlYW1zWzBdLCBkeSwgdGhpcy5tYWluTm90ZSk7XG5cdH07XG5cblx0QmVhbUVsZW0ucHJvdG90eXBlLmlzQWJvdmUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5zdGVtc1VwO1xuXHR9O1xuXG5cdC8vIFdlIGNhbid0IGp1c3QgdXNlIHRoZSBlbnRpcmUgYmVhbSBmb3IgdGhlIGNhbGN1bGF0aW9uLiBUaGUgcmFuZ2UgaGFzIHRvIGJlIHBhc3NlZCBpbiwgYmVjYXVzZSB0aGUgYmVhbSBtaWdodCBleHRlbmQgaW50byBzb21lIHVucmVsYXRlZCBub3Rlcy4gZm9yIGluc3RhbmNlLCAoM19hJ2YnZSdmJzIgd2hlbiBMOjE2XG5cdEJlYW1FbGVtLnByb3RvdHlwZS5oZWlnaHRBdE1pZHBvaW50ID0gZnVuY3Rpb24oc3RhcnRYLCBlbmRYKSB7XG5cdFx0aWYgKHRoaXMuYmVhbXMubGVuZ3RoID09PSAwKVxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0dmFyIGJlYW0gPSB0aGlzLmJlYW1zWzBdO1xuXHRcdHZhciBtaWRQb2ludCA9IHN0YXJ0WCArIChlbmRYIC0gc3RhcnRYKSAvIDI7XG5cdFx0cmV0dXJuIGdldEJhcllBdChiZWFtLnN0YXJ0WCwgYmVhbS5zdGFydFksIGJlYW0uZW5kWCwgYmVhbS5lbmRZLCBtaWRQb2ludCk7XG5cdH07XG5cblx0QmVhbUVsZW0ucHJvdG90eXBlLnlBdE5vdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0dmFyIGJlYW0gPSB0aGlzLmJlYW1zWzBdO1xuXHRcdHJldHVybiBnZXRCYXJZQXQoYmVhbS5zdGFydFgsIGJlYW0uc3RhcnRZLCBiZWFtLmVuZFgsIGJlYW0uZW5kWSwgZWxlbWVudC54KTtcblx0fTtcblxuXHRCZWFtRWxlbS5wcm90b3R5cGUueEF0TWlkcG9pbnQgPSBmdW5jdGlvbihzdGFydFgsIGVuZFgpIHtcblx0XHRyZXR1cm4gc3RhcnRYICsgKGVuZFggLSBzdGFydFgpLzI7XG5cdH07XG5cblx0Ly9cblx0Ly8gRHJhd2luZyBwaGFzZVxuXHQvL1xuXHRCZWFtRWxlbS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKHJlbmRlcmVyKSB7XG5cdFx0aWYgKHRoaXMuYmVhbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRyZW5kZXJlci5iZWdpbkdyb3VwKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJlYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYmVhbSA9IHRoaXMuYmVhbXNbaV07XG5cdFx0XHRkcmF3QmVhbShyZW5kZXJlciwgYmVhbS5zdGFydFgsIGJlYW0uc3RhcnRZLCBiZWFtLmVuZFgsIGJlYW0uZW5kWSwgYmVhbS5keSwgdGhpcy5oaW50KTtcblx0XHR9XG5cdFx0cmVuZGVyZXIuZW5kR3JvdXAoJ2JlYW0tZWxlbScpO1xuXHR9O1xuXG5cdC8vXG5cdC8vIHByaXZhdGUgZnVuY3Rpb25zXG5cdC8vXG5cdGZ1bmN0aW9uIG1pblN0ZW0oZWxlbWVudCwgc3RlbXNVcCwgcmVmZXJlbmNlUGl0Y2gsIG1pblN0ZW1IZWlnaHQpIHtcblx0XHRpZiAoIWVsZW1lbnQuY2hpbGRyZW4pXG5cdFx0XHRyZXR1cm4gbWluU3RlbUhlaWdodDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBlbGVtID0gZWxlbWVudC5jaGlsZHJlbltpXTtcblx0XHRcdGlmIChzdGVtc1VwICYmIGVsZW0udG9wICE9PSB1bmRlZmluZWQgJiYgZWxlbS5jID09PSBcImZsYWdzLnVncmFjZVwiKVxuXHRcdFx0XHRtaW5TdGVtSGVpZ2h0ID0gTWF0aC5tYXgobWluU3RlbUhlaWdodCwgZWxlbS50b3AgLSByZWZlcmVuY2VQaXRjaCk7XG5cdFx0XHRlbHNlIGlmICghc3RlbXNVcCAmJiBlbGVtLmJvdHRvbSAhPT0gdW5kZWZpbmVkICYmIGVsZW0uYyA9PT0gXCJmbGFncy51Z3JhY2VcIilcblx0XHRcdFx0bWluU3RlbUhlaWdodCA9IE1hdGgubWF4KG1pblN0ZW1IZWlnaHQsIHJlZmVyZW5jZVBpdGNoIC0gZWxlbS5ib3R0b20gKyA3KTsgLy8gVGhlIGV4dHJhIDcgaXMgYmVjYXVzZSB3ZSBhcmUgbWVhc3VyaW5nIHRoZSBzbGFzaCBmcm9tIHRoZSB0b3AuXG5cdFx0fVxuXHRcdHJldHVybiBtaW5TdGVtSGVpZ2h0O1xuXHR9XG5cblx0ZnVuY3Rpb24gY2FsY1NsYW50KGxlZnRBdmVyYWdlUGl0Y2gsIHJpZ2h0QXZlcmFnZVBpdGNoLCBudW1TdGVtcywgaXNGbGF0KSB7XG5cdFx0aWYgKGlzRmxhdClcblx0XHRcdHJldHVybiAwO1xuXHRcdHZhciBzbGFudCA9IGxlZnRBdmVyYWdlUGl0Y2ggLSByaWdodEF2ZXJhZ2VQaXRjaDtcblx0XHR2YXIgbWF4U2xhbnQgPSBudW1TdGVtcyAvIDI7XG5cblx0XHRpZiAoc2xhbnQgPiBtYXhTbGFudCkgc2xhbnQgPSBtYXhTbGFudDtcblx0XHRpZiAoc2xhbnQgPCAtbWF4U2xhbnQpIHNsYW50ID0gLW1heFNsYW50O1xuXHRcdHJldHVybiBzbGFudDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNhbGNBdmVyYWdlKHRvdGFsLCBudW1FbGVtZW50cykge1xuXHRcdGlmICghbnVtRWxlbWVudHMpXG5cdFx0XHRyZXR1cm4gMDtcblx0XHRyZXR1cm4gdG90YWwgLyBudW1FbGVtZW50cztcblx0fVxuXG5cdGZ1bmN0aW9uIGdldEJhcllBdChzdGFydHgsIHN0YXJ0eSwgZW5keCwgZW5keSwgeCkge1xuXHRcdHJldHVybiBzdGFydHkgKyAoZW5keSAtIHN0YXJ0eSkgLyAoZW5keCAtIHN0YXJ0eCkgKiAoeCAtIHN0YXJ0eCk7XG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjRHkoYXNjLCBpc0dyYWNlKSB7XG5cdFx0dmFyIGR5ID0gKGFzYykgPyBzcGFjaW5nLlNURVAgOiAtc3BhY2luZy5TVEVQO1xuXHRcdGlmIChpc0dyYWNlKSBkeSA9IGR5ICogMC40O1xuXHRcdHJldHVybiBkeTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRyYXdCZWFtKHJlbmRlcmVyLCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHksIGlzSGludCkge1xuXHRcdHZhciBrbGFzcyA9ICdiZWFtLWVsZW0nO1xuXHRcdGlmIChpc0hpbnQpXG5cdFx0XHRrbGFzcyArPSBcIiBhYmNqcy1oaW50XCI7XG5cblx0XHQvLyB0aGUgWCBjb29yZGluYXRlcyBhcmUgYWN0dWFsIGNvb3JkaW5hdGVzLCBidXQgdGhlIFkgY29vcmRpbmF0ZXMgYXJlIGluIHBpdGNoZXMuXG5cdFx0c3RhcnRZID0gcmVuZGVyZXIuY2FsY1koc3RhcnRZKTtcblx0XHRlbmRZID0gcmVuZGVyZXIuY2FsY1koZW5kWSk7XG5cdFx0dmFyIHBhdGhTdHJpbmcgPSBcIk1cIiArIHN0YXJ0WCArIFwiIFwiICsgc3RhcnRZICsgXCIgTFwiICsgZW5kWCArIFwiIFwiICsgZW5kWSArXG5cdFx0XHRcIkxcIiArIGVuZFggKyBcIiBcIiArIChlbmRZICsgZHkpICsgXCIgTFwiICsgc3RhcnRYICsgXCIgXCIgKyAoc3RhcnRZICsgZHkpICsgXCJ6XCI7XG5cdFx0cmVuZGVyZXIucHJpbnRQYXRoKHtcblx0XHRcdHBhdGg6IHBhdGhTdHJpbmcsXG5cdFx0XHRzdHJva2U6IFwibm9uZVwiLFxuXHRcdFx0ZmlsbDogXCIjMDAwMDAwXCIsXG5cdFx0XHQnY2xhc3MnOiByZW5kZXJlci5hZGRDbGFzc2VzKGtsYXNzKVxuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2FsY1hQb3MoYXNjLCBmaXJzdEVsZW1lbnQsIGxhc3RFbGVtZW50KSB7XG5cdFx0dmFyIHN0YXJ0aGVhZCA9IGZpcnN0RWxlbWVudC5oZWFkc1thc2MgPyAwIDogZmlyc3RFbGVtZW50LmhlYWRzLmxlbmd0aCAtIDFdO1xuXHRcdHZhciBlbmRoZWFkID0gbGFzdEVsZW1lbnQuaGVhZHNbYXNjID8gMCA6IGxhc3RFbGVtZW50LmhlYWRzLmxlbmd0aCAtIDFdO1xuXHRcdHZhciBzdGFydFggPSBzdGFydGhlYWQueDtcblx0XHRpZiAoYXNjKSBzdGFydFggKz0gc3RhcnRoZWFkLncgLSAwLjY7XG5cdFx0dmFyIGVuZFggPSBlbmRoZWFkLng7XG5cdFx0aWYgKGFzYykgZW5kWCArPSBlbmRoZWFkLnc7XG5cdFx0cmV0dXJuIFsgc3RhcnRYLCBlbmRYIF07XG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjWVBvcyh0b3RhbCwgbnVtRWxlbWVudHMsIHN0ZW1IZWlnaHQsIGFzYywgZmlyc3RBdmVyYWdlUGl0Y2gsIGxhc3RBdmVyYWdlUGl0Y2gsIGlzRmxhdCwgbWluUGl0Y2gsIG1heFBpdGNoLCBpc0dyYWNlKSB7XG5cdFx0dmFyIGF2ZXJhZ2UgPSBjYWxjQXZlcmFnZSh0b3RhbCwgbnVtRWxlbWVudHMpOyAvLyBUaGlzIGlzIHRoZSBhdmVyYWdlIHBpdGNoIGZvciB0aGUgYWxsIHRoZSBub3RlcyB0aGF0IHdpbGwgYmUgYmVhbWVkLlxuXHRcdHZhciBiYXJwb3MgPSBzdGVtSGVpZ2h0IC0gMjsgLy8gKGlzR3JhY2UpPyA1Ojc7XG5cdFx0dmFyIGJhcm1pbnBvcyA9IHN0ZW1IZWlnaHQgLSAyO1xuXHRcdHZhciBwb3MgPSBNYXRoLnJvdW5kKGFzYyA/IE1hdGgubWF4KGF2ZXJhZ2UgKyBiYXJwb3MsIG1heFBpdGNoICsgYmFybWlucG9zKSA6IE1hdGgubWluKGF2ZXJhZ2UgLSBiYXJwb3MsIG1pblBpdGNoIC0gYmFybWlucG9zKSk7XG5cblx0XHR2YXIgc2xhbnQgPSBjYWxjU2xhbnQoZmlyc3RBdmVyYWdlUGl0Y2gsIGxhc3RBdmVyYWdlUGl0Y2gsIG51bUVsZW1lbnRzLCBpc0ZsYXQpO1xuXHRcdHZhciBzdGFydFkgPSBwb3MgKyBNYXRoLmZsb29yKHNsYW50IC8gMik7XG5cdFx0dmFyIGVuZFkgPSBwb3MgKyBNYXRoLmZsb29yKC1zbGFudCAvIDIpO1xuXG5cdFx0Ly8gSWYgdGhlIG5vdGVzIGFyZSB0b28gaGlnaCBvciB0b28gbG93LCBtYWtlIHRoZSBiZWFtIGdvIGRvd24gdG8gdGhlIG1pZGRsZVxuXHRcdGlmICghaXNHcmFjZSkge1xuXHRcdFx0aWYgKGFzYyAmJiBwb3MgPCA2KSB7XG5cdFx0XHRcdHN0YXJ0WSA9IDY7XG5cdFx0XHRcdGVuZFkgPSA2O1xuXHRcdFx0fSBlbHNlIGlmICghYXNjICYmIHBvcyA+IDYpIHtcblx0XHRcdFx0c3RhcnRZID0gNjtcblx0XHRcdFx0ZW5kWSA9IDY7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFsgc3RhcnRZLCBlbmRZXTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZVN0ZW1zKGVsZW1zLCBhc2MsIGJlYW0sIGR5LCBtYWluTm90ZSkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBlbGVtID0gZWxlbXNbaV07XG5cdFx0XHRpZiAoZWxlbS5hYmNlbGVtLnJlc3QpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Ly8gVE9ETy1QRVI6IFRoaXMgaXMgb2RkLiBJZiBpdCBpcyBhIHJlZ3VsYXIgYmVhbSB0aGVuIGVsZW1zIGlzIGFuIGFycmF5IG9mIEFic29sdXRlRWxlbWVudHMsIGlmIGl0IGlzIGEgZ3JhY2UgYmVhbSB0aGVuIGl0IGlzIGFuIGFycmF5IG9mIG9iamVjdHMgLCBzbyB3ZSBkaXJlY3RseSBhdHRhY2ggdGhlIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4gV2UgdGVsbCBpdCBpZiBpcyBhIGdyYWNlIG5vdGUgYmVjYXVzZSB0aGV5IGFyZSBwYXNzZWQgaW4gYXMgYSBnZW5lcmljIG9iamVjdCBpbnN0ZWFkIG9mIGFuIEFic29sdXRlRWxlbWVudC5cblx0XHRcdHZhciBpc0dyYWNlID0gZWxlbS5hZGRFeHRyYSA/IGZhbHNlIDogdHJ1ZTtcblx0XHRcdHZhciBwYXJlbnQgPSBpc0dyYWNlID8gbWFpbk5vdGUgOiBlbGVtO1xuXHRcdFx0dmFyIGZ1cnRoZXN0SGVhZCA9IGVsZW0uaGVhZHNbKGFzYykgPyAwIDogZWxlbS5oZWFkcy5sZW5ndGggLSAxXTtcblx0XHRcdHZhciBvdmFsRGVsdGEgPSAxIC8gNTsvLyhpc0dyYWNlKT8xLzM6MS81O1xuXHRcdFx0dmFyIHBpdGNoID0gZnVydGhlc3RIZWFkLnBpdGNoICsgKChhc2MpID8gb3ZhbERlbHRhIDogLW92YWxEZWx0YSk7XG5cdFx0XHR2YXIgZHggPSBhc2MgPyBmdXJ0aGVzdEhlYWQudyA6IDA7IC8vIGRvd24tcG9pbnRpbmcgc3RlbXMgc3RhcnQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbm90ZSwgdXAtcG9pbnRpbmcgc3RlbXMgc3RhcnQgb24gdGhlIHJpZ2h0IHNpZGUsIHNvIHdlIG9mZnNldCBieSB0aGUgbm90ZSB3aWR0aC5cblx0XHRcdHZhciB4ID0gZnVydGhlc3RIZWFkLnggKyBkeDsgLy8gdGhpcyBpcyBub3cgdGhlIGFjdHVhbCB4IGxvY2F0aW9uIGluIHBpeGVscy5cblx0XHRcdHZhciBiYXJ5ID0gZ2V0QmFyWUF0KGJlYW0uc3RhcnRYLCBiZWFtLnN0YXJ0WSwgYmVhbS5lbmRYLCBiZWFtLmVuZFksIHgpO1xuXHRcdFx0dmFyIGxpbmVXaWR0aCA9IChhc2MpID8gLTAuNiA6IDAuNjtcblx0XHRcdGlmICghYXNjKVxuXHRcdFx0XHRiYXJ5IC09IChkeSAvIDIpIC8gc3BhY2luZy5TVEVQO1x0Ly8gVE9ETy1QRVI6IFRoaXMgaXMganVzdCBhIGZ1ZGdlIGZhY3RvciBzbyB0aGUgZG93bi1wb2ludGluZyBzdGVtcyBkb24ndCBvdmVybGFwLlxuXHRcdFx0aWYgKGlzR3JhY2UpXG5cdFx0XHRcdGR4ICs9IGVsZW0uaGVhZHNbMF0uZHg7XG5cdFx0XHQvLyBUT0RPLVBFUi1IQUNLOiBPbmUgdHlwZSBvZiBub3RlIGhlYWQgaGFzIGEgZGlmZmVyZW50IHBsYWNlbWVudCBvZiB0aGUgc3RlbS4gVGhpcyBzaG91bGQgYmUgbW9yZSBnZW5lcmljYWxseSBjYWxjdWxhdGVkOlxuXHRcdFx0aWYgKGZ1cnRoZXN0SGVhZC5jID09PSAnbm90ZWhlYWRzLnNsYXNoLnF1YXJ0ZXInKSB7XG5cdFx0XHRcdGlmIChhc2MpXG5cdFx0XHRcdFx0cGl0Y2ggKz0gMTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHBpdGNoIC09IDE7XG5cdFx0XHR9XG5cdFx0XHR2YXIgc3RlbSA9IG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgZHgsIDAsIHBpdGNoLCB7XG5cdFx0XHRcdFwidHlwZVwiOiBcInN0ZW1cIixcblx0XHRcdFx0XCJwaXRjaDJcIjogYmFyeSxcblx0XHRcdFx0bGluZXdpZHRoOiBsaW5lV2lkdGhcblx0XHRcdH0pO1xuXHRcdFx0c3RlbS5zZXRYKHBhcmVudC54KTsgLy8gVGhpcyBpcyBhZnRlciB0aGUgeCBjb29yZGluYXRlcyB3ZXJlIHNldCwgc28gd2UgaGF2ZSB0byBzZXQgaXQgZGlyZWN0bHkuXG5cdFx0XHRwYXJlbnQuYWRkRXh0cmEoc3RlbSk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVBZGRpdGlvbmFsQmVhbXMoZWxlbXMsIGFzYywgYmVhbSwgaXNHcmFjZSwgZHkpIHtcblx0XHR2YXIgYmVhbXMgPSBbXTtcblx0XHR2YXIgYXV4QmVhbXMgPSBbXTsgIC8vIGF1eGJlYW0gd2lsbCBiZSB7eCwgeSwgZHVybG9nLCBzaW5nbGV9IGF1eGJlYW1bMF0gc2hvdWxkIG1hdGNoIHdpdGggZHVybG9nPS00ICgxNnRoKSAoaj0tNC1kdXJsb2cpXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGVsZW0gPSBlbGVtc1tpXTtcblx0XHRcdGlmIChlbGVtLmFiY2VsZW0ucmVzdClcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR2YXIgZnVydGhlc3RIZWFkID0gZWxlbS5oZWFkc1soYXNjKSA/IDAgOiBlbGVtLmhlYWRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0dmFyIHggPSBmdXJ0aGVzdEhlYWQueCArICgoYXNjKSA/IGZ1cnRoZXN0SGVhZC53IDogMCk7XG5cdFx0XHR2YXIgYmFyeSA9IGdldEJhcllBdChiZWFtLnN0YXJ0WCwgYmVhbS5zdGFydFksIGJlYW0uZW5kWCwgYmVhbS5lbmRZLCB4KTtcblxuXHRcdFx0dmFyIHN5ID0gKGFzYykgPyAtMS41IDogMS41O1xuXHRcdFx0aWYgKGlzR3JhY2UpIHN5ID0gc3kgKiAyIC8gMzsgLy8gVGhpcyBtYWtlcyB0aGUgc2Vjb25kIGJlYW0gb24gZ3JhY2Ugbm90ZXMgY2xvc2VyIHRvIHRoZSBmaXJzdCBvbmUuXG5cdFx0XHR2YXIgZHVyYXRpb24gPSBlbGVtLmFiY2VsZW0uZHVyYXRpb247IC8vIGdldCB0aGUgZHVyYXRpb24gdmlhIGFiY2VsZW0gYmVjYXVzZSBvZiB0cmlwbGV0c1xuXHRcdFx0aWYgKGR1cmF0aW9uID09PSAwKSBkdXJhdGlvbiA9IDAuMjU7IC8vIGlmIHRoaXMgaXMgc3RlbWxlc3MsIHRoZW4gd2UgdXNlIHF1YXJ0ZXIgbm90ZSBhcyB0aGUgZHVyYXRpb24uXG5cdFx0XHRmb3IgKHZhciBkdXJsb2cgPSBnZXREdXJsb2coZHVyYXRpb24pOyBkdXJsb2cgPCAtMzsgZHVybG9nKyspIHtcblx0XHRcdFx0aWYgKGF1eEJlYW1zWy00IC0gZHVybG9nXSkge1xuXHRcdFx0XHRcdGF1eEJlYW1zWy00IC0gZHVybG9nXS5zaW5nbGUgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhdXhCZWFtc1stNCAtIGR1cmxvZ10gPSB7XG5cdFx0XHRcdFx0XHR4OiB4ICsgKChhc2MpID8gLTAuNiA6IDApLCB5OiBiYXJ5ICsgc3kgKiAoLTQgLSBkdXJsb2cgKyAxKSxcblx0XHRcdFx0XHRcdGR1cmxvZzogZHVybG9nLCBzaW5nbGU6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGogPSBhdXhCZWFtcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuXHRcdFx0XHRpZiAoaSA9PT0gZWxlbXMubGVuZ3RoIC0gMSB8fCBnZXREdXJsb2coZWxlbXNbaSArIDFdLmFiY2VsZW0uZHVyYXRpb24pID4gKC1qIC0gNCkpIHtcblxuXHRcdFx0XHRcdHZhciBhdXhCZWFtRW5kWCA9IHg7XG5cdFx0XHRcdFx0dmFyIGF1eEJlYW1FbmRZID0gYmFyeSArIHN5ICogKGogKyAxKTtcblxuXG5cdFx0XHRcdFx0aWYgKGF1eEJlYW1zW2pdLnNpbmdsZSkge1xuXHRcdFx0XHRcdFx0YXV4QmVhbUVuZFggPSAoaSA9PT0gMCkgPyB4ICsgNSA6IHggLSA1O1xuXHRcdFx0XHRcdFx0YXV4QmVhbUVuZFkgPSBnZXRCYXJZQXQoYmVhbS5zdGFydFgsIGJlYW0uc3RhcnRZLCBiZWFtLmVuZFgsIGJlYW0uZW5kWSwgYXV4QmVhbUVuZFgpICsgc3kgKiAoaiArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRiZWFtcy5wdXNoKHsgc3RhcnRYOiBhdXhCZWFtc1tqXS54LCBlbmRYOiBhdXhCZWFtRW5kWCwgc3RhcnRZOiBhdXhCZWFtc1tqXS55LCBlbmRZOiBhdXhCZWFtRW5kWSwgZHk6IGR5IH0pO1xuXHRcdFx0XHRcdGF1eEJlYW1zID0gYXV4QmVhbXMuc2xpY2UoMCwgaik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJlYW1zO1xuXHR9XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJlYW1FbGVtO1xuIiwiLy8gICAgYWJjX2JyYWNlX2VsZW1lbnQuanM6IERlZmluaXRpb24gb2YgdGhlIEJyYWNlRWxlbWVudCBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJyYWNlRWxlbSA9IGZ1bmN0aW9uIEJyYWNlRWxlbSgpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG59O1xuXG5CcmFjZUVsZW0ucHJvdG90eXBlLmluY3JlYXNlU3RhdmVzSW5jbHVkZWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmxlbmd0aCsrO1xufTtcblxuQnJhY2VFbGVtLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcblx0dGhpcy54ID0geDtcbn07XG5cbkJyYWNlRWxlbS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIDEwOyAvLyBUT0RPLVBFUjogcmlnaHQgbm93IHRoZSBkcmF3aW5nIGZ1bmN0aW9uIGRvZXNuJ3QgdmFyeSB0aGUgd2lkdGggYXQgYWxsLiBJZiBpdCBkb2VzIGluIHRoZSBmdXR1cmUgdGhlbiB0aGlzIHdpbGwgY2hhbmdlLlxufTtcblxuQnJhY2VFbGVtLnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHRvcCwgYm90dG9tKSB7XG4gICAgdGhpcy5zdGFydFkgPSB0b3A7XG4gICAgdGhpcy5lbmRZID0gYm90dG9tO1xufTtcblxuQnJhY2VFbGVtLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKHJlbmRlcmVyLCB0b3AsIGJvdHRvbSkge1xuICAgIHRoaXMubGF5b3V0KHJlbmRlcmVyLCB0b3AsIGJvdHRvbSk7XG4gICAgcmVuZGVyZXIuZHJhd0JyYWNlKHRoaXMueCx0aGlzLnN0YXJ0WSwgdGhpcy5lbmRZKTtcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBCcmFjZUVsZW07XG4iLCJ2YXIgc3BhY2luZyA9IHJlcXVpcmUoJy4vYWJjX3NwYWNpbmcnKTtcblxuLyoqXG4gKiBHbHlwaHMgYW5kIHNvbWUgbWV0aG9kcyB0byBhZGp1c3QgZm9yIHRoZWlyIHggYW5kIHkgYmFzZWxpbmVcbiAqL1xuXHR2YXIgZ2x5cGhzID1cblx0eycwJzp7ZDpbWydNJyw0LjgzLC0xNC45N10sWydjJywwLjMzLC0wLjAzLDEuMTEsMC4wMCwxLjQ3LDAuMDZdLFsnYycsMS42OCwwLjM2LDIuOTcsMS41OSwzLjc4LDMuNjBdLFsnYycsMS4yMCwyLjk3LDAuODEsNi45NiwtMC45MCw5LjI3XSxbJ2MnLC0wLjc4LDEuMDgsLTEuNzEsMS43MSwtMi45MSwxLjk1XSxbJ2MnLC0wLjQ1LDAuMDksLTEuMzIsMC4wOSwtMS43NywwLjAwXSxbJ2MnLC0wLjgxLC0wLjE4LC0xLjQ3LC0wLjUxLC0yLjA3LC0xLjAyXSxbJ2MnLC0yLjM0LC0yLjA3LC0zLjE1LC02LjcyLC0xLjc0LC0xMC4yMF0sWydjJywwLjg3LC0yLjE2LDIuMjgsLTMuNDIsNC4xNCwtMy42Nl0sWyd6J10sWydtJywxLjExLDAuODddLFsnYycsLTAuMjEsLTAuMDYsLTAuNjksLTAuMDksLTAuODcsLTAuMDZdLFsnYycsLTAuNTQsMC4xMiwtMC44NywwLjQyLC0xLjE3LDAuOTldLFsnYycsLTAuMzYsMC42NiwtMC41MSwxLjU2LC0wLjYwLDMuMDBdLFsnYycsLTAuMDMsMC43NSwtMC4wMyw0LjU5LDAuMDAsNS4zMV0sWydjJywwLjA5LDEuNTAsMC4yNywyLjQwLDAuNjAsMy4wNl0sWydjJywwLjI0LDAuNDgsMC41NywwLjc4LDAuOTYsMC45MF0sWydjJywwLjI3LDAuMDksMC43OCwwLjA5LDEuMDUsMC4wMF0sWydjJywwLjM5LC0wLjEyLDAuNzIsLTAuNDIsMC45NiwtMC45MF0sWydjJywwLjMzLC0wLjY2LDAuNTEsLTEuNTYsMC42MCwtMy4wNl0sWydjJywwLjAzLC0wLjcyLDAuMDMsLTQuNTYsMC4wMCwtNS4zMV0sWydjJywtMC4wOSwtMS40NywtMC4yNywtMi4zNywtMC42MCwtMy4wM10sWydjJywtMC4yNCwtMC40OCwtMC41NCwtMC43OCwtMC45MywtMC45MF0sWyd6J11dLHc6MTAuNzgsaDoxNC45NTl9LFxuXHRcdCcxJzp7ZDpbWydNJywzLjMwLC0xNS4wNl0sWydjJywwLjA2LC0wLjA2LDAuMjEsLTAuMDMsMC42NiwwLjE1XSxbJ2MnLDAuODEsMC4zOSwxLjA4LDAuMzksMS44MywwLjAzXSxbJ2MnLDAuMjEsLTAuMDksMC4zOSwtMC4xNSwwLjQyLC0wLjE1XSxbJ2MnLDAuMTIsMC4wMCwwLjIxLDAuMDksMC4yNywwLjIxXSxbJ2MnLDAuMDYsMC4xMiwwLjA2LDAuMzMsMC4wNiw1Ljk0XSxbJ2MnLDAuMDAsMy45MywwLjAwLDUuODUsMC4wMyw2LjAzXSxbJ2MnLDAuMDYsMC4zNiwwLjE1LDAuNjksMC4yNywwLjk2XSxbJ2MnLDAuMzYsMC43NSwwLjkzLDEuMTcsMS42OCwxLjI2XSxbJ2MnLDAuMzAsMC4wMywwLjM5LDAuMDksMC4zOSwwLjMwXSxbJ2MnLDAuMDAsMC4xNSwtMC4wMywwLjE4LC0wLjA5LDAuMjRdLFsnYycsLTAuMDYsMC4wNiwtMC4wOSwwLjA2LC0wLjQ4LDAuMDZdLFsnYycsLTAuNDIsMC4wMCwtMC42OSwtMC4wMywtMi4xMCwtMC4yNF0sWydjJywtMC45MCwtMC4xNSwtMS43NywtMC4xNSwtMi42NywwLjAwXSxbJ2MnLC0xLjQxLDAuMjEsLTEuNjgsMC4yNCwtMi4xMCwwLjI0XSxbJ2MnLC0wLjM5LDAuMDAsLTAuNDIsMC4wMCwtMC40OCwtMC4wNl0sWydjJywtMC4wNiwtMC4wNiwtMC4wNiwtMC4wOSwtMC4wNiwtMC4yNF0sWydjJywwLjAwLC0wLjIxLDAuMDYsLTAuMjcsMC4zNiwtMC4zMF0sWydjJywwLjc1LC0wLjA5LDEuMzIsLTAuNTEsMS42OCwtMS4yNl0sWydjJywwLjEyLC0wLjI3LDAuMjEsLTAuNjAsMC4yNywtMC45Nl0sWydjJywwLjAzLC0wLjE4LDAuMDMsLTEuNTksMC4wMywtNC4yOV0sWydjJywwLjAwLC0zLjg3LDAuMDAsLTQuMDUsLTAuMDYsLTQuMTRdLFsnYycsLTAuMDksLTAuMTUsLTAuMTgsLTAuMjQsLTAuMzksLTAuMjRdLFsnYycsLTAuMTIsMC4wMCwtMC4xNSwwLjAzLC0wLjIxLDAuMDZdLFsnYycsLTAuMDMsMC4wNiwtMC40NSwwLjk5LC0wLjk2LDIuMTNdLFsnYycsLTAuNDgsMS4xNCwtMC45MCwyLjEwLC0wLjkzLDIuMTZdLFsnYycsLTAuMDYsMC4xNSwtMC4yMSwwLjI0LC0wLjMzLDAuMjRdLFsnYycsLTAuMjQsMC4wMCwtMC40MiwtMC4xOCwtMC40MiwtMC4zOV0sWydjJywwLjAwLC0wLjA2LDMuMjcsLTcuNjIsMy4zMywtNy43NF0sWyd6J11dLHc6OC45NCxoOjE1LjA1OH0sXG5cdFx0JzInOntkOltbJ00nLDQuMjMsLTE0Ljk3XSxbJ2MnLDAuNTcsLTAuMDYsMS42OCwwLjAwLDIuMzQsMC4xOF0sWydjJywwLjY5LDAuMTgsMS41MCwwLjU0LDIuMDEsMC45MF0sWydjJywxLjM1LDAuOTYsMS45NSwyLjI1LDEuNzcsMy44MV0sWydjJywtMC4xNSwxLjM1LC0wLjY2LDIuMzQsLTEuNjgsMy4xNV0sWydjJywtMC42MCwwLjQ4LC0xLjQ0LDAuOTMsLTMuMTIsMS42NV0sWydjJywtMS4zMiwwLjU3LC0xLjgwLDAuODEsLTIuMzcsMS4xNF0sWydjJywtMC41NywwLjMzLC0wLjU3LDAuMzMsLTAuMjQsMC4yN10sWydjJywwLjM5LC0wLjA5LDEuMjYsLTAuMDksMS42OCwwLjAwXSxbJ2MnLDAuNzIsMC4xNSwxLjQxLDAuNDUsMi4xMCwwLjkwXSxbJ2MnLDAuOTksMC42MywxLjg2LDAuODcsMi41NSwwLjc1XSxbJ2MnLDAuMjQsLTAuMDYsMC40MiwtMC4xNSwwLjU3LC0wLjMwXSxbJ2MnLDAuMTIsLTAuMDksMC4zMCwtMC40MiwwLjMwLC0wLjUxXSxbJ2MnLDAuMDAsLTAuMDksMC4xMiwtMC4yMSwwLjI0LC0wLjI0XSxbJ2MnLDAuMTgsLTAuMDMsMC4zOSwwLjEyLDAuMzksMC4zMF0sWydjJywwLjAwLDAuMTIsLTAuMTUsMC41NywtMC4zMCwwLjg3XSxbJ2MnLC0wLjU0LDEuMDIsLTEuNTYsMS43NCwtMi43OSwyLjAxXSxbJ2MnLC0wLjQyLDAuMDksLTEuMjMsMC4wOSwtMS42MiwwLjAzXSxbJ2MnLC0wLjgxLC0wLjE4LC0xLjMyLC0wLjQ1LC0yLjAxLC0xLjExXSxbJ2MnLC0wLjQ1LC0wLjQ1LC0wLjYzLC0wLjU3LC0wLjk2LC0wLjY5XSxbJ2MnLC0wLjg0LC0wLjI3LC0xLjg5LDAuMTIsLTIuMjUsMC45MF0sWydjJywtMC4xMiwwLjIxLC0wLjIxLDAuNTQsLTAuMjEsMC43Ml0sWydjJywwLjAwLDAuMTIsLTAuMTIsMC4yMSwtMC4yNywwLjI0XSxbJ2MnLC0wLjE1LDAuMDAsLTAuMjcsLTAuMDMsLTAuMzMsLTAuMTVdLFsnYycsLTAuMDksLTAuMjEsMC4wOSwtMS4wOCwwLjMzLC0xLjcxXSxbJ2MnLDAuMjQsLTAuNjYsMC42NiwtMS4yNiwxLjI5LC0xLjg5XSxbJ2MnLDAuNDUsLTAuNDUsMC45MCwtMC44MSwxLjkyLC0xLjU2XSxbJ2MnLDEuMjksLTAuOTMsMS44OSwtMS40NCwyLjM0LC0xLjk4XSxbJ2MnLDAuODcsLTEuMDUsMS4yNiwtMi4xOSwxLjIwLC0zLjYzXSxbJ2MnLC0wLjA2LC0xLjI5LC0wLjM5LC0yLjMxLC0wLjk2LC0yLjkxXSxbJ2MnLC0wLjM2LC0wLjMzLC0wLjcyLC0wLjUxLC0xLjE3LC0wLjU0XSxbJ2MnLC0wLjg0LC0wLjAzLC0xLjUzLDAuNDIsLTEuNTksMS4wNV0sWydjJywtMC4wMywwLjMzLDAuMTIsMC42MCwwLjU3LDEuMTRdLFsnYycsMC40NSwwLjU0LDAuNTQsMC44NywwLjQyLDEuNDFdLFsnYycsLTAuMTUsMC42MywtMC41NCwxLjExLC0xLjA4LDEuMzhdLFsnYycsLTAuNjMsMC4zMywtMS4yMCwwLjMzLC0xLjgzLDAuMDBdLFsnYycsLTAuMjQsLTAuMTIsLTAuMzMsLTAuMTgsLTAuNTQsLTAuMzldLFsnYycsLTAuMTgsLTAuMTgsLTAuMjcsLTAuMzAsLTAuMzYsLTAuNTFdLFsnYycsLTAuMjQsLTAuNDUsLTAuMjcsLTAuODQsLTAuMjEsLTEuMzhdLFsnYycsMC4xMiwtMC43NSwwLjQ1LC0xLjQxLDEuMDIsLTEuOThdLFsnYycsMC43MiwtMC43MiwxLjc0LC0xLjE3LDIuODUsLTEuMzJdLFsneiddXSx3OjEwLjc2NCxoOjE0Ljk3fSxcblx0XHQnMyc6e2Q6W1snTScsMy43OCwtMTQuOTddLFsnYycsMC4zMCwtMC4wMywxLjQxLDAuMDAsMS44MywwLjA2XSxbJ2MnLDIuMjIsMC4zMCwzLjUxLDEuMzIsMy43MiwyLjkxXSxbJ2MnLDAuMDMsMC4zMywwLjAzLDEuMjYsLTAuMDMsMS42NV0sWydjJywtMC4xMiwwLjg0LC0wLjQ4LDEuNDcsLTEuMDUsMS43N10sWydjJywtMC4yNywwLjE1LC0wLjM2LDAuMjQsLTAuNDUsMC4zOV0sWydjJywtMC4wOSwwLjIxLC0wLjA5LDAuMzYsMC4wMCwwLjU3XSxbJ2MnLDAuMDksMC4xNSwwLjE4LDAuMjQsMC41MSwwLjM5XSxbJ2MnLDAuNzUsMC40MiwxLjIzLDEuMTQsMS40MSwyLjEzXSxbJ2MnLDAuMDYsMC40MiwwLjA2LDEuMzUsMC4wMCwxLjcxXSxbJ2MnLC0wLjE4LDAuODEsLTAuNDgsMS4zOCwtMS4wMiwxLjk1XSxbJ2MnLC0wLjc1LDAuNzIsLTEuODAsMS4yMCwtMy4xOCwxLjM4XSxbJ2MnLC0wLjQyLDAuMDYsLTEuNTYsMC4wNiwtMS45NSwwLjAwXSxbJ2MnLC0xLjg5LC0wLjMzLC0zLjE4LC0xLjI5LC0zLjUxLC0yLjY0XSxbJ2MnLC0wLjAzLC0wLjEyLC0wLjAzLC0wLjMzLC0wLjAzLC0wLjYwXSxbJ2MnLDAuMDAsLTAuMzYsMC4wMCwtMC40MiwwLjA2LC0wLjYzXSxbJ2MnLDAuMTIsLTAuMzAsMC4yNywtMC41MSwwLjUxLC0wLjc1XSxbJ2MnLDAuMjQsLTAuMjQsMC40NSwtMC4zOSwwLjc1LC0wLjUxXSxbJ2MnLDAuMjEsLTAuMDYsMC4yNywtMC4wNiwwLjYwLC0wLjA2XSxbJ2MnLDAuMzMsMC4wMCwwLjM5LDAuMDAsMC42MCwwLjA2XSxbJ2MnLDAuMzAsMC4xMiwwLjUxLDAuMjcsMC43NSwwLjUxXSxbJ2MnLDAuMzYsMC4zMywwLjU3LDAuNzUsMC42MCwxLjIwXSxbJ2MnLDAuMDAsMC4yMSwwLjAwLDAuMjcsLTAuMDYsMC40Ml0sWydjJywtMC4wOSwwLjE4LC0wLjEyLDAuMjQsLTAuNTQsMC41NF0sWydjJywtMC41MSwwLjM2LC0wLjYzLDAuNTQsLTAuNjAsMC44N10sWydjJywwLjA2LDAuNTQsMC41NCwwLjkwLDEuMzgsMC45OV0sWydjJywwLjM2LDAuMDYsMC43MiwwLjAzLDAuOTYsLTAuMDZdLFsnYycsMC44MSwtMC4yNywxLjI5LC0xLjIzLDEuNDQsLTIuNzldLFsnYycsMC4wMywtMC40NSwwLjAzLC0xLjk1LC0wLjAzLC0yLjM3XSxbJ2MnLC0wLjA5LC0wLjc1LC0wLjMzLC0xLjIzLC0wLjc1LC0xLjQ0XSxbJ2MnLC0wLjMzLC0wLjE4LC0wLjQ1LC0wLjE4LC0xLjk4LC0wLjE4XSxbJ2MnLC0xLjM1LDAuMDAsLTEuNDEsMC4wMCwtMS41MCwtMC4wNl0sWydjJywtMC4xOCwtMC4xMiwtMC4yNCwtMC4zOSwtMC4xMiwtMC42MF0sWydjJywwLjEyLC0wLjE1LDAuMTUsLTAuMTUsMS42OCwtMC4xNV0sWydjJywxLjUwLDAuMDAsMS42MiwwLjAwLDEuODksLTAuMTVdLFsnYycsMC4xOCwtMC4wOSwwLjQyLC0wLjM2LDAuNTQsLTAuNTddLFsnYycsMC4xOCwtMC40MiwwLjI3LC0wLjkwLDAuMzAsLTEuOTVdLFsnYycsMC4wMywtMS4yMCwtMC4wNiwtMS44MCwtMC4zNiwtMi4zN10sWydjJywtMC4yNCwtMC40OCwtMC42MywtMC44MSwtMS4xNCwtMC45Nl0sWydjJywtMC4zMCwtMC4wNiwtMS4wOCwtMC4wNiwtMS4zOCwwLjAzXSxbJ2MnLC0wLjYwLDAuMTUsLTAuOTAsMC40MiwtMC45NiwwLjg0XSxbJ2MnLC0wLjAzLDAuMzAsMC4wNiwwLjQ1LDAuNjMsMC44NF0sWydjJywwLjMzLDAuMjQsMC40MiwwLjM5LDAuNDUsMC42M10sWydjJywwLjAzLDAuNzIsLTAuNTcsMS41MCwtMS4zMiwxLjY1XSxbJ2MnLC0xLjA1LDAuMjcsLTIuMTAsLTAuNTcsLTIuMTAsLTEuNjVdLFsnYycsMC4wMCwtMC40NSwwLjE1LC0wLjk2LDAuMzksLTEuMzhdLFsnYycsMC4xMiwtMC4yMSwwLjU0LC0wLjYzLDAuODEsLTAuODFdLFsnYycsMC41NywtMC40MiwxLjM4LC0wLjY5LDIuMjUsLTAuODFdLFsneiddXSx3OjkuNzM1LGg6MTQuOTY3fSxcblx0XHQnNCc6e2Q6W1snTScsOC42NCwtMTQuOTRdLFsnYycsMC4yNywtMC4wOSwwLjQyLC0wLjEyLDAuNTQsLTAuMDNdLFsnYycsMC4wOSwwLjA2LDAuMTUsMC4yMSwwLjE1LDAuMzBdLFsnYycsLTAuMDMsMC4wNiwtMS45MiwyLjMxLC00LjIzLDUuMDRdLFsnYycsLTIuMzEsMi43MywtNC4yMyw0Ljk4LC00LjI2LDUuMDFdLFsnYycsLTAuMDMsMC4wNiwwLjEyLDAuMDYsMi41NSwwLjA2XSxbJ2wnLDIuNjEsMC4wMF0sWydsJywwLjAwLC0yLjM3XSxbJ2MnLDAuMDAsLTIuMTksMC4wMywtMi4zNywwLjA2LC0yLjQ2XSxbJ2MnLDAuMDMsLTAuMDYsMC4yMSwtMC4xOCwwLjU3LC0wLjQyXSxbJ2MnLDEuMDgsLTAuNzIsMS4zOCwtMS4wOCwxLjg2LC0yLjE2XSxbJ2MnLDAuMTIsLTAuMzAsMC4yNCwtMC41NCwwLjI3LC0wLjU3XSxbJ2MnLDAuMTIsLTAuMTIsMC4zOSwtMC4wNiwwLjQ1LDAuMTJdLFsnYycsMC4wNiwwLjA5LDAuMDYsMC41NywwLjA2LDMuOTZdLFsnbCcsMC4wMCwzLjkwXSxbJ2wnLDEuMDgsMC4wMF0sWydjJywxLjA1LDAuMDAsMS4xMSwwLjAwLDEuMjAsMC4wNl0sWydjJywwLjI0LDAuMTUsMC4yNCwwLjU0LDAuMDAsMC42OV0sWydjJywtMC4wOSwwLjA2LC0wLjE1LDAuMDYsLTEuMjAsMC4wNl0sWydsJywtMS4wOCwwLjAwXSxbJ2wnLDAuMDAsMC4zM10sWydjJywwLjAwLDAuNTcsMC4wOSwxLjExLDAuMzAsMS41M10sWydjJywwLjM2LDAuNzUsMC45MywxLjE3LDEuNjgsMS4yNl0sWydjJywwLjMwLDAuMDMsMC4zOSwwLjA5LDAuMzksMC4zMF0sWydjJywwLjAwLDAuMTUsLTAuMDMsMC4xOCwtMC4wOSwwLjI0XSxbJ2MnLC0wLjA2LDAuMDYsLTAuMDksMC4wNiwtMC40OCwwLjA2XSxbJ2MnLC0wLjQyLDAuMDAsLTAuNjksLTAuMDMsLTIuMTAsLTAuMjRdLFsnYycsLTAuOTAsLTAuMTUsLTEuNzcsLTAuMTUsLTIuNjcsMC4wMF0sWydjJywtMS40MSwwLjIxLC0xLjY4LDAuMjQsLTIuMTAsMC4yNF0sWydjJywtMC4zOSwwLjAwLC0wLjQyLDAuMDAsLTAuNDgsLTAuMDZdLFsnYycsLTAuMDYsLTAuMDYsLTAuMDYsLTAuMDksLTAuMDYsLTAuMjRdLFsnYycsMC4wMCwtMC4yMSwwLjA2LC0wLjI3LDAuMzYsLTAuMzBdLFsnYycsMC43NSwtMC4wOSwxLjMyLC0wLjUxLDEuNjgsLTEuMjZdLFsnYycsMC4yMSwtMC40MiwwLjMwLC0wLjk2LDAuMzAsLTEuNTNdLFsnbCcsMC4wMCwtMC4zM10sWydsJywtMi43MCwwLjAwXSxbJ2MnLC0yLjkxLDAuMDAsLTIuODUsMC4wMCwtMy4wOSwtMC4xNV0sWydjJywtMC4xOCwtMC4xMiwtMC4zMCwtMC4zOSwtMC4yNywtMC41NF0sWydjJywwLjAzLC0wLjA2LDAuMTgsLTAuMjQsMC4zMywtMC40NV0sWydjJywwLjc1LC0wLjkwLDEuNTksLTIuMDcsMi4xMywtMy4wM10sWydjJywwLjMzLC0wLjU0LDAuODQsLTEuNjIsMS4wNSwtMi4xNl0sWydjJywwLjU3LC0xLjQxLDAuODQsLTIuNjQsMC45MCwtNC4wNV0sWydjJywwLjAzLC0wLjYzLDAuMDYsLTAuNzIsMC4yNCwtMC44MV0sWydsJywwLjEyLC0wLjA2XSxbJ2wnLDAuNDUsMC4xMl0sWydjJywwLjY2LDAuMTgsMS4wMiwwLjI0LDEuNDcsMC4yN10sWydjJywwLjYwLDAuMDMsMS4yMywtMC4wOSwyLjAxLC0wLjMzXSxbJ3onXV0sdzoxMS43OTUsaDoxNC45OTR9LFxuXHRcdCc1Jzp7ZDpbWydNJywxLjAyLC0xNC45NF0sWydjJywwLjEyLC0wLjA5LDAuMDMsLTAuMDksMS4wOCwwLjA2XSxbJ2MnLDIuNDksMC4zNiw0LjM1LDAuMzYsNi45NiwtMC4wNl0sWydjJywwLjU3LC0wLjA5LDAuNjYsLTAuMDYsMC44MSwwLjA2XSxbJ2MnLDAuMTUsMC4xOCwwLjEyLDAuMjQsLTAuMTUsMC41MV0sWydjJywtMS4yOSwxLjI2LC0zLjI0LDIuMDQsLTUuNTgsMi4zMV0sWydjJywtMC42MCwwLjA5LC0xLjIwLDAuMTIsLTEuNzEsMC4xMl0sWydjJywtMC4zOSwwLjAwLC0wLjQ1LDAuMDAsLTAuNTcsMC4wNl0sWydjJywtMC4wOSwwLjA2LC0wLjE1LDAuMTIsLTAuMjEsMC4yMV0sWydsJywtMC4wNiwwLjEyXSxbJ2wnLDAuMDAsMS42NV0sWydsJywwLjAwLDEuNjVdLFsnbCcsMC4yMSwtMC4yMV0sWydjJywwLjY2LC0wLjU3LDEuNDEsLTAuOTYsMi4xOSwtMS4xNF0sWydjJywwLjMzLC0wLjA2LDEuNDEsLTAuMDYsMS45NSwwLjAwXSxbJ2MnLDIuNjEsMC4zNiw0LjAyLDEuNzQsNC4yNiw0LjE0XSxbJ2MnLDAuMDMsMC40NSwwLjAzLDEuMDgsLTAuMDMsMS40NF0sWydjJywtMC4xOCwxLjAyLC0wLjc4LDIuMDEsLTEuNTksMi43MF0sWydjJywtMC43MiwwLjU3LC0xLjYyLDEuMDIsLTIuNDksMS4yMF0sWydjJywtMS4zOCwwLjI3LC0zLjAzLDAuMDYsLTQuMjAsLTAuNTRdLFsnYycsLTEuMDgsLTAuNTQsLTEuNzEsLTEuMzIsLTEuODYsLTIuMjhdLFsnYycsLTAuMDksLTAuNjksMC4wOSwtMS4yOSwwLjU3LC0xLjc0XSxbJ2MnLDAuMjQsLTAuMjQsMC40NSwtMC4zOSwwLjc1LC0wLjUxXSxbJ2MnLDAuMjEsLTAuMDYsMC4yNywtMC4wNiwwLjYwLC0wLjA2XSxbJ2MnLDAuMzMsMC4wMCwwLjM5LDAuMDAsMC42MCwwLjA2XSxbJ2MnLDAuMzAsMC4xMiwwLjUxLDAuMjcsMC43NSwwLjUxXSxbJ2MnLDAuMzYsMC4zMywwLjU3LDAuNzUsMC42MCwxLjIwXSxbJ2MnLDAuMDAsMC4yMSwwLjAwLDAuMjcsLTAuMDYsMC40Ml0sWydjJywtMC4wOSwwLjE4LC0wLjEyLDAuMjQsLTAuNTQsMC41NF0sWydjJywtMC4xOCwwLjEyLC0wLjM2LDAuMzAsLTAuNDIsMC4zM10sWydjJywtMC4zNiwwLjQyLC0wLjE4LDAuOTksMC4zNiwxLjI2XSxbJ2MnLDAuNTEsMC4yNywxLjQ3LDAuMzYsMi4wMSwwLjI3XSxbJ2MnLDAuOTMsLTAuMjEsMS40NywtMS4xNywxLjY1LC0yLjkxXSxbJ2MnLDAuMDYsLTAuNDUsMC4wNiwtMS44OSwwLjAwLC0yLjMxXSxbJ2MnLC0wLjE1LC0xLjIwLC0wLjUxLC0yLjEwLC0xLjA1LC0yLjU1XSxbJ2MnLC0wLjIxLC0wLjE4LC0wLjU0LC0wLjM2LC0wLjgxLC0wLjM5XSxbJ2MnLC0wLjMwLC0wLjA2LC0wLjg0LC0wLjAzLC0xLjI2LDAuMDZdLFsnYycsLTAuOTMsMC4xOCwtMS42NSwwLjYwLC0yLjE2LDEuMjBdLFsnYycsLTAuMTUsMC4yMSwtMC4yNywwLjMwLC0wLjM5LDAuMzBdLFsnYycsLTAuMTUsMC4wMCwtMC4zMCwtMC4wOSwtMC4zNiwtMC4xOF0sWydjJywtMC4wNiwtMC4wOSwtMC4wNiwtMC4xNSwtMC4wNiwtMy42Nl0sWydjJywwLjAwLC0zLjM5LDAuMDAsLTMuNTcsMC4wNiwtMy42Nl0sWydjJywwLjAzLC0wLjA2LDAuMDksLTAuMTUsMC4xNSwtMC4xOF0sWyd6J11dLHc6MTAuMjEyLGg6MTQuOTk3fSxcblx0XHQnNic6e2Q6W1snTScsNC45OCwtMTQuOTddLFsnYycsMC4zNiwtMC4wMywxLjIwLDAuMDAsMS41OSwwLjA2XSxbJ2MnLDAuOTAsMC4xNSwxLjY4LDAuNTEsMi4yNSwxLjA1XSxbJ2MnLDAuNTcsMC41MSwwLjg3LDEuMjMsMC44NCwxLjk4XSxbJ2MnLC0wLjAzLDAuNTEsLTAuMjEsMC45MCwtMC42MCwxLjI2XSxbJ2MnLC0wLjI0LDAuMjQsLTAuNDUsMC4zOSwtMC43NSwwLjUxXSxbJ2MnLC0wLjIxLDAuMDYsLTAuMjcsMC4wNiwtMC42MCwwLjA2XSxbJ2MnLC0wLjMzLDAuMDAsLTAuMzksMC4wMCwtMC42MCwtMC4wNl0sWydjJywtMC4zMCwtMC4xMiwtMC41MSwtMC4yNywtMC43NSwtMC41MV0sWydjJywtMC4zOSwtMC4zNiwtMC41NywtMC43OCwtMC41NywtMS4yNl0sWydjJywwLjAwLC0wLjI3LDAuMDAsLTAuMzAsMC4wOSwtMC40Ml0sWydjJywwLjAzLC0wLjA5LDAuMTgsLTAuMjEsMC4zMCwtMC4zMF0sWydjJywwLjEyLC0wLjA5LDAuMzAsLTAuMjEsMC4zOSwtMC4yN10sWydjJywwLjA5LC0wLjA2LDAuMjEsLTAuMTgsMC4yNywtMC4yNF0sWydjJywwLjA2LC0wLjEyLDAuMDksLTAuMTUsMC4wOSwtMC4zM10sWydjJywwLjAwLC0wLjE4LC0wLjAzLC0wLjI0LC0wLjA5LC0wLjM2XSxbJ2MnLC0wLjI0LC0wLjM5LC0wLjc1LC0wLjYwLC0xLjM4LC0wLjU3XSxbJ2MnLC0wLjU0LDAuMDMsLTAuOTAsMC4xOCwtMS4yMywwLjQ4XSxbJ2MnLC0wLjgxLDAuNzIsLTEuMDgsMi4xNiwtMC45Niw1LjM3XSxbJ2wnLDAuMDAsMC42M10sWydsJywwLjMwLC0wLjEyXSxbJ2MnLDAuNzgsLTAuMjcsMS4yOSwtMC4zMywyLjEwLC0wLjI3XSxbJ2MnLDEuNDcsMC4xMiwyLjQ5LDAuNTQsMy4yNywxLjI5XSxbJ2MnLDAuNDgsMC41MSwwLjgxLDEuMTEsMC45NiwxLjg5XSxbJ2MnLDAuMDYsMC4yNywwLjA2LDAuNDIsMC4wNiwwLjkzXSxbJ2MnLDAuMDAsMC41NCwwLjAwLDAuNjksLTAuMDYsMC45Nl0sWydjJywtMC4xNSwwLjc4LC0wLjQ4LDEuMzgsLTAuOTYsMS44OV0sWydjJywtMC41NCwwLjUxLC0xLjE3LDAuODcsLTEuOTgsMS4wOF0sWydjJywtMS4xNCwwLjMwLC0yLjQwLDAuMzMsLTMuMjQsMC4wM10sWydjJywtMS41MCwtMC40OCwtMi42NCwtMS44OSwtMy4yNywtNC4wMl0sWydjJywtMC4zNiwtMS4yMywtMC41MSwtMi44MiwtMC40MiwtNC4wOF0sWydjJywwLjMwLC0zLjY2LDIuMjgsLTYuMzAsNC45NSwtNi42Nl0sWyd6J10sWydtJywwLjY2LDcuNDFdLFsnYycsLTAuMjcsLTAuMDksLTAuODEsLTAuMTIsLTEuMDgsLTAuMDZdLFsnYycsLTAuNzIsMC4xOCwtMS4wOCwwLjY5LC0xLjIzLDEuNzFdLFsnYycsLTAuMDYsMC41NCwtMC4wNiwzLjAwLDAuMDAsMy41NF0sWydjJywwLjE4LDEuMjYsMC43MiwxLjc3LDEuODAsMS43NF0sWydjJywwLjM5LC0wLjAzLDAuNjMsLTAuMDksMC45MCwtMC4yN10sWydjJywwLjY2LC0wLjQyLDAuOTAsLTEuMzIsMC45MCwtMy4yNF0sWydjJywwLjAwLC0yLjIyLC0wLjM2LC0zLjEyLC0xLjI5LC0zLjQyXSxbJ3onXV0sdzo5Ljk1NixoOjE0Ljk4Mn0sXG5cdFx0JzcnOntkOltbJ00nLDAuMjEsLTE0Ljk3XSxbJ2MnLDAuMjEsLTAuMDYsMC40NSwwLjAwLDAuNTQsMC4xNV0sWydjJywwLjA2LDAuMDksMC4wNiwwLjE1LDAuMDYsMC4zOV0sWydjJywwLjAwLDAuMjQsMC4wMCwwLjMzLDAuMDYsMC40Ml0sWydjJywwLjA2LDAuMTIsMC4yMSwwLjI0LDAuMjcsMC4yNF0sWydjJywwLjAzLDAuMDAsMC4xMiwtMC4xMiwwLjI0LC0wLjIxXSxbJ2MnLDAuOTYsLTEuMjAsMi41OCwtMS4zNSwzLjk5LC0wLjQyXSxbJ2MnLDAuMTUsMC4xMiwwLjQyLDAuMzAsMC41NCwwLjQ1XSxbJ2MnLDAuNDgsMC4zOSwwLjgxLDAuNTcsMS4yOSwwLjYwXSxbJ2MnLDAuNjksMC4wMywxLjUwLC0wLjMwLDIuMTMsLTAuODddLFsnYycsMC4wOSwtMC4wOSwwLjI3LC0wLjMwLDAuMzksLTAuNDVdLFsnYycsMC4xMiwtMC4xNSwwLjI0LC0wLjI3LDAuMzAsLTAuMzBdLFsnYycsMC4xOCwtMC4wNiwwLjM5LDAuMDMsMC41MSwwLjIxXSxbJ2MnLDAuMDYsMC4xOCwwLjA2LDAuMjQsLTAuMjcsMC43Ml0sWydjJywtMC4xOCwwLjI0LC0wLjU0LDAuNzgsLTAuNzgsMS4xN10sWydjJywtMi4zNywzLjU0LC0zLjU0LDYuMjcsLTMuODcsOS4wMF0sWydjJywtMC4wMywwLjMzLC0wLjAzLDAuNjYsLTAuMDMsMS4yNl0sWydjJywwLjAwLDAuOTAsMC4wMCwxLjA4LDAuMTUsMS44OV0sWydjJywwLjA2LDAuNDUsMC4wNiwwLjQ4LDAuMDMsMC42MF0sWydjJywtMC4wNiwwLjA5LC0wLjIxLDAuMjEsLTAuMzAsMC4yMV0sWydjJywtMC4wMywwLjAwLC0wLjI3LC0wLjA2LC0wLjU0LC0wLjE1XSxbJ2MnLC0wLjg0LC0wLjI3LC0xLjExLC0wLjMwLC0xLjY1LC0wLjMwXSxbJ2MnLC0wLjU3LDAuMDAsLTAuODQsMC4wMywtMS41NiwwLjI3XSxbJ2MnLC0wLjYwLDAuMTgsLTAuNjksMC4yMSwtMC44MSwwLjE1XSxbJ2MnLC0wLjEyLC0wLjA2LC0wLjIxLC0wLjE4LC0wLjIxLC0wLjMwXSxbJ2MnLDAuMDAsLTAuMTUsMC42MCwtMS40NCwxLjIwLC0yLjYxXSxbJ2MnLDEuMTQsLTIuMjIsMi43MywtNC42OCw1LjEwLC04LjAxXSxbJ2MnLDAuMjEsLTAuMjcsMC4zNiwtMC40OCwwLjMzLC0wLjQ4XSxbJ2MnLDAuMDAsMC4wMCwtMC4xMiwwLjA2LC0wLjI3LDAuMTJdLFsnYycsLTAuNTQsMC4zMCwtMC45OSwwLjM5LC0xLjU2LDAuMzldLFsnYycsLTAuNzUsMC4wMywtMS4yMCwtMC4xOCwtMS44MywtMC43NV0sWydjJywtMC45OSwtMC45MCwtMS44MywtMS4xNywtMi4zMSwtMC43Ml0sWydjJywtMC4xOCwwLjE1LC0wLjM2LDAuNTEsLTAuNDUsMC44NF0sWydjJywtMC4wNiwwLjI0LC0wLjA2LDAuMzMsLTAuMDksMS45OF0sWydjJywwLjAwLDEuNjIsLTAuMDMsMS43NCwtMC4wNiwxLjgwXSxbJ2MnLC0wLjE1LDAuMjQsLTAuNTQsMC4yNCwtMC42OSwwLjAwXSxbJ2MnLC0wLjA2LC0wLjA5LC0wLjA2LC0wLjE1LC0wLjA2LC0zLjU3XSxbJ2MnLDAuMDAsLTMuNDIsMC4wMCwtMy40OCwwLjA2LC0zLjU3XSxbJ2MnLDAuMDMsLTAuMDYsMC4wOSwtMC4xMiwwLjE1LC0wLjE1XSxbJ3onXV0sdzoxMC41NjEsaDoxNS4wOTN9LFxuXHRcdCc4Jzp7ZDpbWydNJyw0Ljk4LC0xNC45N10sWydjJywwLjMzLC0wLjAzLDEuMDIsLTAuMDMsMS4zMiwwLjAwXSxbJ2MnLDEuMzIsMC4xMiwyLjQ5LDAuNjAsMy4yMSwxLjMyXSxbJ2MnLDAuMzksMC4zOSwwLjY2LDAuODEsMC43OCwxLjI5XSxbJ2MnLDAuMDksMC4zNiwwLjA5LDEuMDgsMC4wMCwxLjQ0XSxbJ2MnLC0wLjIxLDAuODQsLTAuNjYsMS41OSwtMS41OSwyLjU1XSxbJ2wnLC0wLjMwLDAuMzBdLFsnbCcsMC4yNywwLjE4XSxbJ2MnLDEuNDcsMC45MywyLjMxLDIuMzEsMi4yNSwzLjc1XSxbJ2MnLC0wLjAzLDAuNzUsLTAuMjQsMS4zNSwtMC42MywxLjk1XSxbJ2MnLC0wLjQ1LDAuNjYsLTEuMDIsMS4xNCwtMS44MywxLjUzXSxbJ2MnLC0xLjgwLDAuODcsLTQuMjAsMC44NywtNi4wMCwwLjAzXSxbJ2MnLC0xLjYyLC0wLjc4LC0yLjUyLC0yLjE2LC0yLjQ2LC0zLjY2XSxbJ2MnLDAuMDYsLTAuOTksMC41NCwtMS43NywxLjgwLC0yLjk3XSxbJ2MnLDAuNTQsLTAuNTEsMC41NCwtMC41NCwwLjQ4LC0wLjU3XSxbJ2MnLC0wLjM5LC0wLjI3LC0wLjk2LC0wLjc4LC0xLjIwLC0xLjE0XSxbJ2MnLC0wLjc1LC0xLjExLC0wLjg3LC0yLjQwLC0wLjMwLC0zLjYwXSxbJ2MnLDAuNjksLTEuMzUsMi4yNSwtMi4yNSw0LjIwLC0yLjQwXSxbJ3onXSxbJ20nLDEuNTMsMC42OV0sWydjJywtMC40MiwtMC4wOSwtMS4xMSwtMC4xMiwtMS4zOCwtMC4wNl0sWydjJywtMC4zMCwwLjA2LC0wLjYwLDAuMTgsLTAuODEsMC4zMF0sWydjJywtMC4yMSwwLjEyLC0wLjYwLDAuNTEsLTAuNzIsMC43Ml0sWydjJywtMC41MSwwLjg3LC0wLjQyLDEuODksMC4yMSwyLjUyXSxbJ2MnLDAuMjEsMC4yMSwwLjM2LDAuMzAsMS45NSwxLjIzXSxbJ2MnLDAuOTYsMC41NCwxLjc0LDAuOTksMS43NywxLjAyXSxbJ2MnLDAuMDksMC4wMCwwLjYzLC0wLjYwLDAuOTksLTEuMTFdLFsnYycsMC4yMSwtMC4zNiwwLjQ4LC0wLjg3LDAuNTcsLTEuMjNdLFsnYycsMC4wNiwtMC4yNCwwLjA2LC0wLjM2LDAuMDYsLTAuNzJdLFsnYycsMC4wMCwtMC40NSwtMC4wMywtMC42NiwtMC4xNSwtMC45OV0sWydjJywtMC4zOSwtMC44MSwtMS4yOSwtMS40NCwtMi40OSwtMS42OF0sWyd6J10sWydtJywtMS40NCw4LjA3XSxbJ2wnLC0xLjg5LC0xLjA4XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMTgsMC4xNSwtMC4zOSwwLjMzXSxbJ2MnLC0xLjIwLDEuMDgsLTEuNjUsMS45NSwtMS41OSwzLjAwXSxbJ2MnLDAuMDksMS41OSwxLjM1LDIuODUsMy4yMSwzLjI0XSxbJ2MnLDAuMzMsMC4wNiwwLjQ1LDAuMDYsMC45MywwLjA2XSxbJ2MnLDAuNjMsMC4wMCwwLjgxLC0wLjAzLDEuMjksLTAuMjddLFsnYycsMC45MCwtMC40MiwxLjQ3LC0xLjQxLDEuNDEsLTIuNDBdLFsnYycsLTAuMDYsLTAuNjYsLTAuMzksLTEuMjksLTAuOTAsLTEuNjVdLFsnYycsLTAuMTIsLTAuMDksLTEuMDUsLTAuNjMsLTIuMDcsLTEuMjNdLFsneiddXSx3OjEwLjkyNixoOjE0Ljk4OX0sXG5cdFx0JzknOntkOltbJ00nLDQuMjMsLTE0Ljk3XSxbJ2MnLDAuNDIsLTAuMDMsMS4yOSwwLjAwLDEuNjIsMC4wNl0sWydjJywwLjUxLDAuMTIsMC45MywwLjMwLDEuMzgsMC41N10sWydjJywxLjUzLDEuMDIsMi41MiwzLjI0LDIuNzMsNS45NF0sWydjJywwLjE4LDIuNTUsLTAuNDgsNC45OCwtMS44Myw2LjU3XSxbJ2MnLC0xLjA1LDEuMjYsLTIuNDAsMS44OSwtMy45MywxLjgzXSxbJ2MnLC0xLjIzLC0wLjA2LC0yLjMxLC0wLjQ1LC0zLjAzLC0xLjE0XSxbJ2MnLC0wLjU3LC0wLjUxLC0wLjg3LC0xLjIzLC0wLjg0LC0xLjk4XSxbJ2MnLDAuMDMsLTAuNTEsMC4yMSwtMC45MCwwLjYwLC0xLjI2XSxbJ2MnLDAuMjQsLTAuMjQsMC40NSwtMC4zOSwwLjc1LC0wLjUxXSxbJ2MnLDAuMjEsLTAuMDYsMC4yNywtMC4wNiwwLjYwLC0wLjA2XSxbJ2MnLDAuMzMsMC4wMCwwLjM5LDAuMDAsMC42MCwwLjA2XSxbJ2MnLDAuMzAsMC4xMiwwLjUxLDAuMjcsMC43NSwwLjUxXSxbJ2MnLDAuMzksMC4zNiwwLjU3LDAuNzgsMC41NywxLjI2XSxbJ2MnLDAuMDAsMC4yNywwLjAwLDAuMzAsLTAuMDksMC40Ml0sWydjJywtMC4wMywwLjA5LC0wLjE4LDAuMjEsLTAuMzAsMC4zMF0sWydjJywtMC4xMiwwLjA5LC0wLjMwLDAuMjEsLTAuMzksMC4yN10sWydjJywtMC4wOSwwLjA2LC0wLjIxLDAuMTgsLTAuMjcsMC4yNF0sWydjJywtMC4wNiwwLjEyLC0wLjA2LDAuMTUsLTAuMDYsMC4zM10sWydjJywwLjAwLDAuMTgsMC4wMCwwLjI0LDAuMDYsMC4zNl0sWydjJywwLjI0LDAuMzksMC43NSwwLjYwLDEuMzgsMC41N10sWydjJywwLjU0LC0wLjAzLDAuOTAsLTAuMTgsMS4yMywtMC40OF0sWydjJywwLjgxLC0wLjcyLDEuMDgsLTIuMTYsMC45NiwtNS4zN10sWydsJywwLjAwLC0wLjYzXSxbJ2wnLC0wLjMwLDAuMTJdLFsnYycsLTAuNzgsMC4yNywtMS4yOSwwLjMzLC0yLjEwLDAuMjddLFsnYycsLTEuNDcsLTAuMTIsLTIuNDksLTAuNTQsLTMuMjcsLTEuMjldLFsnYycsLTAuNDgsLTAuNTEsLTAuODEsLTEuMTEsLTAuOTYsLTEuODldLFsnYycsLTAuMDYsLTAuMjcsLTAuMDYsLTAuNDIsLTAuMDYsLTAuOTZdLFsnYycsMC4wMCwtMC41MSwwLjAwLC0wLjY2LDAuMDYsLTAuOTNdLFsnYycsMC4xNSwtMC43OCwwLjQ4LC0xLjM4LDAuOTYsLTEuODldLFsnYycsMC4xNSwtMC4xMiwwLjMzLC0wLjI3LDAuNDIsLTAuMzZdLFsnYycsMC42OSwtMC41MSwxLjYyLC0wLjgxLDIuNzYsLTAuOTNdLFsneiddLFsnbScsMS4xNywwLjY2XSxbJ2MnLC0wLjIxLC0wLjA2LC0wLjU3LC0wLjA2LC0wLjgxLC0wLjAzXSxbJ2MnLC0wLjc4LDAuMTIsLTEuMjYsMC42OSwtMS40MSwxLjc0XSxbJ2MnLC0wLjEyLDAuNjMsLTAuMTUsMS45NSwtMC4wOSwyLjc5XSxbJ2MnLDAuMTIsMS43MSwwLjYzLDIuNDAsMS43NywyLjQ2XSxbJ2MnLDEuMDgsMC4wMywxLjYyLC0wLjQ4LDEuODAsLTEuNzRdLFsnYycsMC4wNiwtMC41NCwwLjA2LC0zLjAwLDAuMDAsLTMuNTRdLFsnYycsLTAuMTUsLTEuMDUsLTAuNTEsLTEuNTMsLTEuMjYsLTEuNjhdLFsneiddXSx3OjkuOTU5LGg6MTQuOTg2fSxcblx0XHQncmVzdHMubXVsdGltZWFzdXJlJzp7ZDpbWydNJywwLC00XSxbJ2wnLDAsMTZdLFsnbCcsMSwwXSxbJ2wnLDAsLTVdLFsnbCcsNDAsMF0sWydsJywwLDVdLFsnbCcsMSwwXSxbJ2wnLDAsLTE2XSxbJ2wnLC0xLDBdLFsnbCcsMCw1XSxbJ2wnLC00MCwwXSxbJ2wnLDAsLTVdLFsneiddXSx3OjQyLGg6MTh9LFxuXHRcdCdyZXN0cy53aG9sZSc6e2Q6W1snTScsMC4wNiwwLjAzXSxbJ2wnLDAuMDksLTAuMDZdLFsnbCcsNS40NiwwLjAwXSxbJ2wnLDUuNDksMC4wMF0sWydsJywwLjA5LDAuMDZdLFsnbCcsMC4wNiwwLjA5XSxbJ2wnLDAuMDAsMi4xOV0sWydsJywwLjAwLDIuMTldLFsnbCcsLTAuMDYsMC4wOV0sWydsJywtMC4wOSwwLjA2XSxbJ2wnLC01LjQ5LDAuMDBdLFsnbCcsLTUuNDYsMC4wMF0sWydsJywtMC4wOSwtMC4wNl0sWydsJywtMC4wNiwtMC4wOV0sWydsJywwLjAwLC0yLjE5XSxbJ2wnLDAuMDAsLTIuMTldLFsneiddXSx3OjExLjI1LGg6NC42OH0sXG5cdFx0J3Jlc3RzLmhhbGYnOntkOltbJ00nLDAuMDYsLTQuNjJdLFsnbCcsMC4wOSwtMC4wNl0sWydsJyw1LjQ2LDAuMDBdLFsnbCcsNS40OSwwLjAwXSxbJ2wnLDAuMDksMC4wNl0sWydsJywwLjA2LDAuMDldLFsnbCcsMC4wMCwyLjE5XSxbJ2wnLDAuMDAsMi4xOV0sWydsJywtMC4wNiwwLjA5XSxbJ2wnLC0wLjA5LDAuMDZdLFsnbCcsLTUuNDksMC4wMF0sWydsJywtNS40NiwwLjAwXSxbJ2wnLC0wLjA5LC0wLjA2XSxbJ2wnLC0wLjA2LC0wLjA5XSxbJ2wnLDAuMDAsLTIuMTldLFsnbCcsMC4wMCwtMi4xOV0sWyd6J11dLHc6MTEuMjUsaDo0LjY4fSxcblx0XHQncmVzdHMucXVhcnRlcic6e2Q6W1snTScsMS44OSwtMTEuODJdLFsnYycsMC4xMiwtMC4wNiwwLjI0LC0wLjA2LDAuMzYsLTAuMDNdLFsnYycsMC4wOSwwLjA2LDQuNzQsNS41OCw0Ljg2LDUuODJdLFsnYycsMC4yMSwwLjM5LDAuMTUsMC43OCwtMC4xNSwxLjI2XSxbJ2MnLC0wLjI0LDAuMzMsLTAuNzIsMC44MSwtMS42MiwxLjU2XSxbJ2MnLC0wLjQ1LDAuMzYsLTAuODcsMC43NSwtMC45NiwwLjg0XSxbJ2MnLC0wLjkzLDAuOTksLTEuMTQsMi40OSwtMC42MCwzLjYzXSxbJ2MnLDAuMTgsMC4zOSwwLjI3LDAuNDgsMS4zMiwxLjY4XSxbJ2MnLDEuOTIsMi4yNSwxLjgzLDIuMTYsMS44MywyLjM0XSxbJ2MnLDAuMDAsMC4xOCwtMC4xOCwwLjM2LC0wLjM2LDAuMzldLFsnYycsLTAuMTUsMC4wMCwtMC4yNywtMC4wNiwtMC40OCwtMC4yN10sWydjJywtMC43NSwtMC43NSwtMi40NiwtMS4yOSwtMy4zOSwtMS4wOF0sWydjJywtMC40NSwwLjA5LC0wLjY5LDAuMjcsLTAuOTAsMC42OV0sWydjJywtMC4xMiwwLjMwLC0wLjIxLDAuNjYsLTAuMjQsMS4xNF0sWydjJywtMC4wMywwLjY2LDAuMDksMS4zNSwwLjMwLDIuMDFdLFsnYycsMC4xNSwwLjQyLDAuMjQsMC42NiwwLjQ1LDAuOTZdLFsnYycsMC4xOCwwLjI0LDAuMTgsMC4zMywwLjAzLDAuNDJdLFsnYycsLTAuMTIsMC4wNiwtMC4xOCwwLjAzLC0wLjQ1LC0wLjMwXSxbJ2MnLC0xLjA4LC0xLjM4LC0yLjA3LC0zLjM2LC0yLjQwLC00LjgzXSxbJ2MnLC0wLjI3LC0xLjA1LC0wLjE1LC0xLjc3LDAuMjcsLTIuMDddLFsnYycsMC4yMSwtMC4xMiwwLjQyLC0wLjE1LDAuODcsLTAuMTVdLFsnYycsMC44NywwLjA2LDIuMTAsMC4zOSwzLjMwLDAuOTBdLFsnbCcsMC4zOSwwLjE4XSxbJ2wnLC0xLjY1LC0xLjk1XSxbJ2MnLC0yLjUyLC0yLjk3LC0yLjYxLC0zLjA5LC0yLjcwLC0zLjI3XSxbJ2MnLC0wLjA5LC0wLjI0LC0wLjEyLC0wLjQ4LC0wLjAzLC0wLjc1XSxbJ2MnLDAuMTUsLTAuNDgsMC41NywtMC45NiwxLjgzLC0yLjAxXSxbJ2MnLDAuNDUsLTAuMzYsMC44NCwtMC43MiwwLjkzLC0wLjc4XSxbJ2MnLDAuNjksLTAuNzUsMS4wMiwtMS44MCwwLjkwLC0yLjc5XSxbJ2MnLC0wLjA2LC0wLjMzLC0wLjIxLC0wLjg0LC0wLjM5LC0xLjExXSxbJ2MnLC0wLjA5LC0wLjE1LC0wLjQ1LC0wLjYwLC0wLjgxLC0xLjA1XSxbJ2MnLC0wLjM2LC0wLjQyLC0wLjY5LC0wLjgxLC0wLjcyLC0wLjg3XSxbJ2MnLC0wLjA5LC0wLjE4LDAuMDAsLTAuNDIsMC4yMSwtMC41MV0sWyd6J11dLHc6Ny44ODgsaDoyMS40MzV9LFxuXHRcdCdyZXN0cy44dGgnOntkOltbJ00nLDEuNjgsLTYuMTJdLFsnYycsMC42NiwtMC4wOSwxLjIzLDAuMDksMS42OCwwLjUxXSxbJ2MnLDAuMjcsMC4zMCwwLjM5LDAuNTQsMC41NywxLjI2XSxbJ2MnLDAuMDksMC4zMywwLjE4LDAuNjYsMC4yMSwwLjcyXSxbJ2MnLDAuMTIsMC4yNywwLjMzLDAuNDUsMC42MCwwLjQ4XSxbJ2MnLDAuMTIsMC4wMCwwLjE4LDAuMDAsMC4zMywtMC4wOV0sWydjJywwLjM5LC0wLjE4LDEuMzIsLTEuMjksMS42OCwtMS45OF0sWydjJywwLjA5LC0wLjIxLDAuMjQsLTAuMzAsMC4zOSwtMC4zMF0sWydjJywwLjEyLDAuMDAsMC4yNywwLjA5LDAuMzMsMC4xOF0sWydjJywwLjAzLDAuMDYsLTAuMjcsMS4xMSwtMS44Niw2LjQyXSxbJ2MnLC0xLjAyLDMuNDgsLTEuODksNi4zOSwtMS45Miw2LjQyXSxbJ2MnLDAuMDAsMC4wMywtMC4xMiwwLjEyLC0wLjI0LDAuMTVdLFsnYycsLTAuMTgsMC4wOSwtMC4yMSwwLjA5LC0wLjQ1LDAuMDldLFsnYycsLTAuMjQsMC4wMCwtMC4zMCwwLjAwLC0wLjQ4LC0wLjA2XSxbJ2MnLC0wLjA5LC0wLjA2LC0wLjIxLC0wLjEyLC0wLjIxLC0wLjE1XSxbJ2MnLC0wLjA2LC0wLjAzLDAuMTUsLTAuNTcsMS42OCwtNC45Ml0sWydjJywwLjk2LC0yLjY3LDEuNzQsLTQuODksMS43MSwtNC44OV0sWydsJywtMC41MSwwLjE1XSxbJ2MnLC0xLjA4LDAuMzYsLTEuNzQsMC40OCwtMi41NSwwLjQ4XSxbJ2MnLC0wLjY2LDAuMDAsLTAuODQsLTAuMDMsLTEuMzIsLTAuMjddLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC4zMywtMC40NSwwLjg0LC0wLjgxLDEuMzgsLTAuOTBdLFsneiddXSx3OjcuNTM0LGg6MTMuODgzfSxcblx0XHQncmVzdHMuMTZ0aCc6e2Q6W1snTScsMy4zMywtNi4xMl0sWydjJywwLjY2LC0wLjA5LDEuMjMsMC4wOSwxLjY4LDAuNTFdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4wOSwwLjMzLDAuMTgsMC42NiwwLjIxLDAuNzJdLFsnYycsMC4xNSwwLjM5LDAuNTcsMC41NywwLjg3LDAuNDJdLFsnYycsMC4zOSwtMC4xOCwxLjIwLC0xLjIzLDEuNjIsLTIuMDddLFsnYycsMC4wNiwtMC4xNSwwLjI0LC0wLjI0LDAuMzYsLTAuMjRdLFsnYycsMC4xMiwwLjAwLDAuMjcsMC4wOSwwLjMzLDAuMThdLFsnYycsMC4wMywwLjA2LC0wLjQ1LDEuODYsLTIuNjcsMTAuMTddLFsnYycsLTEuNTAsNS41NSwtMi43MywxMC4xNCwtMi43NiwxMC4xN10sWydjJywtMC4wMywwLjAzLC0wLjEyLDAuMTIsLTAuMjQsMC4xNV0sWydjJywtMC4xOCwwLjA5LC0wLjIxLDAuMDksLTAuNDUsMC4wOV0sWydjJywtMC4yNCwwLjAwLC0wLjMwLDAuMDAsLTAuNDgsLTAuMDZdLFsnYycsLTAuMDksLTAuMDYsLTAuMjEsLTAuMTIsLTAuMjEsLTAuMTVdLFsnYycsLTAuMDYsLTAuMDMsMC4xMiwtMC41NywxLjQ0LC00LjkyXSxbJ2MnLDAuODEsLTIuNjcsMS40NywtNC44NiwxLjQ3LC00Ljg5XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMjcsMC4wNiwtMC41NCwwLjE1XSxbJ2MnLC0xLjA4LDAuMzYsLTEuNzcsMC40OCwtMi41OCwwLjQ4XSxbJ2MnLC0wLjY2LDAuMDAsLTAuODQsLTAuMDMsLTEuMzIsLTAuMjddLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC43MiwtMS4wNSwyLjIyLC0xLjIzLDMuMDYsLTAuNDJdLFsnYycsMC4zMCwwLjMzLDAuNDIsMC42MCwwLjYwLDEuMzhdLFsnYycsMC4wOSwwLjQ1LDAuMjEsMC43OCwwLjMzLDAuOTBdLFsnYycsMC4wOSwwLjA5LDAuMjcsMC4xOCwwLjQ1LDAuMjFdLFsnYycsMC4xMiwwLjAwLDAuMTgsMC4wMCwwLjMzLC0wLjA5XSxbJ2MnLDAuMzMsLTAuMTUsMS4wMiwtMC45MywxLjQxLC0xLjU5XSxbJ2MnLDAuMTIsLTAuMjEsMC4xOCwtMC4zOSwwLjM5LC0xLjA4XSxbJ2MnLDAuNjYsLTIuMTAsMS4xNywtMy44NCwxLjE3LC0zLjg3XSxbJ2MnLDAuMDAsMC4wMCwtMC4yMSwwLjA2LC0wLjQyLDAuMTVdLFsnYycsLTAuNTEsMC4xNSwtMS4yMCwwLjMzLC0xLjY4LDAuNDJdLFsnYycsLTAuMzMsMC4wNiwtMC41MSwwLjA2LC0wLjk2LDAuMDZdLFsnYycsLTAuNjYsMC4wMCwtMC44NCwtMC4wMywtMS4zMiwtMC4yN10sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjMzLC0wLjQ1LDAuODQsLTAuODEsMS4zOCwtMC45MF0sWyd6J11dLHc6OS43MjQsaDoyMS4zODN9LFxuXHRcdCdyZXN0cy4zMm5kJzp7ZDpbWydNJyw0LjIzLC0xMy42Ml0sWydjJywwLjY2LC0wLjA5LDEuMjMsMC4wOSwxLjY4LDAuNTFdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4wOSwwLjMzLDAuMTgsMC42NiwwLjIxLDAuNzJdLFsnYycsMC4xMiwwLjI3LDAuMzMsMC40NSwwLjYwLDAuNDhdLFsnYycsMC4xMiwwLjAwLDAuMTgsMC4wMCwwLjI3LC0wLjA2XSxbJ2MnLDAuMzMsLTAuMjEsMC45OSwtMS4xMSwxLjQ0LC0xLjk4XSxbJ2MnLDAuMDksLTAuMjQsMC4yMSwtMC4zMywwLjM5LC0wLjMzXSxbJ2MnLDAuMTIsMC4wMCwwLjI3LDAuMDksMC4zMywwLjE4XSxbJ2MnLDAuMDMsMC4wNiwtMC41NywyLjY3LC0zLjIxLDEzLjg5XSxbJ2MnLC0xLjgwLDcuNjIsLTMuMzAsMTMuODksLTMuMzAsMTMuOTJdLFsnYycsLTAuMDMsMC4wNiwtMC4xMiwwLjEyLC0wLjI0LDAuMThdLFsnYycsLTAuMjEsMC4wOSwtMC4yNCwwLjA5LC0wLjQ4LDAuMDldLFsnYycsLTAuMjQsMC4wMCwtMC4zMCwwLjAwLC0wLjQ4LC0wLjA2XSxbJ2MnLC0wLjA5LC0wLjA2LC0wLjIxLC0wLjEyLC0wLjIxLC0wLjE1XSxbJ2MnLC0wLjA2LC0wLjAzLDAuMDksLTAuNTcsMS4yMywtNC45Ml0sWydjJywwLjY5LC0yLjY3LDEuMjYsLTQuODYsMS4yOSwtNC44OV0sWydjJywwLjAwLC0wLjAzLC0wLjEyLC0wLjAzLC0wLjQ4LDAuMTJdLFsnYycsLTEuMTcsMC4zOSwtMi4yMiwwLjU3LC0zLjAwLDAuNTRdLFsnYycsLTAuNDIsLTAuMDMsLTAuNzUsLTAuMTIsLTEuMTEsLTAuMzBdLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC43MiwtMS4wNSwyLjIyLC0xLjIzLDMuMDYsLTAuNDJdLFsnYycsMC4zMCwwLjMzLDAuNDIsMC42MCwwLjYwLDEuMzhdLFsnYycsMC4wOSwwLjQ1LDAuMjEsMC43OCwwLjMzLDAuOTBdLFsnYycsMC4xMiwwLjA5LDAuMzAsMC4xOCwwLjQ4LDAuMjFdLFsnYycsMC4xMiwwLjAwLDAuMTgsMC4wMCwwLjMwLC0wLjA5XSxbJ2MnLDAuNDIsLTAuMjEsMS4yOSwtMS4yOSwxLjU2LC0xLjg5XSxbJ2MnLDAuMDMsLTAuMTIsMS4yMywtNC41OSwxLjIzLC00LjY1XSxbJ2MnLDAuMDAsLTAuMDMsLTAuMTgsMC4wMywtMC4zOSwwLjEyXSxbJ2MnLC0wLjYzLDAuMTgsLTEuMjAsMC4zNiwtMS43NCwwLjQ1XSxbJ2MnLC0wLjM5LDAuMDYsLTAuNTQsMC4wNiwtMS4wMiwwLjA2XSxbJ2MnLC0wLjY2LDAuMDAsLTAuODQsLTAuMDMsLTEuMzIsLTAuMjddLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC43MiwtMS4wNSwyLjIyLC0xLjIzLDMuMDYsLTAuNDJdLFsnYycsMC4zMCwwLjMzLDAuNDIsMC42MCwwLjYwLDEuMzhdLFsnYycsMC4wOSwwLjQ1LDAuMjEsMC43OCwwLjMzLDAuOTBdLFsnYycsMC4xOCwwLjE4LDAuNTEsMC4yNywwLjcyLDAuMTVdLFsnYycsMC4zMCwtMC4xMiwwLjY5LC0wLjU3LDEuMDgsLTEuMTddLFsnYycsMC40MiwtMC42MCwwLjM5LC0wLjUxLDEuMDUsLTMuMDNdLFsnYycsMC4zMywtMS4yNiwwLjYwLC0yLjMxLDAuNjAsLTIuMzRdLFsnYycsMC4wMCwwLjAwLC0wLjIxLDAuMDMsLTAuNDUsMC4xMl0sWydjJywtMC41NywwLjE4LC0xLjE0LDAuMzMsLTEuNjIsMC40Ml0sWydjJywtMC4zMywwLjA2LC0wLjUxLDAuMDYsLTAuOTYsMC4wNl0sWydjJywtMC42NiwwLjAwLC0wLjg0LC0wLjAzLC0xLjMyLC0wLjI3XSxbJ2MnLC0xLjMyLC0wLjYzLC0xLjc3LC0yLjE2LC0xLjAyLC0zLjMwXSxbJ2MnLDAuMzMsLTAuNDUsMC44NCwtMC44MSwxLjM4LC0wLjkwXSxbJ3onXV0sdzoxMS4zNzMsaDoyOC44ODN9LFxuXHRcdCdyZXN0cy42NHRoJzp7ZDpbWydNJyw1LjEzLC0xMy42Ml0sWydjJywwLjY2LC0wLjA5LDEuMjMsMC4wOSwxLjY4LDAuNTFdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4xNSwwLjYzLDAuMjEsMC44MSwwLjMzLDAuOTZdLFsnYycsMC4xOCwwLjIxLDAuNTQsMC4zMCwwLjc1LDAuMThdLFsnYycsMC4yNCwtMC4xMiwwLjYzLC0wLjY2LDEuMDgsLTEuNTZdLFsnYycsMC4zMywtMC42NiwwLjM5LC0wLjcyLDAuNjAsLTAuNzJdLFsnYycsMC4xMiwwLjAwLDAuMjcsMC4wOSwwLjMzLDAuMThdLFsnYycsMC4wMywwLjA2LC0wLjY5LDMuNjYsLTMuNTQsMTcuNjRdLFsnYycsLTEuOTUsOS42NiwtMy41NywxNy42MSwtMy41NywxNy42NF0sWydjJywtMC4wMywwLjA2LC0wLjEyLDAuMTIsLTAuMjQsMC4xOF0sWydjJywtMC4yMSwwLjA5LC0wLjI0LDAuMDksLTAuNDgsMC4wOV0sWydjJywtMC4yNCwwLjAwLC0wLjMwLDAuMDAsLTAuNDgsLTAuMDZdLFsnYycsLTAuMDksLTAuMDYsLTAuMjEsLTAuMTIsLTAuMjEsLTAuMTVdLFsnYycsLTAuMDYsLTAuMDMsMC4wNiwtMC41NywxLjA1LC00Ljk1XSxbJ2MnLDAuNjAsLTIuNzAsMS4wOCwtNC44OSwxLjA4LC00LjkyXSxbJ2MnLDAuMDAsMC4wMCwtMC4yNCwwLjA2LC0wLjUxLDAuMTVdLFsnYycsLTAuNjYsMC4yNCwtMS4yMCwwLjM2LC0xLjc3LDAuNDhdLFsnYycsLTAuNDIsMC4wNiwtMC41NywwLjA2LC0xLjA1LDAuMDZdLFsnYycsLTAuNjksMC4wMCwtMC44NywtMC4wMywtMS4zNSwtMC4yN10sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjcyLC0xLjA1LDIuMjIsLTEuMjMsMy4wNiwtMC40Ml0sWydjJywwLjMwLDAuMzMsMC40MiwwLjYwLDAuNjAsMS4zOF0sWydjJywwLjA5LDAuNDUsMC4yMSwwLjc4LDAuMzMsMC45MF0sWydjJywwLjA5LDAuMDksMC4yNywwLjE4LDAuNDUsMC4yMV0sWydjJywwLjIxLDAuMDMsMC4zOSwtMC4wOSwwLjcyLC0wLjQyXSxbJ2MnLDAuNDUsLTAuNDUsMS4wMiwtMS4yNiwxLjE3LC0xLjY1XSxbJ2MnLDAuMDMsLTAuMDksMC4yNywtMS4xNCwwLjU0LC0yLjM0XSxbJ2MnLDAuMjcsLTEuMjAsMC40OCwtMi4xOSwwLjUxLC0yLjIyXSxbJ2MnLDAuMDAsLTAuMDMsLTAuMDksLTAuMDMsLTAuNDgsMC4xMl0sWydjJywtMS4xNywwLjM5LC0yLjIyLDAuNTcsLTMuMDAsMC41NF0sWydjJywtMC40MiwtMC4wMywtMC43NSwtMC4xMiwtMS4xMSwtMC4zMF0sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjM2LC0wLjU0LDAuOTYsLTAuODcsMS42NSwtMC45M10sWydjJywwLjU0LC0wLjAzLDEuMDIsMC4xNSwxLjQxLDAuNTRdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4wOSwwLjMzLDAuMTgsMC42NiwwLjIxLDAuNzJdLFsnYycsMC4xNSwwLjM5LDAuNTcsMC41NywwLjkwLDAuNDJdLFsnYycsMC4zNiwtMC4xOCwxLjIwLC0xLjI2LDEuNDcsLTEuODldLFsnYycsMC4wMywtMC4wOSwwLjMwLC0xLjIwLDAuNTcsLTIuNDNdLFsnbCcsMC41MSwtMi4yOF0sWydsJywtMC41NCwwLjE4XSxbJ2MnLC0xLjExLDAuMzYsLTEuODAsMC40OCwtMi42MSwwLjQ4XSxbJ2MnLC0wLjY2LDAuMDAsLTAuODQsLTAuMDMsLTEuMzIsLTAuMjddLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC4zNiwtMC41NCwwLjk2LC0wLjg3LDEuNjUsLTAuOTNdLFsnYycsMC41NCwtMC4wMywxLjAyLDAuMTUsMS40MSwwLjU0XSxbJ2MnLDAuMjcsMC4zMCwwLjM5LDAuNTQsMC41NywxLjI2XSxbJ2MnLDAuMTUsMC42MywwLjIxLDAuODEsMC4zMywwLjk2XSxbJ2MnLDAuMjEsMC4yMSwwLjU0LDAuMzAsMC43NSwwLjE4XSxbJ2MnLDAuMzYsLTAuMTgsMC45MywtMC45MywxLjI5LC0xLjY4XSxbJ2MnLDAuMTIsLTAuMjQsMC4xOCwtMC40OCwwLjYzLC0yLjU1XSxbJ2wnLDAuNTEsLTIuMzFdLFsnYycsMC4wMCwtMC4wMywtMC4xOCwwLjAzLC0wLjM5LDAuMTJdLFsnYycsLTEuMTQsMC4zNiwtMi4xMCwwLjU0LC0yLjgyLDAuNTFdLFsnYycsLTAuNDIsLTAuMDMsLTAuNzUsLTAuMTIsLTEuMTEsLTAuMzBdLFsnYycsLTEuMzIsLTAuNjMsLTEuNzcsLTIuMTYsLTEuMDIsLTMuMzBdLFsnYycsMC4zMywtMC40NSwwLjg0LC0wLjgxLDEuMzgsLTAuOTBdLFsneiddXSx3OjEyLjQ1MyxoOjM2LjM4M30sXG5cdFx0J3Jlc3RzLjEyOHRoJzp7ZDpbWydNJyw2LjAzLC0yMS4xMl0sWydjJywwLjY2LC0wLjA5LDEuMjMsMC4wOSwxLjY4LDAuNTFdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4wOSwwLjMzLDAuMTgsMC42NiwwLjIxLDAuNzJdLFsnYycsMC4xMiwwLjI3LDAuMzMsMC40NSwwLjYwLDAuNDhdLFsnYycsMC4yMSwwLjAwLDAuMzMsLTAuMDYsMC41NCwtMC4zNl0sWydjJywwLjE1LC0wLjIxLDAuNTQsLTAuOTMsMC43OCwtMS40N10sWydjJywwLjE1LC0wLjMzLDAuMTgsLTAuMzksMC4zMCwtMC40OF0sWydjJywwLjE4LC0wLjA5LDAuNDUsMC4wMCwwLjUxLDAuMTVdLFsnYycsMC4wMywwLjA5LC03LjExLDQyLjc1LC03LjE3LDQyLjg0XSxbJ2MnLC0wLjAzLDAuMDMsLTAuMTUsMC4wOSwtMC4yNCwwLjE1XSxbJ2MnLC0wLjE4LDAuMDYsLTAuMjQsMC4wNiwtMC40NSwwLjA2XSxbJ2MnLC0wLjI0LDAuMDAsLTAuMzAsMC4wMCwtMC40OCwtMC4wNl0sWydjJywtMC4wOSwtMC4wNiwtMC4yMSwtMC4xMiwtMC4yMSwtMC4xNV0sWydjJywtMC4wNiwtMC4wMywwLjAzLC0wLjU3LDAuODQsLTQuOThdLFsnYycsMC41MSwtMi43MCwwLjkzLC00LjkyLDAuOTAsLTQuOTJdLFsnYycsMC4wMCwwLjAwLC0wLjE1LDAuMDYsLTAuMzYsMC4xMl0sWydjJywtMC43OCwwLjI3LC0xLjYyLDAuNDgsLTIuMzEsMC41N10sWydjJywtMC4xNSwwLjAzLC0wLjU0LDAuMDMsLTAuODEsMC4wM10sWydjJywtMC42NiwwLjAwLC0wLjg0LC0wLjAzLC0xLjMyLC0wLjI3XSxbJ2MnLC0xLjMyLC0wLjYzLC0xLjc3LC0yLjE2LC0xLjAyLC0zLjMwXSxbJ2MnLDAuMzYsLTAuNTQsMC45NiwtMC44NywxLjY1LC0wLjkzXSxbJ2MnLDAuNTQsLTAuMDMsMS4wMiwwLjE1LDEuNDEsMC41NF0sWydjJywwLjI3LDAuMzAsMC4zOSwwLjU0LDAuNTcsMS4yNl0sWydjJywwLjA5LDAuMzMsMC4xOCwwLjY2LDAuMjEsMC43Ml0sWydjJywwLjEyLDAuMjcsMC4zMywwLjQ1LDAuNjMsMC40OF0sWydjJywwLjEyLDAuMDAsMC4xOCwwLjAwLDAuMzAsLTAuMDldLFsnYycsMC40MiwtMC4yMSwxLjE0LC0xLjExLDEuNTAsLTEuODNdLFsnYycsMC4xMiwtMC4yNywwLjEyLC0wLjI3LDAuNTQsLTIuNTJdLFsnYycsMC4yNCwtMS4yMywwLjQyLC0yLjI1LDAuMzksLTIuMjVdLFsnYycsMC4wMCwwLjAwLC0wLjI0LDAuMDYsLTAuNTEsMC4xOF0sWydjJywtMS4yNiwwLjM5LC0yLjI1LDAuNTcsLTMuMDYsMC41NF0sWydjJywtMC40MiwtMC4wMywtMC43NSwtMC4xMiwtMS4xMSwtMC4zMF0sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjM2LC0wLjU0LDAuOTYsLTAuODcsMS42NSwtMC45M10sWydjJywwLjU0LC0wLjAzLDEuMDIsMC4xNSwxLjQxLDAuNTRdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4xNSwwLjYzLDAuMjEsMC44MSwwLjMzLDAuOTZdLFsnYycsMC4xOCwwLjIxLDAuNTEsMC4zMCwwLjc1LDAuMThdLFsnYycsMC4zNiwtMC4xNSwxLjA1LC0wLjk5LDEuNDEsLTEuNzddLFsnbCcsMC4xNSwtMC4zMF0sWydsJywwLjQyLC0yLjI1XSxbJ2MnLDAuMjEsLTEuMjYsMC40MiwtMi4yOCwwLjM5LC0yLjI4XSxbJ2wnLC0wLjUxLDAuMTVdLFsnYycsLTEuMTEsMC4zOSwtMS44OSwwLjUxLC0yLjcwLDAuNTFdLFsnYycsLTAuNjYsMC4wMCwtMC44NCwtMC4wMywtMS4zMiwtMC4yN10sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjM2LC0wLjU0LDAuOTYsLTAuODcsMS42NSwtMC45M10sWydjJywwLjU0LC0wLjAzLDEuMDIsMC4xNSwxLjQxLDAuNTRdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4xNSwwLjYzLDAuMjEsMC44MSwwLjMzLDAuOTZdLFsnYycsMC4xOCwwLjE4LDAuNDgsMC4yNywwLjcyLDAuMjFdLFsnYycsMC4zMywtMC4xMiwxLjE0LC0xLjI2LDEuNDEsLTEuOTVdLFsnYycsMC4wMCwtMC4wOSwwLjIxLC0xLjExLDAuNDUsLTIuMzRdLFsnYycsMC4yMSwtMS4yMCwwLjM5LC0yLjIyLDAuMzksLTIuMjhdLFsnYycsMC4wMywtMC4wMywwLjAwLC0wLjAzLC0wLjQ1LDAuMTJdLFsnYycsLTAuNTcsMC4xOCwtMS4yMCwwLjMzLC0xLjcxLDAuNDJdLFsnYycsLTAuMzAsMC4wNiwtMC41MSwwLjA2LC0wLjkzLDAuMDZdLFsnYycsLTAuNjYsMC4wMCwtMC44NCwtMC4wMywtMS4zMiwtMC4yN10sWydjJywtMS4zMiwtMC42MywtMS43NywtMi4xNiwtMS4wMiwtMy4zMF0sWydjJywwLjM2LC0wLjU0LDAuOTYsLTAuODcsMS42NSwtMC45M10sWydjJywwLjU0LC0wLjAzLDEuMDIsMC4xNSwxLjQxLDAuNTRdLFsnYycsMC4yNywwLjMwLDAuMzksMC41NCwwLjU3LDEuMjZdLFsnYycsMC4wOSwwLjMzLDAuMTgsMC42NiwwLjIxLDAuNzJdLFsnYycsMC4xMiwwLjI3LDAuMzMsMC40NSwwLjYwLDAuNDhdLFsnYycsMC4xOCwwLjAwLDAuMzYsLTAuMDksMC41NywtMC4zM10sWydjJywwLjMzLC0wLjM2LDAuNzgsLTEuMTQsMC45MywtMS41Nl0sWydjJywwLjAzLC0wLjEyLDAuMjQsLTEuMjAsMC40NSwtMi40MF0sWydjJywwLjI0LC0xLjIwLDAuNDIsLTIuMjIsMC40MiwtMi4yOF0sWydjJywwLjAzLC0wLjAzLDAuMDAsLTAuMDMsLTAuMzksMC4wOV0sWydjJywtMS4wNSwwLjM2LC0xLjgwLDAuNDgsLTIuNTgsMC40OF0sWydjJywtMC42MywwLjAwLC0wLjg0LC0wLjAzLC0xLjI5LC0wLjI3XSxbJ2MnLC0xLjMyLC0wLjYzLC0xLjc3LC0yLjE2LC0xLjAyLC0zLjMwXSxbJ2MnLDAuMzMsLTAuNDUsMC44NCwtMC44MSwxLjM4LC0wLjkwXSxbJ3onXV0sdzoxMi45OTIsaDo0My44ODN9LFxuXHRcdCdhY2NpZGVudGFscy5zaGFycCc6e2Q6W1snTScsNS43MywtMTEuMTldLFsnYycsMC4yMSwtMC4xMiwwLjU0LC0wLjAzLDAuNjYsMC4yNF0sWydjJywwLjA2LDAuMTIsMC4wNiwwLjIxLDAuMDYsMi4zMV0sWydjJywwLjAwLDEuMjMsMC4wMCwyLjIyLDAuMDMsMi4yMl0sWydjJywwLjAwLDAuMDAsMC4yNywtMC4xMiwwLjYwLC0wLjI0XSxbJ2MnLDAuNjksLTAuMjcsMC43OCwtMC4zMCwwLjk2LC0wLjE1XSxbJ2MnLDAuMjEsMC4xNSwwLjIxLDAuMTgsMC4yMSwxLjM4XSxbJ2MnLDAuMDAsMS4wMiwwLjAwLDEuMTEsLTAuMDYsMS4yMF0sWydjJywtMC4wMywwLjA2LC0wLjA5LDAuMTIsLTAuMTIsMC4xNV0sWydjJywtMC4wNiwwLjAzLC0wLjQyLDAuMjEsLTAuODQsMC4zNl0sWydsJywtMC43NSwwLjMzXSxbJ2wnLC0wLjAzLDIuNDNdLFsnYycsMC4wMCwxLjMyLDAuMDAsMi40MywwLjAzLDIuNDNdLFsnYycsMC4wMCwwLjAwLDAuMjcsLTAuMTIsMC42MCwtMC4yNF0sWydjJywwLjY5LC0wLjI3LDAuNzgsLTAuMzAsMC45NiwtMC4xNV0sWydjJywwLjIxLDAuMTUsMC4yMSwwLjE4LDAuMjEsMS4zOF0sWydjJywwLjAwLDEuMDIsMC4wMCwxLjExLC0wLjA2LDEuMjBdLFsnYycsLTAuMDMsMC4wNiwtMC4wOSwwLjEyLC0wLjEyLDAuMTVdLFsnYycsLTAuMDYsMC4wMywtMC40MiwwLjIxLC0wLjg0LDAuMzZdLFsnbCcsLTAuNzUsMC4zM10sWydsJywtMC4wMywyLjUyXSxbJ2MnLDAuMDAsMi4yOCwtMC4wMywyLjU1LC0wLjA2LDIuNjRdLFsnYycsLTAuMjEsMC4zNiwtMC43MiwwLjM2LC0wLjkzLDAuMDBdLFsnYycsLTAuMDMsLTAuMDksLTAuMDYsLTAuMzMsLTAuMDYsLTIuNDNdLFsnbCcsMC4wMCwtMi4zMV0sWydsJywtMS4yOSwwLjUxXSxbJ2wnLC0xLjI2LDAuNTFdLFsnbCcsMC4wMCwyLjQzXSxbJ2MnLDAuMDAsMi41OCwwLjAwLDIuNTIsLTAuMTUsMi42N10sWydjJywtMC4wNiwwLjA5LC0wLjI3LDAuMTgsLTAuMzYsMC4xOF0sWydjJywtMC4xMiwwLjAwLC0wLjMzLC0wLjA5LC0wLjM5LC0wLjE4XSxbJ2MnLC0wLjE1LC0wLjE1LC0wLjE1LC0wLjA5LC0wLjE1LC0yLjQzXSxbJ2MnLDAuMDAsLTEuMjMsMC4wMCwtMi4yMiwtMC4wMywtMi4yMl0sWydjJywwLjAwLDAuMDAsLTAuMjcsMC4xMiwtMC42MCwwLjI0XSxbJ2MnLC0wLjY5LDAuMjcsLTAuNzgsMC4zMCwtMC45NiwwLjE1XSxbJ2MnLC0wLjIxLC0wLjE1LC0wLjIxLC0wLjE4LC0wLjIxLC0xLjM4XSxbJ2MnLDAuMDAsLTEuMDIsMC4wMCwtMS4xMSwwLjA2LC0xLjIwXSxbJ2MnLDAuMDMsLTAuMDYsMC4wOSwtMC4xMiwwLjEyLC0wLjE1XSxbJ2MnLDAuMDYsLTAuMDMsMC40MiwtMC4yMSwwLjg0LC0wLjM2XSxbJ2wnLDAuNzgsLTAuMzNdLFsnbCcsMC4wMCwtMi40M10sWydjJywwLjAwLC0xLjMyLDAuMDAsLTIuNDMsLTAuMDMsLTIuNDNdLFsnYycsMC4wMCwwLjAwLC0wLjI3LDAuMTIsLTAuNjAsMC4yNF0sWydjJywtMC42OSwwLjI3LC0wLjc4LDAuMzAsLTAuOTYsMC4xNV0sWydjJywtMC4yMSwtMC4xNSwtMC4yMSwtMC4xOCwtMC4yMSwtMS4zOF0sWydjJywwLjAwLC0xLjAyLDAuMDAsLTEuMTEsMC4wNiwtMS4yMF0sWydjJywwLjAzLC0wLjA2LDAuMDksLTAuMTIsMC4xMiwtMC4xNV0sWydjJywwLjA2LC0wLjAzLDAuNDIsLTAuMjEsMC44NCwtMC4zNl0sWydsJywwLjc4LC0wLjMzXSxbJ2wnLDAuMDAsLTIuNTJdLFsnYycsMC4wMCwtMi4yOCwwLjAzLC0yLjU1LDAuMDYsLTIuNjRdLFsnYycsMC4yMSwtMC4zNiwwLjcyLC0wLjM2LDAuOTMsMC4wMF0sWydjJywwLjAzLDAuMDksMC4wNiwwLjMzLDAuMDYsMi40M10sWydsJywwLjAzLDIuMzFdLFsnbCcsMS4yNiwtMC41MV0sWydsJywxLjI2LC0wLjUxXSxbJ2wnLDAuMDAsLTIuNDNdLFsnYycsMC4wMCwtMi4yOCwwLjAwLC0yLjQzLDAuMDYsLTIuNTVdLFsnYycsMC4wNiwtMC4xMiwwLjEyLC0wLjE4LDAuMjcsLTAuMjRdLFsneiddLFsnbScsLTAuMzMsMTAuNjVdLFsnbCcsMC4wMCwtMi40M10sWydsJywtMS4yOSwwLjUxXSxbJ2wnLC0xLjI2LDAuNTFdLFsnbCcsMC4wMCwyLjQ2XSxbJ2wnLDAuMDAsMi40M10sWydsJywwLjA5LC0wLjAzXSxbJ2MnLDAuMDYsLTAuMDMsMC42MywtMC4yNywxLjI5LC0wLjUxXSxbJ2wnLDEuMTcsLTAuNDhdLFsnbCcsMC4wMCwtMi40Nl0sWyd6J11dLHc6OC4yNSxoOjIyLjQ2Mn0sXG5cdFx0J2FjY2lkZW50YWxzLmhhbGZzaGFycCc6e2Q6W1snTScsMi40MywtMTAuMDVdLFsnYycsMC4yMSwtMC4xMiwwLjU0LC0wLjAzLDAuNjYsMC4yNF0sWydjJywwLjA2LDAuMTIsMC4wNiwwLjIxLDAuMDYsMi4wMV0sWydjJywwLjAwLDEuMDUsMC4wMCwxLjg5LDAuMDMsMS44OV0sWydsJywwLjcyLC0wLjQ4XSxbJ2MnLDAuNjksLTAuNDgsMC42OSwtMC41MSwwLjg3LC0wLjUxXSxbJ2MnLDAuMTUsMC4wMCwwLjE4LDAuMDMsMC4yNywwLjA5XSxbJ2MnLDAuMjEsMC4xNSwwLjIxLDAuMTgsMC4yMSwxLjQxXSxbJ2MnLDAuMDAsMS4xMSwtMC4wMywxLjE0LC0wLjA5LDEuMjNdLFsnYycsLTAuMDMsMC4wMywtMC40OCwwLjM5LC0xLjAyLDAuNzVdLFsnbCcsLTAuOTksMC42Nl0sWydsJywwLjAwLDIuMzddLFsnYycsMC4wMCwxLjMyLDAuMDAsMi4zNywwLjAzLDIuMzddLFsnbCcsMC43MiwtMC40OF0sWydjJywwLjY5LC0wLjQ4LDAuNjksLTAuNTEsMC44NywtMC41MV0sWydjJywwLjE1LDAuMDAsMC4xOCwwLjAzLDAuMjcsMC4wOV0sWydjJywwLjIxLDAuMTUsMC4yMSwwLjE4LDAuMjEsMS40MV0sWydjJywwLjAwLDEuMTEsLTAuMDMsMS4xNCwtMC4wOSwxLjIzXSxbJ2MnLC0wLjAzLDAuMDMsLTAuNDgsMC4zOSwtMS4wMiwwLjc1XSxbJ2wnLC0wLjk5LDAuNjZdLFsnbCcsMC4wMCwyLjI1XSxbJ2MnLDAuMDAsMS45NSwwLjAwLDIuMjgsLTAuMDYsMi4zN10sWydjJywtMC4wNiwwLjEyLC0wLjEyLDAuMjEsLTAuMjQsMC4yN10sWydjJywtMC4yNywwLjEyLC0wLjU0LDAuMDMsLTAuNjksLTAuMjRdLFsnYycsLTAuMDYsLTAuMTIsLTAuMDYsLTAuMjEsLTAuMDYsLTIuMDFdLFsnYycsMC4wMCwtMS4wNSwwLjAwLC0xLjg5LC0wLjAzLC0xLjg5XSxbJ2wnLC0wLjcyLDAuNDhdLFsnYycsLTAuNjksMC40OCwtMC42OSwwLjQ4LC0wLjg3LDAuNDhdLFsnYycsLTAuMTUsMC4wMCwtMC4xOCwwLjAwLC0wLjI3LC0wLjA2XSxbJ2MnLC0wLjIxLC0wLjE1LC0wLjIxLC0wLjE4LC0wLjIxLC0xLjQxXSxbJ2MnLDAuMDAsLTEuMTEsMC4wMywtMS4xNCwwLjA5LC0xLjIzXSxbJ2MnLDAuMDMsLTAuMDMsMC40OCwtMC4zOSwxLjAyLC0wLjc1XSxbJ2wnLDAuOTksLTAuNjZdLFsnbCcsMC4wMCwtMi4zN10sWydjJywwLjAwLC0xLjMyLDAuMDAsLTIuMzcsLTAuMDMsLTIuMzddLFsnbCcsLTAuNzIsMC40OF0sWydjJywtMC42OSwwLjQ4LC0wLjY5LDAuNDgsLTAuODcsMC40OF0sWydjJywtMC4xNSwwLjAwLC0wLjE4LDAuMDAsLTAuMjcsLTAuMDZdLFsnYycsLTAuMjEsLTAuMTUsLTAuMjEsLTAuMTgsLTAuMjEsLTEuNDFdLFsnYycsMC4wMCwtMS4xMSwwLjAzLC0xLjE0LDAuMDksLTEuMjNdLFsnYycsMC4wMywtMC4wMywwLjQ4LC0wLjM5LDEuMDIsLTAuNzVdLFsnbCcsMC45OSwtMC42Nl0sWydsJywwLjAwLC0yLjI1XSxbJ2MnLDAuMDAsLTIuMTMsMC4wMCwtMi4yOCwwLjA2LC0yLjQwXSxbJ2MnLDAuMDYsLTAuMTIsMC4xMiwtMC4xOCwwLjI3LC0wLjI0XSxbJ3onXV0sdzo1LjI1LGg6MjAuMTc0fSxcblx0XHQnYWNjaWRlbnRhbHMubmF0Jzp7ZDpbWydNJywwLjIxLC0xMS40MF0sWydjJywwLjI0LC0wLjA2LDAuNzgsMC4wMCwwLjk5LDAuMTVdLFsnYycsMC4wMywwLjAzLDAuMDMsMC40OCwwLjAwLDIuNjFdLFsnYycsLTAuMDMsMS40NCwtMC4wMywyLjYxLC0wLjAzLDIuNjFdLFsnYycsMC4wMCwwLjAzLDAuNzUsLTAuMDksMS42OCwtMC4yNF0sWydjJywwLjk2LC0wLjE4LDEuNzEsLTAuMjcsMS43NCwtMC4yN10sWydjJywwLjE1LDAuMDMsMC4yNywwLjE1LDAuMzYsMC4zMF0sWydsJywwLjA2LDAuMTJdLFsnbCcsMC4wOSw4LjY3XSxbJ2MnLDAuMDksNi45NiwwLjEyLDguNjcsMC4wOSw4LjY3XSxbJ2MnLC0wLjAzLDAuMDMsLTAuMTIsMC4wNiwtMC4yMSwwLjA5XSxbJ2MnLC0wLjI0LDAuMDksLTAuNzIsMC4wOSwtMC45NiwwLjAwXSxbJ2MnLC0wLjA5LC0wLjAzLC0wLjE4LC0wLjA2LC0wLjIxLC0wLjA5XSxbJ2MnLC0wLjAzLC0wLjAzLC0wLjAzLC0wLjQ4LDAuMDAsLTIuNjFdLFsnYycsMC4wMywtMS40NCwwLjAzLC0yLjYxLDAuMDMsLTIuNjFdLFsnYycsMC4wMCwtMC4wMywtMC43NSwwLjA5LC0xLjY4LDAuMjRdLFsnYycsLTAuOTYsMC4xOCwtMS43MSwwLjI3LC0xLjc0LDAuMjddLFsnYycsLTAuMTUsLTAuMDMsLTAuMjcsLTAuMTUsLTAuMzYsLTAuMzBdLFsnbCcsLTAuMDYsLTAuMTVdLFsnbCcsLTAuMDksLTcuNTNdLFsnYycsLTAuMDYsLTQuMTQsLTAuMDksLTguMDQsLTAuMTIsLTguNjddLFsnbCcsMC4wMCwtMS4xMV0sWydsJywwLjE1LC0wLjA2XSxbJ2MnLDAuMDksLTAuMDMsMC4yMSwtMC4wNiwwLjI3LC0wLjA5XSxbJ3onXSxbJ20nLDMuNzUsOC40MF0sWydjJywwLjAwLC0wLjMzLDAuMDAsLTAuNDIsLTAuMDMsLTAuNDJdLFsnYycsLTAuMTIsMC4wMCwtMi43OSwwLjQ1LC0yLjc5LDAuNDhdLFsnYycsLTAuMDMsMC4wMCwtMC4wOSw2LjMwLC0wLjA5LDYuMzNdLFsnYycsMC4wMywwLjAwLDIuNzksLTAuNDUsMi44MiwtMC40OF0sWydjJywwLjAwLDAuMDAsMC4wOSwtNC41MywwLjA5LC01LjkxXSxbJ3onXV0sdzo1LjQsaDoyMi44fSxcblx0XHQnYWNjaWRlbnRhbHMuZmxhdCc6e2Q6W1snTScsLTAuMzYsLTE0LjA3XSxbJ2MnLDAuMzMsLTAuMDYsMC44NywwLjAwLDEuMDgsMC4xNV0sWydjJywwLjA2LDAuMDMsMC4wNiwwLjM2LC0wLjAzLDUuMjVdLFsnYycsLTAuMDYsMi44NSwtMC4wOSw1LjE5LC0wLjA5LDUuMTldLFsnYycsMC4wMCwwLjAzLDAuMTIsLTAuMDMsMC4yNCwtMC4xMl0sWydjJywwLjYzLC0wLjQyLDEuNDEsLTAuNjYsMi4xOSwtMC43Ml0sWydjJywwLjgxLC0wLjAzLDEuNDcsMC4yMSwyLjA0LDAuNzhdLFsnYycsMC41NywwLjU0LDAuODcsMS4yNiwwLjkzLDIuMDRdLFsnYycsMC4wMywwLjU3LC0wLjA5LDEuMDgsLTAuMzYsMS42Ml0sWydjJywtMC40MiwwLjgxLC0xLjAyLDEuMzgsLTIuODIsMi42MV0sWydjJywtMS4xNCwwLjc4LC0xLjQ0LDEuMDIsLTEuODAsMS40NF0sWydjJywtMC4xOCwwLjE4LC0wLjM5LDAuMzksLTAuNDUsMC40Ml0sWydjJywtMC4yNywwLjE4LC0wLjU3LDAuMTUsLTAuODEsLTAuMDZdLFsnYycsLTAuMDYsLTAuMDksLTAuMTIsLTAuMTgsLTAuMTUsLTAuMjddLFsnYycsLTAuMDMsLTAuMDYsLTAuMDksLTMuMjcsLTAuMTgsLTguMzRdLFsnYycsLTAuMDksLTQuNTMsLTAuMTUsLTguNTgsLTAuMTgsLTkuMDNdLFsnbCcsMC4wMCwtMC43OF0sWydsJywwLjEyLC0wLjA2XSxbJ2MnLDAuMDYsLTAuMDMsMC4xOCwtMC4wOSwwLjI3LC0wLjEyXSxbJ3onXSxbJ20nLDMuMTgsMTEuMDFdLFsnYycsLTAuMjEsLTAuMTIsLTAuNTQsLTAuMTUsLTAuODEsLTAuMDZdLFsnYycsLTAuNTQsMC4xNSwtMC45OSwwLjYzLC0xLjE3LDEuMjZdLFsnYycsLTAuMDYsMC4zMCwtMC4xMiwyLjg4LC0wLjA2LDMuODddLFsnYycsMC4wMywwLjQyLDAuMDMsMC44MSwwLjA2LDAuOTBdLFsnbCcsMC4wMywwLjEyXSxbJ2wnLDAuNDUsLTAuMzldLFsnYycsMC42MywtMC41NCwxLjI2LC0xLjE3LDEuNTYsLTEuNTldLFsnYycsMC4zMCwtMC40MiwwLjYwLC0wLjk5LDAuNzIsLTEuNDFdLFsnYycsMC4xOCwtMC42OSwwLjA5LC0xLjQ3LC0wLjE4LC0yLjA3XSxbJ2MnLC0wLjE1LC0wLjMwLC0wLjMzLC0wLjUxLC0wLjYwLC0wLjYzXSxbJ3onXV0sdzo2Ljc1LGg6MTguODAxfSxcblx0XHQnYWNjaWRlbnRhbHMuaGFsZmZsYXQnOntkOltbJ00nLDQuODMsLTE0LjA3XSxbJ2MnLDAuMzMsLTAuMDYsMC44NywwLjAwLDEuMDgsMC4xNV0sWydjJywwLjA2LDAuMDMsMC4wNiwwLjYwLC0wLjEyLDkuMDZdLFsnYycsLTAuMDksNS41NSwtMC4xNSw5LjA2LC0wLjE4LDkuMTJdLFsnYycsLTAuMDMsMC4wOSwtMC4wOSwwLjE4LC0wLjE1LDAuMjddLFsnYycsLTAuMjQsMC4yMSwtMC41NCwwLjI0LC0wLjgxLDAuMDZdLFsnYycsLTAuMDYsLTAuMDMsLTAuMjcsLTAuMjQsLTAuNDUsLTAuNDJdLFsnYycsLTAuMzYsLTAuNDIsLTAuNjYsLTAuNjYsLTEuODAsLTEuNDRdLFsnYycsLTEuMjMsLTAuODQsLTEuODMsLTEuMzIsLTIuMjUsLTEuNzddLFsnYycsLTAuNjYsLTAuNzgsLTAuOTYsLTEuNTYsLTAuOTMsLTIuNDZdLFsnYycsMC4wOSwtMS40MSwxLjExLC0yLjU4LDIuNDAsLTIuNzldLFsnYycsMC4zMCwtMC4wNiwwLjg0LC0wLjAzLDEuMjMsMC4wNl0sWydjJywwLjU0LDAuMTIsMS4wOCwwLjMzLDEuNTMsMC42M10sWydjJywwLjEyLDAuMDksMC4yNCwwLjE1LDAuMjQsMC4xMl0sWydjJywwLjAwLDAuMDAsLTAuMTIsLTguMzcsLTAuMTgsLTkuNzVdLFsnbCcsMC4wMCwtMC42Nl0sWydsJywwLjEyLC0wLjA2XSxbJ2MnLDAuMDYsLTAuMDMsMC4xOCwtMC4wOSwwLjI3LC0wLjEyXSxbJ3onXSxbJ20nLC0xLjY1LDEwLjk1XSxbJ2MnLC0wLjYwLC0wLjE4LC0xLjA4LDAuMDksLTEuMzgsMC42OV0sWydjJywtMC4yNywwLjYwLC0wLjM2LDEuMzgsLTAuMTgsMi4wN10sWydjJywwLjEyLDAuNDIsMC40MiwwLjk5LDAuNzIsMS40MV0sWydjJywwLjMwLDAuNDIsMC45MywxLjA1LDEuNTYsMS41OV0sWydsJywwLjQ4LDAuMzldLFsnbCcsMC4wMCwtMC4xMl0sWydjJywwLjAzLC0wLjA5LDAuMDMsLTAuNDgsMC4wNiwtMC45MF0sWydjJywwLjAzLC0wLjU3LDAuMDMsLTEuMDgsMC4wMCwtMi4yMl0sWydjJywtMC4wMywtMS42MiwtMC4wMywtMS42MiwtMC4yNCwtMi4wN10sWydjJywtMC4yMSwtMC40MiwtMC42MCwtMC43NSwtMS4wMiwtMC44NF0sWyd6J11dLHc6Ni43MjgsaDoxOC44MDF9LFxuXHRcdCdhY2NpZGVudGFscy5kYmxmbGF0Jzp7ZDpbWydNJywtMC4zNiwtMTQuMDddLFsnYycsMC4zMywtMC4wNiwwLjg3LDAuMDAsMS4wOCwwLjE1XSxbJ2MnLDAuMDYsMC4wMywwLjA2LDAuMzMsLTAuMDMsNC44OV0sWydjJywtMC4wNiwyLjY3LC0wLjA5LDUuMDEsLTAuMDksNS4yMl0sWydsJywwLjAwLDAuMzZdLFsnbCcsMC4xNSwtMC4xNV0sWydjJywwLjM2LC0wLjMwLDAuNzUsLTAuNTEsMS4yMCwtMC42M10sWydjJywwLjMzLC0wLjA5LDAuOTYsLTAuMDksMS4yNiwtMC4wM10sWydjJywwLjI3LDAuMDksMC42MywwLjI3LDAuODcsMC40NV0sWydsJywwLjIxLDAuMTVdLFsnbCcsMC4wMCwtMC4yN10sWydjJywwLjAwLC0wLjE1LC0wLjAzLC0yLjQzLC0wLjA5LC01LjEwXSxbJ2MnLC0wLjA5LC00LjU2LC0wLjA5LC00Ljg2LC0wLjAzLC00Ljg5XSxbJ2MnLDAuMTUsLTAuMTIsMC4zOSwtMC4xNSwwLjcyLC0wLjE1XSxbJ2MnLDAuMzAsMC4wMCwwLjU0LDAuMDMsMC42OSwwLjE1XSxbJ2MnLDAuMDYsMC4wMywwLjA2LDAuMzMsLTAuMDMsNC45NV0sWydjJywtMC4wNiwyLjcwLC0wLjA5LDUuMDQsLTAuMDksNS4yMl0sWydsJywwLjAzLDAuMzBdLFsnbCcsMC4yMSwtMC4xNV0sWydjJywwLjY5LC0wLjQ4LDEuNDQsLTAuNjksMi4yOCwtMC42OV0sWydjJywwLjUxLDAuMDAsMC43OCwwLjAzLDEuMjAsMC4yMV0sWydjJywxLjMyLDAuNjMsMi4wMSwyLjI4LDEuNTMsMy42OV0sWydjJywtMC4yMSwwLjU3LC0wLjUxLDEuMDIsLTEuMDUsMS41Nl0sWydjJywtMC40MiwwLjQyLC0wLjgxLDAuNzIsLTEuOTIsMS41MF0sWydjJywtMS4yNiwwLjg3LC0xLjUwLDEuMDgsLTEuODYsMS41MF0sWydjJywtMC4zOSwwLjQ1LC0wLjU0LDAuNTQsLTAuODEsMC41MV0sWydjJywtMC4xOCwwLjAwLC0wLjIxLDAuMDAsLTAuMzMsLTAuMDZdLFsnbCcsLTAuMjEsLTAuMjFdLFsnbCcsLTAuMDYsLTAuMTJdLFsnbCcsLTAuMDMsLTAuOTldLFsnYycsLTAuMDMsLTAuNTQsLTAuMDMsLTEuMjksLTAuMDYsLTEuNjhdLFsnbCcsMC4wMCwtMC42OV0sWydsJywtMC4yMSwwLjI0XSxbJ2MnLC0wLjM2LDAuNDIsLTAuNzUsMC43NSwtMS44MCwxLjYyXSxbJ2MnLC0xLjAyLDAuODQsLTEuMjAsMC45OSwtMS40NCwxLjM4XSxbJ2MnLC0wLjM2LDAuNTEsLTAuNTQsMC42MCwtMC45MCwwLjUxXSxbJ2MnLC0wLjE1LC0wLjAzLC0wLjM5LC0wLjI3LC0wLjQyLC0wLjQyXSxbJ2MnLC0wLjAzLC0wLjA2LC0wLjA5LC0zLjI3LC0wLjE4LC04LjM0XSxbJ2MnLC0wLjA5LC00LjUzLC0wLjE1LC04LjU4LC0wLjE4LC05LjAzXSxbJ2wnLDAuMDAsLTAuNzhdLFsnbCcsMC4xMiwtMC4wNl0sWydjJywwLjA2LC0wLjAzLDAuMTgsLTAuMDksMC4yNywtMC4xMl0sWyd6J10sWydtJywyLjUyLDEwLjk4XSxbJ2MnLC0wLjE4LC0wLjA5LC0wLjQ4LC0wLjEyLC0wLjY2LC0wLjA2XSxbJ2MnLC0wLjM5LDAuMTUsLTAuNjksMC41NCwtMC44NCwxLjE0XSxbJ2MnLC0wLjA2LDAuMjQsLTAuMDYsMC4zOSwtMC4wOSwxLjc0XSxbJ2MnLC0wLjAzLDEuNDQsMC4wMCwyLjczLDAuMDYsMy4xOF0sWydsJywwLjAzLDAuMTVdLFsnbCcsMC4yNywtMC4yN10sWydjJywwLjkzLC0wLjk2LDEuNTAsLTEuOTUsMS43NCwtMy4wNl0sWydjJywwLjA2LC0wLjI3LDAuMDYsLTAuMzksMC4wNiwtMC45Nl0sWydjJywwLjAwLC0wLjU0LDAuMDAsLTAuNjksLTAuMDYsLTAuOTNdLFsnYycsLTAuMDksLTAuNTEsLTAuMjcsLTAuODEsLTAuNTEsLTAuOTNdLFsneiddLFsnbScsNS40MywwLjAwXSxbJ2MnLC0wLjE4LC0wLjA5LC0wLjUxLC0wLjEyLC0wLjcyLC0wLjA2XSxbJ2MnLC0wLjU0LDAuMTIsLTAuOTYsMC42MywtMS4xNywxLjI2XSxbJ2MnLC0wLjA2LDAuMzAsLTAuMTIsMi44OCwtMC4wNiwzLjkwXSxbJ2MnLDAuMDMsMC40MiwwLjAzLDAuODEsMC4wNiwwLjkwXSxbJ2wnLDAuMDMsMC4xMl0sWydsJywwLjM2LC0wLjMwXSxbJ2MnLDAuNDIsLTAuMzYsMS4wMiwtMC45NiwxLjI5LC0xLjI5XSxbJ2MnLDAuMzYsLTAuNDUsMC42NiwtMC45OSwwLjgxLC0xLjQxXSxbJ2MnLDAuNDIsLTEuMjMsMC4xNSwtMi43NiwtMC42MCwtMy4xMl0sWyd6J11dLHc6MTEuNjEzLGg6MTguODA0fSxcblx0XHQnYWNjaWRlbnRhbHMuZGJsc2hhcnAnOntkOltbJ00nLC0wLjE4LC0zLjk2XSxbJ2MnLDAuMDYsLTAuMDMsMC4xMiwtMC4wNiwwLjE1LC0wLjA2XSxbJ2MnLDAuMDksMC4wMCwyLjc2LDAuMjcsMi43OSwwLjMwXSxbJ2MnLDAuMTIsMC4wMywwLjE1LDAuMTIsMC4xNSwwLjUxXSxbJ2MnLDAuMDYsMC45NiwwLjI0LDEuNTksMC41NywyLjEwXSxbJ2MnLDAuMDYsMC4wOSwwLjE1LDAuMjEsMC4xOCwwLjI0XSxbJ2wnLDAuMDksMC4wNl0sWydsJywwLjA5LC0wLjA2XSxbJ2MnLDAuMDMsLTAuMDMsMC4xMiwtMC4xNSwwLjE4LC0wLjI0XSxbJ2MnLDAuMzMsLTAuNTEsMC41MSwtMS4xNCwwLjU3LC0yLjEwXSxbJ2MnLDAuMDAsLTAuMzksMC4wMywtMC40NSwwLjEyLC0wLjUxXSxbJ2MnLDAuMDMsMC4wMCwwLjY2LC0wLjA5LDEuNDQsLTAuMTVdLFsnYycsMS40NywtMC4xNSwxLjUwLC0wLjE1LDEuNTYsLTAuMDNdLFsnYycsMC4wMywwLjA2LDAuMDAsMC40MiwtMC4wOSwxLjQ0XSxbJ2MnLC0wLjA5LDAuNzIsLTAuMTUsMS4zNSwtMC4xNSwxLjM4XSxbJ2MnLDAuMDAsMC4wMywtMC4wMywwLjA5LC0wLjA2LDAuMTJdLFsnYycsLTAuMDYsMC4wNiwtMC4xMiwwLjA5LC0wLjUxLDAuMDldLFsnYycsLTEuMDgsMC4wNiwtMS44MCwwLjMwLC0yLjI4LDAuNzVdLFsnbCcsLTAuMTIsMC4wOV0sWydsJywwLjA5LDAuMDldLFsnYycsMC4xMiwwLjE1LDAuMzksMC4zMywwLjYzLDAuNDVdLFsnYycsMC40MiwwLjE4LDAuOTYsMC4yNywxLjY4LDAuMzNdLFsnYycsMC4zOSwwLjAwLDAuNDUsMC4wMywwLjUxLDAuMDldLFsnYycsMC4wMywwLjAzLDAuMDYsMC4wOSwwLjA2LDAuMTJdLFsnYycsMC4wMCwwLjAzLDAuMDYsMC42NiwwLjE1LDEuMzhdLFsnYycsMC4wOSwxLjAyLDAuMTIsMS4zOCwwLjA5LDEuNDRdLFsnYycsLTAuMDYsMC4xMiwtMC4wOSwwLjEyLC0xLjU2LC0wLjAzXSxbJ2MnLC0wLjc4LC0wLjA2LC0xLjQxLC0wLjE1LC0xLjQ0LC0wLjE1XSxbJ2MnLC0wLjA5LC0wLjA2LC0wLjEyLC0wLjEyLC0wLjEyLC0wLjU0XSxbJ2MnLC0wLjA2LC0wLjkzLC0wLjI0LC0xLjU2LC0wLjU3LC0yLjA3XSxbJ2MnLC0wLjA2LC0wLjA5LC0wLjE1LC0wLjIxLC0wLjE4LC0wLjI0XSxbJ2wnLC0wLjA5LC0wLjA2XSxbJ2wnLC0wLjA5LDAuMDZdLFsnYycsLTAuMDMsMC4wMywtMC4xMiwwLjE1LC0wLjE4LDAuMjRdLFsnYycsLTAuMzMsMC41MSwtMC41MSwxLjE0LC0wLjU3LDIuMDddLFsnYycsMC4wMCwwLjQyLC0wLjAzLDAuNDgsLTAuMTIsMC41NF0sWydjJywtMC4wMywwLjAwLC0wLjY2LDAuMDksLTEuNDQsMC4xNV0sWydjJywtMS40NywwLjE1LC0xLjUwLDAuMTUsLTEuNTYsMC4wM10sWydjJywtMC4wMywtMC4wNiwwLjAwLC0wLjQyLDAuMDksLTEuNDRdLFsnYycsMC4wOSwtMC43MiwwLjE1LC0xLjM1LDAuMTUsLTEuMzhdLFsnYycsMC4wMCwtMC4wMywwLjAzLC0wLjA5LDAuMDYsLTAuMTJdLFsnYycsMC4wNiwtMC4wNiwwLjEyLC0wLjA5LDAuNTEsLTAuMDldLFsnYycsMC43MiwtMC4wNiwxLjI2LC0wLjE1LDEuNjgsLTAuMzNdLFsnYycsMC4yNCwtMC4xMiwwLjUxLC0wLjMwLDAuNjMsLTAuNDVdLFsnbCcsMC4wOSwtMC4wOV0sWydsJywtMC4xMiwtMC4wOV0sWydjJywtMC40OCwtMC40NSwtMS4yMCwtMC42OSwtMi4yOCwtMC43NV0sWydjJywtMC4zOSwwLjAwLC0wLjQ1LC0wLjAzLC0wLjUxLC0wLjA5XSxbJ2MnLC0wLjAzLC0wLjAzLC0wLjA2LC0wLjA5LC0wLjA2LC0wLjEyXSxbJ2MnLDAuMDAsLTAuMDMsLTAuMDYsLTAuNjMsLTAuMTIsLTEuMzhdLFsnYycsLTAuMDksLTAuNzIsLTAuMTUsLTEuMzUsLTAuMTUsLTEuMzhdLFsneiddXSx3OjcuOTUsaDo3Ljk3N30sXG5cdFx0J2RvdHMuZG90Jzp7ZDpbWydNJywxLjMyLC0xLjY4XSxbJ2MnLDAuMDksLTAuMDMsMC4yNywtMC4wNiwwLjM5LC0wLjA2XSxbJ2MnLDAuOTYsMC4wMCwxLjc0LDAuNzgsMS43NCwxLjcxXSxbJ2MnLDAuMDAsMC45NiwtMC43OCwxLjc0LC0xLjcxLDEuNzRdLFsnYycsLTAuOTYsMC4wMCwtMS43NCwtMC43OCwtMS43NCwtMS43MV0sWydjJywwLjAwLC0wLjc4LDAuNTQsLTEuNTAsMS4zMiwtMS42OF0sWyd6J11dLHc6My40NSxoOjMuNDV9LFxuXHRcdCdub3RlaGVhZHMuZGJsJzp7ZDpbWydNJywtMC42OSwtNC4wMl0sWydjJywwLjE4LC0wLjA5LDAuMzYsLTAuMDksMC41NCwwLjAwXSxbJ2MnLDAuMTgsMC4wOSwwLjI0LDAuMTUsMC4zMywwLjMwXSxbJ2MnLDAuMDYsMC4xNSwwLjA2LDAuMTgsMC4wNiwxLjQxXSxbJ2wnLDAuMDAsMS4yM10sWydsJywwLjEyLC0wLjE4XSxbJ2MnLDAuNzIsLTEuMjYsMi42NCwtMi4zMSw0Ljg2LC0yLjY0XSxbJ2MnLDAuODEsLTAuMTUsMS4xMSwtMC4xNSwyLjEzLC0wLjE1XSxbJ2MnLDAuOTksMC4wMCwxLjI5LDAuMDAsMi4xMCwwLjE1XSxbJ2MnLDAuNzUsMC4xMiwxLjM4LDAuMjcsMi4wNCwwLjU0XSxbJ2MnLDEuMzUsMC41MSwyLjM0LDEuMjYsMi44MiwyLjEwXSxbJ2wnLDAuMTIsMC4xOF0sWydsJywwLjAwLC0xLjIzXSxbJ2MnLDAuMDAsLTEuMjAsMC4wMCwtMS4yNiwwLjA2LC0xLjM4XSxbJ2MnLDAuMDksLTAuMTgsMC4xNSwtMC4yNCwwLjMzLC0wLjMzXSxbJ2MnLDAuMTgsLTAuMDksMC4zNiwtMC4wOSwwLjU0LDAuMDBdLFsnYycsMC4xOCwwLjA5LDAuMjQsMC4xNSwwLjMzLDAuMzBdLFsnbCcsMC4wNiwwLjE1XSxbJ2wnLDAuMDAsMy41NF0sWydsJywwLjAwLDMuNTRdLFsnbCcsLTAuMDYsMC4xNV0sWydjJywtMC4wOSwwLjE4LC0wLjE1LDAuMjQsLTAuMzMsMC4zM10sWydjJywtMC4xOCwwLjA5LC0wLjM2LDAuMDksLTAuNTQsMC4wMF0sWydjJywtMC4xOCwtMC4wOSwtMC4yNCwtMC4xNSwtMC4zMywtMC4zM10sWydjJywtMC4wNiwtMC4xMiwtMC4wNiwtMC4xOCwtMC4wNiwtMS4zOF0sWydsJywwLjAwLC0xLjIzXSxbJ2wnLC0wLjEyLDAuMThdLFsnYycsLTAuNDgsMC44NCwtMS40NywxLjU5LC0yLjgyLDIuMTBdLFsnYycsLTAuODQsMC4zMywtMS43MSwwLjU0LC0yLjg1LDAuNjZdLFsnYycsLTAuNDUsMC4wNiwtMi4xNiwwLjA2LC0yLjYxLDAuMDBdLFsnYycsLTEuMTQsLTAuMTIsLTIuMDEsLTAuMzMsLTIuODUsLTAuNjZdLFsnYycsLTEuMzUsLTAuNTEsLTIuMzQsLTEuMjYsLTIuODIsLTIuMTBdLFsnbCcsLTAuMTIsLTAuMThdLFsnbCcsMC4wMCwxLjIzXSxbJ2MnLDAuMDAsMS4yMywwLjAwLDEuMjYsLTAuMDYsMS4zOF0sWydjJywtMC4wOSwwLjE4LC0wLjE1LDAuMjQsLTAuMzMsMC4zM10sWydjJywtMC4xOCwwLjA5LC0wLjM2LDAuMDksLTAuNTQsMC4wMF0sWydjJywtMC4xOCwtMC4wOSwtMC4yNCwtMC4xNSwtMC4zMywtMC4zM10sWydsJywtMC4wNiwtMC4xNV0sWydsJywwLjAwLC0zLjU0XSxbJ2MnLDAuMDAsLTMuNDgsMC4wMCwtMy41NCwwLjA2LC0zLjY2XSxbJ2MnLDAuMDksLTAuMTgsMC4xNSwtMC4yNCwwLjMzLC0wLjMzXSxbJ3onXSxbJ20nLDcuNzEsMC42M10sWydjJywtMC4zNiwtMC4wNiwtMC45MCwtMC4wNiwtMS4xNCwwLjAwXSxbJ2MnLC0wLjMwLDAuMDMsLTAuNjYsMC4yNCwtMC44NywwLjQyXSxbJ2MnLC0wLjYwLDAuNTQsLTAuOTAsMS42MiwtMC43NSwyLjgyXSxbJ2MnLDAuMTIsMC45MywwLjUxLDEuNjgsMS4xMSwyLjMxXSxbJ2MnLDAuNzUsMC43MiwxLjgzLDEuMjAsMi44NSwxLjI2XSxbJ2MnLDEuMDUsMC4wNiwxLjgzLC0wLjU0LDIuMTAsLTEuNjVdLFsnYycsMC4yMSwtMC45MCwwLjEyLC0xLjk1LC0wLjI0LC0yLjgyXSxbJ2MnLC0wLjM2LC0wLjgxLC0xLjA4LC0xLjUzLC0xLjk1LC0xLjk1XSxbJ2MnLC0wLjMwLC0wLjE1LC0wLjc4LC0wLjMwLC0xLjExLC0wLjM5XSxbJ3onXV0sdzoxNi44MyxoOjguMTQ1fSxcblx0XHQnbm90ZWhlYWRzLndob2xlJzp7ZDpbWydNJyw2LjUxLC00LjA1XSxbJ2MnLDAuNTEsLTAuMDMsMi4wMSwwLjAwLDIuNTIsMC4wM10sWydjJywxLjQxLDAuMTgsMi42NCwwLjUxLDMuNzIsMS4wOF0sWydjJywxLjIwLDAuNjMsMS45NSwxLjQxLDIuMTksMi4zMV0sWydjJywwLjA5LDAuMzMsMC4wOSwwLjkwLDAuMDAsMS4yM10sWydjJywtMC4yNCwwLjkwLC0wLjk5LDEuNjgsLTIuMTksMi4zMV0sWydjJywtMS4wOCwwLjU3LC0yLjI4LDAuOTAsLTMuNzUsMS4wOF0sWydjJywtMC42NiwwLjA2LC0yLjMxLDAuMDYsLTIuOTcsMC4wMF0sWydjJywtMS40NywtMC4xOCwtMi42NywtMC41MSwtMy43NSwtMS4wOF0sWydjJywtMS4yMCwtMC42MywtMS45NSwtMS40MSwtMi4xOSwtMi4zMV0sWydjJywtMC4wOSwtMC4zMywtMC4wOSwtMC45MCwwLjAwLC0xLjIzXSxbJ2MnLDAuMjQsLTAuOTAsMC45OSwtMS42OCwyLjE5LC0yLjMxXSxbJ2MnLDEuMjAsLTAuNjMsMi42MSwtMC45OSw0LjIzLC0xLjExXSxbJ3onXSxbJ20nLDAuNTcsMC42Nl0sWydjJywtMC44NywtMC4xNSwtMS41MywwLjAwLC0yLjA0LDAuNTFdLFsnYycsLTAuMTUsMC4xNSwtMC4yNCwwLjI3LC0wLjMzLDAuNDhdLFsnYycsLTAuMjQsMC41MSwtMC4zNiwxLjA4LC0wLjMzLDEuNzddLFsnYycsMC4wMywwLjY5LDAuMTgsMS4yNiwwLjQyLDEuNzddLFsnYycsMC42MCwxLjE3LDEuNzQsMS45OCwzLjE4LDIuMjJdLFsnYycsMS4xMSwwLjIxLDEuOTUsLTAuMTUsMi4zNCwtMC45OV0sWydjJywwLjI0LC0wLjUxLDAuMzYsLTEuMDgsMC4zMywtMS44MF0sWydjJywtMC4wNiwtMS4xMSwtMC40NSwtMi4wNCwtMS4xNywtMi43Nl0sWydjJywtMC42MywtMC42MywtMS40NywtMS4wNSwtMi40MCwtMS4yMF0sWyd6J11dLHc6MTQuOTg1LGg6OC4wOTd9LFxuXHRcdCdub3RlaGVhZHMuaGFsZic6e2Q6W1snTScsNy40NCwtNC4wNV0sWydjJywwLjA2LC0wLjAzLDAuMjcsLTAuMDMsMC40OCwtMC4wM10sWydjJywxLjA1LDAuMDAsMS43MSwwLjI0LDIuMTAsMC44MV0sWydjJywwLjQyLDAuNjAsMC40NSwxLjM1LDAuMTgsMi40MF0sWydjJywtMC40MiwxLjU5LC0xLjE0LDIuNzMsLTIuMTYsMy4zOV0sWydjJywtMS40MSwwLjkzLC0zLjE4LDEuNDQsLTUuNDAsMS41M10sWydjJywtMS4xNywwLjAzLC0xLjg5LC0wLjIxLC0yLjI4LC0wLjgxXSxbJ2MnLC0wLjQyLC0wLjYwLC0wLjQ1LC0xLjM1LC0wLjE4LC0yLjQwXSxbJ2MnLDAuNDIsLTEuNTksMS4xNCwtMi43MywyLjE2LC0zLjM5XSxbJ2MnLDAuNjMsLTAuNDIsMS4yMywtMC43MiwxLjk4LC0wLjk2XSxbJ2MnLDAuOTAsLTAuMzAsMS42NSwtMC40MiwzLjEyLC0wLjU0XSxbJ3onXSxbJ20nLDEuMjksMC44N10sWydjJywtMC4yNywtMC4wOSwtMC42MywtMC4xMiwtMC45MCwtMC4wM10sWydjJywtMC43MiwwLjI0LC0xLjUzLDAuNjksLTMuMjcsMS44MF0sWydjJywtMi4zNCwxLjUwLC0zLjMwLDIuMjUsLTMuNTcsMi43OV0sWydjJywtMC4zNiwwLjcyLC0wLjA2LDEuNTAsMC42NiwxLjc3XSxbJ2MnLDAuMjQsMC4xMiwwLjY5LDAuMDksMC45OSwwLjAwXSxbJ2MnLDAuODQsLTAuMzAsMS45MiwtMC45Myw0LjE0LC0yLjM3XSxbJ2MnLDEuNjIsLTEuMDgsMi4zNywtMS43MSwyLjYxLC0yLjE5XSxbJ2MnLDAuMzYsLTAuNzIsMC4wNiwtMS41MCwtMC42NiwtMS43N10sWyd6J11dLHc6MTAuMzcsaDo4LjEzMn0sXG5cdFx0J25vdGVoZWFkcy5xdWFydGVyJzp7ZDpbWydNJyw2LjA5LC00LjA1XSxbJ2MnLDAuMzYsLTAuMDMsMS4yMCwwLjAwLDEuNTMsMC4wNl0sWydjJywxLjE3LDAuMjQsMS44OSwwLjg0LDIuMTYsMS44M10sWydjJywwLjA2LDAuMTgsMC4wNiwwLjMwLDAuMDYsMC42Nl0sWydjJywwLjAwLDAuNDUsMC4wMCwwLjYzLC0wLjE1LDEuMDhdLFsnYycsLTAuNjYsMi4wNCwtMy4wNiwzLjkzLC01LjUyLDQuMzhdLFsnYycsLTAuNTQsMC4wOSwtMS40NCwwLjA5LC0xLjgzLDAuMDNdLFsnYycsLTEuMjMsLTAuMjcsLTEuOTgsLTAuODcsLTIuMjUsLTEuODZdLFsnYycsLTAuMDYsLTAuMTgsLTAuMDYsLTAuMzAsLTAuMDYsLTAuNjZdLFsnYycsMC4wMCwtMC40NSwwLjAwLC0wLjYzLDAuMTUsLTEuMDhdLFsnYycsMC4yNCwtMC43OCwwLjc1LC0xLjUzLDEuNDQsLTIuMjJdLFsnYycsMS4yMCwtMS4yMCwyLjg1LC0yLjAxLDQuNDcsLTIuMjJdLFsneiddXSx3OjkuODEsaDo4LjA5NH0sXG5cdFx0J25vdGVoZWFkcy5zbGFzaC5ub3N0ZW0nOntkOltbJ00nLDkuMzAsLTcuNzddLFsnYycsMC4wNiwtMC4wNiwwLjE4LC0wLjA2LDEuNzEsLTAuMDZdLFsnbCcsMS42NSwwLjAwXSxbJ2wnLDAuMDksMC4wOV0sWydjJywwLjA2LDAuMDYsMC4wNiwwLjA5LDAuMDYsMC4xNV0sWydjJywtMC4wMywwLjEyLC05LjIxLDE1LjI0LC05LjMwLDE1LjMzXSxbJ2MnLC0wLjA2LDAuMDYsLTAuMTgsMC4wNiwtMS43MSwwLjA2XSxbJ2wnLC0xLjY1LDAuMDBdLFsnbCcsLTAuMDksLTAuMDldLFsnYycsLTAuMDYsLTAuMDYsLTAuMDYsLTAuMDksLTAuMDYsLTAuMTVdLFsnYycsMC4wMywtMC4xMiw5LjIxLC0xNS4yNCw5LjMwLC0xNS4zM10sWyd6J11dLHc6MTIuODEsaDoxNS42M30sXG5cdFx0J25vdGVoZWFkcy5pbmRldGVybWluYXRlJzp7ZDpbWydNJywwLjc4LC00LjA1XSxbJ2MnLDAuMTIsLTAuMDMsMC4yNCwtMC4wMywwLjM2LDAuMDNdLFsnYycsMC4wMywwLjAzLDAuOTMsMC43MiwxLjk1LDEuNTZdLFsnbCcsMS44NiwxLjUwXSxbJ2wnLDEuODYsLTEuNTBdLFsnYycsMS4wMiwtMC44NCwxLjkyLC0xLjUzLDEuOTUsLTEuNTZdLFsnYycsMC4yMSwtMC4xMiwwLjMzLC0wLjA5LDAuNzUsMC4yNF0sWydjJywwLjMwLDAuMjcsMC4zNiwwLjM2LDAuMzYsMC41NF0sWydjJywwLjAwLDAuMDMsLTAuMDMsMC4xMiwtMC4wNiwwLjE4XSxbJ2MnLC0wLjAzLDAuMDYsLTAuOTAsMC43NSwtMS44OSwxLjU2XSxbJ2wnLC0xLjgwLDEuNDddLFsnYycsMC4wMCwwLjAzLDAuODEsMC42OSwxLjgwLDEuNTBdLFsnYycsMC45OSwwLjgxLDEuODYsMS41MCwxLjg5LDEuNTZdLFsnYycsMC4wMywwLjA2LDAuMDYsMC4xNSwwLjA2LDAuMThdLFsnYycsMC4wMCwwLjE4LC0wLjA2LDAuMjcsLTAuMzYsMC41NF0sWydjJywtMC40MiwwLjMzLC0wLjU0LDAuMzYsLTAuNzUsMC4yNF0sWydjJywtMC4wMywtMC4wMywtMC45MywtMC43MiwtMS45NSwtMS41Nl0sWydsJywtMS44NiwtMS41MF0sWydsJywtMS44NiwxLjUwXSxbJ2MnLC0xLjAyLDAuODQsLTEuOTIsMS41MywtMS45NSwxLjU2XSxbJ2MnLC0wLjIxLDAuMTIsLTAuMzMsMC4wOSwtMC43NSwtMC4yNF0sWydjJywtMC4zMCwtMC4yNywtMC4zNiwtMC4zNiwtMC4zNiwtMC41NF0sWydjJywwLjAwLC0wLjAzLDAuMDMsLTAuMTIsMC4wNiwtMC4xOF0sWydjJywwLjAzLC0wLjA2LDAuOTAsLTAuNzUsMS44OSwtMS41Nl0sWydsJywxLjgwLC0xLjQ3XSxbJ2MnLDAuMDAsLTAuMDMsLTAuODEsLTAuNjksLTEuODAsLTEuNTBdLFsnYycsLTAuOTksLTAuODEsLTEuODYsLTEuNTAsLTEuODksLTEuNTZdLFsnYycsLTAuMDYsLTAuMTIsLTAuMDksLTAuMjEsLTAuMDMsLTAuMzZdLFsnYycsMC4wMywtMC4wOSwwLjU3LC0wLjU3LDAuNzIsLTAuNjNdLFsneiddXSx3OjkuODQzLGg6OC4xMzl9LFxuXHRcdCdzY3JpcHRzLnVmZXJtYXRhJzp7ZDpbWydNJywtMC43NSwtMTAuNzddLFsnYycsMC4xMiwwLjAwLDAuNDUsLTAuMDMsMC42OSwtMC4wM10sWydjJywyLjkxLC0wLjAzLDUuNTUsMS41Myw3LjQxLDQuMzVdLFsnYycsMS4xNywxLjcxLDEuOTUsMy43MiwyLjQzLDYuMDNdLFsnYycsMC4xMiwwLjUxLDAuMTIsMC41NywwLjAzLDAuNjldLFsnYycsLTAuMTIsMC4yMSwtMC40OCwwLjI3LC0wLjY5LDAuMTJdLFsnYycsLTAuMTIsLTAuMDksLTAuMTgsLTAuMjQsLTAuMjcsLTAuNjldLFsnYycsLTAuNzgsLTMuNjMsLTMuNDIsLTYuNTQsLTYuNzgsLTcuMzhdLFsnYycsLTAuNzgsLTAuMjEsLTEuMjAsLTAuMjQsLTIuMDcsLTAuMjRdLFsnYycsLTAuNjMsMC4wMCwtMC44NCwwLjAwLC0xLjIwLDAuMDZdLFsnYycsLTEuODMsMC4yNywtMy40MiwxLjA4LC00LjgwLDIuMzddLFsnYycsLTEuNDEsMS4zNSwtMi40MCwzLjIxLC0yLjg1LDUuMTldLFsnYycsLTAuMDksMC40NSwtMC4xNSwwLjYwLC0wLjI3LDAuNjldLFsnYycsLTAuMjEsMC4xNSwtMC41NywwLjA5LC0wLjY5LC0wLjEyXSxbJ2MnLC0wLjA5LC0wLjEyLC0wLjA5LC0wLjE4LDAuMDMsLTAuNjldLFsnYycsMC4zMywtMS42MiwwLjc4LC0zLjAwLDEuNDcsLTQuMzhdLFsnYycsMS43NywtMy41NCw0LjQ0LC01LjY3LDcuNTYsLTUuOTddLFsneiddLFsnbScsMC4zMyw3LjQ3XSxbJ2MnLDEuMzgsLTAuMzAsMi41OCwwLjkwLDIuMzEsMi4yNV0sWydjJywtMC4xNSwwLjcyLC0wLjc4LDEuMzUsLTEuNDcsMS41MF0sWydjJywtMS4zOCwwLjI3LC0yLjU4LC0wLjkzLC0yLjMxLC0yLjMxXSxbJ2MnLDAuMTUsLTAuNjksMC43OCwtMS4yOSwxLjQ3LC0xLjQ0XSxbJ3onXV0sdzoxOS43NDgsaDoxMS4yODl9LFxuXHRcdCdzY3JpcHRzLmRmZXJtYXRhJzp7ZDpbWydNJywtOS42MywtMC40Ml0sWydjJywwLjE1LC0wLjA5LDAuMzYsLTAuMDYsMC41MSwwLjAzXSxbJ2MnLDAuMTIsMC4wOSwwLjE4LDAuMjQsMC4yNywwLjY2XSxbJ2MnLDAuNzgsMy42NiwzLjQyLDYuNTcsNi43OCw3LjQxXSxbJ2MnLDAuNzgsMC4yMSwxLjIwLDAuMjQsMi4wNywwLjI0XSxbJ2MnLDAuNjMsMC4wMCwwLjg0LDAuMDAsMS4yMCwtMC4wNl0sWydjJywxLjgzLC0wLjI3LDMuNDIsLTEuMDgsNC44MCwtMi4zN10sWydjJywxLjQxLC0xLjM1LDIuNDAsLTMuMjEsMi44NSwtNS4yMl0sWydjJywwLjA5LC0wLjQyLDAuMTUsLTAuNTcsMC4yNywtMC42Nl0sWydjJywwLjIxLC0wLjE1LDAuNTcsLTAuMDksMC42OSwwLjEyXSxbJ2MnLDAuMDksMC4xMiwwLjA5LDAuMTgsLTAuMDMsMC42OV0sWydjJywtMC4zMywxLjYyLC0wLjc4LDMuMDAsLTEuNDcsNC4zOF0sWydjJywtMS45MiwzLjg0LC00Ljg5LDYuMDAsLTguMzEsNi4wMF0sWydjJywtMy40MiwwLjAwLC02LjM5LC0yLjE2LC04LjMxLC02LjAwXSxbJ2MnLC0wLjQ4LC0wLjk2LC0wLjg0LC0xLjkyLC0xLjE0LC0yLjk3XSxbJ2MnLC0wLjE4LC0wLjY5LC0wLjQyLC0xLjc0LC0wLjQyLC0xLjkyXSxbJ2MnLDAuMDAsLTAuMTIsMC4wOSwtMC4yNywwLjI0LC0wLjMzXSxbJ3onXSxbJ20nLDkuMjEsMC4wMF0sWydjJywxLjIwLC0wLjI3LDIuMzQsMC42MywyLjM0LDEuODZdLFsnYycsMC4wMCwwLjkwLC0wLjY2LDEuNjgsLTEuNTAsMS44OV0sWydjJywtMS4zOCwwLjI3LC0yLjU4LC0wLjkzLC0yLjMxLC0yLjMxXSxbJ2MnLDAuMTUsLTAuNjksMC43OCwtMS4yOSwxLjQ3LC0xLjQ0XSxbJ3onXV0sdzoxOS43NDQsaDoxMS4yNzR9LFxuXHRcdCdzY3JpcHRzLnNmb3J6YXRvJzp7ZDpbWydNJywtNi40NSwtMy42OV0sWydjJywwLjA2LC0wLjAzLDAuMTUsLTAuMDYsMC4xOCwtMC4wNl0sWydjJywwLjA2LDAuMDAsMi44NSwwLjcyLDYuMjQsMS41OV0sWydsJyw2LjMzLDEuNjVdLFsnYycsMC4zMywwLjA2LDAuNDUsMC4yMSwwLjQ1LDAuNTFdLFsnYycsMC4wMCwwLjMwLC0wLjEyLDAuNDUsLTAuNDUsMC41MV0sWydsJywtNi4zMywxLjY1XSxbJ2MnLC0zLjM5LDAuODcsLTYuMTgsMS41OSwtNi4yMSwxLjU5XSxbJ2MnLC0wLjIxLDAuMDAsLTAuNDgsLTAuMjQsLTAuNTEsLTAuNDVdLFsnYycsMC4wMCwtMC4xNSwwLjA2LC0wLjM2LDAuMTgsLTAuNDVdLFsnYycsMC4wOSwtMC4wNiwwLjg3LC0wLjI3LDMuODQsLTEuMDVdLFsnYycsMi4wNCwtMC41NCwzLjg0LC0wLjk5LDQuMDIsLTEuMDJdLFsnYycsMC4xNSwtMC4wNiwxLjE0LC0wLjI0LDIuMjIsLTAuNDJdLFsnYycsMS4wNSwtMC4xOCwxLjkyLC0wLjM2LDEuOTIsLTAuMzZdLFsnYycsMC4wMCwwLjAwLC0wLjg3LC0wLjE4LC0xLjkyLC0wLjM2XSxbJ2MnLC0xLjA4LC0wLjE4LC0yLjA3LC0wLjM2LC0yLjIyLC0wLjQyXSxbJ2MnLC0wLjE4LC0wLjAzLC0xLjk4LC0wLjQ4LC00LjAyLC0xLjAyXSxbJ2MnLC0yLjk3LC0wLjc4LC0zLjc1LC0wLjk5LC0zLjg0LC0xLjA1XSxbJ2MnLC0wLjEyLC0wLjA5LC0wLjE4LC0wLjMwLC0wLjE4LC0wLjQ1XSxbJ2MnLDAuMDMsLTAuMTUsMC4xNSwtMC4zMCwwLjMwLC0wLjM5XSxbJ3onXV0sdzoxMy41LGg6Ny41fSxcblx0XHQnc2NyaXB0cy5zdGFjY2F0byc6e2Q6W1snTScsLTAuMzYsLTEuNDddLFsnYycsMC45MywtMC4yMSwxLjg2LDAuNTEsMS44NiwxLjQ3XSxbJ2MnLDAuMDAsMC45MywtMC44NywxLjY1LC0xLjgwLDEuNDddLFsnYycsLTAuNTQsLTAuMTIsLTEuMDIsLTAuNTcsLTEuMTQsLTEuMDhdLFsnYycsLTAuMjEsLTAuODEsMC4yNywtMS42NSwxLjA4LC0xLjg2XSxbJ3onXV0sdzoyLjk4OSxoOjMuMDA0fSxcblx0XHQnc2NyaXB0cy50ZW51dG8nOntkOltbJ00nLC00LjIwLC0wLjQ4XSxbJ2wnLDAuMTIsLTAuMDZdLFsnbCcsNC4wOCwwLjAwXSxbJ2wnLDQuMDgsMC4wMF0sWydsJywwLjEyLDAuMDZdLFsnYycsMC4zOSwwLjIxLDAuMzksMC43NSwwLjAwLDAuOTZdLFsnbCcsLTAuMTIsMC4wNl0sWydsJywtNC4wOCwwLjAwXSxbJ2wnLC00LjA4LDAuMDBdLFsnbCcsLTAuMTIsLTAuMDZdLFsnYycsLTAuMzksLTAuMjEsLTAuMzksLTAuNzUsMC4wMCwtMC45Nl0sWyd6J11dLHc6OC45ODUsaDoxLjA4fSxcblx0XHQnc2NyaXB0cy51bWFyY2F0byc6e2Q6W1snTScsLTAuMTUsLTguMTldLFsnYycsMC4xNSwtMC4xMiwwLjM2LC0wLjAzLDAuNDUsMC4xNV0sWydjJywwLjIxLDAuNDIsMy40NSw3LjY1LDMuNDUsNy43MV0sWydjJywwLjAwLDAuMTIsLTAuMTIsMC4yNywtMC4yMSwwLjMwXSxbJ2MnLC0wLjAzLDAuMDMsLTAuNTEsMC4wMywtMS4xNCwwLjAzXSxbJ2MnLC0xLjA1LDAuMDAsLTEuMDgsMC4wMCwtMS4xNywtMC4wNl0sWydjJywtMC4wOSwtMC4wNiwtMC4yNCwtMC4zNiwtMS4xNywtMi40MF0sWydjJywtMC41NywtMS4yOSwtMS4wNSwtMi4zNCwtMS4wOCwtMi4zNF0sWydjJywwLjAwLC0wLjAzLC0wLjUxLDEuMDIsLTEuMDgsMi4zNF0sWydjJywtMC45MywyLjA3LC0xLjA4LDIuMzQsLTEuMTQsMi40MF0sWydjJywtMC4wNiwwLjAzLC0wLjE1LDAuMDYsLTAuMTgsMC4wNl0sWydjJywtMC4xNSwwLjAwLC0wLjMzLC0wLjE4LC0wLjMzLC0wLjMzXSxbJ2MnLDAuMDAsLTAuMDYsMy4yNCwtNy4zMiwzLjQ1LC03LjcxXSxbJ2MnLDAuMDMsLTAuMDYsMC4wOSwtMC4xNSwwLjE1LC0wLjE1XSxbJ3onXV0sdzo3LjUsaDo4LjI0NX0sXG5cdFx0J3NjcmlwdHMuZG1hcmNhdG8nOntkOltbJ00nLC0zLjU3LDAuMDNdLFsnYycsMC4wMywwLjAwLDAuNTcsLTAuMDMsMS4xNywtMC4wM10sWydjJywxLjA1LDAuMDAsMS4wOCwwLjAwLDEuMTcsMC4wNl0sWydjJywwLjA5LDAuMDYsMC4yNCwwLjM2LDEuMTcsMi40MF0sWydjJywwLjU3LDEuMjksMS4wNSwyLjM0LDEuMDgsMi4zNF0sWydjJywwLjAwLDAuMDMsMC41MSwtMS4wMiwxLjA4LC0yLjM0XSxbJ2MnLDAuOTMsLTIuMDcsMS4wOCwtMi4zNCwxLjE0LC0yLjQwXSxbJ2MnLDAuMDYsLTAuMDMsMC4xNSwtMC4wNiwwLjE4LC0wLjA2XSxbJ2MnLDAuMTUsMC4wMCwwLjMzLDAuMTgsMC4zMywwLjMzXSxbJ2MnLDAuMDAsMC4wOSwtMy40NSw3Ljc0LC0zLjU0LDcuODNdLFsnYycsLTAuMTIsMC4xMiwtMC4zMCwwLjEyLC0wLjQyLDAuMDBdLFsnYycsLTAuMDksLTAuMDksLTMuNTQsLTcuNzQsLTMuNTQsLTcuODNdLFsnYycsMC4wMCwtMC4wOSwwLjEyLC0wLjI3LDAuMTgsLTAuMzBdLFsneiddXSx3OjcuNSxoOjguMjV9LFxuXHRcdCdzY3JpcHRzLnN0b3BwZWQnOntkOltbJ00nLC0wLjI3LC00LjA4XSxbJ2MnLDAuMTgsLTAuMDksMC4zNiwtMC4wOSwwLjU0LDAuMDBdLFsnYycsMC4xOCwwLjA5LDAuMjQsMC4xNSwwLjMzLDAuMzBdLFsnbCcsMC4wNiwwLjE1XSxbJ2wnLDAuMDAsMS41MF0sWydsJywwLjAwLDEuNDddLFsnbCcsMS40NywwLjAwXSxbJ2wnLDEuNTAsMC4wMF0sWydsJywwLjE1LDAuMDZdLFsnYycsMC4xNSwwLjA5LDAuMjEsMC4xNSwwLjMwLDAuMzNdLFsnYycsMC4wOSwwLjE4LDAuMDksMC4zNiwwLjAwLDAuNTRdLFsnYycsLTAuMDksMC4xOCwtMC4xNSwwLjI0LC0wLjMzLDAuMzNdLFsnYycsLTAuMTIsMC4wNiwtMC4xOCwwLjA2LC0xLjYyLDAuMDZdLFsnbCcsLTEuNDcsMC4wMF0sWydsJywwLjAwLDEuNDddLFsnbCcsMC4wMCwxLjQ3XSxbJ2wnLC0wLjA2LDAuMTVdLFsnYycsLTAuMDksMC4xOCwtMC4xNSwwLjI0LC0wLjMzLDAuMzNdLFsnYycsLTAuMTgsMC4wOSwtMC4zNiwwLjA5LC0wLjU0LDAuMDBdLFsnYycsLTAuMTgsLTAuMDksLTAuMjQsLTAuMTUsLTAuMzMsLTAuMzNdLFsnbCcsLTAuMDYsLTAuMTVdLFsnbCcsMC4wMCwtMS40N10sWydsJywwLjAwLC0xLjQ3XSxbJ2wnLC0xLjQ3LDAuMDBdLFsnYycsLTEuNDQsMC4wMCwtMS41MCwwLjAwLC0xLjYyLC0wLjA2XSxbJ2MnLC0wLjE4LC0wLjA5LC0wLjI0LC0wLjE1LC0wLjMzLC0wLjMzXSxbJ2MnLC0wLjA5LC0wLjE4LC0wLjA5LC0wLjM2LDAuMDAsLTAuNTRdLFsnYycsMC4wOSwtMC4xOCwwLjE1LC0wLjI0LDAuMzMsLTAuMzNdLFsnbCcsMC4xNSwtMC4wNl0sWydsJywxLjQ3LDAuMDBdLFsnbCcsMS40NywwLjAwXSxbJ2wnLDAuMDAsLTEuNDddLFsnYycsMC4wMCwtMS40NCwwLjAwLC0xLjUwLDAuMDYsLTEuNjJdLFsnYycsMC4wOSwtMC4xOCwwLjE1LC0wLjI0LDAuMzMsLTAuMzNdLFsneiddXSx3OjguMjk1LGg6OC4yOTV9LFxuXHRcdCdzY3JpcHRzLnVwYm93Jzp7ZDpbWydNJywtNC42NSwtMTUuNTRdLFsnYycsMC4xMiwtMC4wOSwwLjM2LC0wLjA2LDAuNDgsMC4wM10sWydjJywwLjAzLDAuMDMsMC4wOSwwLjA5LDAuMTIsMC4xNV0sWydjJywwLjAzLDAuMDYsMC42NiwyLjEzLDEuNDEsNC42Ml0sWydjJywxLjM1LDQuNDEsMS4zOCw0LjU2LDIuMDEsNi45Nl0sWydsJywwLjYzLDIuNDZdLFsnbCcsMC42MywtMi40Nl0sWydjJywwLjYzLC0yLjQwLDAuNjYsLTIuNTUsMi4wMSwtNi45Nl0sWydjJywwLjc1LC0yLjQ5LDEuMzgsLTQuNTYsMS40MSwtNC42Ml0sWydjJywwLjA2LC0wLjE1LDAuMTgsLTAuMjEsMC4zNiwtMC4yNF0sWydjJywwLjE1LDAuMDAsMC4zMCwwLjA2LDAuMzksMC4xOF0sWydjJywwLjE1LDAuMjEsMC4yNCwtMC4xOCwtMi4xMCw3LjU2XSxbJ2MnLC0xLjIwLDMuOTYsLTIuMjIsNy4zMiwtMi4yNSw3LjQxXSxbJ2MnLDAuMDAsMC4xMiwtMC4wNiwwLjI3LC0wLjA5LDAuMzBdLFsnYycsLTAuMTIsMC4yMSwtMC42MCwwLjIxLC0wLjcyLDAuMDBdLFsnYycsLTAuMDMsLTAuMDMsLTAuMDksLTAuMTgsLTAuMDksLTAuMzBdLFsnYycsLTAuMDMsLTAuMDksLTEuMDUsLTMuNDUsLTIuMjUsLTcuNDFdLFsnYycsLTIuMzQsLTcuNzQsLTIuMjUsLTcuMzUsLTIuMTAsLTcuNTZdLFsnYycsMC4wMywtMC4wMywwLjA5LC0wLjA5LDAuMTUsLTAuMTJdLFsneiddXSx3OjkuNzMsaDoxNS42MDh9LFxuXHRcdCdzY3JpcHRzLmRvd25ib3cnOntkOltbJ00nLC01LjU1LC05LjkzXSxbJ2wnLDAuMDksLTAuMDZdLFsnbCcsNS40NiwwLjAwXSxbJ2wnLDUuNDYsMC4wMF0sWydsJywwLjA5LDAuMDZdLFsnbCcsMC4wNiwwLjA5XSxbJ2wnLDAuMDAsNC43N10sWydjJywwLjAwLDUuMjgsMC4wMCw0Ljg5LC0wLjE4LDUuMDFdLFsnYycsLTAuMTgsMC4xMiwtMC40MiwwLjA2LC0wLjU0LC0wLjEyXSxbJ2MnLC0wLjA2LC0wLjA5LC0wLjA2LC0wLjE4LC0wLjA2LC0yLjk3XSxbJ2wnLDAuMDAsLTIuODVdLFsnbCcsLTQuODMsMC4wMF0sWydsJywtNC44MywwLjAwXSxbJ2wnLDAuMDAsMi44NV0sWydjJywwLjAwLDIuNzksMC4wMCwyLjg4LC0wLjA2LDIuOTddLFsnYycsLTAuMTUsMC4yNCwtMC41MSwwLjI0LC0wLjY2LDAuMDBdLFsnYycsLTAuMDYsLTAuMDksLTAuMDYsLTAuMjEsLTAuMDYsLTQuODldLFsnbCcsMC4wMCwtNC43N10sWyd6J11dLHc6MTEuMjIsaDo5Ljk5Mn0sXG5cdFx0J3NjcmlwdHMudHVybic6e2Q6W1snTScsLTQuNzcsLTMuOTBdLFsnYycsMC4zNiwtMC4wNiwxLjA1LC0wLjA2LDEuNDQsMC4wM10sWydjJywwLjc4LDAuMTUsMS41MCwwLjUxLDIuMzQsMS4xNF0sWydjJywwLjYwLDAuNDUsMS4wNSwwLjg3LDIuMjIsMi4wMV0sWydjJywxLjExLDEuMDgsMS42MiwxLjUwLDIuMjIsMS44Nl0sWydjJywwLjYwLDAuMzYsMS4zMiwwLjU3LDEuOTIsMC41N10sWydjJywwLjkwLDAuMDAsMS43MSwtMC41NywxLjg5LC0xLjM1XSxbJ2MnLDAuMjQsLTAuOTMsLTAuMzksLTEuODksLTEuMzUsLTIuMTBdLFsnbCcsLTAuMTUsLTAuMDZdLFsnbCcsLTAuMDksMC4xNV0sWydjJywtMC4wMywwLjA5LC0wLjE1LDAuMjQsLTAuMjQsMC4zM10sWydjJywtMC43MiwwLjcyLC0yLjA0LDAuNTQsLTIuNDksLTAuMzZdLFsnYycsLTAuNDgsLTAuOTMsMC4wMywtMS44NiwxLjE3LC0yLjE5XSxbJ2MnLDAuMzAsLTAuMDksMS4wMiwtMC4wOSwxLjM1LDAuMDBdLFsnYycsMC45OSwwLjI3LDEuNzQsMC44NywyLjI1LDEuODNdLFsnYycsMC42OSwxLjQxLDAuNjMsMy4wMCwtMC4yMSw0LjI2XSxbJ2MnLC0wLjIxLDAuMzAsLTAuNjksMC44MSwtMC45OSwxLjAyXSxbJ2MnLC0wLjMwLDAuMjEsLTAuODQsMC40NSwtMS4xNywwLjU0XSxbJ2MnLC0xLjIzLDAuMzYsLTIuNDksMC4xNSwtMy43MiwtMC42MF0sWydjJywtMC43NSwtMC40OCwtMS40MSwtMS4wMiwtMi44NSwtMi40Nl0sWydjJywtMS4xMSwtMS4wOCwtMS42MiwtMS41MCwtMi4yMiwtMS44Nl0sWydjJywtMC42MCwtMC4zNiwtMS4zMiwtMC41NywtMS45MiwtMC41N10sWydjJywtMC45MCwwLjAwLC0xLjcxLDAuNTcsLTEuODksMS4zNV0sWydjJywtMC4yNCwwLjkzLDAuMzksMS44OSwxLjM1LDIuMTBdLFsnbCcsMC4xNSwwLjA2XSxbJ2wnLDAuMDksLTAuMTVdLFsnYycsMC4wMywtMC4wOSwwLjE1LC0wLjI0LDAuMjQsLTAuMzNdLFsnYycsMC43MiwtMC43MiwyLjA0LC0wLjU0LDIuNDksMC4zNl0sWydjJywwLjQ4LDAuOTMsLTAuMDMsMS44NiwtMS4xNywyLjE5XSxbJ2MnLC0wLjMwLDAuMDksLTEuMDIsMC4wOSwtMS4zNSwwLjAwXSxbJ2MnLC0wLjk5LC0wLjI3LC0xLjc0LC0wLjg3LC0yLjI1LC0xLjgzXSxbJ2MnLC0wLjY5LC0xLjQxLC0wLjYzLC0zLjAwLDAuMjEsLTQuMjZdLFsnYycsMC4yMSwtMC4zMCwwLjY5LC0wLjgxLDAuOTksLTEuMDJdLFsnYycsMC40OCwtMC4zMywxLjExLC0wLjU3LDEuNzQsLTAuNjZdLFsneiddXSx3OjE2LjM2NixoOjcuODkzfSxcblx0XHQnc2NyaXB0cy50cmlsbCc6e2Q6W1snTScsLTAuNTEsLTE2LjAyXSxbJ2MnLDAuMTIsLTAuMDksMC4yMSwtMC4xOCwwLjIxLC0wLjE4XSxbJ2wnLC0wLjgxLDQuMDJdLFsnbCcsLTAuODEsNC4wMl0sWydjJywwLjAzLDAuMDAsMC41MSwtMC4yNywxLjA4LC0wLjYwXSxbJ2MnLDAuNjAsLTAuMzAsMS4xNCwtMC42MywxLjI2LC0wLjY2XSxbJ2MnLDEuMTQsLTAuNTQsMi4zMSwtMC42MCwzLjA5LC0wLjE4XSxbJ2MnLDAuMjcsMC4xNSwwLjU0LDAuMzYsMC42MCwwLjUxXSxbJ2wnLDAuMDYsMC4xMl0sWydsJywwLjIxLC0wLjIxXSxbJ2MnLDAuOTAsLTAuODEsMi4yMiwtMC45OSwzLjEyLC0wLjQyXSxbJ2MnLDAuNjAsMC40MiwwLjkwLDEuMTQsMC43OCwyLjA3XSxbJ2MnLC0wLjE1LDEuMjksLTEuMDUsMi4zMSwtMS45NSwyLjI1XSxbJ2MnLC0wLjQ4LC0wLjAzLC0wLjc4LC0wLjMwLC0wLjk2LC0wLjgxXSxbJ2MnLC0wLjA5LC0wLjI3LC0wLjA5LC0wLjkwLC0wLjAzLC0xLjIwXSxbJ2MnLDAuMjEsLTAuNzUsMC44MSwtMS4yMywxLjU5LC0xLjMyXSxbJ2wnLDAuMjQsLTAuMDNdLFsnbCcsLTAuMDksLTAuMTJdLFsnYycsLTAuNTEsLTAuNjYsLTEuNjIsLTAuNjMsLTIuMzEsMC4wM10sWydjJywtMC4zOSwwLjQyLC0wLjMwLDAuMDksLTEuMjMsNC43N10sWydsJywtMC44MSw0LjE0XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMTIsLTAuMDMsLTAuMjEsLTAuMDldLFsnYycsLTAuMzMsLTAuMTUsLTAuNTQsLTAuMTgsLTAuOTksLTAuMThdLFsnYycsLTAuNDIsMC4wMCwtMC42NiwwLjAzLC0xLjA1LDAuMThdLFsnYycsLTAuMTIsMC4wNiwtMC4yMSwwLjA5LC0wLjIxLDAuMDldLFsnYycsMC4wMCwtMC4wMywwLjM2LC0xLjg2LDAuODEsLTQuMTFdLFsnYycsMC45MCwtNC40NywwLjg3LC00LjI2LDAuNjksLTQuNTNdLFsnYycsLTAuMjEsLTAuMzYsLTAuNjYsLTAuNTEsLTEuMTcsLTAuMzZdLFsnYycsLTAuMTUsMC4wNiwtMi4yMiwxLjE0LC0yLjU4LDEuMzhdLFsnYycsLTAuMTIsMC4wOSwtMC4xMiwwLjA5LC0wLjIxLDAuNjBdLFsnbCcsLTAuMDksMC41MV0sWydsJywwLjIxLDAuMjRdLFsnYycsMC42MywwLjc1LDEuMDIsMS40NywxLjIwLDIuMTldLFsnYycsMC4wNiwwLjI3LDAuMDYsMC4zNiwwLjA2LDAuODFdLFsnYycsMC4wMCwwLjQyLDAuMDAsMC41NCwtMC4wNiwwLjc4XSxbJ2MnLC0wLjE1LDAuNTQsLTAuMzMsMC45MywtMC42MywxLjM1XSxbJ2MnLC0wLjE4LDAuMjQsLTAuNTcsMC42MywtMC44MSwwLjc4XSxbJ2MnLC0wLjI0LDAuMTUsLTAuNjMsMC4zNiwtMC44NCwwLjQyXSxbJ2MnLC0wLjI3LDAuMDYsLTAuNjYsMC4wNiwtMC44NywwLjAzXSxbJ2MnLC0wLjgxLC0wLjE4LC0xLjMyLC0xLjA1LC0xLjM4LC0yLjQ2XSxbJ2MnLC0wLjAzLC0wLjYwLDAuMDMsLTAuOTksMC4zMywtMi40Nl0sWydjJywwLjIxLC0xLjA4LDAuMjQsLTEuMzIsMC4yMSwtMS4yOV0sWydjJywtMS4yMCwwLjQ4LC0yLjQwLDAuNzUsLTMuMjEsMC43Ml0sWydjJywtMC42OSwtMC4wNiwtMS4xNywtMC4zMCwtMS40MSwtMC43Ml0sWydjJywtMC4zOSwtMC43NSwtMC4xMiwtMS44MCwwLjY2LC0yLjQ2XSxbJ2MnLDAuMjQsLTAuMTgsMC42OSwtMC40MiwxLjAyLC0wLjUxXSxbJ2MnLDAuNjksLTAuMTgsMS41MywtMC4xNSwyLjMxLDAuMDldLFsnYycsMC4zMCwwLjA5LDAuNzUsMC4zMCwwLjk5LDAuNDVdLFsnYycsMC4xMiwwLjA5LDAuMTUsMC4wOSwwLjE1LDAuMDNdLFsnYycsMC4wMywtMC4wMywwLjMzLC0xLjU5LDAuNzIsLTMuNDVdLFsnYycsMC4zNiwtMS44NiwwLjY2LC0zLjQyLDAuNjksLTMuNDVdLFsnYycsMC4wMCwtMC4wMywwLjAzLC0wLjAzLDAuMjEsMC4wM10sWydjJywwLjIxLDAuMDYsMC4yNywwLjA2LDAuNDgsMC4wNl0sWydjJywwLjQyLC0wLjAzLDAuNzgsLTAuMTgsMS4yNiwtMC40OF0sWydjJywwLjE1LC0wLjEyLDAuMzYsLTAuMjcsMC40OCwtMC4zOV0sWyd6J10sWydtJywtNS43Myw3LjY4XSxbJ2MnLC0wLjI3LC0wLjAzLC0wLjk2LC0wLjA2LC0xLjIwLC0wLjAzXSxbJ2MnLC0wLjgxLDAuMTIsLTEuMzUsMC41NywtMS41MCwxLjIwXSxbJ2MnLC0wLjE4LDAuNjYsMC4xMiwxLjE0LDAuNzUsMS4yOV0sWydjJywwLjY2LDAuMTIsMS45MiwtMC4xMiwzLjE4LC0wLjY2XSxbJ2wnLDAuMzMsLTAuMTVdLFsnbCcsMC4wOSwtMC4zOV0sWydjJywwLjA2LC0wLjIxLDAuMDksLTAuNDIsMC4wOSwtMC40NV0sWydjJywwLjAwLC0wLjAzLC0wLjQ1LC0wLjMwLC0wLjc1LC0wLjQ1XSxbJ2MnLC0wLjI3LC0wLjE1LC0wLjY2LC0wLjI3LC0wLjk5LC0wLjM2XSxbJ3onXSxbJ20nLDQuMjksMy42M10sWydjJywtMC4yNCwtMC4zOSwtMC41MSwtMC43NSwtMC41MSwtMC42OV0sWydjJywtMC4wNiwwLjEyLC0wLjM5LDEuOTIsLTAuNDUsMi4yOF0sWydjJywtMC4wOSwwLjU0LC0wLjEyLDEuMTQsLTAuMDYsMS4zOF0sWydjJywwLjA2LDAuNDIsMC4yMSwwLjYwLDAuNTEsMC41N10sWydjJywwLjM5LC0wLjA2LDAuNzUsLTAuNDgsMC45MywtMS4xNF0sWydjJywwLjA5LC0wLjMzLDAuMDksLTEuMDUsMC4wMCwtMS4zOF0sWydjJywtMC4wOSwtMC4zOSwtMC4yNCwtMC42OSwtMC40MiwtMS4wMl0sWyd6J11dLHc6MTcuOTYzLGg6MTYuNDl9LFxuXHRcdCdzY3JpcHRzLnNlZ25vJzp7ZDpbWydNJywtMy43MiwtMTEuMjJdLFsnYycsMC43OCwtMC4wOSwxLjU5LDAuMDMsMi4zMSwwLjQyXSxbJ2MnLDEuMjAsMC42MCwyLjAxLDEuNzEsMi4zMSwzLjA5XSxbJ2MnLDAuMDksMC40MiwwLjA5LDEuMjAsMC4wMywxLjUwXSxbJ2MnLC0wLjE1LDAuNDUsLTAuMzksMC44MSwtMC42NiwwLjkzXSxbJ2MnLC0wLjMzLDAuMTgsLTAuODQsMC4yMSwtMS4yMywwLjE1XSxbJ2MnLC0wLjgxLC0wLjE4LC0xLjMyLC0wLjkzLC0xLjI2LC0xLjg5XSxbJ2MnLDAuMDMsLTAuMzYsMC4wOSwtMC41NywwLjI0LC0wLjkwXSxbJ2MnLDAuMTUsLTAuMzMsMC40NSwtMC42MCwwLjcyLC0wLjc1XSxbJ2MnLDAuMTIsLTAuMDYsMC4xOCwtMC4wOSwwLjE4LC0wLjEyXSxbJ2MnLDAuMDAsLTAuMDMsLTAuMDMsLTAuMTUsLTAuMDksLTAuMjRdLFsnYycsLTAuMTgsLTAuNDUsLTAuNTQsLTAuODcsLTAuOTYsLTEuMDhdLFsnYycsLTEuMTEsLTAuNTcsLTIuMzQsLTAuMTgsLTIuODgsMC45MF0sWydjJywtMC4yNCwwLjUxLC0wLjMzLDEuMTEsLTAuMjQsMS44M10sWydjJywwLjI3LDEuOTIsMS41MCwzLjU0LDMuOTMsNS4xM10sWydjJywwLjQ4LDAuMzMsMS4yNiwwLjc4LDEuMjksMC43OF0sWydjJywwLjAzLDAuMDAsMS4zNSwtMi4xOSwyLjk0LC00Ljg5XSxbJ2wnLDIuODgsLTQuODldLFsnbCcsMC44NCwwLjAwXSxbJ2wnLDAuODcsMC4wMF0sWydsJywtMC4wMywwLjA2XSxbJ2MnLC0wLjE1LDAuMjEsLTYuMTUsMTAuNDEsLTYuMTUsMTAuNDRdLFsnYycsMC4wMCwwLjAwLDAuMjEsMC4xNSwwLjQ4LDAuMjddLFsnYycsMi42MSwxLjQ3LDQuMzUsMy4wMyw1LjEzLDQuNjVdLFsnYycsMS4xNCwyLjM0LDAuNTEsNS4wNywtMS40NCw2LjM5XSxbJ2MnLC0wLjY2LDAuNDIsLTEuMzIsMC42MywtMi4xMywwLjY5XSxbJ2MnLC0yLjAxLDAuMDksLTMuODEsLTEuNDEsLTQuMjYsLTMuNTRdLFsnYycsLTAuMDksLTAuNDIsLTAuMDksLTEuMjAsLTAuMDMsLTEuNTBdLFsnYycsMC4xNSwtMC40NSwwLjM5LC0wLjgxLDAuNjYsLTAuOTNdLFsnYycsMC4zMywtMC4xOCwwLjg0LC0wLjIxLDEuMjMsLTAuMTVdLFsnYycsMC44MSwwLjE4LDEuMzIsMC45MywxLjI2LDEuODldLFsnYycsLTAuMDMsMC4zNiwtMC4wOSwwLjU3LC0wLjI0LDAuOTBdLFsnYycsLTAuMTUsMC4zMywtMC40NSwwLjYwLC0wLjcyLDAuNzVdLFsnYycsLTAuMTIsMC4wNiwtMC4xOCwwLjA5LC0wLjE4LDAuMTJdLFsnYycsMC4wMCwwLjAzLDAuMDMsMC4xNSwwLjA5LDAuMjRdLFsnYycsMC4xOCwwLjQ1LDAuNTQsMC44NywwLjk2LDEuMDhdLFsnYycsMS4xMSwwLjU3LDIuMzQsMC4xOCwyLjg4LC0wLjkwXSxbJ2MnLDAuMjQsLTAuNTEsMC4zMywtMS4xMSwwLjI0LC0xLjgzXSxbJ2MnLC0wLjI3LC0xLjkyLC0xLjUwLC0zLjU0LC0zLjkzLC01LjEzXSxbJ2MnLC0wLjQ4LC0wLjMzLC0xLjI2LC0wLjc4LC0xLjI5LC0wLjc4XSxbJ2MnLC0wLjAzLDAuMDAsLTEuMzUsMi4xOSwtMi45MSw0Ljg5XSxbJ2wnLC0yLjg4LDQuODldLFsnbCcsLTAuODcsMC4wMF0sWydsJywtMC44NywwLjAwXSxbJ2wnLDAuMDMsLTAuMDZdLFsnYycsMC4xNSwtMC4yMSw2LjE1LC0xMC40MSw2LjE1LC0xMC40NF0sWydjJywwLjAwLDAuMDAsLTAuMjEsLTAuMTUsLTAuNDgsLTAuMzBdLFsnYycsLTIuNjEsLTEuNDQsLTQuMzUsLTMuMDAsLTUuMTMsLTQuNjJdLFsnYycsLTAuOTAsLTEuODksLTAuNzIsLTQuMDIsMC40OCwtNS41Ml0sWydjJywwLjY5LC0wLjg0LDEuNjgsLTEuNDEsMi43MywtMS41M10sWyd6J10sWydtJyw4Ljc2LDkuMDldLFsnYycsMC4wMywtMC4wMywwLjE1LC0wLjAzLDAuMjcsLTAuMDNdLFsnYycsMC4zMywwLjAzLDAuNTcsMC4xOCwwLjcyLDAuNDhdLFsnYycsMC4wOSwwLjE4LDAuMDksMC41NywwLjAwLDAuNzVdLFsnYycsLTAuMDksMC4xOCwtMC4yMSwwLjMwLC0wLjM2LDAuMzldLFsnYycsLTAuMTUsMC4wNiwtMC4yMSwwLjA2LC0wLjM5LDAuMDZdLFsnYycsLTAuMjEsMC4wMCwtMC4yNywwLjAwLC0wLjM5LC0wLjA2XSxbJ2MnLC0wLjMwLC0wLjE1LC0wLjQ4LC0wLjQ1LC0wLjQ4LC0wLjc1XSxbJ2MnLDAuMDAsLTAuMzksMC4yNCwtMC43MiwwLjYzLC0wLjg0XSxbJ3onXSxbJ20nLC0xMC41MywyLjYxXSxbJ2MnLDAuMDMsLTAuMDMsMC4xNSwtMC4wMywwLjI3LC0wLjAzXSxbJ2MnLDAuMzMsMC4wMywwLjU3LDAuMTgsMC43MiwwLjQ4XSxbJ2MnLDAuMDksMC4xOCwwLjA5LDAuNTcsMC4wMCwwLjc1XSxbJ2MnLC0wLjA5LDAuMTgsLTAuMjEsMC4zMCwtMC4zNiwwLjM5XSxbJ2MnLC0wLjE1LDAuMDYsLTAuMjEsMC4wNiwtMC4zOSwwLjA2XSxbJ2MnLC0wLjIxLDAuMDAsLTAuMjcsMC4wMCwtMC4zOSwtMC4wNl0sWydjJywtMC4zMCwtMC4xNSwtMC40OCwtMC40NSwtMC40OCwtMC43NV0sWydjJywwLjAwLC0wLjM5LDAuMjQsLTAuNzIsMC42MywtMC44NF0sWyd6J11dLHc6MTUsaDoyMi41MDR9LFxuXHRcdCdzY3JpcHRzLmNvZGEnOntkOltbJ00nLC0wLjIxLC0xMC40N10sWydjJywwLjE4LC0wLjEyLDAuNDIsLTAuMDYsMC41NCwwLjEyXSxbJ2MnLDAuMDYsMC4wOSwwLjA2LDAuMTgsMC4wNiwxLjUwXSxbJ2wnLDAuMDAsMS4zOF0sWydsJywwLjE4LDAuMDBdLFsnYycsMC4zOSwwLjA2LDAuOTYsMC4yNCwxLjM4LDAuNDhdLFsnYycsMS42OCwwLjkzLDIuODIsMy4yNCwzLjAzLDYuMTJdLFsnYycsMC4wMywwLjI0LDAuMDMsMC40NSwwLjAzLDAuNDVdLFsnYycsMC4wMCwwLjAzLDAuNjAsMC4wMywxLjM1LDAuMDNdLFsnYycsMS41MCwwLjAwLDEuNDcsMC4wMCwxLjU5LDAuMThdLFsnYycsMC4wOSwwLjEyLDAuMDksMC4zMCwwLjAwLDAuNDJdLFsnYycsLTAuMTIsMC4xOCwtMC4wOSwwLjE4LC0xLjU5LDAuMThdLFsnYycsLTAuNzUsMC4wMCwtMS4zNSwwLjAwLC0xLjM1LDAuMDNdLFsnYycsMC4wMCwwLjAwLDAuMDAsMC4yMSwtMC4wMywwLjQyXSxbJ2MnLC0wLjI0LDMuMTUsLTEuNTMsNS41OCwtMy40NSw2LjM2XSxbJ2MnLC0wLjI3LDAuMTIsLTAuNzIsMC4yNCwtMC45NiwwLjI3XSxbJ2wnLC0wLjE4LDAuMDBdLFsnbCcsMC4wMCwxLjM4XSxbJ2MnLDAuMDAsMS4zMiwwLjAwLDEuNDEsLTAuMDYsMS41MF0sWydjJywtMC4xNSwwLjI0LC0wLjUxLDAuMjQsLTAuNjYsMC4wMF0sWydjJywtMC4wNiwtMC4wOSwtMC4wNiwtMC4xOCwtMC4wNiwtMS41MF0sWydsJywwLjAwLC0xLjM4XSxbJ2wnLC0wLjE4LDAuMDBdLFsnYycsLTAuMzksLTAuMDYsLTAuOTYsLTAuMjQsLTEuMzgsLTAuNDhdLFsnYycsLTEuNjgsLTAuOTMsLTIuODIsLTMuMjQsLTMuMDMsLTYuMTVdLFsnYycsLTAuMDMsLTAuMjEsLTAuMDMsLTAuNDIsLTAuMDMsLTAuNDJdLFsnYycsMC4wMCwtMC4wMywtMC42MCwtMC4wMywtMS4zNSwtMC4wM10sWydjJywtMS41MCwwLjAwLC0xLjQ3LDAuMDAsLTEuNTksLTAuMThdLFsnYycsLTAuMDksLTAuMTIsLTAuMDksLTAuMzAsMC4wMCwtMC40Ml0sWydjJywwLjEyLC0wLjE4LDAuMDksLTAuMTgsMS41OSwtMC4xOF0sWydjJywwLjc1LDAuMDAsMS4zNSwwLjAwLDEuMzUsLTAuMDNdLFsnYycsMC4wMCwwLjAwLDAuMDAsLTAuMjEsMC4wMywtMC40NV0sWydjJywwLjI0LC0zLjEyLDEuNTMsLTUuNTUsMy40NSwtNi4zM10sWydjJywwLjI3LC0wLjEyLDAuNzIsLTAuMjQsMC45NiwtMC4yN10sWydsJywwLjE4LDAuMDBdLFsnbCcsMC4wMCwtMS4zOF0sWydjJywwLjAwLC0xLjUzLDAuMDAsLTEuNTAsMC4xOCwtMS42Ml0sWyd6J10sWydtJywtMC4xOCw2LjkzXSxbJ2MnLDAuMDAsLTIuOTcsMC4wMCwtMy4xNSwtMC4wNiwtMy4xNV0sWydjJywtMC4wOSwwLjAwLC0wLjUxLDAuMTUsLTAuNjYsMC4yMV0sWydjJywtMC44NywwLjUxLC0xLjM4LDEuNjIsLTEuNTYsMy41MV0sWydjJywtMC4wNiwwLjU0LC0wLjEyLDEuNTksLTAuMTIsMi4xNl0sWydsJywwLjAwLDAuNDJdLFsnbCcsMS4yMCwwLjAwXSxbJ2wnLDEuMjAsMC4wMF0sWydsJywwLjAwLC0zLjE1XSxbJ3onXSxbJ20nLDEuMTcsLTMuMDZdLFsnYycsLTAuMDksLTAuMDMsLTAuMjEsLTAuMDYsLTAuMjcsLTAuMDldLFsnbCcsLTAuMTIsMC4wMF0sWydsJywwLjAwLDMuMTVdLFsnbCcsMC4wMCwzLjE1XSxbJ2wnLDEuMjAsMC4wMF0sWydsJywxLjIwLDAuMDBdLFsnbCcsMC4wMCwtMC44MV0sWydjJywtMC4wNiwtMi40MCwtMC4zMywtMy42OSwtMC45MywtNC41OV0sWydjJywtMC4yNywtMC4zOSwtMC42NiwtMC42OSwtMS4wOCwtMC44MV0sWyd6J10sWydtJywtMS4xNywxMC4xNF0sWydsJywwLjAwLC0zLjE1XSxbJ2wnLC0xLjIwLDAuMDBdLFsnbCcsLTEuMjAsMC4wMF0sWydsJywwLjAwLDAuODFdLFsnYycsMC4wMywwLjk2LDAuMDYsMS40NywwLjE1LDIuMTNdLFsnYycsMC4yNCwyLjA0LDAuOTYsMy4xMiwyLjEzLDMuMzZdLFsnbCcsMC4xMiwwLjAwXSxbJ2wnLDAuMDAsLTMuMTVdLFsneiddLFsnbScsMy4xOCwtMi4zNF0sWydsJywwLjAwLC0wLjgxXSxbJ2wnLC0xLjIwLDAuMDBdLFsnbCcsLTEuMjAsMC4wMF0sWydsJywwLjAwLDMuMTVdLFsnbCcsMC4wMCwzLjE1XSxbJ2wnLDAuMTIsMC4wMF0sWydjJywxLjE3LC0wLjI0LDEuODksLTEuMzIsMi4xMywtMy4zNl0sWydjJywwLjA5LC0wLjY2LDAuMTIsLTEuMTcsMC4xNSwtMi4xM10sWyd6J11dLHc6MTYuMDM1LGg6MjEuMDYyfSxcblx0XHQnc2NyaXB0cy5jb21tYSc6e2Q6W1snTScsMS4xNCwtNC42Ml0sWydjJywwLjMwLC0wLjEyLDAuNjksLTAuMDMsMC45MywwLjE1XSxbJ2MnLDAuMTIsMC4xMiwwLjM2LDAuNDUsMC41MSwwLjc4XSxbJ2MnLDAuOTAsMS43NywwLjU0LDQuMDUsLTEuMDgsNi43NV0sWydjJywtMC4zNiwwLjYzLC0wLjg3LDEuMzgsLTAuOTYsMS40NF0sWydjJywtMC4xOCwwLjEyLC0wLjQyLDAuMDYsLTAuNTQsLTAuMTJdLFsnYycsLTAuMDksLTAuMTgsLTAuMDksLTAuMzAsMC4xMiwtMC42MF0sWydjJywwLjk2LC0xLjQ0LDEuNDQsLTIuOTcsMS4zOCwtNC4zNV0sWydjJywtMC4wNiwtMC45MywtMC4zMCwtMS42OCwtMC43OCwtMi40Nl0sWydjJywtMC4yNywtMC4zOSwtMC4zMywtMC42MywtMC4yNCwtMC45Nl0sWydjJywwLjA5LC0wLjI3LDAuMzYsLTAuNTQsMC42NiwtMC42M10sWyd6J11dLHc6My4wNDIsaDo5LjIzN30sXG5cdFx0J3NjcmlwdHMucm9sbCc6e2Q6W1snTScsMS45NSwtNi4wMF0sWydjJywwLjIxLC0wLjA5LDAuMzYsLTAuMDksMC41NywwLjAwXSxbJ2MnLDAuMzksMC4xNSwwLjYzLDAuMzksMS40NywxLjM1XSxbJ2MnLDAuNjYsMC43NSwwLjc4LDAuODcsMS4wOCwxLjA1XSxbJ2MnLDAuNzUsMC40NSwxLjY1LDAuNDIsMi40MCwtMC4wNl0sWydjJywwLjEyLC0wLjA5LDAuMjcsLTAuMjcsMC41NCwtMC42MF0sWydjJywwLjQyLC0wLjU0LDAuNTEsLTAuNjMsMC42OSwtMC42M10sWydjJywwLjA5LDAuMDAsMC4zMCwwLjEyLDAuMzYsMC4yMV0sWydjJywwLjA5LDAuMTIsMC4xMiwwLjMwLDAuMDMsMC40Ml0sWydjJywtMC4wNiwwLjEyLC0zLjE1LDMuOTAsLTMuMzAsNC4wOF0sWydjJywtMC4wNiwwLjA2LC0wLjE4LDAuMTIsLTAuMjcsMC4xOF0sWydjJywtMC4yNywwLjEyLC0wLjYwLDAuMDYsLTAuOTksLTAuMjddLFsnYycsLTAuMjcsLTAuMjEsLTAuNDIsLTAuMzksLTEuMDgsLTEuMTRdLFsnYycsLTAuNjMsLTAuNzIsLTAuODEsLTAuOTAsLTEuMTcsLTEuMDhdLFsnYycsLTAuMzYsLTAuMTgsLTAuNTcsLTAuMjEsLTAuOTksLTAuMjFdLFsnYycsLTAuMzksMC4wMCwtMC42MywwLjAzLC0wLjkzLDAuMThdLFsnYycsLTAuMzYsMC4xNSwtMC41MSwwLjI3LC0wLjkwLDAuODFdLFsnYycsLTAuMjQsMC4yNywtMC40NSwwLjUxLC0wLjQ4LDAuNTRdLFsnYycsLTAuMTIsMC4wOSwtMC4yNywwLjA2LC0wLjM5LDAuMDBdLFsnYycsLTAuMjQsLTAuMTUsLTAuMzMsLTAuMzksLTAuMjEsLTAuNjBdLFsnYycsMC4wOSwtMC4xMiwzLjE4LC0zLjg3LDMuMzMsLTQuMDJdLFsnYycsMC4wNiwtMC4wNiwwLjE4LC0wLjE1LDAuMjQsLTAuMjFdLFsneiddXSx3OjEwLjgxNyxoOjYuMTI1fSxcblx0XHQnc2NyaXB0cy5wcmFsbCc6e2Q6W1snTScsLTQuMzgsLTMuNjldLFsnYycsMC4wNiwtMC4wMywwLjE4LC0wLjA2LDAuMjQsLTAuMDZdLFsnYycsMC4zMCwwLjAwLDAuMjcsLTAuMDMsMS44OSwxLjk1XSxbJ2wnLDEuNTMsMS44M10sWydjJywwLjAzLDAuMDAsMC41NywtMC44NCwxLjIzLC0xLjgzXSxbJ2MnLDEuMTQsLTEuNjgsMS4yMywtMS44MywxLjM1LC0xLjg5XSxbJ2MnLDAuMDYsLTAuMDMsMC4xOCwtMC4wNiwwLjI0LC0wLjA2XSxbJ2MnLDAuMzAsMC4wMCwwLjI3LC0wLjAzLDEuODksMS45NV0sWydsJywxLjUzLDEuODNdLFsnbCcsMC40OCwtMC42OV0sWydjJywwLjUxLC0wLjc4LDAuNTQsLTAuODQsMC42OSwtMC45MF0sWydjJywwLjQyLC0wLjE4LDAuODcsMC4xNSwwLjgxLDAuNjBdLFsnYycsLTAuMDMsMC4xMiwtMC4zMCwwLjUxLC0xLjUwLDIuMzddLFsnYycsLTEuMzgsMi4wNywtMS41MCwyLjIyLC0xLjYyLDIuMjhdLFsnYycsLTAuMDYsMC4wMywtMC4xOCwwLjA2LC0wLjI0LDAuMDZdLFsnYycsLTAuMzAsMC4wMCwtMC4yNywwLjAzLC0xLjg5LC0xLjk1XSxbJ2wnLC0xLjUzLC0xLjgzXSxbJ2MnLC0wLjAzLDAuMDAsLTAuNTcsMC44NCwtMS4yMywxLjgzXSxbJ2MnLC0xLjE0LDEuNjgsLTEuMjMsMS44MywtMS4zNSwxLjg5XSxbJ2MnLC0wLjA2LDAuMDMsLTAuMTgsMC4wNiwtMC4yNCwwLjA2XSxbJ2MnLC0wLjMwLDAuMDAsLTAuMjcsMC4wMywtMS44OSwtMS45NV0sWydsJywtMS41MywtMS44M10sWydsJywtMC40OCwwLjY5XSxbJ2MnLC0wLjUxLDAuNzgsLTAuNTQsMC44NCwtMC42OSwwLjkwXSxbJ2MnLC0wLjQyLDAuMTgsLTAuODcsLTAuMTUsLTAuODEsLTAuNjBdLFsnYycsMC4wMywtMC4xMiwwLjMwLC0wLjUxLDEuNTAsLTIuMzddLFsnYycsMS4zOCwtMi4wNywxLjUwLC0yLjIyLDEuNjIsLTIuMjhdLFsneiddXSx3OjE1LjAxMSxoOjcuNX0sXG5cdFx0J3NjcmlwdHMuYXJwZWdnaW8nOntkOltbJ00nLDEuNSwwXSxbJ2MnLDEuNSwyLDEuNSwzLDEuNSwzXSxbJ3MnLDAsMSwtMiwxLjVdLFsncycsLTAuNSwzLDEsNS41XSxbJ2wnLDEuNSwwXSxbJ3MnLC0xLjc1LC0yLC0xLjksLTMuMjVdLFsncycsMi4xNSwtMC42LDIuOTUsLTEuNl0sWydzJywwLjQ1LC0xLDAuNSwtMS4yNV0sWydzJywwLC0xLC0yLC0zLjldLFsnbCcsLTEuNSwwXSxbJ3onXV0sdzo1LGg6MTB9LFxuXHRcdCdzY3JpcHRzLm1vcmRlbnQnOntkOltbJ00nLC0wLjIxLC00Ljk1XSxbJ2MnLDAuMjcsLTAuMTUsMC42MywwLjAwLDAuNzUsMC4yN10sWydjJywwLjA2LDAuMTIsMC4wNiwwLjI0LDAuMDYsMS40NF0sWydsJywwLjAwLDEuMjldLFsnbCcsMC41NywtMC44NF0sWydjJywwLjUxLC0wLjc1LDAuNTcsLTAuODQsMC42OSwtMC45MF0sWydjJywwLjA2LC0wLjAzLDAuMTgsLTAuMDYsMC4yNCwtMC4wNl0sWydjJywwLjMwLDAuMDAsMC4yNywtMC4wMywxLjg5LDEuOTVdLFsnbCcsMS41MywxLjgzXSxbJ2wnLDAuNDgsLTAuNjldLFsnYycsMC41MSwtMC43OCwwLjU0LC0wLjg0LDAuNjksLTAuOTBdLFsnYycsMC40MiwtMC4xOCwwLjg3LDAuMTUsMC44MSwwLjYwXSxbJ2MnLC0wLjAzLDAuMTIsLTAuMzAsMC41MSwtMS41MCwyLjM3XSxbJ2MnLC0xLjM4LDIuMDcsLTEuNTAsMi4yMiwtMS42MiwyLjI4XSxbJ2MnLC0wLjA2LDAuMDMsLTAuMTgsMC4wNiwtMC4yNCwwLjA2XSxbJ2MnLC0wLjMwLDAuMDAsLTAuMjcsMC4wMywtMS44MywtMS44OV0sWydjJywtMC44MSwtMC45OSwtMS41MCwtMS44MCwtMS41MywtMS44Nl0sWydjJywtMC4wNiwtMC4wMywtMC4wNiwtMC4wMywtMC4xMiwwLjAzXSxbJ2MnLC0wLjA2LDAuMDYsLTAuMDYsMC4xNSwtMC4wNiwyLjI4XSxbJ2MnLDAuMDAsMS45NSwwLjAwLDIuMjUsLTAuMDYsMi4zNF0sWydjJywtMC4xOCwwLjQ1LC0wLjgxLDAuNDgsLTEuMDUsMC4wM10sWydjJywtMC4wMywtMC4wNiwtMC4wNiwtMC4yNCwtMC4wNiwtMS40MV0sWydsJywwLjAwLC0xLjM1XSxbJ2wnLC0wLjU3LDAuODRdLFsnYycsLTAuNTQsMC43OCwtMC42MCwwLjg3LC0wLjcyLDAuOTNdLFsnYycsLTAuMDYsMC4wMywtMC4xOCwwLjA2LC0wLjI0LDAuMDZdLFsnYycsLTAuMzAsMC4wMCwtMC4yNywwLjAzLC0xLjg5LC0xLjk1XSxbJ2wnLC0xLjUzLC0xLjgzXSxbJ2wnLC0wLjQ4LDAuNjldLFsnYycsLTAuNTEsMC43OCwtMC41NCwwLjg0LC0wLjY5LDAuOTBdLFsnYycsLTAuNDIsMC4xOCwtMC44NywtMC4xNSwtMC44MSwtMC42MF0sWydjJywwLjAzLC0wLjEyLDAuMzAsLTAuNTEsMS41MCwtMi4zN10sWydjJywxLjM4LC0yLjA3LDEuNTAsLTIuMjIsMS42MiwtMi4yOF0sWydjJywwLjA2LC0wLjAzLDAuMTgsLTAuMDYsMC4yNCwtMC4wNl0sWydjJywwLjMwLDAuMDAsMC4yNywtMC4wMywxLjg5LDEuOTVdLFsnbCcsMS41MywxLjgzXSxbJ2MnLDAuMDMsMC4wMCwwLjA2LC0wLjA2LDAuMDksLTAuMDldLFsnYycsMC4wNiwtMC4xMiwwLjA2LC0wLjE1LDAuMDYsLTIuMjhdLFsnYycsMC4wMCwtMS45MiwwLjAwLC0yLjIyLDAuMDYsLTIuMzFdLFsnYycsMC4wNiwtMC4xNSwwLjE1LC0wLjI0LDAuMzAsLTAuMzBdLFsneiddXSx3OjE1LjAxMSxoOjEwLjAxMn0sXG5cdFx0J2ZsYWdzLnU4dGgnOntkOltbJ00nLC0wLjQyLDMuNzVdLFsnbCcsMC4wMCwtMy43NV0sWydsJywwLjIxLDAuMDBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMDAsMC4xOF0sWydjJywwLjAwLDAuMzAsMC4wNiwwLjg0LDAuMTIsMS4yM10sWydjJywwLjI0LDEuNTMsMC45MCwzLjEyLDIuMTMsNS4xNl0sWydsJywwLjk5LDEuNTldLFsnYycsMC44NywxLjQ0LDEuMzgsMi4zNCwxLjc3LDMuMDldLFsnYycsMC44MSwxLjY4LDEuMjAsMy4wNiwxLjI2LDQuNTNdLFsnYycsMC4wMywxLjUzLC0wLjIxLDMuMjcsLTAuNzUsNS4wMV0sWydjJywtMC4yMSwwLjY5LC0wLjUxLDEuNTAsLTAuNjAsMS41OV0sWydjJywtMC4wOSwwLjEyLC0wLjI3LDAuMjEsLTAuNDIsMC4yMV0sWydjJywtMC4xNSwwLjAwLC0wLjQyLC0wLjEyLC0wLjUxLC0wLjIxXSxbJ2MnLC0wLjE1LC0wLjE4LC0wLjE4LC0wLjQyLC0wLjA5LC0wLjY2XSxbJ2MnLDAuMTUsLTAuMzMsMC40NSwtMS4yMCwwLjU3LC0xLjYyXSxbJ2MnLDAuNDIsLTEuMzgsMC42MCwtMi41OCwwLjYwLC0zLjkwXSxbJ2MnLDAuMDAsLTAuNjYsMC4wMCwtMC44MSwtMC4wNiwtMS4xMV0sWydjJywtMC4zOSwtMi4wNywtMS44MCwtNC4yNiwtNC41OSwtNy4xNF0sWydsJywtMC40MiwtMC40NV0sWydsJywtMC4yMSwwLjAwXSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsMC4wMCwtMy43NV0sWyd6J11dLHc6Ni42OTIsaDoyMi41OX0sXG5cdFx0J2ZsYWdzLnUxNnRoJzp7ZDpbWydNJywtMC40Miw3LjUwXSxbJ2wnLDAuMDAsLTcuNTBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMjEsMC4wMF0sWydsJywwLjAwLDAuMzldLFsnYycsMC4wNiwxLjA4LDAuMzksMi4xOSwwLjk5LDMuMzldLFsnYycsMC40NSwwLjkwLDAuODcsMS41OSwxLjk1LDMuMTJdLFsnYycsMS4yOSwxLjg2LDEuNzcsMi42NCwyLjIyLDMuNTddLFsnYycsMC40NSwwLjkzLDAuNzIsMS44MCwwLjg3LDIuNjRdLFsnYycsMC4wNiwwLjUxLDAuMDYsMS41MCwwLjAwLDEuOTJdLFsnYycsLTAuMTIsMC42MCwtMC4zMCwxLjIwLC0wLjU0LDEuNzFdLFsnbCcsLTAuMDksMC4yNF0sWydsJywwLjE4LDAuNDVdLFsnYycsMC41MSwxLjIwLDAuNzIsMi4yMiwwLjY5LDMuNDJdLFsnYycsLTAuMDYsMS41MywtMC4zOSwzLjAzLC0wLjk5LDQuNTNdLFsnYycsLTAuMzAsMC43NSwtMC4zNiwwLjgxLC0wLjU3LDAuOTBdLFsnYycsLTAuMTUsMC4wOSwtMC4zMywwLjA2LC0wLjQ4LDAuMDBdLFsnYycsLTAuMTgsLTAuMDksLTAuMjcsLTAuMTgsLTAuMzMsLTAuMzNdLFsnYycsLTAuMDksLTAuMTgsLTAuMDYsLTAuMzAsMC4xMiwtMC43NV0sWydjJywwLjY2LC0xLjQxLDEuMDIsLTIuODgsMS4wOCwtNC4zMl0sWydjJywwLjAwLC0wLjYwLC0wLjAzLC0xLjA1LC0wLjE4LC0xLjU5XSxbJ2MnLC0wLjMwLC0xLjIwLC0wLjk5LC0yLjQwLC0yLjI1LC0zLjg3XSxbJ2MnLC0wLjQyLC0wLjQ4LC0xLjUzLC0xLjYyLC0yLjE5LC0yLjIyXSxbJ2wnLC0wLjQ1LC0wLjQyXSxbJ2wnLC0wLjAzLDEuMTFdLFsnbCcsMC4wMCwxLjExXSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsLTAuMjEsMC4wMF0sWydsJywwLjAwLC03LjUwXSxbJ3onXSxbJ20nLDEuNjUsMC4wOV0sWydjJywtMC4zMCwtMC4zMCwtMC42OSwtMC43MiwtMC45MCwtMC44N10sWydsJywtMC4zMywtMC4zM10sWydsJywwLjAwLDAuMTVdLFsnYycsMC4wMCwwLjMwLDAuMDYsMC44MSwwLjE1LDEuMjZdLFsnYycsMC4yNywxLjI5LDAuODcsMi42MSwyLjA0LDQuMjldLFsnYycsMC4xNSwwLjI0LDAuNjAsMC44NywwLjk2LDEuMzhdLFsnbCcsMS4wOCwxLjUzXSxbJ2wnLDAuNDIsMC42M10sWydjJywwLjAzLDAuMDAsMC4xMiwtMC4zNiwwLjIxLC0wLjcyXSxbJ2MnLDAuMDYsLTAuMzMsMC4wNiwtMS4yMCwwLjAwLC0xLjYyXSxbJ2MnLC0wLjMzLC0xLjcxLC0xLjQ0LC0zLjQ4LC0zLjYzLC01LjcwXSxbJ3onXV0sdzo2LjY5MyxoOjI2LjMzN30sXG5cdFx0J2ZsYWdzLnUzMm5kJzp7ZDpbWydNJywtMC40MiwxMS4yNV0sWydsJywwLjAwLC0xMS4yNV0sWydsJywwLjIxLDAuMDBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMDAsMC4zNl0sWydjJywwLjA5LDEuNjgsMC42OSwzLjI3LDIuMDcsNS40Nl0sWydsJywwLjg3LDEuMzVdLFsnYycsMS4wMiwxLjYyLDEuNDcsMi4zNywxLjg2LDMuMThdLFsnYycsMC40OCwxLjAyLDAuNzgsMS45MiwwLjkzLDIuODhdLFsnYycsMC4wNiwwLjQ4LDAuMDYsMS41MCwwLjAwLDEuODldLFsnYycsLTAuMDksMC40MiwtMC4yMSwwLjg3LC0wLjM2LDEuMjZdLFsnbCcsLTAuMTIsMC4zMF0sWydsJywwLjE1LDAuMzldLFsnYycsMC42OSwxLjU2LDAuODQsMi44OCwwLjU0LDQuMzhdLFsnYycsLTAuMDksMC40NSwtMC4yNywxLjA4LC0wLjQ1LDEuNDddLFsnbCcsLTAuMTIsMC4yNF0sWydsJywwLjE4LDAuMzZdLFsnYycsMC4zMywwLjcyLDAuNTcsMS41NiwwLjY5LDIuMzRdLFsnYycsMC4xMiwxLjAyLC0wLjA2LDIuNTIsLTAuNDIsMy44NF0sWydjJywtMC4yNywwLjkzLC0wLjc1LDIuMTMsLTAuOTMsMi4zMV0sWydjJywtMC4xOCwwLjE1LC0wLjQ1LDAuMTgsLTAuNjYsMC4wOV0sWydjJywtMC4xOCwtMC4wOSwtMC4yNywtMC4xOCwtMC4zMywtMC4zM10sWydjJywtMC4wOSwtMC4xOCwtMC4wNiwtMC4zMCwwLjA2LC0wLjYwXSxbJ2MnLDAuMjEsLTAuMzYsMC40MiwtMC45MCwwLjU3LC0xLjM4XSxbJ2MnLDAuNTEsLTEuNDEsMC42OSwtMy4wNiwwLjQ4LC00LjA4XSxbJ2MnLC0wLjE1LC0wLjgxLC0wLjU3LC0xLjY4LC0xLjIwLC0yLjU1XSxbJ2MnLC0wLjcyLC0wLjk5LC0xLjgzLC0yLjEzLC0zLjMwLC0zLjMzXSxbJ2wnLC0wLjQ4LC0wLjQyXSxbJ2wnLC0wLjAzLDEuNTNdLFsnbCcsMC4wMCwxLjU2XSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsLTAuMjEsMC4wMF0sWydsJywwLjAwLC0xMS4yNV0sWyd6J10sWydtJywxLjI2LC0zLjk2XSxbJ2MnLC0wLjI3LC0wLjMwLC0wLjU0LC0wLjYwLC0wLjY2LC0wLjcyXSxbJ2wnLC0wLjE4LC0wLjIxXSxbJ2wnLDAuMDAsMC40Ml0sWydjJywwLjA2LDAuODcsMC4yNCwxLjc0LDAuNjYsMi42N10sWydjJywwLjM2LDAuODcsMC45NiwxLjg2LDEuOTIsMy4xOF0sWydjJywwLjIxLDAuMzMsMC42MywwLjg3LDAuODcsMS4yM10sWydjJywwLjI3LDAuMzksMC42MCwwLjg0LDAuNzUsMS4wOF0sWydsJywwLjI3LDAuMzldLFsnbCcsMC4wMywtMC4xMl0sWydjJywwLjEyLC0wLjQ1LDAuMTUsLTEuMDUsMC4wOSwtMS41OV0sWydjJywtMC4yNywtMS44NiwtMS4zOCwtMy43OCwtMy43NSwtNi4zM10sWyd6J10sWydtJywtMC4yNyw2LjA5XSxbJ2MnLC0wLjI3LC0wLjIxLC0wLjQ4LC0wLjQyLC0wLjUxLC0wLjQ1XSxbJ2MnLC0wLjA2LC0wLjAzLC0wLjA2LC0wLjAzLC0wLjA2LDAuMjFdLFsnYycsMC4wMCwwLjkwLDAuMzAsMi4wNCwwLjgxLDMuMDldLFsnYycsMC40OCwxLjAyLDAuOTYsMS43NywyLjM3LDMuNjNdLFsnYycsMC42MCwwLjc4LDEuMDUsMS40NCwxLjI5LDEuNzddLFsnYycsMC4wNiwwLjEyLDAuMTUsMC4yMSwwLjE1LDAuMThdLFsnYycsMC4wMywtMC4wMywwLjE4LC0wLjU3LDAuMjQsLTAuODddLFsnYycsMC4wNiwtMC40NSwwLjA2LC0xLjMyLC0wLjAzLC0xLjc0XSxbJ2MnLC0wLjA5LC0wLjQ4LC0wLjI0LC0wLjkwLC0wLjUxLC0xLjQ0XSxbJ2MnLC0wLjY2LC0xLjM1LC0xLjgzLC0yLjcwLC0zLjc1LC00LjM4XSxbJ3onXV0sdzo2LjY5NyxoOjMyLjE0NX0sXG5cdFx0J2ZsYWdzLnU2NHRoJzp7ZDpbWydNJywtMC40MiwxNS4wMF0sWydsJywwLjAwLC0xNS4wMF0sWydsJywwLjIxLDAuMDBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMDAsMC4zNl0sWydjJywwLjA2LDEuMjAsMC4zOSwyLjM3LDEuMDIsMy42Nl0sWydjJywwLjM5LDAuODEsMC44NCwxLjU2LDEuODAsMy4wOV0sWydjJywwLjgxLDEuMjYsMS4wNSwxLjY4LDEuMzUsMi4yMl0sWydjJywwLjg3LDEuNTAsMS4zNSwyLjc5LDEuNTYsNC4wOF0sWydjJywwLjA2LDAuNTQsMC4wNiwxLjU2LC0wLjAzLDIuMDRdLFsnYycsLTAuMDksMC40OCwtMC4yMSwwLjk5LC0wLjM2LDEuMzVdLFsnbCcsLTAuMTIsMC4yN10sWydsJywwLjEyLDAuMjddLFsnYycsMC4wOSwwLjE1LDAuMjEsMC40NSwwLjI3LDAuNjZdLFsnYycsMC42OSwxLjg5LDAuNjMsMy42NiwtMC4xOCw1LjQ2XSxbJ2wnLC0wLjE4LDAuMzldLFsnbCcsMC4xNSwwLjMzXSxbJ2MnLDAuMzAsMC42NiwwLjUxLDEuNDQsMC42MywyLjEwXSxbJ2MnLDAuMDYsMC40OCwwLjA2LDEuMzUsMC4wMCwxLjcxXSxbJ2MnLC0wLjE1LDAuNTcsLTAuNDIsMS4yMCwtMC43OCwxLjY4XSxbJ2wnLC0wLjIxLDAuMjddLFsnbCcsMC4xOCwwLjMzXSxbJ2MnLDAuNTcsMS4wNSwwLjkzLDIuMTMsMS4wMiwzLjE4XSxbJ2MnLDAuMDYsMC43MiwwLjAwLDEuODMsLTAuMjEsMi43OV0sWydjJywtMC4xOCwxLjAyLC0wLjYzLDIuMzQsLTEuMDIsMy4wOV0sWydjJywtMC4xNSwwLjMzLC0wLjQ4LDAuNDUsLTAuNzgsMC4zMF0sWydjJywtMC4xOCwtMC4wOSwtMC4yNywtMC4xOCwtMC4zMywtMC4zM10sWydjJywtMC4wOSwtMC4xOCwtMC4wNiwtMC4zMCwwLjAzLC0wLjU0XSxbJ2MnLDAuNzUsLTEuNTAsMS4yMywtMy40NSwxLjE3LC00Ljg5XSxbJ2MnLC0wLjA2LC0xLjAyLC0wLjQyLC0yLjAxLC0xLjE3LC0zLjE1XSxbJ2MnLC0wLjQ4LC0wLjcyLC0xLjAyLC0xLjM1LC0xLjg5LC0yLjIyXSxbJ2MnLC0wLjU3LC0wLjU3LC0xLjU2LC0xLjUwLC0xLjkyLC0xLjc3XSxbJ2wnLC0wLjEyLC0wLjA5XSxbJ2wnLDAuMDAsMS42OF0sWydsJywwLjAwLDEuNjhdLFsnbCcsLTAuMjEsMC4wMF0sWydsJywtMC4yMSwwLjAwXSxbJ2wnLDAuMDAsLTE1LjAwXSxbJ3onXSxbJ20nLDAuOTMsLTguMDddLFsnYycsLTAuMjcsLTAuMzAsLTAuNDgsLTAuNTQsLTAuNTEsLTAuNTRdLFsnYycsMC4wMCwwLjAwLDAuMDAsMC42OSwwLjAzLDEuMDJdLFsnYycsMC4xNSwxLjQ3LDAuNzUsMi45NCwyLjA0LDQuODNdLFsnbCcsMS4wOCwxLjUzXSxbJ2MnLDAuMzksMC41NywwLjg0LDEuMjAsMC45OSwxLjQ0XSxbJ2MnLDAuMTUsMC4yNCwwLjMwLDAuNDUsMC4zMCwwLjQ1XSxbJ2MnLDAuMDAsMC4wMCwwLjAzLC0wLjA5LDAuMDYsLTAuMjFdLFsnYycsMC4zNiwtMS41OSwtMC4xNSwtMy4zMywtMS40NywtNS40MF0sWydjJywtMC42MywtMC45MywtMS4zNSwtMS44MywtMi41MiwtMy4xMl0sWyd6J10sWydtJywwLjA2LDYuNzJdLFsnYycsLTAuMjQsLTAuMjEsLTAuNDgsLTAuNDIsLTAuNTEsLTAuNDVdLFsnbCcsLTAuMDYsLTAuMDZdLFsnbCcsMC4wMCwwLjMzXSxbJ2MnLDAuMDAsMS4yMCwwLjMwLDIuMzQsMC45MywzLjYwXSxbJ2MnLDAuNDUsMC45MCwwLjk2LDEuNjgsMi4yNSwzLjUxXSxbJ2MnLDAuMzksMC41NCwwLjg0LDEuMTcsMS4wMiwxLjQ0XSxbJ2MnLDAuMjEsMC4zMywwLjMzLDAuNTEsMC4zMywwLjQ4XSxbJ2MnLDAuMDYsLTAuMDksMC4yMSwtMC42MywwLjMwLC0wLjk5XSxbJ2MnLDAuMDYsLTAuMzMsMC4wNiwtMC40NSwwLjA2LC0wLjk2XSxbJ2MnLDAuMDAsLTAuNjAsLTAuMDMsLTAuODQsLTAuMTgsLTEuMzVdLFsnYycsLTAuMzAsLTEuMDgsLTEuMDIsLTIuMjgsLTIuMTMsLTMuNTddLFsnYycsLTAuMzksLTAuNDUsLTEuNDQsLTEuNDcsLTIuMDEsLTEuOThdLFsneiddLFsnbScsMC4wMCw2LjcyXSxbJ2MnLC0wLjI0LC0wLjIxLC0wLjQ4LC0wLjM5LC0wLjUxLC0wLjQyXSxbJ2wnLC0wLjA2LC0wLjA2XSxbJ2wnLDAuMDAsMC4zM10sWydjJywwLjAwLDEuNDEsMC40NSwyLjgyLDEuMzgsNC4zNV0sWydjJywwLjQyLDAuNzIsMC43MiwxLjE0LDEuODYsMi43M10sWydjJywwLjM2LDAuNDUsMC43NSwwLjk5LDAuODcsMS4yMF0sWydjJywwLjE1LDAuMjEsMC4zMCwwLjM2LDAuMzAsMC4zNl0sWydjJywwLjA2LDAuMDAsMC4zMCwtMC40OCwwLjM5LC0wLjc1XSxbJ2MnLDAuMDksLTAuMzYsMC4xMiwtMC42MywwLjEyLC0xLjA1XSxbJ2MnLC0wLjA2LC0xLjA1LC0wLjQ1LC0yLjA0LC0xLjIwLC0zLjE4XSxbJ2MnLC0wLjU3LC0wLjg3LC0xLjExLC0xLjUzLC0yLjA3LC0yLjQ5XSxbJ2MnLC0wLjM2LC0wLjMzLC0wLjg0LC0wLjc4LC0xLjA4LC0xLjAyXSxbJ3onXV0sdzo2LjY4MixoOjM5LjY5NH0sXG5cdFx0J2ZsYWdzLmQ4dGgnOntkOltbJ00nLDUuNjcsLTIxLjYzXSxbJ2MnLDAuMjQsLTAuMTIsMC41NCwtMC4wNiwwLjY5LDAuMTVdLFsnYycsMC4wNiwwLjA2LDAuMjEsMC4zNiwwLjM5LDAuNjZdLFsnYycsMC44NCwxLjc3LDEuMjYsMy4zNiwxLjMyLDUuMTBdLFsnYycsMC4wMywxLjI5LC0wLjIxLDIuMzcsLTAuODEsMy42M10sWydjJywtMC42MCwxLjIzLC0xLjI2LDIuMTMsLTMuMjEsNC4zOF0sWydjJywtMS4zNSwxLjUzLC0xLjg2LDIuMTksLTIuNDAsMi45N10sWydjJywtMC42MywwLjkzLC0xLjExLDEuOTIsLTEuMzgsMi43OV0sWydjJywtMC4xNSwwLjU0LC0wLjI3LDEuMzUsLTAuMjcsMS44MF0sWydsJywwLjAwLDAuMTVdLFsnbCcsLTAuMjEsMC4wMF0sWydsJywtMC4yMSwwLjAwXSxbJ2wnLDAuMDAsLTMuNzVdLFsnbCcsMC4wMCwtMy43NV0sWydsJywwLjIxLDAuMDBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuNDgsLTAuMzBdLFsnYycsMS44MywtMS4xMSwzLjEyLC0yLjEwLDQuMTcsLTMuMTJdLFsnYycsMC43OCwtMC44MSwxLjMyLC0xLjUzLDEuNzEsLTIuMzFdLFsnYycsMC40NSwtMC45MywwLjYwLC0xLjc0LDAuNTEsLTIuODhdLFsnYycsLTAuMTIsLTEuNTYsLTAuNjMsLTMuMTgsLTEuNDcsLTQuNjhdLFsnYycsLTAuMTIsLTAuMjEsLTAuMTUsLTAuMzMsLTAuMDYsLTAuNTFdLFsnYycsMC4wNiwtMC4xNSwwLjE1LC0wLjI0LDAuMzMsLTAuMzNdLFsneiddXSx3OjguNDkyLGg6MjEuNjkxfSxcblx0XHQnZmxhZ3MudWdyYWNlJzp7ZDpbWydNJyw2LjAzLDYuOTNdLFsnYycsMC4xNSwtMC4wOSwwLjMzLC0wLjA2LDAuNTEsMC4wMF0sWydjJywwLjE1LDAuMDksMC4yMSwwLjE1LDAuMzAsMC4zM10sWydjJywwLjA5LDAuMTgsMC4wNiwwLjM5LC0wLjAzLDAuNTRdLFsnYycsLTAuMDYsMC4xNSwtMTAuODksOC44OCwtMTEuMDcsOC45N10sWydjJywtMC4xNSwwLjA5LC0wLjMzLDAuMDYsLTAuNDgsMC4wMF0sWydjJywtMC4xOCwtMC4wOSwtMC4yNCwtMC4xNSwtMC4zMywtMC4zM10sWydjJywtMC4wOSwtMC4xOCwtMC4wNiwtMC4zOSwwLjAzLC0wLjU0XSxbJ2MnLDAuMDYsLTAuMTUsMTAuODksLTguODgsMTEuMDcsLTguOTddLFsneiddXSx3OjEyLjAxOSxoOjkuOTU0fSxcblx0XHQnZmxhZ3MuZGdyYWNlJzp7ZDpbWydNJywtNi4wNiwtMTUuOTNdLFsnYycsMC4xOCwtMC4wOSwwLjMzLC0wLjEyLDAuNDgsLTAuMDZdLFsnYycsMC4xOCwwLjA5LDE0LjAxLDguMDQsMTQuMTAsOC4xMF0sWydjJywwLjEyLDAuMTIsMC4xOCwwLjMzLDAuMTgsMC41MV0sWydjJywtMC4wMywwLjIxLC0wLjE1LDAuMzksLTAuMzYsMC40OF0sWydjJywtMC4xOCwwLjA5LC0wLjMzLDAuMTIsLTAuNDgsMC4wNl0sWydjJywtMC4xOCwtMC4wOSwtMTQuMDEsLTguMDQsLTE0LjEwLC04LjEwXSxbJ2MnLC0wLjEyLC0wLjEyLC0wLjE4LC0wLjMzLC0wLjE4LC0wLjUxXSxbJ2MnLDAuMDMsLTAuMjEsMC4xNSwtMC4zOSwwLjM2LC0wLjQ4XSxbJ3onXV0sdzoxNS4xMixoOjkuMjEyfSxcblx0XHQnZmxhZ3MuZDE2dGgnOntkOltbJ00nLDYuODQsLTIyLjUzXSxbJ2MnLDAuMjcsLTAuMTIsMC41NywtMC4wNiwwLjcyLDAuMTVdLFsnYycsMC4xNSwwLjE1LDAuMzMsMC44NywwLjQ1LDEuNTZdLFsnYycsMC4wNiwwLjMzLDAuMDYsMS4zNSwwLjAwLDEuNjVdLFsnYycsLTAuMDYsMC4zMywtMC4xNSwwLjc4LC0wLjI3LDEuMTFdLFsnYycsLTAuMTIsMC4zMywtMC40NSwwLjk2LC0wLjY2LDEuMzJdLFsnbCcsLTAuMTgsMC4yN10sWydsJywwLjA5LDAuMThdLFsnYycsMC40OCwxLjAyLDAuNzIsMi4yNSwwLjY5LDMuMzBdLFsnYycsLTAuMDYsMS4yMywtMC40MiwyLjI4LC0xLjI2LDMuNDVdLFsnYycsLTAuNTcsMC44NywtMC45OSwxLjMyLC0zLjAwLDMuMzldLFsnYycsLTEuNTYsMS41NiwtMi4yMiwyLjQwLC0yLjc2LDMuNDVdLFsnYycsLTAuNDIsMC44NCwtMC42NiwxLjgwLC0wLjY2LDIuNTVdLFsnbCcsMC4wMCwwLjE1XSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsLTAuMjEsMC4wMF0sWydsJywwLjAwLC03LjUwXSxbJ2wnLDAuMDAsLTcuNTBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMjEsMC4wMF0sWydsJywwLjAwLDEuMTRdLFsnbCcsMC4wMCwxLjExXSxbJ2wnLDAuMjcsLTAuMTVdLFsnYycsMS4xMSwtMC41NywxLjc3LC0wLjk5LDIuNTIsLTEuNDddLFsnYycsMi4zNywtMS41NiwzLjY5LC0zLjE1LDQuMDUsLTQuODNdLFsnYycsMC4wMywtMC4xOCwwLjAzLC0wLjM5LDAuMDMsLTAuNzhdLFsnYycsMC4wMCwtMC42MCwtMC4wMywtMC45MywtMC4yNCwtMS41MF0sWydjJywtMC4wNiwtMC4xOCwtMC4xMiwtMC4zOSwtMC4xNSwtMC40NV0sWydjJywtMC4wMywtMC4yNCwwLjEyLC0wLjQ4LDAuMzYsLTAuNjBdLFsneiddLFsnbScsLTAuNjMsNy41MF0sWydjJywtMC4wNiwtMC4xOCwtMC4xNSwtMC4zNiwtMC4xNSwtMC4zNl0sWydjJywtMC4wMywwLjAwLC0wLjAzLDAuMDMsLTAuMDYsMC4wNl0sWydjJywtMC4wNiwwLjEyLC0wLjk2LDEuMDIsLTEuOTUsMS45OF0sWydjJywtMC42MywwLjU3LC0xLjI2LDEuMTcsLTEuNDQsMS4zNV0sWydjJywtMS41MywxLjYyLC0yLjI4LDIuODUsLTIuNTUsNC4zMl0sWydjJywtMC4wMywwLjE4LC0wLjAzLDAuNTQsLTAuMDYsMC45OV0sWydsJywwLjAwLDAuNjldLFsnbCcsMC4xOCwtMC4wOV0sWydjJywwLjkzLC0wLjU0LDIuMTAsLTEuMjksMi44MiwtMS44M10sWydjJywwLjY5LC0wLjUxLDEuMDIsLTAuODEsMS41MywtMS4yOV0sWydjJywxLjg2LC0xLjg5LDIuMzcsLTMuNjYsMS42OCwtNS44Ml0sWyd6J11dLHc6OC40NzUsaDoyMi41OTF9LFxuXHRcdCdmbGFncy5kMzJuZCc6e2Q6W1snTScsNi44NCwtMjkuMTNdLFsnYycsMC4yNywtMC4xMiwwLjU3LC0wLjA2LDAuNzIsMC4xNV0sWydjJywwLjEyLDAuMTIsMC4yNywwLjYzLDAuMzYsMS4xMV0sWydjJywwLjMzLDEuNTksMC4wNiwzLjA2LC0wLjgxLDQuNDddLFsnbCcsLTAuMTgsMC4yN10sWydsJywwLjA5LDAuMTVdLFsnYycsMC4xMiwwLjI0LDAuMzMsMC42OSwwLjQ1LDEuMDVdLFsnYycsMC42MywxLjgzLDAuNDUsMy41NywtMC41Nyw1LjIyXSxbJ2wnLC0wLjE4LDAuMzBdLFsnbCcsMC4xNSwwLjI3XSxbJ2MnLDAuNDIsMC44NywwLjYwLDEuNzEsMC41NywyLjYxXSxbJ2MnLC0wLjA2LDEuMjksLTAuNDgsMi40NiwtMS4zNSwzLjc4XSxbJ2MnLC0wLjU0LDAuODEsLTAuOTMsMS4yOSwtMi40NiwzLjAwXSxbJ2MnLC0wLjUxLDAuNTQsLTEuMDUsMS4xNywtMS4yNiwxLjQxXSxbJ2MnLC0xLjU2LDEuODYsLTIuMjUsMy4zNiwtMi4zNyw1LjAxXSxbJ2wnLDAuMDAsMC4zM10sWydsJywtMC4yMSwwLjAwXSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsMC4wMCwtMTEuMjVdLFsnbCcsMC4wMCwtMTEuMjVdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMjEsMC4wMF0sWydsJywwLjAwLDEuMzVdLFsnbCcsMC4wMywxLjM1XSxbJ2wnLDAuNzgsLTAuMzldLFsnYycsMS4zOCwtMC42OSwyLjM0LC0xLjI2LDMuMjQsLTEuOTJdLFsnYycsMS4zOCwtMS4wMiwyLjI4LC0yLjEzLDIuNjQsLTMuMjFdLFsnYycsMC4xNSwtMC40OCwwLjE4LC0wLjcyLDAuMTgsLTEuMjldLFsnYycsMC4wMCwtMC41NywtMC4wNiwtMC45MCwtMC4yNCwtMS40N10sWydjJywtMC4wNiwtMC4xOCwtMC4xMiwtMC4zOSwtMC4xNSwtMC40NV0sWydjJywtMC4wMywtMC4yNCwwLjEyLC0wLjQ4LDAuMzYsLTAuNjBdLFsneiddLFsnbScsLTAuNjMsNy4yMF0sWydjJywtMC4wOSwtMC4xOCwtMC4xMiwtMC4yMSwtMC4xMiwtMC4xNV0sWydjJywtMC4wMywwLjA5LC0xLjAyLDEuMDgsLTIuMDQsMi4wNF0sWydjJywtMS4xNywxLjA4LC0xLjY1LDEuNTYsLTIuMDcsMi4wNF0sWydjJywtMC44NCwwLjk2LC0xLjM4LDEuODYsLTEuNjgsMi43Nl0sWydjJywtMC4yMSwwLjU3LC0wLjI3LDAuOTksLTAuMzAsMS42NV0sWydsJywwLjAwLDAuNTRdLFsnbCcsMC42NiwtMC4zM10sWydjJywzLjU3LC0xLjg2LDUuNDksLTMuNjksNS45NCwtNS43MF0sWydjJywwLjA2LC0wLjM5LDAuMDYsLTEuMjAsLTAuMDMsLTEuNjVdLFsnYycsLTAuMDYsLTAuMzksLTAuMjQsLTAuOTAsLTAuMzYsLTEuMjBdLFsneiddLFsnbScsLTAuMDYsNy4yMF0sWydjJywtMC4wNiwtMC4xNSwtMC4xMiwtMC4zMywtMC4xNSwtMC40NV0sWydsJywtMC4wNiwtMC4xOF0sWydsJywtMC4xOCwwLjIxXSxbJ2wnLC0xLjgzLDEuODNdLFsnYycsLTAuODcsMC45MCwtMS43NywxLjgwLC0xLjk1LDIuMDFdLFsnYycsLTEuMDgsMS4yOSwtMS42MiwyLjMxLC0xLjg5LDMuNTFdLFsnYycsLTAuMDYsMC4zMCwtMC4wNiwwLjUxLC0wLjA5LDAuOTNdLFsnbCcsMC4wMCwwLjU3XSxbJ2wnLDAuMDksLTAuMDZdLFsnYycsMC43NSwtMC40NSwxLjg5LC0xLjI2LDIuNTIsLTEuNzRdLFsnYycsMC44MSwtMC42NiwxLjc0LC0xLjUzLDIuMjIsLTIuMTZdLFsnYycsMS4yNiwtMS41MywxLjY4LC0zLjA2LDEuMzIsLTQuNDddLFsneiddXSx3OjguMzg1LGg6MjkuMTkxfSxcblx0XHQnZmxhZ3MuZDY0dGgnOntkOltbJ00nLDcuMDgsLTMyLjg4XSxbJ2MnLDAuMzAsLTAuMTIsMC42NiwtMC4wMywwLjc4LDAuMjRdLFsnYycsMC4xOCwwLjMzLDAuMjcsMi4xMCwwLjE1LDIuNjRdLFsnYycsLTAuMDksMC4zOSwtMC4yMSwwLjc4LC0wLjM5LDEuMDhdLFsnbCcsLTAuMTUsMC4zMF0sWydsJywwLjA5LDAuMjddLFsnYycsMC4wMywwLjEyLDAuMDksMC40NSwwLjEyLDAuNjldLFsnYycsMC4yNywxLjQ0LDAuMTgsMi41NSwtMC4zMCwzLjYwXSxbJ2wnLC0wLjEyLDAuMzNdLFsnbCcsMC4wNiwwLjQyXSxbJ2MnLDAuMjcsMS4zNSwwLjMzLDIuODIsMC4yMSwzLjYzXSxbJ2MnLC0wLjEyLDAuNjAsLTAuMzAsMS4yMywtMC41NywxLjgwXSxbJ2wnLC0wLjE1LDAuMjddLFsnbCcsMC4wMywwLjQyXSxbJ2MnLDAuMDYsMS4wMiwwLjA2LDIuNzAsMC4wMywzLjA2XSxbJ2MnLC0wLjE1LDEuNDcsLTAuNjYsMi43NiwtMS43NCw0LjQxXSxbJ2MnLC0wLjQ1LDAuNjksLTAuNzUsMS4xMSwtMS43NCwyLjM3XSxbJ2MnLC0xLjA1LDEuMzgsLTEuNTAsMS45OCwtMS45NSwyLjczXSxbJ2MnLC0wLjkzLDEuNTAsLTEuMzgsMi44MiwtMS40NCw0LjIwXSxbJ2wnLDAuMDAsMC40Ml0sWydsJywtMC4yMSwwLjAwXSxbJ2wnLC0wLjIxLDAuMDBdLFsnbCcsMC4wMCwtMTUuMDBdLFsnbCcsMC4wMCwtMTUuMDBdLFsnbCcsMC4yMSwwLjAwXSxbJ2wnLDAuMjEsMC4wMF0sWydsJywwLjAwLDEuODZdLFsnbCcsMC4wMCwxLjg5XSxbJ2MnLDAuMDAsMC4wMCwwLjIxLC0wLjAzLDAuNDUsLTAuMDldLFsnYycsMi4yMiwtMC4zOSw0LjA4LC0xLjExLDUuMTksLTIuMDFdLFsnYycsMC42MywtMC41NCwxLjAyLC0xLjE0LDEuMjAsLTEuODBdLFsnYycsMC4wNiwtMC4zMCwwLjA2LC0xLjE0LC0wLjAzLC0xLjY1XSxbJ2MnLC0wLjAzLC0wLjE4LC0wLjA2LC0wLjM5LC0wLjA5LC0wLjQ4XSxbJ2MnLC0wLjAzLC0wLjI0LDAuMTIsLTAuNDgsMC4zNiwtMC42MF0sWyd6J10sWydtJywtMC40NSw2LjE1XSxbJ2MnLC0wLjAzLC0wLjE4LC0wLjA2LC0wLjQyLC0wLjA2LC0wLjU0XSxbJ2wnLC0wLjAzLC0wLjE4XSxbJ2wnLC0wLjMzLDAuMzBdLFsnYycsLTAuNDIsMC4zNiwtMC44NywwLjcyLC0xLjY4LDEuMjldLFsnYycsLTEuOTgsMS4zOCwtMi4yNSwxLjU5LC0yLjg1LDIuMTZdLFsnYycsLTAuNzUsMC42OSwtMS4yMywxLjQ0LC0xLjQ3LDIuMTldLFsnYycsLTAuMTUsMC40NSwtMC4xOCwwLjYzLC0wLjIxLDEuMzVdLFsnbCcsMC4wMCwwLjY2XSxbJ2wnLDAuMzksLTAuMThdLFsnYycsMS44MywtMC45MCwzLjQ1LC0xLjk1LDQuNDcsLTIuOTFdLFsnYycsMC45MywtMC45MCwxLjUzLC0xLjgzLDEuNzQsLTIuODJdLFsnYycsMC4wNiwtMC4zMywwLjA2LC0wLjg3LDAuMDMsLTEuMzJdLFsneiddLFsnbScsLTAuMjcsNC44Nl0sWydjJywtMC4wMywtMC4yMSwtMC4wNiwtMC4zNiwtMC4wNiwtMC4zNl0sWydjJywwLjAwLC0wLjAzLC0wLjEyLDAuMDksLTAuMjQsMC4yNF0sWydjJywtMC4zOSwwLjQ4LC0wLjk5LDEuMDgsLTIuMTYsMi4xOV0sWydjJywtMS40NywxLjM4LC0xLjkyLDEuODMsLTIuNDYsMi40OV0sWydjJywtMC42NiwwLjg3LC0xLjA4LDEuNzQsLTEuMjksMi41OF0sWydjJywtMC4wOSwwLjQyLC0wLjE1LDAuODcsLTAuMTUsMS40NF0sWydsJywwLjAwLDAuNTRdLFsnbCcsMC40OCwtMC4zM10sWydjJywxLjUwLC0xLjAyLDIuNTgsLTEuODksMy41MSwtMi44Ml0sWydjJywxLjQ3LC0xLjQ3LDIuMjUsLTIuODUsMi40MCwtNC4yNl0sWydjJywwLjAzLC0wLjM5LDAuMDMsLTEuMTcsLTAuMDMsLTEuNzFdLFsneiddLFsnbScsLTAuNjYsNy42OF0sWydjJywwLjAzLC0wLjE1LDAuMDMsLTAuNjAsMC4wMywtMC45OV0sWydsJywwLjAwLC0wLjcyXSxbJ2wnLC0wLjI3LDAuMzNdLFsnbCcsLTEuNzQsMS45OF0sWydjJywtMS43NywxLjkyLC0yLjQzLDIuNzYsLTIuOTcsMy45MF0sWydjJywtMC41MSwxLjAyLC0wLjcyLDEuNzcsLTAuNzUsMi45MV0sWydjJywwLjAwLDAuNjMsMC4wMCwwLjYzLDAuMDYsMC42MF0sWydjJywwLjAzLC0wLjAzLDAuMzAsLTAuMjcsMC42MywtMC41NF0sWydjJywwLjY2LC0wLjYwLDEuODYsLTEuODAsMi4zMSwtMi4zMV0sWydjJywxLjY1LC0xLjg5LDIuNTIsLTMuNTQsMi43MCwtNS4xNl0sWyd6J11dLHc6OC40ODUsaDozMi45MzJ9LFxuXHRcdCdjbGVmcy5DJzp7ZDpbWydNJywwLjA2LC0xNC45NF0sWydsJywwLjA5LC0wLjA2XSxbJ2wnLDEuOTIsMC4wMF0sWydsJywxLjkyLDAuMDBdLFsnbCcsMC4wOSwwLjA2XSxbJ2wnLDAuMDYsMC4wOV0sWydsJywwLjAwLDE0Ljg1XSxbJ2wnLDAuMDAsMTQuODJdLFsnbCcsLTAuMDYsMC4wOV0sWydsJywtMC4wOSwwLjA2XSxbJ2wnLC0xLjkyLDAuMDBdLFsnbCcsLTEuOTIsMC4wMF0sWydsJywtMC4wOSwtMC4wNl0sWydsJywtMC4wNiwtMC4wOV0sWydsJywwLjAwLC0xNC44Ml0sWydsJywwLjAwLC0xNC44NV0sWyd6J10sWydtJyw1LjM3LDAuMDBdLFsnYycsMC4wOSwtMC4wNiwwLjA5LC0wLjA2LDAuNTcsLTAuMDZdLFsnYycsMC40NSwwLjAwLDAuNDUsMC4wMCwwLjU0LDAuMDZdLFsnbCcsMC4wNiwwLjA5XSxbJ2wnLDAuMDAsNy4xNF0sWydsJywwLjAwLDcuMTFdLFsnbCcsMC4wOSwtMC4wNl0sWydjJywwLjE4LC0wLjE4LDAuNzIsLTAuODQsMC45NiwtMS4yMF0sWydjJywwLjMwLC0wLjQ1LDAuNjYsLTEuMTcsMC44NCwtMS42NV0sWydjJywwLjM2LC0wLjkwLDAuNTcsLTEuODMsMC42MCwtMi43OV0sWydjJywwLjAzLC0wLjQ4LDAuMDMsLTAuNTQsMC4wOSwtMC42M10sWydjJywwLjEyLC0wLjE4LDAuMzYsLTAuMjEsMC41NCwtMC4xMl0sWydjJywwLjE4LDAuMDksMC4yMSwwLjE1LDAuMjQsMC42Nl0sWydjJywwLjA2LDAuODcsMC4yMSwxLjU2LDAuNTcsMi4yMl0sWydjJywwLjUxLDEuMDIsMS4yNiwxLjY4LDIuMjIsMS45Ml0sWydjJywwLjIxLDAuMDYsMC4zMywwLjA2LDAuNzgsMC4wNl0sWydjJywwLjQ1LDAuMDAsMC41NywwLjAwLDAuODQsLTAuMDZdLFsnYycsMC40NSwtMC4xMiwwLjgxLC0wLjMzLDEuMDgsLTAuNjBdLFsnYycsMC41NywtMC41NywwLjg3LC0xLjQxLDAuOTksLTIuODhdLFsnYycsMC4wNiwtMC41NCwwLjA2LC0zLjAwLDAuMDAsLTMuNTddLFsnYycsLTAuMjEsLTIuNTgsLTAuODQsLTMuODcsLTIuMTYsLTQuNTBdLFsnYycsLTAuNDgsLTAuMjEsLTEuMTcsLTAuMzYsLTEuNzcsLTAuMzZdLFsnYycsLTAuNjksMC4wMCwtMS4yOSwwLjI3LC0xLjUwLDAuNzJdLFsnYycsLTAuMDYsMC4xNSwtMC4wNiwwLjIxLC0wLjA2LDAuNDJdLFsnYycsMC4wMCwwLjI0LDAuMDAsMC4zMCwwLjA2LDAuNDVdLFsnYycsMC4xMiwwLjI0LDAuMjQsMC4zOSwwLjYzLDAuNjZdLFsnYycsMC40MiwwLjMwLDAuNTcsMC40OCwwLjY5LDAuNzJdLFsnYycsMC4wNiwwLjE1LDAuMDYsMC4yMSwwLjA2LDAuNDhdLFsnYycsMC4wMCwwLjM5LC0wLjAzLDAuNjMsLTAuMjEsMC45Nl0sWydjJywtMC4zMCwwLjYwLC0wLjg3LDEuMDgsLTEuNTAsMS4yNl0sWydjJywtMC4yNywwLjA2LC0wLjg3LDAuMDYsLTEuMTQsMC4wMF0sWydjJywtMC43OCwtMC4yNCwtMS40NCwtMC44NywtMS42NSwtMS42OF0sWydjJywtMC4xMiwtMC40MiwtMC4wOSwtMS4xNywwLjA5LC0xLjcxXSxbJ2MnLDAuNTEsLTEuNjUsMS45OCwtMi44MiwzLjgxLC0zLjA5XSxbJ2MnLDAuODQsLTAuMDksMi40NiwwLjAzLDMuNTEsMC4yN10sWydjJywyLjIyLDAuNTcsMy42OSwxLjgwLDQuNDQsMy43NV0sWydjJywwLjM2LDAuOTMsMC41NywyLjEzLDAuNTcsMy4zNl0sWydjJywwLjAwLDEuNDQsLTAuNDgsMi43MywtMS4zOCwzLjgxXSxbJ2MnLC0xLjI2LDEuNTAsLTMuMjcsMi40MywtNS4yOCwyLjQzXSxbJ2MnLC0wLjQ4LDAuMDAsLTAuNTEsMC4wMCwtMC43NSwtMC4wOV0sWydjJywtMC4xNSwtMC4wMywtMC40OCwtMC4yMSwtMC43OCwtMC4zNl0sWydjJywtMC42OSwtMC4zNiwtMC44NywtMC40MiwtMS4yNiwtMC40Ml0sWydjJywtMC4yNywwLjAwLC0wLjMwLDAuMDAsLTAuNTEsMC4wOV0sWydjJywtMC41NywwLjMwLC0wLjgxLDAuOTAsLTAuODEsMi4xMF0sWydjJywwLjAwLDEuMjMsMC4yNCwxLjgzLDAuODEsMi4xM10sWydjJywwLjIxLDAuMDksMC4yNCwwLjA5LDAuNTEsMC4wOV0sWydjJywwLjM5LDAuMDAsMC41NywtMC4wNiwxLjI2LC0wLjQyXSxbJ2MnLDAuMzAsLTAuMTUsMC42MywtMC4zMywwLjc4LC0wLjM2XSxbJ2MnLDAuMjQsLTAuMDksMC4yNywtMC4wOSwwLjc1LC0wLjA5XSxbJ2MnLDIuMDEsMC4wMCw0LjAyLDAuOTMsNS4yOCwyLjQwXSxbJ2MnLDAuOTAsMS4xMSwxLjM4LDIuNDAsMS4zOCwzLjg0XSxbJ2MnLDAuMDAsMS41MCwtMC4zMCwyLjg4LC0wLjg0LDMuOTZdLFsnYycsLTAuNzgsMS41OSwtMi4xOSwyLjY0LC00LjE3LDMuMTVdLFsnYycsLTEuMDUsMC4yNCwtMi42NywwLjM2LC0zLjUxLDAuMjddLFsnYycsLTEuODMsLTAuMjcsLTMuMzAsLTEuNDQsLTMuODEsLTMuMDldLFsnYycsLTAuMTgsLTAuNTQsLTAuMjEsLTEuMjksLTAuMDksLTEuNzRdLFsnYycsMC4xNSwtMC42MCwwLjYzLC0xLjIwLDEuMjMsLTEuNDddLFsnYycsMC4zNiwtMC4xOCwwLjU3LC0wLjIxLDAuOTksLTAuMjFdLFsnYycsMC40MiwwLjAwLDAuNjMsMC4wMywxLjAyLDAuMjFdLFsnYycsMC40MiwwLjIxLDAuODQsMC42MywxLjA1LDEuMDVdLFsnYycsMC4xOCwwLjM2LDAuMjEsMC42MCwwLjIxLDAuOTZdLFsnYycsMC4wMCwwLjMwLDAuMDAsMC4zNiwtMC4wNiwwLjUxXSxbJ2MnLC0wLjEyLDAuMjQsLTAuMjcsMC40MiwtMC42OSwwLjcyXSxbJ2MnLC0wLjU3LDAuNDIsLTAuNjksMC42MywtMC42OSwxLjA4XSxbJ2MnLDAuMDAsMC4yNCwwLjAwLDAuMzAsMC4wNiwwLjQ1XSxbJ2MnLDAuMTIsMC4yMSwwLjMwLDAuMzksMC41NywwLjU0XSxbJ2MnLDAuNDIsMC4xOCwwLjg3LDAuMjEsMS41MywwLjE1XSxbJ2MnLDEuMDgsLTAuMTUsMS44MCwtMC41NywyLjM0LC0xLjMyXSxbJ2MnLDAuNTQsLTAuNzUsMC44NCwtMS44MywwLjk5LC0zLjUxXSxbJ2MnLDAuMDYsLTAuNTcsMC4wNiwtMy4wMywwLjAwLC0zLjU3XSxbJ2MnLC0wLjEyLC0xLjQ3LC0wLjQyLC0yLjMxLC0wLjk5LC0yLjg4XSxbJ2MnLC0wLjI3LC0wLjI3LC0wLjYzLC0wLjQ4LC0xLjA4LC0wLjYwXSxbJ2MnLC0wLjI3LC0wLjA2LC0wLjM5LC0wLjA2LC0wLjg0LC0wLjA2XSxbJ2MnLC0wLjQ1LDAuMDAsLTAuNTcsMC4wMCwtMC43OCwwLjA2XSxbJ2MnLC0xLjE0LDAuMjcsLTIuMDEsMS4xNywtMi40NiwyLjQ5XSxbJ2MnLC0wLjIxLDAuNTcsLTAuMzAsMC45OSwtMC4zMywxLjY1XSxbJ2MnLC0wLjAzLDAuNTEsLTAuMDYsMC41NywtMC4yNCwwLjY2XSxbJ2MnLC0wLjEyLDAuMDYsLTAuMjcsMC4wNiwtMC4zOSwwLjAwXSxbJ2MnLC0wLjIxLC0wLjA5LC0wLjIxLC0wLjE1LC0wLjI0LC0wLjc1XSxbJ2MnLC0wLjA5LC0xLjkyLC0wLjc4LC0zLjcyLC0yLjAxLC01LjE5XSxbJ2MnLC0wLjE4LC0wLjIxLC0wLjM2LC0wLjQyLC0wLjM5LC0wLjQ1XSxbJ2wnLC0wLjA5LC0wLjA2XSxbJ2wnLDAuMDAsNy4xMV0sWydsJywwLjAwLDcuMTRdLFsnbCcsLTAuMDYsMC4wOV0sWydjJywtMC4wOSwwLjA2LC0wLjA5LDAuMDYsLTAuNTQsMC4wNl0sWydjJywtMC40OCwwLjAwLC0wLjQ4LDAuMDAsLTAuNTcsLTAuMDZdLFsnbCcsLTAuMDYsLTAuMDldLFsnbCcsMC4wMCwtMTQuODJdLFsnbCcsMC4wMCwtMTQuODVdLFsneiddXSx3OjIwLjMxLGg6MjkuOTd9LFxuXHRcdCdjbGVmcy5GJzp7ZDpbWydNJyw2LjMwLC03LjgwXSxbJ2MnLDAuMzYsLTAuMDMsMS42NSwwLjAwLDIuMTMsMC4wM10sWydjJywzLjYwLDAuNDIsNi4wMywyLjEwLDYuOTMsNC44Nl0sWydjJywwLjI3LDAuODQsMC4zNiwxLjUwLDAuMzYsMi41OF0sWydjJywwLjAwLDAuOTAsLTAuMDMsMS4zNSwtMC4xOCwyLjE2XSxbJ2MnLC0wLjc4LDMuNzgsLTMuNTQsNy4wOCwtOC4zNyw5Ljk2XSxbJ2MnLC0xLjc0LDEuMDUsLTMuODcsMi4xMywtNi4xOCwzLjEyXSxbJ2MnLC0wLjM5LDAuMTgsLTAuNzUsMC4zMywtMC44MSwwLjM2XSxbJ2MnLC0wLjA2LDAuMDMsLTAuMTUsMC4wNiwtMC4xOCwwLjA2XSxbJ2MnLC0wLjE1LDAuMDAsLTAuMzMsLTAuMTgsLTAuMzMsLTAuMzNdLFsnYycsMC4wMCwtMC4xNSwwLjA2LC0wLjIxLDAuNTEsLTAuNDhdLFsnYycsMy4wMCwtMS43Nyw1LjEzLC0zLjIxLDYuODQsLTQuNzRdLFsnYycsMC41MSwtMC40NSwxLjU5LC0xLjUwLDEuOTUsLTEuOTVdLFsnYycsMS44OSwtMi4xOSwyLjg4LC00LjMyLDMuMTUsLTYuNzhdLFsnYycsMC4wNiwtMC40MiwwLjA2LC0xLjc3LDAuMDAsLTIuMTldLFsnYycsLTAuMjQsLTIuMDEsLTAuOTMsLTMuNjMsLTIuMDQsLTQuNzFdLFsnYycsLTAuNjMsLTAuNjMsLTEuMjksLTEuMDIsLTIuMDcsLTEuMjBdLFsnYycsLTEuNjIsLTAuMzksLTMuMzYsMC4xNSwtNC41NiwxLjQ0XSxbJ2MnLC0wLjU0LDAuNjAsLTEuMDUsMS40NywtMS4zMiwyLjIyXSxbJ2wnLC0wLjA5LDAuMjFdLFsnbCcsMC4yNCwtMC4xMl0sWydjJywwLjM5LC0wLjIxLDAuNjMsLTAuMjQsMS4xMSwtMC4yNF0sWydjJywwLjMwLDAuMDAsMC40NSwwLjAwLDAuNjYsMC4wNl0sWydjJywxLjkyLDAuNDgsMi44NSwyLjU1LDEuOTUsNC4zOF0sWydjJywtMC40NSwwLjk5LC0xLjQxLDEuNjIsLTIuNDYsMS43MV0sWydjJywtMS40NywwLjA5LC0yLjkxLC0wLjg3LC0zLjM5LC0yLjI1XSxbJ2MnLC0wLjE4LC0wLjU3LC0wLjIxLC0xLjMyLC0wLjAzLC0yLjI4XSxbJ2MnLDAuMzksLTIuMjUsMS44MywtNC4yMCwzLjgxLC01LjE5XSxbJ2MnLDAuNjksLTAuMzYsMS41OSwtMC42MCwyLjM3LC0wLjY5XSxbJ3onXSxbJ20nLDExLjU4LDIuNTJdLFsnYycsMC44NCwtMC4yMSwxLjcxLDAuMzAsMS44OSwxLjE0XSxbJ2MnLDAuMzAsMS4xNywtMC43MiwyLjE5LC0xLjg5LDEuODldLFsnYycsLTAuOTksLTAuMjEsLTEuNTAsLTEuMzIsLTEuMDIsLTIuMjVdLFsnYycsMC4xOCwtMC4zOSwwLjYwLC0wLjY5LDEuMDIsLTAuNzhdLFsneiddLFsnbScsMC4wMCw3LjUwXSxbJ2MnLDAuODQsLTAuMjEsMS43MSwwLjMwLDEuODksMS4xNF0sWydjJywwLjIxLDAuODcsLTAuMzAsMS43MSwtMS4xNCwxLjg5XSxbJ2MnLC0wLjg3LDAuMjEsLTEuNzEsLTAuMzAsLTEuODksLTEuMTRdLFsnYycsLTAuMjEsLTAuODQsMC4zMCwtMS43MSwxLjE0LC0xLjg5XSxbJ3onXV0sdzoyMC4xNTMsaDoyMy4xNDJ9LFxuXHRcdCdjbGVmcy5HJzp7ZDpbWydNJyw5LjY5LC0zNy40MV0sWydjJywwLjA5LC0wLjA5LDAuMjQsLTAuMDYsMC4zNiwwLjAwXSxbJ2MnLDAuMTIsMC4wOSwwLjU3LDAuNjAsMC45NiwxLjExXSxbJ2MnLDEuNzcsMi4zNCwzLjIxLDUuODUsMy41Nyw4LjczXSxbJ2MnLDAuMjEsMS41NiwwLjAzLDMuMjcsLTAuNDUsNC44Nl0sWydjJywtMC42OSwyLjMxLC0xLjkyLDQuNDcsLTQuMjMsNy40NF0sWydjJywtMC4zMCwwLjM5LC0wLjU3LDAuNzIsLTAuNjAsMC43NV0sWydjJywtMC4wMywwLjA2LDAuMDAsMC4xNSwwLjE4LDAuNzhdLFsnYycsMC41NCwxLjY4LDEuMzgsNC40NCwxLjY4LDUuNDldLFsnbCcsMC4wOSwwLjQyXSxbJ2wnLDAuMzksMC4wMF0sWydjJywxLjQ3LDAuMDksMi43NiwwLjUxLDMuOTYsMS4yOV0sWydjJywxLjgzLDEuMjMsMy4wNiwzLjIxLDMuMzksNS41Ml0sWydjJywwLjA5LDAuNDUsMC4xMiwxLjI5LDAuMDYsMS43NF0sWydjJywtMC4wOSwxLjAyLC0wLjMzLDEuODMsLTAuNzUsMi43M10sWydjJywtMC44NCwxLjcxLC0yLjI4LDMuMDYsLTQuMDIsMy43Ml0sWydsJywtMC4zMywwLjEyXSxbJ2wnLDAuMDMsMS4yNl0sWydjJywwLjAwLDEuNzQsLTAuMDYsMy42MywtMC4yMSw0LjYyXSxbJ2MnLC0wLjQ1LDMuMDYsLTIuMTksNS40OSwtNC40Nyw2LjIxXSxbJ2MnLC0wLjU3LDAuMTgsLTAuOTAsMC4yMSwtMS41OSwwLjIxXSxbJ2MnLC0wLjY5LDAuMDAsLTEuMDIsLTAuMDMsLTEuNjUsLTAuMjFdLFsnYycsLTEuMTQsLTAuMjcsLTIuMTMsLTAuODQsLTIuOTQsLTEuNjVdLFsnYycsLTAuOTksLTAuOTksLTEuNTYsLTIuMTYsLTEuNzEsLTMuNTRdLFsnYycsLTAuMDksLTAuODEsMC4wNiwtMS41MywwLjQ1LC0yLjEzXSxbJ2MnLDAuNjMsLTAuOTksMS44MywtMS41NiwzLjAwLC0xLjUzXSxbJ2MnLDEuNTAsMC4wOSwyLjY0LDEuMzIsMi43MywyLjk0XSxbJ2MnLDAuMDYsMS40NywtMC45MywyLjcwLC0yLjM3LDIuOTddLFsnYycsLTAuNDUsMC4wNiwtMC44NCwwLjAzLC0xLjI5LC0wLjA5XSxbJ2wnLC0wLjIxLC0wLjA5XSxbJ2wnLDAuMDksMC4xMl0sWydjJywwLjM5LDAuNTQsMC43OCwwLjkzLDEuMzIsMS4yNl0sWydjJywxLjM1LDAuODcsMy4wNiwxLjAyLDQuMzUsMC4zNl0sWydjJywxLjQ0LC0wLjcyLDIuNTIsLTIuMjgsMi45NywtNC4zNV0sWydjJywwLjE1LC0wLjY2LDAuMjQsLTEuNTAsMC4zMCwtMy4wM10sWydjJywwLjAzLC0wLjg0LDAuMDMsLTIuOTQsMC4wMCwtMy4wMF0sWydjJywtMC4wMywwLjAwLC0wLjE4LDAuMDAsLTAuMzYsMC4wM10sWydjJywtMC42NiwwLjEyLC0wLjk5LDAuMTIsLTEuODMsMC4xMl0sWydjJywtMS4wNSwwLjAwLC0xLjcxLC0wLjA2LC0yLjYxLC0wLjMwXSxbJ2MnLC00LjAyLC0wLjk5LC03LjExLC00LjM1LC03LjgwLC04LjQ2XSxbJ2MnLC0wLjEyLC0wLjY2LC0wLjEyLC0wLjk5LC0wLjEyLC0xLjgzXSxbJ2MnLDAuMDAsLTAuODQsMC4wMCwtMS4xNCwwLjE1LC0xLjkyXSxbJ2MnLDAuMzYsLTIuMjgsMS40MSwtNC42MiwzLjMwLC03LjI5XSxbJ2wnLDIuNzksLTMuNjBdLFsnYycsMC41NCwtMC42NiwwLjk2LC0xLjIwLDAuOTYsLTEuMjNdLFsnYycsMC4wMCwtMC4wMywtMC4wOSwtMC4zMywtMC4xOCwtMC42OV0sWydjJywtMC45NiwtMy4yMSwtMS40MSwtNS4yOCwtMS41OSwtNy42OF0sWydjJywtMC4xMiwtMS4zOCwtMC4xNSwtMy4wOSwtMC4wNiwtMy45Nl0sWydjJywwLjMzLC0yLjY3LDEuMzgsLTUuMDcsMy4xMiwtNy4wOF0sWydjJywwLjM2LC0wLjQyLDAuOTksLTEuMDUsMS4xNywtMS4xNF0sWyd6J10sWydtJywyLjAxLDQuNzFdLFsnYycsLTAuMTUsLTAuMzAsLTAuMzAsLTAuNTQsLTAuMzAsLTAuNTRdLFsnYycsLTAuMDMsMC4wMCwtMC4xOCwwLjA5LC0wLjMwLDAuMjFdLFsnYycsLTIuNDAsMS43NCwtMy44Nyw0LjIwLC00LjI2LDcuMTFdLFsnYycsLTAuMDYsMC41NCwtMC4wNiwxLjQxLC0wLjAzLDEuODldLFsnYycsMC4wOSwxLjI5LDAuNDgsMy4xMiwxLjA4LDUuMjJdLFsnYycsMC4xNSwwLjQyLDAuMjQsMC43OCwwLjI0LDAuODFdLFsnYycsMC4wMCwwLjAzLDAuODQsLTEuMTEsMS4yMywtMS42OF0sWydjJywxLjg5LC0yLjczLDIuODgsLTUuMDcsMy4xNSwtNy41M10sWydjJywwLjA5LC0wLjU3LDAuMTIsLTEuNzQsMC4wNiwtMi4zN10sWydjJywtMC4wOSwtMS4yMywtMC4yNywtMS45MiwtMC44NywtMy4xMl0sWyd6J10sWydtJywtMi45NCwyMC43MF0sWydjJywtMC4yMSwtMC43MiwtMC4zOSwtMS4zMiwtMC40MiwtMS4zMl0sWydjJywwLjAwLDAuMDAsLTEuMjAsMS40NywtMS44NiwyLjM3XSxbJ2MnLC0yLjc5LDMuNjMsLTQuMDIsNi4zMCwtNC4zNSw5LjMwXSxbJ2MnLC0wLjAzLDAuMjEsLTAuMDMsMC42OSwtMC4wMywxLjA4XSxbJ2MnLDAuMDAsMC42OSwwLjAwLDAuNzUsMC4wNiwxLjExXSxbJ2MnLDAuMTIsMC41NCwwLjI3LDAuOTksMC41MSwxLjQ3XSxbJ2MnLDAuNjksMS4zOCwxLjgzLDIuNTUsMy40MiwzLjQyXSxbJ2MnLDAuOTYsMC41NCwyLjA3LDAuOTAsMy4yMSwxLjA4XSxbJ2MnLDAuNzgsMC4xMiwyLjA0LDAuMTIsMi45NCwtMC4wM10sWydjJywwLjUxLC0wLjA2LDAuNDUsLTAuMDMsMC40MiwtMC4zMF0sWydjJywtMC4yNCwtMy4zMywtMC43MiwtNi4zMywtMS42MiwtMTAuMDhdLFsnYycsLTAuMDksLTAuMzksLTAuMTgsLTAuNzUsLTAuMTgsLTAuNzhdLFsnYycsLTAuMDMsLTAuMDMsLTAuNDIsMC4wMCwtMC44MSwwLjA5XSxbJ2MnLC0wLjkwLDAuMTgsLTEuNjUsMC41NywtMi4yMiwxLjE0XSxbJ2MnLC0wLjcyLDAuNzIsLTEuMDgsMS42NSwtMS4wNSwyLjY0XSxbJ2MnLDAuMDYsMC45NiwwLjQ4LDEuODMsMS4yMywyLjU4XSxbJ2MnLDAuMzYsMC4zNiwwLjcyLDAuNjMsMS4xNywwLjkwXSxbJ2MnLDAuMzMsMC4xOCwwLjM2LDAuMjEsMC40MiwwLjMzXSxbJ2MnLDAuMTgsMC40MiwtMC4xOCwwLjkwLC0wLjYwLDAuODddLFsnYycsLTAuMTgsLTAuMDMsLTAuODQsLTAuMzYsLTEuMjYsLTAuNjNdLFsnYycsLTAuNzgsLTAuNTEsLTEuMzgsLTEuMTEsLTEuODYsLTEuODNdLFsnYycsLTEuNzcsLTIuNzAsLTAuOTksLTYuNDIsMS43MSwtOC4xOV0sWydjJywwLjMwLC0wLjIxLDAuODEsLTAuNDgsMS4xNywtMC42M10sWydjJywwLjMwLC0wLjA5LDEuMDIsLTAuMzAsMS4xNCwtMC4zMF0sWydjJywwLjA2LDAuMDAsMC4wOSwwLjAwLDAuMDksLTAuMDNdLFsnYycsMC4wMywtMC4wMywtMC41MSwtMS45MiwtMS4yMywtNC4yNl0sWyd6J10sWydtJywzLjc4LDcuNDFdLFsnYycsLTAuMTgsLTAuMDMsLTAuMzYsLTAuMDYsLTAuMzksLTAuMDZdLFsnYycsLTAuMDMsMC4wMCwwLjAwLDAuMjEsMC4xOCwxLjAyXSxbJ2MnLDAuNzUsMy4xOCwxLjI2LDYuMzAsMS41MCw5LjA5XSxbJ2MnLDAuMDYsMC43MiwwLjAwLDAuNjksMC41MSwwLjQyXSxbJ2MnLDAuNzgsLTAuMzYsMS40NCwtMC45NiwxLjk4LC0xLjc3XSxbJ2MnLDEuMDgsLTEuNjIsMS4yMCwtMy42OSwwLjMwLC01LjU1XSxbJ2MnLC0wLjgxLC0xLjYyLC0yLjMxLC0yLjc5LC00LjA4LC0zLjE1XSxbJ3onXV0sdzoxOS4wNTEsaDo1Ny4wNTd9LFxuXHRcdCdjbGVmcy5wZXJjJzp7ZDpbWydNJyw1LjA3LC03LjQ0XSxbJ2wnLDAuMDksLTAuMDZdLFsnbCcsMS41MywwLjAwXSxbJ2wnLDEuNTMsMC4wMF0sWydsJywwLjA5LDAuMDZdLFsnbCcsMC4wNiwwLjA5XSxbJ2wnLDAuMDAsNy4zNV0sWydsJywwLjAwLDcuMzJdLFsnbCcsLTAuMDYsMC4wOV0sWydsJywtMC4wOSwwLjA2XSxbJ2wnLC0xLjUzLDAuMDBdLFsnbCcsLTEuNTMsMC4wMF0sWydsJywtMC4wOSwtMC4wNl0sWydsJywtMC4wNiwtMC4wOV0sWydsJywwLjAwLC03LjMyXSxbJ2wnLDAuMDAsLTcuMzVdLFsneiddLFsnbScsNi42MywwLjAwXSxbJ2wnLDAuMDksLTAuMDZdLFsnbCcsMS41MywwLjAwXSxbJ2wnLDEuNTMsMC4wMF0sWydsJywwLjA5LDAuMDZdLFsnbCcsMC4wNiwwLjA5XSxbJ2wnLDAuMDAsNy4zNV0sWydsJywwLjAwLDcuMzJdLFsnbCcsLTAuMDYsMC4wOV0sWydsJywtMC4wOSwwLjA2XSxbJ2wnLC0xLjUzLDAuMDBdLFsnbCcsLTEuNTMsMC4wMF0sWydsJywtMC4wOSwtMC4wNl0sWydsJywtMC4wNiwtMC4wOV0sWydsJywwLjAwLC03LjMyXSxbJ2wnLDAuMDAsLTcuMzVdLFsneiddXSx3OjkuOTksaDoxNC45N30sXG5cdFx0J3RpbWVzaWcuY29tbW9uJzp7ZDpbWydNJyw2LjY2LC03LjgzXSxbJ2MnLDAuNzIsLTAuMDYsMS40MSwtMC4wMywxLjk4LDAuMDldLFsnYycsMS4yMCwwLjI3LDIuMzQsMC45NiwzLjA5LDEuOTJdLFsnYycsMC42MywwLjgxLDEuMDgsMS44NiwxLjE0LDIuNzNdLFsnYycsMC4wNiwxLjAyLC0wLjUxLDEuOTIsLTEuNDQsMi4yMl0sWydjJywtMC4yNCwwLjA5LC0wLjMwLDAuMDksLTAuNjMsMC4wOV0sWydjJywtMC4zMywwLjAwLC0wLjQyLDAuMDAsLTAuNjMsLTAuMDZdLFsnYycsLTAuNjYsLTAuMjQsLTEuMTQsLTAuNjMsLTEuNDEsLTEuMjBdLFsnYycsLTAuMTUsLTAuMzAsLTAuMjEsLTAuNTEsLTAuMjQsLTAuOTBdLFsnYycsLTAuMDYsLTEuMDgsMC41NywtMi4wNCwxLjU2LC0yLjM3XSxbJ2MnLDAuMTgsLTAuMDYsMC4yNywtMC4wNiwwLjYzLC0wLjA2XSxbJ2wnLDAuNDUsMC4wMF0sWydjJywwLjA2LDAuMDMsMC4wOSwwLjAzLDAuMDksMC4wMF0sWydjJywwLjAwLDAuMDAsLTAuMDksLTAuMTIsLTAuMjQsLTAuMjddLFsnYycsLTEuMDIsLTEuMTEsLTIuNTUsLTEuNjgsLTQuMDgsLTEuNTBdLFsnYycsLTEuMjksMC4xNSwtMi4wNCwwLjY5LC0yLjQwLDEuNzRdLFsnYycsLTAuMzYsMC45MywtMC40MiwxLjg5LC0wLjQyLDUuMzddLFsnYycsMC4wMCwyLjk3LDAuMDYsMy45NiwwLjI0LDQuNzddLFsnYycsMC4yNCwxLjA4LDAuNjMsMS42OCwxLjQxLDIuMDddLFsnYycsMC44MSwwLjM5LDIuMTYsMC40NSwzLjE4LDAuMDldLFsnYycsMS4yOSwtMC40NSwyLjM3LC0xLjUzLDMuMDMsLTIuOTddLFsnYycsMC4xNSwtMC4zMywwLjMzLC0wLjg3LDAuMzksLTEuMTddLFsnYycsMC4wOSwtMC4yNCwwLjE1LC0wLjM2LDAuMzAsLTAuMzldLFsnYycsMC4yMSwtMC4wMywwLjQyLDAuMTUsMC4zOSwwLjM2XSxbJ2MnLC0wLjA2LDAuMzksLTAuNDIsMS4zOCwtMC42OSwxLjg5XSxbJ2MnLC0wLjk2LDEuODAsLTIuNDksMi45NCwtNC4yMywzLjE4XSxbJ2MnLC0wLjk5LDAuMTIsLTIuNTgsLTAuMDYsLTMuNjMsLTAuNDVdLFsnYycsLTAuOTYsLTAuMzYsLTEuNzEsLTAuODQsLTIuNDAsLTEuNTBdLFsnYycsLTEuMTEsLTEuMTEsLTEuODAsLTIuNjEsLTIuMDQsLTQuNTZdLFsnYycsLTAuMDYsLTAuNjAsLTAuMDYsLTIuMDEsMC4wMCwtMi42MV0sWydjJywwLjI0LC0xLjk1LDAuOTAsLTMuNDUsMi4wMSwtNC41Nl0sWydjJywwLjY5LC0wLjY2LDEuNDQsLTEuMTEsMi4zNywtMS40N10sWydjJywwLjYzLC0wLjI0LDEuNDcsLTAuNDIsMi4yMiwtMC40OF0sWyd6J11dLHc6MTMuMDM4LGg6MTUuNjg5fSxcblx0XHQndGltZXNpZy5jdXQnOntkOltbJ00nLDYuMjQsLTEwLjQ0XSxbJ2MnLDAuMDksLTAuMDYsMC4wOSwtMC4wNiwwLjQ4LC0wLjA2XSxbJ2MnLDAuMzYsMC4wMCwwLjM2LDAuMDAsMC40NSwwLjA2XSxbJ2wnLDAuMDYsMC4wOV0sWydsJywwLjAwLDEuMjNdLFsnbCcsMC4wMCwxLjI2XSxbJ2wnLDAuMjcsMC4wMF0sWydjJywxLjI2LDAuMDAsMi40OSwwLjQ1LDMuNDgsMS4yOV0sWydjJywxLjA1LDAuODcsMS44MCwyLjI4LDEuODksMy40OF0sWydjJywwLjA2LDEuMDIsLTAuNTEsMS45MiwtMS40NCwyLjIyXSxbJ2MnLC0wLjI0LDAuMDksLTAuMzAsMC4wOSwtMC42MywwLjA5XSxbJ2MnLC0wLjMzLDAuMDAsLTAuNDIsMC4wMCwtMC42MywtMC4wNl0sWydjJywtMC42NiwtMC4yNCwtMS4xNCwtMC42MywtMS40MSwtMS4yMF0sWydjJywtMC4xNSwtMC4zMCwtMC4yMSwtMC41MSwtMC4yNCwtMC45MF0sWydjJywtMC4wNiwtMS4wOCwwLjU3LC0yLjA0LDEuNTYsLTIuMzddLFsnYycsMC4xOCwtMC4wNiwwLjI3LC0wLjA2LDAuNjMsLTAuMDZdLFsnbCcsMC40NSwwLjAwXSxbJ2MnLDAuMDYsMC4wMywwLjA5LDAuMDMsMC4wOSwwLjAwXSxbJ2MnLDAuMDAsLTAuMDMsLTAuNDUsLTAuNTEsLTAuNjYsLTAuNjldLFsnYycsLTAuODcsLTAuNjksLTEuODMsLTEuMDUsLTIuOTQsLTEuMTFdLFsnbCcsLTAuNDIsMC4wMF0sWydsJywwLjAwLDcuMTddLFsnbCcsMC4wMCw3LjE0XSxbJ2wnLDAuNDIsMC4wMF0sWydjJywwLjY5LC0wLjAzLDEuMjMsLTAuMTgsMS44NiwtMC41MV0sWydjJywxLjA1LC0wLjUxLDEuODksLTEuNDcsMi40NiwtMi43MF0sWydjJywwLjE1LC0wLjMzLDAuMzMsLTAuODcsMC4zOSwtMS4xN10sWydjJywwLjA5LC0wLjI0LDAuMTUsLTAuMzYsMC4zMCwtMC4zOV0sWydjJywwLjIxLC0wLjAzLDAuNDIsMC4xNSwwLjM5LDAuMzZdLFsnYycsLTAuMDMsMC4yNCwtMC4yMSwwLjc4LC0wLjM5LDEuMjBdLFsnYycsLTAuOTYsMi4zNywtMi45NCwzLjkwLC01LjEzLDMuOTBdLFsnbCcsLTAuMzAsMC4wMF0sWydsJywwLjAwLDEuMjZdLFsnbCcsMC4wMCwxLjIzXSxbJ2wnLC0wLjA2LDAuMDldLFsnYycsLTAuMDksMC4wNiwtMC4wOSwwLjA2LC0wLjQ1LDAuMDZdLFsnYycsLTAuMzksMC4wMCwtMC4zOSwwLjAwLC0wLjQ4LC0wLjA2XSxbJ2wnLC0wLjA2LC0wLjA5XSxbJ2wnLDAuMDAsLTEuMjldLFsnbCcsMC4wMCwtMS4yOV0sWydsJywtMC4yMSwtMC4wM10sWydjJywtMS4yMywtMC4yMSwtMi4zMSwtMC42MywtMy4yMSwtMS4yOV0sWydjJywtMC4xNSwtMC4wOSwtMC40NSwtMC4zNiwtMC42NiwtMC41N10sWydjJywtMS4xMSwtMS4xMSwtMS44MCwtMi42MSwtMi4wNCwtNC41Nl0sWydjJywtMC4wNiwtMC42MCwtMC4wNiwtMi4wMSwwLjAwLC0yLjYxXSxbJ2MnLDAuMjQsLTEuOTUsMC45MywtMy40NSwyLjA0LC00LjU5XSxbJ2MnLDAuNDIsLTAuMzksMC43OCwtMC42NiwxLjI2LC0wLjkzXSxbJ2MnLDAuNzUsLTAuNDUsMS42NSwtMC43NSwyLjYxLC0wLjkwXSxbJ2wnLDAuMjEsLTAuMDNdLFsnbCcsMC4wMCwtMS4yOV0sWydsJywwLjAwLC0xLjI5XSxbJ3onXSxbJ20nLC0wLjA2LDEwLjQ0XSxbJ2MnLDAuMDAsLTUuNTgsMC4wMCwtNi45OSwtMC4wMywtNi45OV0sWydjJywtMC4xNSwwLjAwLC0wLjYzLDAuMjcsLTAuODcsMC40NV0sWydjJywtMC40NSwwLjM2LC0wLjc1LDAuOTMsLTAuOTMsMS43N10sWydjJywtMC4xOCwwLjgxLC0wLjI0LDEuODAsLTAuMjQsNC43NF0sWydjJywwLjAwLDIuOTcsMC4wNiwzLjk2LDAuMjQsNC43N10sWydjJywwLjI0LDEuMDgsMC42NiwxLjY4LDEuNDEsMi4wN10sWydjJywwLjEyLDAuMDYsMC4zMCwwLjEyLDAuMzMsMC4xNV0sWydsJywwLjA5LDAuMDBdLFsnbCcsMC4wMCwtNi45Nl0sWyd6J11dLHc6MTMuMDM4LGg6MjAuOTd9LFxuXHRcdCd0aW1lc2lnLmltcGVyZmVjdHVtJzp7ZDpbWydNJywxMywtNV0sWydhJyw4LDgsMCwxLDAsMCwxMF1dLHc6MTMuMDM4LGg6MjAuOTd9LFxuXHRcdCd0aW1lc2lnLmltcGVyZmVjdHVtMic6e2Q6W1snTScsMTMsLTVdLFsnYScsOCw4LDAsMSwwLDAsMTBdXSx3OjEzLjAzOCxoOjIwLjk3fSxcblx0XHQndGltZXNpZy5wZXJmZWN0dW0nOntkOltbJ00nLDEzLC01XSxbJ2EnLDgsOCwwLDEsMCwwLDEwXV0sdzoxMy4wMzgsaDoyMC45N30sXG5cdFx0J3RpbWVzaWcucGVyZmVjdHVtMic6e2Q6W1snTScsMTMsLTVdLFsnYScsOCw4LDAsMSwwLDAsMTBdXSx3OjEzLjAzOCxoOjIwLjk3fSxcblx0XHQnZic6e2Q6W1snTScsOS45MywtMTQuMjhdLFsnYycsMS41MywtMC4xOCwyLjg4LDAuNDUsMy4xMiwxLjUwXSxbJ2MnLDAuMTIsMC41MSwwLjAwLDEuMzIsLTAuMjcsMS44Nl0sWydjJywtMC4xNSwwLjMwLC0wLjQyLDAuNTcsLTAuNjMsMC42OV0sWydjJywtMC42OSwwLjM2LC0xLjU2LDAuMDMsLTEuODMsLTAuNjldLFsnYycsLTAuMDksLTAuMjQsLTAuMDksLTAuNjksMC4wMCwtMC44N10sWydjJywwLjA2LC0wLjEyLDAuMjEsLTAuMjQsMC40NSwtMC40Ml0sWydjJywwLjQyLC0wLjI0LDAuNTcsLTAuNDUsMC42MCwtMC43Ml0sWydjJywwLjAzLC0wLjMzLC0wLjA5LC0wLjM5LC0wLjYzLC0wLjQyXSxbJ2MnLC0wLjMwLDAuMDAsLTAuNDUsMC4wMCwtMC42MCwwLjAzXSxbJ2MnLC0wLjgxLDAuMjEsLTEuMzUsMC45MywtMS43NCwyLjQ2XSxbJ2MnLC0wLjA2LDAuMjcsLTAuNDgsMi4yNSwtMC40OCwyLjMxXSxbJ2MnLDAuMDAsMC4wMywwLjM5LDAuMDMsMC45MCwwLjAzXSxbJ2MnLDAuNzIsMC4wMCwwLjkwLDAuMDAsMC45OSwwLjA2XSxbJ2MnLDAuNDIsMC4xNSwwLjQ1LDAuNzIsMC4wMywwLjkwXSxbJ2MnLC0wLjEyLDAuMDYsLTAuMjQsMC4wNiwtMS4xNywwLjA2XSxbJ2wnLC0xLjA1LDAuMDBdLFsnbCcsLTAuNzgsMi41NV0sWydjJywtMC40NSwxLjQxLC0wLjg3LDIuNzksLTAuOTYsMy4wNl0sWydjJywtMC44NywyLjM3LC0yLjM3LDQuNzQsLTMuNzgsNS45MV0sWydjJywtMS4wNSwwLjkwLC0yLjA0LDEuMjMsLTMuMDksMS4wOF0sWydjJywtMS4xMSwtMC4xOCwtMS44OSwtMC43OCwtMi4wNCwtMS41OV0sWydjJywtMC4xMiwtMC42NiwwLjE1LC0xLjcxLDAuNTQsLTIuMTldLFsnYycsMC42OSwtMC43NSwxLjg2LC0wLjU0LDIuMjIsMC4zOV0sWydjJywwLjA2LDAuMTUsMC4wOSwwLjI3LDAuMDksMC40OF0sWydjJywwLjAwLDAuMjQsLTAuMDMsMC4yNywtMC4xMiwwLjQyXSxbJ2MnLC0wLjAzLDAuMDksLTAuMTUsMC4xOCwtMC4yNywwLjI3XSxbJ2MnLC0wLjA5LDAuMDYsLTAuMjcsMC4yMSwtMC4zNiwwLjI3XSxbJ2MnLC0wLjI0LDAuMTgsLTAuMzYsMC4zNiwtMC4zOSwwLjYwXSxbJ2MnLC0wLjAzLDAuMzMsMC4wOSwwLjM5LDAuNjMsMC40Ml0sWydjJywwLjQyLDAuMDAsMC42MywtMC4wMywwLjkwLC0wLjE1XSxbJ2MnLDAuNjAsLTAuMzAsMC45NiwtMC45NiwxLjM4LC0yLjY0XSxbJ2MnLDAuMDksLTAuNDIsMC42MywtMi41NSwxLjE3LC00Ljc3XSxbJ2wnLDEuMDIsLTQuMDhdLFsnYycsMC4wMCwtMC4wMywtMC4zNiwtMC4wMywtMC44MSwtMC4wM10sWydjJywtMC43MiwwLjAwLC0wLjgxLDAuMDAsLTAuOTMsLTAuMDZdLFsnYycsLTAuNDIsLTAuMTgsLTAuMzksLTAuNzUsMC4wMywtMC45MF0sWydjJywwLjA5LC0wLjA2LDAuMjcsLTAuMDYsMS4wNSwtMC4wNl0sWydsJywwLjk2LDAuMDBdLFsnbCcsMC4wMCwtMC4wOV0sWydjJywwLjA2LC0wLjE4LDAuMzAsLTAuNzIsMC41MSwtMS4xN10sWydjJywxLjIwLC0yLjQ2LDMuMzAsLTQuMjMsNS4zNCwtNC41MF0sWyd6J11dLHc6MTYuMTU1LGg6MTkuNDQ1fSxcblx0XHQnbSc6e2Q6W1snTScsMi43OSwtOC45MV0sWydjJywwLjA5LDAuMDAsMC4zMCwtMC4wMywwLjQ1LC0wLjAzXSxbJ2MnLDAuMjQsMC4wMywwLjMwLDAuMDMsMC40NSwwLjEyXSxbJ2MnLDAuMzYsMC4xNSwwLjYzLDAuNTQsMC43NSwxLjAyXSxbJ2wnLDAuMDMsMC4yMV0sWydsJywwLjMzLC0wLjMwXSxbJ2MnLDAuNjksLTAuNjksMS4zOCwtMS4wMiwyLjA3LC0xLjAyXSxbJ2MnLDAuMjcsMC4wMCwwLjMzLDAuMDAsMC40OCwwLjA2XSxbJ2MnLDAuMjEsMC4wOSwwLjQ4LDAuMzYsMC42MywwLjYwXSxbJ2MnLDAuMDMsMC4wOSwwLjEyLDAuMjcsMC4xOCwwLjQyXSxbJ2MnLDAuMDMsMC4xNSwwLjA5LDAuMjcsMC4xMiwwLjI3XSxbJ2MnLDAuMDAsMC4wMCwwLjA5LC0wLjA5LDAuMTgsLTAuMjFdLFsnYycsMC4zMywtMC4zOSwwLjg3LC0wLjgxLDEuMjksLTAuOTldLFsnYycsMC43OCwtMC4zMywxLjQ3LC0wLjIxLDIuMDEsMC4zM10sWydjJywwLjMwLDAuMzMsMC40OCwwLjY5LDAuNjAsMS4xNF0sWydjJywwLjA5LDAuNDIsMC4wNiwwLjU0LC0wLjU0LDMuMDZdLFsnYycsLTAuMzMsMS4yOSwtMC41NywyLjQwLC0wLjU3LDIuNDNdLFsnYycsMC4wMCwwLjEyLDAuMDksMC4yMSwwLjIxLDAuMjFdLFsnYycsMC4yNCwwLjAwLDAuNzUsLTAuMzAsMS4yMCwtMC43Ml0sWydjJywwLjQ1LC0wLjM5LDAuNjAsLTAuNDUsMC43OCwtMC4yN10sWydjJywwLjE4LDAuMTgsMC4wOSwwLjM2LC0wLjQ1LDAuODddLFsnYycsLTEuMDUsMC45NiwtMS44MywxLjQ3LC0yLjU4LDEuNzFdLFsnYycsLTAuOTMsMC4zMywtMS41MywwLjIxLC0xLjgwLC0wLjMzXSxbJ2MnLC0wLjA2LC0wLjE1LC0wLjA2LC0wLjIxLC0wLjA2LC0wLjQ1XSxbJ2MnLDAuMDAsLTAuMjQsMC4wMywtMC40OCwwLjYwLC0yLjgyXSxbJ2MnLDAuNDIsLTEuNzEsMC42MCwtMi42NCwwLjYzLC0yLjc5XSxbJ2MnLDAuMDMsLTAuNTcsLTAuMzAsLTAuNzUsLTAuODQsLTAuNDhdLFsnYycsLTAuMjQsMC4xMiwtMC41NCwwLjM5LC0wLjY2LDAuNjNdLFsnYycsLTAuMDMsMC4wOSwtMC40MiwxLjM4LC0wLjkwLDMuMDBdLFsnYycsLTAuOTAsMy4xNSwtMC44NCwzLjAwLC0xLjE0LDMuMTVdLFsnbCcsLTAuMTUsMC4wOV0sWydsJywtMC43OCwwLjAwXSxbJ2MnLC0wLjYwLDAuMDAsLTAuNzgsMC4wMCwtMC44NCwtMC4wNl0sWydjJywtMC4wOSwtMC4wMywtMC4xOCwtMC4xOCwtMC4xOCwtMC4yN10sWydjJywwLjAwLC0wLjAzLDAuMzYsLTEuMzgsMC44NCwtMi45N10sWydjJywwLjU3LC0yLjA0LDAuODEsLTIuOTcsMC44NCwtMy4xMl0sWydjJywwLjAzLC0wLjU0LC0wLjMwLC0wLjcyLC0wLjg0LC0wLjQ1XSxbJ2MnLC0wLjI0LDAuMTIsLTAuNTcsMC40MiwtMC42NiwwLjYzXSxbJ2MnLC0wLjA2LDAuMDksLTAuNTEsMS40NCwtMS4wNSwyLjk3XSxbJ2MnLC0wLjUxLDEuNTYsLTAuOTksMi44NSwtMC45OSwyLjkxXSxbJ2MnLC0wLjA2LDAuMTIsLTAuMjEsMC4yNCwtMC4zNiwwLjMwXSxbJ2MnLC0wLjEyLDAuMDYsLTAuMjEsMC4wNiwtMC45MCwwLjA2XSxbJ2MnLC0wLjYwLDAuMDAsLTAuNzgsMC4wMCwtMC44NCwtMC4wNl0sWydjJywtMC4wOSwtMC4wMywtMC4xOCwtMC4xOCwtMC4xOCwtMC4yN10sWydjJywwLjAwLC0wLjAzLDAuNDUsLTEuMzgsMC45OSwtMi45N10sWydjJywxLjA1LC0zLjE4LDEuMDUsLTMuMTgsMC45MywtMy40NV0sWydjJywtMC4xMiwtMC4yNywtMC4zOSwtMC4zMCwtMC43MiwtMC4xNV0sWydjJywtMC41NCwwLjI3LC0xLjE0LDEuMTcsLTEuNTYsMi40MF0sWydjJywtMC4wNiwwLjE1LC0wLjE1LDAuMzAsLTAuMTgsMC4zNl0sWydjJywtMC4yMSwwLjIxLC0wLjU3LDAuMjcsLTAuNzIsMC4wOV0sWydjJywtMC4wOSwtMC4wOSwtMC4wNiwtMC4yMSwwLjA2LC0wLjYzXSxbJ2MnLDAuNDgsLTEuMjYsMS4yNiwtMi40NiwyLjAxLC0zLjIxXSxbJ2MnLDAuNTcsLTAuNTQsMS4yMCwtMC44NywxLjgzLC0xLjAyXSxbJ3onXV0sdzoxNC42ODcsaDo5LjEyNn0sXG5cdFx0J3AnOntkOltbJ00nLDEuOTIsLTguNzBdLFsnYycsMC4yNywtMC4wOSwwLjgxLC0wLjA2LDEuMTEsMC4wM10sWydjJywwLjU0LDAuMTgsMC45MywwLjUxLDEuMTcsMC45OV0sWydjJywwLjA5LDAuMTUsMC4xNSwwLjMzLDAuMTgsMC4zNl0sWydsJywwLjAwLDAuMTJdLFsnbCcsMC4zMCwtMC4yN10sWydjJywwLjY2LC0wLjYwLDEuMzUsLTEuMDIsMi4xMywtMS4yMF0sWydjJywwLjIxLC0wLjA2LDAuMzMsLTAuMDYsMC43OCwtMC4wNl0sWydjJywwLjQ1LDAuMDAsMC41MSwwLjAwLDAuODQsMC4wOV0sWydjJywxLjI5LDAuMzMsMi4wNywxLjMyLDIuMjUsMi43OV0sWydjJywwLjA5LDAuODEsLTAuMDksMi4wMSwtMC40NSwyLjc5XSxbJ2MnLC0wLjU0LDEuMjYsLTEuODYsMi41NSwtMy4xOCwzLjAzXSxbJ2MnLC0wLjQ1LDAuMTgsLTAuODEsMC4yNCwtMS4yOSwwLjI0XSxbJ2MnLC0wLjY5LC0wLjAzLC0xLjM1LC0wLjE4LC0xLjg2LC0wLjQ1XSxbJ2MnLC0wLjMwLC0wLjE1LC0wLjUxLC0wLjE4LC0wLjY5LC0wLjA5XSxbJ2MnLC0wLjA5LDAuMDMsLTAuMTgsMC4wOSwtMC4xOCwwLjEyXSxbJ2MnLC0wLjA5LDAuMTIsLTEuMDUsMi45NCwtMS4wNSwzLjA2XSxbJ2MnLDAuMDAsMC4yNCwwLjE4LDAuNDgsMC41MSwwLjYzXSxbJ2MnLDAuMTgsMC4wNiwwLjU0LDAuMTUsMC43NSwwLjE1XSxbJ2MnLDAuMjEsMC4wMCwwLjM2LDAuMDYsMC40MiwwLjE4XSxbJ2MnLDAuMTIsMC4xOCwwLjA2LDAuNDIsLTAuMTIsMC41NF0sWydjJywtMC4wOSwwLjAzLC0wLjE1LDAuMDMsLTAuNzgsMC4wMF0sWydjJywtMS45OCwtMC4xNSwtMy44MSwtMC4xNSwtNS43OSwwLjAwXSxbJ2MnLC0wLjYzLDAuMDMsLTAuNjksMC4wMywtMC43OCwwLjAwXSxbJ2MnLC0wLjI0LC0wLjE1LC0wLjI0LC0wLjU3LDAuMDMsLTAuNjZdLFsnYycsMC4wNiwtMC4wMywwLjQ4LC0wLjA5LDAuOTksLTAuMTJdLFsnYycsMC44NywtMC4wNiwxLjExLC0wLjA5LDEuMzUsLTAuMjFdLFsnYycsMC4xOCwtMC4wNiwwLjMzLC0wLjE4LDAuMzksLTAuMzBdLFsnYycsMC4wNiwtMC4xMiwzLjI0LC05LjQyLDMuMjcsLTkuNjBdLFsnYycsMC4wNiwtMC4zMywwLjAzLC0wLjU3LC0wLjE1LC0wLjY5XSxbJ2MnLC0wLjA5LC0wLjA2LC0wLjEyLC0wLjA2LC0wLjMwLC0wLjA2XSxbJ2MnLC0wLjY5LDAuMDYsLTEuNTMsMS4wMiwtMi4yOCwyLjYxXSxbJ2MnLC0wLjA5LDAuMjEsLTAuMjEsMC40NSwtMC4yNywwLjUxXSxbJ2MnLC0wLjA5LDAuMTIsLTAuMzMsMC4yNCwtMC40OCwwLjI0XSxbJ2MnLC0wLjE4LDAuMDAsLTAuMzYsLTAuMTUsLTAuMzYsLTAuMzBdLFsnYycsMC4wMCwtMC4yNCwwLjc4LC0xLjgzLDEuMjYsLTIuNTVdLFsnYycsMC43MiwtMS4xMSwxLjQ3LC0xLjc0LDIuMjgsLTEuOTJdLFsneiddLFsnbScsNS4zNywxLjQ3XSxbJ2MnLC0wLjI3LC0wLjEyLC0wLjc1LC0wLjAzLC0xLjE0LDAuMjFdLFsnYycsLTAuNzUsMC40OCwtMS40NywxLjY4LC0xLjg5LDMuMTVdLFsnYycsLTAuNDUsMS40NywtMC40MiwyLjM0LDAuMDAsMi43MF0sWydjJywwLjQ1LDAuMzksMS4yNiwwLjIxLDEuODMsLTAuMzZdLFsnYycsMC41MSwtMC41MSwwLjk5LC0xLjY4LDEuMzgsLTMuMjddLFsnYycsMC4zMCwtMS4xNywwLjMzLC0xLjc0LDAuMTUsLTIuMTNdLFsnYycsLTAuMDksLTAuMTUsLTAuMTUsLTAuMjEsLTAuMzMsLTAuMzBdLFsneiddXSx3OjE0LjY4OSxoOjEzLjEyN30sXG5cdFx0J3InOntkOltbJ00nLDYuMzMsLTkuMTJdLFsnYycsMC4yNywtMC4wMywwLjkzLDAuMDAsMS4yMCwwLjA2XSxbJ2MnLDAuODQsMC4yMSwxLjIzLDAuODEsMS4wMiwxLjUzXSxbJ2MnLC0wLjI0LDAuNzUsLTAuOTAsMS4xNywtMS41NiwwLjk2XSxbJ2MnLC0wLjMzLC0wLjA5LC0wLjUxLC0wLjMwLC0wLjY2LC0wLjc1XSxbJ2MnLC0wLjAzLC0wLjEyLC0wLjA5LC0wLjI0LC0wLjEyLC0wLjMwXSxbJ2MnLC0wLjA5LC0wLjE1LC0wLjMwLC0wLjI0LC0wLjQ4LC0wLjI0XSxbJ2MnLC0wLjU3LDAuMDAsLTEuMzgsMC41NCwtMS42NSwxLjA4XSxbJ2MnLC0wLjA2LDAuMTUsLTAuMzMsMS4xNywtMC45MCwzLjI3XSxbJ2MnLC0wLjU3LDIuMzEsLTAuODEsMy4xMiwtMC44NywzLjIxXSxbJ2MnLC0wLjAzLDAuMDYsLTAuMTIsMC4xNSwtMC4xOCwwLjIxXSxbJ2wnLC0wLjEyLDAuMDZdLFsnbCcsLTAuODEsMC4wM10sWydjJywtMC42OSwwLjAwLC0wLjgxLDAuMDAsLTAuOTAsLTAuMDNdLFsnYycsLTAuMDksLTAuMDYsLTAuMTgsLTAuMjEsLTAuMTgsLTAuMzBdLFsnYycsMC4wMCwtMC4wNiwwLjM5LC0xLjYyLDAuOTAsLTMuNTFdLFsnYycsMC44NCwtMy4yNCwwLjg3LC0zLjQ1LDAuODcsLTMuNzJdLFsnYycsMC4wMCwtMC4yMSwwLjAwLC0wLjI3LC0wLjAzLC0wLjM2XSxbJ2MnLC0wLjEyLC0wLjE1LC0wLjIxLC0wLjI0LC0wLjQyLC0wLjI0XSxbJ2MnLC0wLjI0LDAuMDAsLTAuNDUsMC4xNSwtMC43OCwwLjQyXSxbJ2MnLC0wLjMzLDAuMzYsLTAuNDUsMC41NCwtMC43MiwxLjE0XSxbJ2MnLC0wLjAzLDAuMTIsLTAuMjEsMC4yNCwtMC4zNiwwLjI3XSxbJ2MnLC0wLjEyLDAuMDAsLTAuMTUsMC4wMCwtMC4yNCwtMC4wNl0sWydjJywtMC4xOCwtMC4xMiwtMC4xOCwtMC4yMSwtMC4wNiwtMC41NF0sWydjJywwLjIxLC0wLjU3LDAuNDIsLTAuOTMsMC43OCwtMS4zMl0sWydjJywwLjU0LC0wLjUxLDEuMjAsLTAuODEsMS45NSwtMC44N10sWydjJywwLjgxLC0wLjAzLDEuNTMsMC4zMCwxLjkyLDAuODddLFsnbCcsMC4xMiwwLjE4XSxbJ2wnLDAuMDksLTAuMDldLFsnYycsMC41NywtMC40NSwxLjQxLC0wLjg0LDIuMTksLTAuOTZdLFsneiddXSx3OjkuNDEsaDo5LjEzMn0sXG5cdFx0J3MnOntkOltbJ00nLDQuNDcsLTguNzNdLFsnYycsMC4wOSwwLjAwLDAuMzYsLTAuMDMsMC41NywtMC4wM10sWydjJywwLjc1LDAuMDMsMS4yOSwwLjI0LDEuNzEsMC42M10sWydjJywwLjUxLDAuNTQsMC42NiwxLjI2LDAuMzYsMS44M10sWydjJywtMC4yNCwwLjQyLC0wLjYzLDAuNTcsLTEuMTEsMC40Ml0sWydjJywtMC4zMywtMC4wOSwtMC42MCwtMC4zNiwtMC42MCwtMC41N10sWydjJywwLjAwLC0wLjAzLDAuMDYsLTAuMjEsMC4xNSwtMC4zOV0sWydjJywwLjEyLC0wLjIxLDAuMTUsLTAuMzMsMC4xOCwtMC40OF0sWydjJywwLjAwLC0wLjI0LC0wLjA2LC0wLjQ4LC0wLjE1LC0wLjYwXSxbJ2MnLC0wLjE1LC0wLjIxLC0wLjQyLC0wLjI0LC0wLjc1LC0wLjE1XSxbJ2MnLC0wLjI3LDAuMDYsLTAuNDgsMC4xOCwtMC42OSwwLjM2XSxbJ2MnLC0wLjM5LDAuMzksLTAuNTEsMC45NiwtMC4zMywxLjM4XSxbJ2MnLDAuMDksMC4yMSwwLjQyLDAuNTEsMC43OCwwLjcyXSxbJ2MnLDEuMTEsMC42OSwxLjU5LDEuMTEsMS44OSwxLjY4XSxbJ2MnLDAuMjEsMC4zOSwwLjI0LDAuNzgsMC4xNSwxLjI5XSxbJ2MnLC0wLjE4LDEuMjAsLTEuMTcsMi4xNiwtMi41MiwyLjUyXSxbJ2MnLC0xLjAyLDAuMjQsLTEuOTUsMC4xMiwtMi43MCwtMC40Ml0sWydjJywtMC43MiwtMC41MSwtMC45OSwtMS40NywtMC42MCwtMi4xOV0sWydjJywwLjI0LC0wLjQ4LDAuNzIsLTAuNjMsMS4xNywtMC40Ml0sWydjJywwLjMzLDAuMTgsMC41NCwwLjQ1LDAuNTcsMC44MV0sWydjJywwLjAwLDAuMjEsLTAuMDMsMC4zMCwtMC4zMywwLjUxXSxbJ2MnLC0wLjMzLDAuMjQsLTAuMzksMC40MiwtMC4yNywwLjY5XSxbJ2MnLDAuMDYsMC4xNSwwLjIxLDAuMjcsMC40NSwwLjMzXSxbJ2MnLDAuMzAsMC4wOSwwLjg3LDAuMDksMS4yMCwwLjAwXSxbJ2MnLDAuNzUsLTAuMjEsMS4yMywtMC43MiwxLjI5LC0xLjM1XSxbJ2MnLDAuMDMsLTAuNDIsLTAuMTUsLTAuODEsLTAuNTQsLTEuMjBdLFsnYycsLTAuMjQsLTAuMjQsLTAuNDgsLTAuNDIsLTEuNDEsLTEuMDJdLFsnYycsLTAuNjksLTAuNDIsLTEuMDUsLTAuOTMsLTEuMDUsLTEuNDddLFsnYycsMC4wMCwtMC4zOSwwLjEyLC0wLjg3LDAuMzAsLTEuMjNdLFsnYycsMC4yNywtMC41NywwLjc4LC0xLjA1LDEuMzgsLTEuMzVdLFsnYycsMC4yNCwtMC4xMiwwLjYzLC0wLjI3LDAuOTAsLTAuMzBdLFsneiddXSx3OjYuNjMyLGg6OC43NTh9LFxuXHRcdCd6Jzp7ZDpbWydNJywyLjY0LC03Ljk1XSxbJ2MnLDAuMzYsLTAuMDksMC44MSwtMC4wMywxLjcxLDAuMjddLFsnYycsMC43OCwwLjIxLDAuOTYsMC4yNywxLjc0LDAuMzBdLFsnYycsMC44NywwLjA2LDEuMDIsMC4wMywxLjM4LC0wLjIxXSxbJ2MnLDAuMjEsLTAuMTUsMC4zMywtMC4xNSwwLjQ4LC0wLjA2XSxbJ2MnLDAuMTUsMC4wOSwwLjIxLDAuMzAsMC4xNSwwLjQ1XSxbJ2MnLC0wLjAzLDAuMDYsLTEuMjYsMS4yNiwtMi43NiwyLjY3XSxbJ2wnLC0yLjczLDIuNTVdLFsnbCcsMC41NCwwLjAzXSxbJ2MnLDAuNTQsMC4wMywwLjcyLDAuMDMsMi4wMSwwLjE1XSxbJ2MnLDAuMzYsMC4wMywwLjkwLDAuMDYsMS4yMCwwLjA5XSxbJ2MnLDAuNjYsMC4wMCwwLjgxLC0wLjAzLDEuMDIsLTAuMjRdLFsnYycsMC4zMCwtMC4zMCwwLjM5LC0wLjcyLDAuMjcsLTEuMjNdLFsnYycsLTAuMDYsLTAuMjcsLTAuMDYsLTAuMjcsLTAuMDMsLTAuMzldLFsnYycsMC4xNSwtMC4zMCwwLjU0LC0wLjI3LDAuNjksMC4wM10sWydjJywwLjE1LDAuMzMsMC4yNywxLjAyLDAuMjcsMS41MF0sWydjJywwLjAwLDEuNDcsLTEuMTEsMi43MCwtMi41MiwyLjc5XSxbJ2MnLC0wLjU3LDAuMDMsLTEuMDIsLTAuMDksLTIuMDEsLTAuNTFdLFsnYycsLTEuMDIsLTAuNDIsLTEuMjMsLTAuNDgsLTIuMTMsLTAuNTRdLFsnYycsLTAuODEsLTAuMDYsLTAuOTYsLTAuMDMsLTEuMjYsMC4xOF0sWydjJywtMC4xMiwwLjA2LC0wLjI0LDAuMTIsLTAuMjcsMC4xMl0sWydjJywtMC4yNywwLjAwLC0wLjQ1LC0wLjMwLC0wLjM2LC0wLjUxXSxbJ2MnLDAuMDMsLTAuMDYsMS4zMiwtMS4zMiwyLjkxLC0yLjc5XSxbJ2wnLDIuODgsLTIuNzNdLFsnYycsLTAuMDMsMC4wMCwtMC4yMSwwLjAzLC0wLjQyLDAuMDZdLFsnYycsLTAuMjEsMC4wMywtMC43OCwwLjA5LC0xLjIzLDAuMTJdLFsnYycsLTEuMTEsMC4xMiwtMS4yMywwLjE1LC0xLjk1LDAuMjddLFsnYycsLTAuNzIsMC4xNSwtMS4xNywwLjE4LC0xLjI5LDAuMDldLFsnYycsLTAuMjcsLTAuMTgsLTAuMjEsLTAuNzUsMC4xMiwtMS4yNl0sWydjJywwLjM5LC0wLjYwLDAuOTMsLTEuMDIsMS41OSwtMS4yMF0sWyd6J11dLHc6OC41NzMsaDo4Ljc0M30sXG5cdFx0JysnOntkOltbJ00nLDMuNDgsLTkuM10sWydjJywwLjE4LC0wLjA5LDAuMzYsLTAuMDksMC41NCwwLjAwXSxbJ2MnLDAuMTgsMC4wOSwwLjI0LDAuMTUsMC4zMywwLjMwXSxbJ2wnLDAuMDYsMC4xNV0sWydsJywwLjAwLDEuMjldLFsnbCcsMC4wMCwxLjI5XSxbJ2wnLDEuMjksMC4wMF0sWydjJywxLjIzLDAuMDAsMS4yOSwwLjAwLDEuNDEsMC4wNl0sWydjJywwLjA2LDAuMDMsMC4xNSwwLjA5LDAuMTgsMC4xMl0sWydjJywwLjEyLDAuMDksMC4yMSwwLjMzLDAuMjEsMC40OF0sWydjJywwLjAwLDAuMTUsLTAuMDksMC4zOSwtMC4yMSwwLjQ4XSxbJ2MnLC0wLjAzLDAuMDMsLTAuMTIsMC4wOSwtMC4xOCwwLjEyXSxbJ2MnLC0wLjEyLDAuMDYsLTAuMTgsMC4wNiwtMS40MSwwLjA2XSxbJ2wnLC0xLjI5LDAuMDBdLFsnbCcsMC4wMCwxLjI5XSxbJ2MnLDAuMDAsMS4yMywwLjAwLDEuMjksLTAuMDYsMS40MV0sWydjJywtMC4wOSwwLjE4LC0wLjE1LDAuMjQsLTAuMzAsMC4zM10sWydjJywtMC4yMSwwLjA5LC0wLjM5LDAuMDksLTAuNTcsMC4wMF0sWydjJywtMC4xOCwtMC4wOSwtMC4yNCwtMC4xNSwtMC4zMywtMC4zM10sWydjJywtMC4wNiwtMC4xMiwtMC4wNiwtMC4xOCwtMC4wNiwtMS40MV0sWydsJywwLjAwLC0xLjI5XSxbJ2wnLC0xLjI5LDAuMDBdLFsnYycsLTEuMjMsMC4wMCwtMS4yOSwwLjAwLC0xLjQxLC0wLjA2XSxbJ2MnLC0wLjE4LC0wLjA5LC0wLjI0LC0wLjE1LC0wLjMzLC0wLjMzXSxbJ2MnLC0wLjA5LC0wLjE4LC0wLjA5LC0wLjM2LDAuMDAsLTAuNTRdLFsnYycsMC4wOSwtMC4xOCwwLjE1LC0wLjI0LDAuMzMsLTAuMzNdLFsnbCcsMC4xNSwtMC4wNl0sWydsJywxLjI2LDAuMDBdLFsnbCcsMS4yOSwwLjAwXSxbJ2wnLDAuMDAsLTEuMjldLFsnYycsMC4wMCwtMS4yMywwLjAwLC0xLjI5LDAuMDYsLTEuNDFdLFsnYycsMC4wOSwtMC4xOCwwLjE1LC0wLjI0LDAuMzMsLTAuMzNdLFsneiddXSx3OjcuNTA3LGg6Ny41MTV9LFxuXHRcdCcsJzp7ZDpbWydNJywxLjMyLC0zLjM2XSxbJ2MnLDAuNTcsLTAuMTUsMS4xNywwLjAzLDEuNTksMC40NV0sWydjJywwLjQ1LDAuNDUsMC42MCwwLjk2LDAuNTEsMS44OV0sWydjJywtMC4wOSwxLjIzLC0wLjQyLDIuNDYsLTAuOTksMy45M10sWydjJywtMC4zMCwwLjcyLC0wLjcyLDEuNjIsLTAuNzgsMS42OF0sWydjJywtMC4xOCwwLjIxLC0wLjUxLDAuMTgsLTAuNjYsLTAuMDZdLFsnYycsLTAuMDMsLTAuMDYsLTAuMDYsLTAuMTUsLTAuMDYsLTAuMThdLFsnYycsMC4wMCwtMC4wNiwwLjEyLC0wLjMzLDAuMjQsLTAuNjNdLFsnYycsMC44NCwtMS44MCwxLjAyLC0yLjYxLDAuNjksLTMuMjRdLFsnYycsLTAuMTIsLTAuMjQsLTAuMjcsLTAuMzYsLTAuNzUsLTAuNjBdLFsnYycsLTAuMzYsLTAuMTUsLTAuNDIsLTAuMjEsLTAuNjAsLTAuMzldLFsnYycsLTAuNjksLTAuNjksLTAuNjksLTEuNzEsMC4wMCwtMi40MF0sWydjJywwLjIxLC0wLjIxLDAuNTEsLTAuMzksMC44MSwtMC40NV0sWyd6J11dLHc6My40NTIsaDo4LjE0M30sXG5cdFx0Jy0nOntkOltbJ00nLDAuMTgsLTUuMzRdLFsnYycsMC4wOSwtMC4wNiwwLjE1LC0wLjA2LDIuMzEsLTAuMDZdLFsnYycsMi40NiwwLjAwLDIuMzcsMC4wMCwyLjQ2LDAuMjFdLFsnYycsMC4xMiwwLjIxLDAuMDMsMC40MiwtMC4xNSwwLjU0XSxbJ2MnLC0wLjA5LDAuMDYsLTAuMTUsMC4wNiwtMi4yOCwwLjA2XSxbJ2MnLC0yLjE2LDAuMDAsLTIuMjIsMC4wMCwtMi4zMSwtMC4wNl0sWydjJywtMC4yNywtMC4xNSwtMC4yNywtMC41NCwtMC4wMywtMC42OV0sWyd6J11dLHc6NS4wMDEsaDowLjgxfSxcblx0XHQnLic6e2Q6W1snTScsMS4zMiwtMy4zNl0sWydjJywxLjA1LC0wLjI3LDIuMTAsMC41NywyLjEwLDEuNjVdLFsnYycsMC4wMCwxLjA4LC0xLjA1LDEuOTIsLTIuMTAsMS42NV0sWydjJywtMC45MCwtMC4yMSwtMS41MCwtMS4xNCwtMS4yNiwtMi4wNF0sWydjJywwLjEyLC0wLjYzLDAuNjMsLTEuMTEsMS4yNiwtMS4yNl0sWyd6J11dLHc6My40MTMsaDozLjQwMn0sXG5cdFx0J3NjcmlwdHMud2VkZ2UnOntkOltbJ00nLC0zLjY2LC03LjQ0XSxbJ2MnLDAuMDYsLTAuMDksMC4wMCwtMC4wOSwwLjgxLDAuMDNdLFsnYycsMS44NiwwLjMwLDMuODQsMC4zMCw1LjczLDAuMDBdLFsnYycsMC43OCwtMC4xMiwwLjcyLC0wLjEyLDAuNzgsLTAuMDNdLFsnYycsMC4xNSwwLjE1LDAuMTIsMC4yNCwtMC4yNCwwLjYwXSxbJ2MnLC0wLjkzLDAuOTMsLTEuOTgsMi43NiwtMi42Nyw0LjYyXSxbJ2MnLC0wLjMwLDAuNzgsLTAuNTEsMS43MSwtMC41MSwyLjEzXSxbJ2MnLDAuMDAsMC4xNSwwLjAwLDAuMTgsLTAuMDYsMC4yN10sWydjJywtMC4xMiwwLjA5LC0wLjI0LDAuMDksLTAuMzYsMC4wMF0sWydjJywtMC4wNiwtMC4wOSwtMC4wNiwtMC4xMiwtMC4wNiwtMC4yN10sWydjJywwLjAwLC0wLjQyLC0wLjIxLC0xLjM1LC0wLjUxLC0yLjEzXSxbJ2MnLC0wLjY5LC0xLjg2LC0xLjc0LC0zLjY5LC0yLjY3LC00LjYyXSxbJ2MnLC0wLjM2LC0wLjM2LC0wLjM5LC0wLjQ1LC0wLjI0LC0wLjYwXSxbJ3onXV0sdzo3LjQ5LGg6Ny43NTJ9LFxuXHRcdCdzY3JpcHRzLnRodW1iJzp7ZDpbWydNJywtMC41NCwtMy42OV0sWydjJywwLjE1LC0wLjAzLDAuMzYsLTAuMDYsMC41MSwtMC4wNl0sWydjJywxLjQ0LDAuMDAsMi41OCwxLjExLDIuOTQsMi44NV0sWydjJywwLjA5LDAuNDgsMC4wOSwxLjMyLDAuMDAsMS44MF0sWydjJywtMC4yNywxLjQxLC0xLjA4LDIuNDMsLTIuMTYsMi43M10sWydsJywtMC4xOCwwLjA2XSxbJ2wnLDAuMDAsMC4xMl0sWydjJywwLjAzLDAuMDYsMC4wNiwwLjQ1LDAuMDksMC44N10sWydjJywwLjAzLDAuNTcsMC4wMywwLjc4LDAuMDAsMC44NF0sWydjJywtMC4wOSwwLjI3LC0wLjM5LDAuNDgsLTAuNjYsMC40OF0sWydjJywtMC4yNywwLjAwLC0wLjU3LC0wLjIxLC0wLjY2LC0wLjQ4XSxbJ2MnLC0wLjAzLC0wLjA2LC0wLjAzLC0wLjI3LDAuMDAsLTAuODRdLFsnYycsMC4wMywtMC40MiwwLjA2LC0wLjgxLDAuMDksLTAuODddLFsnbCcsMC4wMCwtMC4xMl0sWydsJywtMC4xOCwtMC4wNl0sWydjJywtMS4wOCwtMC4zMCwtMS44OSwtMS4zMiwtMi4xNiwtMi43M10sWydjJywtMC4wOSwtMC40OCwtMC4wOSwtMS4zMiwwLjAwLC0xLjgwXSxbJ2MnLDAuMTUsLTAuODQsMC41MSwtMS41MywxLjAyLC0yLjA0XSxbJ2MnLDAuMzksLTAuMzksMC44NCwtMC42MywxLjM1LC0wLjc1XSxbJ3onXSxbJ20nLDEuMDUsMC45MF0sWydjJywtMC4xNSwtMC4wOSwtMC4yMSwtMC4wOSwtMC40NSwtMC4xMl0sWydjJywtMC4xNSwwLjAwLC0wLjMwLDAuMDMsLTAuMzksMC4wM10sWydjJywtMC41NywwLjE4LC0wLjkwLDAuNzIsLTEuMDgsMS43NF0sWydjJywtMC4wNiwwLjQ4LC0wLjA2LDEuODAsMC4wMCwyLjI4XSxbJ2MnLDAuMTUsMC45MCwwLjQyLDEuNDQsMC45MCwxLjY1XSxbJ2MnLDAuMTgsMC4wOSwwLjIxLDAuMDksMC41MSwwLjA5XSxbJ2MnLDAuMzAsMC4wMCwwLjMzLDAuMDAsMC41MSwtMC4wOV0sWydjJywwLjQ4LC0wLjIxLDAuNzUsLTAuNzUsMC45MCwtMS42NV0sWydjJywwLjAzLC0wLjI3LDAuMDMsLTAuNTQsMC4wMywtMS4xNF0sWydjJywwLjAwLC0wLjYwLDAuMDAsLTAuODcsLTAuMDMsLTEuMTRdLFsnYycsLTAuMTUsLTAuOTAsLTAuNDUsLTEuNDQsLTAuOTAsLTEuNjVdLFsneiddXSx3OjUuOTU1LGg6OS43NX0sXG5cdFx0J3NjcmlwdHMub3Blbic6e2Q6W1snTScsLTAuNTQsLTMuNjldLFsnYycsMC4xNSwtMC4wMywwLjM2LC0wLjA2LDAuNTEsLTAuMDZdLFsnYycsMS40NCwwLjAwLDIuNTgsMS4xMSwyLjk0LDIuODVdLFsnYycsMC4wOSwwLjQ4LDAuMDksMS4zMiwwLjAwLDEuODBdLFsnYycsLTAuMzMsMS43NCwtMS40NywyLjg1LC0yLjkxLDIuODVdLFsnYycsLTEuNDQsMC4wMCwtMi41OCwtMS4xMSwtMi45MSwtMi44NV0sWydjJywtMC4wOSwtMC40OCwtMC4wOSwtMS4zMiwwLjAwLC0xLjgwXSxbJ2MnLDAuMTUsLTAuODQsMC41MSwtMS41MywxLjAyLC0yLjA0XSxbJ2MnLDAuMzksLTAuMzksMC44NCwtMC42MywxLjM1LC0wLjc1XSxbJ3onXSxbJ20nLDEuMTEsMC45MF0sWydjJywtMC4yMSwtMC4wOSwtMC4yNywtMC4wOSwtMC41MSwtMC4xMl0sWydjJywtMC4zMCwwLjAwLC0wLjQyLDAuMDMsLTAuNjYsMC4xNV0sWydjJywtMC4yNCwwLjEyLC0wLjUxLDAuMzksLTAuNjYsMC42M10sWydjJywtMC41NCwwLjkzLC0wLjYzLDIuNjQsLTAuMjEsMy44MV0sWydjJywwLjIxLDAuNTQsMC41MSwwLjkwLDAuOTMsMS4xMV0sWydjJywwLjIxLDAuMDksMC4yNCwwLjA5LDAuNTQsMC4wOV0sWydjJywwLjMwLDAuMDAsMC4zMywwLjAwLDAuNTQsLTAuMDldLFsnYycsMC40MiwtMC4yMSwwLjcyLC0wLjU3LDAuOTMsLTEuMTFdLFsnYycsMC4zNiwtMC45OSwwLjM2LC0yLjM3LDAuMDAsLTMuMzZdLFsnYycsLTAuMjEsLTAuNTQsLTAuNTEsLTAuOTAsLTAuOTAsLTEuMTFdLFsneiddXSx3OjUuOTU1LGg6Ny41fSxcblx0XHQnc2NyaXB0cy5sb25ncGhyYXNlJzp7ZDpbWydNJywxLjQ3LC0xNS4wOV0sWydjJywwLjM2LC0wLjA5LDAuNjYsLTAuMTgsMC42OSwtMC4xOF0sWydjJywwLjA2LDAuMDAsMC4wNiwwLjU0LDAuMDYsMTEuMjVdLFsnbCcsMC4wMCwxMS4yNV0sWydsJywtMC42MywwLjE1XSxbJ2MnLC0wLjY2LDAuMTgsLTEuNDQsMC4zOSwtMS41MCwwLjM5XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMDMsLTMuMzksLTAuMDMsLTExLjI1XSxbJ2wnLDAuMDAsLTExLjI1XSxbJ2wnLDAuMzYsLTAuMDldLFsnYycsMC4yMSwtMC4wNiwwLjY2LC0wLjE4LDEuMDUsLTAuMjddLFsneiddXSx3OjIuMTYsaDoyMy4wNH0sXG5cdFx0J3NjcmlwdHMubWVkaXVtcGhyYXNlJzp7ZDpbWydNJywxLjQ3LC03LjU5XSxbJ2MnLDAuMzYsLTAuMDksMC42NiwtMC4xOCwwLjY5LC0wLjE4XSxbJ2MnLDAuMDYsMC4wMCwwLjA2LDAuMzksMC4wNiw3LjUwXSxbJ2wnLDAuMDAsNy41MF0sWydsJywtMC42MywwLjE1XSxbJ2MnLC0wLjY2LDAuMTgsLTEuNDQsMC4zOSwtMS41MCwwLjM5XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMDMsLTIuMjgsLTAuMDMsLTcuNTBdLFsnbCcsMC4wMCwtNy41MF0sWydsJywwLjM2LC0wLjA5XSxbJ2MnLDAuMjEsLTAuMDYsMC42NiwtMC4xOCwxLjA1LC0wLjI3XSxbJ3onXV0sdzoyLjE2LGg6MTUuNTR9LFxuXHRcdCdzY3JpcHRzLnNob3J0cGhyYXNlJzp7ZDpbWydNJywxLjQ3LC03LjU5XSxbJ2MnLDAuMzYsLTAuMDksMC42NiwtMC4xOCwwLjY5LC0wLjE4XSxbJ2MnLDAuMDYsMC4wMCwwLjA2LDAuMjEsMC4wNiwzLjc1XSxbJ2wnLDAuMDAsMy43NV0sWydsJywtMC40MiwwLjA5XSxbJ2MnLC0wLjU3LDAuMTgsLTEuNjUsMC40NSwtMS43MSwwLjQ1XSxbJ2MnLC0wLjAzLDAuMDAsLTAuMDMsLTAuNzIsLTAuMDMsLTMuNzVdLFsnbCcsMC4wMCwtMy43NV0sWydsJywwLjM2LC0wLjA5XSxbJ2MnLDAuMjEsLTAuMDYsMC42NiwtMC4xOCwxLjA1LC0wLjI3XSxbJ3onXV0sdzoyLjE2LGg6OC4wNH0sXG5cdFx0J3NjcmlwdHMuc25hcCc6e2Q6W1snTScsNC41MCwtMy4zOV0sWydjJywwLjM2LC0wLjAzLDAuOTYsLTAuMDMsMS4zNSwwLjAwXSxbJ2MnLDEuNTYsMC4xNSwzLjE1LDAuOTAsNC4yMCwyLjAxXSxbJ2MnLDAuMjQsMC4yNywwLjMzLDAuNDIsMC4zMywwLjYwXSxbJ2MnLDAuMDAsMC4yNywwLjAzLDAuMjQsLTIuNDYsMi4yMl0sWydjJywtMS4yOSwxLjAyLC0yLjQwLDEuODYsLTIuNDksMS45Ml0sWydjJywtMC4xOCwwLjA5LC0wLjMwLDAuMDksLTAuNDgsMC4wMF0sWydjJywtMC4wOSwtMC4wNiwtMS4yMCwtMC45MCwtMi40OSwtMS45Ml0sWydjJywtMi40OSwtMS45OCwtMi40NiwtMS45NSwtMi40NiwtMi4yMl0sWydjJywwLjAwLC0wLjE4LDAuMDksLTAuMzMsMC4zMywtMC42MF0sWydjJywxLjA1LC0xLjA4LDIuNjQsLTEuODYsNC4xNywtMi4wMV0sWyd6J10sWydtJywxLjI5LDEuMTddLFsnYycsLTEuNDcsLTAuMTUsLTIuOTcsMC4zMCwtNC4xNCwxLjIwXSxbJ2wnLC0wLjE4LDAuMTVdLFsnbCcsMC4wNiwwLjA5XSxbJ2MnLDAuMTUsMC4xMiwzLjYzLDIuODUsMy42NiwyLjg1XSxbJ2MnLDAuMDMsMC4wMCwzLjUxLC0yLjczLDMuNjYsLTIuODVdLFsnbCcsMC4wNiwtMC4wOV0sWydsJywtMC4xOCwtMC4xNV0sWydjJywtMC44NCwtMC42NiwtMS44OSwtMS4wOCwtMi45NCwtMS4yMF0sWyd6J11dLHc6MTAuMzgsaDo2Ljg0fX07XG5cblx0Ly8gQ3VzdG9tIGNoYXJhY3RlcnMgdGhhdCB3ZXJlbid0IGdlbmVyYXRlZCBmcm9tIHRoZSBmb250OlxuXHRnbHlwaHNbJ25vdGVoZWFkcy5zbGFzaC53aG9sZSddID0ge2Q6W1snTScsNSwtNV0sWydsJywxLDFdLFsnbCcsLTUsNV0sWydsJywtMSwtMV0sWyd6J10sWydtJyw0LDZdLFsnbCcsLTUsLTVdLFsnbCcsMiwtMl0sWydsJyw1LDVdLFsneiddLFsnbScsMCwtMl0sWydsJywxLDFdLFsnbCcsLTUsNV0sWydsJywtMSwtMV0sWyd6J10sWydtJywtNCw2XSxbJ2wnLC01LC01XSxbJ2wnLDIsLTJdLFsnbCcsNSw1XSxbJ3onXV0sdzoxMC44MSxoOjE1LjYzfTtcblxuXHRnbHlwaHNbJ25vdGVoZWFkcy5zbGFzaC5xdWFydGVyJ10gPSB7ZDpbWydNJyw5LC02XSxbJ2wnLDAsNF0sWydsJywtOSw5XSxbJ2wnLDAsLTRdLFsneiddXSx3OjksaDo5fTtcblxuXHRnbHlwaHNbJ25vdGVoZWFkcy5oYXJtb25pYy5xdWFydGVyJ10gPSB7ZDpbWydNJywzLjYzLC00LjAyXSxbJ2MnLDAuMDksLTAuMDYsMC4xOCwtMC4wOSwwLjI0LC0wLjAzXSxbJ2MnLDAuMDMsMC4wMywwLjg3LDAuOTMsMS44MywyLjAxXSxbJ2MnLDEuNTAsMS42NSwxLjgwLDEuOTgsMS44MCwyLjA0XSxbJ2MnLDAuMDAsMC4wNiwtMC4zMCwwLjM5LC0xLjgwLDIuMDRdLFsnYycsLTAuOTYsMS4wOCwtMS44MCwxLjk4LC0xLjgzLDIuMDFdLFsnYycsLTAuMDYsMC4wNiwtMC4xNSwwLjAzLC0wLjI0LC0wLjAzXSxbJ2MnLC0wLjEyLC0wLjA5LC0zLjU0LC0zLjg0LC0zLjYwLC0zLjkzXSxbJ2MnLC0wLjAzLC0wLjAzLC0wLjAzLC0wLjA5LC0wLjAzLC0wLjE1XSxbJ2MnLDAuMDMsLTAuMDYsMy40NSwtMy44NCwzLjYzLC0zLjk2XSxbJ3onXV0sdzo3LjUsaDo4LjE2NX07XG5cbnZhciBwYXRoQ2xvbmUgPSBmdW5jdGlvbiAocGF0aEFycmF5KSB7XG5cdHZhciByZXMgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDAsIGlpID0gcGF0aEFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0XHRyZXNbaV0gPSBbXTtcblx0XHRmb3IgKHZhciBqID0gMCwgamogPSBwYXRoQXJyYXlbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykge1xuXHRcdFx0cmVzW2ldW2pdID0gcGF0aEFycmF5W2ldW2pdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzO1xufTtcblxudmFyIHBhdGhTY2FsZSA9IGZ1bmN0aW9uIChwYXRoQXJyYXksIGt4LCBreSkge1xuXHRmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHRcdHZhciBwID0gcGF0aEFycmF5W2ldO1xuXHRcdHZhciBqLCBqajtcblx0XHRmb3IgKGogPSAxLCBqaiA9IHAubGVuZ3RoOyBqIDwgamo7IGorKykge1xuXHRcdFx0cFtqXSAqPSAoaiAlIDIpID8ga3ggOiBreTtcblx0XHR9XG5cdH1cbn07XG5cbnZhciBHbHlwaHMgPSB7XG5cdHByaW50U3ltYm9sOiBmdW5jdGlvbiAoeCx5LHN5bWIscGFwZXIsIGtsYXNzKSB7XG4gICAgaWYgKCFnbHlwaHNbc3ltYl0pIHJldHVybiBudWxsO1xuICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoQ2xvbmUoZ2x5cGhzW3N5bWJdLmQpO1xuICAgIHBhdGhBcnJheVswXVsxXSArPXg7XG4gICAgcGF0aEFycmF5WzBdWzJdICs9eTtcbiAgICB2YXIgcGF0aCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJyYXkubGVuZ3RoOyBpKyspXG4gICAgXHRwYXRoICs9IHBhdGhBcnJheVtpXS5qb2luKFwiIFwiKTtcbiAgICByZXR1cm4gcGFwZXIucGF0aCh7cGF0aDpwYXRoLCBzdHJva2U6XCJub25lXCIsIGZpbGw6XCIjMDAwMDAwXCIsICdjbGFzcyc6IGtsYXNzIH0pO1xuICAgfSxcblxuICBnZXRQYXRoRm9yU3ltYm9sOiBmdW5jdGlvbiAoeCx5LHN5bWIsc2NhbGV4LCBzY2FsZXkpIHtcbiAgICBzY2FsZXggPSBzY2FsZXggfHwgMTtcbiAgICBzY2FsZXkgPSBzY2FsZXkgfHwgMTtcbiAgICBpZiAoIWdseXBoc1tzeW1iXSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBhdGhBcnJheSA9IHBhdGhDbG9uZShnbHlwaHNbc3ltYl0uZCk7XG4gICAgaWYgKHNjYWxleCE9PTEgfHwgc2NhbGV5IT09MSkgcGF0aFNjYWxlKHBhdGhBcnJheSxzY2FsZXgsc2NhbGV5KTtcbiAgICBwYXRoQXJyYXlbMF1bMV0gKz14O1xuICAgIHBhdGhBcnJheVswXVsyXSArPXk7XG5cbiAgICByZXR1cm4gcGF0aEFycmF5O1xuICB9LFxuXG4gIGdldFN5bWJvbFdpZHRoOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgaWYgKGdseXBoc1tzeW1ib2xdKSByZXR1cm4gZ2x5cGhzW3N5bWJvbF0udztcbiAgICByZXR1cm4gMDtcbiAgfSxcblxuXHRzeW1ib2xIZWlnaHRJblBpdGNoZXM6IGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdHZhciBoZWlnaHQgPSBnbHlwaHNbc3ltYm9sXSA/IGdseXBoc1tzeW1ib2xdLmggOiAwO1xuXHRcdHJldHVybiBoZWlnaHQgLyBzcGFjaW5nLlNURVA7XG5cdH0sXG5cbiAgZ2V0U3ltYm9sQWxpZ246IGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICBpZiAoc3ltYm9sLnN1YnN0cmluZygwLDcpPT09XCJzY3JpcHRzXCIgJiZcblx0c3ltYm9sIT09XCJzY3JpcHRzLnJvbGxcIikge1xuICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XG4gICAgfVxuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfSxcblxuICBnZXRZQ29ycjogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgIHN3aXRjaChzeW1ib2wpIHtcbiAgICBjYXNlIFwiMFwiOlxuICAgIGNhc2UgXCIxXCI6XG4gICAgY2FzZSBcIjJcIjpcbiAgICBjYXNlIFwiM1wiOlxuICAgIGNhc2UgXCI0XCI6XG4gICAgY2FzZSBcIjVcIjpcbiAgICBjYXNlIFwiNlwiOlxuICAgIGNhc2UgXCI3XCI6XG4gICAgY2FzZSBcIjhcIjpcbiAgICBjYXNlIFwiOVwiOlxuICAgIGNhc2UgXCIrXCI6IHJldHVybiAtMjtcbiAgICBjYXNlIFwidGltZXNpZy5jb21tb25cIjpcbiAgICBjYXNlIFwidGltZXNpZy5jdXRcIjogcmV0dXJuIDA7XG4gICAgY2FzZSBcImZsYWdzLmQzMm5kXCI6IHJldHVybiAtMTtcbiAgICBjYXNlIFwiZmxhZ3MuZDY0dGhcIjogcmV0dXJuIC0yO1xuICAgIGNhc2UgXCJmbGFncy51MzJuZFwiOiByZXR1cm4gMTtcbiAgICBjYXNlIFwiZmxhZ3MudTY0dGhcIjogcmV0dXJuIDM7XG4gICAgY2FzZSBcInJlc3RzLndob2xlXCI6IHJldHVybiAxO1xuICAgIGNhc2UgXCJyZXN0cy5oYWxmXCI6IHJldHVybiAtMTtcbiAgICBjYXNlIFwicmVzdHMuOHRoXCI6IHJldHVybiAtMTtcbiAgICBjYXNlIFwicmVzdHMucXVhcnRlclwiOiByZXR1cm4gLTE7XG4gICAgY2FzZSBcInJlc3RzLjE2dGhcIjogcmV0dXJuIC0xO1xuICAgIGNhc2UgXCJyZXN0cy4zMm5kXCI6IHJldHVybiAtMTtcbiAgICBjYXNlIFwicmVzdHMuNjR0aFwiOiByZXR1cm4gLTE7XG5cdFx0Y2FzZSBcImZcIjpcblx0XHRjYXNlIFwibVwiOlxuXHRcdGNhc2UgXCJwXCI6XG5cdFx0Y2FzZSBcInNcIjpcblx0XHRjYXNlIFwielwiOlxuXHRcdFx0cmV0dXJuIC00O1xuXHRcdGNhc2UgXCJzY3JpcHRzLnRyaWxsXCI6XG5cdFx0Y2FzZSBcInNjcmlwdHMudXBib3dcIjpcblx0XHRjYXNlIFwic2NyaXB0cy5kb3duYm93XCI6XG5cdFx0XHRyZXR1cm4gLTI7XG5cdFx0Y2FzZSBcInNjcmlwdHMudWZlcm1hdGFcIjpcblx0XHRjYXNlIFwic2NyaXB0cy53ZWRnZVwiOlxuXHRcdGNhc2UgXCJzY3JpcHRzLnJvbGxcIjpcblx0XHRjYXNlIFwic2NyaXB0cy5zaG9ydHBocmFzZVwiOlxuXHRcdGNhc2UgXCJzY3JpcHRzLmxvbmdwaHJhc2VcIjpcblx0XHRcdHJldHVybiAtMTtcblx0XHRjYXNlIFwic2NyaXB0cy5kZmVybWF0YVwiOlxuXHRcdFx0cmV0dXJuIDE7XG4gICAgZGVmYXVsdDogcmV0dXJuIDA7XG4gICAgfVxuICB9LFxuXHRzZXRTeW1ib2w6IGZ1bmN0aW9uKG5hbWUsIHBhdGgpIHtcblx0XHRnbHlwaHNbbmFtZV0gPSBwYXRoO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdseXBoczsgLy8gd2UgbmVlZCB0aGUgZ2x5cGhzIGZvciBsYXlvdXQgaW5mb3JtYXRpb25cbiIsIi8vICAgIGFiY19jcmVhdGVfY2xlZi5qc1xuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSBhbmQgUGF1bCBSb3NlblxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQWJzb2x1dGVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfYWJzb2x1dGVfZWxlbWVudCcpO1xudmFyIGdseXBocyA9IHJlcXVpcmUoJy4vYWJjX2dseXBocycpO1xudmFyIFJlbGF0aXZlRWxlbWVudCA9IHJlcXVpcmUoJy4vYWJjX3JlbGF0aXZlX2VsZW1lbnQnKTtcblxudmFyIGNyZWF0ZUNsZWY7XG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Y3JlYXRlQ2xlZiA9IGZ1bmN0aW9uKGVsZW0sIHR1bmVOdW1iZXIpIHtcblx0XHR2YXIgY2xlZjtcblx0XHR2YXIgb2N0YXZlID0gMDtcblx0XHR2YXIgYWJzZWxlbSA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQoZWxlbSwwLDEwLCAnc3RhZmYtZXh0cmEnLCB0dW5lTnVtYmVyKTtcblx0XHRhYnNlbGVtLmlzQ2xlZiA9IHRydWU7XG5cdFx0c3dpdGNoIChlbGVtLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJ0cmVibGVcIjogY2xlZiA9IFwiY2xlZnMuR1wiOyBicmVhaztcblx0XHRcdGNhc2UgXCJ0ZW5vclwiOiBjbGVmPVwiY2xlZnMuQ1wiOyBicmVhaztcblx0XHRcdGNhc2UgXCJhbHRvXCI6IGNsZWY9XCJjbGVmcy5DXCI7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcImJhc3NcIjogY2xlZj1cImNsZWZzLkZcIjsgYnJlYWs7XG5cdFx0XHRjYXNlICd0cmVibGUrOCc6IGNsZWYgPSBcImNsZWZzLkdcIjsgb2N0YXZlID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICd0ZW5vcis4JzpjbGVmPVwiY2xlZnMuQ1wiOyBvY3RhdmUgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJ2Jhc3MrOCc6IGNsZWY9XCJjbGVmcy5GXCI7IG9jdGF2ZSA9IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYWx0bys4JzogY2xlZj1cImNsZWZzLkNcIjsgb2N0YXZlID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICd0cmVibGUtOCc6IGNsZWYgPSBcImNsZWZzLkdcIjsgb2N0YXZlID0gLTE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAndGVub3ItOCc6Y2xlZj1cImNsZWZzLkNcIjsgb2N0YXZlID0gLTE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYmFzcy04JzogY2xlZj1cImNsZWZzLkZcIjsgb2N0YXZlID0gLTE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYWx0by04JzogY2xlZj1cImNsZWZzLkNcIjsgb2N0YXZlID0gLTE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnbm9uZSc6IHJldHVybiBudWxsO1xuXHRcdFx0Y2FzZSAncGVyYyc6IGNsZWY9XCJjbGVmcy5wZXJjXCI7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogYWJzZWxlbS5hZGRDaGlsZChuZXcgUmVsYXRpdmVFbGVtZW50KFwiY2xlZj1cIitlbGVtLnR5cGUsIDAsIDAsIHVuZGVmaW5lZCwge3R5cGU6XCJkZWJ1Z1wifSkpO1xuXHRcdH1cblx0XHQvLyBpZiAoZWxlbS52ZXJ0aWNhbFBvcykge1xuXHRcdC8vIHBpdGNoID0gZWxlbS52ZXJ0aWNhbFBvcztcblx0XHQvLyB9XG5cdFx0dmFyIGR4ID01O1xuXHRcdGlmIChjbGVmKSB7XG5cdFx0XHRhYnNlbGVtLmFkZFJpZ2h0KG5ldyBSZWxhdGl2ZUVsZW1lbnQoY2xlZiwgZHgsIGdseXBocy5nZXRTeW1ib2xXaWR0aChjbGVmKSwgZWxlbS5jbGVmUG9zKSk7XG5cblx0XHRcdGlmIChjbGVmID09PSAnY2xlZnMuRycpIHtcblx0XHRcdFx0YWJzZWxlbS50b3AgPSAxMztcblx0XHRcdFx0YWJzZWxlbS5ib3R0b20gPSAtMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFic2VsZW0udG9wID0gMTA7XG5cdFx0XHRcdGFic2VsZW0uYm90dG9tID0gMjtcblx0XHRcdH1cblx0XHRcdGlmIChvY3RhdmUgIT09IDApIHtcblx0XHRcdFx0dmFyIHNjYWxlID0gMiAvIDM7XG5cdFx0XHRcdHZhciBhZGp1c3RzcGFjaW5nID0gKGdseXBocy5nZXRTeW1ib2xXaWR0aChjbGVmKSAtIGdseXBocy5nZXRTeW1ib2xXaWR0aChcIjhcIikgKiBzY2FsZSkgLyAyO1xuXHRcdFx0XHRhYnNlbGVtLmFkZFJpZ2h0KG5ldyBSZWxhdGl2ZUVsZW1lbnQoXCI4XCIsIGR4ICsgYWRqdXN0c3BhY2luZywgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwiOFwiKSAqIHNjYWxlLCAob2N0YXZlID4gMCkgPyBhYnNlbGVtLnRvcCArIDMgOiBhYnNlbGVtLmJvdHRvbSAtIDEsIHtcblx0XHRcdFx0XHRzY2FsZXg6IHNjYWxlLFxuXHRcdFx0XHRcdHNjYWxleTogc2NhbGVcblx0XHRcdFx0fSkpO1xuXHRcdFx0XHRhYnNlbGVtLnRvcCArPSAyO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYWJzZWxlbTtcblx0fTtcblxufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVDbGVmO1xuIiwiLy8gICAgYWJjX2NyZWF0ZV9rZXlfc2lnbmF0dXJlLmpzXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBBYnNvbHV0ZUVsZW1lbnQgPSByZXF1aXJlKCcuL2FiY19hYnNvbHV0ZV9lbGVtZW50Jyk7XG52YXIgZ2x5cGhzID0gcmVxdWlyZSgnLi9hYmNfZ2x5cGhzJyk7XG52YXIgUmVsYXRpdmVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfcmVsYXRpdmVfZWxlbWVudCcpO1xuXG52YXIgcGFyc2VDb21tb24gPSByZXF1aXJlKCcuLi9wYXJzZS9hYmNfY29tbW9uJyk7XG5cbnZhciBjcmVhdGVLZXlTaWduYXR1cmU7XG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Y3JlYXRlS2V5U2lnbmF0dXJlID0gZnVuY3Rpb24oZWxlbSwgdHVuZU51bWJlcikge1xuXHRcdGlmICghZWxlbS5hY2NpZGVudGFscyB8fCBlbGVtLmFjY2lkZW50YWxzLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdHZhciBhYnNlbGVtID0gbmV3IEFic29sdXRlRWxlbWVudChlbGVtLCAwLCAxMCwgJ3N0YWZmLWV4dHJhJywgdHVuZU51bWJlcik7XG5cdFx0YWJzZWxlbS5pc0tleVNpZyA9IHRydWU7XG5cdFx0dmFyIGR4ID0gMDtcblx0XHRwYXJzZUNvbW1vbi5lYWNoKGVsZW0uYWNjaWRlbnRhbHMsIGZ1bmN0aW9uKGFjYykge1xuXHRcdFx0dmFyIHN5bWJvbDtcblx0XHRcdHN3aXRjaChhY2MuYWNjKSB7XG5cdFx0XHRcdGNhc2UgXCJzaGFycFwiOiBzeW1ib2wgPSBcImFjY2lkZW50YWxzLnNoYXJwXCI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibmF0dXJhbFwiOiBzeW1ib2wgPSBcImFjY2lkZW50YWxzLm5hdFwiOyBicmVhaztcblx0XHRcdFx0Y2FzZSBcImZsYXRcIjogc3ltYm9sID0gXCJhY2NpZGVudGFscy5mbGF0XCI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicXVhcnRlcnNoYXJwXCI6IHN5bWJvbCA9IFwiYWNjaWRlbnRhbHMuaGFsZnNoYXJwXCI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicXVhcnRlcmZsYXRcIjogc3ltYm9sID0gXCJhY2NpZGVudGFscy5oYWxmZmxhdFwiOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogc3ltYm9sID0gXCJhY2NpZGVudGFscy5mbGF0XCI7XG5cdFx0XHR9XG5cdFx0XHRhYnNlbGVtLmFkZFJpZ2h0KG5ldyBSZWxhdGl2ZUVsZW1lbnQoc3ltYm9sLCBkeCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWJvbCksIGFjYy52ZXJ0aWNhbFBvcywge3RoaWNrbmVzczogZ2x5cGhzLnN5bWJvbEhlaWdodEluUGl0Y2hlcyhzeW1ib2wpfSkpO1xuXHRcdFx0ZHggKz0gZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWJvbCkgKyAyO1xuXHRcdH0sIHRoaXMpO1xuXHRcdHJldHVybiBhYnNlbGVtO1xuXHR9O1xufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVLZXlTaWduYXR1cmU7XG4iLCIvLyAgICBhYmNfY3JlYXRlX3RpbWVfc2lnbmF0dXJlLmpzXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBBYnNvbHV0ZUVsZW1lbnQgPSByZXF1aXJlKCcuL2FiY19hYnNvbHV0ZV9lbGVtZW50Jyk7XG52YXIgZ2x5cGhzID0gcmVxdWlyZSgnLi9hYmNfZ2x5cGhzJyk7XG52YXIgUmVsYXRpdmVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfcmVsYXRpdmVfZWxlbWVudCcpO1xuXG52YXIgY3JlYXRlVGltZVNpZ25hdHVyZTtcblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRjcmVhdGVUaW1lU2lnbmF0dXJlID0gZnVuY3Rpb24oZWxlbSwgdHVuZU51bWJlcikge1xuXHRcdHZhciBhYnNlbGVtID0gbmV3IEFic29sdXRlRWxlbWVudChlbGVtLDAsMTAsICdzdGFmZi1leHRyYScsIHR1bmVOdW1iZXIpO1xuXHRcdGlmIChlbGVtLnR5cGUgPT09IFwic3BlY2lmaWVkXCIpIHtcblx0XHRcdHZhciB4ID0gMDtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS52YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAoaSAhPT0gMCkge1xuXHRcdFx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudCgnKycsIHgrMSwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwiK1wiKSwgNiwge3RoaWNrbmVzczogZ2x5cGhzLnN5bWJvbEhlaWdodEluUGl0Y2hlcyhcIitcIil9KSk7XG5cdFx0XHRcdFx0eCArPSBnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoXCIrXCIpKzI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVsZW0udmFsdWVbaV0uZGVuKSB7XG5cdFx0XHRcdFx0dmFyIG51bVdpZHRoID0gMDtcblx0XHRcdFx0XHRmb3IgKHZhciBpMiA9IDA7IGkyIDwgZWxlbS52YWx1ZVtpXS5udW0ubGVuZ3RoOyBpMisrKVxuXHRcdFx0XHRcdFx0bnVtV2lkdGggKz0gZ2x5cGhzLmdldFN5bWJvbFdpZHRoKGVsZW0udmFsdWVbaV0ubnVtLmNoYXJBdChpMikpO1xuXHRcdFx0XHRcdHZhciBkZW5XaWR0aCA9IDA7XG5cdFx0XHRcdFx0Zm9yIChpMiA9IDA7IGkyIDwgZWxlbS52YWx1ZVtpXS5udW0ubGVuZ3RoOyBpMisrKVxuXHRcdFx0XHRcdFx0ZGVuV2lkdGggKz0gZ2x5cGhzLmdldFN5bWJvbFdpZHRoKGVsZW0udmFsdWVbaV0uZGVuLmNoYXJBdChpMikpO1xuXHRcdFx0XHRcdHZhciBtYXhXaWR0aCA9IE1hdGgubWF4KG51bVdpZHRoLCBkZW5XaWR0aCk7XG5cdFx0XHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KGVsZW0udmFsdWVbaV0ubnVtLCB4KyhtYXhXaWR0aC1udW1XaWR0aCkvMiwgbnVtV2lkdGgsIDgsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKGVsZW0udmFsdWVbaV0ubnVtLmNoYXJBdCgwKSkgfSkpO1xuXHRcdFx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChlbGVtLnZhbHVlW2ldLmRlbiwgeCsobWF4V2lkdGgtZGVuV2lkdGgpLzIsIGRlbldpZHRoLCA0LCB7IHRoaWNrbmVzczogZ2x5cGhzLnN5bWJvbEhlaWdodEluUGl0Y2hlcyhlbGVtLnZhbHVlW2ldLmRlbi5jaGFyQXQoMCkpIH0pKTtcblx0XHRcdFx0XHR4ICs9IG1heFdpZHRoXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHRoaXNXaWR0aCA9IDA7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaTMgPSAwOyBpMyA8IGVsZW0udmFsdWVbaV0ubnVtLmxlbmd0aDsgaTMrKylcblx0XHRcdFx0XHRcdHRoaXNXaWR0aCArPSBnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoZWxlbS52YWx1ZVtpXS5udW0uY2hhckF0KGkzKSk7XG5cdFx0XHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KGVsZW0udmFsdWVbaV0ubnVtLCB4LCB0aGlzV2lkdGgsIDYsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKGVsZW0udmFsdWVbaV0ubnVtLmNoYXJBdCgwKSkgfSkpO1xuXHRcdFx0XHRcdHggKz0gdGhpc1dpZHRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChlbGVtLnR5cGUgPT09IFwiY29tbW9uX3RpbWVcIikge1xuXHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KFwidGltZXNpZy5jb21tb25cIiwgMCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwidGltZXNpZy5jb21tb25cIiksIDYsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKFwidGltZXNpZy5jb21tb25cIikgfSkpO1xuXG5cdFx0fSBlbHNlIGlmIChlbGVtLnR5cGUgPT09IFwiY3V0X3RpbWVcIikge1xuXHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KFwidGltZXNpZy5jdXRcIiwgMCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwidGltZXNpZy5jdXRcIiksIDYsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKFwidGltZXNpZy5jdXRcIikgfSkpO1xuXHRcdH0gZWxzZSBpZiAoZWxlbS50eXBlID09PSBcInRlbXB1c19pbXBlcmZlY3R1bVwiKSB7XG5cdFx0XHRhYnNlbGVtLmFkZFJpZ2h0KG5ldyBSZWxhdGl2ZUVsZW1lbnQoXCJ0aW1lc2lnLmltcGVyZmVjdHVtXCIsIDAsIGdseXBocy5nZXRTeW1ib2xXaWR0aChcInRpbWVzaWcuaW1wZXJmZWN0dW1cIiksIDYsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKFwidGltZXNpZy5pbXBlcmZlY3R1bVwiKSB9KSk7XG5cdFx0fSBlbHNlIGlmIChlbGVtLnR5cGUgPT09IFwidGVtcHVzX2ltcGVyZmVjdHVtX3Byb2xhdGlvXCIpIHtcblx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChcInRpbWVzaWcuaW1wZXJmZWN0dW0yXCIsIDAsIGdseXBocy5nZXRTeW1ib2xXaWR0aChcInRpbWVzaWcuaW1wZXJmZWN0dW0yXCIpLCA2LCB7IHRoaWNrbmVzczogZ2x5cGhzLnN5bWJvbEhlaWdodEluUGl0Y2hlcyhcInRpbWVzaWcuaW1wZXJmZWN0dW0yXCIpIH0pKTtcblx0XHR9IGVsc2UgaWYgKGVsZW0udHlwZSA9PT0gXCJ0ZW1wdXNfcGVyZmVjdHVtXCIpIHtcblx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChcInRpbWVzaWcucGVyZmVjdHVtXCIsIDAsIGdseXBocy5nZXRTeW1ib2xXaWR0aChcInRpbWVzaWcucGVyZmVjdHVtXCIpLCA2LCB7IHRoaWNrbmVzczogZ2x5cGhzLnN5bWJvbEhlaWdodEluUGl0Y2hlcyhcInRpbWVzaWcucGVyZmVjdHVtXCIpIH0pKTtcblx0XHR9IGVsc2UgaWYgKGVsZW0udHlwZSA9PT0gXCJ0ZW1wdXNfcGVyZmVjdHVtX3Byb2xhdGlvXCIpIHtcblx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChcInRpbWVzaWcucGVyZmVjdHVtMlwiLCAwLCBnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoXCJ0aW1lc2lnLnBlcmZlY3R1bTJcIiksIDYsIHsgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKFwidGltZXNpZy5wZXJmZWN0dW0yXCIpIH0pKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5sb2coXCJ0aW1lIHNpZ25hdHVyZTpcIixlbGVtKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFic2VsZW07XG5cdH07XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbWVTaWduYXR1cmU7XG4iLCIvLyAgICBhYmNfZHluYW1pY19kZWNvcmF0aW9uLmpzOiBEZWZpbml0aW9uIG9mIHRoZSBEeW5hbWljRGVjb3JhdGlvbiBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHNwYWNpbmcgPSByZXF1aXJlKCcuL2FiY19zcGFjaW5nJyk7XG5cbnZhciBEeW5hbWljRGVjb3JhdGlvbiA9IGZ1bmN0aW9uIER5bmFtaWNEZWNvcmF0aW9uKGFuY2hvciwgZGVjLCBwb3NpdGlvbikge1xuXHR0aGlzLmFuY2hvciA9IGFuY2hvcjtcblx0dGhpcy5kZWMgPSBkZWM7XG5cdGlmIChwb3NpdGlvbiA9PT0gJ2JlbG93Jylcblx0XHR0aGlzLnZvbHVtZUhlaWdodEJlbG93ID0gNTtcblx0ZWxzZVxuXHRcdHRoaXMudm9sdW1lSGVpZ2h0QWJvdmUgPSA1O1xuXHR0aGlzLnBpdGNoID0gdW5kZWZpbmVkOyAvLyBUaGlzIHdpbGwgYmUgc2V0IGxhdGVyXG59O1xuXG5EeW5hbWljRGVjb3JhdGlvbi5wcm90b3R5cGUuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzID0gZnVuY3Rpb24ocG9zaXRpb25ZKSB7XG5cdGlmICh0aGlzLnZvbHVtZUhlaWdodEFib3ZlKVxuXHRcdHRoaXMucGl0Y2ggPSBwb3NpdGlvblkudm9sdW1lSGVpZ2h0QWJvdmU7XG5cdGVsc2Vcblx0XHR0aGlzLnBpdGNoID0gcG9zaXRpb25ZLnZvbHVtZUhlaWdodEJlbG93O1xufTtcblxuRHluYW1pY0RlY29yYXRpb24ucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihyZW5kZXJlciwgbGluZXN0YXJ0eCwgbGluZWVuZHgpIHtcblx0aWYgKHRoaXMucGl0Y2ggPT09IHVuZGVmaW5lZClcblx0XHR3aW5kb3cuY29uc29sZS5lcnJvcihcIkR5bmFtaWMgRWxlbWVudCB5LWNvb3JkaW5hdGUgbm90IHNldC5cIik7XG5cdHZhciBzY2FsZXggPSAxO1xuXHR2YXIgc2NhbGV5ID0gMTtcblx0cmVuZGVyZXIucHJpbnRTeW1ib2wodGhpcy5hbmNob3IueCwgdGhpcy5waXRjaCwgdGhpcy5kZWMsIHNjYWxleCwgc2NhbGV5LCByZW5kZXJlci5hZGRDbGFzc2VzKCdkZWNvcmF0aW9uJykpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEeW5hbWljRGVjb3JhdGlvbjtcbiIsIi8qKlxuICogc3ByaW50ZigpIGZvciBKYXZhU2NyaXB0IHYuMC40XG4gKlxuIENvcHlyaWdodCAoYykgMjAwNy1wcmVzZW50LCBBbGV4YW5kcnUgTcSDcsSDyJl0ZWFudSA8aGVsbG9AYWxleGVpLnJvPlxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhpcyBzb2Z0d2FyZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlXG4gdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1JcbiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8vZnVuY3Rpb24gc3RyX3JlcGVhdChpLCBtKSB7IGZvciAodmFyIG8gPSBbXTsgbSA+IDA7IG9bLS1tXSA9IGkpOyByZXR1cm4oby5qb2luKCcnKSk7IH1cblxudmFyIHNwcmludGYgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGkgPSAwLCBhLCBmID0gYXJndW1lbnRzW2krK10sIG8gPSBbXSwgbSwgcCwgYywgeDtcbiAgd2hpbGUgKGYpIHtcbiAgICBpZiAobSA9IC9eW15cXHgyNV0rLy5leGVjKGYpKSBvLnB1c2gobVswXSk7XG4gICAgZWxzZSBpZiAobSA9IC9eXFx4MjV7Mn0vLmV4ZWMoZikpIG8ucHVzaCgnJScpO1xuICAgIGVsc2UgaWYgKG0gPSAvXlxceDI1KD86KFxcZCspXFwkKT8oXFwrKT8oMHwnW14kXSk/KC0pPyhcXGQrKT8oPzpcXC4oXFxkKykpPyhbYi1mb3N1eFhdKS8uZXhlYyhmKSkge1xuICAgICAgaWYgKCgoYSA9IGFyZ3VtZW50c1ttWzFdIHx8IGkrK10pID09IG51bGwpIHx8IChhID09IHVuZGVmaW5lZCkpIHRocm93KFwiVG9vIGZldyBhcmd1bWVudHMuXCIpO1xuICAgICAgaWYgKC9bXnNdLy50ZXN0KG1bN10pICYmICh0eXBlb2YoYSkgIT0gJ251bWJlcicpKVxuICAgICAgICB0aHJvdyhcIkV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kIFwiICsgdHlwZW9mKGEpKTtcbiAgICAgIHN3aXRjaCAobVs3XSkge1xuICAgICAgICBjYXNlICdiJzogYSA9IGEudG9TdHJpbmcoMik7IGJyZWFrO1xuICAgICAgICBjYXNlICdjJzogYSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7IGJyZWFrO1xuICAgICAgICBjYXNlICdkJzogYSA9IHBhcnNlSW50KGEpOyBicmVhaztcbiAgICAgICAgY2FzZSAnZSc6IGEgPSBtWzZdID8gYS50b0V4cG9uZW50aWFsKG1bNl0pIDogYS50b0V4cG9uZW50aWFsKCk7IGJyZWFrO1xuICAgICAgICBjYXNlICdmJzogYSA9IG1bNl0gPyBwYXJzZUZsb2F0KGEpLnRvRml4ZWQobVs2XSkgOiBwYXJzZUZsb2F0KGEpOyBicmVhaztcbiAgICAgICAgY2FzZSAnbyc6IGEgPSBhLnRvU3RyaW5nKDgpOyBicmVhaztcbiAgICAgICAgY2FzZSAncyc6IGEgPSAoKGEgPSBTdHJpbmcoYSkpICYmIG1bNl0gPyBhLnN1YnN0cmluZygwLCBtWzZdKSA6IGEpOyBicmVhaztcbiAgICAgICAgY2FzZSAndSc6IGEgPSBNYXRoLmFicyhhKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3gnOiBhID0gYS50b1N0cmluZygxNik7IGJyZWFrO1xuICAgICAgICBjYXNlICdYJzogYSA9IGEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IGJyZWFrO1xuICAgICAgfVxuICAgICAgYSA9ICgvW2RlZl0vLnRlc3QobVs3XSkgJiYgbVsyXSAmJiBhID4gMCA/ICcrJyArIGEgOiBhKTtcbiAgICAgIGMgPSBtWzNdID8gbVszXSA9PSAnMCcgPyAnMCcgOiBtWzNdLmNoYXJBdCgxKSA6ICcgJztcbiAgICAgIHggPSBtWzVdIC0gU3RyaW5nKGEpLmxlbmd0aDtcbiAgICAgIHAgPSBtWzVdID8gc3RyX3JlcGVhdChjLCB4KSA6ICcnO1xuICAgICAgby5wdXNoKG1bNF0gPyBhICsgcCA6IHAgKyBhKTtcbiAgICB9XG4gICAgZWxzZSB0aHJvdyAoXCJIdWggPyFcIik7XG4gICAgZiA9IGYuc3Vic3RyaW5nKG1bMF0ubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gby5qb2luKCcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc3ByaW50ZjtcbiIsIi8vICAgIGFiY19jcmVzY2VuZG9fZWxlbWVudC5qczogRGVmaW5pdGlvbiBvZiB0aGUgQ3Jlc2NlbmRvRWxlbSBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHNwcmludGYgPSByZXF1aXJlKCcuL3NwcmludGYnKTtcblxudmFyIENyZXNjZW5kb0VsZW0gPSBmdW5jdGlvbiBDcmVzY2VuZG9FbGVtKGFuY2hvcjEsIGFuY2hvcjIsIGRpciwgcG9zaXRpb25pbmcpIHtcblx0dGhpcy5hbmNob3IxID0gYW5jaG9yMTsgLy8gbXVzdCBoYXZlIGEgLnggYW5kIGEgLnBhcmVudCBwcm9wZXJ0eSBvciBiZSBudWxsIChtZWFucyBzdGFydHMgYXQgdGhlIFwiYmVnaW5uaW5nXCIgb2YgdGhlIGxpbmUgLSBhZnRlciBrZXlzaWcpXG5cdHRoaXMuYW5jaG9yMiA9IGFuY2hvcjI7IC8vIG11c3QgaGF2ZSBhIC54IHByb3BlcnR5IG9yIGJlIG51bGwgKG1lYW5zIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSlcblx0dGhpcy5kaXIgPSBkaXI7IC8vIGVpdGhlciBcIjxcIiBvciBcIj5cIlxuXHRpZiAocG9zaXRpb25pbmcgPT09ICdhYm92ZScpXG5cdFx0dGhpcy5keW5hbWljSGVpZ2h0QWJvdmUgPSA0O1xuXHRlbHNlXG5cdFx0dGhpcy5keW5hbWljSGVpZ2h0QmVsb3cgPSA0O1xuXHR0aGlzLnBpdGNoID0gdW5kZWZpbmVkOyAvLyBUaGlzIHdpbGwgYmUgc2V0IGxhdGVyXG59O1xuXG5DcmVzY2VuZG9FbGVtLnByb3RvdHlwZS5zZXRVcHBlckFuZExvd2VyRWxlbWVudHMgPSBmdW5jdGlvbihwb3NpdGlvblkpIHtcblx0aWYgKHRoaXMuZHluYW1pY0hlaWdodEFib3ZlKVxuXHRcdHRoaXMucGl0Y2ggPSBwb3NpdGlvblkuZHluYW1pY0hlaWdodEFib3ZlO1xuXHRlbHNlXG5cdFx0dGhpcy5waXRjaCA9IHBvc2l0aW9uWS5keW5hbWljSGVpZ2h0QmVsb3c7XG59O1xuXG5DcmVzY2VuZG9FbGVtLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cdGlmICh0aGlzLnBpdGNoID09PSB1bmRlZmluZWQpXG5cdFx0d2luZG93LmNvbnNvbGUuZXJyb3IoXCJDcmVzY2VuZG8gRWxlbWVudCB5LWNvb3JkaW5hdGUgbm90IHNldC5cIik7XG5cdHZhciB5ID0gcmVuZGVyZXIuY2FsY1kodGhpcy5waXRjaCkgKyA0OyAvLyBUaGlzIGlzIHRoZSB0b3AgcGl4ZWwgdG8gdXNlIChpdCBpcyBvZmZzZXQgYSBsaXR0bGUgc28gdGhhdCBpdCBsb29rcyBnb29kIHdpdGggdGhlIHZvbHVtZSBtYXJrcy4pXG5cdHZhciBoZWlnaHQgPSA4O1xuXHRpZiAodGhpcy5kaXIgPT09IFwiPFwiKSB7XG5cdFx0dGhpcy5kcmF3TGluZShyZW5kZXJlciwgeStoZWlnaHQvMiwgeSk7XG5cdFx0dGhpcy5kcmF3TGluZShyZW5kZXJlciwgeStoZWlnaHQvMiwgeStoZWlnaHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuZHJhd0xpbmUocmVuZGVyZXIsIHksIHkraGVpZ2h0LzIpO1xuXHRcdHRoaXMuZHJhd0xpbmUocmVuZGVyZXIsIHkraGVpZ2h0LCB5K2hlaWdodC8yKTtcblx0fVxufTtcblxuQ3Jlc2NlbmRvRWxlbS5wcm90b3R5cGUuZHJhd0xpbmUgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHkxLCB5Mikge1xuXHQvLyBUT0RPLVBFUjogVGhpcyBpcyBqdXN0IGEgcXVpY2sgaGFjayB0byBtYWtlIHRoZSBkeW5hbWljIG1hcmtzIG5vdCBjcmFzaCBpZiB0aGV5IGFyZSBtaXNtYXRjaGVkLiBTZWUgdGhlIHNsdXIgdHJlYXRtZW50IGZvciB0aGUgd2F5IHRvIGdldCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQuXG5cdHZhciBsZWZ0ID0gdGhpcy5hbmNob3IxID8gdGhpcy5hbmNob3IxLnggOiAwO1xuXHR2YXIgcmlnaHQgPSB0aGlzLmFuY2hvcjIgPyB0aGlzLmFuY2hvcjIueCA6IDgwMDtcblx0dmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmXCIsXG5cdFx0bGVmdCwgeTEsIHJpZ2h0LCB5Mik7XG5cdHJlbmRlcmVyLnByaW50UGF0aCh7cGF0aDpwYXRoU3RyaW5nLCBzdHJva2U6XCIjMDAwMDAwXCIsICdjbGFzcyc6IHJlbmRlcmVyLmFkZENsYXNzZXMoJ2RlY29yYXRpb24nKX0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDcmVzY2VuZG9FbGVtO1xuIiwiLy8gICAgYWJjX3RpZV9lbGVtZW50LmpzOiBEZWZpbml0aW9uIG9mIHRoZSBUaWVFbGVtZW50IGNsYXNzLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSBhbmQgUGF1bCBSb3NlblxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgVGllRWxlbSA9IGZ1bmN0aW9uIFRpZUVsZW0ob3B0aW9ucykge1xuLy9cdGNvbnNvbGUubG9nKFwiY29uc3RydWN0b3JcIiwgb3B0aW9ucy5hbmNob3IxID8gb3B0aW9ucy5hbmNob3IxLnBpdGNoIDogXCJOL0FcIiwgb3B0aW9ucy5hbmNob3IyID8gb3B0aW9ucy5hbmNob3IyLnBpdGNoIDogXCJOL0FcIiwgb3B0aW9ucy5pc1RpZSwgb3B0aW9ucy5pc0dyYWNlKTtcblx0dGhpcy5hbmNob3IxID0gb3B0aW9ucy5hbmNob3IxOyAvLyBtdXN0IGhhdmUgYSAueCBhbmQgYSAucGl0Y2gsIGFuZCBhIC5wYXJlbnQgcHJvcGVydHkgb3IgYmUgbnVsbCAobWVhbnMgc3RhcnRzIGF0IHRoZSBcImJlZ2lubmluZ1wiIG9mIHRoZSBsaW5lIC0gYWZ0ZXIga2V5c2lnKVxuXHR0aGlzLmFuY2hvcjIgPSBvcHRpb25zLmFuY2hvcjI7IC8vIG11c3QgaGF2ZSBhIC54IGFuZCBhIC5waXRjaCBwcm9wZXJ0eSBvciBiZSBudWxsIChtZWFucyBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpXG5cdGlmIChvcHRpb25zLmlzR3JhY2UpXG5cdFx0dGhpcy5pc0dyYWNlID0gdHJ1ZTtcblx0aWYgKG9wdGlvbnMuZml4ZWRZKVxuXHRcdHRoaXMuZml4ZWRZID0gdHJ1ZTtcblx0aWYgKG9wdGlvbnMuc3RlbURpcilcblx0XHR0aGlzLnN0ZW1EaXIgPSBvcHRpb25zLnN0ZW1EaXI7XG5cdGlmIChvcHRpb25zLnZvaWNlTnVtYmVyICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy52b2ljZU51bWJlciA9IG9wdGlvbnMudm9pY2VOdW1iZXI7XG5cdHRoaXMuaW50ZXJuYWxOb3RlcyA9IFtdO1xufTtcblxuVGllRWxlbS5wcm90b3R5cGUuYWRkSW50ZXJuYWxOb3RlID0gZnVuY3Rpb24obm90ZSkge1xuXHR0aGlzLmludGVybmFsTm90ZXMucHVzaChub3RlKTtcbn07XG5cblRpZUVsZW0ucHJvdG90eXBlLnNldEVuZEFuY2hvciA9IGZ1bmN0aW9uKGFuY2hvcjIpIHtcbi8vXHRjb25zb2xlLmxvZyhcImVuZFwiLCB0aGlzLmFuY2hvcjEgPyB0aGlzLmFuY2hvcjEucGl0Y2ggOiBcIk4vQVwiLCBhbmNob3IyID8gYW5jaG9yMi5waXRjaCA6IFwiTi9BXCIsIHRoaXMuaXNUaWUsIHRoaXMuaXNHcmFjZSk7XG5cdHRoaXMuYW5jaG9yMiA9IGFuY2hvcjI7IC8vIG11c3QgaGF2ZSBhIC54IGFuZCBhIC5waXRjaCBwcm9wZXJ0eSBvciBiZSBudWxsIChtZWFucyBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpXG59O1xuXG4vLyBJZiB3ZSBlbmNvdW50ZXIgYSByZXBlYXQgc2lnbiwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGV4dGVuZCBlaXRoZXIgYSB0aWUgb3IgYSBzbHVyIHBhc3QgaXQsIHNvIHRoZXNlIGFyZSBjYWxsZWQgdG8gYmUgYSBsaW1pdC5cblRpZUVsZW0ucHJvdG90eXBlLnNldFN0YXJ0WCA9IGZ1bmN0aW9uKHN0YXJ0TGltaXRFbGVtKSB7XG5cdHRoaXMuc3RhcnRMaW1pdFggPSBzdGFydExpbWl0RWxlbTtcbn07XG5cblRpZUVsZW0ucHJvdG90eXBlLnNldEVuZFggPSBmdW5jdGlvbihlbmRMaW1pdEVsZW0pIHtcblx0dGhpcy5lbmRMaW1pdFggPSBlbmRMaW1pdEVsZW07XG59O1xuXG5UaWVFbGVtLnByb3RvdHlwZS5zZXRIaW50ID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLmhpbnQgPSB0cnVlO1xufTtcblxuVGllRWxlbS5wcm90b3R5cGUuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzID0gZnVuY3Rpb24ocG9zaXRpb25ZKSB7XG5cdC8vIERvZXNuJ3QgZGVwZW5kIG9uIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlLlxufTtcblxuVGllRWxlbS5wcm90b3R5cGUuY2FsY1RpZURpcmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0Ly8gVGhlIHJ1bGVzOlxuXHQvLyAxKSBJZiBpdCBpcyBpbiBhIGdyYWNlIG5vdGUgZ3JvdXAsIHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBhbHdheXMgQkVMT1cuXG5cdC8vIDIpIElmIGl0IGlzIGluIGEgc2luZ2xlIHZvaWNlLCB0aGVuIHRoZSBkaXJlY3Rpb24gaXMgYWx3YXlzIE9QUE9TSVRFIG9mIHRoZSBzdGVtIChvciB3aGVyZSB0aGUgc3RlbSB3b3VsZCBoYXZlIGJlZW4gaW4gdGhlIGNhc2Ugb2Ygd2hvbGUgbm90ZXMuKVxuXHQvLyAzKSBJZiB0aGUgc3RlbSBkaXJlY3Rpb24gaXMgZm9yY2VkIChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGFyZSB0d28gdm9pY2VzIG9uIHRoZSBzYW1lIGxpbmUpLCB0aGVuIHRoZSBkaXJlY3Rpb24gaXMgdGhlIFNBTUUgYXMgdGhlIHN0ZW0gZGlyZWN0aW9uLlxuXG5cdGlmICh0aGlzLmlzR3JhY2UpXG5cdFx0dGhpcy5hYm92ZSA9IGZhbHNlO1xuXHRlbHNlIGlmICh0aGlzLnZvaWNlTnVtYmVyID09PSAwKVxuXHRcdHRoaXMuYWJvdmUgPSB0cnVlO1xuXHRlbHNlIGlmICh0aGlzLnZvaWNlTnVtYmVyID4gMClcblx0XHR0aGlzLmFib3ZlID0gZmFsc2U7XG5cdGVsc2Uge1xuXHRcdHZhciByZWZlcmVuY2VQaXRjaDtcblx0XHRpZiAodGhpcy5hbmNob3IxKVxuXHRcdFx0cmVmZXJlbmNlUGl0Y2ggPSB0aGlzLmFuY2hvcjEucGl0Y2g7XG5cdFx0ZWxzZSBpZiAodGhpcy5hbmNob3IyKVxuXHRcdFx0cmVmZXJlbmNlUGl0Y2ggPSB0aGlzLmFuY2hvcjIucGl0Y2g7XG5cdFx0ZWxzZVxuXHRcdFx0cmVmZXJlbmNlUGl0Y2ggPSAxNDsgLy8gVE9ETy1QRVI6IHRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiBub3JtYWxseS4gVGhpcyB3b3VsZCBpbXBseSB0aGF0IGEgdGllIGNyb3NzZWQgb3ZlciB0aHJlZSBsaW5lcywgc29tZXRoaW5nIGxpa2UgXCJDLVxcbnpcXG5DXCJcblx0XHQvLyBQdXQgdGhlIGFyYyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIG9mIHRoZSBzdGVtLiBUaGF0IGlzbid0IGFsd2F5cyB0aGUgcGl0Y2ggaWYgb25lIG9yIGJvdGggb2YgdGhlIG5vdGVzIGFyZSBiZWFtZWQgd2l0aCBzb21ldGhpbmcgdGhhdCBhZmZlY3RzIGl0cyBzdGVtLlxuXHRcdGlmICgodGhpcy5hbmNob3IxICYmIHRoaXMuYW5jaG9yMS5zdGVtRGlyID09PSAnZG93bicpICYmICh0aGlzLmFuY2hvcjIgJiYgdGhpcy5hbmNob3IyLnN0ZW1EaXIgPT09IFwiZG93blwiKSlcblx0XHRcdHRoaXMuYWJvdmUgPSB0cnVlO1xuXHRcdGVsc2UgaWYgKCh0aGlzLmFuY2hvcjEgJiYgdGhpcy5hbmNob3IxLnN0ZW1EaXIgPT09ICd1cCcpICYmICh0aGlzLmFuY2hvcjIgJiYgdGhpcy5hbmNob3IyLnN0ZW1EaXIgPT09IFwidXBcIikpXG5cdFx0XHR0aGlzLmFib3ZlID0gZmFsc2U7XG5cdFx0ZWxzZSBpZiAodGhpcy5hbmNob3IxICYmIHRoaXMuYW5jaG9yMilcblx0XHRcdHRoaXMuYWJvdmUgPSByZWZlcmVuY2VQaXRjaCA+PSA2O1xuXHRcdGVsc2UgaWYgKHRoaXMuYW5jaG9yMSlcblx0XHRcdHRoaXMuYWJvdmUgPSB0aGlzLmFuY2hvcjEuc3RlbURpciA9PT0gXCJkb3duXCI7XG5cdFx0ZWxzZSBpZiAodGhpcy5hbmNob3IyKVxuXHRcdFx0dGhpcy5hYm92ZSA9IHRoaXMuYW5jaG9yMi5zdGVtRGlyID09PSBcImRvd25cIjtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmFib3ZlID0gcmVmZXJlbmNlUGl0Y2ggPj0gNjtcblx0fVxufTtcblxuLy8gRnJvbSBcInN0YW5kYXJkIG11c2ljIG5vdGF0aW9uIHByYWN0aWNlXCIgYnkgTXVzaWMgUHVibGlzaGVyc+KAmSBBc3NvY2lhdGlvbjpcbi8vIDEpIFNsdXJzIGFyZSBwbGFjZWQgdW5kZXIgdGhlIG5vdGUgaGVhZHMgaWYgYWxsIHN0ZW1zIGdvIHVwLlxuLy8gMikgU2x1cnMgYXJlIHBsYWNlZCBvdmVyIHRoZSBub3RlIGhlYWRzIGlmIGFsbCBzdGVtcyBnbyBkb3duLlxuLy8gMykgSWYgdGhlcmUgYXJlIGJvdGggdXAgc3RlbXMgYW5kIGRvd24gc3RlbXMsIHByZWZlciBwbGFjaW5nIHRoZSBzbHVyIG92ZXIuXG4vLyA0KSBXaGVuIHRoZSBzdGFmZiBoYXMgb3Bwb3NpdGUgc3RlbW1lZCB2b2ljZXMsIGFsbCBzbHVycyBzaG91bGQgYmUgb24gdGhlIHN0ZW1tZWQgc2lkZS5cblxuVGllRWxlbS5wcm90b3R5cGUuY2FsY1NsdXJEaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0aGlzLmlzR3JhY2UpXG5cdFx0dGhpcy5hYm92ZSA9IGZhbHNlO1xuXHRlbHNlIGlmICh0aGlzLnZvaWNlTnVtYmVyID09PSAwKVxuXHRcdHRoaXMuYWJvdmUgPSB0cnVlO1xuXHRlbHNlIGlmICh0aGlzLnZvaWNlTnVtYmVyID4gMClcblx0XHR0aGlzLmFib3ZlID0gZmFsc2U7XG5cdGVsc2Uge1xuXHRcdHZhciBoYXNEb3duU3RlbSA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmFuY2hvcjEgJiYgdGhpcy5hbmNob3IxLnN0ZW1EaXIgPT09IFwiZG93blwiKVxuXHRcdFx0aGFzRG93blN0ZW0gPSB0cnVlO1xuXHRcdGlmICh0aGlzLmFuY2hvcjIgJiYgdGhpcy5hbmNob3IyLnN0ZW1EaXIgPT09IFwiZG93blwiKVxuXHRcdFx0aGFzRG93blN0ZW0gPSB0cnVlO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbE5vdGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgbiA9IHRoaXMuaW50ZXJuYWxOb3Rlc1tpXTtcblx0XHRcdGlmIChuLnN0ZW1EaXIgPT09IFwiZG93blwiKVxuXHRcdFx0XHRoYXNEb3duU3RlbSA9IHRydWU7XG5cdFx0fVxuXHRcdHRoaXMuYWJvdmUgPSBoYXNEb3duU3RlbTtcblx0fVxufTtcblxuVGllRWxlbS5wcm90b3R5cGUuY2FsY1ggPSBmdW5jdGlvbiAobGluZVN0YXJ0WCwgbGluZUVuZFgpIHtcblx0aWYgKHRoaXMuYW5jaG9yMSkge1xuXHRcdHRoaXMuc3RhcnRYID0gdGhpcy5hbmNob3IxLng7IC8vIFRoZSBub3JtYWwgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHN0YXJ0aW5nIGVsZW1lbnQgdG8gYXR0YWNoIHRvLlxuXHRcdGlmICh0aGlzLmFuY2hvcjEuc2NhbGV4IDwgMSkgLy8gdGhpcyBpcyBhIGdyYWNlIG5vdGUgLSBkb24ndCBvZmZzZXQgdGhlIHRpZSBhcyBtdWNoLlxuXHRcdFx0dGhpcy5zdGFydFggLT0gMztcblx0fSBlbHNlIGlmICh0aGlzLnN0YXJ0TGltaXRYKVxuXHRcdHRoaXMuc3RhcnRYID0gdGhpcy5zdGFydExpbWl0WC54K3RoaXMuc3RhcnRMaW1pdFgudzsgLy8gaWYgdGhlcmUgaXMgbm8gc3RhcnQgZWxlbWVudCwgYnV0IHRoZXJlIGlzIGEgcmVwZWF0IG1hcmsgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cblx0ZWxzZVxuXHRcdHRoaXMuc3RhcnRYID0gbGluZVN0YXJ0WDsgLy8gVGhlcmUgaXMgbm8gZWxlbWVudCBhbmQgbm8gcmVwZWF0IG1hcms6IGV4dGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLlxuXG5cdGlmICh0aGlzLmFuY2hvcjIpXG5cdFx0dGhpcy5lbmRYID0gdGhpcy5hbmNob3IyLng7IC8vIFRoZSBub3JtYWwgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHN0YXJ0aW5nIGVsZW1lbnQgdG8gYXR0YWNoIHRvLlxuXHRlbHNlIGlmICh0aGlzLmVuZExpbWl0WClcblx0XHR0aGlzLmVuZFggPSB0aGlzLmVuZExpbWl0WC54OyAvLyBpZiB0aGVyZSBpcyBubyBzdGFydCBlbGVtZW50LCBidXQgdGhlcmUgaXMgYSByZXBlYXQgbWFyayBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuXHRlbHNlXG5cdFx0dGhpcy5lbmRYID0gbGluZUVuZFg7IC8vIFRoZXJlIGlzIG5vIGVsZW1lbnQgYW5kIG5vIHJlcGVhdCBtYXJrOiBleHRlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS5cbn07XG5cblRpZUVsZW0ucHJvdG90eXBlLmNhbGNUaWVZID0gZnVuY3Rpb24gKCkge1xuXHQvLyBJZiB0aGUgdGllIGNvbWVzIGZyb20gYW5vdGhlciBsaW5lLCB0aGVuIG9uZSBvciBib3RoIGFuY2hvcnMgd2lsbCBiZSBtaXNzaW5nLlxuXHRpZiAodGhpcy5hbmNob3IxKVxuXHRcdHRoaXMuc3RhcnRZID0gdGhpcy5hbmNob3IxLnBpdGNoO1xuXHRlbHNlIGlmICh0aGlzLmFuY2hvcjIpXG5cdFx0dGhpcy5zdGFydFkgPSB0aGlzLmFuY2hvcjIucGl0Y2g7XG5cdGVsc2Vcblx0XHR0aGlzLnN0YXJ0WSA9IHRoaXMuYWJvdmUgPyAxNCA6IDA7XG5cblx0aWYgKHRoaXMuYW5jaG9yMilcblx0XHR0aGlzLmVuZFkgPSB0aGlzLmFuY2hvcjIucGl0Y2g7XG5cdGVsc2UgaWYgKHRoaXMuYW5jaG9yMSlcblx0XHR0aGlzLmVuZFkgPSB0aGlzLmFuY2hvcjEucGl0Y2g7XG5cdGVsc2Vcblx0XHR0aGlzLmVuZFkgPSB0aGlzLmFib3ZlID8gMTQgOiAwO1xufTtcblxuLy8gRnJvbSBcInN0YW5kYXJkIG11c2ljIG5vdGF0aW9uIHByYWN0aWNlXCIgYnkgTXVzaWMgUHVibGlzaGVyc+KAmSBBc3NvY2lhdGlvbjpcbi8vIDEpIElmIHRoZSBhbmNob3Igbm90ZSBpcyBkb3duIHN0ZW0sIHRoZSBzbHVyIHBvaW50cyB0byB0aGUgbm90ZSBoZWFkLlxuLy8gMikgSWYgdGhlIGFuY2hvciBub3RlIGlzIHVwIHN0ZW0sIGFuZCB0aGUgc2x1ciBpcyBvdmVyLCB0aGVuIHBvaW50IHRvIG1pZGRsZSBvZiBzdGVtLlxuXG5UaWVFbGVtLnByb3RvdHlwZS5jYWxjU2x1clkgPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0aGlzLmFuY2hvcjEgJiYgdGhpcy5hbmNob3IyKSB7XG5cdFx0aWYgKHRoaXMuYWJvdmUgJiYgdGhpcy5hbmNob3IxLnN0ZW1EaXIgPT09IFwidXBcIiAmJiAhdGhpcy5maXhlZFkpIHtcblx0XHRcdHRoaXMuc3RhcnRZID0gKHRoaXMuYW5jaG9yMS5oaWdoZXN0VmVydCArIHRoaXMuYW5jaG9yMS5waXRjaCkgLyAyO1xuXHRcdFx0dGhpcy5zdGFydFggKz0gdGhpcy5hbmNob3IxLncvMjsgLy8gV2hlbiBnb2luZyB0byB0aGUgbWlkZGxlIG9mIHRoZSBzdGVtLCBidW1wIHRoZSBsaW5lIHRvIHRoZSByaWdodCBhIGxpdHRsZSBiaXQgdG8gbWFrZSBpdCBsb29rIHJpZ2h0LlxuXHRcdH0gZWxzZVxuXHRcdFx0dGhpcy5zdGFydFkgPSB0aGlzLmFuY2hvcjEucGl0Y2g7XG5cblx0XHQvLyBJZiB0aGUgY2xvc2luZyBub3RlIGhhcyBhbiB1cCBzdGVtLCBhbmQgaXQgaXMgYmVhbWVkLCBhbmQgaXQgaXNuJ3QgdGhlIGZpcnN0IG5vdGUgaW4gdGhlIGJlYW0sIHRoZW4gdGhlIGJlYW0gd2lsbCBnZXQgaW4gdGhlIHdheS5cblx0XHR2YXIgYmVhbUludGVyZmVyZXMgPSB0aGlzLmFuY2hvcjIucGFyZW50LmJlYW0gJiYgdGhpcy5hbmNob3IyLnBhcmVudC5iZWFtLnN0ZW1zVXAgJiYgdGhpcy5hbmNob3IyLnBhcmVudC5iZWFtLmVsZW1zWzBdICE9PSB0aGlzLmFuY2hvcjIucGFyZW50O1xuXHRcdHZhciBtaWRQb2ludCA9ICh0aGlzLmFuY2hvcjIuaGlnaGVzdFZlcnQgKyB0aGlzLmFuY2hvcjIucGl0Y2gpIC8gMjtcblx0XHRpZiAodGhpcy5hYm92ZSAmJiB0aGlzLmFuY2hvcjIuc3RlbURpciA9PT0gXCJ1cFwiICYmICF0aGlzLmZpeGVkWSAmJiAhYmVhbUludGVyZmVyZXMgJiYgKG1pZFBvaW50IDwgdGhpcy5zdGFydFkpKSB7XG5cdFx0XHR0aGlzLmVuZFkgPSBtaWRQb2ludDtcblx0XHRcdHRoaXMuZW5kWCArPSB0aGlzLmFuY2hvcjIudy8yOyAvLyBXaGVuIGdvaW5nIHRvIHRoZSBtaWRkbGUgb2YgdGhlIHN0ZW0sIGJ1bXAgdGhlIGxpbmUgdG8gdGhlIHJpZ2h0IGEgbGl0dGxlIGJpdCB0byBtYWtlIGl0IGxvb2sgcmlnaHQuXG5cdFx0fSBlbHNlXG5cdFx0XHR0aGlzLmVuZFkgPSB0aGlzLmFib3ZlICYmIGJlYW1JbnRlcmZlcmVzID8gdGhpcy5hbmNob3IyLmhpZ2hlc3RWZXJ0IDogdGhpcy5hbmNob3IyLnBpdGNoO1xuXG5cdH0gZWxzZSBpZiAodGhpcy5hbmNob3IxKSB7XG5cdFx0dGhpcy5zdGFydFkgPSB0aGlzLmVuZFkgPSB0aGlzLmFuY2hvcjEucGl0Y2g7XG5cdH0gZWxzZSBpZiAodGhpcy5hbmNob3IyKSB7XG5cdFx0dGhpcy5zdGFydFkgPSB0aGlzLmVuZFkgPSB0aGlzLmFuY2hvcjIucGl0Y2g7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgc2x1ciBjb3ZlcnMgdGhlIGVudGlyZSBsaW5lLlxuXHRcdC8vIFRPRE8tUEVSOiBmaWd1cmUgb3V0IHdoZXJlIHRoZSByZWFsIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBsaW5lIGFyZS5cblx0XHR0aGlzLnN0YXJ0WSA9IHRoaXMuYWJvdmUgPyAxNCA6IDA7XG5cdFx0dGhpcy5lbmRZID0gdGhpcy5hYm92ZSA/IDE0IDogMDtcblx0fVxufTtcblxuVGllRWxlbS5wcm90b3R5cGUuYXZvaWRDb2xsaXNpb25BYm92ZSA9IGZ1bmN0aW9uICgpIHtcblx0Ly8gRG91YmxlIGNoZWNrIHRoYXQgYW4gaW50ZXJpb3Igbm90ZSBpbiB0aGUgc2x1ciBpc24ndCBzbyBoaWdoIHRoYXQgaXQgaW50ZXJmZXJlcy5cblx0aWYgKHRoaXMuYWJvdmUpIHtcblx0XHR2YXIgbWF4SW5uZXJIZWlnaHQgPSAtNTA7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsTm90ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICh0aGlzLmludGVybmFsTm90ZXNbaV0uaGlnaGVzdFZlcnQgPiBtYXhJbm5lckhlaWdodClcblx0XHRcdFx0bWF4SW5uZXJIZWlnaHQgPSB0aGlzLmludGVybmFsTm90ZXNbaV0uaGlnaGVzdFZlcnQ7XG5cdFx0fVxuXHRcdGlmIChtYXhJbm5lckhlaWdodCA+IHRoaXMuc3RhcnRZICYmIG1heElubmVySGVpZ2h0ID4gdGhpcy5lbmRZKVxuXHRcdFx0dGhpcy5zdGFydFkgPSB0aGlzLmVuZFkgPSBtYXhJbm5lckhlaWdodCAtIDE7XG5cdH1cbn07XG5cblRpZUVsZW0ucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uIChsaW5lU3RhcnRYLCBsaW5lRW5kWCkge1xuXHQvLyBXZSBub3cgaGF2ZSBhbGwgb2YgdGhlIGlucHV0IHZhcmlhYmxlcyBzZXQsIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSBzdGFydCBhbmQgZW5kaW5nIHgseSBjb29yZGluYXRlcywgYW5kIGZpbmFsaXplIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGFyYy5cblxuXHQvLyBUaWVzIGFuZCBzbHVycyBhcmUgaGFuZGxlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSwgc28gZG8gY2FsY3VsYXRpb25zIGZvciB0aGVtIHNlcGFyYXRlbHkuXG5cdGlmICghdGhpcy5hbmNob3IxIHx8ICF0aGlzLmFuY2hvcjIpXG5cdFx0dGhpcy5pc1RpZSA9IHRydWU7IC8vIGlmIHRoZSBzbHVyIGdvZXMgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpbmUsIHRoZW4gZHJhdyBpdCBsaWtlIGEgdGllXG5cdGVsc2UgaWYgKHRoaXMuYW5jaG9yMS5waXRjaCA9PT0gdGhpcy5hbmNob3IyLnBpdGNoICYmIHRoaXMuaW50ZXJuYWxOb3Rlcy5sZW5ndGggPT09IDApXG5cdFx0dGhpcy5pc1RpZSA9IHRydWU7XG5cdGVsc2Vcblx0XHR0aGlzLmlzVGllID0gZmFsc2U7XG5cblx0Ly8gVE9ETy1QRVI6IE5vdCBzdXJlIHdoeSB0aGlzIHdvdWxkIGJlIG5lZWRlZCwgYnV0IGl0IHdvdWxkIGJlIGJldHRlciB0byBmaWd1cmUgb3V0IGEgd2F5IHRvIGhhdmUgdGhlIGFuY2hvcnMgYmUgaW1tdXRhYmxlIGhlcmUgYW55d2F5LlxuXHQvLyBpZiAodGhpcy5pc1RpZSkge1xuXHQvLyBcdGlmICh0aGlzLmFuY2hvcjEpIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdGllIGNvbWVzIGZyb20gdGhlIHByZXZpb3VzIGxpbmUuXG5cdC8vIFx0XHR0aGlzLmFuY2hvcjEuaXNUaWUgPSB0cnVlO1xuXHQvLyBcdGlmICh0aGlzLmFuY2hvcjIpIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdGllIGRvZXMgbm90IGdvIHRvIHRoZSBuZXh0IGxpbmUuXG5cdC8vIFx0XHR0aGlzLmFuY2hvcjIuaXNUaWUgPSB0cnVlO1xuXHQvLyB9XG5cblx0aWYgKHRoaXMuaXNUaWUpIHtcblx0XHR0aGlzLmNhbGNUaWVEaXJlY3Rpb24oKTtcblx0XHQvLyBUT0RPLVBFUjogTm90IHN1cmUgd2h5IHRoaXMgd291bGQgYmUgbmVlZGVkLCBidXQgaXQgd291bGQgYmUgYmV0dGVyIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8gaGF2ZSB0aGUgYW5jaG9ycyBiZSBpbW11dGFibGUgaGVyZSBhbnl3YXkuXG5cdFx0Ly8gaWYgKHRoaXMuYW5jaG9yMSkgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0aWUgY29tZXMgZnJvbSB0aGUgcHJldmlvdXMgbGluZS5cblx0XHQvLyBcdHRoaXMuYW5jaG9yMS50aWVBYm92ZSA9IHRoaXMuYWJvdmU7XG5cdFx0Ly8gaWYgKHRoaXMuYW5jaG9yMikgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0aWUgZ29lcyB0byB0aGUgbmV4dCBsaW5lLlxuXHRcdC8vIFx0dGhpcy5hbmNob3IyLnRpZUFib3ZlID0gdGhpcy5hYm92ZTtcblx0XHR0aGlzLmNhbGNYKGxpbmVTdGFydFgsIGxpbmVFbmRYKTtcblx0XHR0aGlzLmNhbGNUaWVZKCk7XG5cblx0fSBlbHNlIHtcblx0XHR0aGlzLmNhbGNTbHVyRGlyZWN0aW9uKCk7XG5cdFx0dGhpcy5jYWxjWChsaW5lU3RhcnRYLCBsaW5lRW5kWCk7XG5cdFx0dGhpcy5jYWxjU2x1clkoKTtcblx0fVxuXHR0aGlzLmF2b2lkQ29sbGlzaW9uQWJvdmUoKTtcbn07XG5cblRpZUVsZW0ucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAocmVuZGVyZXIsIGxpbmVzdGFydHgsIGxpbmVlbmR4KSB7XG5cdHRoaXMubGF5b3V0KGxpbmVzdGFydHgsIGxpbmVlbmR4KTtcblxuXHR2YXIga2xhc3M7XG5cdGlmICh0aGlzLmhpbnQpXG5cdFx0XHRrbGFzcyA9IFwiYWJjanMtaGludFwiO1xuXHR2YXIgZnVkZ2VZID0gIHRoaXMuZml4ZWRZID8gMS41IDogMDsgLy8gVE9ETy1QRVI6IFRoaXMganVzdCBjb21wZW5zYXRlcyBmb3IgZHJhd0FyYywgd2hpY2ggY29udGFpbnMgdG9vIG11Y2gga25vd2xlZGdlIG9mIHRpZXMgYW5kIHNsdXJzLlxuXHRyZW5kZXJlci5kcmF3QXJjKHRoaXMuc3RhcnRYLCB0aGlzLmVuZFgsIHRoaXMuc3RhcnRZK2Z1ZGdlWSwgdGhpcy5lbmRZK2Z1ZGdlWSwgIHRoaXMuYWJvdmUsIGtsYXNzLCB0aGlzLmlzVGllKTtcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUaWVFbGVtO1xuIiwiLy8gYWJjX2RlY29yYXRpb24uanM6IENyZWF0ZXMgYSBkYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgcHJpbnRpbmcgYSBsaW5lIG9mIGFiY1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSAmIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLypnbG9iYWwgd2luZG93ICovXG5cbnZhciBEeW5hbWljRGVjb3JhdGlvbiA9IHJlcXVpcmUoJy4vYWJjX2R5bmFtaWNfZGVjb3JhdGlvbicpO1xudmFyIENyZXNjZW5kb0VsZW0gPSByZXF1aXJlKCcuL2FiY19jcmVzY2VuZG9fZWxlbWVudCcpO1xudmFyIGdseXBocyA9IHJlcXVpcmUoJy4vYWJjX2dseXBocycpO1xudmFyIFJlbGF0aXZlRWxlbWVudCA9IHJlcXVpcmUoJy4vYWJjX3JlbGF0aXZlX2VsZW1lbnQnKTtcbnZhciBUaWVFbGVtID0gcmVxdWlyZSgnLi9hYmNfdGllX2VsZW1lbnQnKTtcblxudmFyIERlY29yYXRpb247XG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0RGVjb3JhdGlvbiA9IGZ1bmN0aW9uIERlY29yYXRpb24oKSB7XG5cdFx0dGhpcy5zdGFydERpbWludWVuZG9YID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuc3RhcnRDcmVzY2VuZG9YID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMubWluVG9wID0gMTI7XHQvLyBUT0RPLVBFUjogdGhpcyBpcyBhc3N1bWluZyBhIDUtbGluZSBzdGFmZi4gUGFzcyB0aGF0IGluZm8gaW4uXG5cdFx0dGhpcy5taW5Cb3R0b20gPSAwO1xuXHR9O1xuXG5cdHZhciBjbG9zZURlY29yYXRpb24gPSBmdW5jdGlvbih2b2ljZSwgZGVjb3JhdGlvbiwgcGl0Y2gsIHdpZHRoLCBhYnNlbGVtLCByb29tdGFrZW4sIGRpciwgbWluUGl0Y2gpIHtcblx0XHR2YXIgeVBvcztcblx0XHRmb3IgKHZhciBpPTA7aTxkZWNvcmF0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoZGVjb3JhdGlvbltpXT09PVwic3RhY2NhdG9cIiB8fCBkZWNvcmF0aW9uW2ldPT09XCJ0ZW51dG9cIiB8fCBkZWNvcmF0aW9uW2ldID09PSBcImFjY2VudFwiKSB7XG5cdFx0XHRcdHZhciBzeW1ib2wgPSBcInNjcmlwdHMuXCIgKyBkZWNvcmF0aW9uW2ldO1xuXHRcdFx0XHRpZiAoZGVjb3JhdGlvbltpXSA9PT0gXCJhY2NlbnRcIikgc3ltYm9sID0gXCJzY3JpcHRzLnNmb3J6YXRvXCI7XG5cdFx0XHRcdGlmICh5UG9zID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0eVBvcyA9IChkaXI9PT1cImRvd25cIikgPyBwaXRjaCsyOm1pblBpdGNoLTI7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR5UG9zID0gKGRpcj09PVwiZG93blwiKSA/IHlQb3MrMjp5UG9zLTI7XG5cdFx0XHRcdGlmIChkZWNvcmF0aW9uW2ldID09PSBcImFjY2VudFwiKSB7XG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHBsYWNlIHRoZSBhY2NlbnQgdGhyZWUgcGl0Y2hlcyBhd2F5LCBubyBtYXR0ZXIgd2hldGhlciB0aGF0IGlzIGEgbGluZSBvciBzcGFjZS5cblx0XHRcdFx0XHRpZiAoZGlyID09PSBcInVwXCIpIHlQb3MtLTtcblx0XHRcdFx0XHRlbHNlIHlQb3MrKztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBkb24ndCBwbGFjZSBvbiBhIHN0YXZlIGxpbmUuIFRoZSBzdGF2ZSBsaW5lcyBhcmUgMiw0LDYsOCwxMFxuXHRcdFx0XHRcdHN3aXRjaCAoeVBvcykge1xuXHRcdFx0XHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdFx0Y2FzZSA2OlxuXHRcdFx0XHRcdFx0Y2FzZSA4OlxuXHRcdFx0XHRcdFx0Y2FzZSAxMDpcblx0XHRcdFx0XHRcdFx0aWYgKGRpciA9PT0gXCJ1cFwiKSB5UG9zLS07XG5cdFx0XHRcdFx0XHRcdGVsc2UgeVBvcysrO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBpdGNoPjkpIHlQb3MrKzsgLy8gdGFrZSB1cCBzb21lIHJvb20gb2YgdGhvc2UgdGhhdCBhcmUgYWJvdmVcblx0XHRcdFx0dmFyIGRlbHRhWCA9IHdpZHRoLzI7XG5cdFx0XHRcdGlmIChnbHlwaHMuZ2V0U3ltYm9sQWxpZ24oc3ltYm9sKSE9PVwiY2VudGVyXCIpIHtcblx0XHRcdFx0XHRkZWx0YVggLT0gKGdseXBocy5nZXRTeW1ib2xXaWR0aChzeW1ib2wpLzIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFic2VsZW0uYWRkQ2hpbGQobmV3IFJlbGF0aXZlRWxlbWVudChzeW1ib2wsIGRlbHRhWCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWJvbCksIHlQb3MpKTtcblx0XHRcdH1cblx0XHRcdGlmIChkZWNvcmF0aW9uW2ldPT09XCJzbGlkZVwiICYmIGFic2VsZW0uaGVhZHNbMF0pIHtcblx0XHRcdFx0dmFyIHlQb3MyID0gYWJzZWxlbS5oZWFkc1swXS5waXRjaDtcblx0XHRcdFx0eVBvczIgLT0gMjsgLy8gVE9ETy1QRVI6IG5vdCBzdXJlIHdoYXQgdGhpcyBmdWRnZSBmYWN0b3IgaXMuXG5cdFx0XHRcdHZhciBibGFuazEgPSBuZXcgUmVsYXRpdmVFbGVtZW50KFwiXCIsIC1yb29tdGFrZW4tMTUsIDAsIHlQb3MyLTEpO1xuXHRcdFx0XHR2YXIgYmxhbmsyID0gbmV3IFJlbGF0aXZlRWxlbWVudChcIlwiLCAtcm9vbXRha2VuLTUsIDAsIHlQb3MyKzEpO1xuXHRcdFx0XHRhYnNlbGVtLmFkZENoaWxkKGJsYW5rMSk7XG5cdFx0XHRcdGFic2VsZW0uYWRkQ2hpbGQoYmxhbmsyKTtcblx0XHRcdFx0dm9pY2UuYWRkT3RoZXIobmV3IFRpZUVsZW0oeyBhbmNob3IxOiBibGFuazEsIGFuY2hvcjI6IGJsYW5rMiwgZml4ZWRZOiB0cnVlfSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoeVBvcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0eVBvcyA9IHBpdGNoO1xuXG5cdFx0cmV0dXJuIHsgYWJvdmU6IHlQb3MsIGJlbG93OiBhYnNlbGVtLmJvdHRvbSB9O1xuXHR9O1xuXG5cdHZhciB2b2x1bWVEZWNvcmF0aW9uID0gZnVuY3Rpb24odm9pY2UsIGRlY29yYXRpb24sIGFic2VsZW0sIHBvc2l0aW9uaW5nKSB7XG5cdFx0Zm9yICh2YXIgaT0wO2k8ZGVjb3JhdGlvbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0c3dpdGNoKGRlY29yYXRpb25baV0pIHtcblx0XHRcdFx0Y2FzZSBcInBcIjpcblx0XHRcdFx0Y2FzZSBcIm1wXCI6XG5cdFx0XHRcdGNhc2UgXCJwcFwiOlxuXHRcdFx0XHRjYXNlIFwicHBwXCI6XG5cdFx0XHRcdGNhc2UgXCJwcHBwXCI6XG5cdFx0XHRcdGNhc2UgXCJmXCI6XG5cdFx0XHRcdGNhc2UgXCJmZlwiOlxuXHRcdFx0XHRjYXNlIFwiZmZmXCI6XG5cdFx0XHRcdGNhc2UgXCJmZmZmXCI6XG5cdFx0XHRcdGNhc2UgXCJzZnpcIjpcblx0XHRcdFx0Y2FzZSBcIm1mXCI6XG5cdFx0XHRcdFx0dmFyIGVsZW0gPSBuZXcgRHluYW1pY0RlY29yYXRpb24oYWJzZWxlbSwgZGVjb3JhdGlvbltpXSwgcG9zaXRpb25pbmcpO1xuXHRcdFx0XHRcdHZvaWNlLmFkZE90aGVyKGVsZW0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIgY29tcG91bmREZWNvcmF0aW9uID0gZnVuY3Rpb24oZGVjb3JhdGlvbiwgcGl0Y2gsIHdpZHRoLCBhYnNlbGVtLCBkaXIpIHtcblx0XHRmdW5jdGlvbiBoaWdoZXN0UGl0Y2goKSB7XG5cdFx0XHRpZiAoYWJzZWxlbS5oZWFkcy5sZW5ndGggPT09IDApXG5cdFx0XHRcdHJldHVybiAxMDtcdC8vIFRPRE8tUEVSOiBJIGRvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuLCBidXQgd2UnbGwgcmV0dXJuIHRoZSB0b3Agb2YgdGhlIHN0YWZmIGlmIHNvLlxuXHRcdFx0dmFyIHBpdGNoID0gYWJzZWxlbS5oZWFkc1swXS5waXRjaDtcblx0XHRcdGZvciAodmFyIGkgPSAxOyBpIDwgYWJzZWxlbS5oZWFkcy5sZW5ndGg7IGkrKylcblx0XHRcdFx0cGl0Y2ggPSBNYXRoLm1heChwaXRjaCwgYWJzZWxlbS5oZWFkc1tpXS5waXRjaCk7XG5cdFx0XHRyZXR1cm4gcGl0Y2g7XG5cdFx0fVxuXHRcdGZ1bmN0aW9uIGxvd2VzdFBpdGNoKCkge1xuXHRcdFx0aWYgKGFic2VsZW0uaGVhZHMubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRyZXR1cm4gMjtcdC8vIFRPRE8tUEVSOiBJIGRvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuLCBidXQgd2UnbGwgcmV0dXJuIHRoZSBib3R0b20gb2YgdGhlIHN0YWZmIGlmIHNvLlxuXHRcdFx0dmFyIHBpdGNoID0gYWJzZWxlbS5oZWFkc1swXS5waXRjaDtcblx0XHRcdGZvciAodmFyIGkgPSAxOyBpIDwgYWJzZWxlbS5oZWFkcy5sZW5ndGg7IGkrKylcblx0XHRcdFx0cGl0Y2ggPSBNYXRoLm1pbihwaXRjaCwgYWJzZWxlbS5oZWFkc1tpXS5waXRjaCk7XG5cdFx0XHRyZXR1cm4gcGl0Y2g7XG5cdFx0fVxuXHRcdGZ1bmN0aW9uIGNvbXBvdW5kRGVjb3JhdGlvbihzeW1ib2wsIGNvdW50KSB7XG5cdFx0XHR2YXIgcGxhY2VtZW50ID0gKGRpciA9PT0gJ2Rvd24nKSA/IGxvd2VzdFBpdGNoKCkrMTpoaWdoZXN0UGl0Y2goKSs5O1xuXHRcdFx0aWYgKGRpciAhPT0gJ2Rvd24nICYmIGNvdW50ID09PSAxKVxuXHRcdFx0XHRwbGFjZW1lbnQtLTtcblx0XHRcdHZhciBkZWx0YVggPSB3aWR0aC8yO1xuXHRcdFx0ZGVsdGFYICs9IChkaXIgPT09ICdkb3duJykgPyAtNSA6IDM7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0XHRcdFx0cGxhY2VtZW50IC09IDE7XG5cdFx0XHRcdGFic2VsZW0uYWRkQ2hpbGQobmV3IFJlbGF0aXZlRWxlbWVudChzeW1ib2wsIGRlbHRhWCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWJvbCksIHBsYWNlbWVudCkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAodmFyIGk9MDtpPGRlY29yYXRpb24ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHN3aXRjaChkZWNvcmF0aW9uW2ldKSB7XG5cdFx0XHRcdGNhc2UgXCIvXCI6IGNvbXBvdW5kRGVjb3JhdGlvbihcImZsYWdzLnVncmFjZVwiLCAxKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgXCIvL1wiOiBjb21wb3VuZERlY29yYXRpb24oXCJmbGFncy51Z3JhY2VcIiwgMik7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiLy8vXCI6IGNvbXBvdW5kRGVjb3JhdGlvbihcImZsYWdzLnVncmFjZVwiLCAzKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgXCIvLy8vXCI6IGNvbXBvdW5kRGVjb3JhdGlvbihcImZsYWdzLnVncmFjZVwiLCA0KTsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBzdGFja2VkRGVjb3JhdGlvbiA9IGZ1bmN0aW9uKGRlY29yYXRpb24sIHdpZHRoLCBhYnNlbGVtLCB5UG9zLCBwb3NpdGlvbmluZywgbWluVG9wLCBtaW5Cb3R0b20pIHtcblx0XHRmdW5jdGlvbiBpbmNyZW1lbnRQbGFjZW1lbnQocGxhY2VtZW50LCBoZWlnaHQpIHtcblx0XHRcdGlmIChwbGFjZW1lbnQgPT09ICdhYm92ZScpXG5cdFx0XHRcdHlQb3MuYWJvdmUgKz0gaGVpZ2h0O1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR5UG9zLmJlbG93IC09IGhlaWdodDtcblx0XHR9XG5cdFx0ZnVuY3Rpb24gZ2V0UGxhY2VtZW50KHBsYWNlbWVudCkge1xuXHRcdFx0dmFyIHk7XG5cdFx0XHRpZiAocGxhY2VtZW50ID09PSAnYWJvdmUnKSB7XG5cdFx0XHRcdHkgPSB5UG9zLmFib3ZlO1xuXHRcdFx0XHRpZiAoeSA8IG1pblRvcClcblx0XHRcdFx0XHR5ID0gbWluVG9wO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eSA9IHlQb3MuYmVsb3c7XG5cdFx0XHRcdGlmICh5ID4gbWluQm90dG9tKVxuXHRcdFx0XHRcdHkgPSBtaW5Cb3R0b207XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4geTtcblx0XHR9XG5cdFx0ZnVuY3Rpb24gdGV4dERlY29yYXRpb24odGV4dCwgcGxhY2VtZW50KSB7XG5cdFx0XHR2YXIgeSA9IGdldFBsYWNlbWVudChwbGFjZW1lbnQpO1xuXHRcdFx0dmFyIHRleHRGdWRnZSA9IDI7XG5cdFx0XHR2YXIgdGV4dEhlaWdodCA9IDU7XG5cdFx0XHQvLyBUT0RPLVBFUjogR2V0IHRoZSBoZWlnaHQgb2YgdGhlIGN1cnJlbnQgZm9udCBhbmQgdXNlIHRoYXQgZm9yIHRoZSB0aGlja25lc3MuXG5cdFx0XHRhYnNlbGVtLmFkZENoaWxkKG5ldyBSZWxhdGl2ZUVsZW1lbnQodGV4dCwgd2lkdGgvMiwgMCwgeSt0ZXh0RnVkZ2UsIHt0eXBlOlwiZGVjb3JhdGlvblwiLCBrbGFzczogJ29ybmFtZW50JywgdGhpY2tuZXNzOiAzfSkpO1xuXG5cdFx0XHRpbmNyZW1lbnRQbGFjZW1lbnQocGxhY2VtZW50LCB0ZXh0SGVpZ2h0KTtcblx0XHR9XG5cdFx0ZnVuY3Rpb24gc3ltYm9sRGVjb3JhdGlvbihzeW1ib2wsIHBsYWNlbWVudCkge1xuXHRcdFx0dmFyIGRlbHRhWCA9IHdpZHRoLzI7XG5cdFx0XHRpZiAoZ2x5cGhzLmdldFN5bWJvbEFsaWduKHN5bWJvbCkgIT09IFwiY2VudGVyXCIpIHtcblx0XHRcdFx0ZGVsdGFYIC09IChnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoc3ltYm9sKSAvIDIpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGhlaWdodCA9IGdseXBocy5zeW1ib2xIZWlnaHRJblBpdGNoZXMoc3ltYm9sKSArIDE7IC8vIGFkZGluZyBhIGxpdHRsZSBwYWRkaW5nIHNvIG5vdGhpbmcgdG91Y2hlcy5cblx0XHRcdHZhciB5ID0gZ2V0UGxhY2VtZW50KHBsYWNlbWVudCk7XG5cdFx0XHR5ID0gKHBsYWNlbWVudCA9PT0gJ2Fib3ZlJykgPyB5ICsgaGVpZ2h0LzIgOiB5IC0gaGVpZ2h0LzI7Ly8gQ2VudGVyIHRoZSBlbGVtZW50IHZlcnRpY2FsbHkuXG5cdFx0XHRhYnNlbGVtLmFkZENoaWxkKG5ldyBSZWxhdGl2ZUVsZW1lbnQoc3ltYm9sLCBkZWx0YVgsIGdseXBocy5nZXRTeW1ib2xXaWR0aChzeW1ib2wpLCB5LCB7IGtsYXNzOiAnb3JuYW1lbnQnLCB0aGlja25lc3M6IGdseXBocy5zeW1ib2xIZWlnaHRJblBpdGNoZXMoc3ltYm9sKSB9KSk7XG5cblx0XHRcdGluY3JlbWVudFBsYWNlbWVudChwbGFjZW1lbnQsIGhlaWdodCk7XG5cdFx0fVxuXG5cdFx0dmFyIHN5bWJvbExpc3QgPSB7XG5cdFx0XHRcIitcIjogXCJzY3JpcHRzLnN0b3BwZWRcIixcblx0XHRcdFwib3BlblwiOiBcInNjcmlwdHMub3BlblwiLFxuXHRcdFx0XCJzbmFwXCI6IFwic2NyaXB0cy5zbmFwXCIsXG5cdFx0XHRcIndlZGdlXCI6IFwic2NyaXB0cy53ZWRnZVwiLFxuXHRcdFx0XCJ0aHVtYlwiOiBcInNjcmlwdHMudGh1bWJcIixcblx0XHRcdFwic2hvcnRwaHJhc2VcIjogXCJzY3JpcHRzLnNob3J0cGhyYXNlXCIsXG5cdFx0XHRcIm1lZGl1bXBocmFzZVwiOiBcInNjcmlwdHMubWVkaXVtcGhyYXNlXCIsXG5cdFx0XHRcImxvbmdwaHJhc2VcIjogXCJzY3JpcHRzLmxvbmdwaHJhc2VcIixcblx0XHRcdFwidHJpbGxcIjogXCJzY3JpcHRzLnRyaWxsXCIsXG5cdFx0XHRcInJvbGxcIjogXCJzY3JpcHRzLnJvbGxcIixcblx0XHRcdFwiaXJpc2hyb2xsXCI6IFwic2NyaXB0cy5yb2xsXCIsXG5cdFx0XHRcIm1hcmNhdG9cIjogXCJzY3JpcHRzLnVtYXJjYXRvXCIsXG5cdFx0XHRcImRtYXJjYXRvXCI6IFwic2NyaXB0cy5kbWFyY2F0b1wiLFxuXHRcdFx0XCJ1bWFyY2F0b1wiOiBcInNjcmlwdHMudW1hcmNhdG9cIixcblx0XHRcdFwidHVyblwiOiBcInNjcmlwdHMudHVyblwiLFxuXHRcdFx0XCJ1cHBlcm1vcmRlbnRcIjogXCJzY3JpcHRzLnByYWxsXCIsXG5cdFx0XHRcInByYWxsdHJpbGxlclwiOiBcInNjcmlwdHMucHJhbGxcIixcblx0XHRcdFwibW9yZGVudFwiOiBcInNjcmlwdHMubW9yZGVudFwiLFxuXHRcdFx0XCJsb3dlcm1vcmRlbnRcIjogXCJzY3JpcHRzLm1vcmRlbnRcIixcblx0XHRcdFwiZG93bmJvd1wiOiBcInNjcmlwdHMuZG93bmJvd1wiLFxuXHRcdFx0XCJ1cGJvd1wiOiBcInNjcmlwdHMudXBib3dcIixcblx0XHRcdFwiZmVybWF0YVwiOiBcInNjcmlwdHMudWZlcm1hdGFcIixcblx0XHRcdFwiaW52ZXJ0ZWRmZXJtYXRhXCI6IFwic2NyaXB0cy5kZmVybWF0YVwiLFxuXHRcdFx0XCJicmVhdGhcIjogXCIsXCIsXG5cdFx0XHRcImNvZGFcIjogXCJzY3JpcHRzLmNvZGFcIixcblx0XHRcdFwic2Vnbm9cIjogXCJzY3JpcHRzLnNlZ25vXCJcblx0XHR9O1xuXG5cdFx0dmFyIGhhc09uZSA9IGZhbHNlO1xuXHRcdGZvciAodmFyIGk9MDtpPGRlY29yYXRpb24ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHN3aXRjaChkZWNvcmF0aW9uW2ldKSB7XG5cdFx0XHRcdGNhc2UgXCIwXCI6XG5cdFx0XHRcdGNhc2UgXCIxXCI6XG5cdFx0XHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgXCI0XCI6XG5cdFx0XHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRcdGNhc2UgXCJELkMuXCI6XG5cdFx0XHRcdGNhc2UgXCJELlMuXCI6XG5cdFx0XHRcdFx0dGV4dERlY29yYXRpb24oZGVjb3JhdGlvbltpXSwgcG9zaXRpb25pbmcpO1xuXHRcdFx0XHRcdGhhc09uZSA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmaW5lXCI6XG5cdFx0XHRcdFx0dGV4dERlY29yYXRpb24oXCJGSU5FXCIsIHBvc2l0aW9uaW5nKTtcblx0XHRcdFx0XHRoYXNPbmUgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiK1wiOlxuXHRcdFx0XHRjYXNlIFwib3BlblwiOlxuXHRcdFx0XHRjYXNlIFwic25hcFwiOlxuXHRcdFx0XHRjYXNlIFwid2VkZ2VcIjpcblx0XHRcdFx0Y2FzZSBcInRodW1iXCI6XG5cdFx0XHRcdGNhc2UgXCJzaG9ydHBocmFzZVwiOlxuXHRcdFx0XHRjYXNlIFwibWVkaXVtcGhyYXNlXCI6XG5cdFx0XHRcdGNhc2UgXCJsb25ncGhyYXNlXCI6XG5cdFx0XHRcdGNhc2UgXCJ0cmlsbFwiOlxuXHRcdFx0XHRjYXNlIFwicm9sbFwiOlxuXHRcdFx0XHRjYXNlIFwiaXJpc2hyb2xsXCI6XG5cdFx0XHRcdGNhc2UgXCJtYXJjYXRvXCI6XG5cdFx0XHRcdGNhc2UgXCJkbWFyY2F0b1wiOlxuXHRcdFx0XHRjYXNlIFwidHVyblwiOlxuXHRcdFx0XHRjYXNlIFwidXBwZXJtb3JkZW50XCI6XG5cdFx0XHRcdGNhc2UgXCJwcmFsbHRyaWxsZXJcIjpcblx0XHRcdFx0Y2FzZSBcIm1vcmRlbnRcIjpcblx0XHRcdFx0Y2FzZSBcImxvd2VybW9yZGVudFwiOlxuXHRcdFx0XHRjYXNlIFwiZG93bmJvd1wiOlxuXHRcdFx0XHRjYXNlIFwidXBib3dcIjpcblx0XHRcdFx0Y2FzZSBcImZlcm1hdGFcIjpcblx0XHRcdFx0Y2FzZSBcImJyZWF0aFwiOlxuXHRcdFx0XHRjYXNlIFwidW1hcmNhdG9cIjpcblx0XHRcdFx0Y2FzZSBcImNvZGFcIjpcblx0XHRcdFx0Y2FzZSBcInNlZ25vXCI6XG5cdFx0XHRcdFx0c3ltYm9sRGVjb3JhdGlvbihzeW1ib2xMaXN0W2RlY29yYXRpb25baV1dLCBwb3NpdGlvbmluZyk7XG5cdFx0XHRcdFx0aGFzT25lID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImludmVydGVkZmVybWF0YVwiOlxuXHRcdFx0XHRcdHN5bWJvbERlY29yYXRpb24oc3ltYm9sTGlzdFtkZWNvcmF0aW9uW2ldXSwgJ2JlbG93Jyk7XG5cdFx0XHRcdFx0aGFzT25lID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1hcmtcIjpcblx0XHRcdFx0XHRhYnNlbGVtLmtsYXNzID0gXCJtYXJrXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBoYXNPbmU7XG5cdH07XG5cblx0ZnVuY3Rpb24gbGVmdERlY29yYXRpb24oZGVjb3JhdGlvbiwgYWJzZWxlbSwgcm9vbXRha2VuKSB7XG5cdFx0Zm9yICh2YXIgaT0wO2k8ZGVjb3JhdGlvbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0c3dpdGNoIChkZWNvcmF0aW9uW2ldKSB7XG5cdFx0XHRcdGNhc2UgXCJhcnBlZ2dpb1wiOlxuXHRcdFx0XHRcdC8vIFRoZSBhcnBlZ2dpbyBzeW1ib2wgaXMgdGhlIGhlaWdodCBvZiBhIG5vdGUgKHRoYXQgaXMsIHR3byBZIHVuaXRzKS4gVGhpcyBzdGFja3MgYXMgbWFueSBhcyB3ZSBuZWVkIHRvIGdvIGZyb20gdGhlXG5cdFx0XHRcdFx0Ly8gdG9wIG5vdGUgdG8gdGhlIGJvdHRvbSBub3RlLiBUaGUgYXJwZWdnaW8gc2hvdWxkIGFsc28gYmUgYSBsaXR0bGUgdGFsbGVyIHRoYW4gdGhlIHN0YWNrZWQgbm90ZXMsIHNvIHRoZXJlIGlzIGFuIGV4dHJhXG5cdFx0XHRcdFx0Ly8gb25lIGRyYXduIGFuZCBpdCBpcyBvZmZzZXQgYnkgaGFsZiBvZiBhIG5vdGUgaGVpZ2h0ICh0aGF0IGlzLCBvbmUgWSB1bml0KS5cblx0XHRcdFx0XHRmb3IgKHZhciBqID0gYWJzZWxlbS5hYmNlbGVtLm1pbnBpdGNoIC0gMTsgaiA8PSBhYnNlbGVtLmFiY2VsZW0ubWF4cGl0Y2g7IGogKz0gMikge1xuXHRcdFx0XHRcdFx0YWJzZWxlbS5hZGRFeHRyYShcblx0XHRcdFx0XHRcdFx0bmV3IFJlbGF0aXZlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcInNjcmlwdHMuYXJwZWdnaW9cIixcblx0XHRcdFx0XHRcdFx0XHQtZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwic2NyaXB0cy5hcnBlZ2dpb1wiKSoyIC0gcm9vbXRha2VuLFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0aisyLFxuXHRcdFx0XHRcdFx0XHRcdHtrbGFzczogJ29ybmFtZW50JywgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKFwic2NyaXB0cy5hcnBlZ2dpb1wiKX1cblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0RGVjb3JhdGlvbi5wcm90b3R5cGUuZHluYW1pY0RlY29yYXRpb24gPSBmdW5jdGlvbih2b2ljZSwgZGVjb3JhdGlvbiwgYWJzZWxlbSwgcG9zaXRpb25pbmcpIHtcblx0XHR2YXIgZGltaW51ZW5kbztcblx0XHR2YXIgY3Jlc2NlbmRvO1xuXHRcdGZvciAodmFyIGk9MDtpPGRlY29yYXRpb24ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHN3aXRjaChkZWNvcmF0aW9uW2ldKSB7XG5cdFx0XHRcdGNhc2UgXCJkaW1pbnVlbmRvKFwiOlxuXHRcdFx0XHRcdHRoaXMuc3RhcnREaW1pbnVlbmRvWCA9IGFic2VsZW07XG5cdFx0XHRcdFx0ZGltaW51ZW5kbyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImRpbWludWVuZG8pXCI6XG5cdFx0XHRcdFx0ZGltaW51ZW5kbyA9IHsgc3RhcnQ6IHRoaXMuc3RhcnREaW1pbnVlbmRvWCwgc3RvcDogYWJzZWxlbX07XG5cdFx0XHRcdFx0dGhpcy5zdGFydERpbWludWVuZG9YID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiY3Jlc2NlbmRvKFwiOlxuXHRcdFx0XHRcdHRoaXMuc3RhcnRDcmVzY2VuZG9YID0gYWJzZWxlbTtcblx0XHRcdFx0XHRjcmVzY2VuZG8gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjcmVzY2VuZG8pXCI6XG5cdFx0XHRcdFx0Y3Jlc2NlbmRvID0geyBzdGFydDogdGhpcy5zdGFydENyZXNjZW5kb1gsIHN0b3A6IGFic2VsZW19O1xuXHRcdFx0XHRcdHRoaXMuc3RhcnRDcmVzY2VuZG9YID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZGltaW51ZW5kbykge1xuXHRcdFx0dm9pY2UuYWRkT3RoZXIobmV3IENyZXNjZW5kb0VsZW0oZGltaW51ZW5kby5zdGFydCwgZGltaW51ZW5kby5zdG9wLCBcIj5cIiwgcG9zaXRpb25pbmcpKTtcblx0XHR9XG5cdFx0aWYgKGNyZXNjZW5kbykge1xuXHRcdFx0dm9pY2UuYWRkT3RoZXIobmV3IENyZXNjZW5kb0VsZW0oY3Jlc2NlbmRvLnN0YXJ0LCBjcmVzY2VuZG8uc3RvcCwgXCI8XCIsIHBvc2l0aW9uaW5nKSk7XG5cdFx0fVxuXHR9O1xuXG5cdERlY29yYXRpb24ucHJvdG90eXBlLmNyZWF0ZURlY29yYXRpb24gPSBmdW5jdGlvbih2b2ljZSwgZGVjb3JhdGlvbiwgcGl0Y2gsIHdpZHRoLCBhYnNlbGVtLCByb29tdGFrZW4sIGRpciwgbWluUGl0Y2gsIHBvc2l0aW9uaW5nLCBoYXNWb2NhbHMpIHtcblx0XHRpZiAoIXBvc2l0aW9uaW5nKVxuXHRcdFx0cG9zaXRpb25pbmcgPSB7IG9ybmFtZW50UG9zaXRpb246ICdhYm92ZScsIHZvbHVtZVBvc2l0aW9uOiBoYXNWb2NhbHMgPyAnYWJvdmUnIDonYmVsb3cnLCBkeW5hbWljUG9zaXRpb246IGhhc1ZvY2FscyA/ICdhYm92ZScgOiAnYmVsb3cnIH07XG5cdFx0Ly8gVGhlc2UgZGVjb3JhdGlvbnMgZG9uJ3QgYWZmZWN0IHRoZSBwbGFjZW1lbnQgb2Ygb3RoZXIgZGVjb3JhdGlvbnNcblx0XHR2b2x1bWVEZWNvcmF0aW9uKHZvaWNlLCBkZWNvcmF0aW9uLCBhYnNlbGVtLCBwb3NpdGlvbmluZy52b2x1bWVQb3NpdGlvbik7XG5cdFx0dGhpcy5keW5hbWljRGVjb3JhdGlvbih2b2ljZSwgZGVjb3JhdGlvbiwgYWJzZWxlbSwgcG9zaXRpb25pbmcuZHluYW1pY1Bvc2l0aW9uKTtcblx0XHRjb21wb3VuZERlY29yYXRpb24oZGVjb3JhdGlvbiwgcGl0Y2gsIHdpZHRoLCBhYnNlbGVtLCBkaXIpO1xuXG5cdFx0Ly8gdHJlYXQgc3RhY2NhdG8sIGFjY2VudCwgYW5kIHRlbnV0byBmaXJzdCAobWF5IG5lZWQgdG8gc2hpZnQgb3RoZXIgbWFya2Vycylcblx0XHR2YXIgeVBvcyA9IGNsb3NlRGVjb3JhdGlvbih2b2ljZSwgZGVjb3JhdGlvbiwgcGl0Y2gsIHdpZHRoLCBhYnNlbGVtLCByb29tdGFrZW4sIGRpciwgbWluUGl0Y2gpO1xuXHRcdC8vIHlQb3MgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgJ2Fib3ZlJyBhbmQgJ2JlbG93Jy4gVGhhdCBpcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBuZXh0IHN5bWJvbCBvbiBlaXRoZXIgc2lkZS5cblxuXHRcdHlQb3MuYWJvdmUgPSBNYXRoLm1heCh5UG9zLmFib3ZlLCB0aGlzLm1pblRvcCk7XG5cdFx0dmFyIGhhc09uZSA9IHN0YWNrZWREZWNvcmF0aW9uKGRlY29yYXRpb24sIHdpZHRoLCBhYnNlbGVtLCB5UG9zLCBwb3NpdGlvbmluZy5vcm5hbWVudFBvc2l0aW9uLCB0aGlzLm1pblRvcCwgdGhpcy5taW5Cb3R0b20pO1xuXHRcdGlmIChoYXNPbmUpIHtcbi8vXHRcdFx0YWJzZWxlbS50b3AgPSBNYXRoLm1heCh5UG9zLmFib3ZlICsgMywgYWJzZWxlbS50b3ApOyAvLyBUT0RPLVBFUjogTm90IHN1cmUgd2h5IHdlIG5lZWQgdGhpcyBmdWRnZSBmYWN0b3IuXG5cdFx0fVxuXHRcdGxlZnREZWNvcmF0aW9uKGRlY29yYXRpb24sIGFic2VsZW0sIHJvb210YWtlbik7XG5cdH07XG5cbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGVjb3JhdGlvbjtcbiIsIi8vICAgIGFiY19lbmRpbmdfZWxlbWVudC5qczogRGVmaW5pdGlvbiBvZiB0aGUgRW5kaW5nRWxlbWVudCBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHNwcmludGYgPSByZXF1aXJlKCcuL3NwcmludGYnKTtcblxudmFyIEVuZGluZ0VsZW0gPSBmdW5jdGlvbiBFbmRpbmdFbGVtKHRleHQsIGFuY2hvcjEsIGFuY2hvcjIpIHtcblx0dGhpcy50ZXh0ID0gdGV4dDsgLy8gdGV4dCB0byBiZSBkaXNwbGF5ZWQgdG9wIGxlZnRcblx0dGhpcy5hbmNob3IxID0gYW5jaG9yMTsgLy8gbXVzdCBoYXZlIGEgLnggcHJvcGVydHkgb3IgYmUgbnVsbCAobWVhbnMgc3RhcnRzIGF0IHRoZSBcImJlZ2lubmluZ1wiIG9mIHRoZSBsaW5lIC0gYWZ0ZXIga2V5c2lnKVxuXHR0aGlzLmFuY2hvcjIgPSBhbmNob3IyOyAvLyBtdXN0IGhhdmUgYSAueCBwcm9wZXJ0eSBvciBiZSBudWxsIChtZWFucyBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpXG5cdHRoaXMuZW5kaW5nSGVpZ2h0QWJvdmUgPSA1O1xuXHR0aGlzLnBpdGNoID0gdW5kZWZpbmVkOyAvLyBUaGlzIHdpbGwgYmUgc2V0IGxhdGVyXG59O1xuXG5FbmRpbmdFbGVtLnByb3RvdHlwZS5zZXRVcHBlckFuZExvd2VyRWxlbWVudHMgPSBmdW5jdGlvbihwb3NpdGlvblkpIHtcblx0dGhpcy5waXRjaCA9IHBvc2l0aW9uWS5lbmRpbmdIZWlnaHRBYm92ZSAtIDI7XG59O1xuXG5FbmRpbmdFbGVtLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBsaW5lc3RhcnR4LCBsaW5lZW5keCkge1xuXHRpZiAodGhpcy5waXRjaCA9PT0gdW5kZWZpbmVkKVxuXHRcdHdpbmRvdy5jb25zb2xlLmVycm9yKFwiRW5kaW5nIEVsZW1lbnQgeS1jb29yZGluYXRlIG5vdCBzZXQuXCIpO1xuXHR2YXIgeSA9IHJlbmRlcmVyLmNhbGNZKHRoaXMucGl0Y2gpO1xuXHR2YXIgaGVpZ2h0ID0gMjA7XG5cdHZhciBwYXRoU3RyaW5nO1xuXHRpZiAodGhpcy5hbmNob3IxKSB7XG5cdFx0bGluZXN0YXJ0eCA9IHRoaXMuYW5jaG9yMS54K3RoaXMuYW5jaG9yMS53O1xuXHRcdHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmXCIsXG5cdFx0XHRsaW5lc3RhcnR4LCB5LCBsaW5lc3RhcnR4LCB5K2hlaWdodCk7XG5cdFx0cmVuZGVyZXIucHJpbnRQYXRoKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpcIiMwMDAwMDBcIiwgZmlsbDpcIiMwMDAwMDBcIiwgJ2NsYXNzJzogcmVuZGVyZXIuYWRkQ2xhc3NlcygnZW5kaW5nJyl9KTtcblx0XHRyZW5kZXJlci5yZW5kZXJUZXh0KGxpbmVzdGFydHgrNSwgcmVuZGVyZXIuY2FsY1kodGhpcy5waXRjaC0wLjUpLCB0aGlzLnRleHQsICdyZXBlYXRmb250JywgJ2VuZGluZycsXCJzdGFydFwiKTtcblx0fVxuXG5cdGlmICh0aGlzLmFuY2hvcjIpIHtcblx0XHRsaW5lZW5keCA9IHRoaXMuYW5jaG9yMi54O1xuXHRcdHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmXCIsXG5cdFx0XHRsaW5lZW5keCwgeSwgbGluZWVuZHgsIHkraGVpZ2h0KTtcblx0XHRyZW5kZXJlci5wcmludFBhdGgoe3BhdGg6cGF0aFN0cmluZywgc3Ryb2tlOlwiIzAwMDAwMFwiLCBmaWxsOlwiIzAwMDAwMFwiLCAnY2xhc3MnOiByZW5kZXJlci5hZGRDbGFzc2VzKCdlbmRpbmcnKX0pO1xuXHR9XG5cblxuXHRwYXRoU3RyaW5nID0gc3ByaW50ZihcIk0gJWYgJWYgTCAlZiAlZlwiLFxuXHRcdGxpbmVzdGFydHgsIHksIGxpbmVlbmR4LCB5KTtcblx0cmVuZGVyZXIucHJpbnRQYXRoKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpcIiMwMDAwMDBcIiwgZmlsbDpcIiMwMDAwMDBcIiwgJ2NsYXNzJzogcmVuZGVyZXIuYWRkQ2xhc3NlcygnZW5kaW5nJyl9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRW5kaW5nRWxlbTtcbiIsIi8vICAgIGFiY19zdGFmZl9ncm91cF9lbGVtZW50LmpzOiBEZWZpbml0aW9uIG9mIHRoZSBTdGFmZkdyb3VwRWxlbWVudCBjbGFzcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLypnbG9iYWxzIGNvbnNvbGUgKi9cblxudmFyIHNwYWNpbmcgPSByZXF1aXJlKCcuL2FiY19zcGFjaW5nJyk7XG5cbi8vIFN0YWZmR3JvdXBFbGVtZW50IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBnbyB0b2dldGhlciB0byBtYWtlIG9uZSBsaW5lIG9mIG11c2ljLlxuLy8gVGhhdCBtaWdodCBiZSBtdWx0aXBsZSBzdGF2ZXMgdGhhdCBhcmUgdGllZCB0b2dldGhlciwgYW5kIGl0IG1pZ2h0IGJlIG11bHRpcGxlIHZvaWNlcyBvbiBvbmUgc3RhZmYuXG4vL1xuLy8gTWV0aG9kczpcbi8vIGNvbnN0cnVjdG9yOiBzb21lIGJhc2ljIGluaXRpYWxpemF0aW9uXG4vLyBhZGRWb2ljZSgpOiBDYWxsZWQgb25jZSBmb3IgZWFjaCB2b2ljZS4gTWF5IGFkZCBhIG5ldyBzdGFmZiBpZiBuZWVkZWQuXG4vLyBmaW5pc2hlZCgpOiBDYWxsZWQgb25seSBpbnRlcm5hbGx5IGJ5IGxheW91dCgpXG4vLyBsYXlvdXQoKTogVGhpcyBkb2VzIGFsbCB0aGUgbGF5b3V0LiBJdCBzZXRzIHRoZSBmb2xsb3dpbmc6IHNwYWNpbmd1bml0cywgc3RhcnR4LCBtaW5zcGFjZSwgdywgYW5kIHRoZSB4LWNvb3JkaW5hdGUgb2YgZWFjaCBlbGVtZW50IGluIGVhY2ggdm9pY2UuXG4vLyBkcmF3KCk6IENhbGxzIHRoZSB1bmRlcmx5aW5nIG1ldGhvZHMgb24gdGhlIHZvaWNlIG9iamVjdHMgdG8gZG8gdGhlIGRyYXdpbmcuIFNldHMgeSBhbmQgaGVpZ2h0LlxuLy9cbi8vIE1lbWJlcnM6XG4vLyBzdGFmZnM6IGFuIGFycmF5IG9mIGFsbCB0aGUgc3RhdmVzIGluIHRoaXMgZ3JvdXAuIEVhY2ggc3RhZmYgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlbGVtZW50czpcbi8vICAgIHsgdG9wLCBib3R0b20sIGhpZ2hlc3QsIGxvd2VzdCwgeSB9XG4vLyB2b2ljZXM6IGFycmF5IG9mIFZvaWNlRWxlbWVudCBvYmplY3RzLiBUaGlzIGlzIG1vc3RseSBwYXNzZWQgaW4sIGJ1dCB0aGUgVm9pY2VFbGVtZW50IG9iamVjdHMgYXJlIG1vZGlmaWVkIGhlcmUuXG4vL1xuLy8gc3BhY2luZ3VuaXRzOiBudW1iZXIgb2YgcmVsYXRpdmUgeC11bml0cyBpbiB0aGUgbGluZS4gVXNlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbiB0byBwYXNzIGJhY2sgaW4gYXMgdGhlIFwic3BhY2luZ1wiIGlucHV0IHBhcmFtZXRlci5cbi8vIFRPRE8tUEVSOiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZSBwYXNzZWQgYmFjayBhcyBhIHJldHVybiB2YWx1ZS5cbi8vIG1pbnNwYWNlOiBzbWFsbGVzdCBzcGFjZSBiZXR3ZWVuIHR3byBub3Rlcy4gVXNlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbiB0byBwYXNzIGJhY2sgaW4gYXMgdGhlIFwic3BhY2luZ1wiIGlucHV0IHBhcmFtZXRlci5cbi8vIFRPRE8tUEVSOiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZSBwYXNzZWQgYmFjayBhcyBhIHJldHVybiB2YWx1ZS5cbi8vIHN0YXJ0eDogVGhlIGxlZnQgZWRnZSwgdGFraW5nIHRoZSBtYXJnaW4gYW5kIHRoZSBvcHRpb25hbCB2b2ljZSBuYW1lLiBVc2VkIGJ5IHRoZSBkcmF3KCkgbWV0aG9kLlxuLy8gdzogVGhlIHdpZHRoIG9mIHRoZSBsaW5lLiBVc2VkIGJ5IGNhbGxpbmcgZnVuY3Rpb24gdG8gcGFzcyBiYWNrIGluIGFzIHRoZSBcInNwYWNpbmdcIiBpbnB1dCBwYXJhbWV0ZXIsIGFuZCB0aGUgZHJhdygpIG1ldGhvZC5cbi8vIFRPRE8tUEVSOiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZSBwYXNzZWQgYmFjayBhcyBhIHJldHVybiB2YWx1ZS4gIChUT0RPLVBFUjogaW4gcGl4ZWxzIG9yIHNwYWNpbmcgdW5pdHM/KVxuLy8geTogVGhlIHRvcCBvZiB0aGUgc3RhZmYgZ3JvdXAsIGluIHBpeGVscy4gVGhpcyBpcyBzZXQgaW4gdGhlIGRyYXcgbWV0aG9kLlxuLy8gVE9ETy1QRVI6IFdoZXJlIGlzIHRoYXQgdXNlZD8gSXQgbG9va3MgbGlrZSBpdCBtaWdodCBub3QgYmUgbmVlZGVkLlxuLy8gaGVpZ2h0OiBTZXQgaW4gdGhlIGRyYXcoKSBtZXRob2QgdG8gdGhlIGhlaWdodCBhY3R1YWxseSB1c2VkLiBVc2VkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHRvIGtub3cgd2hlcmUgdG8gc3RhcnQgdGhlIG5leHQgc3RhZmYgZ3JvdXAuXG4vLyBUT0RPLVBFUjogVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUgc2V0IGluIHRoZSBsYXlvdXQgbWV0aG9kIGFuZCBwYXNzZWQgYmFjayBhcyBhIHJldHVybiB2YWx1ZS5cblxudmFyIFN0YWZmR3JvdXBFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMudm9pY2VzID0gW107XG5cdHRoaXMuc3RhZmZzID0gW107XG5cdHRoaXMuYnJhY2UgPSB1bmRlZmluZWQ7IC8vdG9ueVxufTtcblxuU3RhZmZHcm91cEVsZW1lbnQucHJvdG90eXBlLnNldExpbWl0ID0gZnVuY3Rpb24obWVtYmVyLCB2b2ljZSkge1xuXHRpZiAoIXZvaWNlLnNwZWNpYWxZW21lbWJlcl0pIHJldHVybjtcblx0aWYgKCF2b2ljZS5zdGFmZi5zcGVjaWFsWVttZW1iZXJdKVxuXHRcdHZvaWNlLnN0YWZmLnNwZWNpYWxZW21lbWJlcl0gPSB2b2ljZS5zcGVjaWFsWVttZW1iZXJdO1xuXHRlbHNlXG5cdFx0dm9pY2Uuc3RhZmYuc3BlY2lhbFlbbWVtYmVyXSA9IE1hdGgubWF4KHZvaWNlLnN0YWZmLnNwZWNpYWxZW21lbWJlcl0sIHZvaWNlLnNwZWNpYWxZW21lbWJlcl0pO1xufTtcblxuU3RhZmZHcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZFZvaWNlID0gZnVuY3Rpb24gKHZvaWNlLCBzdGFmZm51bWJlciwgc3RhZmZsaW5lcykge1xuXHR2YXIgdm9pY2VOdW0gPSB0aGlzLnZvaWNlcy5sZW5ndGg7XG5cdHRoaXMudm9pY2VzW3ZvaWNlTnVtXSA9IHZvaWNlO1xuXHRpZiAodGhpcy5zdGFmZnNbc3RhZmZudW1iZXJdKVxuXHRcdHRoaXMuc3RhZmZzW3N0YWZmbnVtYmVyXS52b2ljZXMucHVzaCh2b2ljZU51bSk7XG5cdGVsc2Uge1xuXHRcdC8vIFRPRE8tUEVSOiBob3cgZG9lcyB0aGUgbWluL21heCBjaGFuZ2Ugd2hlbiBzdGFmZmxpbmVzIGlzIG5vdCA1P1xuXHRcdHRoaXMuc3RhZmZzW3RoaXMuc3RhZmZzLmxlbmd0aF0gPSB7XG5cdFx0XHR0b3A6IDEwLFxuXHRcdFx0Ym90dG9tOiAyLFxuXHRcdFx0bGluZXM6IHN0YWZmbGluZXMsXG5cdFx0XHR2b2ljZXM6IFt2b2ljZU51bV0sXG5cdFx0XHRzcGVjaWFsWToge1xuXHRcdFx0XHR0ZW1wb0hlaWdodEFib3ZlOiAwLFxuXHRcdFx0XHRwYXJ0SGVpZ2h0QWJvdmU6IDAsXG5cdFx0XHRcdHZvbHVtZUhlaWdodEFib3ZlOiAwLFxuXHRcdFx0XHRkeW5hbWljSGVpZ2h0QWJvdmU6IDAsXG5cdFx0XHRcdGVuZGluZ0hlaWdodEFib3ZlOiAwLFxuXHRcdFx0XHRjaG9yZEhlaWdodEFib3ZlOiAwLFxuXHRcdFx0XHRseXJpY0hlaWdodEFib3ZlOiAwLFxuXG5cdFx0XHRcdGx5cmljSGVpZ2h0QmVsb3c6IDAsXG5cdFx0XHRcdGNob3JkSGVpZ2h0QmVsb3c6IDAsXG5cdFx0XHRcdHZvbHVtZUhlaWdodEJlbG93OiAwLFxuXHRcdFx0XHRkeW5hbWljSGVpZ2h0QmVsb3c6IDBcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdHZvaWNlLnN0YWZmID0gdGhpcy5zdGFmZnNbc3RhZmZudW1iZXJdO1xufTtcblxuU3RhZmZHcm91cEVsZW1lbnQucHJvdG90eXBlLnNldFN0YWZmTGltaXRzID0gZnVuY3Rpb24gKHZvaWNlKSB7XG5cdHZvaWNlLnN0YWZmLnRvcCA9IE1hdGgubWF4KHZvaWNlLnN0YWZmLnRvcCwgdm9pY2UudG9wKTtcblx0dm9pY2Uuc3RhZmYuYm90dG9tID0gTWF0aC5taW4odm9pY2Uuc3RhZmYuYm90dG9tLCB2b2ljZS5ib3R0b20pO1xuXHR0aGlzLnNldExpbWl0KCd0ZW1wb0hlaWdodEFib3ZlJywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdwYXJ0SGVpZ2h0QWJvdmUnLCB2b2ljZSk7XG5cdHRoaXMuc2V0TGltaXQoJ3ZvbHVtZUhlaWdodEFib3ZlJywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdkeW5hbWljSGVpZ2h0QWJvdmUnLCB2b2ljZSk7XG5cdHRoaXMuc2V0TGltaXQoJ2VuZGluZ0hlaWdodEFib3ZlJywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdjaG9yZEhlaWdodEFib3ZlJywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdseXJpY0hlaWdodEFib3ZlJywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdseXJpY0hlaWdodEJlbG93Jywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCdjaG9yZEhlaWdodEJlbG93Jywgdm9pY2UpO1xuXHR0aGlzLnNldExpbWl0KCd2b2x1bWVIZWlnaHRCZWxvdycsIHZvaWNlKTtcblx0dGhpcy5zZXRMaW1pdCgnZHluYW1pY0hlaWdodEJlbG93Jywgdm9pY2UpO1xufTtcblxuU3RhZmZHcm91cEVsZW1lbnQucHJvdG90eXBlLnNldFVwcGVyQW5kTG93ZXJFbGVtZW50cyA9IGZ1bmN0aW9uKHJlbmRlcmVyKSB7XG5cdC8vIEVhY2ggc3RhZmYgYWxyZWFkeSBoYXMgdGhlIHRvcCBhbmQgYm90dG9tIHNldCwgbm93IHdlIHNlZSBpZiB0aGVyZSBhcmUgZWxlbWVudHMgdGhhdCBhcmUgYWx3YXlzIG9uIHRvcCBhbmQgYm90dG9tLCBhbmQgcmVzb2x2ZSB0aGVpciBwaXRjaC5cblx0Ly8gQWxzbywgZ2V0IHRoZSBvdmVyYWxsIGhlaWdodCBvZiBhbGwgdGhlIHN0YXZlcyBpbiB0aGlzIGdyb3VwLlxuXHR2YXIgbGFzdFN0YWZmQm90dG9tO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RhZmZzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHN0YWZmID0gdGhpcy5zdGFmZnNbaV07XG5cdFx0Ly8gdGhlIHZlcnRpY2FsIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlIGFib3ZlIGlzOiB0ZW1wbywgcGFydCwgdm9sdW1lL2R5bmFtaWMsIGVuZGluZy9jaG9yZCwgbHlyaWNcblx0XHQvLyB0aGUgdmVydGljYWwgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgYmVsb3cgaXM6IGx5cmljLCBjaG9yZCwgdm9sdW1lL2R5bmFtaWNcblx0XHR2YXIgcG9zaXRpb25ZID0ge1xuXHRcdFx0dGVtcG9IZWlnaHRBYm92ZTogMCxcblx0XHRcdHBhcnRIZWlnaHRBYm92ZTogMCxcblx0XHRcdHZvbHVtZUhlaWdodEFib3ZlOiAwLFxuXHRcdFx0ZHluYW1pY0hlaWdodEFib3ZlOiAwLFxuXHRcdFx0ZW5kaW5nSGVpZ2h0QWJvdmU6IDAsXG5cdFx0XHRjaG9yZEhlaWdodEFib3ZlOiAwLFxuXHRcdFx0bHlyaWNIZWlnaHRBYm92ZTogMCxcblxuXHRcdFx0bHlyaWNIZWlnaHRCZWxvdzogMCxcblx0XHRcdGNob3JkSGVpZ2h0QmVsb3c6IDAsXG5cdFx0XHR2b2x1bWVIZWlnaHRCZWxvdzogMCxcblx0XHRcdGR5bmFtaWNIZWlnaHRCZWxvdzogMFxuXHRcdH07XG5cblx0XHRpZiAoLypBQkNKUy53cml0ZS5kZWJ1Z1BsYWNlbWVudCovZmFsc2UpIHtcblx0XHRcdHN0YWZmLm9yaWdpbmFsVG9wID0gc3RhZmYudG9wOyAvLyBUaGlzIGlzIGp1c3QgYmVpbmcgc3RvcmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG5cdFx0XHRzdGFmZi5vcmlnaW5hbEJvdHRvbSA9IHN0YWZmLmJvdHRvbTsgLy8gVGhpcyBpcyBqdXN0IGJlaW5nIHN0b3JlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuXHRcdH1cblxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS5seXJpY0hlaWdodEFib3ZlKSB7IHN0YWZmLnRvcCArPSBzdGFmZi5zcGVjaWFsWS5seXJpY0hlaWdodEFib3ZlOyBwb3NpdGlvblkubHlyaWNIZWlnaHRBYm92ZSA9IHN0YWZmLnRvcDsgfVxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS5jaG9yZEhlaWdodEFib3ZlKSB7IHN0YWZmLnRvcCArPSBzdGFmZi5zcGVjaWFsWS5jaG9yZEhlaWdodEFib3ZlOyBwb3NpdGlvblkuY2hvcmRIZWlnaHRBYm92ZSA9IHN0YWZmLnRvcDsgfVxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS5lbmRpbmdIZWlnaHRBYm92ZSkge1xuXHRcdFx0aWYgKHN0YWZmLnNwZWNpYWxZLmNob3JkSGVpZ2h0QWJvdmUpXG5cdFx0XHRcdHN0YWZmLnRvcCArPSAyO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdGFmZi50b3AgKz0gc3RhZmYuc3BlY2lhbFkuZW5kaW5nSGVpZ2h0QWJvdmU7XG5cdFx0XHRwb3NpdGlvblkuZW5kaW5nSGVpZ2h0QWJvdmUgPSBzdGFmZi50b3A7XG5cdFx0fVxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS5keW5hbWljSGVpZ2h0QWJvdmUgJiYgc3RhZmYuc3BlY2lhbFkudm9sdW1lSGVpZ2h0QWJvdmUpIHtcblx0XHRcdHN0YWZmLnRvcCArPSBNYXRoLm1heChzdGFmZi5zcGVjaWFsWS5keW5hbWljSGVpZ2h0QWJvdmUsIHN0YWZmLnNwZWNpYWxZLnZvbHVtZUhlaWdodEFib3ZlKTtcblx0XHRcdHBvc2l0aW9uWS5keW5hbWljSGVpZ2h0QWJvdmUgPSBzdGFmZi50b3A7XG5cdFx0XHRwb3NpdGlvblkudm9sdW1lSGVpZ2h0QWJvdmUgPSBzdGFmZi50b3A7XG5cdFx0fSBlbHNlIGlmIChzdGFmZi5zcGVjaWFsWS5keW5hbWljSGVpZ2h0QWJvdmUpIHtcblx0XHRcdHN0YWZmLnRvcCArPSBzdGFmZi5zcGVjaWFsWS5keW5hbWljSGVpZ2h0QWJvdmU7IHBvc2l0aW9uWS5keW5hbWljSGVpZ2h0QWJvdmUgPSBzdGFmZi50b3A7XG5cdFx0fSBlbHNlIGlmIChzdGFmZi5zcGVjaWFsWS52b2x1bWVIZWlnaHRBYm92ZSkgeyBzdGFmZi50b3AgKz0gc3RhZmYuc3BlY2lhbFkudm9sdW1lSGVpZ2h0QWJvdmU7IHBvc2l0aW9uWS52b2x1bWVIZWlnaHRBYm92ZSA9IHN0YWZmLnRvcDsgfVxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS5wYXJ0SGVpZ2h0QWJvdmUpIHsgc3RhZmYudG9wICs9IHN0YWZmLnNwZWNpYWxZLnBhcnRIZWlnaHRBYm92ZTsgcG9zaXRpb25ZLnBhcnRIZWlnaHRBYm92ZSA9IHN0YWZmLnRvcDsgfVxuXHRcdGlmIChzdGFmZi5zcGVjaWFsWS50ZW1wb0hlaWdodEFib3ZlKSB7IHN0YWZmLnRvcCArPSBzdGFmZi5zcGVjaWFsWS50ZW1wb0hlaWdodEFib3ZlOyBwb3NpdGlvblkudGVtcG9IZWlnaHRBYm92ZSA9IHN0YWZmLnRvcDsgfVxuXG5cdFx0aWYgKHN0YWZmLnNwZWNpYWxZLmx5cmljSGVpZ2h0QmVsb3cpIHsgcG9zaXRpb25ZLmx5cmljSGVpZ2h0QmVsb3cgPSBzdGFmZi5ib3R0b207IHN0YWZmLmJvdHRvbSAtPSBzdGFmZi5zcGVjaWFsWS5seXJpY0hlaWdodEJlbG93OyB9XG5cdFx0aWYgKHN0YWZmLnNwZWNpYWxZLmNob3JkSGVpZ2h0QmVsb3cpIHsgcG9zaXRpb25ZLmNob3JkSGVpZ2h0QmVsb3cgPSBzdGFmZi5ib3R0b207IHN0YWZmLmJvdHRvbSAtPSBzdGFmZi5zcGVjaWFsWS5jaG9yZEhlaWdodEJlbG93OyB9XG5cdFx0aWYgKHN0YWZmLnNwZWNpYWxZLnZvbHVtZUhlaWdodEJlbG93ICYmIHN0YWZmLnNwZWNpYWxZLmR5bmFtaWNIZWlnaHRCZWxvdykge1xuXHRcdFx0cG9zaXRpb25ZLnZvbHVtZUhlaWdodEJlbG93ID0gc3RhZmYuYm90dG9tO1xuXHRcdFx0cG9zaXRpb25ZLmR5bmFtaWNIZWlnaHRCZWxvdyA9IHN0YWZmLmJvdHRvbTtcblx0XHRcdHN0YWZmLmJvdHRvbSAtPSBNYXRoLm1heChzdGFmZi5zcGVjaWFsWS52b2x1bWVIZWlnaHRCZWxvdywgc3RhZmYuc3BlY2lhbFkuZHluYW1pY0hlaWdodEJlbG93KTtcblx0XHR9IGVsc2UgaWYgKHN0YWZmLnNwZWNpYWxZLnZvbHVtZUhlaWdodEJlbG93KSB7XG5cdFx0XHRwb3NpdGlvblkudm9sdW1lSGVpZ2h0QmVsb3cgPSBzdGFmZi5ib3R0b207IHN0YWZmLmJvdHRvbSAtPSBzdGFmZi5zcGVjaWFsWS52b2x1bWVIZWlnaHRCZWxvdztcblx0XHR9IGVsc2UgaWYgKHN0YWZmLnNwZWNpYWxZLmR5bmFtaWNIZWlnaHRCZWxvdykge1xuXHRcdFx0cG9zaXRpb25ZLmR5bmFtaWNIZWlnaHRCZWxvdyA9IHN0YWZmLmJvdHRvbTsgc3RhZmYuYm90dG9tIC09IHN0YWZmLnNwZWNpYWxZLmR5bmFtaWNIZWlnaHRCZWxvdztcblx0XHR9XG5cblx0XHRpZiAoLypBQkNKUy53cml0ZS5kZWJ1Z1BsYWNlbWVudCovZmFsc2UpXG5cdFx0XHRzdGFmZi5wb3NpdGlvblkgPSBwb3NpdGlvblk7IC8vIFRoaXMgaXMganVzdCBiZWluZyBzdG9yZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cblxuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgc3RhZmYudm9pY2VzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHR2YXIgdm9pY2UgPSB0aGlzLnZvaWNlc1tzdGFmZi52b2ljZXNbal1dO1xuXHRcdFx0dm9pY2Uuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzKHBvc2l0aW9uWSk7XG5cdFx0fVxuXHRcdC8vIFdlIG1pZ2h0IG5lZWQgYSBsaXR0bGUgc3BhY2UgaW4gYmV0d2VlbiBzdGF2ZXMgaWYgdGhlIHN0YXZlcyBoYXZlbid0IGJlZW4gcHVzaGVkIGZhciBlbm91Z2ggYXBhcnQgYnkgbm90ZXMgb3IgZXh0cmEgdmVydGljYWwgc3R1ZmYuXG5cdFx0Ly8gT25seSB0cnkgdG8gcHV0IGluIGV4dHJhIHNwYWNlIGlmIHRoaXMgaXNuJ3QgdGhlIHRvcCBzdGFmZi5cblx0XHRpZiAobGFzdFN0YWZmQm90dG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhciB0aGlzU3RhZmZUb3AgPSBzdGFmZi50b3AgLSAxMDtcblx0XHRcdHZhciBmb3JjZWRTcGFjaW5nQmV0d2VlbiA9IGxhc3RTdGFmZkJvdHRvbSArIHRoaXNTdGFmZlRvcDtcblx0XHRcdHZhciBtaW5TcGFjaW5nSW5QaXRjaGVzID0gcmVuZGVyZXIuc3BhY2luZy5zeXN0ZW1TdGFmZlNlcGFyYXRpb24vc3BhY2luZy5TVEVQO1xuXHRcdFx0dmFyIGFkZGVkU3BhY2UgPSBtaW5TcGFjaW5nSW5QaXRjaGVzIC0gZm9yY2VkU3BhY2luZ0JldHdlZW47XG5cdFx0XHRpZiAoYWRkZWRTcGFjZSA+IDApXG5cdFx0XHRcdHN0YWZmLnRvcCArPSBhZGRlZFNwYWNlO1xuXHRcdH1cblx0XHRsYXN0U3RhZmZCb3R0b20gPSAyIC0gc3RhZmYuYm90dG9tOyAvLyB0aGUgc3RhZmYgc3RhcnRzIGF0IHBvc2l0aW9uIDIgYW5kIHRoZSBib3R0b20gdmFyaWFibGUgaXMgbmVnYXRpdmUuIFRoZXJlZm9yZSB0byBmaW5kIG91dCBob3cgbGFyZ2UgdGhlIGJvdHRvbSBpcywgd2UgcmV2ZXJzZSB0aGUgc2lnbiBvZiB0aGUgYm90dG9tLCBhbmQgYWRkIHRoZSAyIGluLlxuXG5cdFx0Ly8gTm93IHdlIG5lZWQgYSBsaXR0bGUgbWFyZ2luIG9uIHRoZSB0b3AsIHNvIHdlJ2xsIGp1c3QgdGhyb3cgdGhhdCBpbi5cblx0XHQvL3N0YWZmLnRvcCArPSA0O1xuXHRcdC8vY29uc29sZS5sb2coXCJTdGFmZiBZOiBcIixpLGhlaWdodEluUGl0Y2hlcyxzdGFmZi50b3Asc3RhZmYuYm90dG9tKTtcblx0fVxuXHQvL2NvbnNvbGUubG9nKFwiU3RhZmYgSGVpZ2h0OiBcIixoZWlnaHRJblBpdGNoZXMsdGhpcy5oZWlnaHQpO1xufTtcblxuU3RhZmZHcm91cEVsZW1lbnQucHJvdG90eXBlLmZpbmlzaGVkID0gZnVuY3Rpb24oKSB7XG5cdGZvciAodmFyIGk9MDtpPHRoaXMudm9pY2VzLmxlbmd0aDtpKyspIHtcblx0XHRpZiAoIXRoaXMudm9pY2VzW2ldLmxheW91dEVuZGVkKCkpIHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIGdldExlZnRFZGdlT2ZTdGFmZihyZW5kZXJlciwgdm9pY2VzLCBicmFjZSkge1xuXHR2YXIgeCA9IHJlbmRlcmVyLnBhZGRpbmcubGVmdDtcblxuXHQvLyBmaW5kIG91dCBob3cgbXVjaCBzcGFjZSB3aWxsIGJlIHRha2VuIHVwIGJ5IHZvaWNlIGhlYWRlcnNcblx0dmFyIHZvaWNlaGVhZGVydyA9IDA7XG5cdGZvciAodmFyIGk9MDtpPHZvaWNlcy5sZW5ndGg7aSsrKSB7XG5cdFx0aWYodm9pY2VzW2ldLmhlYWRlcikge1xuXHRcdFx0dmFyIHNpemUgPSByZW5kZXJlci5nZXRUZXh0U2l6ZSh2b2ljZXNbaV0uaGVhZGVyLCAndm9pY2Vmb250JywgJycpO1xuXHRcdFx0dm9pY2VoZWFkZXJ3ID0gTWF0aC5tYXgodm9pY2VoZWFkZXJ3LHNpemUud2lkdGgpO1xuXHRcdH1cblx0fVxuXHRpZiAodm9pY2VoZWFkZXJ3KSB7XG5cdFx0Ly8gR2l2ZSBlbm91Z2ggc3BhY2luZyB0byB0aGUgcmlnaHQgLSB3ZSB1c2UgdGhlIHdpZHRoIG9mIGFuIEEgZm9yIHRoZSBhbW91bnQgb2Ygc3BhY2luZy5cblx0XHR2YXIgc2l6ZVcgPSByZW5kZXJlci5nZXRUZXh0U2l6ZShcIkFcIiwgJ3ZvaWNlZm9udCcsICcnKTtcblx0XHR2b2ljZWhlYWRlcncgKz0gc2l6ZVcud2lkdGg7XG5cdH1cblx0eCArPSB2b2ljZWhlYWRlcnc7XG5cblx0aWYgKGJyYWNlKSB7XG5cdFx0YnJhY2Uuc2V0TG9jYXRpb24oeCk7XG5cdFx0eCArPSBicmFjZS5nZXRXaWR0aCgpO1xuXHR9XG5cdHJldHVybiB4O1xufVxuXG5TdGFmZkdyb3VwRWxlbWVudC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oc3BhY2luZywgcmVuZGVyZXIsIGRlYnVnKSB7XG5cdHZhciBlcHNpbG9uID0gMC4wMDAwMDAxOyAvLyBGdWRnaW5nIGZvciBpbmV4YWN0bmVzcyBvZiBmbG9hdGluZyBwb2ludCBtYXRoLlxuXHR2YXIgc3BhY2luZ3VuaXRzID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgaGF2ZSBlbmRlZCB1cCB1c2luZyB0aGUgc3BhY2luZyBkaXN0YW5jZSAoYXMgb3Bwb3NlZCB0byBmaXhlZCB3aWR0aCBkaXN0YW5jZXMpXG5cdHZhciBtaW5zcGFjZSA9IDEwMDA7IC8vIGEgYmlnIG51bWJlciB0byBzdGFydCBvZmYgd2l0aCAtIHVzZWQgdG8gZmluZCBvdXQgd2hhdCB0aGUgc21hbGxlc3Qgc3BhY2UgYmV0d2VlbiB0d28gbm90ZXMgaXMgLS0gR0QgMjAxNC4xLjdcblxuXHR2YXIgeCA9IGdldExlZnRFZGdlT2ZTdGFmZihyZW5kZXJlciwgdGhpcy52b2ljZXMsIHRoaXMuYnJhY2UpO1xuXHR0aGlzLnN0YXJ0eD14O1xuXHR2YXIgaTtcblxuXHR2YXIgY3VycmVudGR1cmF0aW9uID0gMDtcblx0aWYgKGRlYnVnKSBjb25zb2xlLmxvZyhcImluaXQgbGF5b3V0XCIsIHNwYWNpbmcpO1xuXHRmb3IgKGk9MDtpPHRoaXMudm9pY2VzLmxlbmd0aDtpKyspIHtcblx0XHR0aGlzLnZvaWNlc1tpXS5iZWdpbkxheW91dCh4KTtcblx0fVxuXG5cdHZhciBzcGFjaW5ndW5pdCA9IDA7IC8vIG51bWJlciBvZiBzcGFjaW5ndW5pdHMgY29taW5nIGZyb20gdGhlIHByZXZpb3VzbHkgbGFpZCBvdXQgZWxlbWVudCB0byB0aGlzIG9uZVxuXHR3aGlsZSAoIXRoaXMuZmluaXNoZWQoKSkge1xuXHRcdC8vIGZpbmQgZmlyc3QgZHVyYXRpb24gbGV2ZWwgdG8gYmUgbGFpZCBvdXQgYW1vbmcgY2FuZGlkYXRlcyBhY3Jvc3Mgdm9pY2VzXG5cdFx0Y3VycmVudGR1cmF0aW9uPSBudWxsOyAvLyBjYW5kaWRhdGUgc21hbGxlc3QgZHVyYXRpb24gbGV2ZWxcblx0XHRmb3IgKGk9MDtpPHRoaXMudm9pY2VzLmxlbmd0aDtpKyspIHtcblx0XHRcdGlmICghdGhpcy52b2ljZXNbaV0ubGF5b3V0RW5kZWQoKSAmJiAoIWN1cnJlbnRkdXJhdGlvbiB8fCB0aGlzLnZvaWNlc1tpXS5nZXREdXJhdGlvbkluZGV4KCk8Y3VycmVudGR1cmF0aW9uKSlcblx0XHRcdFx0Y3VycmVudGR1cmF0aW9uPXRoaXMudm9pY2VzW2ldLmdldER1cmF0aW9uSW5kZXgoKTtcblx0XHR9XG5cblxuXHRcdC8vIGlzb2xhdGUgdm9pY2VzIGF0IGN1cnJlbnQgZHVyYXRpb24gbGV2ZWxcblx0XHR2YXIgY3VycmVudHZvaWNlcyA9IFtdO1xuXHRcdHZhciBvdGhlcnZvaWNlcyA9IFtdO1xuXHRcdGZvciAoaT0wO2k8dGhpcy52b2ljZXMubGVuZ3RoO2krKykge1xuXHRcdFx0dmFyIGR1cmF0aW9uSW5kZXggPSB0aGlzLnZvaWNlc1tpXS5nZXREdXJhdGlvbkluZGV4KCk7XG5cdFx0XHQvLyBQRVI6IEJlY2F1c2Ugb2YgdGhlIGluZXhhY3RuZXNzIG9mIEpTIGZsb2F0aW5nIHBvaW50IG1hdGgsIHdlIGp1c3QgZ2V0IGNsb3NlLlxuXHRcdFx0aWYgKGR1cmF0aW9uSW5kZXggLSBjdXJyZW50ZHVyYXRpb24gPiBlcHNpbG9uKSB7XG5cdFx0XHRcdG90aGVydm9pY2VzLnB1c2godGhpcy52b2ljZXNbaV0pO1xuXHRcdFx0XHQvL2NvbnNvbGUubG9nKFwib3V0OiB2b2ljZSBcIixpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1cnJlbnR2b2ljZXMucHVzaCh0aGlzLnZvaWNlc1tpXSk7XG5cdFx0XHRcdC8vaWYgKGRlYnVnKSBjb25zb2xlLmxvZyhcImluOiB2b2ljZSBcIixpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhbW9uZyB0aGUgY3VycmVudCBkdXJhdGlvbiBsZXZlbCBmaW5kIHRoZSBvbmUgd2hpY2ggbmVlZHMgc3RhcnRpbmcgZnVydGhlc3QgcmlnaHRcblx0XHRzcGFjaW5ndW5pdCA9IDA7IC8vIG51bWJlciBvZiBzcGFjaW5ndW5pdHMgY29taW5nIGZyb20gdGhlIHByZXZpb3VzbHkgbGFpZCBvdXQgZWxlbWVudCB0byB0aGlzIG9uZVxuXHRcdHZhciBzcGFjaW5nZHVyYXRpb24gPSAwO1xuXHRcdGZvciAoaT0wO2k8Y3VycmVudHZvaWNlcy5sZW5ndGg7aSsrKSB7XG5cdFx0XHQvL2NvbnNvbGUubG9nKFwiZ3JlYXRlc3Qgc3BhY2luZyB1bml0XCIsIHgsIGN1cnJlbnR2b2ljZXNbaV0uZ2V0TmV4dFgoKSwgY3VycmVudHZvaWNlc1tpXS5nZXRTcGFjaW5nVW5pdHMoKSwgY3VycmVudHZvaWNlc1tpXS5zcGFjaW5nZHVyYXRpb24pO1xuXHRcdFx0aWYgKGN1cnJlbnR2b2ljZXNbaV0uZ2V0TmV4dFgoKT54KSB7XG5cdFx0XHRcdHg9Y3VycmVudHZvaWNlc1tpXS5nZXROZXh0WCgpO1xuXHRcdFx0XHRzcGFjaW5ndW5pdD1jdXJyZW50dm9pY2VzW2ldLmdldFNwYWNpbmdVbml0cygpO1xuXHRcdFx0XHRzcGFjaW5nZHVyYXRpb24gPSBjdXJyZW50dm9pY2VzW2ldLnNwYWNpbmdkdXJhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cdFx0c3BhY2luZ3VuaXRzKz1zcGFjaW5ndW5pdDtcblx0XHRtaW5zcGFjZSA9IE1hdGgubWluKG1pbnNwYWNlLHNwYWNpbmd1bml0KTtcblx0XHRpZiAoZGVidWcpIGNvbnNvbGUubG9nKFwiY3VycmVudGR1cmF0aW9uOiBcIixjdXJyZW50ZHVyYXRpb24sIHNwYWNpbmd1bml0cywgbWluc3BhY2UpO1xuXG5cdFx0Zm9yIChpPTA7aTxjdXJyZW50dm9pY2VzLmxlbmd0aDtpKyspIHtcblx0XHRcdHZhciB2b2ljZWNoaWxkeCA9IGN1cnJlbnR2b2ljZXNbaV0ubGF5b3V0T25lSXRlbSh4LHNwYWNpbmcpO1xuXHRcdFx0dmFyIGR4ID0gdm9pY2VjaGlsZHgteDtcblx0XHRcdGlmIChkeD4wKSB7XG5cdFx0XHRcdHggPSB2b2ljZWNoaWxkeDsgLy91cGRhdGUgeFxuXHRcdFx0XHRmb3IgKHZhciBqPTA7ajxpO2orKykgeyAvLyBzaGlmdCBvdmVyIGFsbCBwcmV2aW91c2x5IGxhaWQgb3V0IGVsZW1lbnRzXG5cdFx0XHRcdFx0Y3VycmVudHZvaWNlc1tqXS5zaGlmdFJpZ2h0KGR4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgdmFsdWUgb2YgYWxyZWFkeSBjb3VudGVkIHNwYWNpbmcgdW5pdHMgaW4gb3RoZXIgdm9pY2VzIChlLmcuIGlmIGEgdm9pY2UgaGFkIHBsYW5uZWQgdG8gdXNlIHVwIDUgc3BhY2luZyB1bml0cyBidXQgaXMgbm90IGluIGxpbmUgdG8gYmUgbGFpZCBvdXQgYXQgdGhpcyBkdXJhdGlvbiBsZXZlbCAtIHdoZXJlIHdlJ3ZlIHVzZWQgMiBzcGFjaW5nIHVuaXRzIC0gdGhlbiB3ZSBtdXN0IHVzZSB1cCAzIHNwYWNpbmcgdW5pdHMsIG5vdCA1KVxuXHRcdGZvciAoaT0wO2k8b3RoZXJ2b2ljZXMubGVuZ3RoO2krKykge1xuXHRcdFx0b3RoZXJ2b2ljZXNbaV0uc3BhY2luZ2R1cmF0aW9uLT1zcGFjaW5nZHVyYXRpb247XG5cdFx0XHRvdGhlcnZvaWNlc1tpXS51cGRhdGVOZXh0WCh4LHNwYWNpbmcpOyAvLyBhZGp1c3Qgb3RoZXIgdm9pY2VzIGV4cGVjdGF0aW9uc1xuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBpbmRleGVzIG9mIGN1cnJlbnRseSBsYWlkIG91dCBlbGVtc1xuXHRcdGZvciAoaT0wO2k8Y3VycmVudHZvaWNlcy5sZW5ndGg7aSsrKSB7XG5cdFx0XHR2YXIgdm9pY2UgPSBjdXJyZW50dm9pY2VzW2ldO1xuXHRcdFx0dm9pY2UudXBkYXRlSW5kaWNlcygpO1xuXHRcdH1cblx0fSAvLyBmaW5pc2hlZCBsYXlpbmcgb3V0XG5cblxuXHQvLyBmaW5kIHRoZSBncmVhdGVzdCByZW1haW5pbmcgeCBhcyBhIGJhc2UgZm9yIHRoZSB3aWR0aFxuXHRmb3IgKGk9MDtpPHRoaXMudm9pY2VzLmxlbmd0aDtpKyspIHtcblx0XHRpZiAodGhpcy52b2ljZXNbaV0uZ2V0TmV4dFgoKT54KSB7XG5cdFx0XHR4PXRoaXMudm9pY2VzW2ldLmdldE5leHRYKCk7XG5cdFx0XHRzcGFjaW5ndW5pdD10aGlzLnZvaWNlc1tpXS5nZXRTcGFjaW5nVW5pdHMoKTtcblx0XHR9XG5cdH1cblx0Ly9jb25zb2xlLmxvZyhcImdyZWF0ZXN0IHJlbWFpbmluZ1wiLHNwYWNpbmd1bml0LHgpO1xuXHRzcGFjaW5ndW5pdHMrPXNwYWNpbmd1bml0O1xuXHR0aGlzLncgPSB4O1xuXG5cdGZvciAoaT0wO2k8dGhpcy52b2ljZXMubGVuZ3RoO2krKykge1xuXHRcdHRoaXMudm9pY2VzW2ldLnc9dGhpcy53O1xuXHR9XG5cdHJldHVybiB7IHNwYWNpbmdVbml0czogc3BhY2luZ3VuaXRzLCBtaW5TcGFjZTogbWluc3BhY2UgfTtcbn07XG5cblN0YWZmR3JvdXBFbGVtZW50LnByb3RvdHlwZS5jYWxjSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuXHQvLyB0aGUgaGVpZ2h0IGlzIGNhbGN1bGF0ZWQgaGVyZSBpbiBhIHBhcmFsbGVsIHdheSB0byB0aGUgZHJhd2luZyBiZWxvdyBpbiBob3BlcyB0aGF0IGJvdGggb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgbW9kaWZpZWQgdG9nZXRoZXIuXG5cdC8vIFRPRE8tUEVSOiBhbHNvIGFkZCB0aGUgc3BhY2UgYmV0d2VlbiBzdGF2ZXMuIChUaGF0J3Mgc3lzdGVtU3RhZmZTZXBhcmF0aW9uLCB3aGljaCBpcyB0aGUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFmZiBMSU5FUy4pXG5cdHZhciBoZWlnaHQgPSAwO1xuXHRmb3IgKHZhciBpPTA7aTx0aGlzLnZvaWNlcy5sZW5ndGg7aSsrKSB7XG5cdFx0dmFyIHN0YWZmID0gdGhpcy52b2ljZXNbaV0uc3RhZmY7XG5cdFx0aWYgKCF0aGlzLnZvaWNlc1tpXS5kdXBsaWNhdGUpIHtcblx0XHRcdGhlaWdodCArPSBzdGFmZi50b3A7XG5cdFx0XHRpZiAoc3RhZmYuYm90dG9tIDwgMClcblx0XHRcdFx0aGVpZ2h0ICs9IC1zdGFmZi5ib3R0b207XG5cdFx0fVxuXHR9XG5cdHJldHVybiBoZWlnaHQ7XG59O1xuXG5TdGFmZkdyb3VwRWxlbWVudC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuXHQvLyBXZSBlbnRlciB0aGlzIG1ldGhvZCB3aXRoIHJlbmRlcmVyLnkgcG9pbnRpbmcgdG8gdGhlIHRvcG1vc3QgY29vcmRpbmF0ZSB0aGF0IHdlJ3JlIGFsbG93ZWQgdG8gZHJhdy5cblx0Ly8gQWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IHdpbGwgYmUgZHJhd24gaGF2ZSBhIHJlbGF0aXZlIFwicGl0Y2hcIiBzZXQsIHdoZXJlIHplcm8gaXMgdGhlIGZpcnN0IGxlZGdlciBsaW5lIGJlbG93IHRoZSBzdGFmZi5cblx0Ly8gcmVuZGVyZXIueSB3aWxsIGJlIG9mZnNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc3RhZmYgYnkgdGhlIGFtb3VudCByZXF1aXJlZCB0byBtYWtlIHRoZSByZWxhdGl2ZSBwaXRjaCB3b3JrLlxuXHQvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3RhdmVzLCB0aGVuIHJlbmRlcmVyLnkgd2lsbCBiZSBpbmNyZW1lbnRlZCBmb3IgZWFjaCBuZXcgc3RhZmYuXG5cblx0dmFyIGRlYnVnUHJpbnQ7XG5cdHZhciBjb2xvckluZGV4O1xuXHRpZiAoLypBQkNKUy53cml0ZS5kZWJ1Z1BsYWNlbWVudCovZmFsc2UpIHtcblx0XHR2YXIgY29sb3JzID0gWyBcInJnYigyMDcsMjcsMzYpXCIsIFwicmdiKDE2OCwyMTQsODApXCIsIFwicmdiKDExMCwxNjEsMjI0KVwiLCBcInJnYigxOTEsMTE5LDIxOClcIiwgXCJyZ2IoMTk1LDMwLDE1MSlcIixcblx0XHRcdFwicmdiKDMxLDE3MCwxNzcpXCIsIFwicmdiKDIyMCwxNjYsMTQyKVwiIF07XG5cdFx0ZGVidWdQcmludCA9IGZ1bmN0aW9uKHN0YWZmLCBrZXkpIHtcblx0XHRcdGlmIChzdGFmZi5wb3NpdGlvbllba2V5XSkge1xuXHRcdFx0XHQvL3JlbmRlcmVyLnByaW50SG9yaXpvbnRhbExpbmUoNTAsIHJlbmRlcmVyLmNhbGNZKHN0YWZmLnBvc2l0aW9uWVtrZXldKSwga2V5LnN1YnN0cigwLCA0KSArIFwiIFwiICsgTWF0aC5yb3VuZChzdGFmZi5wb3NpdGlvbllba2V5XSkpO1xuXHRcdFx0XHR2YXIgaGVpZ2h0ID0gc3RhZmYuc3BlY2lhbFlba2V5XSAqIHNwYWNpbmcuU1RFUDtcblx0XHRcdFx0cmVuZGVyZXIucHJpbnRTaGFkZWRCb3gocmVuZGVyZXIucGFkZGluZy5sZWZ0LCByZW5kZXJlci5jYWxjWShzdGFmZi5wb3NpdGlvbllba2V5XSksIHJlbmRlcmVyLmNvbnRyb2xsZXIud2lkdGgsIGhlaWdodCxjb2xvcnNbY29sb3JJbmRleF0sIDAuNCwga2V5LnN1YnN0cigwLCA0KSk7XG5cdFx0XHRcdGNvbG9ySW5kZXggKz0gMTsgaWYgKGNvbG9ySW5kZXggPiA2KSBjb2xvckluZGV4ID0gMDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gQW4gaW52aXNpYmxlIG1hcmtlciBpcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBmaW5kIHdoZXJlIGVhY2ggc3lzdGVtIHN0YXJ0cy5cblx0cmVuZGVyZXIuYWRkSW52aXNpYmxlTWFya2VyKFwiYWJjanMtdG9wLW9mLXN5c3RlbVwiKTtcblxuXHR2YXIgc3RhcnRZID0gcmVuZGVyZXIueTsgLy8gU28gdGhhdCBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgd2UncmUgZG9uZS5cblx0Ly8gU2V0IHRoZSBhYnNvbHV0ZSBZIHBvc2l0aW9uIGZvciBlYWNoIHN0YWZmIGhlcmUsIHNvIHRoZSB2b2ljZSBkcmF3aW5nIGJlbG93IGNhbiBqdXN0IHVzZSBpZi5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnN0YWZmcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBzdGFmZjEgPSB0aGlzLnN0YWZmc1tqXTtcblx0XHQvL3JlbmRlcmVyLnByaW50SG9yaXpvbnRhbExpbmUoNTAsIHJlbmRlcmVyLnksIFwic3RhcnRcIik7XG5cdFx0cmVuZGVyZXIubW92ZVkoc3BhY2luZy5TVEVQLCBzdGFmZjEudG9wKTtcblx0XHRzdGFmZjEuYWJzb2x1dGVZID0gcmVuZGVyZXIueTtcblx0XHRpZiAoLypBQkNKUy53cml0ZS5kZWJ1Z1BsYWNlbWVudCovZmFsc2UpIHtcblx0XHRcdGNvbG9ySW5kZXggPSAwO1xuXHRcdFx0cmVuZGVyZXIucHJpbnRTaGFkZWRCb3gocmVuZGVyZXIucGFkZGluZy5sZWZ0LCByZW5kZXJlci5jYWxjWShzdGFmZjEub3JpZ2luYWxUb3ApLCByZW5kZXJlci5jb250cm9sbGVyLndpZHRoLCByZW5kZXJlci5jYWxjWShzdGFmZjEub3JpZ2luYWxCb3R0b20pLXJlbmRlcmVyLmNhbGNZKHN0YWZmMS5vcmlnaW5hbFRvcCksIFwiIzAwMDAwMFwiLCAwLjEpO1xuXHRcdFx0ZGVidWdQcmludChzdGFmZjEsICdjaG9yZEhlaWdodEFib3ZlJyk7XG5cdFx0XHRkZWJ1Z1ByaW50KHN0YWZmMSwgJ2Nob3JkSGVpZ2h0QmVsb3cnKTtcblx0XHRcdGRlYnVnUHJpbnQoc3RhZmYxLCAnZHluYW1pY0hlaWdodEFib3ZlJyk7XG5cdFx0XHRkZWJ1Z1ByaW50KHN0YWZmMSwgJ2R5bmFtaWNIZWlnaHRCZWxvdycpO1xuXHRcdFx0ZGVidWdQcmludChzdGFmZjEsICdlbmRpbmdIZWlnaHRBYm92ZScpO1xuXHRcdFx0ZGVidWdQcmludChzdGFmZjEsICdseXJpY0hlaWdodEFib3ZlJyk7XG5cdFx0XHRkZWJ1Z1ByaW50KHN0YWZmMSwgJ2x5cmljSGVpZ2h0QmVsb3cnKTtcblx0XHRcdGRlYnVnUHJpbnQoc3RhZmYxLCAncGFydEhlaWdodEFib3ZlJyk7XG5cdFx0XHRkZWJ1Z1ByaW50KHN0YWZmMSwgJ3RlbXBvSGVpZ2h0QWJvdmUnKTtcblx0XHRcdGRlYnVnUHJpbnQoc3RhZmYxLCAndm9sdW1lSGVpZ2h0QWJvdmUnKTtcblx0XHRcdGRlYnVnUHJpbnQoc3RhZmYxLCAndm9sdW1lSGVpZ2h0QmVsb3cnKTtcblx0XHR9XG5cdFx0aWYgKHN0YWZmMS5ib3R0b20gPCAwKVxuXHRcdFx0cmVuZGVyZXIubW92ZVkoc3BhY2luZy5TVEVQLCAtc3RhZmYxLmJvdHRvbSk7XG5cdH1cblx0dmFyIHRvcExpbmU7IC8vIHRoZXNlIGFyZSB0byBjb25uZWN0IG11bHRpcGxlIHN0YXZlcy4gV2UgbmVlZCB0byByZW1lbWJlciB3aGVyZSB0aGV5IGFyZS5cblx0dmFyIGJvdHRvbUxpbmU7XG5cblx0dmFyIGJhcnRvcCA9IDA7XG5cdHJlbmRlcmVyLm1lYXN1cmVOdW1iZXIgPSBudWxsO1xuXHRyZW5kZXJlci5ub3RlTnVtYmVyID0gbnVsbDtcblx0Zm9yICh2YXIgaT0wO2k8dGhpcy52b2ljZXMubGVuZ3RoO2krKykge1xuXHRcdHZhciBzdGFmZiA9IHRoaXMudm9pY2VzW2ldLnN0YWZmO1xuXHRcdHJlbmRlcmVyLnkgPSBzdGFmZi5hYnNvbHV0ZVk7XG5cdFx0cmVuZGVyZXIudm9pY2VOdW1iZXIgPSBpO1xuXHRcdC8vcmVuZGVyZXIueSA9IHN0YWZmLnk7XG5cdFx0Ly8gb2Zmc2V0IGZvciBzdGFydGluZyB0aGUgY291bnRpbmcgYXQgbWlkZGxlIENcblx0XHRpZiAoIXRoaXMudm9pY2VzW2ldLmR1cGxpY2F0ZSkge1xuLy9cdFx0XHRyZW5kZXJlci5tb3ZlWShzcGFjaW5nLlNURVAsIHN0YWZmLnRvcCk7XG5cdFx0XHRpZiAoIXRvcExpbmUpIHRvcExpbmUgID0gcmVuZGVyZXIuY2FsY1koMTApO1xuXHRcdFx0Ym90dG9tTGluZSAgPSByZW5kZXJlci5jYWxjWSgyKTtcblx0XHRcdGlmIChzdGFmZi5saW5lcyAhPT0gMCkge1xuXHRcdFx0XHRyZW5kZXJlci5tZWFzdXJlTnVtYmVyID0gbnVsbDtcblx0XHRcdFx0cmVuZGVyZXIubm90ZU51bWJlciA9IG51bGw7XG5cdFx0XHRcdHJlbmRlcmVyLnByaW50U3RhdmUodGhpcy5zdGFydHgsIHRoaXMudywgc3RhZmYubGluZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnZvaWNlc1tpXS5kcmF3KHJlbmRlcmVyLCBiYXJ0b3ApO1xuXHRcdHJlbmRlcmVyLm1lYXN1cmVOdW1iZXIgPSBudWxsO1xuXHRcdHJlbmRlcmVyLm5vdGVOdW1iZXIgPSBudWxsO1xuXHRcdGlmICghdGhpcy52b2ljZXNbaV0uZHVwbGljYXRlKSB7XG5cdFx0XHRiYXJ0b3AgPSByZW5kZXJlci5jYWxjWSgyKTsgLy8gVGhpcyBjb25uZWN0cyB0aGUgYmFyIGxpbmVzIGJldHdlZW4gdHdvIGRpZmZlcmVudCBzdGF2ZXMuXG4vL1x0XHRcdGlmIChzdGFmZi5ib3R0b20gPCAwKVxuLy9cdFx0XHRcdHJlbmRlcmVyLm1vdmVZKHNwYWNpbmcuU1RFUCwgLXN0YWZmLmJvdHRvbSk7XG5cdFx0fVxuXHRcdGlmKHRoaXMuYnJhY2UpIHsvL1Rvbnlcblx0XHRcdGlmIChpID09PSB0aGlzLmJyYWNlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0aWYgKHRoaXMuYnJhY2UpIHtcblx0XHRcdFx0XHR0aGlzLmJyYWNlLmRyYXcocmVuZGVyZXIsIHRvcExpbmUsIGJvdHRvbUxpbmUpOyAvL3Rvbnlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZW5kZXJlci5tZWFzdXJlTnVtYmVyID0gbnVsbDtcblx0cmVuZGVyZXIubm90ZU51bWJlciA9IG51bGw7XG5cblx0Ly8gY29ubmVjdCBhbGwgdGhlIHN0YXZlcyB0b2dldGhlciB3aXRoIGEgdmVydGljYWwgbGluZVxuXHRpZiAodGhpcy5zdGFmZnMubGVuZ3RoPjEpIHtcblx0XHRyZW5kZXJlci5wcmludFN0ZW0odGhpcy5zdGFydHgsIDAuNiwgdG9wTGluZSwgYm90dG9tTGluZSk7XG5cdH1cblx0cmVuZGVyZXIueSA9IHN0YXJ0WTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhZmZHcm91cEVsZW1lbnQ7XG4iLCIvLyAgICBhYmNfdGVtcG9fZWxlbWVudC5qczogRGVmaW5pdGlvbiBvZiB0aGUgVGVtcG9FbGVtZW50IGNsYXNzLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSBhbmQgUGF1bCBSb3NlblxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQWJzb2x1dGVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfYWJzb2x1dGVfZWxlbWVudCcpO1xudmFyIFJlbGF0aXZlRWxlbWVudCA9IHJlcXVpcmUoJy4vYWJjX3JlbGF0aXZlX2VsZW1lbnQnKTtcblxudmFyIFRlbXBvRWxlbWVudDtcbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciB0b3RhbEhlaWdodEluUGl0Y2hlcyA9IDU7XG5cblx0VGVtcG9FbGVtZW50ID0gZnVuY3Rpb24gVGVtcG9FbGVtZW50KHRlbXBvLCB0dW5lTnVtYmVyLCBjcmVhdGVOb3RlSGVhZCkge1xuXHRcdHRoaXMudGVtcG8gPSB0ZW1wbztcblx0XHR0aGlzLnR1bmVOdW1iZXIgPSB0dW5lTnVtYmVyO1xuXHRcdHRoaXMudGVtcG9IZWlnaHRBYm92ZSA9IHRvdGFsSGVpZ2h0SW5QaXRjaGVzO1xuXHRcdHRoaXMucGl0Y2ggPSB1bmRlZmluZWQ7IC8vIFRoaXMgd2lsbCBiZSBzZXQgbGF0ZXJcblx0XHRpZiAodGhpcy50ZW1wby5kdXJhdGlvbiAmJiAhdGhpcy50ZW1wby5zdXBwcmVzc0JwbSkge1xuXHRcdFx0dGhpcy5ub3RlID0gdGhpcy5jcmVhdGVOb3RlKGNyZWF0ZU5vdGVIZWFkLCB0ZW1wbywgdHVuZU51bWJlcik7XG5cdFx0fVxuXHR9O1xuXG5cdFRlbXBvRWxlbWVudC5wcm90b3R5cGUuc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzID0gZnVuY3Rpb24ocG9zaXRpb25ZKSB7IC8vIFRPRE8tUEVSOiBUaGlzIG1pZ2h0IG5vdCBiZSBjYWxsZWQuXG5cdFx0dGhpcy5waXRjaCA9IHBvc2l0aW9uWS50ZW1wb0hlaWdodEFib3ZlO1xuXHRcdHRoaXMudG9wID0gcG9zaXRpb25ZLnRlbXBvSGVpZ2h0QWJvdmU7XG5cdFx0dGhpcy5ib3R0b20gPSBwb3NpdGlvblkudGVtcG9IZWlnaHRBYm92ZTtcblx0XHRpZiAodGhpcy5ub3RlKSB7XG5cdFx0XHR2YXIgdGVtcG9QaXRjaCA9IHRoaXMucGl0Y2ggLSB0b3RhbEhlaWdodEluUGl0Y2hlcyArIDE7IC8vIFRoZSBwaXRjaCB3ZSByZWNlaXZlIGlzIHRoZSB0b3Agb2YgdGhlIGFsbG90dGVkIGFyZWE6IGNoYW5nZSB0aGF0IHRvIHByYWN0aWNhbGx5IHRoZSBib3R0b20uXG5cdFx0XHR0aGlzLm5vdGUudG9wID0gdGVtcG9QaXRjaDtcblx0XHRcdHRoaXMubm90ZS5ib3R0b20gPSB0ZW1wb1BpdGNoO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5vdGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGNoaWxkID0gdGhpcy5ub3RlLmNoaWxkcmVuW2ldO1xuXHRcdFx0XHRjaGlsZC50b3AgKz0gdGVtcG9QaXRjaDtcblx0XHRcdFx0Y2hpbGQuYm90dG9tICs9IHRlbXBvUGl0Y2g7XG5cdFx0XHRcdGNoaWxkLnBpdGNoICs9IHRlbXBvUGl0Y2g7XG5cdFx0XHRcdGlmIChjaGlsZC5waXRjaDIgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRjaGlsZC5waXRjaDIgKz0gdGVtcG9QaXRjaDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0VGVtcG9FbGVtZW50LnByb3RvdHlwZS5zZXRYID0gZnVuY3Rpb24gKHgpIHtcblx0XHR0aGlzLnggPSB4O1xuXHR9O1xuXG5cdFRlbXBvRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlTm90ZSA9IGZ1bmN0aW9uKGNyZWF0ZU5vdGVIZWFkLCB0ZW1wbywgdHVuZU51bWJlcikge1xuXHRcdHZhciB0ZW1wb3NjYWxlID0gMC43NTtcblx0XHR2YXIgZHVyYXRpb24gPSB0ZW1wby5kdXJhdGlvblswXTsgLy8gVE9ETyB3aGVuIG11bHRpcGxlIGR1cmF0aW9uc1xuXHRcdHZhciBhYnNFbGVtID0gbmV3IEFic29sdXRlRWxlbWVudCh0ZW1wbywgZHVyYXRpb24sIDEsICd0ZW1wbycsIHR1bmVOdW1iZXIpO1xuXHRcdC8vIFRoZXJlIGFyZW4ndCBhbiBpbmZpbml0ZSBudW1iZXIgb2Ygbm90ZSB2YWx1ZXMsIGJ1dCB3ZSBhcmUgcGFzc2VkIGEgZmxvYXQsIHNvIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgaXMgb2ZmIHVwc3RyZWFtLFxuXHRcdC8vIG1lcmdlIGFsbCBvZiB0aGUgaW4gYmV0d2VlbiBwb2ludHMuXG5cdFx0dmFyIGRvdDtcblx0XHR2YXIgZmxhZztcblx0XHR2YXIgbm90ZTtcblx0XHRpZiAoZHVyYXRpb24gPD0gMS8zMikgeyBub3RlID0gXCJub3RlaGVhZHMucXVhcnRlclwiOyBmbGFnID0gXCJmbGFncy51MzJuZFwiOyBkb3QgPSAwOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMS8xNikgeyBub3RlID0gXCJub3RlaGVhZHMucXVhcnRlclwiOyBmbGFnID0gXCJmbGFncy51MTZ0aFwiOyBkb3QgPSAwOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMy8zMikgeyBub3RlID0gXCJub3RlaGVhZHMucXVhcnRlclwiOyBmbGFnID0gXCJmbGFncy51MTZuZFwiOyBkb3QgPSAxOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMS84KSB7IG5vdGUgPSBcIm5vdGVoZWFkcy5xdWFydGVyXCI7IGZsYWcgPSBcImZsYWdzLnU4dGhcIjsgZG90ID0gMDsgfVxuXHRcdGVsc2UgaWYgKGR1cmF0aW9uIDw9IDMvMTYpIHsgbm90ZSA9IFwibm90ZWhlYWRzLnF1YXJ0ZXJcIjsgZmxhZyA9IFwiZmxhZ3MudTh0aFwiOyBkb3QgPSAxOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMS80KSB7IG5vdGUgPSBcIm5vdGVoZWFkcy5xdWFydGVyXCI7IGRvdCA9IDA7IH1cblx0XHRlbHNlIGlmIChkdXJhdGlvbiA8PSAzLzgpIHsgbm90ZSA9IFwibm90ZWhlYWRzLnF1YXJ0ZXJcIjsgZG90ID0gMTsgfVxuXHRcdGVsc2UgaWYgKGR1cmF0aW9uIDw9IDEvMikgeyBub3RlID0gXCJub3RlaGVhZHMuaGFsZlwiOyBkb3QgPSAwOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMy80KSB7IG5vdGUgPSBcIm5vdGVoZWFkcy5oYWxmXCI7IGRvdCA9IDE7IH1cblx0XHRlbHNlIGlmIChkdXJhdGlvbiA8PSAxKSB7IG5vdGUgPSBcIm5vdGVoZWFkcy53aG9sZVwiOyBkb3QgPSAwOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMS41KSB7IG5vdGUgPSBcIm5vdGVoZWFkcy53aG9sZVwiOyBkb3QgPSAxOyB9XG5cdFx0ZWxzZSBpZiAoZHVyYXRpb24gPD0gMikgeyBub3RlID0gXCJub3RlaGVhZHMuZGJsXCI7IGRvdCA9IDA7IH1cblx0XHRlbHNlIHsgbm90ZSA9IFwibm90ZWhlYWRzLmRibFwiOyBkb3QgPSAxOyB9XG5cblx0XHR2YXIgcmV0ID0gY3JlYXRlTm90ZUhlYWQoYWJzRWxlbSxcblx0XHRcdG5vdGUsXG5cdFx0XHR7IHZlcnRpY2FsUG9zOiAwfSwgLy8gVGhpcyBpcyBqdXN0IHRlbXBvcmFyeTogd2UnbGwgb2Zmc2V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbmluZyB3aGVuIHdlIGdldCB0aGUgYWN0dWFsIHZlcnRpY2FsIHNwb3QuXG5cdFx0XHRcInVwXCIsXG5cdFx0XHQwLFxuXHRcdFx0MCxcblx0XHRcdGZsYWcsXG5cdFx0XHRkb3QsXG5cdFx0XHQwLFxuXHRcdFx0dGVtcG9zY2FsZSxcblx0XHRcdFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdHZhciB0ZW1wb05vdGUgPSByZXQubm90ZWhlYWQ7XG5cdFx0YWJzRWxlbS5hZGRIZWFkKHRlbXBvTm90ZSk7XG5cdFx0dmFyIHN0ZW07XG5cdFx0aWYgKG5vdGUgIT09IFwibm90ZWhlYWRzLndob2xlXCIgJiYgbm90ZSAhPT0gXCJub3RlaGVhZHMuZGJsXCIpIHtcblx0XHRcdHZhciBwMSA9IDEgLyAzICogdGVtcG9zY2FsZTtcblx0XHRcdHZhciBwMiA9IDcgKiB0ZW1wb3NjYWxlO1xuXHRcdFx0dmFyIGR4ID0gdGVtcG9Ob3RlLmR4ICsgdGVtcG9Ob3RlLnc7XG5cdFx0XHR2YXIgd2lkdGggPSAtMC42O1xuXHRcdFx0c3RlbSA9IG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgZHgsIDAsIHAxLCB7XCJ0eXBlXCI6IFwic3RlbVwiLCBcInBpdGNoMlwiOiBwMiwgbGluZXdpZHRoOiB3aWR0aH0pO1xuXHRcdFx0YWJzRWxlbS5hZGRFeHRyYShzdGVtKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFic0VsZW07XG5cdH07XG5cblx0VGVtcG9FbGVtZW50LnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24ocmVuZGVyZXIpIHtcblx0XHR2YXIgeCA9IHRoaXMueDtcblx0XHRpZiAodGhpcy5waXRjaCA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0d2luZG93LmNvbnNvbGUuZXJyb3IoXCJUZW1wbyBFbGVtZW50IHktY29vcmRpbmF0ZSBub3Qgc2V0LlwiKTtcblxuXHRcdHZhciB5ID0gcmVuZGVyZXIuY2FsY1kodGhpcy5waXRjaCk7XG5cdFx0dmFyIHRleHQ7XG5cdFx0aWYgKHRoaXMudGVtcG8ucHJlU3RyaW5nKSB7XG5cdFx0XHR0ZXh0ID0gcmVuZGVyZXIucmVuZGVyVGV4dCh4LCB5LCB0aGlzLnRlbXBvLnByZVN0cmluZywgJ3RlbXBvZm9udCcsICd0ZW1wbycsIFwic3RhcnRcIik7XG5cdFx0XHR2YXIgc2l6ZSA9IHJlbmRlcmVyLmdldFRleHRTaXplKHRoaXMudGVtcG8ucHJlU3RyaW5nLCAndGVtcG9mb250JywgJ3RlbXBvJywgdGV4dCk7XG5cdFx0XHR2YXIgcHJlV2lkdGggPSBzaXplLndpZHRoO1xuXHRcdFx0dmFyIGNoYXJXaWR0aCA9IHByZVdpZHRoIC8gdGhpcy50ZW1wby5wcmVTdHJpbmcubGVuZ3RoOyAvLyBKdXN0IGdldCBzb21lIGF2ZXJhZ2UgbnVtYmVyIHRvIGluY3JlYXNlIHRoZSBzcGFjaW5nLlxuXHRcdFx0eCArPSBwcmVXaWR0aCArIGNoYXJXaWR0aDtcblx0XHR9XG5cdFx0aWYgKHRoaXMubm90ZSkge1xuXHRcdFx0aWYgKHRoaXMubm90ZSlcblx0XHRcdFx0dGhpcy5ub3RlLnNldFgoeCk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm90ZS5jaGlsZHJlbi5sZW5ndGg7IGkrKylcblx0XHRcdFx0dGhpcy5ub3RlLmNoaWxkcmVuW2ldLmRyYXcocmVuZGVyZXIsIHgpO1xuXHRcdFx0eCArPSAodGhpcy5ub3RlLncgKyA1KTtcblx0XHRcdHZhciBzdHIgPSBcIj0gXCIgKyB0aGlzLnRlbXBvLmJwbTtcblx0XHRcdHRleHQgPSByZW5kZXJlci5yZW5kZXJUZXh0KHgsIHksIHN0ciwgJ3RlbXBvZm9udCcsICd0ZW1wbycsIFwic3RhcnRcIik7XG5cdFx0XHRzaXplID0gcmVuZGVyZXIuZ2V0VGV4dFNpemUoc3RyLCAndGVtcG9mb250JywgJ3RlbXBvJywgdGV4dCk7XG5cdFx0XHR2YXIgcG9zdFdpZHRoID0gc2l6ZS53aWR0aDtcblx0XHRcdHZhciBjaGFyV2lkdGgyID0gcG9zdFdpZHRoIC8gc3RyLmxlbmd0aDsgLy8gSnVzdCBnZXQgc29tZSBhdmVyYWdlIG51bWJlciB0byBpbmNyZWFzZSB0aGUgc3BhY2luZy5cblx0XHRcdHggKz0gcG9zdFdpZHRoICsgY2hhcldpZHRoMjtcblx0XHR9XG5cdFx0aWYgKHRoaXMudGVtcG8ucG9zdFN0cmluZykge1xuXHRcdFx0cmVuZGVyZXIucmVuZGVyVGV4dCh4LCB5LCB0aGlzLnRlbXBvLnBvc3RTdHJpbmcsICd0ZW1wb2ZvbnQnLCAndGVtcG8nLCBcInN0YXJ0XCIpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGVtcG9FbGVtZW50O1xuIiwiLy8gICAgYWJjX3RyaXBsZXRfZWxlbWVudC5qczogRGVmaW5pdGlvbiBvZiB0aGUgVHJpcGxldEVsZW0gY2xhc3MuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBzcHJpbnRmID0gcmVxdWlyZSgnLi9zcHJpbnRmJyk7XG5cbnZhciBUcmlwbGV0RWxlbTtcblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRUcmlwbGV0RWxlbSA9IGZ1bmN0aW9uIFRyaXBsZXRFbGVtKG51bWJlciwgYW5jaG9yMSwgb3B0aW9ucykge1xuXHRcdHRoaXMuYW5jaG9yMSA9IGFuY2hvcjE7IC8vIG11c3QgaGF2ZSBhIC54IGFuZCBhIC5wYXJlbnQgcHJvcGVydHkgb3IgYmUgbnVsbCAobWVhbnMgc3RhcnRzIGF0IHRoZSBcImJlZ2lubmluZ1wiIG9mIHRoZSBsaW5lIC0gYWZ0ZXIga2V5IHNpZ25hdHVyZSlcblx0XHR0aGlzLm51bWJlciA9IG51bWJlcjtcblx0XHR0aGlzLmR1cmF0aW9uID0gKCcnK2FuY2hvcjEucGFyZW50LmR1cmF0aW9uQ2xhc3MpLnJlcGxhY2UoL1xcLi8sICctJyk7XG5cdFx0dGhpcy5taWRkbGVFbGVtcyA9IFtdOyAvLyBUaGlzIGlzIHRvIGNhbGN1bGF0ZSB0aGUgaGlnaGVzdCBpbnRlcmlvciBwaXRjaC4gSXQgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHJhd24gYnJhY2tldCBuZXZlciBjcm9zc2VzIGEgcmVhbGx5IGhpZ2ggbWlkZGxlIG5vdGUuXG5cdFx0dGhpcy5mbGF0QmVhbXMgPSBvcHRpb25zLmZsYXRCZWFtcztcblx0fTtcblxuXHRUcmlwbGV0RWxlbS5wcm90b3R5cGUuaXNDbG9zZWQgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5hbmNob3IyO1xuXHR9O1xuXG5cdFRyaXBsZXRFbGVtLnByb3RvdHlwZS5taWRkbGVOb3RlID0gZnVuY3Rpb24oZWxlbSkge1xuXHRcdHRoaXMubWlkZGxlRWxlbXMucHVzaChlbGVtKTtcblx0fTtcblxuXHRUcmlwbGV0RWxlbS5wcm90b3R5cGUuc2V0Q2xvc2VBbmNob3IgPSBmdW5jdGlvbihhbmNob3IyKSB7XG5cdFx0dGhpcy5hbmNob3IyID0gYW5jaG9yMjtcblx0XHQvLyBUT0RPLVBFUjogVW5mb3J0dW5hdGVseSwgSSBkb24ndCBrbm93IGlmIHRoZXJlIGlzIGEgYmVhbSBhYm92ZSB1bnRpbCBhZnRlciB0aGUgdmVydGljYWwgcG9zaXRpb25pbmcgaXMgZG9uZSxcblx0XHQvLyBzbyBJIGRvbid0IGtub3cgd2hldGhlciB0byBsZWF2ZSByb29tIGZvciB0aGUgbnVtYmVyIGFib3ZlLiBUaGVyZWZvcmUsIElmIHRoZXJlIGlzIGEgYmVhbSBvbiB0aGUgZmlyc3Qgbm90ZSwgSSdsbCBsZWF2ZSByb29tIGp1c3QgaW4gY2FzZS5cblx0XHRpZiAodGhpcy5hbmNob3IxLnBhcmVudC5iZWFtKVxuXHRcdFx0dGhpcy5lbmRpbmdIZWlnaHRBYm92ZSA9IDQ7XG5cdH07XG5cblx0VHJpcGxldEVsZW0ucHJvdG90eXBlLnNldFVwcGVyQW5kTG93ZXJFbGVtZW50cyA9IGZ1bmN0aW9uKC8qcG9zaXRpb25ZKi8pIHtcblx0fTtcblxuXHRUcmlwbGV0RWxlbS5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVE9ETyBlbmQgYW5kIGJlZ2lubmluZyBvZiBsaW5lIChQRVI6IFAuUy4gSSdtIG5vdCBzdXJlIHRoaXMgY2FuIGhhcHBlbjogSSB0aGluayB0aGUgcGFyc2VyIHdpbGwgYWx3YXlzIHNwZWNpZnkgYm90aCB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludHMuKVxuXHRcdGlmICh0aGlzLmFuY2hvcjEgJiYgdGhpcy5hbmNob3IyKSB7XG5cdFx0XHR0aGlzLmhhc0JlYW0gPSB0aGlzLmFuY2hvcjEucGFyZW50LmJlYW0gJiYgdGhpcy5hbmNob3IxLnBhcmVudC5iZWFtID09PSB0aGlzLmFuY2hvcjIucGFyZW50LmJlYW07XG5cblx0XHRcdGlmICh0aGlzLmhhc0JlYW0pIHtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBiZWFtIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkcmF3IGFueXRoaW5nIGV4Y2VwdCB0aGUgdGV4dC4gVGhlIGJlYW0gY291bGQgZWl0aGVyIGJlIGFib3ZlIG9yIGJlbG93LlxuXHRcdFx0XHR2YXIgYmVhbSA9IHRoaXMuYW5jaG9yMS5wYXJlbnQuYmVhbTtcblx0XHRcdFx0dmFyIGxlZnQgPSBiZWFtLmlzQWJvdmUoKSA/IHRoaXMuYW5jaG9yMS54ICsgdGhpcy5hbmNob3IxLncgOiB0aGlzLmFuY2hvcjEueDtcblx0XHRcdFx0dGhpcy55VGV4dFBvcyA9IGJlYW0uaGVpZ2h0QXRNaWRwb2ludChsZWZ0LCAgdGhpcy5hbmNob3IyLngpO1xuXHRcdFx0XHR0aGlzLnlUZXh0UG9zICs9IGJlYW0uaXNBYm92ZSgpID8gMyA6IC0yOyAvLyBUaGlzIGNyZWF0ZXMgc29tZSBzcGFjZSBiZXR3ZWVuIHRoZSBiZWFtIGFuZCB0aGUgbnVtYmVyLlxuXHRcdFx0XHR0aGlzLnRvcCA9IHRoaXMueVRleHRQb3MgKyAxO1xuXHRcdFx0XHR0aGlzLmJvdHRvbSA9IHRoaXMueVRleHRQb3MgLSAyO1xuXHRcdFx0XHRpZiAoYmVhbS5pc0Fib3ZlKCkpXG5cdFx0XHRcdFx0dGhpcy5lbmRpbmdIZWlnaHRBYm92ZSA9IDQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpc24ndCBhIGJlYW0sIHRoZW4gd2UgbmVlZCB0byBkcmF3IHRoZSBicmFja2V0IGFuZCB0aGUgdGV4dC4gVGhlIGJyYWNrZXQgaXMgYWx3YXlzIGFib3ZlLlxuXHRcdFx0XHQvLyBUaGUgYnJhY2tldCBpcyBuZXZlciBsb3dlciB0aGFuIHRoZSAnYScgbGluZSwgYnV0IGlzIDQgcGl0Y2hlcyBhYm92ZSB0aGUgZmlyc3QgYW5kIGxhc3Qgbm90ZXMuIElmIHRoZXJlIGlzXG5cdFx0XHRcdC8vIGEgdGFsbCBub3RlIGluIHRoZSBtaWRkbGUsIHRoZSBicmFja2V0IGlzIGhvcml6b250YWwgYW5kIGFib3ZlIHRoZSBoaWdoZXN0IG5vdGUuXG5cdFx0XHRcdHRoaXMuc3RhcnROb3RlID0gTWF0aC5tYXgodGhpcy5hbmNob3IxLnBhcmVudC50b3AsIDkpICsgNDtcblx0XHRcdFx0dGhpcy5lbmROb3RlID0gTWF0aC5tYXgodGhpcy5hbmNob3IyLnBhcmVudC50b3AsIDkpICsgNDtcblx0XHRcdFx0Ly8gSWYgaXQgc3RhcnRzIG9yIGVuZHMgb24gYSByZXN0LCBtYWtlIHRoZSBiZWFtIGhvcml6b250YWxcblx0XHRcdFx0aWYgKHRoaXMuYW5jaG9yMS5wYXJlbnQudHlwZSA9PT0gXCJyZXN0XCIgJiYgdGhpcy5hbmNob3IyLnBhcmVudC50eXBlICE9PSBcInJlc3RcIilcblx0XHRcdFx0XHR0aGlzLnN0YXJ0Tm90ZSA9IHRoaXMuZW5kTm90ZTtcblx0XHRcdFx0ZWxzZSBpZiAodGhpcy5hbmNob3IyLnBhcmVudC50eXBlID09PSBcInJlc3RcIiAmJiB0aGlzLmFuY2hvcjEucGFyZW50LnR5cGUgIT09IFwicmVzdFwiKVxuXHRcdFx0XHRcdHRoaXMuZW5kTm90ZSA9IHRoaXMuc3RhcnROb3RlO1xuXHRcdFx0XHQvLyBTZWUgaWYgdGhlIG1pZGRsZSBub3RlIGlzIHJlYWxseSBoaWdoLlxuXHRcdFx0XHR2YXIgbWF4ID0gMDtcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1pZGRsZUVsZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bWF4ID0gTWF0aC5tYXgobWF4LCB0aGlzLm1pZGRsZUVsZW1zW2ldLnRvcCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWF4ICs9IDQ7XG5cdFx0XHRcdGlmIChtYXggPiB0aGlzLnN0YXJ0Tm90ZSB8fCBtYXggPiB0aGlzLmVuZE5vdGUpIHtcblx0XHRcdFx0XHR0aGlzLnN0YXJ0Tm90ZSA9IG1heDtcblx0XHRcdFx0XHR0aGlzLmVuZE5vdGUgPSBtYXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZmxhdEJlYW1zKSB7XG5cdFx0XHRcdFx0dGhpcy5zdGFydE5vdGUgPSBNYXRoLm1heCh0aGlzLnN0YXJ0Tm90ZSwgdGhpcy5lbmROb3RlKTtcblx0XHRcdFx0XHR0aGlzLmVuZE5vdGUgPSBNYXRoLm1heCh0aGlzLnN0YXJ0Tm90ZSwgdGhpcy5lbmROb3RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMueVRleHRQb3MgPSB0aGlzLnN0YXJ0Tm90ZSArICh0aGlzLmVuZE5vdGUgLSB0aGlzLnN0YXJ0Tm90ZSkgLyAyO1xuXHRcdFx0XHR0aGlzLnRvcCA9IHRoaXMueVRleHRQb3MgKyAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5taWRkbGVFbGVtcztcblx0XHRkZWxldGUgdGhpcy5mbGF0QmVhbXM7XG5cdH07XG5cblx0VHJpcGxldEVsZW0ucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihyZW5kZXJlcikge1xuXHRcdHZhciB4VGV4dFBvcztcblx0XHRpZiAodGhpcy5oYXNCZWFtKSB7XG5cdFx0XHR2YXIgbGVmdCA9IHRoaXMuYW5jaG9yMS5wYXJlbnQuYmVhbS5pc0Fib3ZlKCkgPyB0aGlzLmFuY2hvcjEueCArIHRoaXMuYW5jaG9yMS53IDogdGhpcy5hbmNob3IxLng7XG5cdFx0XHR4VGV4dFBvcyA9IHRoaXMuYW5jaG9yMS5wYXJlbnQuYmVhbS54QXRNaWRwb2ludChsZWZ0LCB0aGlzLmFuY2hvcjIueCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHhUZXh0UG9zID0gdGhpcy5hbmNob3IxLnggKyAodGhpcy5hbmNob3IyLnggKyB0aGlzLmFuY2hvcjIudyAtIHRoaXMuYW5jaG9yMS54KSAvIDI7XG5cdFx0XHRkcmF3QnJhY2tldChyZW5kZXJlciwgdGhpcy5hbmNob3IxLngsIHRoaXMuc3RhcnROb3RlLCB0aGlzLmFuY2hvcjIueCArIHRoaXMuYW5jaG9yMi53LCB0aGlzLmVuZE5vdGUsIHRoaXMuZHVyYXRpb24pO1xuXHRcdH1cblx0XHRyZW5kZXJlci5yZW5kZXJUZXh0KHhUZXh0UG9zLCByZW5kZXJlci5jYWxjWSh0aGlzLnlUZXh0UG9zKSwgXCJcIiArIHRoaXMubnVtYmVyLCAndHJpcGxldGZvbnQnLCByZW5kZXJlci5hZGRDbGFzc2VzKCd0cmlwbGV0IGQnK3RoaXMuZHVyYXRpb24pLCBcIm1pZGRsZVwiLCB0cnVlKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkcmF3TGluZShyZW5kZXJlciwgbCwgdCwgciwgYiwgZHVyYXRpb24pIHtcblx0XHR2YXIgcGF0aFN0cmluZyA9IHNwcmludGYoXCJNICVmICVmIEwgJWYgJWZcIixcblx0XHRcdGwsIHQsIHIsIGIpO1xuXHRcdHJlbmRlcmVyLnByaW50UGF0aCh7cGF0aDogcGF0aFN0cmluZywgc3Ryb2tlOiBcIiMwMDAwMDBcIiwgJ2NsYXNzJzogcmVuZGVyZXIuYWRkQ2xhc3NlcygndHJpcGxldCBkJytkdXJhdGlvbil9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRyYXdCcmFja2V0KHJlbmRlcmVyLCB4MSwgeTEsIHgyLCB5MiwgZHVyYXRpb24pIHtcblx0XHR5MSA9IHJlbmRlcmVyLmNhbGNZKHkxKTtcblx0XHR5MiA9IHJlbmRlcmVyLmNhbGNZKHkyKTtcblx0XHR2YXIgYnJhY2tldEhlaWdodCA9IDU7XG5cblx0XHQvLyBEcmF3IHZlcnRpY2FsIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZFxuXHRcdGRyYXdMaW5lKHJlbmRlcmVyLCB4MSwgeTEsIHgxLCB5MSArIGJyYWNrZXRIZWlnaHQsIGR1cmF0aW9uKTtcblx0XHRkcmF3TGluZShyZW5kZXJlciwgeDIsIHkyLCB4MiwgeTIgKyBicmFja2V0SGVpZ2h0LCBkdXJhdGlvbik7XG5cblx0XHQvLyBmaWd1cmUgb3V0IG1pZHBvaW50cyB0byBkcmF3IHRoZSBicm9rZW4gbGluZS5cblx0XHR2YXIgbWlkWCA9IHgxICsgKHgyLXgxKS8yO1xuXHRcdC8vdmFyIG1pZFkgPSB5MSArICh5Mi15MSkvMjtcblx0XHR2YXIgZ2FwV2lkdGggPSA4O1xuXHRcdHZhciBzbG9wZSA9ICh5MiAtIHkxKSAvICh4MiAtIHgxKTtcblx0XHR2YXIgbGVmdEVuZFggPSBtaWRYIC0gZ2FwV2lkdGg7XG5cdFx0dmFyIGxlZnRFbmRZID0geTEgKyAobGVmdEVuZFggLSB4MSkgKiBzbG9wZTtcblx0XHRkcmF3TGluZShyZW5kZXJlciwgeDEsIHkxLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGR1cmF0aW9uKTtcblx0XHR2YXIgcmlnaHRTdGFydFggPSBtaWRYICsgZ2FwV2lkdGg7XG5cdFx0dmFyIHJpZ2h0U3RhcnRZID0geTEgKyAocmlnaHRTdGFydFggLSB4MSkgKiBzbG9wZTtcblx0XHRkcmF3TGluZShyZW5kZXJlciwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCB4MiwgeTIsIGR1cmF0aW9uKTtcblx0fVxufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmlwbGV0RWxlbTtcbiIsIi8vICAgIGFiY192b2ljZV9lbGVtZW50LmpzOiBEZWZpbml0aW9uIG9mIHRoZSBWb2ljZUVsZW1lbnQgY2xhc3MuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBwYXJzZUNvbW1vbiA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19jb21tb24nKTtcblxudmFyIFZvaWNlRWxlbWVudCA9IGZ1bmN0aW9uIFZvaWNlRWxlbWVudCh2b2ljZW51bWJlciwgdm9pY2V0b3RhbCkge1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cdHRoaXMuYmVhbXMgPSBbXTtcblx0dGhpcy5vdGhlcmNoaWxkcmVuID0gW107IC8vIHRpZXMsIHNsdXJzLCB0cmlwbGV0c1xuXHR0aGlzLncgPSAwO1xuXHR0aGlzLmR1cGxpY2F0ZSA9IGZhbHNlO1xuXHR0aGlzLnZvaWNlbnVtYmVyID0gdm9pY2VudW1iZXI7IC8vbnVtYmVyIG9mIHRoZSB2b2ljZSBvbiBhIGdpdmVuIHN0YXZlIChub3Qgc3RhZmZncm91cClcblx0dGhpcy52b2ljZXRvdGFsID0gdm9pY2V0b3RhbDtcblx0dGhpcy5ib3R0b20gPSA3O1xuXHR0aGlzLnRvcCA9IDc7XG5cdHRoaXMuc3BlY2lhbFkgPSB7XG5cdFx0dGVtcG9IZWlnaHRBYm92ZTogMCxcblx0XHRwYXJ0SGVpZ2h0QWJvdmU6IDAsXG5cdFx0dm9sdW1lSGVpZ2h0QWJvdmU6IDAsXG5cdFx0ZHluYW1pY0hlaWdodEFib3ZlOiAwLFxuXHRcdGVuZGluZ0hlaWdodEFib3ZlOiAwLFxuXHRcdGNob3JkSGVpZ2h0QWJvdmU6IDAsXG5cdFx0bHlyaWNIZWlnaHRBYm92ZTogMCxcblxuXHRcdGx5cmljSGVpZ2h0QmVsb3c6IDAsXG5cdFx0Y2hvcmRIZWlnaHRCZWxvdzogMCxcblx0XHR2b2x1bWVIZWlnaHRCZWxvdzogMCxcblx0XHRkeW5hbWljSGVpZ2h0QmVsb3c6IDBcblx0fTtcbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcblx0aWYgKGNoaWxkLnR5cGUgPT09ICdiYXInKSB7XG5cdFx0dmFyIGZpcnN0SXRlbSA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGZpcnN0SXRlbSAmJiBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMuY2hpbGRyZW5baV0udHlwZSAhPT0gXCJzdGFmZi1leHRyYVwiICYmIHRoaXMuY2hpbGRyZW5baV0udHlwZSAhPT0gXCJ0ZW1wb1wiKVxuXHRcdFx0XHRmaXJzdEl0ZW0gPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFmaXJzdEl0ZW0pIHtcblx0XHRcdHRoaXMuYmVhbXMucHVzaChcImJhclwiKTtcblx0XHRcdHRoaXMub3RoZXJjaGlsZHJlbi5wdXNoKFwiYmFyXCIpO1xuXHRcdH1cblx0fVxuXHR0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IGNoaWxkO1xuXHR0aGlzLnNldFJhbmdlKGNoaWxkKTtcbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUuc2V0TGltaXQgPSBmdW5jdGlvbihtZW1iZXIsIGNoaWxkKSB7XG5cdC8vIFNvbWV0aW1lcyB3ZSBnZXQgYW4gYWJzb2x1dGUgZWxlbWVudCBpbiBoZXJlIGFuZCBzb21ldGltZXMgd2UgZ2V0IHNvbWUgdHlwZSBvZiByZWxhdGl2ZSBlbGVtZW50LlxuXHQvLyBJZiB0aGVyZSBpcyBhIFwic3BlY2lhbFlcIiBlbGVtZW50LCB0aGVuIGFzc3VtZSBpdCBpcyBhbiBhYnNvbHV0ZSBlbGVtZW50LiBJZiB0aGF0IGRvZXNuJ3QgZXhpc3QsIGxvb2sgZm9yIHRoZVxuXHQvLyBzYW1lIG1lbWJlcnMgYXQgdGhlIHRvcCBsZXZlbCwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhleSBhcmUgaW4gcmVsYXRpdmUgZWxlbWVudHMuXG5cdHZhciBzcGVjaWFsWSA9IGNoaWxkLnNwZWNpYWxZO1xuXHRpZiAoIXNwZWNpYWxZKSBzcGVjaWFsWSA9IGNoaWxkO1xuXHRpZiAoIXNwZWNpYWxZW21lbWJlcl0pIHJldHVybjtcblx0aWYgKCF0aGlzLnNwZWNpYWxZW21lbWJlcl0pXG5cdFx0dGhpcy5zcGVjaWFsWVttZW1iZXJdID0gc3BlY2lhbFlbbWVtYmVyXTtcblx0ZWxzZVxuXHRcdHRoaXMuc3BlY2lhbFlbbWVtYmVyXSA9IE1hdGgubWF4KHRoaXMuc3BlY2lhbFlbbWVtYmVyXSwgc3BlY2lhbFlbbWVtYmVyXSk7XG59O1xuXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLm1vdmVEZWNvcmF0aW9ucyA9IGZ1bmN0aW9uKGJlYW0pIHtcblx0dmFyIHBhZGRpbmcgPSAxLjU7IC8vIFRoaXMgaXMgdGhlIHZlcnRpY2FsIHBhZGRpbmcgYmV0d2VlbiBlbGVtZW50cywgaW4gcGl0Y2hlcy5cblx0Zm9yICh2YXIgY2ggPSAwOyBjaCA8IGJlYW0uZWxlbXMubGVuZ3RoOyBjaCsrKSB7XG5cdFx0dmFyIGNoaWxkID0gYmVhbS5lbGVtc1tjaF07XG5cdFx0aWYgKGNoaWxkLnRvcCkge1xuXHRcdFx0Ly8gV2Ugbm93IGtub3cgd2hlcmUgdGhlIG9ybmFtZW50cyBzaG91bGQgaGF2ZSBiZWVuIHBsYWNlZCwgc28gbW92ZSB0aGVtIGlmIHRoZXkgd291bGQgb3ZlcmxhcC5cblx0XHRcdHZhciB0b3AgPSBiZWFtLnlBdE5vdGUoY2hpbGQpO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgZWwgPSBjaGlsZC5jaGlsZHJlbltpXTtcblx0XHRcdFx0aWYgKGVsLmtsYXNzID09PSAnb3JuYW1lbnQnKSB7XG5cdFx0XHRcdFx0aWYgKGVsLmJvdHRvbSAtIHBhZGRpbmcgPCB0b3ApIHtcblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHRvcCAtIGVsLmJvdHRvbSArIHBhZGRpbmc7IC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRoYXQgaXQgbmVlZHMgdG8gbW92ZSBhbmQgYWRkIGEgbGl0dGxlIG1hcmdpbiBzbyB0aGUgZWxlbWVudCBkb2Vzbid0IHRvdWNoIHRoZSBiZWFtLlxuXHRcdFx0XHRcdFx0ZWwuYm90dG9tICs9IGRpc3RhbmNlO1xuXHRcdFx0XHRcdFx0ZWwudG9wICs9IGRpc3RhbmNlO1xuXHRcdFx0XHRcdFx0ZWwucGl0Y2ggKz0gZGlzdGFuY2U7XG5cdFx0XHRcdFx0XHR0b3AgPSBjaGlsZC50b3AgPSBlbC50b3A7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLmFkanVzdFJhbmdlID0gZnVuY3Rpb24oY2hpbGQpIHtcblx0aWYgKGNoaWxkLmJvdHRvbSAhPT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMuYm90dG9tID0gTWF0aC5taW4odGhpcy5ib3R0b20sIGNoaWxkLmJvdHRvbSk7XG5cdGlmIChjaGlsZC50b3AgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLnRvcCA9IE1hdGgubWF4KHRoaXMudG9wLCBjaGlsZC50b3ApO1xufTtcblxuVm9pY2VFbGVtZW50LnByb3RvdHlwZS5zZXRSYW5nZSA9IGZ1bmN0aW9uKGNoaWxkKSB7XG5cdHRoaXMuYWRqdXN0UmFuZ2UoY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCd0ZW1wb0hlaWdodEFib3ZlJywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdwYXJ0SGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ3ZvbHVtZUhlaWdodEFib3ZlJywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdkeW5hbWljSGVpZ2h0QWJvdmUnLCBjaGlsZCk7XG5cdHRoaXMuc2V0TGltaXQoJ2VuZGluZ0hlaWdodEFib3ZlJywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdjaG9yZEhlaWdodEFib3ZlJywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdseXJpY0hlaWdodEFib3ZlJywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdseXJpY0hlaWdodEJlbG93JywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCdjaG9yZEhlaWdodEJlbG93JywgY2hpbGQpO1xuXHR0aGlzLnNldExpbWl0KCd2b2x1bWVIZWlnaHRCZWxvdycsIGNoaWxkKTtcblx0dGhpcy5zZXRMaW1pdCgnZHluYW1pY0hlaWdodEJlbG93JywgY2hpbGQpO1xufTtcblxuVm9pY2VFbGVtZW50LnByb3RvdHlwZS5zZXRVcHBlckFuZExvd2VyRWxlbWVudHMgPSBmdW5jdGlvbihwb3NpdGlvblkpIHtcblx0dmFyIGk7XG5cdGZvciAoaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGFic2VsZW0gPSB0aGlzLmNoaWxkcmVuW2ldO1xuXHRcdGFic2VsZW0uc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzKHBvc2l0aW9uWSk7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IHRoaXMub3RoZXJjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBhYnNlbGVtID0gdGhpcy5vdGhlcmNoaWxkcmVuW2ldO1xuXHRcdGlmICh0eXBlb2YgYWJzZWxlbSAhPT0gJ3N0cmluZycpXG5cdFx0XHRhYnNlbGVtLnNldFVwcGVyQW5kTG93ZXJFbGVtZW50cyhwb3NpdGlvblkpO1xuXHR9XG59O1xuXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLmFkZE90aGVyID0gZnVuY3Rpb24gKGNoaWxkKSB7XG5cdHRoaXMub3RoZXJjaGlsZHJlbi5wdXNoKGNoaWxkKTtcblx0dGhpcy5zZXRSYW5nZShjaGlsZCk7XG59O1xuXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLmFkZEJlYW0gPSBmdW5jdGlvbiAoY2hpbGQpIHtcblx0dGhpcy5iZWFtcy5wdXNoKGNoaWxkKTtcbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUudXBkYXRlSW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCF0aGlzLmxheW91dEVuZGVkKCkpIHtcblx0XHR0aGlzLmR1cmF0aW9uaW5kZXggKz0gdGhpcy5jaGlsZHJlblt0aGlzLmldLmR1cmF0aW9uO1xuXHRcdGlmICh0aGlzLmNoaWxkcmVuW3RoaXMuaV0udHlwZSA9PT0gJ2JhcicpIHRoaXMuZHVyYXRpb25pbmRleCA9IE1hdGgucm91bmQodGhpcy5kdXJhdGlvbmluZGV4KjY0KS82NDsgLy8gZXZlcnl0aW1lIHdlIG1lZXQgYSBiYXJsaW5lLCBkbyByb3VuZGluZyB0byBuZWFyZXN0IDY0dGhcblx0XHR0aGlzLmkrKztcblx0fVxufTtcblxuVm9pY2VFbGVtZW50LnByb3RvdHlwZS5sYXlvdXRFbmRlZCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh0aGlzLmk+PXRoaXMuY2hpbGRyZW4ubGVuZ3RoKTtcbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUuZ2V0RHVyYXRpb25JbmRleCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuZHVyYXRpb25pbmRleCAtICh0aGlzLmNoaWxkcmVuW3RoaXMuaV0gJiYgKHRoaXMuY2hpbGRyZW5bdGhpcy5pXS5kdXJhdGlvbj4wKT8wOjAuMDAwMDAwNSk7IC8vIGlmIHRoZSBpdGggZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBkdXJhdGlvbiAoaXMgbm90IGEgbm90ZSksIGl0cyBkdXJhdGlvbiBpbmRleCBpcyBmcmFjdGlvbmFsbHkgYmVmb3JlLiBUaGlzIGVuYWJsZXMgQ0xFRiBLRVlTSUcgVElNRVNJRyBQQVJULCBldGMuIHRvIGJlIGxhaWQgb3V0IGJlZm9yZSB3ZSBnZXQgdG8gdGhlIGZpcnN0IG5vdGUgb2Ygb3RoZXIgdm9pY2VzXG59O1xuXG4vLyBudW1iZXIgb2Ygc3BhY2luZyB1bml0cyBleHBlY3RlZCBmb3IgbmV4dCBwb3NpdGlvbmluZ1xuVm9pY2VFbGVtZW50LnByb3RvdHlwZS5nZXRTcGFjaW5nVW5pdHMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBNYXRoLnNxcnQodGhpcy5zcGFjaW5nZHVyYXRpb24qOCk7XG5cdC8vIFRPRE8tUEVSOiBPbiBzaG9ydCBsaW5lcywgdGhpcyB3b3VsZCBuZXZlciB0cmlnZ2VyLCBzbyB0aGUgc3BhY2luZyB3YXMgd3JvbmcuIEkganVzdCBjaGFuZ2VkIHRoaXMgbGluZSBlbXBpcmljYWxseSwgdGhvdWdoLCBzbyBJIGRvbid0IGtub3cgaWYgdGhlcmUgYXJlIG90aGVyIHJhbWlmaWNhdGlvbnMuXG5cdC8vcmV0dXJuICh0aGlzLm1pbng8dGhpcy5uZXh0eCkgPyBNYXRoLnNxcnQodGhpcy5zcGFjaW5nZHVyYXRpb24qOCkgOiAwOyAvLyB3ZSBoYXZlbid0IHVzZWQgYW55IHNwYWNpbmcgdW5pdHMgaWYgd2UgZW5kIHVwIHVzaW5nIG1pbnhcbn07XG5cbi8vXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLmdldE5leHRYID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gTWF0aC5tYXgodGhpcy5taW54LCB0aGlzLm5leHR4KTtcbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUuYmVnaW5MYXlvdXQgPSBmdW5jdGlvbiAoc3RhcnR4KSB7XG5cdHRoaXMuaT0wO1xuXHR0aGlzLmR1cmF0aW9uaW5kZXg9MDtcblx0Ly90aGlzLmlpPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuXHR0aGlzLnN0YXJ0eD1zdGFydHg7XG5cdHRoaXMubWlueD1zdGFydHg7IC8vIGZ1cnRoZXN0IGxlZnQgdG8gd2hlcmUgbmVnYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHRvIGdvXG5cdHRoaXMubmV4dHg9c3RhcnR4OyAvLyB4IHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyB2b2ljZSBzaG91bGQgYmUgcGxhY2VkIGFzc3VtaW5nIG5vIG90aGVyIHZvaWNlcyBhbmQgbm8gZml4ZWQgd2lkdGggY29uc3RyYWludHNcblx0dGhpcy5zcGFjaW5nZHVyYXRpb249MDsgLy8gZHVyYXRpb24gbGVmdCB0byBiZSBsYWlkIG91dCBpbiBjdXJyZW50IGl0ZXJhdGlvbiAob21pdHRpbmcgYWRkaXRpb25hbCBzcGFjaW5nIGR1ZSB0byBvdGhlciBhc3BlY3RzLCBzdWNoIGFzIGJhcnMsIGRvdHMsIHNoYXJwcyBhbmQgZmxhdHMpXG59O1xuXG4vLyBUcnkgdG8gbGF5b3V0IHRoZSBlbGVtZW50IGF0IGluZGV4IHRoaXMuaVxuLy8geCAtIHBvc2l0aW9uIHRvIHRyeSB0byBsYXlvdXQgdGhlIGVsZW1lbnQgYXRcbi8vIHNwYWNpbmcgLSBiYXNlIHNwYWNpbmdcbi8vIGNhbid0IGNhbGwgdGhpcyBmdW5jdGlvbiBtb3JlIHRoYW4gb25jZSBwZXIgaXRlcmF0aW9uXG5Wb2ljZUVsZW1lbnQucHJvdG90eXBlLmxheW91dE9uZUl0ZW0gPSBmdW5jdGlvbiAoeCwgc3BhY2luZykge1xuXHR2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuaV07XG5cdGlmICghY2hpbGQpIHJldHVybiAwO1xuXHR2YXIgZXIgPSB4IC0gdGhpcy5taW54OyAvLyBhdmFpbGFibGUgZXh0cmF3aWR0aCB0byB0aGUgbGVmdFxuXHR2YXIgZXh0cmFXaWR0aCA9IGNoaWxkLmdldEV4dHJhV2lkdGgoKTtcblx0aWYgKGVyPGV4dHJhV2lkdGgpIHsgLy8gc2hpZnQgcmlnaHQgYnkgbmVlZGVkIGFtb3VudFxuXHRcdC8vIFRoZXJlJ3MgYW4gZXhjZXB0aW9uIGlmIGEgYmFyIGVsZW1lbnQgaXMgYWZ0ZXIgYSBQYXJ0IGVsZW1lbnQsIHRoZXJlIGlzIG5vIHNoaWZ0LlxuXHRcdGlmICh0aGlzLmkgPT09IDAgfHwgY2hpbGQudHlwZSAhPT0gJ2JhcicgfHwgKHRoaXMuY2hpbGRyZW5bdGhpcy5pLTFdLnR5cGUgIT09ICdwYXJ0JyAmJiB0aGlzLmNoaWxkcmVuW3RoaXMuaS0xXS50eXBlICE9PSAndGVtcG8nKSApXG5cdFx0XHR4Kz1leHRyYVdpZHRoLWVyO1xuXHR9XG5cdGNoaWxkLnNldFgoeCk7XG5cblx0dGhpcy5zcGFjaW5nZHVyYXRpb24gPSBjaGlsZC5kdXJhdGlvbjtcblx0Ly91cGRhdGUgbWlueFxuXHR0aGlzLm1pbnggPSB4K2NoaWxkLmdldE1pbldpZHRoKCk7IC8vIGFkZCBuZWNlc3NhcnkgbGF5b3V0IHNwYWNlXG5cdGlmICh0aGlzLmkhPT10aGlzLmNoaWxkcmVuLmxlbmd0aC0xKSB0aGlzLm1pbngrPWNoaWxkLm1pbnNwYWNpbmc7IC8vIGFkZCBtaW5pbXVtc3BhY2luZyBleGNlcHQgb24gbGFzdCBlbGVtXG5cblx0dGhpcy51cGRhdGVOZXh0WCh4LCBzcGFjaW5nKTtcblxuXHQvLyBjb250cmlidXRlIHRvIHN0YWZmIHkgcG9zaXRpb25cblx0Ly90aGlzLnN0YWZmLnRvcCA9IE1hdGgubWF4KGNoaWxkLnRvcCx0aGlzLnN0YWZmLnRvcCk7XG5cdC8vdGhpcy5zdGFmZi5ib3R0b20gPSBNYXRoLm1pbihjaGlsZC5ib3R0b20sdGhpcy5zdGFmZi5ib3R0b20pO1xuXG5cdHJldHVybiB4OyAvLyB3aGVyZSB3ZSBlbmQgdXAgaGF2aW5nIHBsYWNlZCB0aGUgY2hpbGRcbn07XG5cbi8vIGNhbGwgd2hlbiBzcGFjaW5nZHVyYXRpb24gaGFzIGJlZW4gdXBkYXRlZFxuVm9pY2VFbGVtZW50LnByb3RvdHlwZS51cGRhdGVOZXh0WCA9IGZ1bmN0aW9uICh4LCBzcGFjaW5nKSB7XG5cdHRoaXMubmV4dHg9IHggKyAoc3BhY2luZypNYXRoLnNxcnQodGhpcy5zcGFjaW5nZHVyYXRpb24qOCkpO1xufTtcblxuVm9pY2VFbGVtZW50LnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gKGR4KSB7XG5cdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5pXTtcblx0aWYgKCFjaGlsZCkgcmV0dXJuO1xuXHRjaGlsZC5zZXRYKGNoaWxkLngrZHgpO1xuXHR0aGlzLm1pbngrPWR4O1xuXHR0aGlzLm5leHR4Kz1keDtcbn07XG5cbmZ1bmN0aW9uIGlzTm9uU3BhY2VyUmVzdChlbGVtKSB7XG5cdGlmIChlbGVtLnR5cGUgIT09ICdyZXN0Jylcblx0XHRyZXR1cm4gZmFsc2U7XG5cdGlmIChlbGVtLmFiY2VsZW0gJiYgZWxlbS5hYmNlbGVtLnJlc3QgJiYgZWxlbS5hYmNlbGVtLnJlc3QudHlwZSAhPT0gJ3NwYWNlcicpXG5cdFx0cmV0dXJuIHRydWU7XG5cdHJldHVybiBmYWxzZTtcbn1cblZvaWNlRWxlbWVudC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChyZW5kZXJlciwgYmFydG9wKSB7XG5cdHZhciB3aWR0aCA9IHRoaXMudy0xO1xuXHRyZW5kZXJlci5zdGFmZmJvdHRvbSA9IHRoaXMuc3RhZmYuYm90dG9tO1xuXHQvL3RoaXMuYmFyYm90dG9tID0gcmVuZGVyZXIuY2FsY1koMik7XG5cblx0cmVuZGVyZXIubWVhc3VyZU51bWJlciA9IG51bGw7XG5cdHJlbmRlcmVyLm5vdGVOdW1iZXIgPSBudWxsO1xuXHRpZiAodGhpcy5oZWFkZXIpIHsgLy8gcHJpbnQgdm9pY2UgbmFtZVxuXHRcdHZhciB0ZXh0cGl0Y2ggPSAxNCAtICh0aGlzLnZvaWNlbnVtYmVyKzEpKigxMi8odGhpcy52b2ljZXRvdGFsKzEpKTtcblx0XHRyZW5kZXJlci5yZW5kZXJUZXh0KHJlbmRlcmVyLnBhZGRpbmcubGVmdCwgcmVuZGVyZXIuY2FsY1kodGV4dHBpdGNoKSwgdGhpcy5oZWFkZXIsICd2b2ljZWZvbnQnLCAnc3RhZmYtZXh0cmEgdm9pY2UtbmFtZScsICdzdGFydCcpO1xuXHR9XG5cblx0Zm9yICh2YXIgaT0wLCBpaT10aGlzLmNoaWxkcmVuLmxlbmd0aDsgaTxpaTsgaSsrKSB7XG5cdFx0dmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcblx0XHR2YXIganVzdEluaXRpYWxpemVkTWVhc3VyZU51bWJlciA9IGZhbHNlO1xuXHRcdGlmIChjaGlsZC50eXBlICE9PSAnc3RhZmYtZXh0cmEnICYmIHJlbmRlcmVyLm1lYXN1cmVOdW1iZXIgPT09IG51bGwpIHtcblx0XHRcdHJlbmRlcmVyLm1lYXN1cmVOdW1iZXIgPSAwO1xuXHRcdFx0cmVuZGVyZXIubm90ZU51bWJlciA9IDA7XG5cdFx0XHRqdXN0SW5pdGlhbGl6ZWRNZWFzdXJlTnVtYmVyID0gdHJ1ZTtcblx0XHR9XG5cdFx0Y2hpbGQuZHJhdyhyZW5kZXJlciwgKHRoaXMuYmFydG8gfHwgaT09PWlpLTEpP2JhcnRvcDowKTtcblx0XHRpZiAoY2hpbGQudHlwZSA9PT0gJ25vdGUnIHx8IGlzTm9uU3BhY2VyUmVzdChjaGlsZCkpXG5cdFx0XHRyZW5kZXJlci5ub3RlTnVtYmVyKys7XG5cdFx0aWYgKGNoaWxkLnR5cGUgPT09ICdiYXInICYmICFqdXN0SW5pdGlhbGl6ZWRNZWFzdXJlTnVtYmVyKSB7XG5cdFx0XHRyZW5kZXJlci5tZWFzdXJlTnVtYmVyKys7XG5cdFx0XHRyZW5kZXJlci5ub3RlTnVtYmVyID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZW5kZXJlci5tZWFzdXJlTnVtYmVyID0gMDtcblx0cmVuZGVyZXIubm90ZU51bWJlciA9IDA7XG5cdHBhcnNlQ29tbW9uLmVhY2godGhpcy5iZWFtcywgZnVuY3Rpb24oYmVhbSkge1xuXHRcdGlmIChiZWFtID09PSAnYmFyJykge1xuXHRcdFx0cmVuZGVyZXIubWVhc3VyZU51bWJlcisrO1xuXHRcdFx0cmVuZGVyZXIubm90ZU51bWJlciA9IDA7XG5cdFx0fSBlbHNlXG5cdFx0XHRiZWFtLmRyYXcocmVuZGVyZXIpOyAvLyBiZWFtcyBtdXN0IGJlIGRyYXduIGZpcnN0IGZvciBwcm9wZXIgcHJpbnRpbmcgb2YgdHJpcGxldHMsIHNsdXJzIGFuZCB0aWVzLlxuXHR9KTtcblxuXHRyZW5kZXJlci5tZWFzdXJlTnVtYmVyID0gMDtcblx0cmVuZGVyZXIubm90ZU51bWJlciA9IDA7XG5cdHZhciBzZWxmID0gdGhpcztcblx0cGFyc2VDb21tb24uZWFjaCh0aGlzLm90aGVyY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG5cdFx0aWYgKGNoaWxkID09PSAnYmFyJykge1xuXHRcdFx0cmVuZGVyZXIubWVhc3VyZU51bWJlcisrO1xuXHRcdFx0cmVuZGVyZXIubm90ZU51bWJlciA9IDA7XG5cdFx0fSBlbHNlXG5cdFx0XHRjaGlsZC5kcmF3KHJlbmRlcmVyLHNlbGYuc3RhcnR4KzEwLHdpZHRoKTtcblx0fSk7XG5cbn07XG5cblZvaWNlRWxlbWVudC5wcm90b3R5cGUubGF5b3V0QmVhbXMgPSBmdW5jdGlvbigpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJlYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHRoaXMuYmVhbXNbaV0ubGF5b3V0KSB7XG5cdFx0XHR0aGlzLmJlYW1zW2ldLmxheW91dCgpO1xuXHRcdFx0dGhpcy5tb3ZlRGVjb3JhdGlvbnModGhpcy5iZWFtc1tpXSk7XG5cdFx0XHQvLyBUaGUgYWJvdmUgd2lsbCBjaGFuZ2UgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBhYnNlbGVtIGNoaWxkcmVuLCBzbyBzZWUgaWYgd2UgbmVlZCB0byBleHBhbmQgb3VyIHJhbmdlLlxuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmJlYW1zW2ldLmVsZW1zLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHRoaXMuYWRqdXN0UmFuZ2UodGhpcy5iZWFtc1tpXS5lbGVtc1tqXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIE5vdyB3ZSBjYW4gbGF5b3V0IHRoZSB0cmlwbGV0c1xuXHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5vdGhlcmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGNoaWxkID0gdGhpcy5vdGhlcmNoaWxkcmVuW2ldO1xuXHRcdGlmIChjaGlsZC5sYXlvdXQpIHtcblx0XHRcdGNoaWxkLmxheW91dCgpO1xuXHRcdFx0dGhpcy5hZGp1c3RSYW5nZShjaGlsZCk7XG5cdFx0fVxuXHR9XG5cdHRoaXMuc3RhZmYudG9wID0gTWF0aC5tYXgodGhpcy5zdGFmZi50b3AsIHRoaXMudG9wKTtcblx0dGhpcy5zdGFmZi5ib3R0b20gPSBNYXRoLm1pbih0aGlzLnN0YWZmLmJvdHRvbSwgdGhpcy5ib3R0b20pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBWb2ljZUVsZW1lbnQ7XG4iLCIvLyBhYmNfYWJzdHJhY3RfZW5ncmF2ZXIuanM6IENyZWF0ZXMgYSBkYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgcHJpbnRpbmcgYSBsaW5lIG9mIGFiY1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKVxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQWJzb2x1dGVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfYWJzb2x1dGVfZWxlbWVudCcpO1xudmFyIEJlYW1FbGVtID0gcmVxdWlyZSgnLi9hYmNfYmVhbV9lbGVtZW50Jyk7XG52YXIgQnJhY2VFbGVtID0gcmVxdWlyZSgnLi9hYmNfYnJhY2VfZWxlbWVudCcpO1xudmFyIGNyZWF0ZUNsZWYgPSByZXF1aXJlKCcuL2FiY19jcmVhdGVfY2xlZicpO1xudmFyIGNyZWF0ZUtleVNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vYWJjX2NyZWF0ZV9rZXlfc2lnbmF0dXJlJyk7XG52YXIgY3JlYXRlVGltZVNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vYWJjX2NyZWF0ZV90aW1lX3NpZ25hdHVyZScpO1xudmFyIERlY29yYXRpb24gPSByZXF1aXJlKCcuL2FiY19kZWNvcmF0aW9uJyk7XG52YXIgRW5kaW5nRWxlbSA9IHJlcXVpcmUoJy4vYWJjX2VuZGluZ19lbGVtZW50Jyk7XG52YXIgZ2x5cGhzID0gcmVxdWlyZSgnLi9hYmNfZ2x5cGhzJyk7XG52YXIgUmVsYXRpdmVFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfcmVsYXRpdmVfZWxlbWVudCcpO1xudmFyIHNwYWNpbmcgPSByZXF1aXJlKCcuL2FiY19zcGFjaW5nJyk7XG52YXIgU3RhZmZHcm91cEVsZW1lbnQgPSByZXF1aXJlKCcuL2FiY19zdGFmZl9ncm91cF9lbGVtZW50Jyk7XG52YXIgVGVtcG9FbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfdGVtcG9fZWxlbWVudCcpO1xudmFyIFRpZUVsZW0gPSByZXF1aXJlKCcuL2FiY190aWVfZWxlbWVudCcpO1xudmFyIFRyaXBsZXRFbGVtID0gcmVxdWlyZSgnLi9hYmNfdHJpcGxldF9lbGVtZW50Jyk7XG52YXIgVm9pY2VFbGVtZW50ID0gcmVxdWlyZSgnLi9hYmNfdm9pY2VfZWxlbWVudCcpO1xuXG52YXIgcGFyc2VDb21tb24gPSByZXF1aXJlKCcuLi9wYXJzZS9hYmNfY29tbW9uJyk7XG5cbnZhciBBYnN0cmFjdEVuZ3JhdmVyO1xuXG4oZnVuY3Rpb24oKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0RHVyYXRpb24gPSBmdW5jdGlvbihlbGVtKSB7XG4gIHZhciBkID0gMDtcbiAgaWYgKGVsZW0uZHVyYXRpb24pIHtcbiAgICBkID0gZWxlbS5kdXJhdGlvbjtcbiAgfVxuICByZXR1cm4gZDtcbn07XG5cbnZhciBoaW50ID0gZmFsc2U7XG5cblx0dmFyIGNoYXJ0YWJsZSA9IHtcblx0XHRyZXN0OnswOlwicmVzdHMud2hvbGVcIiwgMTpcInJlc3RzLmhhbGZcIiwgMjpcInJlc3RzLnF1YXJ0ZXJcIiwgMzpcInJlc3RzLjh0aFwiLCA0OiBcInJlc3RzLjE2dGhcIiw1OiBcInJlc3RzLjMybmRcIiwgNjogXCJyZXN0cy42NHRoXCIsIDc6IFwicmVzdHMuMTI4dGhcIiwgXCJtdWx0aVwiOiBcInJlc3RzLm11bHRpbWVhc3VyZVwifSxcblx0XHRub3RlOntcIi0xXCI6IFwibm90ZWhlYWRzLmRibFwiLCAwOlwibm90ZWhlYWRzLndob2xlXCIsIDE6XCJub3RlaGVhZHMuaGFsZlwiLCAyOlwibm90ZWhlYWRzLnF1YXJ0ZXJcIiwgMzpcIm5vdGVoZWFkcy5xdWFydGVyXCIsIDQ6XCJub3RlaGVhZHMucXVhcnRlclwiLCA1Olwibm90ZWhlYWRzLnF1YXJ0ZXJcIiwgNjpcIm5vdGVoZWFkcy5xdWFydGVyXCIsIDc6XCJub3RlaGVhZHMucXVhcnRlclwiLCAnbm9zdGVtJzpcIm5vdGVoZWFkcy5xdWFydGVyXCJ9LFxuXHRcdHJoeXRobTp7XCItMVwiOiBcIm5vdGVoZWFkcy5zbGFzaC53aG9sZVwiLCAwOlwibm90ZWhlYWRzLnNsYXNoLndob2xlXCIsIDE6XCJub3RlaGVhZHMuc2xhc2gud2hvbGVcIiwgMjpcIm5vdGVoZWFkcy5zbGFzaC5xdWFydGVyXCIsIDM6XCJub3RlaGVhZHMuc2xhc2gucXVhcnRlclwiLCA0Olwibm90ZWhlYWRzLnNsYXNoLnF1YXJ0ZXJcIiwgNTpcIm5vdGVoZWFkcy5zbGFzaC5xdWFydGVyXCIsIDY6XCJub3RlaGVhZHMuc2xhc2gucXVhcnRlclwiLCA3Olwibm90ZWhlYWRzLnNsYXNoLnF1YXJ0ZXJcIiwgbm9zdGVtOiBcIm5vdGVoZWFkcy5zbGFzaC5ub3N0ZW1cIn0sXG5cdFx0eDp7XCItMVwiOiBcIm5vdGVoZWFkcy5pbmRldGVybWluYXRlXCIsIDA6XCJub3RlaGVhZHMuaW5kZXRlcm1pbmF0ZVwiLCAxOlwibm90ZWhlYWRzLmluZGV0ZXJtaW5hdGVcIiwgMjpcIm5vdGVoZWFkcy5pbmRldGVybWluYXRlXCIsIDM6XCJub3RlaGVhZHMuaW5kZXRlcm1pbmF0ZVwiLCA0Olwibm90ZWhlYWRzLmluZGV0ZXJtaW5hdGVcIiwgNTpcIm5vdGVoZWFkcy5pbmRldGVybWluYXRlXCIsIDY6XCJub3RlaGVhZHMuaW5kZXRlcm1pbmF0ZVwiLCA3Olwibm90ZWhlYWRzLmluZGV0ZXJtaW5hdGVcIiwgbm9zdGVtOiBcIm5vdGVoZWFkcy5pbmRldGVybWluYXRlXCJ9LFxuXHRcdGhhcm1vbmljOntcIi0xXCI6IFwibm90ZWhlYWRzLmhhcm1vbmljLnF1YXJ0ZXJcIiwgMDpcIm5vdGVoZWFkcy5oYXJtb25pYy5xdWFydGVyXCIsIDE6XCJub3RlaGVhZHMuaGFybW9uaWMucXVhcnRlclwiLCAyOlwibm90ZWhlYWRzLmhhcm1vbmljLnF1YXJ0ZXJcIiwgMzpcIm5vdGVoZWFkcy5oYXJtb25pYy5xdWFydGVyXCIsIDQ6XCJub3RlaGVhZHMuaGFybW9uaWMucXVhcnRlclwiLCA1Olwibm90ZWhlYWRzLmhhcm1vbmljLnF1YXJ0ZXJcIiwgNjpcIm5vdGVoZWFkcy5oYXJtb25pYy5xdWFydGVyXCIsIDc6XCJub3RlaGVhZHMuaGFybW9uaWMucXVhcnRlclwiLCBub3N0ZW06IFwibm90ZWhlYWRzLmhhcm1vbmljLnF1YXJ0ZXJcIn0sXG5cdFx0dWZsYWdzOnszOlwiZmxhZ3MudTh0aFwiLCA0OlwiZmxhZ3MudTE2dGhcIiwgNTpcImZsYWdzLnUzMm5kXCIsIDY6XCJmbGFncy51NjR0aFwifSxcblx0XHRkZmxhZ3M6ezM6XCJmbGFncy5kOHRoXCIsIDQ6XCJmbGFncy5kMTZ0aFwiLCA1OlwiZmxhZ3MuZDMybmRcIiwgNjpcImZsYWdzLmQ2NHRoXCJ9XG5cdH07XG5cbkFic3RyYWN0RW5ncmF2ZXIgPSBmdW5jdGlvbihyZW5kZXJlciwgdHVuZU51bWJlciwgb3B0aW9ucykge1xuXHR0aGlzLmRlY29yYXRpb24gPSBuZXcgRGVjb3JhdGlvbigpO1xuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cdHRoaXMudHVuZU51bWJlciA9IHR1bmVOdW1iZXI7XG5cdHRoaXMuaXNCYWdwaXBlcyA9IG9wdGlvbnMuYmFncGlwZXM7XG5cdHRoaXMuZmxhdEJlYW1zID0gb3B0aW9ucy5mbGF0YmVhbXM7XG5cdHRoaXMucmVzZXQoKTtcbn07XG5cbkFic3RyYWN0RW5ncmF2ZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2x1cnMgPSB7fTtcblx0dGhpcy50aWVzID0gW107XG5cdHRoaXMudm9pY2VTY2FsZSA9IDE7XG5cdHRoaXMuc2x1cnNieXZvaWNlID0ge307XG5cdHRoaXMudGllc2J5dm9pY2UgPSB7fTtcblx0dGhpcy5lbmRpbmdzYnl2b2ljZSA9IHt9O1xuXHR0aGlzLnNjYWxlQnlWb2ljZSA9IHt9O1xuXHR0aGlzLnRyaXBsZXRtdWx0aXBsaWVyID0gMTtcblxuXHR0aGlzLmFiY2xpbmUgPSB1bmRlZmluZWQ7XG5cdHRoaXMuYWNjaWRlbnRhbFNsb3QgPSB1bmRlZmluZWQ7XG5cdHRoaXMuYWNjaWRlbnRhbHNoaWZ0eCA9IHVuZGVmaW5lZDtcblx0dGhpcy5kb3RzaGlmdHggPSB1bmRlZmluZWQ7XG5cdHRoaXMuaGFzVm9jYWxzID0gZmFsc2U7XG5cdHRoaXMubWluWSA9IHVuZGVmaW5lZDtcblx0dGhpcy5wYXJ0c3RhcnRlbGVtID0gdW5kZWZpbmVkO1xuXHR0aGlzLnN0YXJ0bGltaXRlbGVtID0gdW5kZWZpbmVkO1xuXHR0aGlzLnN0ZW1kaXIgPSB1bmRlZmluZWQ7XG59O1xuXG5BYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5zZXRTdGVtSGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0SW5QaXhlbHMpIHtcblx0dGhpcy5zdGVtSGVpZ2h0ID0gaGVpZ2h0SW5QaXhlbHMgLyBzcGFjaW5nLlNURVA7XG59O1xuXG5BYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5nZXRDdXJyZW50Vm9pY2VJZCA9IGZ1bmN0aW9uKHMsdikge1xuICByZXR1cm4gXCJzXCIrcytcInZcIit2O1xufTtcblxuQWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUucHVzaENyb3NzTGluZUVsZW1zID0gZnVuY3Rpb24ocyx2KSB7XG4gIHRoaXMuc2x1cnNieXZvaWNlW3RoaXMuZ2V0Q3VycmVudFZvaWNlSWQocyx2KV0gPSB0aGlzLnNsdXJzO1xuICB0aGlzLnRpZXNieXZvaWNlW3RoaXMuZ2V0Q3VycmVudFZvaWNlSWQocyx2KV0gPSB0aGlzLnRpZXM7XG4gIHRoaXMuZW5kaW5nc2J5dm9pY2VbdGhpcy5nZXRDdXJyZW50Vm9pY2VJZChzLHYpXSA9IHRoaXMucGFydHN0YXJ0ZWxlbTtcbiAgdGhpcy5zY2FsZUJ5Vm9pY2VbdGhpcy5nZXRDdXJyZW50Vm9pY2VJZChzLHYpXSA9IHRoaXMudm9pY2VTY2FsZTtcbn07XG5cbkFic3RyYWN0RW5ncmF2ZXIucHJvdG90eXBlLnBvcENyb3NzTGluZUVsZW1zID0gZnVuY3Rpb24ocyx2KSB7XG4gIHRoaXMuc2x1cnMgPSB0aGlzLnNsdXJzYnl2b2ljZVt0aGlzLmdldEN1cnJlbnRWb2ljZUlkKHMsdildIHx8IHt9O1xuICB0aGlzLnRpZXMgPSB0aGlzLnRpZXNieXZvaWNlW3RoaXMuZ2V0Q3VycmVudFZvaWNlSWQocyx2KV0gfHwgW107XG4gIHRoaXMucGFydHN0YXJ0ZWxlbSA9IHRoaXMuZW5kaW5nc2J5dm9pY2VbdGhpcy5nZXRDdXJyZW50Vm9pY2VJZChzLHYpXTtcbiAgdGhpcy52b2ljZVNjYWxlID0gdGhpcy5zY2FsZUJ5Vm9pY2VbdGhpcy5nZXRDdXJyZW50Vm9pY2VJZChzLHYpXTtcbiAgaWYgKHRoaXMudm9pY2VTY2FsZSA9PT0gdW5kZWZpbmVkKSB0aGlzLnZvaWNlU2NhbGUgPSAxO1xufTtcblxuXHRBYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5jb250YWluc0x5cmljcyA9IGZ1bmN0aW9uKHN0YXZlcykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHN0YXZlc1tpXS52b2ljZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBzdGF2ZXNbaV0udm9pY2VzW2pdLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdFx0dmFyIGVsID0gc3RhdmVzW2ldLnZvaWNlc1tqXVtrXTtcblx0XHRcdFx0XHRpZiAoZWwubHlyaWMpIHtcblx0XHRcdFx0XHRcdC8vIFdlIGp1c3Qgd2FudCB0byBzZWUgaWYgdGhlcmUgYXJlIHZvY2FscyBiZWxvdyB0aGUgbXVzaWMgdG8ga25vdyB3aGVyZSB0byBwdXQgdGhlIGR5bmFtaWNzLlxuXHRcdFx0XHRcdFx0aWYgKCFlbC5wb3NpdGlvbmluZyB8fCBlbC5wb3NpdGlvbmluZy52b2NhbFBvc2l0aW9uID09PSAnYmVsb3cnKVxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhc1ZvY2FscyA9IHRydWU7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5BYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5jcmVhdGVBQkNMaW5lID0gZnVuY3Rpb24oc3RhZmZzLCB0ZW1wbykge1xuICAgIHRoaXMubWluWSA9IDI7IC8vIFBFUjogVGhpcyB3aWxsIGJlIHRoZSBsb3dlc3QgdGhhdCBhbnkgbm90ZSByZWFjaGVzLiBJdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBkeW5hbWljcyByb3cuXG5cdC8vIFNlZSBpZiB0aGVyZSBhcmUgYW55IGx5cmljcyBvbiB0aGlzIGxpbmUuXG5cdHRoaXMuY29udGFpbnNMeXJpY3Moc3RhZmZzKTtcbiAgdmFyIHN0YWZmZ3JvdXAgPSBuZXcgU3RhZmZHcm91cEVsZW1lbnQoKTtcblx0dGhpcy50ZW1wb1NldCA9IGZhbHNlO1xuICBmb3IgKHZhciBzID0gMDsgcyA8IHN0YWZmcy5sZW5ndGg7IHMrKykge1xuXHQgIGlmIChoaW50KVxuXHRcdCAgdGhpcy5yZXN0b3JlU3RhdGUoKTtcblx0ICBoaW50ID0gZmFsc2U7XG4gICAgdGhpcy5jcmVhdGVBQkNTdGFmZihzdGFmZmdyb3VwLCBzdGFmZnNbc10sIHRlbXBvLCBzKTtcbiAgfVxuICByZXR1cm4gc3RhZmZncm91cDtcbn07XG5cbkFic3RyYWN0RW5ncmF2ZXIucHJvdG90eXBlLmNyZWF0ZUFCQ1N0YWZmID0gZnVuY3Rpb24oc3RhZmZncm91cCwgYWJjc3RhZmYsIHRlbXBvLCBzKSB7XG4vLyBJZiB0aGUgdGVtcG8gaXMgcGFzc2VkIGluLCB0aGVuIHRoZSBmaXJzdCBlbGVtZW50IHNob3VsZCBnZXQgdGhlIHRlbXBvIGF0dGFjaGVkIHRvIGl0LlxuICBmb3IgKHZhciB2ID0gMDsgdiA8IGFiY3N0YWZmLnZvaWNlcy5sZW5ndGg7IHYrKykge1xuICAgIHZhciB2b2ljZSA9IG5ldyBWb2ljZUVsZW1lbnQodixhYmNzdGFmZi52b2ljZXMubGVuZ3RoKTtcbiAgICBpZiAodj09PTApIHtcblx0ICAgIHZvaWNlLmJhcmZyb20gPSAoYWJjc3RhZmYuY29ubmVjdEJhckxpbmVzPT09XCJzdGFydFwiIHx8IGFiY3N0YWZmLmNvbm5lY3RCYXJMaW5lcz09PVwiY29udGludWVcIik7XG5cdCAgICB2b2ljZS5iYXJ0byA9IChhYmNzdGFmZi5jb25uZWN0QmFyTGluZXM9PT1cImNvbnRpbnVlXCIgfHwgYWJjc3RhZmYuY29ubmVjdEJhckxpbmVzPT09XCJlbmRcIik7XG4gICAgfSBlbHNlIHtcblx0ICAgIHZvaWNlLmR1cGxpY2F0ZSA9IHRydWU7IC8vIGJhciBsaW5lcyBhbmQgb3RoZXIgZHVwbGljYXRlIGluZm8gbmVlZCBub3QgYmUgY3JlYXRlZFxuICAgIH1cbiAgICBpZiAoYWJjc3RhZmYudGl0bGUgJiYgYWJjc3RhZmYudGl0bGVbdl0pIHZvaWNlLmhlYWRlcj1hYmNzdGFmZi50aXRsZVt2XTtcblx0ICB2YXIgY2xlZiA9IGNyZWF0ZUNsZWYoYWJjc3RhZmYuY2xlZiwgdGhpcy50dW5lTnVtYmVyKTtcblx0ICBpZiAoY2xlZikge1xuXHRcdCAgaWYgKHYgPT09MCAmJiBhYmNzdGFmZi5iYXJOdW1iZXIpIHtcblx0XHRcdCAgdGhpcy5hZGRNZWFzdXJlTnVtYmVyKGFiY3N0YWZmLmJhck51bWJlciwgY2xlZik7XG5cdFx0ICB9XG5cdFx0ICB2b2ljZS5hZGRDaGlsZChjbGVmKTtcblx0ICB9XG5cdCAgdmFyIGtleVNpZyA9IGNyZWF0ZUtleVNpZ25hdHVyZShhYmNzdGFmZi5rZXksIHRoaXMudHVuZU51bWJlcik7XG5cdCAgaWYgKGtleVNpZykge1xuXHRcdCAgdm9pY2UuYWRkQ2hpbGQoa2V5U2lnKTtcblx0XHQgIHRoaXMuc3RhcnRsaW1pdGVsZW0gPSBrZXlTaWc7IC8vIGxpbWl0IHRpZXMgaGVyZVxuXHQgIH1cbiAgICBpZiAoYWJjc3RhZmYubWV0ZXIpIHtcbiAgICBcdGlmIChhYmNzdGFmZi5tZXRlci50eXBlID09PSAnc3BlY2lmaWVkJykge1xuICAgIFx0XHR0aGlzLm1lYXN1cmVMZW5ndGggPSBhYmNzdGFmZi5tZXRlci52YWx1ZVswXS5udW0gLyBhYmNzdGFmZi5tZXRlci52YWx1ZVswXS5kZW47XG5cdCAgICB9IGVsc2Vcblx0ICAgIFx0dGhpcy5tZWFzdXJlTGVuZ3RoID0gMTtcblx0XHR2YXIgdHMgPSBjcmVhdGVUaW1lU2lnbmF0dXJlKGFiY3N0YWZmLm1ldGVyLCB0aGlzLnR1bmVOdW1iZXIpO1xuXHQgICAgdm9pY2UuYWRkQ2hpbGQodHMpO1xuXHRcdHRoaXMuc3RhcnRsaW1pdGVsZW0gPSB0czsgLy8gbGltaXQgdGllcyBoZXJlXG5cdH1cblx0ICBpZiAodm9pY2UuZHVwbGljYXRlKVxuXHRcdCAgdm9pY2UuY2hpbGRyZW4gPSBbXTsgLy8gd2Ugc2hvdWxkbid0IHJlcHJpbnQgdGhlIGFib3ZlIGlmIHdlJ3JlIHJldXNpbmcgdGhlIHNhbWUgc3RhZmYuIFdlIGp1c3QgY3JlYXRlZCB0aGVtIHRvIGdldCB0aGUgcmlnaHQgc3BhY2luZy5cbiAgICB2YXIgc3RhZmZMaW5lcyA9IGFiY3N0YWZmLmNsZWYuc3RhZmZsaW5lcyB8fCBhYmNzdGFmZi5jbGVmLnN0YWZmbGluZXMgPT09IDAgPyBhYmNzdGFmZi5jbGVmLnN0YWZmbGluZXMgOiA1O1xuICAgIHN0YWZmZ3JvdXAuYWRkVm9pY2Uodm9pY2UscyxzdGFmZkxpbmVzKTtcblx0ICB2YXIgaXNTaW5nbGVMaW5lU3RhZmYgPSBzdGFmZkxpbmVzID09PSAxO1xuXHQgIHRoaXMuY3JlYXRlQUJDVm9pY2UoYWJjc3RhZmYudm9pY2VzW3ZdLHRlbXBvLCBzLCB2LCBpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UpO1xuXHQgIHN0YWZmZ3JvdXAuc2V0U3RhZmZMaW1pdHModm9pY2UpO1xuICAgICAgICAgICAgLy9Ub255OiBIZXJlIEkgYW0gZm9sbG93aW5nIHdoYXQgc3RhdmVzIG5lZWQgdG8gYmUgc3Vycm91bmRlZCBieSB0aGUgYnJhY2UsIGJ5IGluY3JlbWVudGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBicmFjZSBjbGFzcy5cbiAgICAgICAgICAgIC8vU28gYmFzaWNhbGx5IHRoaXMga2VlcHMgaW5jcmVtZW50aW5nIHRoZSBudW1iZXIgb2Ygc3RhZmYgc3Vycm91bmRlZCBieSB0aGUgYnJhY2UgdW50aWwgaXQgc2VlcyBcImVuZFwiLlxuICAgICAgICAgICAgLy9UaGlzIHRoZW4gZ2V0cyBwcm9jZXNzZWQgaW4gYWJjX3N0YWZmX2dyb3VwX2VsZW1lbnQuanMsIHNvIHRoYXQgaXQgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IHRvcCBhbmQgYm90dG9tIGNvb3JkaW5hdGVzIGZvciB0aGUgYnJhY2UuXG5cdFx0XHRpZihhYmNzdGFmZi5icmFjZSA9PT0gXCJzdGFydFwiKXtcblx0XHRcdFx0c3RhZmZncm91cC5icmFjZSA9IG5ldyBCcmFjZUVsZW0oMSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKGFiY3N0YWZmLmJyYWNlID09PSBcImVuZFwiICYmIHN0YWZmZ3JvdXAuYnJhY2UpIHtcblx0XHRcdFx0c3RhZmZncm91cC5icmFjZS5pbmNyZWFzZVN0YXZlc0luY2x1ZGVkKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKGFiY3N0YWZmLmJyYWNlID09PSBcImNvbnRpbnVlXCIgJiYgc3RhZmZncm91cC5icmFjZSl7XG5cdFx0XHRcdHN0YWZmZ3JvdXAuYnJhY2UuaW5jcmVhc2VTdGF2ZXNJbmNsdWRlZCgpO1xuXHRcdFx0fVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRCZWFtR3JvdXAoYWJjbGluZSwgcG9zKSB7XG5cdC8vIElmIHRoZXJlIGFyZSBub3RlcyBiZWFtZWQgdG9nZXRoZXIsIHRoZXkgYXJlIGhhbmRsZWQgYXMgYSBncm91cCwgc28gZmluZCBhbGwgb2YgdGhlbSBoZXJlLlxuXHR2YXIgZWxlbSA9IGFiY2xpbmVbcG9zXTtcblx0aWYgKGVsZW0uZWxfdHlwZSAhPT0gJ25vdGUnIHx8ICFlbGVtLnN0YXJ0QmVhbSB8fCBlbGVtLmVuZEJlYW0pXG5cdFx0cmV0dXJuIHsgY291bnQ6IDEsIGVsZW06IGVsZW0gfTtcblxuXHR2YXIgZ3JvdXAgPSBbXTtcblx0d2hpbGUgKHBvcyA8IGFiY2xpbmUubGVuZ3RoICYmIGFiY2xpbmVbcG9zXS5lbF90eXBlID09PSAnbm90ZScpIHtcblx0XHRncm91cC5wdXNoKGFiY2xpbmVbcG9zXSk7XG5cdFx0aWYgKGFiY2xpbmVbcG9zXS5lbmRCZWFtKVxuXHRcdFx0YnJlYWs7XG5cdFx0cG9zKys7XG5cdH1cblx0cmV0dXJuIHsgY291bnQ6IGdyb3VwLmxlbmd0aCwgZWxlbTogZ3JvdXAgfTtcbn1cblxuQWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuY3JlYXRlQUJDVm9pY2UgPSBmdW5jdGlvbihhYmNsaW5lLCB0ZW1wbywgcywgdiwgaXNTaW5nbGVMaW5lU3RhZmYsIHZvaWNlKSB7XG4gIHRoaXMucG9wQ3Jvc3NMaW5lRWxlbXMocyx2KTtcbiAgdGhpcy5zdGVtZGlyID0gKHRoaXMuaXNCYWdwaXBlcyk/XCJkb3duXCI6bnVsbDtcbiAgdGhpcy5hYmNsaW5lID0gYWJjbGluZTtcbiAgaWYgKHRoaXMucGFydHN0YXJ0ZWxlbSkge1xuICAgIHRoaXMucGFydHN0YXJ0ZWxlbSA9IG5ldyBFbmRpbmdFbGVtKFwiXCIsIG51bGwsIG51bGwpO1xuXHQgIHZvaWNlLmFkZE90aGVyKHRoaXMucGFydHN0YXJ0ZWxlbSk7XG4gIH1cblx0dmFyIHZvaWNlTnVtYmVyID0gdm9pY2Uudm9pY2V0b3RhbCA8IDIgPyAtMSA6IHZvaWNlLnZvaWNlbnVtYmVyO1xuICBmb3IgKHZhciBzbHVyIGluIHRoaXMuc2x1cnMpIHtcbiAgICBpZiAodGhpcy5zbHVycy5oYXNPd25Qcm9wZXJ0eShzbHVyKSkge1xuXHQgICAgLy8gdGhpcyBpcyBhbHJlYWR5IGEgc2x1ciBlbGVtZW50LCBidXQgaXQgd2FzIGNyZWF0ZWQgZm9yIHRoZSBsYXN0IGxpbmUsIHNvIHJlY3JlYXRlIGl0LlxuICAgICAgdGhpcy5zbHVyc1tzbHVyXT0gbmV3IFRpZUVsZW0oe2ZvcmNlOiB0aGlzLnNsdXJzW3NsdXJdLmZvcmNlLCB2b2ljZU51bWJlcjogdm9pY2VOdW1iZXIsIHN0ZW1EaXI6IHRoaXMuc2x1cnNbc2x1cl0uc3RlbURpcn0pO1xuXHRcdGlmIChoaW50KSB0aGlzLnNsdXJzW3NsdXJdLnNldEhpbnQoKTtcblx0ICAgIHZvaWNlLmFkZE90aGVyKHRoaXMuc2x1cnNbc2x1cl0pO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpPTA7IGk8dGhpcy50aWVzLmxlbmd0aDsgaSsrKSB7XG4gIFx0Ly8gdGhpcyBpcyBhbHJlYWR5IGEgdGllIGVsZW1lbnQsIGJ1dCBpdCB3YXMgY3JlYXRlZCBmb3IgdGhlIGxhc3QgbGluZSwgc28gcmVjcmVhdGUgaXQuXG4gICAgdGhpcy50aWVzW2ldPW5ldyBUaWVFbGVtKHsgZm9yY2U6IHRoaXMudGllc1tpXS5mb3JjZSwgc3RlbURpcjogdGhpcy50aWVzW2ldLnN0ZW1EaXIsIHZvaWNlTnVtYmVyOiB2b2ljZU51bWJlciB9KTtcblx0ICBpZiAoaGludCkgdGhpcy50aWVzW2ldLnNldEhpbnQoKTtcblx0ICB2b2ljZS5hZGRPdGhlcih0aGlzLnRpZXNbaV0pO1xuICB9XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmFiY2xpbmUubGVuZ3RoOyBqKyspIHtcblx0ICBzZXRBdmVyYWdlUGl0Y2godGhpcy5hYmNsaW5lW2pdKTtcblx0ICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLmFiY2xpbmVbal0ubWlucGl0Y2gsIHRoaXMubWluWSk7XG4gIH1cblxuXHR2YXIgaXNGaXJzdFN0YWZmID0gKHMgPT09IDApO1xuXHR2YXIgcG9zID0gMDtcblx0d2hpbGUgKHBvcyA8IHRoaXMuYWJjbGluZS5sZW5ndGgpIHtcblx0XHR2YXIgcmV0ID0gZ2V0QmVhbUdyb3VwKHRoaXMuYWJjbGluZSwgcG9zKTtcblx0XHR2YXIgYWJzZWxlbXMgPSB0aGlzLmNyZWF0ZUFCQ0VsZW1lbnQoaXNGaXJzdFN0YWZmLCBpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UsIHJldC5lbGVtKTtcblx0XHRpZiAoYWJzZWxlbXMpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhYnNlbGVtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAoIXRoaXMudGVtcG9TZXQgJiYgdGVtcG8gJiYgIXRlbXBvLnN1cHByZXNzKSB7XG5cdFx0XHRcdFx0dGhpcy50ZW1wb1NldCA9IHRydWU7XG5cdFx0XHRcdFx0dmFyIHRlbXBvRWxlbWVudCA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQocmV0LmVsZW0sIDAsIDAsIFwidGVtcG9cIiwgdGhpcy50dW5lTnVtYmVyLCB7fSk7XG5cdFx0XHRcdFx0dGVtcG9FbGVtZW50LmFkZENoaWxkKG5ldyBUZW1wb0VsZW1lbnQodGVtcG8sIHRoaXMudHVuZU51bWJlciwgY3JlYXRlTm90ZUhlYWQpKTtcblx0XHRcdFx0XHR2b2ljZS5hZGRDaGlsZCh0ZW1wb0VsZW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZvaWNlLmFkZENoaWxkKGFic2VsZW1zW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cG9zICs9IHJldC5jb3VudDtcblx0fVxuXHR0aGlzLnB1c2hDcm9zc0xpbmVFbGVtcyhzLCB2KTtcbn07XG5cblx0QWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuc2F2ZVN0YXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50aWVzU2F2ZSA9IHBhcnNlQ29tbW9uLmNsb25lQXJyYXkodGhpcy50aWVzKTtcblx0XHR0aGlzLnNsdXJzU2F2ZSA9IHBhcnNlQ29tbW9uLmNsb25lSGFzaE9mSGFzaCh0aGlzLnNsdXJzKTtcblx0XHR0aGlzLnNsdXJzYnl2b2ljZVNhdmUgPSBwYXJzZUNvbW1vbi5jbG9uZUhhc2hPZkhhc2godGhpcy5zbHVyc2J5dm9pY2UpO1xuXHRcdHRoaXMudGllc2J5dm9pY2VTYXZlID0gcGFyc2VDb21tb24uY2xvbmVIYXNoT2ZBcnJheU9mSGFzaCh0aGlzLnRpZXNieXZvaWNlKTtcblx0fTtcblxuXHRBYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5yZXN0b3JlU3RhdGUgPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRpZXMgPSBwYXJzZUNvbW1vbi5jbG9uZUFycmF5KHRoaXMudGllc1NhdmUpO1xuXHRcdHRoaXMuc2x1cnMgPSBwYXJzZUNvbW1vbi5jbG9uZUhhc2hPZkhhc2godGhpcy5zbHVyc1NhdmUpO1xuXHRcdHRoaXMuc2x1cnNieXZvaWNlID0gcGFyc2VDb21tb24uY2xvbmVIYXNoT2ZIYXNoKHRoaXMuc2x1cnNieXZvaWNlU2F2ZSk7XG5cdFx0dGhpcy50aWVzYnl2b2ljZSA9IHBhcnNlQ29tbW9uLmNsb25lSGFzaE9mQXJyYXlPZkhhc2godGhpcy50aWVzYnl2b2ljZVNhdmUpO1xuXHR9O1xuXG5cdC8vIGZ1bmN0aW9uIHdyaXRlTWVhc3VyZVdpZHRoKHZvaWNlKSB7XG5cdC8vIFx0dmFyIHdpZHRoID0gMDtcblx0Ly8gXHRmb3IgKHZhciBpID0gdm9pY2UuY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG5cdC8vIFx0XHR2YXIgZWxlbSA9IHZvaWNlLmNoaWxkcmVuW2ldO1xuXHQvLyBcdFx0aWYgKGVsZW0uYWJjZWxlbS5lbF90eXBlID09PSAnYmFyJylcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHR3aWR0aCArPSBlbGVtLnc7XG5cdC8vIFx0fVxuXHQvLyBcdHJldHVybiBuZXcgUmVsYXRpdmVFbGVtZW50KHdpZHRoLnRvRml4ZWQoMiksIC03MCwgMCwgdW5kZWZpbmVkLCB7dHlwZTpcImRlYnVnXCJ9KTtcblx0Ly8gfVxuXG5cdC8vIHJldHVybiBhbiBhcnJheSBvZiBBYnNvbHV0ZUVsZW1lbnRcbkFic3RyYWN0RW5ncmF2ZXIucHJvdG90eXBlLmNyZWF0ZUFCQ0VsZW1lbnQgPSBmdW5jdGlvbihpc0ZpcnN0U3RhZmYsIGlzU2luZ2xlTGluZVN0YWZmLCB2b2ljZSwgZWxlbSkge1xuICB2YXIgZWxlbXNldCA9IFtdO1xuICBzd2l0Y2ggKGVsZW0uZWxfdHlwZSkge1xuXHQgIGNhc2UgdW5kZWZpbmVkOlxuXHQgIFx0Ly8gaXQgaXMgdW5kZWZpbmVkIGlmIHdlIHdlcmUgcGFzc2VkIGFuIGFycmF5IGluIC0gYW4gYXJyYXkgbWVhbnMgYSBzZXQgb2Ygbm90ZXMgdGhhdCBzaG91bGQgYmUgYmVhbWVkIHRvZ2V0aGVyLlxuXHRcdCAgZWxlbXNldCA9IHRoaXMuY3JlYXRlQmVhbShpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UsIGVsZW0pO1xuXHQgIFx0YnJlYWs7XG4gIGNhc2UgXCJub3RlXCI6XG5cdCAgZWxlbXNldFswXSA9IHRoaXMuY3JlYXRlTm90ZShlbGVtLCBmYWxzZSwgaXNTaW5nbGVMaW5lU3RhZmYsIHZvaWNlKTtcblx0ICBpZiAodGhpcy50cmlwbGV0ICYmIHRoaXMudHJpcGxldC5pc0Nsb3NlZCgpKSB7XG5cdFx0ICB2b2ljZS5hZGRPdGhlcih0aGlzLnRyaXBsZXQpO1xuXHRcdCAgdGhpcy50cmlwbGV0ID0gbnVsbDtcblx0XHQgIHRoaXMudHJpcGxldG11bHRpcGxpZXIgPSAxO1xuXHQgIH1cbiAgICBicmVhaztcbiAgY2FzZSBcImJhclwiOlxuICAgIGVsZW1zZXRbMF0gPSB0aGlzLmNyZWF0ZUJhckxpbmUodm9pY2UsIGVsZW0sIGlzRmlyc3RTdGFmZik7XG4gICAgaWYgKHZvaWNlLmR1cGxpY2F0ZSAmJiBlbGVtc2V0Lmxlbmd0aCA+IDApIGVsZW1zZXRbMF0uaW52aXNpYmxlID0gdHJ1ZTtcbi8vXHQgIGVsZW1zZXRbMF0uYWRkQ2hpbGQod3JpdGVNZWFzdXJlV2lkdGgodm9pY2UpKTtcbiAgICBicmVhaztcbiAgY2FzZSBcIm1ldGVyXCI6XG4gICAgZWxlbXNldFswXSA9IGNyZWF0ZVRpbWVTaWduYXR1cmUoZWxlbSwgdGhpcy50dW5lTnVtYmVyKTtcblx0ICB0aGlzLnN0YXJ0bGltaXRlbGVtID0gZWxlbXNldFswXTsgLy8gbGltaXQgdGllcyBoZXJlXG4gICAgaWYgKHZvaWNlLmR1cGxpY2F0ZSAmJiBlbGVtc2V0Lmxlbmd0aCA+IDApIGVsZW1zZXRbMF0uaW52aXNpYmxlID0gdHJ1ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcImNsZWZcIjpcbiAgICBlbGVtc2V0WzBdID0gY3JlYXRlQ2xlZihlbGVtLCB0aGlzLnR1bmVOdW1iZXIpO1xuXHQgIGlmICghZWxlbXNldFswXSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZvaWNlLmR1cGxpY2F0ZSAmJiBlbGVtc2V0Lmxlbmd0aCA+IDApIGVsZW1zZXRbMF0uaW52aXNpYmxlID0gdHJ1ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcImtleVwiOlxuXHQgIHZhciBhYnNLZXkgPSBjcmVhdGVLZXlTaWduYXR1cmUoZWxlbSwgdGhpcy50dW5lTnVtYmVyKTtcblx0ICBpZiAoYWJzS2V5KSB7XG5cdFx0ICBlbGVtc2V0WzBdID0gYWJzS2V5O1xuXHRcdCAgdGhpcy5zdGFydGxpbWl0ZWxlbSA9IGVsZW1zZXRbMF07IC8vIGxpbWl0IHRpZXMgaGVyZVxuXHQgIH1cbiAgICBpZiAodm9pY2UuZHVwbGljYXRlICYmIGVsZW1zZXQubGVuZ3RoID4gMCkgZWxlbXNldFswXS5pbnZpc2libGUgPSB0cnVlO1xuICAgIGJyZWFrO1xuICBjYXNlIFwic3RlbVwiOlxuICAgIHRoaXMuc3RlbWRpcj1lbGVtLmRpcmVjdGlvbjtcbiAgICBicmVhaztcbiAgY2FzZSBcInBhcnRcIjpcbiAgICB2YXIgYWJzZWxlbSA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQoZWxlbSwwLDAsICdwYXJ0JywgdGhpcy50dW5lTnVtYmVyKTtcblx0ICB2YXIgZGltID0gdGhpcy5yZW5kZXJlci5nZXRUZXh0U2l6ZShlbGVtLnRpdGxlLCAncGFydHNmb250JywgXCJwYXJ0XCIpO1xuICAgIGFic2VsZW0uYWRkQ2hpbGQobmV3IFJlbGF0aXZlRWxlbWVudChlbGVtLnRpdGxlLCAwLCAwLCB1bmRlZmluZWQsIHt0eXBlOlwicGFydFwiLCBoZWlnaHQ6IGRpbS5oZWlnaHQvc3BhY2luZy5TVEVQfSkpO1xuICAgIGVsZW1zZXRbMF0gPSBhYnNlbGVtO1xuICAgIGJyZWFrO1xuICBjYXNlIFwidGVtcG9cIjpcbiAgICB2YXIgYWJzZWxlbTMgPSBuZXcgQWJzb2x1dGVFbGVtZW50KGVsZW0sMCwwLCAndGVtcG8nLCB0aGlzLnR1bmVOdW1iZXIpO1xuICAgIGFic2VsZW0zLmFkZENoaWxkKG5ldyBUZW1wb0VsZW1lbnQoZWxlbSwgdGhpcy50dW5lTnVtYmVyLCBjcmVhdGVOb3RlSGVhZCkpO1xuICAgIGVsZW1zZXRbMF0gPSBhYnNlbGVtMztcbiAgICBicmVhaztcblx0ICBjYXNlIFwic3R5bGVcIjpcblx0XHQgIGlmIChlbGVtLmhlYWQgPT09IFwibm9ybWFsXCIpXG5cdFx0XHQgIGRlbGV0ZSB0aGlzLnN0eWxlO1xuXHRcdCAgZWxzZVxuXHRcdFx0ICB0aGlzLnN0eWxlID0gZWxlbS5oZWFkO1xuXHRcdCAgYnJlYWs7XG5cdCAgY2FzZSBcImhpbnRcIjpcblx0XHQgIGhpbnQgPSB0cnVlO1xuXHRcdCAgdGhpcy5zYXZlU3RhdGUoKTtcblx0XHQgIGJyZWFrO1xuXHQgIGNhc2UgXCJtaWRpXCI6XG5cdFx0Ly8gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSB2aXNpYmxlIG11c2ljLCBzbyBqdXN0IHNraXAgaXQuXG5cdFx0YnJlYWs7XG5cdCAgY2FzZSBcInNjYWxlXCI6XG5cdCAgXHR0aGlzLnZvaWNlU2NhbGUgPSBlbGVtLnNpemU7XG5cdCAgXHRicmVhaztcblxuICBkZWZhdWx0OlxuICAgIHZhciBhYnNlbGVtMiA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQoZWxlbSwwLDAsICd1bnN1cHBvcnRlZCcsIHRoaXMudHVuZU51bWJlcik7XG4gICAgYWJzZWxlbTIuYWRkQ2hpbGQobmV3IFJlbGF0aXZlRWxlbWVudChcImVsZW1lbnQgdHlwZSBcIitlbGVtLmVsX3R5cGUsIDAsIDAsIHVuZGVmaW5lZCwge3R5cGU6XCJkZWJ1Z1wifSkpO1xuICAgIGVsZW1zZXRbMF0gPSBhYnNlbGVtMjtcbiAgfVxuXG4gIHJldHVybiBlbGVtc2V0O1xufTtcblxuXHRmdW5jdGlvbiBzZXRBdmVyYWdlUGl0Y2goZWxlbSkge1xuXHRcdGlmIChlbGVtLnBpdGNoZXMpIHtcblx0XHRcdHNvcnRQaXRjaChlbGVtKTtcblx0XHRcdHZhciBzdW0gPSAwO1xuXHRcdFx0Zm9yICh2YXIgcCA9IDA7IHAgPCBlbGVtLnBpdGNoZXMubGVuZ3RoOyBwKyspIHtcblx0XHRcdFx0c3VtICs9IGVsZW0ucGl0Y2hlc1twXS52ZXJ0aWNhbFBvcztcblx0XHRcdH1cblx0XHRcdGVsZW0uYXZlcmFnZXBpdGNoID0gc3VtIC8gZWxlbS5waXRjaGVzLmxlbmd0aDtcblx0XHRcdGVsZW0ubWlucGl0Y2ggPSBlbGVtLnBpdGNoZXNbMF0udmVydGljYWxQb3M7XG5cdFx0XHRlbGVtLm1heHBpdGNoID0gZWxlbS5waXRjaGVzW2VsZW0ucGl0Y2hlcy5sZW5ndGggLSAxXS52ZXJ0aWNhbFBvcztcblx0XHR9XG5cdH1cblxuXHRBYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5jYWxjQmVhbURpciA9IGZ1bmN0aW9uIChpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UsIGVsZW1zKSB7XG5cdFx0aWYgKHRoaXMuc3RlbWRpcikgLy8gSWYgdGhlIHVzZXIgb3Igdm9pY2UgaXMgZm9yY2luZyB0aGUgc3RlbSBkaXJlY3Rpb24sIHdlIGFscmVhZHkga25vdyB0aGUgYW5zd2VyLlxuXHRcdFx0cmV0dXJuIHRoaXMuc3RlbWRpcjtcblx0XHR2YXIgYmVhbWVsZW0gPSBuZXcgQmVhbUVsZW0odGhpcy5zdGVtSGVpZ2h0ICogdGhpcy52b2ljZVNjYWxlLCB0aGlzLnN0ZW1kaXIsIHRoaXMuZmxhdEJlYW1zKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRiZWFtZWxlbS5hZGQoe2FiY2VsZW06IGVsZW1zW2ldfSk7IC8vIFRoaXMgaXMgYSBoYWNrIHRvIGNhbGwgYmVhbSBlbGVtIHdpdGgganVzdCBhIG1pbmltdW0gb2YgcHJvY2Vzc2luZzogZm9yIG91ciBwdXJwb3Nlcywgd2UgZG9uJ3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIHdob2xlIG5vdGUuXG5cdFx0fVxuXG5cdFx0dmFyIGRpciA9IGJlYW1lbGVtLmNhbGNEaXIoKTtcblx0XHRyZXR1cm4gZGlyID8gXCJ1cFwiIDogXCJkb3duXCI7XG5cdH07XG5cblx0QWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuY3JlYXRlQmVhbSA9IGZ1bmN0aW9uIChpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UsIGVsZW1zKSB7XG5cdFx0dmFyIGFic2VsZW1zZXQgPSBbXTtcblxuXHRcdHZhciBkaXIgPSB0aGlzLmNhbGNCZWFtRGlyKGlzU2luZ2xlTGluZVN0YWZmLCB2b2ljZSwgZWxlbXMpO1xuXHRcdHZhciBiZWFtZWxlbSA9IG5ldyBCZWFtRWxlbSh0aGlzLnN0ZW1IZWlnaHQgKiB0aGlzLnZvaWNlU2NhbGUsIGRpciwgdGhpcy5mbGF0QmVhbXMpO1xuXHRcdGlmIChoaW50KSBiZWFtZWxlbS5zZXRIaW50KCk7XG5cdFx0dmFyIG9sZERpciA9IHRoaXMuc3RlbWRpcjtcblx0XHR0aGlzLnN0ZW1kaXIgPSBkaXI7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGVsZW0gPSBlbGVtc1tpXTtcblx0XHRcdHZhciBhYnNlbGVtID0gdGhpcy5jcmVhdGVOb3RlKGVsZW0sIHRydWUsIGlzU2luZ2xlTGluZVN0YWZmLCB2b2ljZSk7XG5cdFx0XHRhYnNlbGVtc2V0LnB1c2goYWJzZWxlbSk7XG5cdFx0XHRiZWFtZWxlbS5hZGQoYWJzZWxlbSk7XG5cdFx0XHRpZiAodGhpcy50cmlwbGV0ICYmIHRoaXMudHJpcGxldC5pc0Nsb3NlZCgpKSB7XG5cdFx0XHRcdHZvaWNlLmFkZE90aGVyKHRoaXMudHJpcGxldCk7XG5cdFx0XHRcdHRoaXMudHJpcGxldCA9IG51bGw7XG5cdFx0XHRcdHRoaXMudHJpcGxldG11bHRpcGxpZXIgPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnN0ZW1kaXIgPSBvbGREaXI7XG5cdFx0dm9pY2UuYWRkQmVhbShiZWFtZWxlbSk7XG5cdFx0cmV0dXJuIGFic2VsZW1zZXQ7XG5cdH07XG5cbnZhciBzb3J0UGl0Y2ggPSBmdW5jdGlvbihlbGVtKSB7XG4gIHZhciBzb3J0ZWQ7XG4gIGRvIHtcbiAgICBzb3J0ZWQgPSB0cnVlO1xuICAgIGZvciAodmFyIHAgPSAwOyBwPGVsZW0ucGl0Y2hlcy5sZW5ndGgtMTsgcCsrKSB7XG4gICAgICBpZiAoZWxlbS5waXRjaGVzW3BdLnBpdGNoPmVsZW0ucGl0Y2hlc1twKzFdLnBpdGNoKSB7XG4gICAgICAgIHNvcnRlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgdG1wID0gZWxlbS5waXRjaGVzW3BdO1xuICAgICAgICBlbGVtLnBpdGNoZXNbcF0gPSBlbGVtLnBpdGNoZXNbcCsxXTtcbiAgICAgICAgZWxlbS5waXRjaGVzW3ArMV0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICghc29ydGVkKTtcbn07XG5cbnZhciBsZWRnZXJMaW5lcyA9IGZ1bmN0aW9uKGFic2VsZW0sIG1pblBpdGNoLCBtYXhQaXRjaCwgaXNSZXN0LCBzeW1ib2xXaWR0aCwgYWRkaXRpb25hbExlZGdlcnMsIGRpciwgZHgsIHNjYWxlKSB7XG5cdGZvciAodmFyIGk9bWF4UGl0Y2g7IGk+MTE7IGktLSkge1xuXHRcdGlmIChpJTI9PT0wICYmICFpc1Jlc3QpIHtcblx0XHRcdGFic2VsZW0uYWRkQ2hpbGQobmV3IFJlbGF0aXZlRWxlbWVudChudWxsLCBkeCwgKHN5bWJvbFdpZHRoKzQpKnNjYWxlLCBpLCB7dHlwZTpcImxlZGdlclwifSkpO1xuXHRcdH1cblx0fVxuXG5cdGZvciAoaT1taW5QaXRjaDsgaTwxOyBpKyspIHtcblx0XHRpZiAoaSUyPT09MCAmJiAhaXNSZXN0KSB7XG5cdFx0XHRhYnNlbGVtLmFkZENoaWxkKG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgZHgsIChzeW1ib2xXaWR0aCs0KSpzY2FsZSwgaSwge3R5cGU6XCJsZWRnZXJcIn0pKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbExlZGdlcnMubGVuZ3RoOyBpKyspIHsgLy8gUEVSOiBkcmF3IGFkZGl0aW9uYWwgbGVkZ2Vyc1xuXHRcdHZhciBvZnMgPSBzeW1ib2xXaWR0aDtcblx0XHRpZiAoZGlyID09PSAnZG93bicpIG9mcyA9IC1vZnM7XG5cdFx0YWJzZWxlbS5hZGRDaGlsZChuZXcgUmVsYXRpdmVFbGVtZW50KG51bGwsIG9mcytkeCwgKHN5bWJvbFdpZHRoKzQpKnNjYWxlLCBhZGRpdGlvbmFsTGVkZ2Vyc1tpXSwge3R5cGU6XCJsZWRnZXJcIn0pKTtcblx0fVxufTtcblxuXHRBYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5hZGRHcmFjZU5vdGVzID0gZnVuY3Rpb24gKGVsZW0sIHZvaWNlLCBhYnNlbGVtLCBub3RlaGVhZCwgc3RlbUhlaWdodCwgaXNCYWdwaXBlcywgcm9vbXRha2VuKSB7XG5cdFx0dmFyIGdyYWNlc2NhbGUgPSAzIC8gNTtcblx0XHR2YXIgZ3JhY2VTY2FsZVN0ZW0gPSAzLjUgLyA1OyAvLyBUT0RPLVBFUjogZW1waXJpY2FsbHkgZm91bmQgY29uc3RhbnQuXG5cdFx0dmFyIGdyYWNlYmVhbSA9IG51bGw7XG5cdFx0dmFyIGZsYWc7XG5cblx0XHRpZiAoZWxlbS5ncmFjZW5vdGVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGdyYWNlYmVhbSA9IG5ldyBCZWFtRWxlbShzdGVtSGVpZ2h0ICogZ3JhY2VTY2FsZVN0ZW0sIFwiZ3JhY2VcIiwgaXNCYWdwaXBlcyk7XG5cdFx0XHRpZiAoaGludCkgZ3JhY2ViZWFtLnNldEhpbnQoKTtcblx0XHRcdGdyYWNlYmVhbS5tYWluTm90ZSA9IGFic2VsZW07XHQvLyB0aGlzIGdpdmVzIHVzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIG5vdGUgdGhpcyBpcyBhdHRhY2hlZCB0byBzbyB0aGF0IHRoZSBzdGVtcyBjYW4gYmUgYXR0YWNoZWQgc29tZXdoZXJlLlxuXHRcdH1cblxuXHRcdHZhciBncmFjZW9mZnNldHMgPSBbXTtcblx0XHRmb3IgKGkgPSBlbGVtLmdyYWNlbm90ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsgLy8gZmlndXJlIG91dCB3aGVyZSB0byBwbGFjZSBlYWNoIGdyYWNlbm90ZVxuXHRcdFx0cm9vbXRha2VuICs9IDEwO1xuXHRcdFx0Z3JhY2VvZmZzZXRzW2ldID0gcm9vbXRha2VuO1xuXHRcdFx0aWYgKGVsZW0uZ3JhY2Vub3Rlc1tpXS5hY2NpZGVudGFsKSB7XG5cdFx0XHRcdHJvb210YWtlbiArPSA3O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBlbGVtLmdyYWNlbm90ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBncmFjZXBpdGNoID0gZWxlbS5ncmFjZW5vdGVzW2ldLnZlcnRpY2FsUG9zO1xuXG5cdFx0XHRmbGFnID0gKGdyYWNlYmVhbSkgPyBudWxsIDogY2hhcnRhYmxlLnVmbGFnc1soaXNCYWdwaXBlcykgPyA1IDogM107XG5cdFx0XHR2YXIgYWNjaWRlbnRhbFNsb3QgPSBbXTtcblx0XHRcdHZhciByZXQgPSBjcmVhdGVOb3RlSGVhZChhYnNlbGVtLCBcIm5vdGVoZWFkcy5xdWFydGVyXCIsIGVsZW0uZ3JhY2Vub3Rlc1tpXSwgXCJ1cFwiLCAtZ3JhY2VvZmZzZXRzW2ldLCAtZ3JhY2VvZmZzZXRzW2ldLCBmbGFnLCAwLCAwLCBncmFjZXNjYWxlKnRoaXMudm9pY2VTY2FsZSwgYWNjaWRlbnRhbFNsb3QsIGZhbHNlKTtcblx0XHRcdHJldC5ub3RlaGVhZC5oaWdoZXN0VmVydCA9IHJldC5ub3RlaGVhZC5waXRjaCArIHN0ZW1IZWlnaHQgKiBncmFjZVNjYWxlU3RlbTtcblx0XHRcdHZhciBncmFjZSA9IHJldC5ub3RlaGVhZDtcblx0XHRcdHRoaXMuYWRkU2x1cnNBbmRUaWVzKGFic2VsZW0sIGVsZW0uZ3JhY2Vub3Rlc1tpXSwgZ3JhY2UsIHZvaWNlLCBcInVwXCIsIHRydWUpO1xuXG5cdFx0XHRhYnNlbGVtLmFkZEV4dHJhKGdyYWNlKTtcblx0XHRcdC8vIFBFUjogYWRkZWQgYWNjaWFjY2F0dXJhIHNsYXNoXG5cdFx0XHRpZiAoZWxlbS5ncmFjZW5vdGVzW2ldLmFjY2lhY2NhdHVyYSkge1xuXHRcdFx0XHR2YXIgcG9zID0gZWxlbS5ncmFjZW5vdGVzW2ldLnZlcnRpY2FsUG9zICsgNyAqIGdyYWNlc2NhbGU7ICAgICAgICAvLyB0aGUgc2FtZSBmb3JtdWxhIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZmxhZyBwb3NpdGlvbi5cblx0XHRcdFx0dmFyIGRBY2NpYWNjYXR1cmEgPSBncmFjZWJlYW0gPyA1IDogNjsgICAgICAgIC8vIGp1c3QgYW4gb2Zmc2V0IHRvIG1ha2UgaXQgbGluZSB1cCBjb3JyZWN0bHkuXG5cdFx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChcImZsYWdzLnVncmFjZVwiLCAtZ3JhY2VvZmZzZXRzW2ldICsgZEFjY2lhY2NhdHVyYSwgMCwgcG9zLCB7c2NhbGV4OiBncmFjZXNjYWxlLCBzY2FsZXk6IGdyYWNlc2NhbGV9KSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZ3JhY2ViZWFtKSB7IC8vIGdpdmUgdGhlIGJlYW0gdGhlIG5lY2Vzc2FyeSBpbmZvXG5cdFx0XHRcdHZhciBncmFjZUR1cmF0aW9uID0gZWxlbS5ncmFjZW5vdGVzW2ldLmR1cmF0aW9uIC8gMjtcblx0XHRcdFx0aWYgKGlzQmFncGlwZXMpIGdyYWNlRHVyYXRpb24gLz0gMjtcblx0XHRcdFx0dmFyIHBzZXVkb2Fic2VsZW0gPSB7XG5cdFx0XHRcdFx0aGVhZHM6IFtncmFjZV0sXG5cdFx0XHRcdFx0YWJjZWxlbToge2F2ZXJhZ2VwaXRjaDogZ3JhY2VwaXRjaCwgbWlucGl0Y2g6IGdyYWNlcGl0Y2gsIG1heHBpdGNoOiBncmFjZXBpdGNoLCBkdXJhdGlvbjogZ3JhY2VEdXJhdGlvbn1cblx0XHRcdFx0fTtcblx0XHRcdFx0Z3JhY2ViZWFtLmFkZChwc2V1ZG9hYnNlbGVtKTtcblx0XHRcdH0gZWxzZSB7IC8vIGRyYXcgdGhlIHN0ZW1cblx0XHRcdFx0dmFyIHAxID0gZ3JhY2VwaXRjaCArIDEgLyAzICogZ3JhY2VzY2FsZTtcblx0XHRcdFx0dmFyIHAyID0gZ3JhY2VwaXRjaCArIDcgKiBncmFjZXNjYWxlO1xuXHRcdFx0XHR2YXIgZHggPSBncmFjZS5keCArIGdyYWNlLnc7XG5cdFx0XHRcdHZhciB3aWR0aCA9IC0wLjY7XG5cdFx0XHRcdGFic2VsZW0uYWRkRXh0cmEobmV3IFJlbGF0aXZlRWxlbWVudChudWxsLCBkeCwgMCwgcDEsIHtcInR5cGVcIjogXCJzdGVtXCIsIFwicGl0Y2gyXCI6IHAyLCBsaW5ld2lkdGg6IHdpZHRofSkpO1xuXHRcdFx0fVxuXHRcdFx0bGVkZ2VyTGluZXMoYWJzZWxlbSwgZ3JhY2VwaXRjaCwgZ3JhY2VwaXRjaCwgZmFsc2UsIGdseXBocy5nZXRTeW1ib2xXaWR0aChcIm5vdGVoZWFkcy5xdWFydGVyXCIpLCBbXSwgdHJ1ZSwgZ3JhY2UuZHggLSAxLCAwLjYpO1xuXG5cdFx0XHRpZiAoaSA9PT0gMCAmJiAhaXNCYWdwaXBlcyAmJiAhKGVsZW0ucmVzdCAmJiAoZWxlbS5yZXN0LnR5cGUgPT09IFwic3BhY2VyXCIgfHwgZWxlbS5yZXN0LnR5cGUgPT09IFwiaW52aXNpYmxlXCIpKSkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIHRoZSBvdmVyYWxsIHNsdXIgdGhhdCBpcyB1bmRlciB0aGUgZ3JhY2Ugbm90ZXMuXG5cdFx0XHRcdHZhciBpc1RpZSA9IChlbGVtLmdyYWNlbm90ZXMubGVuZ3RoID09PSAxICYmIGdyYWNlLnBpdGNoID09PSBub3RlaGVhZC5waXRjaCk7XG5cdFx0XHRcdHZvaWNlLmFkZE90aGVyKG5ldyBUaWVFbGVtKHsgYW5jaG9yMTogZ3JhY2UsIGFuY2hvcjI6IG5vdGVoZWFkLCBpc0dyYWNlOiB0cnVlfSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChncmFjZWJlYW0pIHtcblx0XHRcdHZvaWNlLmFkZEJlYW0oZ3JhY2ViZWFtKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb210YWtlbjtcblx0fTtcblxuXHRmdW5jdGlvbiBhZGRSZXN0VG9BYnNFbGVtZW50KGFic2VsZW0sIGVsZW0sIGR1cmF0aW9uLCBkb3QsIGlzTXVsdGlWb2ljZSwgc3RlbWRpciwgaXNTaW5nbGVMaW5lU3RhZmYsIGR1cmxvZywgdm9pY2VTY2FsZSkge1xuXHRcdHZhciBjO1xuXHRcdHZhciByZXN0cGl0Y2ggPSA3O1xuXHRcdHZhciBub3RlSGVhZDtcblx0XHR2YXIgcm9vbVRha2VuO1xuXHRcdHZhciByb29tVGFrZW5SaWdodDtcblxuXHRcdGlmIChpc011bHRpVm9pY2UpIHtcblx0XHRcdGlmIChzdGVtZGlyID09PSBcImRvd25cIikgcmVzdHBpdGNoID0gMztcblx0XHRcdGlmIChzdGVtZGlyID09PSBcInVwXCIpIHJlc3RwaXRjaCA9IDExO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBpcyBzcGVjaWFsIHBsYWNlbWVudCBmb3IgdGhlIHBlcmN1c3Npb24gc3RhZmYuIElmIHRoZXJlIGlzIG9uZSBzdGFmZiBsaW5lLCB0aGVuIG1vdmUgdGhlIHJlc3QgcG9zaXRpb24uXG5cdFx0aWYgKGlzU2luZ2xlTGluZVN0YWZmKSB7XG5cdFx0XHQvLyBUaGUgaGFsZiBhbmQgd2hvbGUgcmVzdHMgYXJlIGF0dGFjaGVkIHRvIGRpZmZlcmVudCBsaW5lcyBub3JtYWxseSwgc28gd2UgbmVlZCB0byB0d2VhayB0aGVpciBwb3NpdGlvbiB0byBnZXQgdGhlbSB0byBib3RoIGJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG9uZS5cblx0XHRcdGlmIChkdXJhdGlvbiA8IDAuNSlcblx0XHRcdFx0cmVzdHBpdGNoID0gNztcblx0XHRcdGVsc2UgaWYgKGR1cmF0aW9uIDwgMSlcblx0XHRcdFx0cmVzdHBpdGNoID0gNztcdC8vIGhhbGYgcmVzdFxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXN0cGl0Y2ggPSA1OyAvLyB3aG9sZSByZXN0XG5cdFx0fVxuXHRcdHN3aXRjaCAoZWxlbS5yZXN0LnR5cGUpIHtcblx0XHRcdGNhc2UgXCJ3aG9sZVwiOlxuXHRcdFx0XHRjID0gY2hhcnRhYmxlLnJlc3RbMF07XG5cdFx0XHRcdGVsZW0uYXZlcmFnZXBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRlbGVtLm1pbnBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRlbGVtLm1heHBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRkb3QgPSAwO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJyZXN0XCI6XG5cdFx0XHRcdGlmIChlbGVtLnN0eWxlID09PSBcInJoeXRobVwiKSAvLyBzcGVjaWFsIGNhc2UgZm9yIHJoeXRobTogcmVzdHMgYXJlIGEgaGFuZHkgd2F5IHRvIGV4cHJlc3MgdGhlIHJoeXRobS5cblx0XHRcdFx0XHRjID0gY2hhcnRhYmxlLnJoeXRobVstZHVybG9nXTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGMgPSBjaGFydGFibGUucmVzdFstZHVybG9nXTtcblx0XHRcdFx0ZWxlbS5hdmVyYWdlcGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGVsZW0ubWlucGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGVsZW0ubWF4cGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImludmlzaWJsZVwiOlxuXHRcdFx0Y2FzZSBcInNwYWNlclwiOlxuXHRcdFx0XHRjID0gXCJcIjtcblx0XHRcdFx0ZWxlbS5hdmVyYWdlcGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGVsZW0ubWlucGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGVsZW0ubWF4cGl0Y2ggPSByZXN0cGl0Y2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIm11bHRpbWVhc3VyZVwiOlxuXHRcdFx0XHRjID0gY2hhcnRhYmxlLnJlc3RbJ211bHRpJ107XG5cdFx0XHRcdGVsZW0uYXZlcmFnZXBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRlbGVtLm1pbnBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRlbGVtLm1heHBpdGNoID0gcmVzdHBpdGNoO1xuXHRcdFx0XHRkb3QgPSAwO1xuXHRcdFx0XHR2YXIgbW1XaWR0aCA9IGdseXBocy5nZXRTeW1ib2xXaWR0aChjKTtcblx0XHRcdFx0YWJzZWxlbS5hZGRIZWFkKG5ldyBSZWxhdGl2ZUVsZW1lbnQoYywgLW1tV2lkdGgsIG1tV2lkdGggKiAyLCA3KSk7XG5cdFx0XHRcdHZhciBudW1NZWFzdXJlcyA9IG5ldyBSZWxhdGl2ZUVsZW1lbnQoXCJcIiArIGVsZW0uZHVyYXRpb24sIDAsIG1tV2lkdGgsIDE2LCB7dHlwZTogXCJtdWx0aW1lYXN1cmUtdGV4dFwifSk7XG5cdFx0XHRcdGFic2VsZW0uYWRkRXh0cmEobnVtTWVhc3VyZXMpO1xuXHRcdH1cblx0XHRpZiAoZWxlbS5yZXN0LnR5cGUgIT09IFwibXVsdGltZWFzdXJlXCIpIHtcblx0XHRcdHZhciByZXQgPSBjcmVhdGVOb3RlSGVhZChhYnNlbGVtLCBjLCB7dmVydGljYWxQb3M6IHJlc3RwaXRjaH0sIG51bGwsIDAsIDAsIG51bGwsIGRvdCwgMCwgdm9pY2VTY2FsZSwgW10sIGZhbHNlKTtcblx0XHRcdG5vdGVIZWFkID0gcmV0Lm5vdGVoZWFkO1xuXHRcdFx0aWYgKG5vdGVIZWFkKSB7XG5cdFx0XHRcdGFic2VsZW0uYWRkSGVhZChub3RlSGVhZCk7XG5cdFx0XHRcdHJvb21UYWtlbiA9IHJldC5hY2NpZGVudGFsc2hpZnR4O1xuXHRcdFx0XHRyb29tVGFrZW5SaWdodCA9IHJldC5kb3RzaGlmdHg7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7IG5vdGVIZWFkOiBub3RlSGVhZCwgcm9vbVRha2VuOiByb29tVGFrZW4sIHJvb21UYWtlblJpZ2h0OiByb29tVGFrZW5SaWdodCB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gYWRkSWZOb3RFeGlzdChhcnIsIGl0ZW0pIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKEpTT04uc3RyaW5naWZ5KGFycltpXSkgPT09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGFyci5wdXNoKGl0ZW0pO1xuXHR9XG5cblx0QWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuYWRkTm90ZVRvQWJjRWxlbWVudCA9IGZ1bmN0aW9uKGFic2VsZW0sIGVsZW0sIGRvdCwgc3RlbWRpciwgc3R5bGUsIHplcm9EdXJhdGlvbiwgZHVybG9nLCBub3N0ZW0sIHZvaWNlKSB7XG5cdFx0dmFyIGRvdHNoaWZ0eCA9IDA7IC8vIHJvb20gdGFrZW4gYnkgY2hvcmRzIHdpdGggZGlzcGxhY2VkIG5vdGVoZWFkcyB3aGljaCBjYXVzZSBkb3RzIHRvIHNoaWZ0XG5cdFx0dmFyIG5vdGVIZWFkO1xuXHRcdHZhciByb29tVGFrZW4gPSAwO1xuXHRcdHZhciByb29tVGFrZW5SaWdodCA9IDA7XG5cdFx0dmFyIG1pbjtcblx0XHR2YXIgaTtcblx0XHR2YXIgYWRkaXRpb25hbExlZGdlcnMgPSBbXTtcblx0XHQvLyBUaGUgYWNjaWRlbnRhbFNsb3Qgd2lsbCBob2xkIGEgbGlzdCBvZiBhbGwgdGhlIGFjY2lkZW50YWxzIG9uIHRoaXMgY2hvcmQuIEVhY2ggZWxlbWVudCBpcyBhIHZlcnRpY2FsIHBsYWNlLFxuXHRcdC8vIGFuZCBjb250YWlucyBhIHBpdGNoLCB3aGljaCBpcyB0aGUgbGFzdCBwaXRjaCB0aGF0IGNvbnRhaW5zIGFuIGFjY2lkZW50YWwgaW4gdGhhdCBzbG90LiBUaGUgc2xvdHMgYXJlIG51bWJlcmVkXG5cdFx0Ly8gZnJvbSBjbG9zZXN0IHRvIHRoZSBub3RlIHRvIGZhcnRoZXIgbGVmdC4gV2Ugb25seSBuZWVkIHRvIGtub3cgdGhlIGxhc3QgYWNjaWRlbnRhbCB3ZSBwbGFjZWQgYmVjYXVzZVxuXHRcdC8vIHdlIGtub3cgdGhhdCB0aGUgcGl0Y2hlcyBhcmUgc29ydGVkIGJ5IG5vdy5cblx0XHR2YXIgYWNjaWRlbnRhbFNsb3QgPSBbXTtcblx0XHR2YXIgc3ltYm9sV2lkdGggPSAwO1xuXG5cdFx0dmFyIGRpciA9IChlbGVtLmF2ZXJhZ2VwaXRjaD49NikgPyBcImRvd25cIjogXCJ1cFwiO1xuXHRcdGlmIChzdGVtZGlyKSBkaXI9c3RlbWRpcjtcblxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSA/IGVsZW0uc3R5bGUgOiBzdHlsZTsgLy8gZ2V0IHRoZSBzdHlsZSBvZiBub3RlIGhlYWQuXG5cdFx0aWYgKCFzdHlsZSB8fCBzdHlsZSA9PT0gXCJub3JtYWxcIikgc3R5bGUgPSBcIm5vdGVcIjtcblx0XHR2YXIgbm90ZVN5bWJvbDtcblx0XHRpZiAoemVyb0R1cmF0aW9uKVxuXHRcdFx0bm90ZVN5bWJvbCA9IGNoYXJ0YWJsZVtzdHlsZV0ubm9zdGVtO1xuXHRcdGVsc2Vcblx0XHRcdG5vdGVTeW1ib2wgPSBjaGFydGFibGVbc3R5bGVdWy1kdXJsb2ddO1xuXHRcdGlmICghbm90ZVN5bWJvbClcblx0XHRcdGNvbnNvbGUubG9nKFwibm90ZVN5bWJvbDpcIiwgc3R5bGUsIGR1cmxvZywgemVyb0R1cmF0aW9uKTtcblxuXHRcdC8vIGRldGVybWluZSBlbGVtZW50cyBvZiBjaG9yZHMgd2hpY2ggc2hvdWxkIGJlIHNoaWZ0ZWRcblx0XHR2YXIgcDtcblx0XHRmb3IgKHA9KGRpcj09PVwiZG93blwiKT9lbGVtLnBpdGNoZXMubGVuZ3RoLTI6MTsgKGRpcj09PVwiZG93blwiKT9wPj0wOnA8ZWxlbS5waXRjaGVzLmxlbmd0aDsgcD0oZGlyPT09XCJkb3duXCIpP3AtMTpwKzEpIHtcblx0XHRcdHZhciBwcmV2ID0gZWxlbS5waXRjaGVzWyhkaXI9PT1cImRvd25cIik/cCsxOnAtMV07XG5cdFx0XHR2YXIgY3VyciA9IGVsZW0ucGl0Y2hlc1twXTtcblx0XHRcdHZhciBkZWx0YSA9IChkaXI9PT1cImRvd25cIik/cHJldi5waXRjaC1jdXJyLnBpdGNoOmN1cnIucGl0Y2gtcHJldi5waXRjaDtcblx0XHRcdGlmIChkZWx0YTw9MSAmJiAhcHJldi5wcmludGVyX3NoaWZ0KSB7XG5cdFx0XHRcdGN1cnIucHJpbnRlcl9zaGlmdD0oZGVsdGEpP1wiZGlmZmVyZW50XCI6XCJzYW1lXCI7XG5cdFx0XHRcdGlmIChjdXJyLnZlcnRpY2FsUG9zID4gMTEgfHwgY3Vyci52ZXJ0aWNhbFBvcyA8IDEpIHsgICAgICAgIC8vIFBFUjogYWRkIGV4dHJhIGxlZGdlciBsaW5lXG5cdFx0XHRcdFx0YWRkaXRpb25hbExlZGdlcnMucHVzaChjdXJyLnZlcnRpY2FsUG9zIC0gKGN1cnIudmVydGljYWxQb3MlMikpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkaXI9PT1cImRvd25cIikge1xuXHRcdFx0XHRcdHJvb21UYWtlbiA9IGdseXBocy5nZXRTeW1ib2xXaWR0aChub3RlU3ltYm9sKSsyO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvdHNoaWZ0eCA9IGdseXBocy5nZXRTeW1ib2xXaWR0aChub3RlU3ltYm9sKSsyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIHBwID0gZWxlbS5waXRjaGVzLmxlbmd0aDtcblx0XHRmb3IgKHA9MDsgcDxlbGVtLnBpdGNoZXMubGVuZ3RoOyBwKyspIHtcblxuXHRcdFx0aWYgKCFub3N0ZW0pIHtcblx0XHRcdFx0dmFyIGZsYWc7XG5cdFx0XHRcdGlmICgoZGlyPT09XCJkb3duXCIgJiYgcCE9PTApIHx8IChkaXI9PT1cInVwXCIgJiYgcCE9PXBwLTEpKSB7IC8vIG5vdCB0aGUgc3RlbW1lZCBlbGVtIG9mIHRoZSBjaG9yZFxuXHRcdFx0XHRcdGZsYWcgPSBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZsYWcgPSBjaGFydGFibGVbKGRpcj09PVwiZG93blwiKT9cImRmbGFnc1wiOlwidWZsYWdzXCJdWy1kdXJsb2ddO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR2YXIgYztcblx0XHRcdGlmIChlbGVtLnBpdGNoZXNbcF0uc3R5bGUpIHsgLy8gVGhlcmUgaXMgYSBzdHlsZSBmb3IgdGhlIHdob2xlIGdyb3VwIG9mIHBpdGNoZXMsIGJ1dCB0aGVyZSBjb3VsZCBhbHNvIGJlIGFuIG92ZXJyaWRlIGZvciBhIHBhcnRpY3VsYXIgcGl0Y2guXG5cdFx0XHRcdGMgPSBjaGFydGFibGVbZWxlbS5waXRjaGVzW3BdLnN0eWxlXVstZHVybG9nXTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHRjID0gbm90ZVN5bWJvbDtcblx0XHRcdC8vIFRoZSBoaWdoZXN0IHBvc2l0aW9uIGZvciB0aGUgc2FrZSBvZiBwbGFjaW5nIHNsdXJzIGlzIGl0c2VsZiBpZiB0aGUgc2x1ciBpcyBpbnRlcm5hbC4gSXQgaXMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gcG9zc2libGUgaWYgdGhlIHNsdXIgaXMgZm9yIHRoZSB3aG9sZSBjaG9yZC5cblx0XHRcdC8vIElmIHRoZSBub3RlIGlzIHRoZSBvbmx5IG9uZSBpbiB0aGUgY2hvcmQsIHRoZW4gYW55IHNsdXIgaXQgaGFzIGNvdW50cyBhcyBpZiBpdCB3ZXJlIG9uIHRoZSB3aG9sZSBjaG9yZC5cblx0XHRcdGVsZW0ucGl0Y2hlc1twXS5oaWdoZXN0VmVydCA9IGVsZW0ucGl0Y2hlc1twXS52ZXJ0aWNhbFBvcztcblx0XHRcdHZhciBpc1RvcFdoZW5TdGVtSXNEb3duID0gKHN0ZW1kaXI9PT1cInVwXCIgfHwgZGlyPT09XCJ1cFwiKSAmJiBwPT09MDtcblx0XHRcdHZhciBpc0JvdHRvbVdoZW5TdGVtSXNVcCA9IChzdGVtZGlyPT09XCJkb3duXCIgfHwgZGlyPT09XCJkb3duXCIpICYmIHA9PT1wcC0xO1xuXHRcdFx0aWYgKGlzVG9wV2hlblN0ZW1Jc0Rvd24gfHwgaXNCb3R0b21XaGVuU3RlbUlzVXApIHsgLy8gcGxhY2UgdG8gcHV0IHNsdXJzIGlmIG5vdCBhbHJlYWR5IG9uIHBpdGNoZXNcblxuXHRcdFx0XHRpZiAoZWxlbS5zdGFydFNsdXIgfHwgcHAgPT09IDEpIHtcblx0XHRcdFx0XHRlbGVtLnBpdGNoZXNbcF0uaGlnaGVzdFZlcnQgPSBlbGVtLnBpdGNoZXNbcHAtMV0udmVydGljYWxQb3M7XG5cdFx0XHRcdFx0aWYgKGdldER1cmF0aW9uKGVsZW0pIDwgMSAmJiAoc3RlbWRpcj09PVwidXBcIiB8fCBkaXI9PT1cInVwXCIpKVxuXHRcdFx0XHRcdFx0ZWxlbS5waXRjaGVzW3BdLmhpZ2hlc3RWZXJ0ICs9IDY7ICAgICAgICAvLyBJZiB0aGUgc3RlbSBpcyB1cCwgdGhlbiBjb21wZW5zYXRlIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBzdGVtXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVsZW0uc3RhcnRTbHVyKSB7XG5cdFx0XHRcdFx0aWYgKCFlbGVtLnBpdGNoZXNbcF0uc3RhcnRTbHVyKSBlbGVtLnBpdGNoZXNbcF0uc3RhcnRTbHVyID0gW107IC8vVE9ETyBwb3NzaWJseSByZWR1bmRhbnQsIHByb3ZpZGVkIGFycmF5IGlzIG5vdCBvcHRpb25hbFxuXHRcdFx0XHRcdGZvciAoaT0wOyBpPGVsZW0uc3RhcnRTbHVyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhZGRJZk5vdEV4aXN0KGVsZW0ucGl0Y2hlc1twXS5zdGFydFNsdXIsIGVsZW0uc3RhcnRTbHVyW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZWxlbS5lbmRTbHVyKSB7XG5cdFx0XHRcdFx0ZWxlbS5waXRjaGVzW3BdLmhpZ2hlc3RWZXJ0ID0gZWxlbS5waXRjaGVzW3BwLTFdLnZlcnRpY2FsUG9zO1xuXHRcdFx0XHRcdGlmIChnZXREdXJhdGlvbihlbGVtKSA8IDEgJiYgKHN0ZW1kaXI9PT1cInVwXCIgfHwgZGlyPT09XCJ1cFwiKSlcblx0XHRcdFx0XHRcdGVsZW0ucGl0Y2hlc1twXS5oaWdoZXN0VmVydCArPSA2OyAgICAgICAgLy8gSWYgdGhlIHN0ZW0gaXMgdXAsIHRoZW4gY29tcGVuc2F0ZSBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgc3RlbVxuXHRcdFx0XHRcdGlmICghZWxlbS5waXRjaGVzW3BdLmVuZFNsdXIpIGVsZW0ucGl0Y2hlc1twXS5lbmRTbHVyID0gW107IC8vVE9ETyBwb3NzaWJseSByZWR1bmRhbnQsIHByb3ZpZGVkIGFycmF5IGlzIG5vdCBvcHRpb25hbFxuXHRcdFx0XHRcdGZvciAoaT0wOyBpPGVsZW0uZW5kU2x1ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0YWRkSWZOb3RFeGlzdChlbGVtLnBpdGNoZXNbcF0uZW5kU2x1ciwgZWxlbS5lbmRTbHVyW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGhhc1N0ZW0gPSAhbm9zdGVtICYmIGR1cmxvZzw9LTE7XG5cdFx0XHR2YXIgcmV0ID0gY3JlYXRlTm90ZUhlYWQoYWJzZWxlbSwgYywgZWxlbS5waXRjaGVzW3BdLCBkaXIsIDAsIC1yb29tVGFrZW4sIGZsYWcsIGRvdCwgZG90c2hpZnR4LCB0aGlzLnZvaWNlU2NhbGUsIGFjY2lkZW50YWxTbG90LCAhc3RlbWRpcik7XG5cdFx0XHRzeW1ib2xXaWR0aCA9IE1hdGgubWF4KGdseXBocy5nZXRTeW1ib2xXaWR0aChjKSwgc3ltYm9sV2lkdGgpO1xuXHRcdFx0YWJzZWxlbS5leHRyYXcgLT0gcmV0LmV4dHJhTGVmdDtcblx0XHRcdG5vdGVIZWFkID0gcmV0Lm5vdGVoZWFkO1xuXHRcdFx0aWYgKG5vdGVIZWFkKSB7XG5cdFx0XHRcdHRoaXMuYWRkU2x1cnNBbmRUaWVzKGFic2VsZW0sIGVsZW0ucGl0Y2hlc1twXSwgbm90ZUhlYWQsIHZvaWNlLCBoYXNTdGVtID8gZGlyIDogbnVsbCwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChlbGVtLmdyYWNlbm90ZXMgJiYgZWxlbS5ncmFjZW5vdGVzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0bm90ZUhlYWQuYm90dG9tID0gbm90ZUhlYWQuYm90dG9tIC0gMTtcdCAvLyBJZiB0aGVyZSBpcyBhIHRpZSB0byB0aGUgZ3JhY2Ugbm90ZXMsIGxlYXZlIGEgbGl0dGxlIG1vcmUgcm9vbSBmb3IgdGhlIG5vdGUgdG8gYXZvaWQgY29sbGlzaW9ucy5cblx0XHRcdFx0YWJzZWxlbS5hZGRIZWFkKG5vdGVIZWFkKTtcblx0XHRcdH1cblx0XHRcdHJvb21UYWtlbiArPSByZXQuYWNjaWRlbnRhbHNoaWZ0eDtcblx0XHRcdHJvb21UYWtlblJpZ2h0ID0gTWF0aC5tYXgocm9vbVRha2VuUmlnaHQscmV0LmRvdHNoaWZ0eCk7XG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyBzdGVtIGZyb20gdGhlIGZ1cnRoZXN0IG5vdGUgdG8gYSBwaXRjaCBhYm92ZS9iZWxvdyB0aGUgc3RlbW1lZCBub3RlXG5cdFx0aWYgKGhhc1N0ZW0pIHtcblx0XHRcdHZhciBzdGVtSGVpZ2h0ID0gNyAqIHRoaXMudm9pY2VTY2FsZTtcblx0XHRcdHZhciBwMSA9IChkaXI9PT1cImRvd25cIikgPyBlbGVtLm1pbnBpdGNoLXN0ZW1IZWlnaHQgOiBlbGVtLm1pbnBpdGNoKzEvMztcblx0XHRcdC8vIFBFUiBhZGRlZCBzdGVtZGlyIHRlc3QgdG8gbWFrZSB0aGUgbGluZSBtZWV0IHRoZSBub3RlLlxuXHRcdFx0aWYgKHAxPjYgJiYgIXN0ZW1kaXIpIHAxPTY7XG5cdFx0XHR2YXIgcDIgPSAoZGlyPT09XCJkb3duXCIpID8gZWxlbS5tYXhwaXRjaC0xLzMgOiBlbGVtLm1heHBpdGNoK3N0ZW1IZWlnaHQ7XG5cdFx0XHQvLyBQRVIgYWRkZWQgc3RlbWRpciB0ZXN0IHRvIG1ha2UgdGhlIGxpbmUgbWVldCB0aGUgbm90ZS5cblx0XHRcdGlmIChwMjw2ICYmICFzdGVtZGlyKSBwMj02O1xuXHRcdFx0dmFyIGR4ID0gKGRpcj09PVwiZG93blwiIHx8IGFic2VsZW0uaGVhZHMubGVuZ3RoID09PSAwKT8wOmFic2VsZW0uaGVhZHNbMF0udztcblx0XHRcdHZhciB3aWR0aCA9IChkaXI9PT1cImRvd25cIik/MTotMTtcblx0XHRcdC8vIFRPRE8tUEVSLUhBQ0s6IE9uZSB0eXBlIG9mIG5vdGUgaGVhZCBoYXMgYSBkaWZmZXJlbnQgcGxhY2VtZW50IG9mIHRoZSBzdGVtLiBUaGlzIHNob3VsZCBiZSBtb3JlIGdlbmVyaWNhbGx5IGNhbGN1bGF0ZWQ6XG5cdFx0XHRpZiAobm90ZUhlYWQuYyA9PT0gJ25vdGVoZWFkcy5zbGFzaC5xdWFydGVyJykge1xuXHRcdFx0XHRpZiAoZGlyID09PSAnZG93bicpXG5cdFx0XHRcdFx0cDIgLT0gMTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHAxICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRhYnNlbGVtLmFkZEV4dHJhKG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgZHgsIDAsIHAxLCB7XCJ0eXBlXCI6IFwic3RlbVwiLCBcInBpdGNoMlwiOnAyLCBsaW5ld2lkdGg6IHdpZHRofSkpO1xuXHRcdFx0Ly92YXIgUmVsYXRpdmVFbGVtZW50ID0gZnVuY3Rpb24gUmVsYXRpdmVFbGVtZW50KGMsIGR4LCB3LCBwaXRjaCwgb3B0KSB7XG5cdFx0XHRtaW4gPSBNYXRoLm1pbihwMSwgcDIpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBub3RlSGVhZDogbm90ZUhlYWQsIHJvb21UYWtlbjogcm9vbVRha2VuLCByb29tVGFrZW5SaWdodDogcm9vbVRha2VuUmlnaHQsIG1pbjogbWluLCBhZGRpdGlvbmFsTGVkZ2VyczogYWRkaXRpb25hbExlZGdlcnMsIGRpcjogZGlyLCBzeW1ib2xXaWR0aDogc3ltYm9sV2lkdGggfTtcblx0fTtcblxuXHRBYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5hZGRMeXJpYyA9IGZ1bmN0aW9uKGFic2VsZW0sIGVsZW0pIHtcblx0XHR2YXIgbHlyaWNTdHIgPSBcIlwiO1xuXHRcdHBhcnNlQ29tbW9uLmVhY2goZWxlbS5seXJpYywgZnVuY3Rpb24obHkpIHtcblx0XHRcdHZhciBkaXYgPSBseS5kaXZpZGVyID09PSAnICcgPyBcIlwiIDogbHkuZGl2aWRlcjtcblx0XHRcdGx5cmljU3RyICs9IGx5LnN5bGxhYmxlICsgZGl2ICsgXCJcXG5cIjtcblx0XHR9KTtcblx0XHR2YXIgbHlyaWNEaW0gPSB0aGlzLnJlbmRlcmVyLmdldFRleHRTaXplKGx5cmljU3RyLCAndm9jYWxmb250JywgXCJseXJpY1wiKTtcblx0XHR2YXIgcG9zaXRpb24gPSBlbGVtLnBvc2l0aW9uaW5nID8gZWxlbS5wb3NpdGlvbmluZy52b2NhbFBvc2l0aW9uIDogJ2JlbG93Jztcblx0XHRhYnNlbGVtLmFkZENlbnRlcmVkKG5ldyBSZWxhdGl2ZUVsZW1lbnQobHlyaWNTdHIsIDAsIGx5cmljRGltLndpZHRoLCB1bmRlZmluZWQsIHt0eXBlOlwibHlyaWNcIiwgcG9zaXRpb246IHBvc2l0aW9uLCBoZWlnaHQ6IGx5cmljRGltLmhlaWdodCAvIHNwYWNpbmcuU1RFUCB9KSk7XG5cdH07XG5cblx0QWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuYWRkQ2hvcmQgPSBmdW5jdGlvbihhYnNlbGVtLCBlbGVtLCByb29tVGFrZW4sIHJvb21UYWtlblJpZ2h0KSB7XG5cdFx0dmFyIGNob3JkTWFyZ2luID0gODsgLy8gSWYgdGhlcmUgYXJlIGNob3JkcyBuZXh0IHRvIGVhY2ggb3RoZXIsIHRoaXMgaXMgaG93IGNsb3NlIHRoZXkgY2FuIGdldC5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW0uY2hvcmQubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB4ID0gMDtcblx0XHRcdHZhciB5O1xuXHRcdFx0dmFyIGRpbSA9IHRoaXMucmVuZGVyZXIuZ2V0VGV4dFNpemUoZWxlbS5jaG9yZFtpXS5uYW1lLCAnYW5ub3RhdGlvbmZvbnQnLCBcImFubm90YXRpb25cIik7XG5cdFx0XHR2YXIgY2hvcmRXaWR0aCA9IGRpbS53aWR0aDtcblx0XHRcdHZhciBjaG9yZEhlaWdodCA9IGRpbS5oZWlnaHQgLyBzcGFjaW5nLlNURVA7XG5cdFx0XHRzd2l0Y2ggKGVsZW0uY2hvcmRbaV0ucG9zaXRpb24pIHtcblx0XHRcdFx0Y2FzZSBcImxlZnRcIjpcblx0XHRcdFx0XHRyb29tVGFrZW4rPWNob3JkV2lkdGgrNztcblx0XHRcdFx0XHR4ID0gLXJvb21UYWtlbjsgICAgICAgIC8vIFRPRE8tUEVSOiBUaGlzIGlzIGp1c3QgYSBndWVzcyBmcm9tIHRyaWFsIGFuZCBlcnJvclxuXHRcdFx0XHRcdHkgPSBlbGVtLmF2ZXJhZ2VwaXRjaDtcblx0XHRcdFx0XHRhYnNlbGVtLmFkZEV4dHJhKG5ldyBSZWxhdGl2ZUVsZW1lbnQoZWxlbS5jaG9yZFtpXS5uYW1lLCB4LCBjaG9yZFdpZHRoKzQsIHksIHt0eXBlOlwidGV4dFwiLCBoZWlnaHQ6IGNob3JkSGVpZ2h0fSkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmlnaHRcIjpcblx0XHRcdFx0XHRyb29tVGFrZW5SaWdodCs9NDtcblx0XHRcdFx0XHR4ID0gcm9vbVRha2VuUmlnaHQ7Ly8gVE9ETy1QRVI6IFRoaXMgaXMganVzdCBhIGd1ZXNzIGZyb20gdHJpYWwgYW5kIGVycm9yXG5cdFx0XHRcdFx0eSA9IGVsZW0uYXZlcmFnZXBpdGNoO1xuXHRcdFx0XHRcdGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChlbGVtLmNob3JkW2ldLm5hbWUsIHgsIGNob3JkV2lkdGgrNCwgeSwge3R5cGU6XCJ0ZXh0XCIsIGhlaWdodDogY2hvcmRIZWlnaHR9KSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJiZWxvd1wiOlxuXHRcdFx0XHRcdC8vIHNldHRpbmcgdGhlIHktY29vcmRpbmF0ZSB0byB1bmRlZmluZWQgZm9yIG5vdzogaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciBvbiwgYWZ0ZXIgd2UgZmlndXJlIG91dCB3aGF0IHRoZSBoaWdoZXN0IGVsZW1lbnQgb24gdGhlIGxpbmUgaXMuXG5cdFx0XHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KGVsZW0uY2hvcmRbaV0ubmFtZSwgMCwgY2hvcmRXaWR0aCtjaG9yZE1hcmdpbiwgdW5kZWZpbmVkLCB7dHlwZTogXCJ0ZXh0XCIsIHBvc2l0aW9uOiBcImJlbG93XCIsIGhlaWdodDogY2hvcmRIZWlnaHR9KSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJhYm92ZVwiOlxuXHRcdFx0XHRcdC8vIHNldHRpbmcgdGhlIHktY29vcmRpbmF0ZSB0byB1bmRlZmluZWQgZm9yIG5vdzogaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciBvbiwgYWZ0ZXIgd2UgZmlndXJlIG91dCB3aGF0IHRoZSBoaWdoZXN0IGVsZW1lbnQgb24gdGhlIGxpbmUgaXMuXG5cdFx0XHRcdFx0YWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KGVsZW0uY2hvcmRbaV0ubmFtZSwgMCwgY2hvcmRXaWR0aCtjaG9yZE1hcmdpbiwgdW5kZWZpbmVkLCB7dHlwZTogXCJ0ZXh0XCIsIGhlaWdodDogY2hvcmRIZWlnaHR9KSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYgKGVsZW0uY2hvcmRbaV0ucmVsX3Bvc2l0aW9uKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVsUG9zaXRpb25ZID0gZWxlbS5jaG9yZFtpXS5yZWxfcG9zaXRpb24ueSArIDMqc3BhY2luZy5TVEVQOyAvLyBUT0RPLVBFUjogdGhpcyBpcyBhIGZ1ZGdlIGZhY3RvciB0byBtYWtlIGl0IGxpbmUgdXAgd2l0aCBhYmNtMnBzXG5cdFx0XHRcdFx0XHRhYnNlbGVtLmFkZENoaWxkKG5ldyBSZWxhdGl2ZUVsZW1lbnQoZWxlbS5jaG9yZFtpXS5uYW1lLCB4ICsgZWxlbS5jaG9yZFtpXS5yZWxfcG9zaXRpb24ueCwgMCwgZWxlbS5taW5waXRjaCArIHJlbFBvc2l0aW9uWSAvIHNwYWNpbmcuU1RFUCwge3R5cGU6IFwidGV4dFwiLCBoZWlnaHQ6IGNob3JkSGVpZ2h0fSkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBzZXR0aW5nIHRoZSB5LWNvb3JkaW5hdGUgdG8gdW5kZWZpbmVkIGZvciBub3c6IGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIgb24sIGFmdGVyIHdlIGZpZ3VyZSBvdXQgd2hhdCB0aGUgaGlnaGVzdCBlbGVtZW50IG9uIHRoZSBsaW5lIGlzLlxuXHRcdFx0XHRcdFx0dmFyIHBvczIgPSAnYWJvdmUnO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW0ucG9zaXRpb25pbmcgJiYgZWxlbS5wb3NpdGlvbmluZy5jaG9yZFBvc2l0aW9uKVxuXHRcdFx0XHRcdFx0XHRwb3MyID0gZWxlbS5wb3NpdGlvbmluZy5jaG9yZFBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0XHRkaW0gPSB0aGlzLnJlbmRlcmVyLmdldFRleHRTaXplKGVsZW0uY2hvcmRbaV0ubmFtZSwgJ2djaG9yZGZvbnQnLCBcImNob3JkXCIpO1xuXHRcdFx0XHRcdFx0Y2hvcmRIZWlnaHQgPSBkaW0uaGVpZ2h0IC8gc3BhY2luZy5TVEVQO1xuXHRcdFx0XHRcdFx0Y2hvcmRXaWR0aCA9IGRpbS53aWR0aDsgLy8gU2luY2UgdGhlIGNob3JkIGlzIGNlbnRlcmVkLCB3ZSBvbmx5IHVzZSBoYWxmIHRoZSB3aWR0aC5cblx0XHRcdFx0XHRcdGFic2VsZW0uYWRkQ2VudGVyZWQobmV3IFJlbGF0aXZlRWxlbWVudChlbGVtLmNob3JkW2ldLm5hbWUsIHgsIGNob3JkV2lkdGgsIHVuZGVmaW5lZCwge3R5cGU6IFwiY2hvcmRcIiwgcG9zaXRpb246IHBvczIsIGhlaWdodDogY2hvcmRIZWlnaHQgfSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHsgcm9vbVRha2VuOiByb29tVGFrZW4sIHJvb21UYWtlblJpZ2h0OiByb29tVGFrZW5SaWdodCB9O1xuXHR9O1xuXG5BYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5jcmVhdGVOb3RlID0gZnVuY3Rpb24oZWxlbSwgbm9zdGVtLCBpc1NpbmdsZUxpbmVTdGFmZiwgdm9pY2UpIHsgLy9zdGVtIHByZXNlbmNlOiB0cnVlIGZvciBkcmF3aW5nIHN0ZW1sZXNzIG5vdGVoZWFkXG4gIHZhciBub3RlaGVhZCA9IG51bGw7XG4gIHZhciByb29tdGFrZW4gPSAwOyAvLyByb29tIG5lZWRlZCB0byB0aGUgbGVmdCBvZiB0aGUgbm90ZVxuICB2YXIgcm9vbXRha2VucmlnaHQgPSAwOyAvLyByb29tIG5lZWRlZCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vdGVcbiAgdmFyIHN5bWJvbFdpZHRoID0gMDtcbiAgdmFyIGFkZGl0aW9uYWxMZWRnZXJzID0gW107IC8vIFBFUjogaGFuZGxlIHRoZSBjYXNlIG9mIFtiYyddLCB3aGVyZSB0aGUgYiBkb2Vzbid0IGhhdmUgYSBsZWRnZXIgbGluZVxuXG4gIHZhciBpO1xuICB2YXIgZGlyO1xuXG5cdHZhciBkdXJhdGlvbiA9IGdldER1cmF0aW9uKGVsZW0pO1xuXHR2YXIgemVyb0R1cmF0aW9uID0gZmFsc2U7XG4gIGlmIChkdXJhdGlvbiA9PT0gMCkgeyB6ZXJvRHVyYXRpb24gPSB0cnVlOyBkdXJhdGlvbiA9IDAuMjU7IG5vc3RlbSA9IHRydWU7IH0gICAgICAgIC8vUEVSOiB6ZXJvIGR1cmF0aW9uIHdpbGwgZHJhdyBhIHF1YXJ0ZXIgbm90ZSBoZWFkLlxuICB2YXIgZHVybG9nID0gTWF0aC5mbG9vcihNYXRoLmxvZyhkdXJhdGlvbikvTWF0aC5sb2coMikpOyAvL1RPRE8gdXNlIGdldER1cmxvZ1xuICB2YXIgZG90PTA7XG5cbiAgZm9yICh2YXIgdG90ID0gTWF0aC5wb3coMixkdXJsb2cpLCBpbmM9dG90LzI7IHRvdDxkdXJhdGlvbjsgZG90KyssdG90Kz1pbmMsaW5jLz0yKTtcblxuXG5cdGlmIChlbGVtLnN0YXJ0VHJpcGxldCkge1xuXHRcdHRoaXMudHJpcGxldG11bHRpcGxpZXIgPSBlbGVtLnRyaXBsZXRNdWx0aXBsaWVyO1xuXHR9XG5cbiAgdmFyIGR1cmF0aW9uRm9yU3BhY2luZyA9IGR1cmF0aW9uICogdGhpcy50cmlwbGV0bXVsdGlwbGllcjtcbiAgaWYgKGVsZW0ucmVzdCAmJiBlbGVtLnJlc3QudHlwZSA9PT0gJ211bHRpbWVhc3VyZScpXG4gIFx0ZHVyYXRpb25Gb3JTcGFjaW5nID0gMTtcbiAgdmFyIGFic1R5cGUgPSBlbGVtLnJlc3QgPyBcInJlc3RcIiA6IFwibm90ZVwiO1xuICB2YXIgYWJzZWxlbSA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQoZWxlbSwgZHVyYXRpb25Gb3JTcGFjaW5nLCAxLCBhYnNUeXBlLCB0aGlzLnR1bmVOdW1iZXIsIHsgZHVyYXRpb25DbGFzc092ZXJpZGU6IGVsZW0uZHVyYXRpb24gKiB0aGlzLnRyaXBsZXRtdWx0aXBsaWVyfSk7XG4gIGlmIChoaW50KSBhYnNlbGVtLnNldEhpbnQoKTtcblxuICBpZiAoZWxlbS5yZXN0KSB7XG4gIFx0aWYgKHRoaXMubWVhc3VyZUxlbmd0aCA9PT0gZHVyYXRpb24gJiYgZWxlbS5yZXN0LnR5cGUgIT09ICdpbnZpc2libGUnICYmIGVsZW0ucmVzdC50eXBlICE9PSAnc3BhY2VyJylcblx0ICAgIGVsZW0ucmVzdC50eXBlID0gJ3dob2xlJzsgLy8gSWYgdGhlIHJlc3QgaXMgZXhhY3RseSBhIG1lYXN1cmUsIGFsd2F5cyB1c2UgYSB3aG9sZSByZXN0XG5cdCAgdmFyIHJldDEgPSBhZGRSZXN0VG9BYnNFbGVtZW50KGFic2VsZW0sIGVsZW0sIGR1cmF0aW9uLCBkb3QsIHZvaWNlLnZvaWNldG90YWwgPiAxLCB0aGlzLnN0ZW1kaXIsIGlzU2luZ2xlTGluZVN0YWZmLCBkdXJsb2csIHRoaXMudm9pY2VTY2FsZSk7XG5cdCAgbm90ZWhlYWQgPSByZXQxLm5vdGVIZWFkO1xuXHQgIHJvb210YWtlbiA9IHJldDEucm9vbVRha2VuO1xuXHQgIHJvb210YWtlbnJpZ2h0ID0gcmV0MS5yb29tVGFrZW5SaWdodDtcbiAgfSBlbHNlIHtcblx0ICB2YXIgcmV0MiA9IHRoaXMuYWRkTm90ZVRvQWJjRWxlbWVudChhYnNlbGVtLCBlbGVtLCBkb3QsIHRoaXMuc3RlbWRpciwgdGhpcy5zdHlsZSwgemVyb0R1cmF0aW9uLCBkdXJsb2csIG5vc3RlbSwgdm9pY2UpO1xuXHQgIGlmIChyZXQyLm1pbiAhPT0gdW5kZWZpbmVkKVxuXHRcdCAgdGhpcy5taW5ZID0gTWF0aC5taW4ocmV0Mi5taW4sIHRoaXMubWluWSk7XG5cdCAgbm90ZWhlYWQgPSByZXQyLm5vdGVIZWFkO1xuXHQgIHJvb210YWtlbiA9IHJldDIucm9vbVRha2VuO1xuXHQgIHJvb210YWtlbnJpZ2h0ID0gcmV0Mi5yb29tVGFrZW5SaWdodDtcblx0ICBhZGRpdGlvbmFsTGVkZ2VycyA9IHJldDIuYWRkaXRpb25hbExlZGdlcnM7XG5cdCAgZGlyID0gcmV0Mi5kaXI7XG5cdCAgc3ltYm9sV2lkdGggPSByZXQyLnN5bWJvbFdpZHRoO1xuICB9XG5cbiAgaWYgKGVsZW0ubHlyaWMgIT09IHVuZGVmaW5lZCkge1xuICBcdHRoaXMuYWRkTHlyaWMoYWJzZWxlbSwgZWxlbSk7XG4gIH1cblxuICBpZiAoZWxlbS5ncmFjZW5vdGVzICE9PSB1bmRlZmluZWQpIHtcblx0cm9vbXRha2VuICs9IHRoaXMuYWRkR3JhY2VOb3RlcyhlbGVtLCB2b2ljZSwgYWJzZWxlbSwgbm90ZWhlYWQsIHRoaXMuc3RlbUhlaWdodCAqIHRoaXMudm9pY2VTY2FsZSwgdGhpcy5pc0JhZ3BpcGVzLCByb29tdGFrZW4pO1xuICB9XG5cbiAgaWYgKGVsZW0uZGVjb3JhdGlvbikge1xuXHQgIHRoaXMuZGVjb3JhdGlvbi5jcmVhdGVEZWNvcmF0aW9uKHZvaWNlLCBlbGVtLmRlY29yYXRpb24sIGFic2VsZW0udG9wLCAobm90ZWhlYWQpP25vdGVoZWFkLnc6MCwgYWJzZWxlbSwgcm9vbXRha2VuLCBkaXIsIGFic2VsZW0uYm90dG9tLCBlbGVtLnBvc2l0aW9uaW5nLCB0aGlzLmhhc1ZvY2Fscyk7XG4gIH1cblxuICBpZiAoZWxlbS5iYXJOdW1iZXIpIHtcbiAgICBhYnNlbGVtLmFkZENoaWxkKG5ldyBSZWxhdGl2ZUVsZW1lbnQoZWxlbS5iYXJOdW1iZXIsIC0xMCwgMCwgMCwge3R5cGU6XCJiYXJOdW1iZXJcIn0pKTtcbiAgfVxuXG4gIC8vIGxlZGdlciBsaW5lc1xuXHRsZWRnZXJMaW5lcyhhYnNlbGVtLCBlbGVtLm1pbnBpdGNoLCBlbGVtLm1heHBpdGNoLCBlbGVtLnJlc3QsIHN5bWJvbFdpZHRoLCBhZGRpdGlvbmFsTGVkZ2VycywgZGlyLCAtMiwgMSk7XG5cbiAgaWYgKGVsZW0uY2hvcmQgIT09IHVuZGVmaW5lZCkge1xuICBcdHZhciByZXQzID0gdGhpcy5hZGRDaG9yZChhYnNlbGVtLCBlbGVtLCByb29tdGFrZW4sIHJvb210YWtlbnJpZ2h0KTtcblx0ICByb29tdGFrZW4gPSByZXQzLnJvb21UYWtlbjtcblx0ICByb29tdGFrZW5yaWdodCA9IHJldDMucm9vbVRha2VuUmlnaHQ7XG4gIH1cblxuXG4gIGlmIChlbGVtLnN0YXJ0VHJpcGxldCkge1xuICAgIHRoaXMudHJpcGxldCA9IG5ldyBUcmlwbGV0RWxlbShlbGVtLnN0YXJ0VHJpcGxldCwgbm90ZWhlYWQsIHsgZmxhdEJlYW1zOiB0aGlzLmZsYXRCZWFtcyB9KTsgLy8gYWJvdmUgaXMgb3Bwb3NpdGUgZnJvbSBjYXNlIG9mIHNsdXJzXG4gIH1cblxuICBpZiAoZWxlbS5lbmRUcmlwbGV0ICYmIHRoaXMudHJpcGxldCkge1xuICAgIHRoaXMudHJpcGxldC5zZXRDbG9zZUFuY2hvcihub3RlaGVhZCk7XG4gIH1cblxuICBpZiAodGhpcy50cmlwbGV0ICYmICFlbGVtLnN0YXJ0VHJpcGxldCAmJiAhZWxlbS5lbmRUcmlwbGV0KSB7XG4gIFx0dGhpcy50cmlwbGV0Lm1pZGRsZU5vdGUobm90ZWhlYWQpO1xuICB9XG5cblxuICByZXR1cm4gYWJzZWxlbTtcbn07XG5cblxuXG5cbnZhciBjcmVhdGVOb3RlSGVhZCA9IGZ1bmN0aW9uKGFic2VsZW0sIGMsIHBpdGNoZWxlbSwgZGlyLCBoZWFkeCwgZXh0cmF4LCBmbGFnLCBkb3QsIGRvdHNoaWZ0eCwgc2NhbGUsIGFjY2lkZW50YWxTbG90LCBzaG91bGRFeHRlbmRTdGVtKSB7XG4gIC8vIFRPRE8gc2NhbGUgdGhlIGRvdCBhcyB3ZWxsXG4gIHZhciBwaXRjaCA9IHBpdGNoZWxlbS52ZXJ0aWNhbFBvcztcbiAgdmFyIG5vdGVoZWFkO1xuICB2YXIgaTtcbiAgdmFyIGFjY2lkZW50YWxzaGlmdHggPSAwO1xuICB2YXIgbmV3RG90U2hpZnRYID0gMDtcbiAgdmFyIGV4dHJhTGVmdCA9IDA7XG4gIGlmIChjID09PSB1bmRlZmluZWQpXG4gICAgYWJzZWxlbS5hZGRDaGlsZChuZXcgUmVsYXRpdmVFbGVtZW50KFwicGl0Y2ggaXMgdW5kZWZpbmVkXCIsIDAsIDAsIDAsIHt0eXBlOlwiZGVidWdcIn0pKTtcbiAgZWxzZSBpZiAoYz09PVwiXCIpIHtcbiAgICBub3RlaGVhZCA9IG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgMCwgMCwgcGl0Y2gpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzaGlmdGhlYWR4ID0gaGVhZHg7XG4gICAgaWYgKHBpdGNoZWxlbS5wcmludGVyX3NoaWZ0KSB7XG4gICAgICB2YXIgYWRqdXN0ID0gKHBpdGNoZWxlbS5wcmludGVyX3NoaWZ0PT09XCJzYW1lXCIpPzE6MDtcbiAgICAgIHNoaWZ0aGVhZHggPSAoZGlyPT09XCJkb3duXCIpPy1nbHlwaHMuZ2V0U3ltYm9sV2lkdGgoYykqc2NhbGUrYWRqdXN0OmdseXBocy5nZXRTeW1ib2xXaWR0aChjKSpzY2FsZS1hZGp1c3Q7XG4gICAgfVxuXHQgIHZhciBvcHRzID0ge3NjYWxleDpzY2FsZSwgc2NhbGV5OiBzY2FsZSwgdGhpY2tuZXNzOiBnbHlwaHMuc3ltYm9sSGVpZ2h0SW5QaXRjaGVzKGMpKnNjYWxlIH07XG4gICAgbm90ZWhlYWQgPSBuZXcgUmVsYXRpdmVFbGVtZW50KGMsIHNoaWZ0aGVhZHgsIGdseXBocy5nZXRTeW1ib2xXaWR0aChjKSpzY2FsZSwgcGl0Y2gsIG9wdHMpO1xuICAgIG5vdGVoZWFkLnN0ZW1EaXIgPSBkaXI7XG4gICAgaWYgKGZsYWcpIHtcbiAgICAgIHZhciBwb3MgPSBwaXRjaCsoKGRpcj09PVwiZG93blwiKT8tNzo3KSpzY2FsZTtcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSByZWd1bGFyIG5vdGUsIChub3QgZ3JhY2Ugb3IgdGVtcG8gaW5kaWNhdG9yKSB0aGVuIHRoZSBzdGVtIHdpbGwgaGF2ZSBiZWVuIHN0cmV0Y2hlZCB0byB0aGUgbWlkZGxlIGxpbmUgaWYgaXQgaXMgZmFyIGZyb20gdGhlIGNlbnRlci5cblx0ICAgIGlmIChzaG91bGRFeHRlbmRTdGVtKSB7XG5cdCAgICBcdGlmIChkaXI9PT1cImRvd25cIiAmJiBwb3MgPiA2KVxuXHQgICAgXHRcdHBvcyA9IDY7XG5cdCAgICBcdGlmIChkaXI9PT1cInVwXCIgJiYgcG9zIDwgNilcblx0ICAgIFx0XHRwb3MgPSA2O1xuXHQgICAgfVxuICAgICAgLy9pZiAoc2NhbGU9PT0xICYmIChkaXI9PT1cImRvd25cIik/KHBvcz42KToocG9zPDYpKSBwb3M9NjtcbiAgICAgIHZhciB4ZGVsdGEgPSAoZGlyPT09XCJkb3duXCIpP2hlYWR4OmhlYWR4K25vdGVoZWFkLnctMC42O1xuICAgICAgYWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KGZsYWcsIHhkZWx0YSwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKGZsYWcpKnNjYWxlLCBwb3MsIHtzY2FsZXg6c2NhbGUsIHNjYWxleTogc2NhbGV9KSk7XG4gICAgfVxuXHQgIG5ld0RvdFNoaWZ0WCA9IG5vdGVoZWFkLncrZG90c2hpZnR4LTIrNSpkb3Q7XG4gICAgZm9yICg7ZG90PjA7ZG90LS0pIHtcbiAgICAgIHZhciBkb3RhZGp1c3R5ID0gKDEtTWF0aC5hYnMocGl0Y2gpJTIpOyAvL1BFUjogdGFrZSBhYnMgdmFsdWUgb2YgdGhlIHBpdGNoLiBBbmQgdGhlIHNoaWZ0IHN0aWxsIGhhcHBlbnMgb24gbGVkZ2VyIGxpbmVzLlxuICAgICAgYWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KFwiZG90cy5kb3RcIiwgbm90ZWhlYWQudytkb3RzaGlmdHgtMis1KmRvdCwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKFwiZG90cy5kb3RcIiksIHBpdGNoK2RvdGFkanVzdHkpKTtcbiAgICB9XG4gIH1cbiAgICAgICAgaWYgKG5vdGVoZWFkKVxuICAgICAgICAgICAgICAgIG5vdGVoZWFkLmhpZ2hlc3RWZXJ0ID0gcGl0Y2hlbGVtLmhpZ2hlc3RWZXJ0O1xuXG4gIGlmIChwaXRjaGVsZW0uYWNjaWRlbnRhbCkge1xuICAgIHZhciBzeW1iO1xuICAgIHN3aXRjaCAocGl0Y2hlbGVtLmFjY2lkZW50YWwpIHtcbiAgICBjYXNlIFwicXVhcnRlcnNoYXJwXCI6XG4gICAgICBzeW1iID0gXCJhY2NpZGVudGFscy5oYWxmc2hhcnBcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRibHNoYXJwXCI6XG4gICAgICBzeW1iID0gXCJhY2NpZGVudGFscy5kYmxzaGFycFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInNoYXJwXCI6XG4gICAgICBzeW1iID0gXCJhY2NpZGVudGFscy5zaGFycFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInF1YXJ0ZXJmbGF0XCI6XG4gICAgICBzeW1iID0gXCJhY2NpZGVudGFscy5oYWxmZmxhdFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImZsYXRcIjpcbiAgICAgIHN5bWIgPSBcImFjY2lkZW50YWxzLmZsYXRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkYmxmbGF0XCI6XG4gICAgICBzeW1iID0gXCJhY2NpZGVudGFscy5kYmxmbGF0XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmF0dXJhbFwiOlxuICAgICAgc3ltYiA9IFwiYWNjaWRlbnRhbHMubmF0XCI7XG4gICAgfVxuICAgICAgICAgLy8gaWYgYSBub3RlIGlzIGF0IGxlYXN0IGEgc2l4dGggYXdheSwgaXQgY2FuIHNoYXJlIGEgc2xvdCB3aXRoIGFub3RoZXIgYWNjaWRlbnRhbFxuICAgICAgICAgdmFyIGFjY1Nsb3RGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgdmFyIGFjY1BsYWNlID0gZXh0cmF4O1xuICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhY2NpZGVudGFsU2xvdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICBpZiAocGl0Y2ggLSBhY2NpZGVudGFsU2xvdFtqXVswXSA+PSA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYWNjaWRlbnRhbFNsb3Rbal1bMF0gPSBwaXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhY2NQbGFjZSA9IGFjY2lkZW50YWxTbG90W2pdWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGFjY1Nsb3RGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChhY2NTbG90Rm91bmQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgIGFjY1BsYWNlIC09IChnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoc3ltYikqc2NhbGUrMik7XG4gICAgICAgICAgICAgICAgIGFjY2lkZW50YWxTbG90LnB1c2goW3BpdGNoLGFjY1BsYWNlXSk7XG4gICAgICAgICAgICAgICAgIGFjY2lkZW50YWxzaGlmdHggPSAoZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWIpKnNjYWxlKzIpO1xuICAgICAgICAgfVxuICAgIGFic2VsZW0uYWRkRXh0cmEobmV3IFJlbGF0aXZlRWxlbWVudChzeW1iLCBhY2NQbGFjZSwgZ2x5cGhzLmdldFN5bWJvbFdpZHRoKHN5bWIpLCBwaXRjaCwge3NjYWxleDpzY2FsZSwgc2NhbGV5OiBzY2FsZX0pKTtcblx0ICBleHRyYUxlZnQgPSBnbHlwaHMuZ2V0U3ltYm9sV2lkdGgoc3ltYikgLyAyOyAvLyBUT0RPLVBFUjogV2UgbmVlZCBhIGxpdHRsZSBleHRyYSB3aWR0aCBpZiB0aGVyZSBpcyBhbiBhY2NpZGVudGFsLCBidXQgSSdtIG5vdCBzdXJlIHdoeSBpdCBpc24ndCB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgYWNjaWRlbnRhbC5cbiAgfVxuXG4gIHJldHVybiB7IG5vdGVoZWFkOiBub3RlaGVhZCwgYWNjaWRlbnRhbHNoaWZ0eDogYWNjaWRlbnRhbHNoaWZ0eCwgZG90c2hpZnR4OiBuZXdEb3RTaGlmdFgsIGV4dHJhTGVmdDogZXh0cmFMZWZ0IH07XG5cbn07XG5cblx0QWJzdHJhY3RFbmdyYXZlci5wcm90b3R5cGUuYWRkU2x1cnNBbmRUaWVzID0gZnVuY3Rpb24oYWJzZWxlbSwgcGl0Y2hlbGVtLCBub3RlaGVhZCwgdm9pY2UsIGRpciwgaXNHcmFjZSkge1xuXHRcdGlmIChwaXRjaGVsZW0uZW5kVGllKSB7XG5cdFx0XHRpZiAodGhpcy50aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG9wZW4gdGllcywgZmluZCB0aGUgb25lIHRoYXQgYXBwbGllcyBieSBtYXRjaGluZyB0aGUgcGl0Y2gsIGlmIHBvc3NpYmxlLlxuXHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnRpZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRpZiAodGhpcy50aWVzW2pdLmFuY2hvcjEgJiYgdGhpcy50aWVzW2pdLmFuY2hvcjEucGl0Y2ggPT09IG5vdGVoZWFkLnBpdGNoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRpZXNbal0uc2V0RW5kQW5jaG9yKG5vdGVoZWFkKTtcblx0XHRcdFx0XHRcdHRoaXMudGllcy5zcGxpY2UoaiwgMSk7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdHRoaXMudGllc1swXS5zZXRFbmRBbmNob3Iobm90ZWhlYWQpO1xuXHRcdFx0XHRcdHRoaXMudGllcy5zcGxpY2UoMCwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgdm9pY2VOdW1iZXIgPSB2b2ljZS52b2ljZXRvdGFsIDwgMiA/IC0xIDogdm9pY2Uudm9pY2VudW1iZXI7XG5cdFx0aWYgKHBpdGNoZWxlbS5zdGFydFRpZSkge1xuXHRcdFx0dmFyIHRpZSA9IG5ldyBUaWVFbGVtKHsgYW5jaG9yMTogbm90ZWhlYWQsIGZvcmNlOiAodGhpcy5zdGVtZGlyPT09XCJkb3duXCIgfHwgdGhpcy5zdGVtZGlyPT09XCJ1cFwiKSwgc3RlbURpcjogdGhpcy5zdGVtZGlyLCBpc0dyYWNlOiBpc0dyYWNlLCB2b2ljZU51bWJlcjogdm9pY2VOdW1iZXJ9KTtcblx0XHRcdGlmIChoaW50KSB0aWUuc2V0SGludCgpO1xuXG5cdFx0XHR0aGlzLnRpZXNbdGhpcy50aWVzLmxlbmd0aF09dGllO1xuXHRcdFx0dm9pY2UuYWRkT3RoZXIodGllKTtcblx0XHRcdC8vIEhBQ0stUEVSOiBGb3IgdGhlIGFuaW1hdGlvbiwgd2UgbmVlZCB0byBrbm93IGlmIGEgbm90ZSBpcyB0aWVkIHRvIHRoZSBuZXh0IG9uZSwgc28gaGVyZSdzIGEgZmxhZy5cblx0XHRcdC8vIFVuZm9ydHVuYXRlbHksIG9ubHkgc29tZSBvZiB0aGUgbm90ZXMgaW4gdGhlIGN1cnJlbnQgZXZlbnQgbWlnaHQgYmUgdGllZCwgYnV0IHRoaXMgd2lsbCBjb25zaWRlciBpdFxuXHRcdFx0Ly8gdGllZCBpZiBhbnkgb25lIG9mIHRoZW0gaXMuIFRoYXQgd2lsbCB3b3JrIGZvciBtb3N0IGNhc2VzLlxuXHRcdFx0YWJzZWxlbS5zdGFydFRpZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHBpdGNoZWxlbS5lbmRTbHVyKSB7XG5cdFx0XHRmb3IgKHZhciBpPTA7IGk8cGl0Y2hlbGVtLmVuZFNsdXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHNsdXJpZCA9IHBpdGNoZWxlbS5lbmRTbHVyW2ldO1xuXHRcdFx0XHR2YXIgc2x1cjtcblx0XHRcdFx0aWYgKHRoaXMuc2x1cnNbc2x1cmlkXSkge1xuXHRcdFx0XHRcdHNsdXIgPSB0aGlzLnNsdXJzW3NsdXJpZF07XG5cdFx0XHRcdFx0c2x1ci5zZXRFbmRBbmNob3Iobm90ZWhlYWQpO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnNsdXJzW3NsdXJpZF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2x1ciA9IG5ldyBUaWVFbGVtKHsgYW5jaG9yMjogbm90ZWhlYWQsIHN0ZW1EaXI6IHRoaXMuc3RlbWRpciwgdm9pY2VOdW1iZXI6IHZvaWNlTnVtYmVyfSk7XG5cdFx0XHRcdFx0aWYgKGhpbnQpIHNsdXIuc2V0SGludCgpO1xuXHRcdFx0XHRcdHZvaWNlLmFkZE90aGVyKHNsdXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLnN0YXJ0bGltaXRlbGVtKSB7XG5cdFx0XHRcdFx0c2x1ci5zZXRTdGFydFgodGhpcy5zdGFydGxpbWl0ZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFpc0dyYWNlKSB7XG5cdFx0XHRmb3IgKHZhciBzIGluIHRoaXMuc2x1cnMpIHtcblx0XHRcdFx0aWYgKHRoaXMuc2x1cnMuaGFzT3duUHJvcGVydHkocykpIHtcblx0XHRcdFx0XHR0aGlzLnNsdXJzW3NdLmFkZEludGVybmFsTm90ZShub3RlaGVhZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocGl0Y2hlbGVtLnN0YXJ0U2x1cikge1xuXHRcdFx0Zm9yIChpPTA7IGk8cGl0Y2hlbGVtLnN0YXJ0U2x1ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgc2x1cmlkID0gcGl0Y2hlbGVtLnN0YXJ0U2x1cltpXS5sYWJlbDtcblx0XHRcdFx0dmFyIHNsdXIgPSBuZXcgVGllRWxlbSh7IGFuY2hvcjE6IG5vdGVoZWFkLCBzdGVtRGlyOiB0aGlzLnN0ZW1kaXIsIHZvaWNlTnVtYmVyOiB2b2ljZU51bWJlcn0pO1xuXHRcdFx0XHRpZiAoaGludCkgc2x1ci5zZXRIaW50KCk7XG5cdFx0XHRcdHRoaXMuc2x1cnNbc2x1cmlkXT1zbHVyO1xuXHRcdFx0XHR2b2ljZS5hZGRPdGhlcihzbHVyKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cbkFic3RyYWN0RW5ncmF2ZXIucHJvdG90eXBlLmFkZE1lYXN1cmVOdW1iZXIgPSBmdW5jdGlvbiAobnVtYmVyLCBhYnNlbGVtKSB7XG5cdHZhciBtZWFzdXJlTnVtSGVpZ2h0ID0gdGhpcy5yZW5kZXJlci5nZXRUZXh0U2l6ZShudW1iZXIsIFwibWVhc3VyZWZvbnRcIiwgJ2Jhci1udW1iZXInKTtcblx0YWJzZWxlbS5hZGRDaGlsZChuZXcgUmVsYXRpdmVFbGVtZW50KG51bWJlciwgMCwgMCwgMTErbWVhc3VyZU51bUhlaWdodC5oZWlnaHQgLyBzcGFjaW5nLlNURVAsIHt0eXBlOlwiYmFyTnVtYmVyXCJ9KSk7XG59O1xuXG5BYnN0cmFjdEVuZ3JhdmVyLnByb3RvdHlwZS5jcmVhdGVCYXJMaW5lID0gZnVuY3Rpb24gKHZvaWNlLCBlbGVtLCBpc0ZpcnN0U3RhZmYpIHtcbi8vIGJhcl90aGluLCBiYXJfdGhpbl90aGljaywgYmFyX3RoaW5fdGhpbiwgYmFyX3RoaWNrX3RoaW4sIGJhcl9yaWdodF9yZXBlYXQsIGJhcl9sZWZ0X3JlcGVhdCwgYmFyX2RvdWJsZV9yZXBlYXRcblxuICB2YXIgYWJzZWxlbSA9IG5ldyBBYnNvbHV0ZUVsZW1lbnQoZWxlbSwgMCwgMTAsICdiYXInLCB0aGlzLnR1bmVOdW1iZXIpO1xuICB2YXIgYW5jaG9yID0gbnVsbDsgLy8gcGxhY2UgdG8gYXR0YWNoIHBhcnQgbGluZXNcbiAgdmFyIGR4ID0gMDtcblxuXHRpZiAoZWxlbS5iYXJOdW1iZXIpIHtcblx0XHR0aGlzLmFkZE1lYXN1cmVOdW1iZXIoZWxlbS5iYXJOdW1iZXIsIGFic2VsZW0pO1xuXHR9XG5cblxuICB2YXIgZmlyc3Rkb3RzID0gKGVsZW0udHlwZT09PVwiYmFyX3JpZ2h0X3JlcGVhdFwiIHx8IGVsZW0udHlwZT09PVwiYmFyX2RibF9yZXBlYXRcIik7XG4gIHZhciBmaXJzdHRoaW4gPSAoZWxlbS50eXBlIT09XCJiYXJfbGVmdF9yZXBlYXRcIiAmJiBlbGVtLnR5cGUhPT1cImJhcl90aGlja190aGluXCIgJiYgZWxlbS50eXBlIT09XCJiYXJfaW52aXNpYmxlXCIpO1xuICB2YXIgdGhpY2sgPSAoZWxlbS50eXBlPT09XCJiYXJfcmlnaHRfcmVwZWF0XCIgfHwgZWxlbS50eXBlPT09XCJiYXJfZGJsX3JlcGVhdFwiIHx8IGVsZW0udHlwZT09PVwiYmFyX2xlZnRfcmVwZWF0XCIgfHxcbiAgICAgICAgIGVsZW0udHlwZT09PVwiYmFyX3RoaW5fdGhpY2tcIiB8fCBlbGVtLnR5cGU9PT1cImJhcl90aGlja190aGluXCIpO1xuICB2YXIgc2Vjb25kdGhpbiA9IChlbGVtLnR5cGU9PT1cImJhcl9sZWZ0X3JlcGVhdFwiIHx8IGVsZW0udHlwZT09PVwiYmFyX3RoaWNrX3RoaW5cIiB8fCBlbGVtLnR5cGU9PT1cImJhcl90aGluX3RoaW5cIiB8fCBlbGVtLnR5cGU9PT1cImJhcl9kYmxfcmVwZWF0XCIpO1xuICB2YXIgc2Vjb25kZG90cyA9IChlbGVtLnR5cGU9PT1cImJhcl9sZWZ0X3JlcGVhdFwiIHx8IGVsZW0udHlwZT09PVwiYmFyX2RibF9yZXBlYXRcIik7XG5cbiAgLy8gbGltaXQgcG9zaXRpb25pbmcgb2Ygc2x1cnNcbiAgaWYgKGZpcnN0ZG90cyB8fCBzZWNvbmRkb3RzKSB7XG4gICAgZm9yICh2YXIgc2x1ciBpbiB0aGlzLnNsdXJzKSB7XG4gICAgICBpZiAodGhpcy5zbHVycy5oYXNPd25Qcm9wZXJ0eShzbHVyKSkge1xuICAgICAgICB0aGlzLnNsdXJzW3NsdXJdLnNldEVuZFgoYWJzZWxlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRsaW1pdGVsZW0gPSBhYnNlbGVtO1xuICB9XG5cbiAgaWYgKGZpcnN0ZG90cykge1xuICAgIGFic2VsZW0uYWRkUmlnaHQobmV3IFJlbGF0aXZlRWxlbWVudChcImRvdHMuZG90XCIsIGR4LCAxLCA3KSk7XG4gICAgYWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KFwiZG90cy5kb3RcIiwgZHgsIDEsIDUpKTtcbiAgICBkeCs9NjsgLy8yIGhhcmRjb2RlZCwgdHdpY2U7XG4gIH1cblxuICBpZiAoZmlyc3R0aGluKSB7XG4gICAgYW5jaG9yID0gbmV3IFJlbGF0aXZlRWxlbWVudChudWxsLCBkeCwgMSwgMiwge1widHlwZVwiOiBcImJhclwiLCBcInBpdGNoMlwiOjEwLCBsaW5ld2lkdGg6MC42fSk7XG4gICAgYWJzZWxlbS5hZGRSaWdodChhbmNob3IpO1xuICB9XG5cbiAgaWYgKGVsZW0udHlwZT09PVwiYmFyX2ludmlzaWJsZVwiKSB7XG4gICAgYW5jaG9yID0gbmV3IFJlbGF0aXZlRWxlbWVudChudWxsLCBkeCwgMSwgMiwge1widHlwZVwiOiBcIm5vbmVcIiwgXCJwaXRjaDJcIjoxMCwgbGluZXdpZHRoOjAuNn0pO1xuICAgIGFic2VsZW0uYWRkUmlnaHQoYW5jaG9yKTtcbiAgfVxuXG4gIGlmIChlbGVtLmRlY29yYXRpb24pIHtcbiAgICB0aGlzLmRlY29yYXRpb24uY3JlYXRlRGVjb3JhdGlvbih2b2ljZSwgZWxlbS5kZWNvcmF0aW9uLCAxMiwgKHRoaWNrKT8zOjEsIGFic2VsZW0sIDAsIFwiZG93blwiLCAyLCBlbGVtLnBvc2l0aW9uaW5nLCB0aGlzLmhhc1ZvY2Fscyk7XG4gIH1cblxuICBpZiAodGhpY2spIHtcbiAgICBkeCs9NDsgLy8zIGhhcmRjb2RlZDtcbiAgICBhbmNob3IgPSBuZXcgUmVsYXRpdmVFbGVtZW50KG51bGwsIGR4LCA0LCAyLCB7XCJ0eXBlXCI6IFwiYmFyXCIsIFwicGl0Y2gyXCI6MTAsIGxpbmV3aWR0aDo0fSk7XG4gICAgYWJzZWxlbS5hZGRSaWdodChhbmNob3IpO1xuICAgIGR4Kz01O1xuICB9XG5cbi8vIGlmICh0aGlzLnBhcnRzdGFydGVsZW0gJiYgKHRoaWNrIHx8IChmaXJzdHRoaW4gJiYgc2Vjb25kdGhpbikpKSB7IC8vIG1lYW5zIGVuZCBvZiBudGggcGFydFxuLy8gdGhpcy5wYXJ0c3RhcnRlbGVtLmFuY2hvcjI9YW5jaG9yO1xuLy8gdGhpcy5wYXJ0c3RhcnRlbGVtID0gbnVsbDtcbi8vIH1cblxuICBpZiAodGhpcy5wYXJ0c3RhcnRlbGVtICYmIGVsZW0uZW5kRW5kaW5nKSB7XG4gICAgdGhpcy5wYXJ0c3RhcnRlbGVtLmFuY2hvcjI9YW5jaG9yO1xuICAgIHRoaXMucGFydHN0YXJ0ZWxlbSA9IG51bGw7XG4gIH1cblxuICBpZiAoc2Vjb25kdGhpbikge1xuICAgIGR4Kz0zOyAvLzMgaGFyZGNvZGVkO1xuICAgIGFuY2hvciA9IG5ldyBSZWxhdGl2ZUVsZW1lbnQobnVsbCwgZHgsIDEsIDIsIHtcInR5cGVcIjogXCJiYXJcIiwgXCJwaXRjaDJcIjoxMCwgbGluZXdpZHRoOjAuNn0pO1xuICAgIGFic2VsZW0uYWRkUmlnaHQoYW5jaG9yKTsgLy8gMyBpcyBoYXJkY29kZWRcbiAgfVxuXG4gIGlmIChzZWNvbmRkb3RzKSB7XG4gICAgZHgrPTM7IC8vMyBoYXJkY29kZWQ7XG4gICAgYWJzZWxlbS5hZGRSaWdodChuZXcgUmVsYXRpdmVFbGVtZW50KFwiZG90cy5kb3RcIiwgZHgsIDEsIDcpKTtcbiAgICBhYnNlbGVtLmFkZFJpZ2h0KG5ldyBSZWxhdGl2ZUVsZW1lbnQoXCJkb3RzLmRvdFwiLCBkeCwgMSwgNSkpO1xuICB9IC8vIDIgaXMgaGFyZGNvZGVkXG5cbiAgaWYgKGVsZW0uc3RhcnRFbmRpbmcgJiYgaXNGaXJzdFN0YWZmKSB7IC8vIG9ubHkgcHV0IHRoZSBmaXJzdCAmIHNlY29uZCBlbmRpbmcgbWFya3Mgb24gdGhlIGZpcnN0IHN0YWZmXG5cdCAgdmFyIHRleHRXaWR0aCA9IHRoaXMucmVuZGVyZXIuZ2V0VGV4dFNpemUoZWxlbS5zdGFydEVuZGluZywgXCJyZXBlYXRmb250XCIsICcnKS53aWR0aDtcblx0ICBhYnNlbGVtLm1pbnNwYWNpbmcgKz0gdGV4dFdpZHRoICsgMTA7IC8vIEdpdmUgcGxlbnR5IG9mIHJvb20gZm9yIHRoZSBlbmRpbmcgbnVtYmVyLlxuICAgIHRoaXMucGFydHN0YXJ0ZWxlbSA9IG5ldyBFbmRpbmdFbGVtKGVsZW0uc3RhcnRFbmRpbmcsIGFuY2hvciwgbnVsbCk7XG5cdCAgdm9pY2UuYWRkT3RoZXIodGhpcy5wYXJ0c3RhcnRlbGVtKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGxpdHRsZSBzcGFjZSB0byB0aGUgbGVmdCBvZiB0aGUgYmFyIGxpbmUgc28gdGhhdCBub3RoaW5nIGNhbiBjcm93ZCBpdC5cblx0YWJzZWxlbS5leHRyYXcgLT0gNTtcblxuXHRyZXR1cm4gYWJzZWxlbTtcblxufTtcblxuXG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFic3RyYWN0RW5ncmF2ZXI7XG4iLCIvLyAgICBhYmNfdm9pY2VfZWxlbWVudC5qczogRGVmaW5pdGlvbiBvZiB0aGUgVm9pY2VFbGVtZW50IGNsYXNzLlxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKSBhbmQgUGF1bCBSb3NlblxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLypnbG9iYWwgbW9kdWxlICovXG5cbnZhciBzdmdOUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcblxuZnVuY3Rpb24gU3ZnKHdyYXBwZXIpIHtcblx0dGhpcy5zdmcgPSBjcmVhdGVTdmcoKTtcblx0d3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG59XG5cblN2Zy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcblx0aWYgKHRoaXMuc3ZnKSB7XG5cdFx0dmFyIHdyYXBwZXIgPSB0aGlzLnN2Zy5wYXJlbnROb2RlO1xuXHRcdHRoaXMuc3ZnID0gY3JlYXRlU3ZnKCk7XG5cdFx0aWYgKHdyYXBwZXIpIHtcblx0XHRcdC8vIFRPRE8tUEVSOiBJZiB0aGUgd3JhcHBlciBpcyBub3QgcHJlc2VudCwgdGhlbiB0aGUgdW5kZXJseWluZyBkaXYgd2FzIHB1bGxlZCBvdXQgZnJvbSB1bmRlciB0aGlzIGluc3RhbmNlLiBJdCdzIHBvc3NpYmxlIHRoYXQgaXMgc3RpbGwgdXNlZnVsIChmb3IgY3JlYXRpbmcgdGhlIG11c2ljIG9mZiBwYWdlPylcblx0XHRcdHdyYXBwZXIuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRcdHdyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5zdmcpO1xuXHRcdH1cblx0fVxufTtcblxuU3ZnLnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uKHRpdGxlKSB7XG5cdHZhciB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRpdGxlXCIpO1xuXHR2YXIgdGl0bGVOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGl0bGUpO1xuXHR0aXRsZUVsLmFwcGVuZENoaWxkKHRpdGxlTm9kZSk7XG5cdHRoaXMuc3ZnLmluc2VydEJlZm9yZSh0aXRsZUVsLCB0aGlzLnN2Zy5maXJzdENoaWxkKTtcbn07XG5cblN2Zy5wcm90b3R5cGUuc2V0UmVzcG9uc2l2ZVdpZHRoID0gZnVuY3Rpb24odywgaCkge1xuXHQvLyB0aGlzIHRlY2huaXF1ZSBpcyBmcm9tOiBodHRwOi8vdGhlbmV3Y29kZS5jb20vNzQ0L01ha2UtU1ZHLVJlc3BvbnNpdmUsIHRoeCB0byBodHRwczovL2dpdGh1Yi5jb20vaWFudHJlc21hblxuXHR0aGlzLnN2Zy5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIFwiMCAwIFwiICsgdyArIFwiIFwiICsgaCk7XG5cdHRoaXMuc3ZnLnNldEF0dHJpYnV0ZShcInByZXNlcnZlQXNwZWN0UmF0aW9cIiwgXCJ4TWluWU1pbiBtZWV0XCIpO1xuXHR0aGlzLnN2Zy5yZW1vdmVBdHRyaWJ1dGUoXCJoZWlnaHRcIik7XG5cdHRoaXMuc3ZnLnJlbW92ZUF0dHJpYnV0ZShcIndpZHRoXCIpO1xuXHR0aGlzLnN2Zy5zdHlsZVsnZGlzcGxheSddID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0dGhpcy5zdmcuc3R5bGVbJ3Bvc2l0aW9uJ10gPSBcImFic29sdXRlXCI7XG5cdHRoaXMuc3ZnLnN0eWxlWyd0b3AnXSA9IFwiMFwiO1xuXHR0aGlzLnN2Zy5zdHlsZVsnbGVmdCddID0gXCIwXCI7XG5cblx0aWYgKHRoaXMuc3ZnLnBhcmVudE5vZGUpIHtcblx0XHR2YXIgY2xzID0gdGhpcy5zdmcucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcblx0XHRpZiAoIWNscylcblx0XHRcdHRoaXMuc3ZnLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhYmNqcy1jb250YWluZXJcIik7XG5cdFx0ZWxzZSBpZiAoY2xzLmluZGV4T2YoXCJhYmNqcy1jb250YWluZXJcIikgPCAwKVxuXHRcdFx0dGhpcy5zdmcucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBjbHMgKyBcIiBhYmNqcy1jb250YWluZXJcIik7XG5cdFx0dGhpcy5zdmcucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR0aGlzLnN2Zy5wYXJlbnROb2RlLnN0eWxlWydwb3NpdGlvbiddID0gXCJyZWxhdGl2ZVwiO1xuXHRcdHRoaXMuc3ZnLnBhcmVudE5vZGUuc3R5bGVbJ3dpZHRoJ10gPSBcIjEwMCVcIjtcblx0XHQvLyBQRVI6IEkgY2hhbmdlZCB0aGUgcGFkZGluZyBmcm9tIDEwMCUgdG8gdGhpcyB0aHJvdWdoIHRyaWFsIGFuZCBlcnJvci5cblx0XHQvLyBUaGUgZXhhbXBsZSB3YXMgdXNpbmcgYSBzcXVhcmUgaW1hZ2UsIGJ1dCB0aGlzIG11c2ljIG1pZ2h0IGJlIGVpdGhlciB3aWRlciBvciB0YWxsZXIuXG5cdFx0dmFyIHBhZGRpbmcgPSBoIC8gdyAqIDEwMDtcblx0XHR0aGlzLnN2Zy5wYXJlbnROb2RlLnN0eWxlWydwYWRkaW5nLWJvdHRvbSddID0gcGFkZGluZyArIFwiJVwiO1xuXHRcdHRoaXMuc3ZnLnBhcmVudE5vZGUuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gPSBcIm1pZGRsZVwiO1xuXHRcdHRoaXMuc3ZnLnBhcmVudE5vZGUuc3R5bGVbJ292ZXJmbG93J10gPSBcImhpZGRlblwiO1xuXHR9XG59O1xuXG5TdmcucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbih3LCBoKSB7XG5cdHRoaXMuc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3KTtcblx0dGhpcy5zdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoKTtcblx0Ly8gVE9ETy1QRVI6IElzIHRoaXMgaGFjayBzdGlsbCBuZWVkZWQ/XG5cdC8vIENvcnJlY3QgZm9yIElFIHByb2JsZW0gaW4gY2FsY3VsYXRpbmcgaGVpZ2h0XG5cdC8vIHZhciBpc0lFID0gLypAY2Nfb24hQCovZmFsc2U7Ly9JRSBkZXRlY3RvclxuXHQvLyBpZiAoaXNJRSkge1xuXHQvLyBcdHRoaXMucGFwZXIuY2FudmFzLnBhcmVudE5vZGUuc3R5bGUud2lkdGggPSB3ICsgXCJweFwiO1xuXHQvLyBcdHRoaXMucGFwZXIuY2FudmFzLnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gXCJcIiArIGggKyBcInB4XCI7XG5cdC8vIH0gZWxzZVxuXHQvLyBcdHRoaXMucGFwZXIuY2FudmFzLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aWR0aDpcIiArIHcgKyBcInB4XCIpO1xufTtcblxuU3ZnLnByb3RvdHlwZS5zZXRTY2FsZSA9IGZ1bmN0aW9uKHNjYWxlKSB7XG5cdGlmIChzY2FsZSAhPT0gMSkge1xuXHRcdHRoaXMuc3ZnLnN0eWxlLnRyYW5zZm9ybSA9IFwic2NhbGUoXCIrc2NhbGUrXCIsXCIrc2NhbGUrXCIpXCI7XG5cdFx0dGhpcy5zdmcuc3R5bGVbJy1tcy10cmFuc2Zvcm0nXSA9IFwic2NhbGUoXCIrc2NhbGUrXCIsXCIrc2NhbGUrXCIpXCI7XG5cdFx0dGhpcy5zdmcuc3R5bGVbJy13ZWJraXQtdHJhbnNmb3JtJ10gPSBcInNjYWxlKFwiK3NjYWxlK1wiLFwiK3NjYWxlK1wiKVwiO1xuXHRcdHRoaXMuc3ZnLnN0eWxlWyd0cmFuc2Zvcm0tb3JpZ2luJ10gPSBcIjAgMFwiO1xuXHRcdHRoaXMuc3ZnLnN0eWxlWyctbXMtdHJhbnNmb3JtLW9yaWdpbi14J10gPSBcIjBcIjtcblx0XHR0aGlzLnN2Zy5zdHlsZVsnLW1zLXRyYW5zZm9ybS1vcmlnaW4teSddID0gXCIwXCI7XG5cdFx0dGhpcy5zdmcuc3R5bGVbJy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbi14J10gPSBcIjBcIjtcblx0XHR0aGlzLnN2Zy5zdHlsZVsnLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luLXknXSA9IFwiMFwiO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuc3ZnLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XG5cdFx0dGhpcy5zdmcuc3R5bGVbJy1tcy10cmFuc2Zvcm0nXSA9IFwiXCI7XG5cdFx0dGhpcy5zdmcuc3R5bGVbJy13ZWJraXQtdHJhbnNmb3JtJ10gPSBcIlwiO1xuXHR9XG59O1xuXG5TdmcucHJvdG90eXBlLnNldFBhcmVudFN0eWxlcyA9IGZ1bmN0aW9uKGF0dHIpIHtcblx0Ly8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRoZSBzaXplIHJpZ2h0IHdoZW4gdGhlcmUgaXMgc2NhbGluZyBpbnZvbHZlZC5cblx0Zm9yICh2YXIga2V5IGluIGF0dHIpIHtcblx0XHRpZiAoYXR0ci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRpZiAodGhpcy5zdmcucGFyZW50Tm9kZSlcblx0XHRcdFx0dGhpcy5zdmcucGFyZW50Tm9kZS5zdHlsZVtrZXldID0gYXR0cltrZXldO1xuXHRcdH1cblx0fVxuXHQvLyBUaGlzIGlzIHRoZSBsYXN0IHRoaW5nIHRoYXQgZ2V0cyBjYWxsZWQsIHNvIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IFNWRyBpZiBvbmUgd2FzIGNyZWF0ZWRcblx0aWYgKHRoaXMuZHVtbXlTdmcpIHtcblx0XHR2YXIgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcblx0XHRib2R5LnJlbW92ZUNoaWxkKHRoaXMuZHVtbXlTdmcpO1xuXHRcdHRoaXMuZHVtbXlTdmcgPSBudWxsO1xuXHR9XG5cbn07XG5cblN2Zy5wcm90b3R5cGUucmVjdCA9IGZ1bmN0aW9uKGF0dHIpIHtcblx0dmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCBcInJlY3RcIik7XG5cdGZvciAodmFyIGtleSBpbiBhdHRyKSB7XG5cdFx0aWYgKGF0dHIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0dmFyIHRtcCA9IFwiXCIgKyBhdHRyW2tleV07XG5cdFx0XHRpZiAodG1wLmluZGV4T2YoXCJOYU5cIikgPj0gMClcblx0XHRcdFx0ZGVidWdnZXI7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBrZXksIGF0dHJba2V5XSk7XG5cdFx0fVxuXHR9XG5cdHRoaXMuYXBwZW5kKGVsKTtcblx0cmV0dXJuIGVsO1xufTtcblxuU3ZnLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odGV4dCwgYXR0ciwgdGFyZ2V0KSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ3RleHQnKTtcblx0Zm9yICh2YXIga2V5IGluIGF0dHIpIHtcblx0XHRpZiAoYXR0ci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyW2tleV0pO1xuXHRcdH1cblx0fVxuXHR2YXIgbGluZXMgPSAoXCJcIit0ZXh0KS5zcGxpdChcIlxcblwiKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAndHNwYW4nKTtcblx0XHRsaW5lLnRleHRDb250ZW50ID0gbGluZXNbaV07XG5cdFx0bGluZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGF0dHIueCA/IGF0dHIueCA6IDApO1xuXHRcdGlmIChpICE9PSAwKVxuXHRcdFx0bGluZS5zZXRBdHRyaWJ1dGUoXCJkeVwiLCBcIjEuMmVtXCIpO1xuXHRcdGVsLmFwcGVuZENoaWxkKGxpbmUpO1xuXHR9XG5cdGlmICh0YXJnZXQpXG5cdFx0dGFyZ2V0LmFwcGVuZENoaWxkKGVsKTtcblx0ZWxzZVxuXHRcdHRoaXMuYXBwZW5kKGVsKTtcblx0cmV0dXJuIGVsO1xufTtcblxuU3ZnLnByb3RvdHlwZS5ndWVzc1dpZHRoID0gZnVuY3Rpb24odGV4dCwgYXR0cikge1xuXHR2YXIgc3ZnID0gdGhpcy5jcmVhdGVEdW1teVN2ZygpO1xuXHR2YXIgZWwgPSB0aGlzLnRleHQodGV4dCwgYXR0ciwgc3ZnKTtcblx0dmFyIHNpemU7XG5cdHRyeSB7XG5cdFx0c2l6ZSAgPSBlbC5nZXRCQm94KCk7XG5cdFx0aWYgKGlzTmFOKHNpemUuaGVpZ2h0KSB8fCAhc2l6ZS5oZWlnaHQpIC8vIFRPRE8tUEVSOiBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIGhhcHBlbiB1bmxlc3MgdGhlcmUgaXNuJ3QgYSBicm93c2VyIGF0IGFsbC5cblx0XHRcdHNpemUgPSB7IHdpZHRoOiBhdHRyWydmb250LXNpemUnXS8yLCBoZWlnaHQ6IGF0dHJbJ2ZvbnQtc2l6ZSddICsgMiB9OyAvLyBKdXN0IGEgd2lsZCBndWVzcy5cblx0XHRlbHNlXG5cdFx0XHRzaXplID0ge3dpZHRoOiBzaXplLndpZHRoLCBoZWlnaHQ6IHNpemUuaGVpZ2h0fTtcblx0fSBjYXRjaCAoZXgpIHtcblx0XHRzaXplID0geyB3aWR0aDogYXR0clsnZm9udC1zaXplJ10vMiwgaGVpZ2h0OiBhdHRyWydmb250LXNpemUnXSArIDIgfTsgLy8gSnVzdCBhIHdpbGQgZ3Vlc3MuXG5cdH1cblx0c3ZnLnJlbW92ZUNoaWxkKGVsKTtcblx0cmV0dXJuIHNpemU7XG59O1xuXG5TdmcucHJvdG90eXBlLmNyZWF0ZUR1bW15U3ZnID0gZnVuY3Rpb24oKSB7XG5cdGlmICghdGhpcy5kdW1teVN2Zykge1xuXHRcdHRoaXMuZHVtbXlTdmcgPSBjcmVhdGVTdmcoKTtcblx0XHR2YXIgc3R5bGVzID0gW1xuXHRcdFx0XCJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1wiLFxuXHRcdFx0XCJoZWlnaHQ6IDFweDtcIixcblx0XHRcdFwid2lkdGg6IDFweDtcIixcblx0XHRcdFwicG9zaXRpb246IGFic29sdXRlO1wiXG5cdFx0XTtcblx0XHR0aGlzLmR1bW15U3ZnLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMuam9pbihcIlwiKSk7XG5cdFx0dmFyIGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG5cdFx0Ym9keS5hcHBlbmRDaGlsZCh0aGlzLmR1bW15U3ZnKTtcblx0fVxuXG5cdHJldHVybiB0aGlzLmR1bW15U3ZnO1xufTtcblxuU3ZnLnByb3RvdHlwZS5nZXRUZXh0U2l6ZSA9IGZ1bmN0aW9uKHRleHQsIGF0dHIsIGVsKSB7XG5cdGlmICh0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpXG5cdFx0dGV4dCA9ICcnK3RleHQ7XG5cdGlmICghdGV4dCB8fCB0ZXh0Lm1hdGNoKC9eXFxzKyQvKSlcblx0XHRyZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG5cdHZhciByZW1vdmVMYXRlciA9ICFlbDtcblx0aWYgKCFlbClcblx0XHRlbCA9IHRoaXMudGV4dCh0ZXh0LCBhdHRyKTtcblx0dmFyIHNpemU7XG5cdHRyeSB7XG5cdFx0c2l6ZSAgPSBlbC5nZXRCQm94KCk7XG5cdFx0aWYgKGlzTmFOKHNpemUuaGVpZ2h0KSB8fCAhc2l6ZS5oZWlnaHQpXG5cdFx0XHRzaXplID0gdGhpcy5ndWVzc1dpZHRoKHRleHQsIGF0dHIpO1xuXHRcdGVsc2Vcblx0XHRcdHNpemUgPSB7d2lkdGg6IHNpemUud2lkdGgsIGhlaWdodDogc2l6ZS5oZWlnaHR9O1xuXHR9IGNhdGNoIChleCkge1xuXHRcdHNpemUgPSB0aGlzLmd1ZXNzV2lkdGgodGV4dCwgYXR0cik7XG5cdH1cblx0aWYgKHJlbW92ZUxhdGVyKSB7XG5cdFx0aWYgKHRoaXMuY3VycmVudEdyb3VwKVxuXHRcdFx0dGhpcy5jdXJyZW50R3JvdXAucmVtb3ZlQ2hpbGQoZWwpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc3ZnLnJlbW92ZUNoaWxkKGVsKTtcblx0fVxuXHRyZXR1cm4gc2l6ZTtcbn07XG5cblN2Zy5wcm90b3R5cGUub3Blbkdyb3VwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHRvcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcblx0dmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCBcImdcIik7XG5cdGlmIChvcHRpb25zLnByZXBlbmQpXG5cdFx0dGhpcy5zdmcuaW5zZXJ0QmVmb3JlKGVsLCB0aGlzLnN2Zy5maXJzdENoaWxkKTtcblx0ZWxzZVxuXHRcdHRoaXMuc3ZnLmFwcGVuZENoaWxkKGVsKTtcblx0dGhpcy5jdXJyZW50R3JvdXAgPSBlbDtcblx0cmV0dXJuIGVsO1xufTtcblxuU3ZnLnByb3RvdHlwZS5jbG9zZUdyb3VwID0gZnVuY3Rpb24oKSB7XG5cdHZhciBnID0gdGhpcy5jdXJyZW50R3JvdXA7XG5cdHRoaXMuY3VycmVudEdyb3VwID0gbnVsbDtcblx0cmV0dXJuIGc7XG59O1xuXG5TdmcucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbihhdHRyKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgXCJwYXRoXCIpO1xuXHRmb3IgKHZhciBrZXkgaW4gYXR0cikge1xuXHRcdGlmIChhdHRyLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdGlmIChrZXkgPT09ICdwYXRoJylcblx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCBhdHRyLnBhdGgpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBrZXksIGF0dHJba2V5XSk7XG5cdFx0fVxuXHR9XG5cdHRoaXMuYXBwZW5kKGVsKTtcblx0cmV0dXJuIGVsO1xufTtcblxuU3ZnLnByb3RvdHlwZS5wYXRoVG9CYWNrID0gZnVuY3Rpb24oYXR0cikge1xuXHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIFwicGF0aFwiKTtcblx0Zm9yICh2YXIga2V5IGluIGF0dHIpIHtcblx0XHRpZiAoYXR0ci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRpZiAoa2V5ID09PSAncGF0aCcpXG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgYXR0ci5wYXRoKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlTlMobnVsbCwga2V5LCBhdHRyW2tleV0pO1xuXHRcdH1cblx0fVxuXHR0aGlzLnByZXBlbmQoZWwpO1xuXHRyZXR1cm4gZWw7XG59O1xuXG5TdmcucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKGVsKSB7XG5cdGlmICh0aGlzLmN1cnJlbnRHcm91cClcblx0XHR0aGlzLmN1cnJlbnRHcm91cC5hcHBlbmRDaGlsZChlbCk7XG5cdGVsc2Vcblx0XHR0aGlzLnN2Zy5hcHBlbmRDaGlsZChlbCk7XG59O1xuXG5TdmcucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbihlbCkge1xuXHQvLyBUaGUgZW50aXJlIGdyb3VwIGlzIHByZXBlbmRlZCwgc28gZG9uJ3QgcHJlcGVuZCB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cy5cblx0aWYgKHRoaXMuY3VycmVudEdyb3VwKVxuXHRcdHRoaXMuY3VycmVudEdyb3VwLmFwcGVuZENoaWxkKGVsKTtcblx0ZWxzZVxuXHRcdHRoaXMuc3ZnLmluc2VydEJlZm9yZShlbCwgdGhpcy5zdmcuZmlyc3RDaGlsZCk7XG59O1xuXG5TdmcucHJvdG90eXBlLnNldEF0dHJpYnV0ZU9uRWxlbWVudCA9IGZ1bmN0aW9uKGVsLCBhdHRyKSB7XG5cdGZvciAodmFyIGtleSBpbiBhdHRyKSB7XG5cdFx0aWYgKGF0dHIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlTlMobnVsbCwga2V5LCBhdHRyW2tleV0pO1xuXHRcdH1cblx0fVxufTtcblxuZnVuY3Rpb24gY3JlYXRlU3ZnKCkge1xuXHR2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCBcInN2Z1wiKTtcblx0c3ZnLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIiwgXCJ4bWxuczp4bGlua1wiLCBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIik7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnaW1nJyk7ICAgIC8vIGZvciBhY2Nlc3NpYmlsaXR5XG5cdHJldHVybiBzdmc7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTdmc7XG4iLCIvLyAgICBhYmNfcmVuZGVyZXIuanM6IEFQSSB0byByZW5kZXIgdG8gU1ZHL1JhcGhhZWwvd2hhdGV2ZXIgcmVuZGVyaW5nIGVuZ2luZVxuLy8gICAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggR3JlZ29yeSBEeWtlIChncmVnZHlrZSBhdCBnbWFpbCBkb3QgY29tKVxuLy9cbi8vICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZFxuLy8gICAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb25cbi8vICAgIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmRcbi8vICAgIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcbi8vICAgIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vICAgIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5cbi8qZ2xvYmFsIE1hdGgsIGNvbnNvbGUgKi9cblxudmFyIGdseXBocyA9IHJlcXVpcmUoJy4vYWJjX2dseXBocycpO1xudmFyIHNwYWNpbmcgPSByZXF1aXJlKCcuL2FiY19zcGFjaW5nJyk7XG52YXIgc3ByaW50ZiA9IHJlcXVpcmUoJy4vc3ByaW50ZicpO1xudmFyIFN2ZyA9IHJlcXVpcmUoJy4vc3ZnJyk7XG5cbi8qKlxuICogSW1wbGVtZW50cyB0aGUgQVBJIGZvciByZW5kZXJpbmcgQUJDSlMgQWJzdHJhY3QgUmVuZGVyaW5nIFN0cnVjdHVyZSB0byBhIGNhbnZhcy9wYXBlciAoZS5nLiBTVkcsIFJhcGhhZWwsIGV0YylcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXBlclxuICogQHBhcmFtIHtib29sfSBkb1JlZ3Jlc3Npb25cbiAqL1xudmFyIFJlbmRlcmVyID0gZnVuY3Rpb24ocGFwZXIsIGRvUmVncmVzc2lvbiwgc2hvdWxkQWRkQ2xhc3Nlcykge1xuICB0aGlzLnBhcGVyID0gbmV3IFN2ZyhwYXBlcik7XG4gIHRoaXMuY29udHJvbGxlciA9IG51bGw7IC8vVE9ETy1HRCBvbmx5IHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBBQkNKUyBBUlMgdG8gY29ubmVjdCB0aGUgY29udHJvbGxlciB3aXRoIHRoZSBlbGVtZW50cyBmb3IgaGlnaGxpZ2h0aW5nXG5cblx0dGhpcy5zcGFjZSA9IDMqc3BhY2luZy5TUEFDRTtcbiAgdGhpcy5wYWRkaW5nID0ge307IC8vIHJlbmRlcmVyJ3MgcGFkZGluZyBpcyBtYW5hZ2VkIGJ5IHRoZSBjb250cm9sbGVyXG4gIHRoaXMuZG9SZWdyZXNzaW9uID0gZG9SZWdyZXNzaW9uO1xuICB0aGlzLnNob3VsZEFkZENsYXNzZXMgPSBzaG91bGRBZGRDbGFzc2VzO1xuICBpZiAodGhpcy5kb1JlZ3Jlc3Npb24pXG4gICAgdGhpcy5yZWdyZXNzaW9uTGluZXMgPSBbXTtcblx0dGhpcy5yZXNldCgpO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG5cblx0dGhpcy5wYXBlci5jbGVhcigpO1xuXHR0aGlzLnkgPSAwO1xuXHR0aGlzLmFiY3R1bmUgPSBudWxsO1xuXHR0aGlzLmxhc3RNID0gbnVsbDtcblx0dGhpcy5pbmdyb3VwID0gZmFsc2U7XG5cdHRoaXMucGF0aCA9IG51bGw7XG5cdHRoaXMuaXNQcmludCA9IGZhbHNlO1xuXHR0aGlzLmluaXRWZXJ0aWNhbFNwYWNlKCk7XG5cdGlmICh0aGlzLmRvUmVncmVzc2lvbilcblx0XHR0aGlzLnJlZ3Jlc3Npb25MaW5lcyA9IFtdO1xuXHQvLyBIQUNLLVBFUjogVGhlcmUgd2FzIGEgcHJvYmxlbSBpbiBSYXBoYWVsIHdoZXJlIGV2ZXJ5IHBhdGggc3RyaW5nIHRoYXQgd2FzIHNlbnQgdG8gaXQgd2FzIGNhY2hlZC5cblx0Ly8gVGhhdCB3YXMgY2F1c2luZyB0aGUgYnJvd3NlcidzIG1lbW9yeSB0byBzdGVhZGlseSBncm93IHVudGlsIHRoZSBicm93c2VyIHdlbnQgc2xvd2VyIGFuZCBzbG93ZXIgdW50aWxcblx0Ly8gaXQgY3Jhc2hlZC4gVGhlIGZpeCB0byB0aGF0IHdhcyBhIHBhdGNoIHRvIFJhcGhhZWwsIHNvIGl0IGlzIG9ubHkgcGF0Y2hlZCBvbiB0aGUgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5IHRoYXRcblx0Ly8gYnVuZGxlIFJhcGhhZWwgd2l0aCBpdC4gQWxzbywgaWYgUmFwaGFlbCBnZXRzIGFuIHVwZGF0ZSwgdGhlbiB0aGF0IHBhdGNoIHdpbGwgYmUgbG9zdC4gT24gdmVyc2lvbiAyLjEuMiBvZiBSYXBoYWVsLFxuXHQvLyB0aGUgcGF0Y2ggaXMgb24gbGluZSAxNTQyIGFuZCAxNTQ1IGFuZCBpdCBpczpcblx0Ly8gICAgICAgICAgICAgcFtwc10uc2xlZXAgPSAxO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLm5ld1R1bmUgPSBmdW5jdGlvbihhYmNUdW5lKSB7XG5cdHRoaXMuYWJjdHVuZSA9IGFiY1R1bmU7IC8vIFRPRE8tUEVSOiB0aGlzIGlzIGp1c3QgdG8gZ2V0IHRoZSBmb250IGluZm8uXG5cdHRoaXMuc2V0VmVydGljYWxTcGFjZShhYmNUdW5lLmZvcm1hdHRpbmcpO1xuXHR0aGlzLm1lYXN1cmVOdW1iZXIgPSBudWxsO1xuXHR0aGlzLm5vdGVOdW1iZXIgPSBudWxsO1xuXHR0aGlzLnNldFByaW50TW9kZShhYmNUdW5lLm1lZGlhID09PSAncHJpbnQnKTtcblx0dGhpcy5zZXRQYWRkaW5nKGFiY1R1bmUpO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1TZXQgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMucGFwZXIub3Blbkdyb3VwKCk7XG59O1xuXG5SZW5kZXJlci5wcm90b3R5cGUuY2xvc2VFbGVtU2V0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnBhcGVyLmNsb3NlR3JvdXAoKTtcbn07XG5cbi8qKlxuICogU2V0IHdoZXRoZXIgd2UgYXJlIGZvcm1hdHRpbmcgdGhpcyBmb3IgdGhlIHNjcmVlbiwgb3IgYXMgYSBwcmV2aWV3IGZvciBjcmVhdGluZyBhIFBERiB2ZXJzaW9uLlxuICogQHBhcmFtIHtib29sfSBpc1ByaW50XG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5zZXRQcmludE1vZGUgPSBmdW5jdGlvbiAoaXNQcmludCkge1xuXHR0aGlzLmlzUHJpbnQgPSBpc1ByaW50O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHNpemUgb2YgdGhlIGNhbnZhcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBtYXh3aWR0aFxuICogQHBhcmFtIHtvYmplY3R9IHNjYWxlXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5zZXRQYXBlclNpemUgPSBmdW5jdGlvbiAobWF4d2lkdGgsIHNjYWxlLCByZXNwb25zaXZlKSB7XG5cdHZhciB3ID0gKG1heHdpZHRoK3RoaXMucGFkZGluZy5yaWdodCkqc2NhbGU7XG5cdHZhciBoID0gKHRoaXMueSt0aGlzLnBhZGRpbmcuYm90dG9tKSpzY2FsZTtcblx0aWYgKHRoaXMuaXNQcmludClcblx0XHRoID0gTWF0aC5tYXgoaCwgMTA1Nik7IC8vIDExaW4geCA3MnB0L2luIHggMS4zM3B4L3B0XG5cdC8vIFRPRE8tUEVSOiBXZSBhcmUgbGV0dGluZyB0aGUgcGFnZSBnZXQgYXMgbG9uZyBhcyBpdCBuZWVkcyBub3csIGJ1dCBldmVudHVhbGx5IHRoYXQgc2hvdWxkIGdvIHRvIGEgc2Vjb25kIHBhZ2UuXG5cdGlmICh0aGlzLmRvUmVncmVzc2lvbilcblx0XHR0aGlzLnJlZ3Jlc3Npb25MaW5lcy5wdXNoKFwiUEFQRVIgU0laRTogKFwiK3crXCIsXCIraCtcIilcIik7XG5cblx0Ly8gZm9yIGFjY2Vzc2liaWxpdHlcblx0dmFyIHRleHQgPSBcIlNoZWV0IE11c2ljXCI7XG5cdGlmICh0aGlzLmFiY3R1bmUgJiYgdGhpcy5hYmN0dW5lLm1ldGFUZXh0ICYmIHRoaXMuYWJjdHVuZS5tZXRhVGV4dC50aXRsZSlcblx0XHR0ZXh0ICs9IFwiIGZvciBcXFwiXCIgKyB0aGlzLmFiY3R1bmUubWV0YVRleHQudGl0bGUgKyAnXCInO1xuXHR0aGlzLnBhcGVyLnNldFRpdGxlKHRleHQpO1xuXG5cdHZhciBwYXJlbnRTdHlsZXMgPSB7IG92ZXJmbG93OiBcImhpZGRlblwiIH07XG5cdGlmIChyZXNwb25zaXZlID09PSAncmVzaXplJykge1xuXHRcdHRoaXMucGFwZXIuc2V0UmVzcG9uc2l2ZVdpZHRoKHcsIGgpO1xuXHR9IGVsc2Uge1xuXHRcdHBhcmVudFN0eWxlcy53aWR0aCA9IFwiXCI7XG5cdFx0cGFyZW50U3R5bGVzLmhlaWdodCA9IGggKyBcInB4XCI7XG5cdFx0aWYgKHNjYWxlIDwgMSkge1xuXHRcdFx0cGFyZW50U3R5bGVzLndpZHRoID0gdyArIFwicHhcIjtcblx0XHRcdHRoaXMucGFwZXIuc2V0U2l6ZSh3IC8gc2NhbGUsIGggLyBzY2FsZSk7XG5cdFx0fSBlbHNlXG5cdFx0XHR0aGlzLnBhcGVyLnNldFNpemUodywgaCk7XG5cdH1cblx0dGhpcy5wYXBlci5zZXRTY2FsZShzY2FsZSk7XG5cdHRoaXMucGFwZXIuc2V0UGFyZW50U3R5bGVzKHBhcmVudFN0eWxlcyk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFkZGluZ1xuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICovXG5SZW5kZXJlci5wcm90b3R5cGUuc2V0UGFkZGluZ092ZXJyaWRlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG5cdHRoaXMucGFkZGluZ092ZXJyaWRlID0geyB0b3A6IHBhcmFtcy5wYWRkaW5ndG9wLCBib3R0b206IHBhcmFtcy5wYWRkaW5nYm90dG9tLFxuXHRcdHJpZ2h0OiBwYXJhbXMucGFkZGluZ3JpZ2h0LCBsZWZ0OiBwYXJhbXMucGFkZGluZ2xlZnQgfTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwYWRkaW5nXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5zZXRQYWRkaW5nID0gZnVuY3Rpb24oYWJjdHVuZSkge1xuXHQvLyBJZiB0aGUgcGFkZGluZyBpcyBzZXQgaW4gdGhlIHR1bmUsIHRoZW4gdXNlIHRoYXQuXG5cdC8vIE90aGVyd2lzZSwgaWYgdGhlIHBhZGRpbmcgaXMgc2V0IGluIHRoZSBvdmVycmlkZSwgdXNlIHRoYXQuXG5cdC8vIE90aGVyd2lzZSwgdXNlIHRoZSBkZWZhdWx0cyAodGhlcmUgYXJlIGEgZGlmZmVyZW50IHNldCBvZiBkZWZhdWx0cyBmb3Igc2NyZWVuIGFuZCBwcmludC4pXG5cdGZ1bmN0aW9uIHNldFBhZGRpbmdWYXJpYWJsZShzZWxmLCBwYWRkaW5nS2V5LCBmb3JtYXR0aW5nS2V5LCBwcmludERlZmF1bHQsIHNjcmVlbkRlZmF1bHQpIHtcblx0XHRpZiAoYWJjdHVuZS5mb3JtYXR0aW5nW2Zvcm1hdHRpbmdLZXldICE9PSB1bmRlZmluZWQpXG5cdFx0XHRzZWxmLnBhZGRpbmdbcGFkZGluZ0tleV0gPSBhYmN0dW5lLmZvcm1hdHRpbmdbZm9ybWF0dGluZ0tleV07XG5cdFx0ZWxzZSBpZiAoc2VsZi5wYWRkaW5nT3ZlcnJpZGVbcGFkZGluZ0tleV0gIT09IHVuZGVmaW5lZClcblx0XHRcdHNlbGYucGFkZGluZ1twYWRkaW5nS2V5XSA9IHNlbGYucGFkZGluZ092ZXJyaWRlW3BhZGRpbmdLZXldO1xuXHRcdGVsc2UgaWYgKHNlbGYuaXNQcmludClcblx0XHRcdHNlbGYucGFkZGluZ1twYWRkaW5nS2V5XSA9IHByaW50RGVmYXVsdDtcblx0XHRlbHNlXG5cdFx0XHRzZWxmLnBhZGRpbmdbcGFkZGluZ0tleV0gPSBzY3JlZW5EZWZhdWx0O1xuXHR9XG5cdC8vIDFjbSB4IDAuMzkzNzAxaW4vY20geCA3MnB0L2luIHggMS4zM3B4L3B0ID0gMzhweFxuXHQvLyAxLjhjbSB4IDAuMzkzNzAxaW4vY20geCA3MnB0L2luIHggMS4zM3B4L3B0ID0gNjhweFxuXHRzZXRQYWRkaW5nVmFyaWFibGUodGhpcywgJ3RvcCcsICd0b3BtYXJnaW4nLCAzOCwgMTUpO1xuXHRzZXRQYWRkaW5nVmFyaWFibGUodGhpcywgJ2JvdHRvbScsICdib3RtYXJnaW4nLCAzOCwgMTUpO1xuXHRzZXRQYWRkaW5nVmFyaWFibGUodGhpcywgJ2xlZnQnLCAnbGVmdG1hcmdpbicsIDY4LCAxNSk7XG5cdHNldFBhZGRpbmdWYXJpYWJsZSh0aGlzLCAncmlnaHQnLCAncmlnaHRtYXJnaW4nLCA2OCwgMTUpO1xufTtcblxuLyoqXG4gKiBTb21lIG9mIHRoZSBpdGVtcyBvbiB0aGUgcGFnZSBhcmUgbm90IHNjYWxlZCwgc28gYWRqdXN0IHRoZW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiBzY2FsaW5nIHRvIGNhbmNlbCBvdXQgdGhlIHNjYWxpbmcuXG4gKiBAcGFyYW0ge2Zsb2F0fSBzY2FsZVxuICovXG5SZW5kZXJlci5wcm90b3R5cGUuYWRqdXN0Tm9uU2NhbGVkSXRlbXMgPSBmdW5jdGlvbiAoc2NhbGUpIHtcblx0dGhpcy5wYWRkaW5nLnRvcCAvPSBzY2FsZTtcblx0dGhpcy5wYWRkaW5nLmJvdHRvbSAvPSBzY2FsZTtcblx0dGhpcy5wYWRkaW5nLmxlZnQgLz0gc2NhbGU7XG5cdHRoaXMucGFkZGluZy5yaWdodCAvPSBzY2FsZTtcblx0dGhpcy5hYmN0dW5lLmZvcm1hdHRpbmcuaGVhZGVyZm9udC5zaXplIC89IHNjYWxlO1xuXHR0aGlzLmFiY3R1bmUuZm9ybWF0dGluZy5mb290ZXJmb250LnNpemUgLz0gc2NhbGU7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBjb25maWd1cmFibGUgdmVydGljYWwgc3BhY2Ugb3B0aW9ucy5cbiAqL1xuUmVuZGVyZXIucHJvdG90eXBlLmluaXRWZXJ0aWNhbFNwYWNlID0gZnVuY3Rpb24oKSB7XG5cdC8vIGNvbnZlcnNpb246IDM3Ljc5NTMgPSBjb252ZXJzaW9uIGZhY3RvciBmb3IgY20gdG8gcHguXG5cdC8vIEFsbCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgaW4gcHguXG5cdHRoaXMuc3BhY2luZyA9IHtcblx0XHRjb21wb3NlcjogNy41NiwgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgY29tcG9zZXIuXG5cdFx0Z3JhY2VCZWZvcmU6IDguNjcsIC8vIERlZmluZSB0aGUgc3BhY2UgYmVmb3JlLCBpbnNpZGUgYW5kIGFmdGVyIHRoZSBncmFjZSBub3Rlcy5cblx0XHRncmFjZUluc2lkZTogMTAuNjcsXG5cdFx0Z3JhY2VBZnRlcjogMTYsXG5cdFx0aW5mbzogMCwgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgaW5mb2xpbmUuXG5cdFx0bGluZVNraXBGYWN0b3I6IDEuMSwgLy8gU2V0IHRoZSBmYWN0b3IgZm9yIHNwYWNpbmcgYmV0d2VlbiBsaW5lcyBvZiB0ZXh0LiAobXVsdGlwbHkgdGhpcyBieSB0aGUgZm9udCBzaXplKVxuXHRcdG11c2ljOiA3LjU2LCAvLyBTZXQgdGhlIHZlcnRpY2FsIHNwYWNlIGFib3ZlIHRoZSBmaXJzdCBzdGFmZi5cblx0XHRwYXJhZ3JhcGhTa2lwRmFjdG9yOiAwLjQsIC8vIFNldCB0aGUgZmFjdG9yIGZvciBzcGFjaW5nIGJldHdlZW4gdGV4dCBwYXJhZ3JhcGhzLiAobXVsdGlwbHkgdGhpcyBieSB0aGUgZm9udCBzaXplKVxuXHRcdHBhcnRzOiAxMS4zMywgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSBhIG5ldyBwYXJ0LlxuXHRcdHNsdXJIZWlnaHQ6IDEuMCwgLy8gU2V0IHRoZSBzbHVyIGhlaWdodCBmYWN0b3IuXG5cdFx0c3RhZmZTZXBhcmF0aW9uOiA2MS4zMywgLy8gRG8gbm90IHB1dCBhIHN0YWZmIHN5c3RlbSBjbG9zZXIgdGhhbiA8dW5pdD4gZnJvbSB0aGUgcHJldmlvdXMgc3lzdGVtLlxuXHRcdHN0ZW1IZWlnaHQ6IDI2LjY3KzEwLCAvLyBTZXQgdGhlIHN0ZW0gaGVpZ2h0LlxuXHRcdHN1YnRpdGxlOiAzLjc4LCAvLyBTZXQgdGhlIHZlcnRpY2FsIHNwYWNlIGFib3ZlIHRoZSBzdWJ0aXRsZS5cblx0XHRzeXN0ZW1TdGFmZlNlcGFyYXRpb246IDQ4LCAvLyBEbyBub3QgcGxhY2UgdGhlIHN0YXZlcyBjbG9zZXIgdGhhbiA8dW5pdD4gaW5zaWRlIGEgc3lzdGVtLiAqIFRoaXMgdmFsdWVzIGFwcGxpZXMgdG8gYWxsIHN0YXZlcyB3aGVuIGluIHRoZSB0dW5lIGhlYWRlci4gT3RoZXJ3aXNlLCBpdCBhcHBsaWVzIHRvIHRoZSBuZXh0IHN0YWZmXG5cdFx0dGV4dDogMTguOSwgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgaGlzdG9yeS5cblx0XHR0aXRsZTogNy41NiwgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgdGl0bGUuXG5cdFx0dG9wOiAzMC4yNCwgLy9TZXQgdGhlIHZlcnRpY2FsIHNwYWNlIGFib3ZlIHRoZSB0dW5lcyBhbmQgb24gdGhlIHRvcCBvZiB0aGUgY29udGludWF0aW9uIHBhZ2VzLlxuXHRcdHZvY2FsOiAzMC42NywgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgbHlyaWNzIHVuZGVyIHRoZSBzdGF2ZXMuXG5cdFx0d29yZHM6IDAgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBzcGFjZSBhYm92ZSB0aGUgbHlyaWNzIGF0IHRoZSBlbmQgb2YgdGhlIHR1bmUuXG5cdH07XG5cdC8qXG5cdFRPRE8tUEVSOiBIYW5kbGUgdGhlIHgtY29vcmRpbmF0ZSBzcGFjaW5nIGl0ZW1zLCB0b28uXG5tYXhzaHJpbmsgPGZsb2F0PkRlZmF1bHQ6IDAuNjVcblNldCBob3cgbXVjaCB0byBjb21wcmVzcyBob3Jpem9udGFsbHkgd2hlbiBtdXNpYyBsaW5lIGJyZWFrc1xuYXJlIGF1dG9tYXRpYy5cbjxmbG9hdD4gbXVzdCBiZSBiZXR3ZWVuIDAgKG5hdHVyYWwgc3BhY2luZylcbmFuZCAxIChtYXggc2hyaW5raW5nKS5cblxuLy8gVGhpcyBuZXh0IHZhbHVlIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgbmF0dXJhbCBzcGFjaW5nIG9mXG4vLyB0aGUgbm90ZXMuIFRoZSBiYXNlIHNwYWNpbmcgb2YgdGhlIGNyb3RjaGV0IGlzIGFsd2F5c1xuLy8gNDAgcHRzLiBXaGVuIHRoZSBkdXJhdGlvbiBvZiBhIG5vdGUgdHlwZSBpcyB0d2ljZSB0aGVcbi8vIGR1cmF0aW9uIG9mIGFuIG90aGVyIG5vdGUgdHlwZSwgaXRzIHNwYWNpbmcgaXMgbXVsdGlwbGllZFxuLy8gYnkgdGhpcyBmYWN0b3IuXG4vLyBUaGUgZGVmYXVsdCB2YWx1ZSBjYXVzZXMgdGhlIG5vdGUgc3BhY2luZyB0byBiZSBtdWx0aXBsaWVkXG4vLyBieSAyIHdoZW4gaXRzIGR1cmF0aW9uIGlzIG11bHRpcGxpZWQgYnkgNCwgaS5lLiB0aGVcbi8vIHNwYWNlIG9mIHRoZSBzZW1pYnJldmUgaXMgODAgcHRzIGFuZCB0aGUgc3BhY2Ugb2YgdGhlXG4vLyBzZW1pcXVhdmVyIGlzIDIwIHB0cy5cbi8vIFNldHRpbmcgdGhpcyB2YWx1ZSB0byAxIHNldHMgYWxsIG5vdGUgc3BhY2luZyB0byA0MCBwdHMuXG5ub3RlU3BhY2luZ0ZhY3RvcjogMS40MTQsIC8vIFNldCB0aGUgbm90ZSBzcGFjaW5nIGZhY3RvciB0byA8ZmxvYXQ+IChyYW5nZSAxLi4yKS5cblxuc2NhbGUgPGZsb2F0PiBEZWZhdWx0OiAwLjc1IFNldCB0aGUgcGFnZSBzY2FsZSBmYWN0b3IuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgYXJlIG5vdCBzY2FsZWQuXG5cbnN0cmV0Y2hsYXN0IDxmbG9hdD5EZWZhdWx0OiAwLjhcblN0cmV0Y2ggdGhlIGxhc3QgbXVzaWMgbGluZSBvZiBhIHR1bmUgd2hlbiBpdCBleGNlZWRzXG50aGUgPGZsb2F0PiBmcmFjdGlvbiBvZiB0aGUgcGFnZSB3aWR0aC5cbjxmbG9hdD4gcmFuZ2UgaXMgMC4wIHRvIDEuMC5cblx0ICovXG59O1xuXG5SZW5kZXJlci5wcm90b3R5cGUuc2V0VmVydGljYWxTcGFjZSA9IGZ1bmN0aW9uKGZvcm1hdHRpbmcpIHtcblx0Ly8gY29udmVyc2lvbiBmcm9tIHB0cyB0byBweCA0LzNcblx0aWYgKGZvcm1hdHRpbmcuc3RhZmZzZXAgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLnNwYWNpbmcuc3RhZmZTZXBhcmF0aW9uID0gZm9ybWF0dGluZy5zdGFmZnNlcCAqNC8zO1xuXHRpZiAoZm9ybWF0dGluZy5jb21wb3NlcnNwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLmNvbXBvc2VyID0gZm9ybWF0dGluZy5jb21wb3NlcnNwYWNlICo0LzM7XG5cdGlmIChmb3JtYXR0aW5nLnBhcnRzc3BhY2UgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLnNwYWNpbmcucGFydHMgPSBmb3JtYXR0aW5nLnBhcnRzc3BhY2UgKjQvMztcblx0aWYgKGZvcm1hdHRpbmcudGV4dHNwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLnRleHQgPSBmb3JtYXR0aW5nLnRleHRzcGFjZSAqNC8zO1xuXHRpZiAoZm9ybWF0dGluZy5tdXNpY3NwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLm11c2ljID0gZm9ybWF0dGluZy5tdXNpY3NwYWNlICo0LzM7XG5cdGlmIChmb3JtYXR0aW5nLnRpdGxlc3BhY2UgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLnNwYWNpbmcudGl0bGUgPSBmb3JtYXR0aW5nLnRpdGxlc3BhY2UgKjQvMztcblx0aWYgKGZvcm1hdHRpbmcuc3lzc3RhZmZzZXAgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLnNwYWNpbmcuc3lzdGVtU3RhZmZTZXBhcmF0aW9uID0gZm9ybWF0dGluZy5zeXNzdGFmZnNlcCAqNC8zO1xuXHRpZiAoZm9ybWF0dGluZy5zdWJ0aXRsZXNwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLnN1YnRpdGxlID0gZm9ybWF0dGluZy5zdWJ0aXRsZXNwYWNlICo0LzM7XG5cdGlmIChmb3JtYXR0aW5nLnRvcHNwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLnRvcCA9IGZvcm1hdHRpbmcudG9wc3BhY2UgKjQvMztcblx0aWYgKGZvcm1hdHRpbmcudm9jYWxzcGFjZSAhPT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMuc3BhY2luZy52b2NhbCA9IGZvcm1hdHRpbmcudm9jYWxzcGFjZSAqNC8zO1xuXHRpZiAoZm9ybWF0dGluZy53b3Jkc3NwYWNlICE9PSB1bmRlZmluZWQpXG5cdFx0dGhpcy5zcGFjaW5nLndvcmRzID0gZm9ybWF0dGluZy53b3Jkc3NwYWNlICo0LzM7XG59O1xuXG4vKipcbiAqIExlYXZlIHNwYWNlIGF0IHRoZSB0b3Agb2YgdGhlIHBhcGVyXG4gKiBAcGFyYW0ge29iamVjdH0gYWJjdHVuZVxuICovXG5SZW5kZXJlci5wcm90b3R5cGUudG9wTWFyZ2luID0gZnVuY3Rpb24oYWJjdHVuZSkge1xuXHRcdHRoaXMubW92ZVkodGhpcy5wYWRkaW5nLnRvcCk7XG59O1xuXG4vKipcbiAqIExlYXZlIHNwYWNlIGJlZm9yZSBwcmludGluZyB0aGUgbXVzaWNcbiAqL1xuUmVuZGVyZXIucHJvdG90eXBlLmFkZE11c2ljUGFkZGluZyA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW92ZVkodGhpcy5zcGFjaW5nLm11c2ljKTtcbn07XG5cbi8qKlxuICogTGVhdmUgc3BhY2UgYmVmb3JlIHByaW50aW5nIGEgc3RhZmYgc3lzdGVtXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5hZGRTdGFmZlBhZGRpbmcgPSBmdW5jdGlvbihsYXN0U3RhZmZHcm91cCwgdGhpc1N0YWZmR3JvdXApIHtcblx0dmFyIGxhc3RTdGFmZiA9IGxhc3RTdGFmZkdyb3VwLnN0YWZmc1tsYXN0U3RhZmZHcm91cC5zdGFmZnMubGVuZ3RoLTFdO1xuXHR2YXIgbGFzdEJvdHRvbUxpbmUgPSAtKGxhc3RTdGFmZi5ib3R0b20gLSAyKTsgLy8gVGhlIDIgaXMgYmVjYXVzZSB0aGUgc2NhbGUgZ29lcyB0byAyIGJlbG93IHRoZSBsYXN0IGxpbmUuXG5cdHZhciBuZXh0VG9wTGluZSA9IHRoaXNTdGFmZkdyb3VwLnN0YWZmc1swXS50b3AgLSAxMDsgLy8gQmVjYXVzZSAxMCByZXByZXNlbnRzIHRoZSB0b3AgbGluZS5cblx0dmFyIG5hdHVyYWxTZXBhcmF0aW9uID0gbmV4dFRvcExpbmUgKyBsYXN0Qm90dG9tTGluZTsgLy8gVGhpcyBpcyBob3cgZmFyIGFwYXJ0IHRoZXknZCBiZSB3aXRob3V0IGV4dHJhIHNwYWNpbmdcblx0dmFyIHNlcGFyYXRpb25JblBpeGVscyA9IG5hdHVyYWxTZXBhcmF0aW9uICogc3BhY2luZy5TVEVQO1xuXHRpZiAoc2VwYXJhdGlvbkluUGl4ZWxzIDwgdGhpcy5zcGFjaW5nLnN0YWZmU2VwYXJhdGlvbilcblx0XHR0aGlzLm1vdmVZKHRoaXMuc3BhY2luZy5zdGFmZlNlcGFyYXRpb24tc2VwYXJhdGlvbkluUGl4ZWxzKTtcbn07XG5cbi8qKlxuICogVGV4dCB0aGF0IGdvZXMgYWJvdmUgdGhlIHNjb3JlXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBhYmN0dW5lXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5lbmdyYXZlVG9wVGV4dCA9IGZ1bmN0aW9uKHdpZHRoLCBhYmN0dW5lKSB7XG5cdGlmIChhYmN0dW5lLm1ldGFUZXh0LmhlYWRlciAmJiB0aGlzLmlzUHJpbnQpIHtcblx0XHQvLyBOb3RlOiB3aGV0aGVyIHRoZXJlIGlzIGEgaGVhZGVyIG9yIG5vdCBkb2Vzbid0IGNoYW5nZSBhbnkgb3RoZXIgcG9zaXRpb25pbmcsIHNvIHRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIFktY29vcmRpbmF0ZS5cblx0XHQvLyBUaGlzIHRleHQgZ29lcyBhYm92ZSB0aGUgbWFyZ2luLCBzbyB3ZSdsbCB0ZW1wb3JhcmlseSBtb3ZlIHVwLlxuXHRcdHZhciBoZWFkZXJUZXh0SGVpZ2h0ID0gdGhpcy5nZXRUZXh0U2l6ZShcIlhYWFhcIiwgXCJoZWFkZXJmb250XCIsICdhYmNqcy1oZWFkZXIgYWJjanMtbWV0YS10b3AnKS5oZWlnaHQ7XG5cdFx0dGhpcy55IC09aGVhZGVyVGV4dEhlaWdodDtcblx0XHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCwgYWJjdHVuZS5tZXRhVGV4dC5oZWFkZXIubGVmdCwgJ2hlYWRlcmZvbnQnLCAnaGVhZGVyIG1ldGEtdG9wJywgMCwgbnVsbCwgJ3N0YXJ0Jyk7XG5cdFx0dGhpcy5vdXRwdXRUZXh0SWYodGhpcy5wYWRkaW5nLmxlZnQgKyB3aWR0aCAvIDIsIGFiY3R1bmUubWV0YVRleHQuaGVhZGVyLmNlbnRlciwgJ2hlYWRlcmZvbnQnLCAnaGVhZGVyIG1ldGEtdG9wJywgMCwgbnVsbCwgJ21pZGRsZScpO1xuXHRcdHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0ICsgd2lkdGgsIGFiY3R1bmUubWV0YVRleHQuaGVhZGVyLnJpZ2h0LCAnaGVhZGVyZm9udCcsICdoZWFkZXIgbWV0YS10b3AnLCAwLCBudWxsLCAnZW5kJyk7XG5cdFx0dGhpcy55ICs9IGhlYWRlclRleHRIZWlnaHQ7XG5cdH1cblx0aWYgKHRoaXMuaXNQcmludClcblx0XHR0aGlzLm1vdmVZKHRoaXMuc3BhY2luZy50b3ApO1xuXHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCArIHdpZHRoIC8gMiwgYWJjdHVuZS5tZXRhVGV4dC50aXRsZSwgJ3RpdGxlZm9udCcsICd0aXRsZSBtZXRhLXRvcCcsIHRoaXMuc3BhY2luZy50aXRsZSwgMCwgJ21pZGRsZScpO1xuXHRpZiAoYWJjdHVuZS5saW5lc1swXSlcblx0XHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCArIHdpZHRoIC8gMiwgYWJjdHVuZS5saW5lc1swXS5zdWJ0aXRsZSwgJ3N1YnRpdGxlZm9udCcsICd0ZXh0IG1ldGEtdG9wJywgdGhpcy5zcGFjaW5nLnN1YnRpdGxlLCAwLCAnbWlkZGxlJyk7XG5cblx0aWYgKGFiY3R1bmUubWV0YVRleHQucmh5dGhtIHx8IGFiY3R1bmUubWV0YVRleHQub3JpZ2luIHx8IGFiY3R1bmUubWV0YVRleHQuY29tcG9zZXIpIHtcblx0XHR0aGlzLm1vdmVZKHRoaXMuc3BhY2luZy5jb21wb3Nlcik7XG5cdFx0dmFyIHJTcGFjZSA9IHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0LCBhYmN0dW5lLm1ldGFUZXh0LnJoeXRobSwgJ2luZm9mb250JywgJ21ldGEtdG9wJywgMCwgbnVsbCwgXCJzdGFydFwiKTtcblxuXHRcdHZhciBjb21wb3NlckxpbmUgPSBcIlwiO1xuXHRcdGlmIChhYmN0dW5lLm1ldGFUZXh0LmNvbXBvc2VyKSBjb21wb3NlckxpbmUgKz0gYWJjdHVuZS5tZXRhVGV4dC5jb21wb3Nlcjtcblx0XHRpZiAoYWJjdHVuZS5tZXRhVGV4dC5vcmlnaW4pIGNvbXBvc2VyTGluZSArPSAnICgnICsgYWJjdHVuZS5tZXRhVGV4dC5vcmlnaW4gKyAnKSc7XG5cdFx0aWYgKGNvbXBvc2VyTGluZS5sZW5ndGggPiAwKSB7XG5cdFx0XHR2YXIgc3BhY2UgPSB0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCArIHdpZHRoLCBjb21wb3NlckxpbmUsICdjb21wb3NlcmZvbnQnLCAnbWV0YS10b3AnLCAwLCBudWxsLCBcImVuZFwiKTtcblx0XHRcdHRoaXMubW92ZVkoc3BhY2VbMV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1vdmVZKHJTcGFjZVsxXSk7XG5cdFx0fVxuXHRcdC8vIFRPRE8tUEVSOiBUaGUgZm9sbG93aW5nIGlzIGEgaGFjayB0byBtYWtlIHRoZSBlbGVtZW50cyBsaW5lIHVwIHdpdGggYWJjbTJwcy4gRG9uJ3Qga25vdyB3aGVyZSB0aGUgZXh0cmEgc3BhY2UgaXMgY29taW5nIGZyb20uXG5cdFx0dGhpcy5tb3ZlWSgtNik7XG5cdC8vfSBlbHNlIGlmICh0aGlzLmlzUHJpbnQpIHtcblx0Ly9cdC8vIGFiY20ycHMgYWRkcyB0aGlzIHNwYWNlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgdG8gd3JpdGUgb3Igbm90LlxuXHQvL1x0dGhpcy5tb3ZlWSh0aGlzLnNwYWNpbmcuY29tcG9zZXIpO1xuXHQvL1x0dmFyIHNwYWNlMiA9IHRoaXMuZ2V0VGV4dFNpemUoXCJNXCIsICdjb21wb3NlcmZvbnQnLCAnbWV0YS10b3AnKTtcblx0Ly9cdHRoaXMubW92ZVkoc3BhY2UyLmhlaWdodCk7XG5cdH1cblxuXHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCArIHdpZHRoLCBhYmN0dW5lLm1ldGFUZXh0LmF1dGhvciwgJ2NvbXBvc2VyZm9udCcsICdtZXRhLXRvcCcsIDAsIDAsIFwiZW5kXCIpO1xuXHQvL3RoaXMuc2tpcFNwYWNlWSgpO1xuXG5cdHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0LCBhYmN0dW5lLm1ldGFUZXh0LnBhcnRPcmRlciwgJ3BhcnRzZm9udCcsICdtZXRhLWJvdHRvbScsIDAsIDAsIFwic3RhcnRcIik7XG59O1xuXG4vKipcbiAqIFRleHQgdGhhdCBnb2VzIGJlbG93IHRoZSBzY29yZVxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge29iamVjdH0gYWJjdHVuZVxuICovXG5SZW5kZXJlci5wcm90b3R5cGUuZW5ncmF2ZUV4dHJhVGV4dCA9IGZ1bmN0aW9uKHdpZHRoLCBhYmN0dW5lKSB7XG5cdHRoaXMubGluZU51bWJlciA9IG51bGw7XG5cdHRoaXMubWVhc3VyZU51bWJlciA9IG51bGw7XG5cdHRoaXMubm90ZU51bWJlciA9IG51bGw7XG5cdHRoaXMudm9pY2VOdW1iZXIgPSBudWxsO1xuXG5cdGlmIChhYmN0dW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzKSB7XG5cdFx0dmFyIGhhc2ggPSB0aGlzLmdldEZvbnRBbmRBdHRyKFwid29yZHNmb250XCIsICdtZXRhLWJvdHRvbScpO1xuXHRcdHZhciBzcGFjZSA9IHRoaXMuZ2V0VGV4dFNpemUoXCJpXCIsICd3b3Jkc2ZvbnQnLCAnbWV0YS1ib3R0b20nKTtcblxuXHRcdGlmIChhYmN0dW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLm1vdmVZKHRoaXMuc3BhY2luZy53b3JkcywgMSk7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBhYmN0dW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoYWJjdHVuZS5tZXRhVGV4dC51bmFsaWduZWRXb3Jkc1tqXSA9PT0gJycpXG5cdFx0XHRcdHRoaXMubW92ZVkoaGFzaC5mb250LnNpemUsIDEpO1xuXHRcdFx0ZWxzZSBpZiAodHlwZW9mIGFiY3R1bmUubWV0YVRleHQudW5hbGlnbmVkV29yZHNbal0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0ICsgc3BhY2luZy5JTkRFTlQsIGFiY3R1bmUubWV0YVRleHQudW5hbGlnbmVkV29yZHNbal0sICd3b3Jkc2ZvbnQnLCAnbWV0YS1ib3R0b20nLCAwLCAwLCBcInN0YXJ0XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGxhcmdlc3RZID0gMDtcblx0XHRcdFx0dmFyIG9mZnNldFggPSAwO1xuXHRcdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGFiY3R1bmUubWV0YVRleHQudW5hbGlnbmVkV29yZHNbal0ubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHR2YXIgdGhpc1dvcmQgPSBhYmN0dW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzW2pdW2tdO1xuXHRcdFx0XHRcdHZhciB0eXBlID0gKHRoaXNXb3JkLmZvbnQpID8gdGhpc1dvcmQuZm9udCA6IFwid29yZHNmb250XCI7XG5cdFx0XHRcdFx0dmFyIGVsID0gdGhpcy5yZW5kZXJUZXh0KHRoaXMucGFkZGluZy5sZWZ0ICsgc3BhY2luZy5JTkRFTlQgKyBvZmZzZXRYLCB0aGlzLnksIHRoaXNXb3JkLnRleHQsIHR5cGUsICdtZXRhLWJvdHRvbScsIGZhbHNlKTtcblx0XHRcdFx0XHR2YXIgc2l6ZSA9IHRoaXMuZ2V0VGV4dFNpemUodGhpc1dvcmQudGV4dCwgdHlwZSwgJ21ldGEtYm90dG9tJyk7XG5cdFx0XHRcdFx0bGFyZ2VzdFkgPSBNYXRoLm1heChsYXJnZXN0WSwgc2l6ZS5oZWlnaHQpO1xuXHRcdFx0XHRcdG9mZnNldFggKz0gc2l6ZS53aWR0aDtcblx0XHRcdFx0XHQvLyBJZiB0aGUgcGhyYXNlIGVuZHMgaW4gYSBzcGFjZSwgdGhlbiB0aGF0IGlzIG5vdCBjb3VudGVkIGluIHRoZSB3aWR0aCwgc28gd2UgbmVlZCB0byBhZGQgdGhhdCBpbiBvdXJzZWx2ZXMuXG5cdFx0XHRcdFx0aWYgKHRoaXNXb3JkLnRleHRbdGhpc1dvcmQudGV4dC5sZW5ndGgtMV0gPT09ICcgJykge1xuXHRcdFx0XHRcdFx0b2Zmc2V0WCArPSBzcGFjZS53aWR0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5tb3ZlWShsYXJnZXN0WSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhYmN0dW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLm1vdmVZKGhhc2guZm9udC5zaXplLCAyKTtcblx0fVxuXG5cdHZhciBleHRyYVRleHQgPSBcIlwiO1xuXHRpZiAoYWJjdHVuZS5tZXRhVGV4dC5ib29rKSBleHRyYVRleHQgKz0gXCJCb29rOiBcIiArIGFiY3R1bmUubWV0YVRleHQuYm9vayArIFwiXFxuXCI7XG5cdGlmIChhYmN0dW5lLm1ldGFUZXh0LnNvdXJjZSkgZXh0cmFUZXh0ICs9IFwiU291cmNlOiBcIiArIGFiY3R1bmUubWV0YVRleHQuc291cmNlICsgXCJcXG5cIjtcblx0aWYgKGFiY3R1bmUubWV0YVRleHQuZGlzY29ncmFwaHkpIGV4dHJhVGV4dCArPSBcIkRpc2NvZ3JhcGh5OiBcIiArIGFiY3R1bmUubWV0YVRleHQuZGlzY29ncmFwaHkgKyBcIlxcblwiO1xuXHRpZiAoYWJjdHVuZS5tZXRhVGV4dC5ub3RlcykgZXh0cmFUZXh0ICs9IFwiTm90ZXM6IFwiICsgYWJjdHVuZS5tZXRhVGV4dC5ub3RlcyArIFwiXFxuXCI7XG5cdGlmIChhYmN0dW5lLm1ldGFUZXh0LnRyYW5zY3JpcHRpb24pIGV4dHJhVGV4dCArPSBcIlRyYW5zY3JpcHRpb246IFwiICsgYWJjdHVuZS5tZXRhVGV4dC50cmFuc2NyaXB0aW9uICsgXCJcXG5cIjtcblx0aWYgKGFiY3R1bmUubWV0YVRleHQuaGlzdG9yeSkgZXh0cmFUZXh0ICs9IFwiSGlzdG9yeTogXCIgKyBhYmN0dW5lLm1ldGFUZXh0Lmhpc3RvcnkgKyBcIlxcblwiO1xuXHRpZiAoYWJjdHVuZS5tZXRhVGV4dFsnYWJjLWNvcHlyaWdodCddKSBleHRyYVRleHQgKz0gXCJDb3B5cmlnaHQ6IFwiICsgYWJjdHVuZS5tZXRhVGV4dFsnYWJjLWNvcHlyaWdodCddICsgXCJcXG5cIjtcblx0aWYgKGFiY3R1bmUubWV0YVRleHRbJ2FiYy1jcmVhdG9yJ10pIGV4dHJhVGV4dCArPSBcIkNyZWF0b3I6IFwiICsgYWJjdHVuZS5tZXRhVGV4dFsnYWJjLWNyZWF0b3InXSArIFwiXFxuXCI7XG5cdGlmIChhYmN0dW5lLm1ldGFUZXh0WydhYmMtZWRpdGVkLWJ5J10pIGV4dHJhVGV4dCArPSBcIkVkaXRlZCBCeTogXCIgKyBhYmN0dW5lLm1ldGFUZXh0WydhYmMtZWRpdGVkLWJ5J10gKyBcIlxcblwiO1xuXHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCwgZXh0cmFUZXh0LCAnaGlzdG9yeWZvbnQnLCAnbWV0YS1ib3R0b20nLCB0aGlzLnNwYWNpbmcuaW5mbywgMCwgXCJzdGFydFwiKTtcblxuXHRpZiAoYWJjdHVuZS5tZXRhVGV4dC5mb290ZXIgJiYgdGhpcy5pc1ByaW50KSB7XG5cdFx0Ly8gTm90ZTogd2hldGhlciB0aGVyZSBpcyBhIGZvb3RlciBvciBub3QgZG9lc24ndCBjaGFuZ2UgYW55IG90aGVyIHBvc2l0aW9uaW5nLCBzbyB0aGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBZLWNvb3JkaW5hdGUuXG5cdFx0dGhpcy5vdXRwdXRUZXh0SWYodGhpcy5wYWRkaW5nLmxlZnQsIGFiY3R1bmUubWV0YVRleHQuZm9vdGVyLmxlZnQsICdmb290ZXJmb250JywgJ2hlYWRlciBtZXRhLWJvdHRvbScsIDAsIG51bGwsICdzdGFydCcpO1xuXHRcdHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0ICsgd2lkdGggLyAyLCBhYmN0dW5lLm1ldGFUZXh0LmZvb3Rlci5jZW50ZXIsICdmb290ZXJmb250JywgJ2hlYWRlciBtZXRhLWJvdHRvbScsIDAsIG51bGwsICdtaWRkbGUnKTtcblx0XHR0aGlzLm91dHB1dFRleHRJZih0aGlzLnBhZGRpbmcubGVmdCArIHdpZHRoLCBhYmN0dW5lLm1ldGFUZXh0LmZvb3Rlci5yaWdodCwgJ2Zvb3RlcmZvbnQnLCAnaGVhZGVyIG1ldGEtYm90dG9tJywgMCwgbnVsbCwgJ2VuZCcpO1xuXHR9XG59O1xuXG4vKipcbiAqIE91dHB1dCB0ZXh0IGRlZmluZWQgd2l0aCAlJXRleHQuXG4gKiBAcGFyYW0ge2FycmF5IG9yIHN0cmluZ30gdGV4dFxuICovXG5SZW5kZXJlci5wcm90b3R5cGUub3V0cHV0RnJlZVRleHQgPSBmdW5jdGlvbiAodGV4dCwgdnNraXApIHtcblx0aWYgKHZza2lwKVxuXHRcdHRoaXMubW92ZVkodnNraXApO1xuXHR2YXIgaGFzaCA9IHRoaXMuZ2V0Rm9udEFuZEF0dHIoJ3RleHRmb250JywgJ2RlZmluZWQtdGV4dCcpO1xuXHRpZiAodGV4dCA9PT0gXCJcIikge1x0Ly8gd2UgZG8gd2FudCB0byBwcmludCBvdXQgYmxhbmsgbGluZXMgaWYgdGhleSBoYXZlIGJlZW4gc3BlY2lmaWVkLlxuXHRcdHRoaXMubW92ZVkoaGFzaC5hdHRyWydmb250LXNpemUnXSAqIDIpOyAvLyBtb3ZlIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGluZSwgcGx1cyB0aGUgZGlzdGFuY2Ugb2YgdGhlIG1hcmdpbiwgd2hpY2ggaXMgYWxzbyBvbmUgbGluZS5cblx0fSBlbHNlIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcblx0XHR0aGlzLm1vdmVZKGhhc2guYXR0clsnZm9udC1zaXplJ10vMik7IC8vIFRPRE8tUEVSOiBtb3ZlIGRvd24gc29tZSAtIHRoZSB5IGxvY2F0aW9uIHNob3VsZCBiZSB0aGUgdG9wIG9mIHRoZSB0ZXh0LCBidXQgd2Ugb3V0cHV0IHRleHQgc3BlY2lmeWluZyB0aGUgY2VudGVyIGxpbmUuXG5cdFx0dGhpcy5vdXRwdXRUZXh0SWYodGhpcy5wYWRkaW5nLmxlZnQsIHRleHQsICd0ZXh0Zm9udCcsICdkZWZpbmVkLXRleHQnLCAwLCAwLCBcInN0YXJ0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBzdHIgPSBcIlwiO1xuXHRcdHZhciBpc0NlbnRlcmVkID0gZmFsc2U7IC8vIFRoZSBzdHJ1Y3R1cmUgaXMgd3JvbmcgaGVyZTogaXQgcmVxdWlyZXMgYW4gYXJyYXkgdG8gZG8gY2VudGVyaW5nLCBidXQgaXQgc2hvdWxkbid0IGhhdmUuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGV4dFtpXS5mb250KVxuXHRcdFx0XHRzdHIgKz0gXCJGT05UKFwiICsgdGV4dFtpXS5mb250ICsgXCIpXCI7XG5cdFx0XHRzdHIgKz0gdGV4dFtpXS50ZXh0O1xuXHRcdFx0aWYgKHRleHRbaV0uY2VudGVyKVxuXHRcdFx0XHRpc0NlbnRlcmVkID0gdHJ1ZTtcblx0XHR9XG5cdFx0dmFyIGFsaWdubWVudCA9IGlzQ2VudGVyZWQgPyAnbWlkZGxlJyA6ICdzdGFydCc7XG5cdFx0dmFyIHggPSBpc0NlbnRlcmVkID8gdGhpcy5jb250cm9sbGVyLndpZHRoIC8gMiA6IHRoaXMucGFkZGluZy5sZWZ0O1xuXHRcdHRoaXMub3V0cHV0VGV4dElmKHgsIHN0ciwgJ3RleHRmb250JywgJ2RlZmluZWQtdGV4dCcsIDAsIDEsIGFsaWdubWVudCk7XG5cdH1cbn07XG5cblJlbmRlcmVyLnByb3RvdHlwZS5vdXRwdXRTZXBhcmF0b3IgPSBmdW5jdGlvbiAoc2VwYXJhdG9yKSB7XG5cdGlmICghc2VwYXJhdG9yLmxpbmVMZW5ndGgpXG5cdFx0cmV0dXJuO1xuXHR0aGlzLm1vdmVZKHNlcGFyYXRvci5zcGFjZUFib3ZlKTtcblx0dGhpcy5wcmludFNlcGFyYXRvcihzZXBhcmF0b3IubGluZUxlbmd0aCk7XG5cdHRoaXMubW92ZVkoc2VwYXJhdG9yLnNwYWNlQmVsb3cpO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgYW4gZXh0cmEgc3VidGl0bGUgdGhhdCBpcyBkZWZpbmVkIGxhdGVyIGluIHRoZSB0dW5lLlxuICovXG5SZW5kZXJlci5wcm90b3R5cGUub3V0cHV0U3VidGl0bGUgPSBmdW5jdGlvbiAod2lkdGgsIHN1YnRpdGxlKSB7XG5cdHRoaXMub3V0cHV0VGV4dElmKHRoaXMucGFkZGluZy5sZWZ0ICsgd2lkdGggLyAyLCBzdWJ0aXRsZSwgJ3N1YnRpdGxlZm9udCcsICd0ZXh0IG1ldGEtdG9wJywgdGhpcy5zcGFjaW5nLnN1YnRpdGxlLCAwLCAnbWlkZGxlJyk7XG59O1xuXG4vKipcbiAqIEJlZ2luIGEgZ3JvdXAgb2YgZ2x5cGhzIHRoYXQgd2lsbCBhbHdheXMgYmUgbW92ZWQsIHNjYWxlZCBhbmQgaGlnaGxpZ2h0ZWQgdG9nZXRoZXJcbiAqL1xuUmVuZGVyZXIucHJvdG90eXBlLmJlZ2luR3JvdXAgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucGF0aCA9IFtdO1xuICB0aGlzLmxhc3RNID0gWzAsMF07XG4gIHRoaXMuaW5ncm91cCA9IHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIHBhdGggdG8gdGhlIGN1cnJlbnQgZ3JvdXBcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGhcbiAqIEBwcml2YXRlXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5hZGRQYXRoID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgcGF0aCA9IHBhdGggfHwgW107XG4gIGlmIChwYXRoLmxlbmd0aD09PTApIHJldHVybjtcbiAgcGF0aFswXVswXT1cIm1cIjtcbiAgcGF0aFswXVsxXS09dGhpcy5sYXN0TVswXTtcbiAgcGF0aFswXVsyXS09dGhpcy5sYXN0TVsxXTtcbiAgdGhpcy5sYXN0TVswXSs9cGF0aFswXVsxXTtcbiAgdGhpcy5sYXN0TVsxXSs9cGF0aFswXVsyXTtcbiAgdGhpcy5wYXRoLnB1c2gocGF0aFswXSk7XG4gIGZvciAodmFyIGk9MSxpaT1wYXRoLmxlbmd0aDtpPGlpO2krKykge1xuICAgIGlmIChwYXRoW2ldWzBdPT09XCJtXCIpIHtcbiAgICAgIHRoaXMubGFzdE1bMF0rPXBhdGhbaV1bMV07XG4gICAgICB0aGlzLmxhc3RNWzFdKz1wYXRoW2ldWzJdO1xuICAgIH1cbiAgICB0aGlzLnBhdGgucHVzaChwYXRoW2ldKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmQgYSBncm91cCBvZiBnbHlwaHMgdGhhdCB3aWxsIGFsd2F5cyBiZSBtb3ZlZCwgc2NhbGVkIGFuZCBoaWdobGlnaHRlZCB0b2dldGhlclxuICovXG5SZW5kZXJlci5wcm90b3R5cGUuZW5kR3JvdXAgPSBmdW5jdGlvbiAoa2xhc3MpIHtcbiAgdGhpcy5pbmdyb3VwID0gZmFsc2U7XG4gIGlmICh0aGlzLnBhdGgubGVuZ3RoPT09MCkgcmV0dXJuIG51bGw7XG4gIHZhciBwYXRoID0gXCJcIjtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhdGgubGVuZ3RoOyBpKyspXG5cdFx0cGF0aCArPSB0aGlzLnBhdGhbaV0uam9pbihcIiBcIik7XG5cdHZhciByZXQgPSB0aGlzLnBhcGVyLnBhdGgoe3BhdGg6IHBhdGgsIHN0cm9rZTpcIm5vbmVcIiwgZmlsbDpcIiMwMDAwMDBcIiwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKGtsYXNzKX0pO1xuXHR0aGlzLnBhdGggPSBbXTtcbiAgaWYgKHRoaXMuZG9SZWdyZXNzaW9uKSB0aGlzLmFkZFRvUmVncmVzc2lvbihyZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIGdldHMgc2NhbGVkXG4gKiBAcGFyYW0ge251bWJlcn0geDEgc3RhcnQgeFxuICogQHBhcmFtIHtudW1iZXJ9IHgyIGVuZCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcGl0Y2ggcGl0Y2ggdGhlIHN0YXZlIGxpbmUgaXMgZHJhd24gYXRcbiAqL1xuUmVuZGVyZXIucHJvdG90eXBlLnByaW50U3RhdmVMaW5lID0gZnVuY3Rpb24gKHgxLHgyLCBwaXRjaCwga2xhc3MpIHtcblx0dmFyIGV4dHJhQ2xhc3MgPSBcInN0YWZmXCI7XG5cdGlmIChrbGFzcyAhPT0gdW5kZWZpbmVkKVxuXHRcdGV4dHJhQ2xhc3MgKz0gXCIgXCIgKyBrbGFzcztcbiAgdmFyIGlzSUU9LypAY2Nfb24hQCovZmFsc2U7Ly9JRSBkZXRlY3RvclxuICB2YXIgZHkgPSAwLjM1O1xuICB2YXIgZmlsbCA9IFwiIzAwMDAwMFwiO1xuICBpZiAoaXNJRSkge1xuICAgIGR5ID0gMTtcbiAgICBmaWxsID0gXCIjNjY2NjY2XCI7XG4gIH1cbiAgdmFyIHkgPSB0aGlzLmNhbGNZKHBpdGNoKTtcbiAgdmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmIEwgJWYgJWYgTCAlZiAlZiB6XCIsIHgxLCB5LWR5LCB4MiwgeS1keSxcbiAgICAgeDIsIHkrZHksIHgxLCB5K2R5KTtcbiAgdmFyIHJldCA9IHRoaXMucGFwZXIucGF0aFRvQmFjayh7cGF0aDpwYXRoU3RyaW5nLCBzdHJva2U6XCJub25lXCIsIGZpbGw6ZmlsbCwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKGV4dHJhQ2xhc3MpfSk7XG4gIGlmICh0aGlzLmRvUmVncmVzc2lvbikgdGhpcy5hZGRUb1JlZ3Jlc3Npb24ocmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBnZXRzIHNjYWxlZCBpZiBub3QgaW4gYSBncm91cFxuICogQHBhcmFtIHtudW1iZXJ9IHggeCBjb29yZGluYXRlIG9mIHRoZSBzdGVtXG4gKiBAcGFyYW0ge251bWJlcn0gZHggc3RlbSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IHkxIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RlbSBib3R0b21cbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0ZW0gdG9wXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5wcmludFN0ZW0gPSBmdW5jdGlvbiAoeCwgZHgsIHkxLCB5Mikge1xuICBpZiAoZHg8MCkgeyAvLyBjb3JyZWN0IHBhdGggXCJoYW5kZWRuZXNzXCIgZm9yIGludGVyc2VjdGlvbiB3aXRoIG90aGVyIGVsZW1lbnRzXG4gICAgdmFyIHRtcCA9IHkyO1xuICAgIHkyID0geTE7XG4gICAgeTEgPSB0bXA7XG4gIH1cbiAgdmFyIGlzSUU9LypAY2Nfb24hQCovZmFsc2U7Ly9JRSBkZXRlY3RvclxuICB2YXIgZmlsbCA9IFwiIzAwMDAwMFwiO1xuICBpZiAoaXNJRSAmJiBkeDwxKSB7XG4gICAgZHggPSAxO1xuICAgIGZpbGwgPSBcIiM2NjY2NjZcIjtcbiAgfVxuICBpZiAofn54ID09PSB4KSB4Kz0wLjA1OyAvLyByYXBoYWVsIGRvZXMgd2VpcmQgcm91bmRpbmcgKGZvciBWTUwpXG4gIHZhciBwYXRoQXJyYXkgPSBbW1wiTVwiLHgseTFdLFtcIkxcIiwgeCwgeTJdLFtcIkxcIiwgeCtkeCwgeTJdLFtcIkxcIix4K2R4LHkxXSxbXCJ6XCJdXTtcbiAgaWYgKCFpc0lFICYmIHRoaXMuaW5ncm91cCkge1xuICAgIHRoaXMuYWRkUGF0aChwYXRoQXJyYXkpO1xuICB9IGVsc2Uge1xuICBcdHZhciBwYXRoID0gXCJcIjtcbiAgXHRmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKylcbiAgXHRcdHBhdGggKz0gcGF0aEFycmF5W2ldLmpvaW4oXCIgXCIpO1xuICAgIHZhciByZXQgPSB0aGlzLnBhcGVyLnBhdGhUb0JhY2soe3BhdGg6cGF0aCwgc3Ryb2tlOlwibm9uZVwiLCBmaWxsOmZpbGwsICdjbGFzcyc6IHRoaXMuYWRkQ2xhc3Nlcygnc3RlbScpfSk7XG4gICAgaWYgKHRoaXMuZG9SZWdyZXNzaW9uKSB0aGlzLmFkZFRvUmVncmVzc2lvbihyZXQpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxufTtcblxuZnVuY3Rpb24ga2VyblN5bWJvbHMobGFzdFN5bWJvbCwgdGhpc1N5bWJvbCwgbGFzdFN5bWJvbFdpZHRoKSB7XG5cdC8vIFRoaXMgaXMganVzdCBzb21lIGFkanVzdG1lbnRzIHRvIG1ha2UgaXQgbG9vayBiZXR0ZXIuXG5cdHZhciB3aWR0aCA9IGxhc3RTeW1ib2xXaWR0aDtcblx0aWYgKGxhc3RTeW1ib2wgPT09ICdmJyAmJiB0aGlzU3ltYm9sID09PSAnZicpXG5cdFx0d2lkdGggPSB3aWR0aCoyLzM7XG5cdGlmIChsYXN0U3ltYm9sID09PSAncCcgJiYgdGhpc1N5bWJvbCA9PT0gJ3AnKVxuXHRcdHdpZHRoID0gd2lkdGgqNS82O1xuXHRpZiAobGFzdFN5bWJvbCA9PT0gJ2YnICYmIHRoaXNTeW1ib2wgPT09ICd6Jylcblx0XHR3aWR0aCA9IHdpZHRoKjUvODtcblx0cmV0dXJuIHdpZHRoO1xufVxuXG4vKipcbiAqIGFzc3VtZXMgdGhpcy55IGlzIHNldCBhcHByb3ByaWF0ZWx5XG4gKiBpZiBzeW1ib2wgaXMgYSBtdWx0aWNoYXIgc3RyaW5nIHdpdGhvdXQgYSAuIChhcyBpbiBzY3JpcHRzLnN0YWNjYXRvKSAxIHN5bWJvbCBwZXIgY2hhciBpcyBhc3N1bWVkXG4gKiBub3Qgc2NhbGVkIGlmIG5vdCBpbiBwcmludGdyb3VwXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5wcmludFN5bWJvbCA9IGZ1bmN0aW9uICh4LCBvZmZzZXQsIHN5bWJvbCwgc2NhbGV4LCBzY2FsZXksIGtsYXNzKSB7XG5cdHZhciBlbDtcblx0dmFyIHljb3JyO1xuXHRpZiAoIXN5bWJvbCkgcmV0dXJuIG51bGw7XG5cdGlmIChzeW1ib2wubGVuZ3RoID4gMSAmJiBzeW1ib2wuaW5kZXhPZihcIi5cIikgPCAwKSB7XG5cdFx0dGhpcy5wYXBlci5vcGVuR3JvdXAoKTtcblx0XHR2YXIgZHggPSAwO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9sLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHN5bWJvbC5jaGFyQXQoaSk7XG5cdFx0XHR5Y29yciA9IGdseXBocy5nZXRZQ29ycihzKTtcblx0XHRcdGVsID0gZ2x5cGhzLnByaW50U3ltYm9sKHggKyBkeCwgdGhpcy5jYWxjWShvZmZzZXQgKyB5Y29yciksIHMsIHRoaXMucGFwZXIsIGtsYXNzKTtcblx0XHRcdGlmIChlbCkge1xuXHRcdFx0XHRpZiAodGhpcy5kb1JlZ3Jlc3Npb24pIHRoaXMuYWRkVG9SZWdyZXNzaW9uKGVsKTtcblx0XHRcdFx0Ly9lbGVtc2V0LnB1c2goZWwpO1xuXHRcdFx0XHRpZiAoaSA8IHN5bWJvbC5sZW5ndGggLSAxKVxuXHRcdFx0XHRcdGR4ICs9IGtlcm5TeW1ib2xzKHMsIHN5bWJvbC5jaGFyQXQoaSArIDEpLCBnbHlwaHMuZ2V0U3ltYm9sV2lkdGgocykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5yZW5kZXJUZXh0KHgsIHRoaXMueSwgXCJubyBzeW1ib2w6XCIgKyBzeW1ib2wsIFwiZGVidWdmb250XCIsICdkZWJ1Zy1tc2cnLCAnc3RhcnQnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucGFwZXIuY2xvc2VHcm91cCgpO1xuXHR9IGVsc2Uge1xuXHRcdHljb3JyID0gZ2x5cGhzLmdldFlDb3JyKHN5bWJvbCk7XG5cdFx0aWYgKHRoaXMuaW5ncm91cCkge1xuXHRcdFx0dGhpcy5hZGRQYXRoKGdseXBocy5nZXRQYXRoRm9yU3ltYm9sKHgsIHRoaXMuY2FsY1kob2Zmc2V0ICsgeWNvcnIpLCBzeW1ib2wsIHNjYWxleCwgc2NhbGV5KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsID0gZ2x5cGhzLnByaW50U3ltYm9sKHgsIHRoaXMuY2FsY1kob2Zmc2V0ICsgeWNvcnIpLCBzeW1ib2wsIHRoaXMucGFwZXIsIGtsYXNzKTtcblx0XHRcdGlmIChlbCkge1xuXHRcdFx0XHRpZiAodGhpcy5kb1JlZ3Jlc3Npb24pIHRoaXMuYWRkVG9SZWdyZXNzaW9uKGVsKTtcblx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHRoaXMucmVuZGVyVGV4dCh4LCB0aGlzLnksIFwibm8gc3ltYm9sOlwiICsgc3ltYm9sLCBcImRlYnVnZm9udFwiLCAnZGVidWctbXNnJywgJ3N0YXJ0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG59O1xuXG5SZW5kZXJlci5wcm90b3R5cGUuc2NhbGVFeGlzdGluZ0VsZW0gPSBmdW5jdGlvbiAoZWxlbSwgc2NhbGVYLCBzY2FsZVksIHgsIHkpIHtcblx0dGhpcy5wYXBlci5zZXRBdHRyaWJ1dGVPbkVsZW1lbnQoZWxlbSwgeyBzdHlsZTogXCJ0cmFuc2Zvcm06c2NhbGUoXCIrc2NhbGVYK1wiLFwiK3NjYWxlWSArIFwiKTt0cmFuc2Zvcm0tb3JpZ2luOlwiICsgeCArIFwicHggXCIgKyB5ICsgXCJweDtcIn0pO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLnByaW50UGF0aCA9IGZ1bmN0aW9uIChhdHRycykge1xuICB2YXIgcmV0ID0gdGhpcy5wYXBlci5wYXRoKGF0dHJzKTtcbiAgaWYgKHRoaXMuZG9SZWdyZXNzaW9uKSB0aGlzLmFkZFRvUmVncmVzc2lvbihyZXQpO1xuICByZXR1cm4gcmV0O1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLmRyYXdCcmFjZSA9IGZ1bmN0aW9uKHhMZWZ0LCB5VG9wLCB5Qm90dG9tKSB7Ly9Ub255XG5cdHZhciB5SGVpZ2h0ID0geUJvdHRvbSAtIHlUb3A7XG5cblx0dmFyIHhDdXJ2ZSA9IFs3LjUsIC04LCAyMSwgMCwgMTguNSwgLTEwLjUsIDcuNV07XG5cdHZhciB5Q3VydmUgPSBbMCwgeUhlaWdodC81LjUsIHlIZWlnaHQvMy4xNCwgeUhlaWdodC8yLCB5SGVpZ2h0LzIuOTMsIHlIZWlnaHQvNC44OCwgMF07XG5cblx0dmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBDICVmICVmICVmICVmICVmICVmIEMgJWYgJWYgJWYgJWYgJWYgJWYgelwiLFxuXHRcdHhMZWZ0K3hDdXJ2ZVswXSwgeVRvcCt5Q3VydmVbMF0sXG5cdFx0eExlZnQreEN1cnZlWzFdLCB5VG9wK3lDdXJ2ZVsxXSxcblx0XHR4TGVmdCt4Q3VydmVbMl0sIHlUb3AreUN1cnZlWzJdLFxuXHRcdHhMZWZ0K3hDdXJ2ZVszXSwgeVRvcCt5Q3VydmVbM10sXG5cdFx0eExlZnQreEN1cnZlWzRdLCB5VG9wK3lDdXJ2ZVs0XSxcblx0XHR4TGVmdCt4Q3VydmVbNV0sIHlUb3AreUN1cnZlWzVdLFxuXHRcdHhMZWZ0K3hDdXJ2ZVs2XSwgeVRvcCt5Q3VydmVbNl0pO1xuXHR2YXIgcmV0MSA9IHRoaXMucGFwZXIucGF0aCh7cGF0aDpwYXRoU3RyaW5nLCBzdHJva2U6XCIjMDAwMDAwXCIsIGZpbGw6XCIjMDAwMDAwXCIsICdjbGFzcyc6IHRoaXMuYWRkQ2xhc3NlcygnYnJhY2UnKX0pO1xuXG5cdHhDdXJ2ZSA9IFswLCAxNy41LCAtNy41LCA2LjYsIC01LCAyMCwgMF07XG5cdHlDdXJ2ZSA9IFt5SGVpZ2h0LzIsIHlIZWlnaHQvMS40NiwgeUhlaWdodC8xLjIyLCB5SGVpZ2h0LCB5SGVpZ2h0LzEuMTksIHlIZWlnaHQvMS40MiwgeUhlaWdodC8yXTtcblxuXHRwYXRoU3RyaW5nID0gc3ByaW50ZihcIk0gJWYgJWYgQyAlZiAlZiAlZiAlZiAlZiAlZiBDICVmICVmICVmICVmICVmICVmIHpcIixcblx0XHR4TGVmdCt4Q3VydmVbIDBdLCB5VG9wK3lDdXJ2ZVswXSxcblx0XHR4TGVmdCt4Q3VydmVbMV0sIHlUb3AreUN1cnZlWzFdLFxuXHRcdHhMZWZ0K3hDdXJ2ZVsyXSwgeVRvcCt5Q3VydmVbMl0sXG5cdFx0eExlZnQreEN1cnZlWzNdLCB5VG9wK3lDdXJ2ZVszXSxcblx0XHR4TGVmdCt4Q3VydmVbNF0sIHlUb3AreUN1cnZlWzRdLFxuXHRcdHhMZWZ0K3hDdXJ2ZVs1XSwgeVRvcCt5Q3VydmVbNV0sXG5cdFx0eExlZnQreEN1cnZlWzZdLCB5VG9wK3lDdXJ2ZVs2XSk7XG5cdHZhciByZXQyID0gdGhpcy5wYXBlci5wYXRoKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpcIiMwMDAwMDBcIiwgZmlsbDpcIiMwMDAwMDBcIiwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKCdicmFjZScpfSk7XG5cblx0aWYgKHRoaXMuZG9SZWdyZXNzaW9uKXtcblx0XHR0aGlzLmFkZFRvUmVncmVzc2lvbihyZXQxKTtcblx0XHR0aGlzLmFkZFRvUmVncmVzc2lvbihyZXQyKTtcblx0fVxuXHRyZXR1cm4gcmV0MSArIHJldDI7XG59O1xuXG5SZW5kZXJlci5wcm90b3R5cGUuZHJhd0FyYyA9IGZ1bmN0aW9uKHgxLCB4MiwgcGl0Y2gxLCBwaXRjaDIsIGFib3ZlLCBrbGFzcywgaXNUaWUpIHtcblx0Ly8gSWYgaXQgaXMgYSB0aWUgdnMuIGEgc2x1ciwgZHJhdyBpdCBzaGFsbG93ZXIuXG5cdHZhciBzcGFjaW5nID0gaXNUaWUgPyAxLjIgOiAxLjU7XG5cbiAgeDEgPSB4MSArIDY7XG4gIHgyID0geDIgKyA0O1xuICBwaXRjaDEgPSBwaXRjaDEgKyAoKGFib3ZlKT9zcGFjaW5nOi1zcGFjaW5nKTtcbiAgcGl0Y2gyID0gcGl0Y2gyICsgKChhYm92ZSk/c3BhY2luZzotc3BhY2luZyk7XG4gIHZhciB5MSA9IHRoaXMuY2FsY1kocGl0Y2gxKTtcbiAgdmFyIHkyID0gdGhpcy5jYWxjWShwaXRjaDIpO1xuXG4gIC8vdW5pdCBkaXJlY3Rpb24gdmVjdG9yXG4gIHZhciBkeCA9IHgyLXgxO1xuICB2YXIgZHkgPSB5Mi15MTtcbiAgdmFyIG5vcm09IE1hdGguc3FydChkeCpkeCtkeSpkeSk7XG4gIHZhciB1eCA9IGR4L25vcm07XG4gIHZhciB1eSA9IGR5L25vcm07XG5cbiAgdmFyIGZsYXR0ZW4gPSBub3JtLzMuNTtcbiAgdmFyIG1heEZsYXR0ZW4gPSBpc1RpZSA/IDEwIDogMjU7ICAvLyBJZiBpdCBpcyBhIHRpZSB2cy4gYSBzbHVyLCBkcmF3IGl0IHNoYWxsb3dlci5cbiAgdmFyIGN1cnZlID0gKChhYm92ZSk/LTE6MSkqTWF0aC5taW4obWF4RmxhdHRlbiwgTWF0aC5tYXgoNCwgZmxhdHRlbikpO1xuXG4gIHZhciBjb250cm9seDEgPSB4MStmbGF0dGVuKnV4LWN1cnZlKnV5O1xuICB2YXIgY29udHJvbHkxID0geTErZmxhdHRlbip1eStjdXJ2ZSp1eDtcbiAgdmFyIGNvbnRyb2x4MiA9IHgyLWZsYXR0ZW4qdXgtY3VydmUqdXk7XG4gIHZhciBjb250cm9seTIgPSB5Mi1mbGF0dGVuKnV5K2N1cnZlKnV4O1xuICB2YXIgdGhpY2tuZXNzID0gMjtcbiAgdmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBDICVmICVmICVmICVmICVmICVmIEMgJWYgJWYgJWYgJWYgJWYgJWYgelwiLCB4MSwgeTEsXG4gICAgIGNvbnRyb2x4MSwgY29udHJvbHkxLCBjb250cm9seDIsIGNvbnRyb2x5MiwgeDIsIHkyLFxuICAgICBjb250cm9seDItdGhpY2tuZXNzKnV5LCBjb250cm9seTIrdGhpY2tuZXNzKnV4LCBjb250cm9seDEtdGhpY2tuZXNzKnV5LCBjb250cm9seTErdGhpY2tuZXNzKnV4LCB4MSwgeTEpO1xuXHRpZiAoa2xhc3MpXG5cdFx0a2xhc3MgKz0gJyBzbHVyJztcblx0ZWxzZVxuXHRcdGtsYXNzID0gJ3NsdXInO1xuICB2YXIgcmV0ID0gdGhpcy5wYXBlci5wYXRoKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpcIm5vbmVcIiwgZmlsbDpcIiMwMDAwMDBcIiwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKGtsYXNzKX0pO1xuICBpZiAodGhpcy5kb1JlZ3Jlc3Npb24pIHRoaXMuYWRkVG9SZWdyZXNzaW9uKHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHkgZm9yIGEgZ2l2ZW4gcGl0Y2ggdmFsdWUgKHJlbGF0aXZlIHRvIHRoZSBzdGF2ZSB0aGUgcmVuZGVyZXIgaXMgY3VycmVudGx5IHByaW50aW5nKVxuICogQHBhcmFtIHtudW1iZXJ9IG9mcyBwaXRjaCB2YWx1ZSAoYm90dG9tIEMgb24gYSBHIGNsZWYgPSAwLCBEPTEsIGV0Yy4pXG4gKi9cblJlbmRlcmVyLnByb3RvdHlwZS5jYWxjWSA9IGZ1bmN0aW9uKG9mcykge1xuICByZXR1cm4gdGhpcy55IC0gb2ZzKnNwYWNpbmcuU1RFUDtcbn07XG5cbi8qKlxuICogUHJpbnQgQHBhcmFtIHtudW1iZXJ9IG51bUxpbmVzLiBJZiB0aGVyZSBpcyAxIGxpbmUgaXQgaXMgdGhlIEIgbGluZS4gT3RoZXJ3aXNlIHRoZSBib3R0b20gbGluZSBpcyB0aGUgRSBsaW5lLlxuICovXG5SZW5kZXJlci5wcm90b3R5cGUucHJpbnRTdGF2ZSA9IGZ1bmN0aW9uIChzdGFydHgsIGVuZHgsIG51bUxpbmVzKSB7XG5cdHZhciBrbGFzcyA9IFwidG9wLWxpbmVcIjtcblx0dGhpcy5wYXBlci5vcGVuR3JvdXAoeyBwcmVwZW5kOiB0cnVlIH0pO1xuXHQvLyBJZiB0aGVyZSBpcyBvbmUgbGluZSwgaXQgaXMgdGhlIEIgbGluZS4gT3RoZXJ3aXNlLCB0aGUgYm90dG9tIGxpbmUgaXMgdGhlIEUgbGluZS5cblx0aWYgKG51bUxpbmVzID09PSAxKSB7XG5cdFx0dGhpcy5wcmludFN0YXZlTGluZShzdGFydHgsZW5keCw2LCBrbGFzcyk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGZvciAodmFyIGkgPSBudW1MaW5lcy0xOyBpID49IDA7IGktLSkge1xuXHRcdHRoaXMucHJpbnRTdGF2ZUxpbmUoc3RhcnR4LGVuZHgsKGkrMSkqMiwga2xhc3MpO1xuXHRcdGtsYXNzID0gdW5kZWZpbmVkO1xuXHR9XG5cdHRoaXMucGFwZXIuY2xvc2VHcm91cCgpO1xufTtcblxuLyoqXG4gKlxuICogQHByaXZhdGVcbiAqL1xuUmVuZGVyZXIucHJvdG90eXBlLmFkZENsYXNzZXMgPSBmdW5jdGlvbiAoYywgaXNOb3RlKSB7XG5cdGlmICghdGhpcy5zaG91bGRBZGRDbGFzc2VzKVxuXHRcdHJldHVybiBcIlwiO1xuXHR2YXIgcmV0ID0gW107XG5cdGlmIChjLmxlbmd0aCA+IDApIHJldC5wdXNoKGMpO1xuXHRpZiAodGhpcy5saW5lTnVtYmVyICE9PSBudWxsICYmIHRoaXMubGluZU51bWJlciAhPT0gdW5kZWZpbmVkKSByZXQucHVzaChcImxcIit0aGlzLmxpbmVOdW1iZXIpO1xuXHRpZiAodGhpcy5tZWFzdXJlTnVtYmVyICE9PSBudWxsICYmIHRoaXMubWVhc3VyZU51bWJlciAhPT0gdW5kZWZpbmVkKSByZXQucHVzaChcIm1cIit0aGlzLm1lYXN1cmVOdW1iZXIpO1xuXHRpZiAodGhpcy52b2ljZU51bWJlciAhPT0gbnVsbCAmJiB0aGlzLnZvaWNlTnVtYmVyICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKFwidlwiK3RoaXMudm9pY2VOdW1iZXIpO1xuXHRpZiAoKGMuaW5kZXhPZignbm90ZScpID49IDAgfHwgYy5pbmRleE9mKCdyZXN0JykgPj0gMCB8fCBjLmluZGV4T2YoJ2x5cmljJykgPj0gMCApICYmIHRoaXMubm90ZU51bWJlciAhPT0gbnVsbCAmJiB0aGlzLm5vdGVOdW1iZXIgIT09IHVuZGVmaW5lZCkgcmV0LnB1c2goXCJuXCIrdGhpcy5ub3RlTnVtYmVyKTtcblx0Ly8gYWRkIGEgcHJlZml4IHRvIGFsbCBjbGFzc2VzIHRoYXQgYWJjanMgYWRkcy5cblx0aWYgKHJldC5sZW5ndGggPiAwKSB7XG5cdFx0cmV0ID0gcmV0LmpvaW4oJyAnKTsgLy8gU29tZSBzdHJpbmdzIGFyZSBjb21wb3VuZCBjbGFzc2VzIC0gdGhhdCBpcywgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGNsYXNzIGluIGEgc3RyaW5nLlxuXHRcdHJldCA9IHJldC5zcGxpdCgnICcpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAocmV0W2ldLmluZGV4T2YoJ2FiY2pzLScpICE9PSAwICYmIHJldFtpXS5sZW5ndGggPiAwKSAvLyBpZiB0aGUgcHJlZml4IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBhbmQgdGhlIGNsYXNzIGlzIG5vdCBibGFuay5cblx0XHRcdFx0cmV0W2ldID0gJ2FiY2pzLScgKyByZXRbaV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXQuam9pbignICcpO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLmdldEZvbnRBbmRBdHRyID0gZnVuY3Rpb24odHlwZSwga2xhc3MpIHtcblx0dmFyIGZvbnQ7XG5cdGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcblx0XHRmb250ID0gdGhpcy5hYmN0dW5lLmZvcm1hdHRpbmdbdHlwZV07XG5cdFx0Ly8gUmFwaGFlbCBkZWxpYmVyYXRlbHkgY2hhbmdlcyB0aGUgZm9udCB1bml0cyB0byBwaXhlbHMgZm9yIHNvbWUgcmVhc29uLCBzbyB3ZSBuZWVkIHRvIGNoYW5nZSBwb2ludHMgdG8gcGl4ZWxzIGhlcmUuXG5cdFx0aWYgKGZvbnQpXG5cdFx0XHRmb250ID0ge2ZhY2U6IGZvbnQuZmFjZSwgc2l6ZTogZm9udC5zaXplICogNCAvIDMsIGRlY29yYXRpb246IGZvbnQuZGVjb3JhdGlvbiwgc3R5bGU6IGZvbnQuc3R5bGUsIHdlaWdodDogZm9udC53ZWlnaHQsIGJveDogZm9udC5ib3h9O1xuXHRcdGVsc2Vcblx0XHRcdGZvbnQgPSB7ZmFjZTogXCJBcmlhbFwiLCBzaXplOiAxMiAqIDQgLyAzLCBkZWNvcmF0aW9uOiBcInVuZGVybGluZVwiLCBzdHlsZTogXCJub3JtYWxcIiwgd2VpZ2h0OiBcIm5vcm1hbFwifTtcblx0fSBlbHNlXG5cdFx0Zm9udCA9IHtmYWNlOiB0eXBlLmZhY2UsIHNpemU6IHR5cGUuc2l6ZSAqIDQgLyAzLCBkZWNvcmF0aW9uOiB0eXBlLmRlY29yYXRpb24sIHN0eWxlOiB0eXBlLnN0eWxlLCB3ZWlnaHQ6IHR5cGUud2VpZ2h0LCBib3g6IHR5cGUuYm94fTtcblxuXHR2YXIgYXR0ciA9IHtcImZvbnQtc2l6ZVwiOiBmb250LnNpemUsICdmb250LXN0eWxlJzogZm9udC5zdHlsZSxcblx0XHRcImZvbnQtZmFtaWx5XCI6IGZvbnQuZmFjZSwgJ2ZvbnQtd2VpZ2h0JzogZm9udC53ZWlnaHQsICd0ZXh0LWRlY29yYXRpb24nOiBmb250LmRlY29yYXRpb24sXG5cdFx0J2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKGtsYXNzKSB9O1xuXHRhdHRyLmZvbnQgPSBcIlwiO1x0Ly8gVGhlcmUgaXMgYSBzcHVyaW91cyBmb250IGRlZmluaXRpb24gdGhhdCBpcyBwdXQgb24gYWxsIHRleHQgZWxlbWVudHMuIFRoaXMgb3ZlcndyaXRlcyBpdC5cblx0cmV0dXJuIHsgZm9udDogZm9udCwgYXR0cjogYXR0ciB9O1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLmdldFRleHRTaXplID0gZnVuY3Rpb24odGV4dCwgdHlwZSwga2xhc3MsIGVsKSB7XG5cdHZhciBoYXNoID0gdGhpcy5nZXRGb250QW5kQXR0cih0eXBlLCBrbGFzcyk7XG5cdHZhciBzaXplID0gdGhpcy5wYXBlci5nZXRUZXh0U2l6ZSh0ZXh0LCBoYXNoLmF0dHIsIGVsKTtcblx0aWYgKGhhc2guZm9udC5ib3gpIHtcblx0XHRzaXplLmhlaWdodCArPSA4O1xuXHRcdHNpemUud2lkdGggKz0gODtcblx0fVxuXHRyZXR1cm4gc2l6ZTtcbn07XG5cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJUZXh0ID0gZnVuY3Rpb24oeCwgeSwgdGV4dCwgdHlwZSwga2xhc3MsIGFuY2hvciwgY2VudGVyVmVydGljYWxseSkge1xuXHR2YXIgaGFzaCA9IHRoaXMuZ2V0Rm9udEFuZEF0dHIodHlwZSwga2xhc3MpO1xuXHRpZiAoYW5jaG9yKVxuXHRcdGhhc2guYXR0cltcInRleHQtYW5jaG9yXCJdID0gYW5jaG9yO1xuXHRoYXNoLmF0dHIueCA9IHg7XG5cdGhhc2guYXR0ci55ID0geSArIDc7IC8vIFRPRE8tUEVSOiBOb3Qgc3VyZSB3aHkgdGhlIHRleHQgYXBwZWFycyB0byBiZSA3IHBpeGVscyBvZmYuXG5cdGlmICghY2VudGVyVmVydGljYWxseSlcblx0XHRoYXNoLmF0dHIuZHkgPSBcIjAuNWVtXCI7XG5cdGlmICh0eXBlID09PSAnZGVidWdmb250Jykge1xuXHRcdGNvbnNvbGUubG9nKFwiRGVidWcgbXNnOiBcIiArIHRleHQpO1xuXHRcdGhhc2guYXR0ci5zdHJva2UgPSBcIiNmZjAwMDBcIjtcblx0fVxuXG5cdHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcblxcbi9nLCBcIlxcbiBcXG5cIik7XG5cdHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXG4vLCBcIlxceEEwXFxuXCIpO1xuXG5cdGlmIChoYXNoLmZvbnQuYm94KSB7XG5cdFx0aGFzaC5hdHRyLnggKz0gMjtcblx0XHRoYXNoLmF0dHIueSArPSA0O1xuXHR9XG5cdHZhciBlbCA9IHRoaXMucGFwZXIudGV4dCh0ZXh0LCBoYXNoLmF0dHIpO1xuXG5cdGlmIChoYXNoLmZvbnQuYm94KSB7XG5cdFx0dmFyIHNpemUgPSB0aGlzLmdldFRleHRTaXplKHRleHQsIHR5cGUsIGtsYXNzKTtcblx0XHR2YXIgcGFkZGluZyA9IDI7XG5cdFx0dmFyIG1hcmdpbiA9IDI7XG5cdFx0dGhpcy5wYXBlci5yZWN0KHsgeDogeCAtIHBhZGRpbmcsIHk6IHksIHdpZHRoOiBzaXplLndpZHRoICsgcGFkZGluZyoyLCBoZWlnaHQ6IHNpemUuaGVpZ2h0ICsgcGFkZGluZyoyIC0gbWFyZ2luLCAgc3Ryb2tlOiBcIiM4ODg4ODhcIiwgZmlsbDogXCJ0cmFuc3BhcmVudFwifSk7XG5cdFx0Ly9zaXplLmhlaWdodCArPSA4O1xuXHR9XG5cdGlmICh0aGlzLmRvUmVncmVzc2lvbikgdGhpcy5hZGRUb1JlZ3Jlc3Npb24oZWwpO1xuXHRyZXR1cm4gZWw7XG59O1xuXG5SZW5kZXJlci5wcm90b3R5cGUubW92ZVkgPSBmdW5jdGlvbiAoZW0sIG51bUxpbmVzKSB7XG5cdGlmIChudW1MaW5lcyA9PT0gdW5kZWZpbmVkKSBudW1MaW5lcyA9IDE7XG5cdHRoaXMueSArPSBlbSpudW1MaW5lcztcbn07XG5cblJlbmRlcmVyLnByb3RvdHlwZS5za2lwU3BhY2VZID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLnkgKz0gdGhpcy5zcGFjZTtcbn07XG5cbi8vIENhbGwgd2l0aCAna2luZCcgYmVpbmcgdGhlIGZvbnQgdHlwZSB0byB1c2UsXG4vLyBpZiBtYXJnaW5Cb3R0b20gPT09IG51bGwgdGhlbiBkb24ndCBpbmNyZW1lbnQgdGhlIFkgYWZ0ZXIgcHJpbnRpbmcsIG90aGVyd2lzZSB0aGF0IGlzIHRoZSBleHRyYSBudW1iZXIgb2YgZW0ncyB0byBsZWF2ZSBiZWxvdyB0aGUgbGluZS5cbi8vIGFuZCBhbGlnbm1lbnQgYmVpbmcgXCJzdGFydFwiLCBcIm1pZGRsZVwiLCBvciBcImVuZFwiLlxuUmVuZGVyZXIucHJvdG90eXBlLm91dHB1dFRleHRJZiA9IGZ1bmN0aW9uKHgsIHN0ciwga2luZCwga2xhc3MsIG1hcmdpblRvcCwgbWFyZ2luQm90dG9tLCBhbGlnbm1lbnQpIHtcblx0aWYgKHN0cikge1xuXHRcdGlmIChtYXJnaW5Ub3ApXG5cdFx0XHR0aGlzLm1vdmVZKG1hcmdpblRvcCk7XG5cdFx0dmFyIGVsID0gdGhpcy5yZW5kZXJUZXh0KHgsIHRoaXMueSwgc3RyLCBraW5kLCBrbGFzcywgYWxpZ25tZW50KTtcblx0XHR2YXIgYmIgPSB0aGlzLmdldFRleHRTaXplKHN0ciwga2luZCwga2xhc3MpO1xuXHRcdHZhciB3aWR0aCA9IGlzTmFOKGJiLndpZHRoKSA/IDAgOiBiYi53aWR0aDtcblx0XHR2YXIgaGVpZ2h0ID0gaXNOYU4oYmIuaGVpZ2h0KSA/IDAgOiBiYi5oZWlnaHQ7XG5cdFx0dmFyIGhhc2ggPSB0aGlzLmdldEZvbnRBbmRBdHRyKGtpbmQsIGtsYXNzKTtcblx0XHRpZiAoaGFzaC5mb250LmJveCkge1xuXHRcdFx0d2lkdGggKz0gODtcblx0XHRcdGhlaWdodCArPSA4O1xuXHRcdH1cblx0XHRpZiAobWFyZ2luQm90dG9tICE9PSBudWxsKSB7XG5cdFx0XHR2YXIgbnVtTGluZXMgPSBzdHIuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuXHRcdFx0aWYgKCFpc05hTihiYi5oZWlnaHQpKVxuXHRcdFx0XHR0aGlzLm1vdmVZKGhlaWdodC9udW1MaW5lcywgKG51bUxpbmVzICsgbWFyZ2luQm90dG9tKSk7XG5cdFx0fVxuXHRcdHJldHVybiBbd2lkdGgsIGhlaWdodF07XG5cdH1cblx0cmV0dXJuIFswLDBdO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLmFkZEludmlzaWJsZU1hcmtlciA9IGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcblx0dmFyIGR5ID0gMC4zNTtcblx0dmFyIGZpbGwgPSBcInJnYmEoMCwwLDAsMClcIjtcblx0dmFyIHkgPSB0aGlzLnk7XG5cdHkgPSBNYXRoLnJvdW5kKHkpO1xuXHR2YXIgeDEgPSAwO1xuXHR2YXIgeDIgPSAxMDA7XG5cdHZhciBwYXRoU3RyaW5nID0gc3ByaW50ZihcIk0gJWYgJWYgTCAlZiAlZiBMICVmICVmIEwgJWYgJWYgelwiLCB4MSwgeS1keSwgeDEreDIsIHktZHksXG5cdFx0eDIsIHkrZHksIHgxLCB5K2R5KTtcblx0dGhpcy5wYXBlci5wYXRoVG9CYWNrKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpcIm5vbmVcIiwgZmlsbDpmaWxsLCBcImZpbGwtb3BhY2l0eVwiOiAwLCAnY2xhc3MnOiB0aGlzLmFkZENsYXNzZXMoY2xhc3NOYW1lKSwgJ2RhdGEtdmVydGljYWwnOiB5IH0pO1xufTtcblxuUmVuZGVyZXIucHJvdG90eXBlLnByaW50U2VwYXJhdG9yID0gZnVuY3Rpb24od2lkdGgpIHtcblx0dmFyIGZpbGwgPSBcInJnYmEoMCwwLDAsMjU1KVwiO1xuXHR2YXIgc3Ryb2tlID0gXCJyZ2JhKDAsMCwwLDApXCI7XG5cdHZhciB5ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuXHR2YXIgc3RhZmZXaWR0aCA9IHRoaXMuY29udHJvbGxlci53aWR0aDtcblx0dmFyIHgxID0gKHN0YWZmV2lkdGggLSB3aWR0aCkvMjtcblx0dmFyIHgyID0geDEgKyB3aWR0aDtcblx0dmFyIHBhdGhTdHJpbmcgPSAnTSAnICsgeDEgKyAnICcgKyB5ICtcblx0XHQnIEwgJyArIHgyICsgJyAnICsgeSArXG5cdFx0JyBMICcgKyB4MiArICcgJyArICh5KzEpICtcblx0XHQnIEwgJyArIHgxICsgJyAnICsgKHkrMSkgK1xuXHRcdCcgTCAnICsgeDEgKyAnICcgKyB5ICsgJyB6Jztcblx0dGhpcy5wYXBlci5wYXRoVG9CYWNrKHtwYXRoOnBhdGhTdHJpbmcsIHN0cm9rZTpzdHJva2UsIGZpbGw6ZmlsbCwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKCdkZWZpbmVkLXRleHQnKX0pO1xufTtcblxuLy8gRm9yIGRlYnVnZ2luZywgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBrbm93IHdoZXJlIHlvdSBhcmUgdmVydGljYWxseS5cblJlbmRlcmVyLnByb3RvdHlwZS5wcmludEhvcml6b250YWxMaW5lID0gZnVuY3Rpb24gKHdpZHRoLCB2ZXJ0aWNhbCwgY29tbWVudCkge1xuXHR2YXIgZHkgPSAwLjM1O1xuXHR2YXIgZmlsbCA9IFwicmdiYSgwLDAsMjU1LC40KVwiO1xuXHR2YXIgeSA9IHRoaXMueTtcblx0aWYgKHZlcnRpY2FsKSB5ID0gdmVydGljYWw7XG5cdHkgPSBNYXRoLnJvdW5kKHkpO1xuXHR0aGlzLnBhcGVyLnRleHQoXCJcIitNYXRoLnJvdW5kKHkpLCB7eDogMTAsIHk6IHksIFwidGV4dC1hbmNob3JcIjogXCJzdGFydFwiLCBcImZvbnQtc2l6ZVwiOlwiMThweFwiLCBmaWxsOiBmaWxsLCBzdHJva2U6IGZpbGwgfSk7XG5cdHZhciB4MSA9IDUwO1xuXHR2YXIgeDIgPSB3aWR0aDtcblx0dmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmIEwgJWYgJWYgTCAlZiAlZiB6XCIsIHgxLCB5LWR5LCB4MSt4MiwgeS1keSxcblx0XHR4MiwgeStkeSwgeDEsIHkrZHkpO1xuXHR0aGlzLnBhcGVyLnBhdGhUb0JhY2soe3BhdGg6cGF0aFN0cmluZywgc3Ryb2tlOlwibm9uZVwiLCBmaWxsOmZpbGwsICdjbGFzcyc6IHRoaXMuYWRkQ2xhc3Nlcygnc3RhZmYnKX0pO1xuXHRmb3IgKHZhciBpID0gMTsgaSA8IHdpZHRoLzEwMDsgaSsrKSB7XG5cdFx0cGF0aFN0cmluZyA9IHNwcmludGYoXCJNICVmICVmIEwgJWYgJWYgTCAlZiAlZiBMICVmICVmIHpcIiwgaSoxMDAtZHksIHktNSwgaSoxMDAtZHksIHkrNSxcblx0XHRcdGkqMTAwK2R5LCB5LTUsIGkqMTAwK2R5LCB5KzUpO1xuXHRcdHRoaXMucGFwZXIucGF0aFRvQmFjayh7cGF0aDpwYXRoU3RyaW5nLCBzdHJva2U6XCJub25lXCIsIGZpbGw6ZmlsbCwgJ2NsYXNzJzogdGhpcy5hZGRDbGFzc2VzKCdzdGFmZicpfSk7XG5cdH1cblx0aWYgKGNvbW1lbnQpXG5cdFx0dGhpcy5wYXBlci50ZXh0KGNvbW1lbnQsIHt4OiB3aWR0aCs3MCwgeTogeSwgXCJ0ZXh0LWFuY2hvclwiOiBcInN0YXJ0XCIsIFwiZm9udC1zaXplXCI6XCIxOHB4XCIsIGZpbGw6IGZpbGwsIHN0cm9rZTogZmlsbCB9KTtcbn07XG5cblJlbmRlcmVyLnByb3RvdHlwZS5wcmludFNoYWRlZEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgb3BhY2l0eSwgY29tbWVudCkge1xuXHR2YXIgYm94ID0gdGhpcy5wYXBlci5yZWN0KHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgZmlsbDogY29sb3IsIHN0cm9rZTogY29sb3IsIFwiZmlsbC1vcGFjaXR5XCI6IG9wYWNpdHksIFwic3Ryb2tlLW9wYWNpdHlcIjogb3BhY2l0eSB9KTtcblx0aWYgKGNvbW1lbnQpXG5cdFx0dGhpcy5wYXBlci50ZXh0KGNvbW1lbnQsIHt4OiAwLCB5OiB5KzcsIFwidGV4dC1hbmNob3JcIjogXCJzdGFydFwiLCBcImZvbnQtc2l6ZVwiOlwiMTRweFwiLCBmaWxsOiBcInJnYmEoMCwwLDI1NSwuNClcIiwgc3Ryb2tlOiBcInJnYmEoMCwwLDI1NSwuNClcIiB9KTtcblx0cmV0dXJuIGJveDtcbn07XG5cblJlbmRlcmVyLnByb3RvdHlwZS5wcmludFZlcnRpY2FsTGluZSA9IGZ1bmN0aW9uICh4LCB5MSwgeTIpIHtcblx0dmFyIGR5ID0gMC4zNTtcblx0dmFyIGZpbGwgPSBcIiMwMGFhYWFcIjtcblx0dmFyIHBhdGhTdHJpbmcgPSBzcHJpbnRmKFwiTSAlZiAlZiBMICVmICVmIEwgJWYgJWYgTCAlZiAlZiB6XCIsIHggLSBkeSwgeTEsIHggLSBkeSwgeTIsXG5cdFx0XHR4ICsgZHksIHkxLCB4ICsgZHksIHkyKTtcblx0dGhpcy5wYXBlci5wYXRoVG9CYWNrKHtwYXRoOiBwYXRoU3RyaW5nLCBzdHJva2U6IFwibm9uZVwiLCBmaWxsOiBmaWxsLCAnY2xhc3MnOiB0aGlzLmFkZENsYXNzZXMoJ3N0YWZmJyl9KTtcblx0cGF0aFN0cmluZyA9IHNwcmludGYoXCJNICVmICVmIEwgJWYgJWYgTCAlZiAlZiBMICVmICVmIHpcIiwgeCAtIDIwLCB5MSwgeCAtIDIwLCB5MSszLFxuXHRcdHgsIHkxLCB4LCB5MSszKTtcblx0dGhpcy5wYXBlci5wYXRoVG9CYWNrKHtwYXRoOiBwYXRoU3RyaW5nLCBzdHJva2U6IFwibm9uZVwiLCBmaWxsOiBmaWxsLCAnY2xhc3MnOiB0aGlzLmFkZENsYXNzZXMoJ3N0YWZmJyl9KTtcblx0cGF0aFN0cmluZyA9IHNwcmludGYoXCJNICVmICVmIEwgJWYgJWYgTCAlZiAlZiBMICVmICVmIHpcIiwgeCArIDIwLCB5MiwgeCArIDIwLCB5MiszLFxuXHRcdHgsIHkyLCB4LCB5MiszKTtcblx0dGhpcy5wYXBlci5wYXRoVG9CYWNrKHtwYXRoOiBwYXRoU3RyaW5nLCBzdHJva2U6IFwibm9uZVwiLCBmaWxsOiBmaWxsLCAnY2xhc3MnOiB0aGlzLmFkZENsYXNzZXMoJ3N0YWZmJyl9KTtcblxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5SZW5kZXJlci5wcm90b3R5cGUuYWRkVG9SZWdyZXNzaW9uID0gZnVuY3Rpb24gKGVsKSB7XG5cdHZhciBib3g7XG5cdHRyeSB7XG5cdFx0Ym94ID0gZWwuZ2V0QkJveCgpO1xuXHR9IGNhdGNoKGUpIHtcblx0XHRib3ggPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcblx0fVxuXHQvL3ZhciBzdHIgPSBcIihcIitib3gueCtcIixcIitib3gueStcIilbXCIrYm94LndpZHRoK1wiLFwiK2JveC5oZWlnaHQrXCJdIFwiXG5cdHZhciBzdHIgPSBlbC50eXBlICsgJyAnICsgYm94LnRvU3RyaW5nKCkgKyAnICc7XG5cdHZhciBhdHRycyA9IFtdO1xuXHRmb3IgKHZhciBrZXkgaW4gZWwuYXR0cnMpIHtcblx0XHRpZiAoZWwuYXR0cnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0aWYgKGtleSA9PT0gJ2NsYXNzJylcblx0XHRcdFx0c3RyID0gZWwuYXR0cnNba2V5XSArIFwiIFwiICsgc3RyO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhdHRycy5wdXNoKGtleStcIjogXCIrZWwuYXR0cnNba2V5XSk7XG5cdFx0fVxuXHR9XG5cdGF0dHJzLnNvcnQoKTtcblx0c3RyICs9IFwieyBcIiArYXR0cnMuam9pbihcIiBcIikgKyBcIiB9XCI7XG5cdHRoaXMucmVncmVzc2lvbkxpbmVzLnB1c2goc3RyKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVuZGVyZXI7XG4iLCIvLyAgICBhYmNfZW5ncmF2ZXJfY29udHJvbGxlci5qczogQ29udHJvbHMgdGhlIGVuZ3JhdmluZyBwcm9jZXNzIG9mIGFuIEFCQ0pTIGFic3RyYWN0IHN5bnRheCB0cmVlIGFzIHByb2R1Y2VkIGJ5IEFCQ0pTL3BhcnNlXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cblxuLypnbG9iYWwgTWF0aCAqL1xuXG52YXIgc3BhY2luZyA9IHJlcXVpcmUoJy4vYWJjX3NwYWNpbmcnKTtcbnZhciBBYnN0cmFjdEVuZ3JhdmVyID0gcmVxdWlyZSgnLi9hYmNfYWJzdHJhY3RfZW5ncmF2ZXInKTtcbnZhciBSZW5kZXJlciA9IHJlcXVpcmUoJy4vYWJjX3JlbmRlcmVyJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBDb250cm9scyB0aGUgZW5ncmF2aW5nIHByb2Nlc3MsIGZyb20gQUJDSlMgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFCQ0pTIEFTVCkgdG8gcmVuZGVyZWQgc2NvcmUgc2hlZXRcbiAqXG4gKiBDYWxsIGVuZ3JhdmVBQkMgdG8gcnVuIHRoZSBwcm9jZXNzLiBUaGlzIGNyZWF0ZXMgYSBncmFwaGVsZW1zIEFCQ0pTIEFic3RyYWN0IEVuZ3JhdmluZyBTdHJ1Y3R1cmUgKEFCQ0pTIEFFUykgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGlzLnN0YWZmZ3JvdXBzXG4gKiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGZpcnN0IGxhaWQgb3V0IChnaXZpbmcgdGhlIGdyYXBoZWxlbXMgeCBhbmQgeSBjb29yZGluYXRlcykgYW5kIHRoZW4gZHJhd24gb250byB0aGUgcmVuZGVyZXJcbiAqIGVhY2ggQUJDSlMgQUVTIHJlcHJlc2VudHMgYSBzaW5nbGUgc3RhZmZncm91cCAtIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgaW4gYSBzdGFmZmdyb3VwIGFyZSByZW5kZXJlZCBkaXJlY3RseSBieSB0aGUgY29udHJvbGxlclxuICpcbiAqIGVsZW1lbnRzIGluIEFCQ0pTIEFFUyBrbm93IHRoZWlyIFwic291cmNlIGRhdGFcIiBpbiB0aGUgQUJDSlMgQVNULCBhbmQgdGhlaXIgXCJ0YXJnZXQgc2hhcGVcIlxuICogaW4gdGhlIHJlbmRlcmVyIGZvciBoaWdobGlnaHRpbmcgcHVycG9zZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFwZXIgZGl2IGVsZW1lbnQgdGhhdCB3aWxsIHdyYXAgdGhlIFNWR1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBhbGwgdGhlIHBhcmFtcyAtLSBkb2N1bWVudGVkIG9uIGdpdGh1YiAvL1RPRE8tR0QgbW92ZSBzb21lIG9mIHRoYXQgZG9jdW1lbnRhdGlvbiBoZXJlXG4gKi9cbnZhciBFbmdyYXZlckNvbnRyb2xsZXIgPSBmdW5jdGlvbihwYXBlciwgcGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgdGhpcy5yZXNwb25zaXZlID0gcGFyYW1zLnJlc3BvbnNpdmU7XG4gIHRoaXMuc3BhY2UgPSAzKnNwYWNpbmcuU1BBQ0U7XG4gIHRoaXMuc2NhbGUgPSBwYXJhbXMuc2NhbGUgPyBwYXJzZUZsb2F0KHBhcmFtcy5zY2FsZSkgOiAwO1xuICBpZiAoISh0aGlzLnNjYWxlID4gMC4xKSlcbiAgXHR0aGlzLnNjYWxlID0gdW5kZWZpbmVkO1xuXG5cdGlmIChwYXJhbXMuc3RhZmZ3aWR0aCkge1xuXHRcdC8vIE5vdGU6IE5vcm1hbGx5IGFsbCBtZWFzdXJlbWVudHMgdG8gdGhlIGVuZ3JhdmVyIGFyZSBpbiBQT0lOVFMuIEhvd2V2ZXIsIGlmIGEgcGVyc29uIGlzIGZvcm1hdHRpbmcgZm9yIHRoZVxuXHRcdC8vIHNjcmVlbiBhbmQgZGlyZWN0bHkgaW5wdXR0aW5nIHRoZSB3aWR0aCwgdGhlbiBpdCBpcyBtb3JlIGxvZ2ljYWwgdG8gaGF2ZSB0aGUgbWVhc3VyZW1lbnQgaW4gcGl4ZWxzLlxuXHRcdHRoaXMuc3RhZmZ3aWR0aFNjcmVlbiA9IHBhcmFtcy5zdGFmZndpZHRoO1xuXHRcdHRoaXMuc3RhZmZ3aWR0aFByaW50ID0gcGFyYW1zLnN0YWZmd2lkdGg7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5zdGFmZndpZHRoU2NyZWVuID0gNzQwOyAvLyBUT0RPLVBFUjogTm90IHN1cmUgd2hlcmUgdGhpcyBudW1iZXIgY29tZXMgZnJvbSwgYnV0IHRoaXMgaXMgaG93IGl0J3MgYWx3YXlzIGJlZW4uXG5cdFx0dGhpcy5zdGFmZndpZHRoUHJpbnQgPSA2ODA7IC8vIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIDguNVwiLCBhZnRlciAxY20gb2YgbWFyZ2luIGhhcyBiZWVuIHJlbW92ZWQuXG5cdH1cbiAgdGhpcy5lZGl0YWJsZSA9IHBhcmFtcy5lZGl0YWJsZSB8fCBmYWxzZTtcblx0dGhpcy5saXN0ZW5lcnMgPSBbXTtcblx0aWYgKHBhcmFtcy5jbGlja0xpc3RlbmVyKVxuXHRcdHRoaXMuYWRkU2VsZWN0TGlzdGVuZXIocGFyYW1zLmNsaWNrTGlzdGVuZXIpO1xuXG4gIHRoaXMucmVuZGVyZXI9bmV3IFJlbmRlcmVyKHBhcGVyLCBwYXJhbXMucmVncmVzc2lvbiwgcGFyYW1zLmFkZF9jbGFzc2VzKTtcblx0dGhpcy5yZW5kZXJlci5zZXRQYWRkaW5nT3ZlcnJpZGUocGFyYW1zKTtcbiAgdGhpcy5yZW5kZXJlci5jb250cm9sbGVyID0gdGhpczsgLy8gVE9ETy1HRCBuZWVkZWQgZm9yIGhpZ2hsaWdodGluZ1xuXG5cdHRoaXMucmVzZXQoKTtcbn07XG5cbkVuZ3JhdmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5zZWxlY3RlZCA9IFtdO1xuXHR0aGlzLmluZ3JvdXAgPSBmYWxzZTtcblx0dGhpcy5zdGFmZmdyb3VwcyA9IFtdO1xuXHR0aGlzLmxhc3RTdGFmZkdyb3VwSW5kZXggPSAtMTtcblx0aWYgKHRoaXMuZW5ncmF2ZXIpXG5cdFx0dGhpcy5lbmdyYXZlci5yZXNldCgpO1xuXHR0aGlzLmVuZ3JhdmVyID0gbnVsbDtcblx0dGhpcy5yZW5kZXJlci5yZXNldCgpO1xufTtcblxuLyoqXG4gKiBydW4gdGhlIGVuZ3JhdmluZyBwcm9jZXNzXG4gKiBAcGFyYW0ge0FCQ0pTLlR1bmV8QUJDSlMuVHVuZVtdfSBhYmN0dW5lc1xuICovXG5FbmdyYXZlckNvbnRyb2xsZXIucHJvdG90eXBlLmVuZ3JhdmVBQkMgPSBmdW5jdGlvbihhYmN0dW5lcywgdHVuZU51bWJlcikge1xuICBpZiAoYWJjdHVuZXNbMF09PT11bmRlZmluZWQpIHtcbiAgICBhYmN0dW5lcyA9IFthYmN0dW5lc107XG4gIH1cblx0dGhpcy5yZXNldCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWJjdHVuZXMubGVuZ3RoOyBpKyspIHtcbiAgXHRpZiAodHVuZU51bWJlciA9PT0gdW5kZWZpbmVkKVxuICBcdFx0dHVuZU51bWJlciA9IGk7XG4gICAgdGhpcy5lbmdyYXZlVHVuZShhYmN0dW5lc1tpXSwgdHVuZU51bWJlcik7XG4gIH1cblx0aWYgKHRoaXMucmVuZGVyZXIuZG9SZWdyZXNzaW9uKVxuXHRcdHJldHVybiB0aGlzLnJlbmRlcmVyLnJlZ3Jlc3Npb25MaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuLyoqXG4gKiBTb21lIG9mIHRoZSBpdGVtcyBvbiB0aGUgcGFnZSBhcmUgbm90IHNjYWxlZCwgc28gYWRqdXN0IHRoZW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiBzY2FsaW5nIHRvIGNhbmNlbCBvdXQgdGhlIHNjYWxpbmcuXG4gKiBAcGFyYW0ge2Zsb2F0fSBzY2FsZVxuICovXG5FbmdyYXZlckNvbnRyb2xsZXIucHJvdG90eXBlLmFkanVzdE5vblNjYWxlZEl0ZW1zID0gZnVuY3Rpb24gKHNjYWxlKSB7XG5cdHRoaXMud2lkdGggLz0gc2NhbGU7XG5cdHRoaXMucmVuZGVyZXIuYWRqdXN0Tm9uU2NhbGVkSXRlbXMoc2NhbGUpO1xufTtcblxuRW5ncmF2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5nZXRNZWFzdXJlV2lkdGhzID0gZnVuY3Rpb24oYWJjVHVuZSkge1xuXHR0aGlzLnJlc2V0KCk7XG5cblx0dGhpcy5yZW5kZXJlci5saW5lTnVtYmVyID0gbnVsbDtcblxuXHR0aGlzLnJlbmRlcmVyLm5ld1R1bmUoYWJjVHVuZSk7XG5cdHRoaXMuZW5ncmF2ZXIgPSBuZXcgQWJzdHJhY3RFbmdyYXZlcih0aGlzLnJlbmRlcmVyLCAwLCB7IGJhZ3BpcGVzOiBhYmNUdW5lLmZvcm1hdHRpbmcuYmFncGlwZXMsIGZsYXRiZWFtczogYWJjVHVuZS5mb3JtYXR0aW5nLmZsYXRiZWFtcyB9KTtcblx0dGhpcy5lbmdyYXZlci5zZXRTdGVtSGVpZ2h0KHRoaXMucmVuZGVyZXIuc3BhY2luZy5zdGVtSGVpZ2h0KTtcblx0aWYgKGFiY1R1bmUuZm9ybWF0dGluZy5zdGFmZndpZHRoKSB7XG5cdFx0dGhpcy53aWR0aCA9IGFiY1R1bmUuZm9ybWF0dGluZy5zdGFmZndpZHRoICogMS4zMzsgLy8gVGhlIHdpZHRoIGlzIGV4cHJlc3NlZCBpbiBwdDsgY29udmVydCB0byBweC5cblx0fSBlbHNlIHtcblx0XHR0aGlzLndpZHRoID0gdGhpcy5yZW5kZXJlci5pc1ByaW50ID8gdGhpcy5zdGFmZndpZHRoUHJpbnQgOiB0aGlzLnN0YWZmd2lkdGhTY3JlZW47XG5cdH1cblxuXHR2YXIgc2NhbGUgPSBhYmNUdW5lLmZvcm1hdHRpbmcuc2NhbGUgPyBhYmNUdW5lLmZvcm1hdHRpbmcuc2NhbGUgOiB0aGlzLnNjYWxlO1xuXHRpZiAodGhpcy5yZXNwb25zaXZlID09PSBcInJlc2l6ZVwiKSAvLyBUaGUgcmVzaXppbmcgd2lsbCBtZXNzIHdpdGggdGhlIHNjYWxpbmcsIHNvIGp1c3QgZG9uJ3QgZG8gaXQgZXhwbGljaXRseS5cblx0XHRzY2FsZSA9IHVuZGVmaW5lZDtcblx0aWYgKHNjYWxlID09PSB1bmRlZmluZWQpIHNjYWxlID0gdGhpcy5yZW5kZXJlci5pc1ByaW50ID8gMC43NSA6IDE7XG5cdHRoaXMuYWRqdXN0Tm9uU2NhbGVkSXRlbXMoc2NhbGUpO1xuXG5cdHZhciByZXQgPSB7IGxlZnQ6IDAsIG1lYXN1cmVXaWR0aHM6IFtdLCBoZWlnaHQ6IDAsIHRvdGFsOiAwIH07XG5cdC8vIFRPRE8tUEVSOiBuZWVkIHRvIGFkZCB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZSBibG9jaywgdG9vLlxuXHRyZXQuaGVpZ2h0ID0gdGhpcy5yZW5kZXJlci5wYWRkaW5nLnRvcCArIHRoaXMucmVuZGVyZXIuc3BhY2luZy5tdXNpYyArIHRoaXMucmVuZGVyZXIucGFkZGluZy5ib3R0b20gKyAyNDsgLy8gdGhlIDI0IGlzIHRoZSBlbXBpcmljYWwgdmFsdWUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiBhbGwgdHVuZXMuXG5cdHZhciBkZWJ1ZyA9IGZhbHNlO1xuXHR2YXIgaGFzUHJpbnRlZFRlbXBvID0gZmFsc2U7XG5cdGZvcih2YXIgaT0wOyBpPGFiY1R1bmUubGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgYWJjTGluZSA9IGFiY1R1bmUubGluZXNbaV07XG5cdFx0aWYgKGFiY0xpbmUuc3RhZmYpIHtcblx0XHRcdGFiY0xpbmUuc3RhZmZHcm91cCA9IHRoaXMuZW5ncmF2ZXIuY3JlYXRlQUJDTGluZShhYmNMaW5lLnN0YWZmLCAhaGFzUHJpbnRlZFRlbXBvID8gYWJjVHVuZS5tZXRhVGV4dC50ZW1wbzogbnVsbCk7XG5cblx0XHRcdGFiY0xpbmUuc3RhZmZHcm91cC5sYXlvdXQoMCwgdGhpcy5yZW5kZXJlciwgZGVidWcpO1xuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgdGhlIHZvaWNlcyBhcmUgbGFpZCBvdXQgc28gdGhhdCB0aGUgYmFyIGxpbmVzIGFyZSBldmVuIHdpdGggZWFjaCBvdGhlci4gU28gd2UganVzdCBuZWVkIHRvIGdldCB0aGUgcGxhY2VtZW50IG9mIHRoZSBmaXJzdCB2b2ljZS5cblx0XHRcdGlmIChhYmNMaW5lLnN0YWZmR3JvdXAudm9pY2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dmFyIHZvaWNlID0gYWJjTGluZS5zdGFmZkdyb3VwLnZvaWNlc1swXTtcblx0XHRcdFx0dmFyIGZvdW5kTm90U3RhZmZFeHRyYSA9IGZhbHNlO1xuXHRcdFx0XHR2YXIgbGFzdFhQb3NpdGlvbiA9IDA7XG5cdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgdm9pY2UuY2hpbGRyZW4ubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHR2YXIgY2hpbGQgPSB2b2ljZS5jaGlsZHJlbltrXTtcblx0XHRcdFx0XHRpZiAoIWZvdW5kTm90U3RhZmZFeHRyYSAmJiAhY2hpbGQuaXNDbGVmICYmICFjaGlsZC5pc0tleVNpZykge1xuXHRcdFx0XHRcdFx0Zm91bmROb3RTdGFmZkV4dHJhID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHJldC5sZWZ0ID0gY2hpbGQueDtcblx0XHRcdFx0XHRcdGxhc3RYUG9zaXRpb24gPSBjaGlsZC54O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoY2hpbGQudHlwZSA9PT0gJ2JhcicpIHtcblx0XHRcdFx0XHRcdHJldC5tZWFzdXJlV2lkdGhzLnB1c2goY2hpbGQueCAtIGxhc3RYUG9zaXRpb24pO1xuXHRcdFx0XHRcdFx0cmV0LnRvdGFsICs9IChjaGlsZC54IC0gbGFzdFhQb3NpdGlvbik7XG5cdFx0XHRcdFx0XHRsYXN0WFBvc2l0aW9uID0gY2hpbGQueDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGhhc1ByaW50ZWRUZW1wbyA9IHRydWU7XG5cdFx0XHRyZXQuaGVpZ2h0ICs9IGFiY0xpbmUuc3RhZmZHcm91cC5jYWxjSGVpZ2h0KCkgKiBzcGFjaW5nLlNURVA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIFJ1biB0aGUgZW5ncmF2aW5nIHByb2Nlc3Mgb24gYSBzaW5nbGUgdHVuZVxuICogQHBhcmFtIHtBQkNKUy5UdW5lfSBhYmN0dW5lXG4gKi9cbkVuZ3JhdmVyQ29udHJvbGxlci5wcm90b3R5cGUuZW5ncmF2ZVR1bmUgPSBmdW5jdGlvbiAoYWJjdHVuZSwgdHVuZU51bWJlcikge1xuXHR0aGlzLnJlbmRlcmVyLmxpbmVOdW1iZXIgPSBudWxsO1xuXG5cdHRoaXMucmVuZGVyZXIubmV3VHVuZShhYmN0dW5lKTtcblx0dGhpcy5lbmdyYXZlciA9IG5ldyBBYnN0cmFjdEVuZ3JhdmVyKHRoaXMucmVuZGVyZXIsIHR1bmVOdW1iZXIsIHsgYmFncGlwZXM6IGFiY3R1bmUuZm9ybWF0dGluZy5iYWdwaXBlcywgZmxhdGJlYW1zOiBhYmN0dW5lLmZvcm1hdHRpbmcuZmxhdGJlYW1zIH0pO1xuXHR0aGlzLmVuZ3JhdmVyLnNldFN0ZW1IZWlnaHQodGhpcy5yZW5kZXJlci5zcGFjaW5nLnN0ZW1IZWlnaHQpO1xuXHR0aGlzLmVuZ3JhdmVyLm1lYXN1cmVMZW5ndGggPSBhYmN0dW5lLmdldE1ldGVyRnJhY3Rpb24oKS5udW0vYWJjdHVuZS5nZXRNZXRlckZyYWN0aW9uKCkuZGVuO1xuXHRpZiAoYWJjdHVuZS5mb3JtYXR0aW5nLnN0YWZmd2lkdGgpIHtcblx0XHR0aGlzLndpZHRoID0gYWJjdHVuZS5mb3JtYXR0aW5nLnN0YWZmd2lkdGggKiAxLjMzOyAvLyBUaGUgd2lkdGggaXMgZXhwcmVzc2VkIGluIHB0OyBjb252ZXJ0IHRvIHB4LlxuXHR9IGVsc2Uge1xuXHRcdHRoaXMud2lkdGggPSB0aGlzLnJlbmRlcmVyLmlzUHJpbnQgPyB0aGlzLnN0YWZmd2lkdGhQcmludCA6IHRoaXMuc3RhZmZ3aWR0aFNjcmVlbjtcblx0fVxuXG5cdHZhciBzY2FsZSA9IGFiY3R1bmUuZm9ybWF0dGluZy5zY2FsZSA/IGFiY3R1bmUuZm9ybWF0dGluZy5zY2FsZSA6IHRoaXMuc2NhbGU7XG5cdGlmICh0aGlzLnJlc3BvbnNpdmUgPT09IFwicmVzaXplXCIpIC8vIFRoZSByZXNpemluZyB3aWxsIG1lc3Mgd2l0aCB0aGUgc2NhbGluZywgc28ganVzdCBkb24ndCBkbyBpdCBleHBsaWNpdGx5LlxuXHRcdHNjYWxlID0gdW5kZWZpbmVkO1xuXHRpZiAoc2NhbGUgPT09IHVuZGVmaW5lZCkgc2NhbGUgPSB0aGlzLnJlbmRlcmVyLmlzUHJpbnQgPyAwLjc1IDogMTtcblx0dGhpcy5hZGp1c3ROb25TY2FsZWRJdGVtcyhzY2FsZSk7XG5cblx0Ly8gR2VuZXJhdGUgdGhlIHJhdyBzdGFmZiBsaW5lIGRhdGFcblx0dmFyIGk7XG5cdHZhciBhYmNMaW5lO1xuXHR2YXIgaGFzUHJpbnRlZFRlbXBvID0gZmFsc2U7XG5cdGZvcihpPTA7IGk8YWJjdHVuZS5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGFiY0xpbmUgPSBhYmN0dW5lLmxpbmVzW2ldO1xuXHRcdGlmIChhYmNMaW5lLnN0YWZmKSB7XG5cdFx0XHRhYmNMaW5lLnN0YWZmR3JvdXAgPSB0aGlzLmVuZ3JhdmVyLmNyZWF0ZUFCQ0xpbmUoYWJjTGluZS5zdGFmZiwgIWhhc1ByaW50ZWRUZW1wbyA/IGFiY3R1bmUubWV0YVRleHQudGVtcG86IG51bGwpO1xuXHRcdFx0aGFzUHJpbnRlZFRlbXBvID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvLyBBZGp1c3QgdGhlIHgtY29vcmRpbmF0ZXMgdG8gdGhlaXIgYWJzb2x1dGUgcG9zaXRpb25zXG5cdHZhciBtYXhXaWR0aCA9IHRoaXMud2lkdGg7XG5cdGZvcihpPTA7IGk8YWJjdHVuZS5saW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGFiY0xpbmUgPSBhYmN0dW5lLmxpbmVzW2ldO1xuXHRcdGlmIChhYmNMaW5lLnN0YWZmKSB7XG5cdFx0XHR0aGlzLnNldFhTcGFjaW5nKGFiY0xpbmUuc3RhZmZHcm91cCwgYWJjdHVuZS5mb3JtYXR0aW5nLCBpID09PSBhYmN0dW5lLmxpbmVzLmxlbmd0aCAtIDEsIGZhbHNlKTtcblx0XHRcdGlmIChhYmNMaW5lLnN0YWZmR3JvdXAudyA+IG1heFdpZHRoKSBtYXhXaWR0aCA9IGFiY0xpbmUuc3RhZmZHcm91cC53O1xuXHRcdH1cblx0fVxuXG5cdC8vIExheW91dCB0aGUgYmVhbXMgYW5kIGFkZCB0aGUgc3RlbXMgdG8gdGhlIGJlYW1lZCBub3Rlcy5cblx0Zm9yKGk9MDsgaTxhYmN0dW5lLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YWJjTGluZSA9IGFiY3R1bmUubGluZXNbaV07XG5cdFx0aWYgKGFiY0xpbmUuc3RhZmZHcm91cCAmJiBhYmNMaW5lLnN0YWZmR3JvdXAudm9pY2VzKSB7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGFiY0xpbmUuc3RhZmZHcm91cC52b2ljZXMubGVuZ3RoOyBqKyspXG5cdFx0XHRcdGFiY0xpbmUuc3RhZmZHcm91cC52b2ljZXNbal0ubGF5b3V0QmVhbXMoKTtcblx0XHRcdGFiY0xpbmUuc3RhZmZHcm91cC5zZXRVcHBlckFuZExvd2VyRWxlbWVudHModGhpcy5yZW5kZXJlcik7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBzdGFmZiBzcGFjaW5nXG5cdC8vIFRPRE8tUEVSOiB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gZG8gdGhpcyBieSB0aGUgdGltZSB3ZSBjYWxsZWQgc2V0VXBwZXJBbmRMb3dlckVsZW1lbnRzLCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSBcImJvdHRvbVwiIGVsZW1lbnQgc2VlbXMgdG8gYmUgc2V0IGFzIGEgc2lkZSBlZmZlY3Qgb2Ygc2V0dGluZyB0aGUgWCBzcGFjaW5nLlxuXHRmb3IoaT0wOyBpPGFiY3R1bmUubGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRhYmNMaW5lID0gYWJjdHVuZS5saW5lc1tpXTtcblx0XHRpZiAoYWJjTGluZS5zdGFmZkdyb3VwKSB7XG5cdFx0XHRhYmNMaW5lLnN0YWZmR3JvdXAuaGVpZ2h0ID0gYWJjTGluZS5zdGFmZkdyb3VwLmNhbGNIZWlnaHQoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBEbyBhbGwgdGhlIHdyaXRpbmcgdG8gb3V0cHV0XG5cdHRoaXMucmVuZGVyZXIudG9wTWFyZ2luKGFiY3R1bmUpO1xuXHQvL3RoaXMucmVuZGVyZXIucHJpbnRIb3Jpem9udGFsTGluZSh0aGlzLndpZHRoICsgdGhpcy5yZW5kZXJlci5wYWRkaW5nLmxlZnQgKyB0aGlzLnJlbmRlcmVyLnBhZGRpbmcucmlnaHQpO1xuXHR0aGlzLnJlbmRlcmVyLmVuZ3JhdmVUb3BUZXh0KHRoaXMud2lkdGgsIGFiY3R1bmUpO1xuXHR0aGlzLnJlbmRlcmVyLmFkZE11c2ljUGFkZGluZygpO1xuXG5cdHRoaXMuc3RhZmZncm91cHMgPSBbXTtcblx0dGhpcy5sYXN0U3RhZmZHcm91cEluZGV4ID0gLTE7XG5cdGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgYWJjdHVuZS5saW5lcy5sZW5ndGg7IGxpbmUrKykge1xuXHRcdHRoaXMucmVuZGVyZXIubGluZU51bWJlciA9IGxpbmU7XG5cdFx0YWJjTGluZSA9IGFiY3R1bmUubGluZXNbbGluZV07XG5cdFx0aWYgKGFiY0xpbmUuc3RhZmYpIHtcblx0XHRcdHRoaXMuZW5ncmF2ZVN0YWZmTGluZShhYmNMaW5lLnN0YWZmR3JvdXApO1xuXHRcdH0gZWxzZSBpZiAoYWJjTGluZS5zdWJ0aXRsZSAmJiBsaW5lICE9PSAwKSB7XG5cdFx0XHR0aGlzLnJlbmRlcmVyLm91dHB1dFN1YnRpdGxlKHRoaXMud2lkdGgsIGFiY0xpbmUuc3VidGl0bGUpO1xuXHRcdH0gZWxzZSBpZiAoYWJjTGluZS50ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucmVuZGVyZXIub3V0cHV0RnJlZVRleHQoYWJjTGluZS50ZXh0LCBhYmNMaW5lLnZza2lwKTtcblx0XHR9IGVsc2UgaWYgKGFiY0xpbmUuc2VwYXJhdG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucmVuZGVyZXIub3V0cHV0U2VwYXJhdG9yKGFiY0xpbmUuc2VwYXJhdG9yKTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLnJlbmRlcmVyLm1vdmVZKDI0KTsgLy8gVE9ETy1QRVI6IEVtcGlyaWNhbGx5IGRpc2NvdmVyZWQuIFdoYXQgdmFyaWFibGUgc2hvdWxkIHRoaXMgYmU/XG5cdHRoaXMucmVuZGVyZXIuZW5ncmF2ZUV4dHJhVGV4dCh0aGlzLndpZHRoLCBhYmN0dW5lKTtcblx0dGhpcy5yZW5kZXJlci5zZXRQYXBlclNpemUobWF4V2lkdGgsIHNjYWxlLCB0aGlzLnJlc3BvbnNpdmUpO1xufTtcblxuZnVuY3Rpb24gY2FsY0hvcml6b250YWxTcGFjaW5nKGlzTGFzdExpbmUsIHN0cmV0Y2hMYXN0LCB0YXJnZXRXaWR0aCwgbGluZVdpZHRoLCBzcGFjaW5nLCBzcGFjaW5nVW5pdHMsIG1pblNwYWNlKSB7XG5cdC8vIFRPRE8tUEVSOiBUaGlzIHVzZWQgdG8gc3RyZXRjaCB0aGUgZmlyc3QgbGluZSB3aGVuIGl0IGlzIHRoZSBvbmx5IGxpbmUsIGJ1dCBJJ20gbm90IHN1cmUgd2h5LiBhYmNtMnBzIGRvZXNuJ3QgZG8gdGhhdFxuXHRpZiAoaXNMYXN0TGluZSAmJiBsaW5lV2lkdGggLyB0YXJnZXRXaWR0aCA8IDAuNjYgJiYgIXN0cmV0Y2hMYXN0KSByZXR1cm4gbnVsbDsgLy8gZG9uJ3Qgc3RyZXRjaCBsYXN0IGxpbmUgdG9vIG11Y2hcblx0aWYgKE1hdGguYWJzKHRhcmdldFdpZHRoLWxpbmVXaWR0aCkgPCAyKSByZXR1cm4gbnVsbDsgLy8gaWYgd2UgYXJlIGFscmVhZHkgbmVhciB0aGUgdGFyZ2V0IHdpZHRoLCB3ZSdyZSBkb25lLlxuXHR2YXIgcmVsU3BhY2UgPSBzcGFjaW5nVW5pdHMgKiBzcGFjaW5nO1xuXHR2YXIgY29uc3RTcGFjZSA9IGxpbmVXaWR0aCAtIHJlbFNwYWNlO1xuXHRpZiAoc3BhY2luZ1VuaXRzID4gMCkge1xuXHRcdHNwYWNpbmcgPSAodGFyZ2V0V2lkdGggLSBjb25zdFNwYWNlKSAvIHNwYWNpbmdVbml0cztcblx0XHRpZiAoc3BhY2luZyAqIG1pblNwYWNlID4gNTApIHtcblx0XHRcdHNwYWNpbmcgPSA1MCAvIG1pblNwYWNlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3BhY2luZztcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBEbyB0aGUgeC1heGlzIHBvc2l0aW9uaW5nIGZvciBhIHNpbmdsZSBsaW5lIChhIGdyb3VwIG9mIHJlbGF0ZWQgc3RhZmZzKVxuICogQHBhcmFtIHtBQkNKUy5UdW5lfSBhYmN0dW5lIGFuIEFCQ0pTIEFTVFxuICogQHBhcmFtIHtPYmplY3R9IHN0YWZmR3JvdXAgYW4gc3RhZmZHcm91cFxuICogQHBhcmFtIHtPYmplY3R9IGZvcm1hdHRpbmcgYW4gZm9ybWF0dGluZ1xuICogQHBhcmFtIHtib29sZWFufSBpc0xhc3RMaW5lIGlzIHRoaXMgdGhlIGxhc3QgbGluZSB0byBiZSBwcmludGVkP1xuICogQHByaXZhdGVcbiAqL1xuRW5ncmF2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5zZXRYU3BhY2luZyA9IGZ1bmN0aW9uIChzdGFmZkdyb3VwLCBmb3JtYXR0aW5nLCBpc0xhc3RMaW5lLCBkZWJ1Zykge1xuICAgdmFyIG5ld3NwYWNlID0gdGhpcy5zcGFjZTtcbiAgZm9yICh2YXIgaXQgPSAwOyBpdCA8IDg7IGl0KyspIHsgLy8gVE9ETy1QRVI6IHNob3VsZG4ndCBuZWVkIG11bHRpcGxlIHBhc3NlcywgYnV0IGVhY2ggcGFzcyBnZXRzIGl0IGNsb3NlciB0byB0aGUgcmlnaHQgc3BhY2luZy4gKE9ubHkgYWZmZWN0cyBsb25nIGxpbmVzOiBub3JtYWwgbGluZXMgYnJlYWsgb3V0IG9mIHRoaXMgbG9vcCBxdWlja2x5Lilcblx0ICB2YXIgcmV0ID0gc3RhZmZHcm91cC5sYXlvdXQobmV3c3BhY2UsIHRoaXMucmVuZGVyZXIsIGRlYnVnKTtcblx0ICB2YXIgc3RyZXRjaExhc3QgPSBmb3JtYXR0aW5nLnN0cmV0Y2hsYXN0ID8gZm9ybWF0dGluZy5zdHJldGNobGFzdCA6IGZhbHNlO1xuXHRcdG5ld3NwYWNlID0gY2FsY0hvcml6b250YWxTcGFjaW5nKGlzTGFzdExpbmUsIHN0cmV0Y2hMYXN0LCB0aGlzLndpZHRoK3RoaXMucmVuZGVyZXIucGFkZGluZy5sZWZ0LCBzdGFmZkdyb3VwLncsIG5ld3NwYWNlLCByZXQuc3BhY2luZ1VuaXRzLCByZXQubWluU3BhY2UpO1xuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGNvbnNvbGUubG9nKFwic2V0WFNwYWNlXCIsIGl0LCBzdGFmZkdyb3VwLncsIG5ld3NwYWNlLCBzdGFmZkdyb3VwLm1pbnNwYWNlKTtcblx0XHRpZiAobmV3c3BhY2UgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cdGNlbnRlcldob2xlUmVzdHMoc3RhZmZHcm91cC52b2ljZXMpO1xuXHQvL3RoaXMucmVuZGVyZXIucHJpbnRIb3Jpem9udGFsTGluZSh0aGlzLndpZHRoKTtcbn07XG5cbi8qKlxuICogRW5ncmF2ZSBhIHNpbmdsZSBsaW5lIChhIGdyb3VwIG9mIHJlbGF0ZWQgc3RhZmZzKVxuICogQHBhcmFtIHtBQkNKUy5UdW5lfSBhYmN0dW5lIGFuIEFCQ0pTIEFTVFxuICogQHBhcmFtIHtPYmplY3R9IHN0YWZmR3JvdXAgYW4gc3RhZmZHcm91cFxuICogQHByaXZhdGVcbiAqL1xuRW5ncmF2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5lbmdyYXZlU3RhZmZMaW5lID0gZnVuY3Rpb24gKHN0YWZmR3JvdXApIHtcblx0aWYgKHRoaXMubGFzdFN0YWZmR3JvdXBJbmRleCA+IC0xKVxuXHRcdHRoaXMucmVuZGVyZXIuYWRkU3RhZmZQYWRkaW5nKHRoaXMuc3RhZmZncm91cHNbdGhpcy5sYXN0U3RhZmZHcm91cEluZGV4XSwgc3RhZmZHcm91cCk7XG5cdHRoaXMucmVuZGVyZXIudm9pY2VOdW1iZXIgPSBudWxsO1xuXHRzdGFmZkdyb3VwLmRyYXcodGhpcy5yZW5kZXJlcik7XG5cdHZhciBoZWlnaHQgPSBzdGFmZkdyb3VwLmhlaWdodCAqIHNwYWNpbmcuU1RFUDtcblx0Ly90aGlzLnJlbmRlcmVyLnByaW50VmVydGljYWxMaW5lKHRoaXMud2lkdGgrdGhpcy5yZW5kZXJlci5wYWRkaW5nLmxlZnQsIHRoaXMucmVuZGVyZXIueSwgdGhpcy5yZW5kZXJlci55K2hlaWdodCk7XG4gIHRoaXMuc3RhZmZncm91cHNbdGhpcy5zdGFmZmdyb3Vwcy5sZW5ndGhdID0gc3RhZmZHcm91cDtcblx0dGhpcy5sYXN0U3RhZmZHcm91cEluZGV4ID0gdGhpcy5zdGFmZmdyb3Vwcy5sZW5ndGgtMTtcblx0dGhpcy5yZW5kZXJlci55ICs9IGhlaWdodDtcbn07XG5cbi8qKlxuICogQ2FsbGVkIGJ5IHRoZSBBYnN0cmFjdCBFbmdyYXZpbmcgU3RydWN0dXJlIG9yIGFueSBvdGhlciAoZS5nLiBtaWRpIHBsYXliYWNrKSB0byBzYXkgaXQgd2FzIHNlbGVjdGVkIChub3RlaGVhZCBjbGlja2VkIG9uKVxuICogQHByb3RlY3RlZFxuICovXG5FbmdyYXZlckNvbnRyb2xsZXIucHJvdG90eXBlLm5vdGlmeVNlbGVjdCA9IGZ1bmN0aW9uIChhYnNlbGVtLCB0dW5lTnVtYmVyLCBjbGFzc2VzKSB7XG4gIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgaWYgKGFic2VsZW0uaGlnaGxpZ2h0KSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFthYnNlbGVtXTtcbiAgICBhYnNlbGVtLmhpZ2hsaWdodCgpO1xuICB9XG4gIHZhciBhYmNlbGVtID0gYWJzZWxlbS5hYmNlbGVtIHx8IHt9O1xuICBmb3IgKHZhciBpPTA7IGk8dGhpcy5saXN0ZW5lcnMubGVuZ3RoO2krKykge1xuXHQgIHRoaXMubGlzdGVuZXJzW2ldKGFiY2VsZW0sIHR1bmVOdW1iZXIsIGNsYXNzZXMpO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCBieSB0aGUgQWJzdHJhY3QgRW5ncmF2aW5nIFN0cnVjdHVyZSB0byBzYXkgaXQgd2FzIG1vZGlmaWVkIChlLmcuIG5vdGVoZWFkIGRyYWdnZWQpXG4gKiBAcHJvdGVjdGVkXG4gKi9cbi8vIEVuZ3JhdmVyQ29udHJvbGxlci5wcm90b3R5cGUubm90aWZ5Q2hhbmdlID0gZnVuY3Rpb24gKC8qYWJzZWxlbSovKSB7XG4vLyAgIGZvciAodmFyIGk9MDsgaTx0aGlzLmxpc3RlbmVycy5sZW5ndGg7aSsrKSB7XG4vLyAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2ldLm1vZGVsQ2hhbmdlZClcbi8vICAgICAgIHRoaXMubGlzdGVuZXJzW2ldLm1vZGVsQ2hhbmdlZCgpO1xuLy8gICB9XG4vLyB9O1xuXG4vKipcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5FbmdyYXZlckNvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpPTA7aTx0aGlzLnNlbGVjdGVkLmxlbmd0aDtpKyspIHtcbiAgICB0aGlzLnNlbGVjdGVkW2ldLnVuaGlnaGxpZ2h0KCk7XG4gIH1cbiAgdGhpcy5zZWxlY3RlZCA9IFtdO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gbGlzdGVuZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyLm1vZGVsQ2hhbmdlZCB0aGUgbW9kZWwgdGhlIGxpc3RlbmVyIHBhc3NlZCB0byB0aGlzIGNvbnRyb2xsZXIgaGFzIGNoYW5nZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyLmhpZ2hsaWdodCB0aGUgYWJjZWxlbSBvZiB0aGUgbW9kZWwgdGhlIGxpc3RlbmVyIHBhc3NlZCB0byB0aGlzIGNvbnRyb2xsZXIgc2hvdWxkIGJlIGhpZ2hsaWdodGVkXG4gKi9cbkVuZ3JhdmVyQ29udHJvbGxlci5wcm90b3R5cGUuYWRkU2VsZWN0TGlzdGVuZXIgPSBmdW5jdGlvbiAoY2xpY2tMaXN0ZW5lcikge1xuICB0aGlzLmxpc3RlbmVyc1t0aGlzLmxpc3RlbmVycy5sZW5ndGhdID0gY2xpY2tMaXN0ZW5lcjtcbn07XG5cbi8qKlxuICogVGVsbCB0aGUgY29udHJvbGxlciB0byBoaWdobGlnaHQgc29tZSBub3RlaGVhZHMgb2YgaXRzIGVuZ3JhdmVkIHNjb3JlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgdGhlIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIGFiYyB3aGVyZSBoaWdobGlnaHRpbmcgc2hvdWxkIHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBhYmMgd2hlcmUgaGlnaGxpZ2h0aW5nIHNob3VsZCBlbmRcbiAqL1xuRW5ncmF2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yYW5nZUhpZ2hsaWdodCA9IGZ1bmN0aW9uKHN0YXJ0LGVuZClcbntcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgZm9yICh2YXIgbGluZT0wO2xpbmU8dGhpcy5zdGFmZmdyb3Vwcy5sZW5ndGg7IGxpbmUrKykge1xuXHR2YXIgdm9pY2VzID0gdGhpcy5zdGFmZmdyb3Vwc1tsaW5lXS52b2ljZXM7XG5cdGZvciAodmFyIHZvaWNlPTA7dm9pY2U8dm9pY2VzLmxlbmd0aDt2b2ljZSsrKSB7XG5cdCAgICB2YXIgZWxlbXMgPSB2b2ljZXNbdm9pY2VdLmNoaWxkcmVuO1xuXHQgICAgZm9yICh2YXIgZWxlbT0wOyBlbGVtPGVsZW1zLmxlbmd0aDsgZWxlbSsrKSB7XG5cdFx0Ly8gU2luY2UgdGhlIHVzZXIgY2FuIGhpZ2hsaWdodCBtb3JlIHRoYW4gYW4gZWxlbWVudCwgb3IgcGFydCBvZiBhbiBlbGVtZW50LCBhIGhpdCBpcyBpZiBhbnkgb2YgdGhlIGVuZHBvaW50c1xuXHRcdC8vIGlzIGluc2lkZSB0aGUgb3RoZXIgcmFuZ2UuXG5cdFx0dmFyIGVsU3RhcnQgPSBlbGVtc1tlbGVtXS5hYmNlbGVtLnN0YXJ0Q2hhcjtcblx0XHR2YXIgZWxFbmQgPSBlbGVtc1tlbGVtXS5hYmNlbGVtLmVuZENoYXI7XG5cdFx0aWYgKChlbmQ+ZWxTdGFydCAmJiBzdGFydDxlbEVuZCkgfHwgKChlbmQ9PT1zdGFydCkgJiYgZW5kPT09ZWxFbmQpKSB7XG5cdFx0ICAgIC8vXHRcdGlmIChlbGVtc1tlbGVtXS5hYmNlbGVtLnN0YXJ0Q2hhcj49c3RhcnQgJiYgZWxlbXNbZWxlbV0uYWJjZWxlbS5lbmRDaGFyPD1lbmQpIHtcblx0XHQgICAgdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aF09ZWxlbXNbZWxlbV07XG5cdFx0ICAgIGVsZW1zW2VsZW1dLmhpZ2hsaWdodCgpO1xuXHRcdH1cblx0ICAgIH1cblx0fVxuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gY2VudGVyV2hvbGVSZXN0cyh2b2ljZXMpIHtcblx0Ly8gd2hvbGUgcmVzdHMgYXJlIGEgc3BlY2lhbCBjYXNlOiBpZiB0aGV5IGFyZSBieSB0aGVtc2VsdmVzIGluIGEgbWVhc3VyZSwgdGhlbiB0aGV5IHNob3VsZCBiZSBjZW50ZXJlZC5cblx0Ly8gKElmIHRoZXkgYXJlIG5vdCBieSB0aGVtc2VsdmVzLCB0aGF0IGlzIHByb2JhYmx5IGEgdXNlciBlcnJvciwgYnV0IHdlJ2xsIGp1c3QgY2VudGVyIGl0IGJldHdlZW4gdGhlIHR3byBpdGVtcyB0byBlaXRoZXIgc2lkZSBvZiBpdC4pXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdm9pY2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHZvaWNlID0gdm9pY2VzW2ldO1xuXHRcdC8vIExvb2sgdGhyb3VnaCBhbGwgb2YgdGhlIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGFuZCBsYXN0LiBJZiB0aGUgd2hvbGUgbm90ZSBhcHBlYXJzIHRoZXJlIHRoZW4gdGhlcmUgaXNuJ3QgYW55dGhpbmcgdG8gY2VudGVyIGl0IGJldHdlZW4gYW55d2F5LlxuXHRcdGZvciAodmFyIGogPSAxOyBqIDwgdm9pY2UuY2hpbGRyZW4ubGVuZ3RoLTE7IGorKykge1xuXHRcdFx0dmFyIGFic0VsZW0gPSB2b2ljZS5jaGlsZHJlbltqXTtcblx0XHRcdGlmIChhYnNFbGVtLmFiY2VsZW0ucmVzdCAmJiAoYWJzRWxlbS5hYmNlbGVtLnJlc3QudHlwZSA9PT0gJ3dob2xlJyB8fCBhYnNFbGVtLmFiY2VsZW0ucmVzdC50eXBlID09PSAnbXVsdGltZWFzdXJlJykpIHtcblx0XHRcdFx0dmFyIGJlZm9yZSA9IHZvaWNlLmNoaWxkcmVuW2otMV07XG5cdFx0XHRcdHZhciBhZnRlciA9IHZvaWNlLmNoaWxkcmVuW2orMV07XG5cdFx0XHRcdHZhciBtaWRwb2ludCA9IChhZnRlci54IC0gYmVmb3JlLngpIC8gMiArIGJlZm9yZS54O1xuXHRcdFx0XHRhYnNFbGVtLnggPSBtaWRwb2ludCAtIGFic0VsZW0udyAvIDI7XG5cdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgYWJzRWxlbS5jaGlsZHJlbi5sZW5ndGg7IGsrKylcblx0XHRcdFx0XHRhYnNFbGVtLmNoaWxkcmVuW2tdLnggPSBhYnNFbGVtLng7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW5ncmF2ZXJDb250cm9sbGVyO1xuIiwidmFyIHR1bmVib29rID0gcmVxdWlyZSgnLi9hYmNfdHVuZWJvb2snKTtcbnZhciBUdW5lID0gcmVxdWlyZSgnLi4vZGF0YS9hYmNfdHVuZScpO1xuXG52YXIgRW5ncmF2ZXJDb250cm9sbGVyID0gcmVxdWlyZSgnLi4vd3JpdGUvYWJjX2VuZ3JhdmVyX2NvbnRyb2xsZXInKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19wYXJzZScpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuLi9wYXJzZS93cmFwX2xpbmVzJyk7XG5cbnZhciByZXNpemVEaXZzID0ge307XG5mdW5jdGlvbiByZXNpemVPdXRlcigpIHtcbiAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBmb3IgKHZhciBpZCBpbiByZXNpemVEaXZzKSB7XG4gICAgICAgIGlmIChyZXNpemVEaXZzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgdmFyIG91dGVyID0gcmVzaXplRGl2c1tpZF07XG4gICAgICAgICAgICB2YXIgb2ZzID0gb3V0ZXIub2Zmc2V0TGVmdDtcbiAgICAgICAgICAgIHdpZHRoIC09IG9mcyAqIDI7XG4gICAgICAgICAgICBvdXRlci5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgfVxufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemVPdXRlcik7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9yaWVudGF0aW9uQ2hhbmdlXCIsIHJlc2l6ZU91dGVyKTtcblxuZnVuY3Rpb24gcmVuZGVyT25lKGRpdiwgdHVuZSwgcGFyYW1zLCB0dW5lTnVtYmVyKSB7XG4gICAgaWYgKHBhcmFtcy52aWV3cG9ydEhvcml6b250YWwpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlubmVyIGRpdiB0aGF0IGhvbGRzIHRoZSBtdXNpYywgc28gdGhhdCB0aGUgcGFzc2VkIGluIGRpdiB3aWxsIGJlIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiYWJjanMtaW5uZXJcIj48L2Rpdj4nO1xuICAgICAgICBpZiAocGFyYW1zLnNjcm9sbEhvcml6b250YWwpIHtcbiAgICAgICAgICAgIGRpdi5zdHlsZS5vdmVyZmxvd1ggPSBcImF1dG9cIjtcbiAgICAgICAgICAgIGRpdi5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGRpdi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgICAgIHJlc2l6ZURpdnNbZGl2LmlkXSA9IGRpdjsgLy8gV2UgdXNlIGEgaGFzaCBvbiB0aGUgZWxlbWVudCdzIGlkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgd29uJ3Qga2VlcCBhZGRpbmcgdG8gdGhlIGxpc3QuXG4gICAgICAgIGRpdiA9IGRpdi5jaGlsZHJlblswXTsgLy8gVGhlIG11c2ljIHNob3VsZCBiZSByZW5kZXJlZCBpbiB0aGUgaW5uZXIgZGl2LlxuICAgIH1cbiAgICBlbHNlIGlmIChwYXJhbXMudmlld3BvcnRWZXJ0aWNhbCkge1xuICAgICAgICAvLyBDcmVhdGUgYW4gaW5uZXIgZGl2IHRoYXQgaG9sZHMgdGhlIG11c2ljLCBzbyB0aGF0IHRoZSBwYXNzZWQgaW4gZGl2IHdpbGwgYmUgdGhlIHZpZXdwb3J0LlxuICAgICAgICBkaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJhYmNqcy1pbm5lciBzY3JvbGwtYW1vdW50XCI+PC9kaXY+JztcbiAgICAgICAgZGl2LnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGRpdi5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgZGl2ID0gZGl2LmNoaWxkcmVuWzBdOyAvLyBUaGUgbXVzaWMgc2hvdWxkIGJlIHJlbmRlcmVkIGluIHRoZSBpbm5lciBkaXYuXG4gICAgfVxuICAgIGVsc2Vcblx0ICAgIGRpdi5pbm5lckhUTUwgPSBcIlwiO1xuICAgIHZhciBlbmdyYXZlcl9jb250cm9sbGVyID0gbmV3IEVuZ3JhdmVyQ29udHJvbGxlcihkaXYsIHBhcmFtcyk7XG4gICAgZW5ncmF2ZXJfY29udHJvbGxlci5lbmdyYXZlQUJDKHR1bmUsIHR1bmVOdW1iZXIpO1xuICAgIHR1bmUuZW5ncmF2ZXIgPSBlbmdyYXZlcl9jb250cm9sbGVyO1xuICAgIGlmIChwYXJhbXMudmlld3BvcnRWZXJ0aWNhbCB8fCBwYXJhbXMudmlld3BvcnRIb3Jpem9udGFsKSB7XG4gICAgICAgIC8vIElmIHdlIGFkZGVkIGEgd3JhcHBlciBhcm91bmQgdGhlIGRpdiwgdGhlbiB3ZSBuZWVkIHRvIHNpemUgdGhlIHdyYXBwZXIsIHRvby5cbiAgICAgICAgdmFyIHBhcmVudCA9IGRpdi5wYXJlbnROb2RlO1xuICAgICAgICBwYXJlbnQuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUud2lkdGg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJFYWNoTGluZVNlcGFyYXRlbHkoZGl2LCB0dW5lLCBwYXJhbXMsIHR1bmVOdW1iZXIpIHtcbiAgICBmdW5jdGlvbiBpbml0aWFsaXplVHVuZUxpbmUodHVuZSkge1xuICAgICAgICB2YXIgb2JqID0gbmV3IFR1bmUoKTtcbiAgICAgICAgb2JqLmZvcm1hdHRpbmcgPSB0dW5lLmZvcm1hdHRpbmc7XG4gICAgICAgIG9iai5tZWRpYSA9IHR1bmUubWVkaWE7XG4gICAgICAgIG9iai52ZXJzaW9uID0gdHVuZS52ZXJzaW9uO1xuICAgICAgICBvYmoubWV0YVRleHQgPSB7fTtcbiAgICAgICAgb2JqLmxpbmVzID0gW107XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHJlbmRlcmluZywgY2hvcCB1cCB0aGUgcmV0dXJuZWQgdHVuZSBpbnRvIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIGxpbmUuXG4gICAgLy8gVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IGdldHMgdGhlIHRpdGxlIGFuZCBvdGhlciBpdGVtcyB0aGF0IGdvIG9uIHRvcCwgdGhlIGxhc3QgZWxlbWVudFxuICAgIC8vIG9mIHRoZSBhcnJheSBnZXRzIHRoZSBleHRyYSB0ZXh0IHRoYXQgZ29lcyBvbiBib3R0b20uIEVhY2ggZWxlbWVudCBnZXRzIGFueSBub24tbXVzaWMgaW5mbyB0aGF0IGNvbWVzIGJlZm9yZSBpdC5cbiAgICB2YXIgdHVuZXMgPSBbXTtcbiAgICB2YXIgdHVuZUxpbmU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0dW5lLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gdHVuZS5saW5lc1tpXTtcbiAgICAgICAgaWYgKCF0dW5lTGluZSlcbiAgICAgICAgICAgIHR1bmVMaW5lID0gaW5pdGlhbGl6ZVR1bmVMaW5lKHR1bmUpO1xuXG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGVzZSBpdGVtcyBnbyBvbiB0b3Agb2YgdGhlIG11c2ljXG4gICAgICAgICAgICB0dW5lTGluZS5tZXRhVGV4dC50ZW1wbyA9IHR1bmUubWV0YVRleHQudGVtcG87XG4gICAgICAgICAgICB0dW5lTGluZS5tZXRhVGV4dC50aXRsZSA9IHR1bmUubWV0YVRleHQudGl0bGU7XG4gICAgICAgICAgICB0dW5lTGluZS5tZXRhVGV4dC5oZWFkZXIgPSB0dW5lLm1ldGFUZXh0LmhlYWRlcjtcbiAgICAgICAgICAgIHR1bmVMaW5lLm1ldGFUZXh0LnJoeXRobSA9IHR1bmUubWV0YVRleHQucmh5dGhtO1xuICAgICAgICAgICAgdHVuZUxpbmUubWV0YVRleHQub3JpZ2luID0gdHVuZS5tZXRhVGV4dC5vcmlnaW47XG4gICAgICAgICAgICB0dW5lTGluZS5tZXRhVGV4dC5jb21wb3NlciA9IHR1bmUubWV0YVRleHQuY29tcG9zZXI7XG4gICAgICAgICAgICB0dW5lTGluZS5tZXRhVGV4dC5hdXRob3IgPSB0dW5lLm1ldGFUZXh0LmF1dGhvcjtcbiAgICAgICAgICAgIHR1bmVMaW5lLm1ldGFUZXh0LnBhcnRPcmRlciA9IHR1bmUubWV0YVRleHQucGFydE9yZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHVzaCB0aGUgbGluZXMgdW50aWwgd2UgZ2V0IHRvIGEgbXVzaWMgbGluZVxuICAgICAgICB0dW5lTGluZS5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBpZiAobGluZS5zdGFmZikge1xuICAgICAgICAgICAgdHVuZXMucHVzaCh0dW5lTGluZSk7XG4gICAgICAgICAgICB0dW5lTGluZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgYW55IGV4dHJhIHN0dWZmIHRvIHRoZSBsYXN0IGxpbmUuXG4gICAgaWYgKHR1bmVMaW5lKSB7XG4gICAgICAgIHZhciBsYXN0TGluZSA9IHR1bmVzW3R1bmVzLmxlbmd0aC0xXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0dW5lTGluZS5saW5lcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGxhc3RMaW5lLmxpbmVzLnB1c2godHVuZUxpbmUubGluZXNbal0pO1xuICAgIH1cblxuICAgIC8vIFRoZXNlIGl0ZW1zIGdvIGJlbG93IHRoZSBtdXNpY1xuICAgIHR1bmVMaW5lID0gdHVuZXNbdHVuZXMubGVuZ3RoLTFdO1xuICAgIHR1bmVMaW5lLm1ldGFUZXh0LnVuYWxpZ25lZFdvcmRzID0gdHVuZS5tZXRhVGV4dC51bmFsaWduZWRXb3JkcztcbiAgICB0dW5lTGluZS5tZXRhVGV4dC5ib29rID0gdHVuZS5tZXRhVGV4dC5ib29rO1xuICAgIHR1bmVMaW5lLm1ldGFUZXh0LnNvdXJjZSA9IHR1bmUubWV0YVRleHQuc291cmNlO1xuICAgIHR1bmVMaW5lLm1ldGFUZXh0LmRpc2NvZ3JhcGh5ID0gdHVuZS5tZXRhVGV4dC5kaXNjb2dyYXBoeTtcbiAgICB0dW5lTGluZS5tZXRhVGV4dC5ub3RlcyA9IHR1bmUubWV0YVRleHQubm90ZXM7XG4gICAgdHVuZUxpbmUubWV0YVRleHQudHJhbnNjcmlwdGlvbiA9IHR1bmUubWV0YVRleHQudHJhbnNjcmlwdGlvbjtcbiAgICB0dW5lTGluZS5tZXRhVGV4dC5oaXN0b3J5ID0gdHVuZS5tZXRhVGV4dC5oaXN0b3J5O1xuICAgIHR1bmVMaW5lLm1ldGFUZXh0WydhYmMtY29weXJpZ2h0J10gPSB0dW5lLm1ldGFUZXh0WydhYmMtY29weXJpZ2h0J107XG4gICAgdHVuZUxpbmUubWV0YVRleHRbJ2FiYy1jcmVhdG9yJ10gPSB0dW5lLm1ldGFUZXh0WydhYmMtY3JlYXRvciddO1xuICAgIHR1bmVMaW5lLm1ldGFUZXh0WydhYmMtZWRpdGVkLWJ5J10gPSB0dW5lLm1ldGFUZXh0WydhYmMtZWRpdGVkLWJ5J107XG4gICAgdHVuZUxpbmUubWV0YVRleHQuZm9vdGVyID0gdHVuZS5tZXRhVGV4dC5mb290ZXI7XG5cbiAgICAvLyBOb3cgY3JlYXRlIHN1Yi1kaXZzIGFuZCByZW5kZXIgZWFjaCBsaW5lLiBOZWVkIHRvIGNvcHkgdGhlIHBhcmFtcyB0byBjaGFuZ2UgdGhlIHBhZGRpbmcgZm9yIHRoZSBpbnRlcmlvciBzbGljZXMuXG4gICAgdmFyIGVwID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGVwW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgb3JpZ1BhZGRpbmdUb3AgPSBlcC5wYWRkaW5ndG9wO1xuICAgIHZhciBvcmlnUGFkZGluZ0JvdHRvbSA9IGVwLnBhZGRpbmdib3R0b207XG4gICAgZGl2LmlubmVySFRNTCA9IFwiXCI7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCB0dW5lcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgbGluZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxpbmVFbCk7XG5cbiAgICAgICAgaWYgKGsgPT09IDApIHtcblx0ICAgICAgICBlcC5wYWRkaW5ndG9wID0gb3JpZ1BhZGRpbmdUb3A7XG5cdCAgICAgICAgZXAucGFkZGluZ2JvdHRvbSA9IC0yMDtcbiAgICAgICAgfSBlbHNlIGlmIChrID09PSB0dW5lcy5sZW5ndGgtMSkge1xuXHQgICAgICAgIGVwLnBhZGRpbmd0b3AgPSAxMDtcblx0ICAgICAgICBlcC5wYWRkaW5nYm90dG9tID0gb3JpZ1BhZGRpbmdCb3R0b207XG4gICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZXAucGFkZGluZ3RvcCA9IDEwO1xuXHQgICAgICAgIGVwLnBhZGRpbmdib3R0b20gPSAtMjA7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyT25lKGxpbmVFbCwgdHVuZXNba10sIGVwLCB0dW5lTnVtYmVyKTtcbiAgICAgICAgaWYgKGsgPT09IDApXG4gICAgICAgICAgICB0dW5lLmVuZ3JhdmVyID0gdHVuZXNba10uZW5ncmF2ZXI7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0dW5lLmVuZ3JhdmVyLnN0YWZmZ3JvdXBzKVxuICAgICAgICAgICAgICAgIHR1bmUuZW5ncmF2ZXIuc3RhZmZncm91cHMgPSB0dW5lc1trXS5lbmdyYXZlci5zdGFmZmdyb3VwcztcbiAgICAgICAgICAgIGVsc2UgaWYgKHR1bmVzW2tdLmVuZ3JhdmVyLnN0YWZmZ3JvdXBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdHVuZS5lbmdyYXZlci5zdGFmZmdyb3Vwcy5wdXNoKHR1bmVzW2tdLmVuZ3JhdmVyLnN0YWZmZ3JvdXBzWzBdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQSBxdWljayB3YXkgdG8gcmVuZGVyIGEgdHVuZSBmcm9tIGphdmFzY3JpcHQgd2hlbiBpbnRlcmFjdGl2aXR5IGlzIG5vdCByZXF1aXJlZC5cbi8vIFRoaXMgaXMgdXNlZCB3aGVuIGEgamF2YXNjcmlwdCByb3V0aW5lIGhhcyBzb21lIGFiYyB0ZXh0IHRoYXQgaXQgd2FudHMgdG8gcmVuZGVyXG4vLyBpbiBhIGRpdiBvciBjb2xsZWN0aW9uIG9mIGRpdnMuIE9uZSB0dW5lIG9yIG1hbnkgY2FuIGJlIHJlbmRlcmVkLlxuLy9cbi8vIHBhcmFtZXRlcnM6XG4vLyAgICAgIG91dHB1dDogYW4gYXJyYXkgb2YgZGl2cyB0aGF0IHRoZSBpbmRpdmlkdWFsIHR1bmVzIGFyZSByZW5kZXJlZCB0by5cbi8vICAgICAgICAgIElmIHRoZSBudW1iZXIgb2YgdHVuZXMgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGRpdnMgaW4gdGhlIGFycmF5LCB0aGVuXG4vLyAgICAgICAgICBvbmx5IHRoZSBmaXJzdCB0dW5lcyBhcmUgcmVuZGVyZWQuIElmIHRoZSBudW1iZXIgb2YgZGl2cyBleGNlZWRzIHRoZSBudW1iZXJcbi8vICAgICAgICAgIG9mIHR1bmVzLCB0aGVuIHRoZSB1bnVzZWQgZGl2cyBhcmUgY2xlYXJlZC4gVGhlIGRpdnMgY2FuIGJlIHBhc3NlZCBhcyBlaXRoZXJcbi8vICAgICAgICAgIGVsZW1lbnRzIG9yIHN0cmluZ3Mgb2YgaWRzLiBJZiBpZHMgYXJlIHBhc3NlZCwgdGhlbiB0aGUgZGl2IE1VU1QgZXhpc3QgYWxyZWFkeS5cbi8vICAgICAgICAgIChpZiBhIHNpbmdsZSBlbGVtZW50IGlzIHBhc3NlZCwgdGhlbiBpdCBpcyBhbiBpbXBsaWVkIGFycmF5IG9mIGxlbmd0aCBvbmUuKVxuLy8gICAgICAgICAgKGlmIGEgbnVsbCBpcyBwYXNzZWQgZm9yIGFuIGVsZW1lbnQsIG9yIHRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhhdCB0dW5lIGlzIHNraXBwZWQuKVxuLy8gICAgICBhYmM6IHRleHQgcmVwcmVzZW50aW5nIGEgdHVuZSBvciBhbiBlbnRpcmUgdHVuZSBib29rIGluIEFCQyBub3RhdGlvbi5cbi8vICAgICAgcmVuZGVyUGFyYW1zOiBoYXNoIG9mOlxuLy8gICAgICAgICAgc3RhcnRpbmdUdW5lOiBhbiBpbmRleCwgc3RhcnRpbmcgYXQgemVybywgcmVwcmVzZW50aW5nIHdoaWNoIHR1bmUgdG8gc3RhcnQgcmVuZGVyaW5nIGF0LlxuLy8gICAgICAgICAgICAgIChJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZW4gcmVuZGVyaW5nIHN0YXJ0cyBhdCB6ZXJvLilcbi8vICAgICAgICAgIHdpZHRoOiA4MDAgYnkgZGVmYXVsdC4gVGhlIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgb3V0cHV0IHBhcGVyXG52YXIgcmVuZGVyQWJjID0gZnVuY3Rpb24ob3V0cHV0LCBhYmMsIHBhcnNlclBhcmFtcywgZW5ncmF2ZXJQYXJhbXMsIHJlbmRlclBhcmFtcykge1xuICAgIC8vIE5vdGU6IGFsbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjb25kZW5zZWQgaW50byB0aGUgZmlyc3Qgb25lcy4gSXQgZG9lc24ndCBodXJ0IGFueXRoaW5nIHRvIGFsbG93IHRoZSBvbGQgZm9ybWF0LCBzbyBqdXN0IGNvcHkgdGhlbSBoZXJlLlxuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICB2YXIga2V5O1xuICAgIGlmIChwYXJzZXJQYXJhbXMpIHtcbiAgICAgICAgZm9yIChrZXkgaW4gcGFyc2VyUGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyUGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IHBhcnNlclBhcmFtc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbmdyYXZlclBhcmFtcykge1xuICAgICAgICBmb3IgKGtleSBpbiBlbmdyYXZlclBhcmFtcykge1xuICAgICAgICAgICAgaWYgKGVuZ3JhdmVyUGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBjb25mbGljdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgXCJsaXN0ZW5lclwiLiBJZiBpdCBpcyBpbiB0aGUgc2Vjb25kIHBhcmFtZXRlciwgdGhlbiBpdCBpcyBmb3IgY2xpY2suXG5cdCAgICAgICAgICAgIGlmIChrZXkgPT09IFwibGlzdGVuZXJcIikge1xuXHQgICAgICAgICAgICBcdGlmIChlbmdyYXZlclBhcmFtc1trZXldLmhpZ2hsaWdodClcblx0XHQgICAgICAgICAgICAgICAgcGFyYW1zLmNsaWNrTGlzdGVuZXIgPSBlbmdyYXZlclBhcmFtc1trZXldLmhpZ2hsaWdodDtcblx0ICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gZW5ncmF2ZXJQYXJhbXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVuZGVyUGFyYW1zKSB7XG4gICAgICAgIGZvciAoa2V5IGluIHJlbmRlclBhcmFtcykge1xuICAgICAgICAgICAgaWYgKHJlbmRlclBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSByZW5kZXJQYXJhbXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxiYWNrKGRpdiwgdHVuZSwgdHVuZU51bWJlciwgYWJjU3RyaW5nKSB7XG4gICAgICAgIHZhciByZW1vdmVEaXYgPSBmYWxzZTtcbiAgICAgICAgaWYgKGRpdiA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIHJlbW92ZURpdiA9IHRydWU7XG4gICAgICAgICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpub25lO1wiKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgfVxuICAgIFx0aWYgKHBhcmFtcy5hZnRlclBhcnNpbmcpXG4gICAgXHRcdHBhcmFtcy5hZnRlclBhcnNpbmcodHVuZSwgdHVuZU51bWJlciwgYWJjU3RyaW5nKTtcbiAgICAgICAgaWYgKCFyZW1vdmVEaXYgJiYgcGFyYW1zLndyYXAgJiYgcGFyYW1zLnN0YWZmd2lkdGgpIHtcblx0ICAgICAgICB0dW5lID0gZG9MaW5lV3JhcHBpbmcoZGl2LCB0dW5lLCB0dW5lTnVtYmVyLCBhYmNTdHJpbmcsIHBhcmFtcyk7XG5cdCAgICAgICAgcmV0dXJuIHR1bmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVtb3ZlRGl2IHx8ICFwYXJhbXMub25lU3ZnUGVyTGluZSB8fCB0dW5lLmxpbmVzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICByZW5kZXJPbmUoZGl2LCB0dW5lLCBwYXJhbXMsIHR1bmVOdW1iZXIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZW5kZXJFYWNoTGluZVNlcGFyYXRlbHkoZGl2LCB0dW5lLCBwYXJhbXMsIHR1bmVOdW1iZXIpO1xuICAgICAgICBpZiAocmVtb3ZlRGl2KVxuICAgICAgICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR1bmVib29rLnJlbmRlckVuZ2luZShjYWxsYmFjaywgb3V0cHV0LCBhYmMsIHBhcmFtcyk7XG59O1xuXG5mdW5jdGlvbiBkb0xpbmVXcmFwcGluZyhkaXYsIHR1bmUsIHR1bmVOdW1iZXIsIGFiY1N0cmluZywgcGFyYW1zKSB7XG5cdHZhciBlbmdyYXZlcl9jb250cm9sbGVyID0gbmV3IEVuZ3JhdmVyQ29udHJvbGxlcihkaXYsIHBhcmFtcyk7XG5cdHZhciB3aWR0aHMgPSBlbmdyYXZlcl9jb250cm9sbGVyLmdldE1lYXN1cmVXaWR0aHModHVuZSk7XG5cblx0dmFyIHJldCA9IHdyYXAuY2FsY0xpbmVXcmFwcyh0dW5lLCB3aWR0aHMsIGFiY1N0cmluZywgcGFyYW1zLCBQYXJzZSwgZW5ncmF2ZXJfY29udHJvbGxlcik7XG4gICAgaWYgKCFwYXJhbXMub25lU3ZnUGVyTGluZSB8fCByZXQudHVuZS5saW5lcy5sZW5ndGggPCAyKVxuICAgICAgICByZW5kZXJPbmUoZGl2LCByZXQudHVuZSwgcmV0LnJldmlzZWRQYXJhbXMsIHR1bmVOdW1iZXIpO1xuICAgIGVsc2VcbiAgICAgICAgcmVuZGVyRWFjaExpbmVTZXBhcmF0ZWx5KGRpdiwgcmV0LnR1bmUsIHJldC5yZXZpc2VkUGFyYW1zLCB0dW5lTnVtYmVyKTtcblx0cmV0LnR1bmUuZXhwbGFuYXRpb24gPSByZXQuZXhwbGFuYXRpb247XG5cdHJldHVybiByZXQudHVuZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZW5kZXJBYmM7XG4iLCJ2YXIgc291bmRzQ2FjaGUgPSB7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvdW5kc0NhY2hlO1xuIiwiLy8gTG9hZCBvbmUgbXAzIGZpbGUgZm9yIG9uZSBub3RlLlxuLy8gdXJsID0gdGhlIGJhc2UgdXJsIGZvciB0aGUgc291bmRmb250XG4vLyBpbnN0cnVtZW50ID0gdGhlIGluc3RydW1lbnQgbmFtZSAoZS5nLiBcImFjb3VzdGljX2dyYW5kX3BpYW5vXCIpXG4vLyBuYW1lID0gdGhlIHBpdGNoIG5hbWUgKGUuZy4gXCJBM1wiKVxudmFyIHNvdW5kc0NhY2hlID0gcmVxdWlyZSgnLi9zb3VuZHMtY2FjaGUnKTtcblxudmFyIGdldE5vdGUgPSBmdW5jdGlvbih1cmwsIGluc3RydW1lbnQsIG5hbWUsIGF1ZGlvQ29udGV4dCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdGlmICghc291bmRzQ2FjaGVbaW5zdHJ1bWVudF0pXG5cdFx0XHRzb3VuZHNDYWNoZVtpbnN0cnVtZW50XSA9IHt9O1xuXHRcdHZhciBpbnN0cnVtZW50Q2FjaGUgPSBzb3VuZHNDYWNoZVtpbnN0cnVtZW50XTtcblxuXHRcdGlmIChpbnN0cnVtZW50Q2FjaGVbbmFtZV0gPT09ICdlcnJvcicpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgc291bmQgZm9udFwiICsgJyAnICsgdXJsICsgJyAnICsgaW5zdHJ1bWVudCArICcgJyArIG5hbWUpKTtcblx0XHR9XG5cdFx0aWYgKGluc3RydW1lbnRDYWNoZVtuYW1lXSkge1xuXHRcdFx0cmV0dXJuIHJlc29sdmUoe2luc3RydW1lbnQ6IGluc3RydW1lbnQsIG5hbWU6IG5hbWV9KTtcblx0XHR9XG5cblx0XHQvLyBpZiAodGhpcy5kZWJ1Z0NhbGxiYWNrKVxuXHRcdC8vIFx0dGhpcy5kZWJ1Z0NhbGxiYWNrKGBMb2FkaW5nIHNvdW5kOiAke2luc3RydW1lbnR9ICR7bmFtZX1gKTtcblx0XHRpbnN0cnVtZW50Q2FjaGVbbmFtZV0gPSBcInBlbmRpbmdcIjsgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIGluIHBhcmFsbGVsLCBzbyBkb24ndCBjYWxsIGl0IGEgc2Vjb25kIHRpbWUgYmVmb3JlIHRoZSBmaXJzdCBvbmUgaGFzIGxvYWRlZC5cblx0XHR2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdFx0eGhyLm9wZW4oJ0dFVCcsIHVybCtpbnN0cnVtZW50KyctbXAzLycrbmFtZSsnLm1wMycsIHRydWUpO1xuXHRcdHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuXG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdGZ1bmN0aW9uIG9uU3VjY2VzcyhhdWRpb0J1ZmZlcikge1xuXHRcdFx0aW5zdHJ1bWVudENhY2hlW25hbWVdID0gYXVkaW9CdWZmZXI7XG5cdFx0XHQvLyBpZiAoc2VsZi5kZWJ1Z0NhbGxiYWNrKVxuXHRcdFx0Ly8gXHRzZWxmLmRlYnVnQ2FsbGJhY2soYFNvdW5kIGxvYWRlZDogJHtpbnN0cnVtZW50fSAke25hbWV9ICR7dXJsfWApO1xuXHRcdFx0cmVzb2x2ZSh7aW5zdHJ1bWVudDogaW5zdHJ1bWVudCwgbmFtZTogbmFtZX0pO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uRmFpbHVyZShlcnJvcikge1xuXHRcdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdFx0c2VsZi5kZWJ1Z0NhbGxiYWNrKGVycm9yKTtcblx0XHRcdGNvbnNvbGUubG9nKGVycm9yKTtcblx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0fVxuXG5cdFx0eGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuXHRcdFx0XHRhdWRpb0NvbnRleHQuZGVjb2RlQXVkaW9EYXRhKHRoaXMucmVzcG9uc2UsIG9uU3VjY2Vzcywgb25GYWlsdXJlKTsvLy50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBcdHJldHVybiByZXNvbHZlKHtpbnN0cnVtZW50OiBpbnN0cnVtZW50LCBuYW1lOiBuYW1lfSk7XG5cdFx0XHRcdC8vIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0XHRcdC8vIFx0cmV0dXJuIHJlamVjdChuZXcgRXJyb3IoY2FudExvYWRNcDMgKyBlcnJvcikpO1xuXHRcdFx0XHQvLyB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluc3RydW1lbnRDYWNoZVtuYW1lXSA9IFwiZXJyb3JcIjsgLy8gVG8ga2VlcCB0aGlzIGZyb20gdHJ5aW5nIHRvIGxvYWQgcmVwZWF0ZWRseS5cblx0XHRcdFx0dmFyIGNhbnRMb2FkTXAzID0gXCJPbmxvYWQgZXJyb3IgbG9hZGluZyBzb3VuZDogXCIgKyAgbmFtZSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyBlLmN1cnJlbnRUYXJnZXQuc3RhdHVzICsgXCIgXCIgKyBlLmN1cnJlbnRUYXJnZXQuc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soY2FudExvYWRNcDMpO1xuXHRcdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihjYW50TG9hZE1wMykpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0eGhyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpbnN0cnVtZW50Q2FjaGVbbmFtZV0gPSBcImVycm9yXCI7IC8vIFRvIGtlZXAgdGhpcyBmcm9tIHRyeWluZyB0byBsb2FkIHJlcGVhdGVkbHkuXG5cdFx0XHR2YXIgY2FudExvYWRNcDMgPSBcIkVycm9yIGluIGxvYWRpbmcgc291bmQ6IFwiICsgXCIgXCIgKyB1cmw7XG5cdFx0XHRpZiAoc2VsZi5kZWJ1Z0NhbGxiYWNrKVxuXHRcdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soY2FudExvYWRNcDMpO1xuXHRcdFx0cmV0dXJuIHJlamVjdChuZXcgRXJyb3IoY2FudExvYWRNcDMpKTtcblx0XHR9LCBmYWxzZSk7XG5cdFx0eGhyLnNlbmQoKTtcblx0fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5vdGU7XG4iLCJ2YXIgaW5zdHJ1bWVudEluZGV4VG9OYW1lID0gW1xuXHRcImFjb3VzdGljX2dyYW5kX3BpYW5vXCIsXG5cdFwiYnJpZ2h0X2Fjb3VzdGljX3BpYW5vXCIsXG5cdFwiZWxlY3RyaWNfZ3JhbmRfcGlhbm9cIixcblx0XCJob25reXRvbmtfcGlhbm9cIixcblx0XCJlbGVjdHJpY19waWFub18xXCIsXG5cdFwiZWxlY3RyaWNfcGlhbm9fMlwiLFxuXHRcImhhcnBzaWNob3JkXCIsXG5cdFwiY2xhdmluZXRcIixcblxuXHRcImNlbGVzdGFcIixcblx0XCJnbG9ja2Vuc3BpZWxcIixcblx0XCJtdXNpY19ib3hcIixcblx0XCJ2aWJyYXBob25lXCIsXG5cdFwibWFyaW1iYVwiLFxuXHRcInh5bG9waG9uZVwiLFxuXHRcInR1YnVsYXJfYmVsbHNcIixcblx0XCJkdWxjaW1lclwiLFxuXG5cdFwiZHJhd2Jhcl9vcmdhblwiLFxuXHRcInBlcmN1c3NpdmVfb3JnYW5cIixcblx0XCJyb2NrX29yZ2FuXCIsXG5cdFwiY2h1cmNoX29yZ2FuXCIsXG5cdFwicmVlZF9vcmdhblwiLFxuXHRcImFjY29yZGlvblwiLFxuXHRcImhhcm1vbmljYVwiLFxuXHRcInRhbmdvX2FjY29yZGlvblwiLFxuXG5cdFwiYWNvdXN0aWNfZ3VpdGFyX255bG9uXCIsXG5cdFwiYWNvdXN0aWNfZ3VpdGFyX3N0ZWVsXCIsXG5cdFwiZWxlY3RyaWNfZ3VpdGFyX2phenpcIixcblx0XCJlbGVjdHJpY19ndWl0YXJfY2xlYW5cIixcblx0XCJlbGVjdHJpY19ndWl0YXJfbXV0ZWRcIixcblx0XCJvdmVyZHJpdmVuX2d1aXRhclwiLFxuXHRcImRpc3RvcnRpb25fZ3VpdGFyXCIsXG5cdFwiZ3VpdGFyX2hhcm1vbmljc1wiLFxuXG5cdFwiYWNvdXN0aWNfYmFzc1wiLFxuXHRcImVsZWN0cmljX2Jhc3NfZmluZ2VyXCIsXG5cdFwiZWxlY3RyaWNfYmFzc19waWNrXCIsXG5cdFwiZnJldGxlc3NfYmFzc1wiLFxuXHRcInNsYXBfYmFzc18xXCIsXG5cdFwic2xhcF9iYXNzXzJcIixcblx0XCJzeW50aF9iYXNzXzFcIixcblx0XCJzeW50aF9iYXNzXzJcIixcblxuXHRcInZpb2xpblwiLFxuXHRcInZpb2xhXCIsXG5cdFwiY2VsbG9cIixcblx0XCJjb250cmFiYXNzXCIsXG5cdFwidHJlbW9sb19zdHJpbmdzXCIsXG5cdFwicGl6emljYXRvX3N0cmluZ3NcIixcblx0XCJvcmNoZXN0cmFsX2hhcnBcIixcblx0XCJ0aW1wYW5pXCIsXG5cblx0XCJzdHJpbmdfZW5zZW1ibGVfMVwiLFxuXHRcInN0cmluZ19lbnNlbWJsZV8yXCIsXG5cdFwic3ludGhfc3RyaW5nc18xXCIsXG5cdFwic3ludGhfc3RyaW5nc18yXCIsXG5cdFwiY2hvaXJfYWFoc1wiLFxuXHRcInZvaWNlX29vaHNcIixcblx0XCJzeW50aF9jaG9pclwiLFxuXHRcIm9yY2hlc3RyYV9oaXRcIixcblxuXHRcInRydW1wZXRcIixcblx0XCJ0cm9tYm9uZVwiLFxuXHRcInR1YmFcIixcblx0XCJtdXRlZF90cnVtcGV0XCIsXG5cdFwiZnJlbmNoX2hvcm5cIixcblx0XCJicmFzc19zZWN0aW9uXCIsXG5cdFwic3ludGhfYnJhc3NfMVwiLFxuXHRcInN5bnRoX2JyYXNzXzJcIixcblxuXHRcInNvcHJhbm9fc2F4XCIsXG5cdFwiYWx0b19zYXhcIixcblx0XCJ0ZW5vcl9zYXhcIixcblx0XCJiYXJpdG9uZV9zYXhcIixcblx0XCJvYm9lXCIsXG5cdFwiZW5nbGlzaF9ob3JuXCIsXG5cdFwiYmFzc29vblwiLFxuXHRcImNsYXJpbmV0XCIsXG5cblx0XCJwaWNjb2xvXCIsXG5cdFwiZmx1dGVcIixcblx0XCJyZWNvcmRlclwiLFxuXHRcInBhbl9mbHV0ZVwiLFxuXHRcImJsb3duX2JvdHRsZVwiLFxuXHRcInNoYWt1aGFjaGlcIixcblx0XCJ3aGlzdGxlXCIsXG5cdFwib2NhcmluYVwiLFxuXG5cdFwibGVhZF8xX3NxdWFyZVwiLFxuXHRcImxlYWRfMl9zYXd0b290aFwiLFxuXHRcImxlYWRfM19jYWxsaW9wZVwiLFxuXHRcImxlYWRfNF9jaGlmZlwiLFxuXHRcImxlYWRfNV9jaGFyYW5nXCIsXG5cdFwibGVhZF82X3ZvaWNlXCIsXG5cdFwibGVhZF83X2ZpZnRoc1wiLFxuXHRcImxlYWRfOF9iYXNzX19sZWFkXCIsXG5cblx0XCJwYWRfMV9uZXdfYWdlXCIsXG5cdFwicGFkXzJfd2FybVwiLFxuXHRcInBhZF8zX3BvbHlzeW50aFwiLFxuXHRcInBhZF80X2Nob2lyXCIsXG5cdFwicGFkXzVfYm93ZWRcIixcblx0XCJwYWRfNl9tZXRhbGxpY1wiLFxuXHRcInBhZF83X2hhbG9cIixcblx0XCJwYWRfOF9zd2VlcFwiLFxuXG5cdFwiZnhfMV9yYWluXCIsXG5cdFwiZnhfMl9zb3VuZHRyYWNrXCIsXG5cdFwiZnhfM19jcnlzdGFsXCIsXG5cdFwiZnhfNF9hdG1vc3BoZXJlXCIsXG5cdFwiZnhfNV9icmlnaHRuZXNzXCIsXG5cdFwiZnhfNl9nb2JsaW5zXCIsXG5cdFwiZnhfN19lY2hvZXNcIixcblx0XCJmeF84X3NjaWZpXCIsXG5cblx0XCJzaXRhclwiLFxuXHRcImJhbmpvXCIsXG5cdFwic2hhbWlzZW5cIixcblx0XCJrb3RvXCIsXG5cdFwia2FsaW1iYVwiLFxuXHRcImJhZ3BpcGVcIixcblx0XCJmaWRkbGVcIixcblx0XCJzaGFuYWlcIixcblxuXHRcInRpbmtsZV9iZWxsXCIsXG5cdFwiYWdvZ29cIixcblx0XCJzdGVlbF9kcnVtc1wiLFxuXHRcIndvb2RibG9ja1wiLFxuXHRcInRhaWtvX2RydW1cIixcblx0XCJtZWxvZGljX3RvbVwiLFxuXHRcInN5bnRoX2RydW1cIixcblx0XCJyZXZlcnNlX2N5bWJhbFwiLFxuXG5cdFwiZ3VpdGFyX2ZyZXRfbm9pc2VcIixcblx0XCJicmVhdGhfbm9pc2VcIixcblx0XCJzZWFzaG9yZVwiLFxuXHRcImJpcmRfdHdlZXRcIixcblx0XCJ0ZWxlcGhvbmVfcmluZ1wiLFxuXHRcImhlbGljb3B0ZXJcIixcblx0XCJhcHBsYXVzZVwiLFxuXHRcImd1bnNob3RcIixcblxuXHRcInBlcmN1c3Npb25cIlxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnN0cnVtZW50SW5kZXhUb05hbWU7XG4iLCIvLyBDb252ZXJ0IHRoZSBpbnB1dCBzdHJ1Y3R1cmUgdG8gYSBtb3JlIHVzZWZ1bCBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBpdGVtIGhhcyBhIGxlbmd0aCBvZiBpdHMgb3duLlxuXG52YXIgaW5zdHJ1bWVudEluZGV4VG9OYW1lID0gcmVxdWlyZSgnLi9pbnN0cnVtZW50LWluZGV4LXRvLW5hbWUnKTtcblxudmFyIGNyZWF0ZU5vdGVNYXAgPSBmdW5jdGlvbihzZXF1ZW5jZSkge1xuXHR2YXIgbWFwID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2VxdWVuY2UudHJhY2tzLmxlbmd0aDsgaSsrKVxuXHRcdG1hcC5wdXNoKFtdKTtcblxuXHQvLyBUT0RPLVBFUjogaGFuZGxlIG1vcmUgdGhhbiBvbmUgbm90ZSBpbiBhIHRyYWNrXG5cdHZhciBuZXh0Tm90ZSA9IHt9O1xuXHR2YXIgY3VycmVudEluc3RydW1lbnQgPSBpbnN0cnVtZW50SW5kZXhUb05hbWVbMF07XG5cdHNlcXVlbmNlLnRyYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrLCBpKSB7XG5cdFx0dmFyIGN1cnJlbnRUaW1lID0gMDtcblx0XHR0cmFjay5mb3JFYWNoKGZ1bmN0aW9uKGV2KSB7XG5cdFx0XHRzd2l0Y2ggKGV2LmNtZCkge1xuXHRcdFx0XHRjYXNlIFwic3RhcnRcIjpcblx0XHRcdFx0XHRuZXh0Tm90ZVtldi5waXRjaF0gPSB7IHRpbWU6IGN1cnJlbnRUaW1lLCBpbnN0cnVtZW50OiBjdXJyZW50SW5zdHJ1bWVudCwgdm9sdW1lOiBldi52b2x1bWUgfTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdmVcIjpcblx0XHRcdFx0XHRjdXJyZW50VGltZSArPSBldi5kdXJhdGlvbjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInN0b3BcIjpcblx0XHRcdFx0XHRtYXBbaV0ucHVzaCh7cGl0Y2g6IGV2LnBpdGNoLCBpbnN0cnVtZW50OiBuZXh0Tm90ZVtldi5waXRjaF0uaW5zdHJ1bWVudCwgc3RhcnQ6IG5leHROb3RlW2V2LnBpdGNoXS50aW1lLCBlbmQ6IGN1cnJlbnRUaW1lLCB2b2x1bWU6IG5leHROb3RlW2V2LnBpdGNoXS52b2x1bWV9KTtcblx0XHRcdFx0XHRkZWxldGUgbmV4dE5vdGVbZXYucGl0Y2hdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicHJvZ3JhbVwiOlxuXHRcdFx0XHRcdGN1cnJlbnRJbnN0cnVtZW50ID0gaW5zdHJ1bWVudEluZGV4VG9OYW1lW2V2Lmluc3RydW1lbnRdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIFRPRE8tUEVSOiBoYW5kbGUgb3RoZXIgZXZlbnQgdHlwZXNcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlVuaGFuZGVkIG1pZGkgZXZlbnRcIiwgZXYpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0cmV0dXJuIG1hcDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTm90ZU1hcDtcbiIsIi8vIENhbGwgdGhpcyB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBhYmNqcyB0byBwcm9kdWNlIHNvdW5kLiBUaGlzIGlzIGFmdGVyIHRoZSBmaXJzdCB1c2VyIGdlc3R1cmUgb24gdGhlIHBhZ2UuXG4vLyBJZiB5b3UgY2FsbCBpdCB3aXRoIG5vIHBhcmFtZXRlcnMsIHRoZW4gYW4gQXVkaW9Db250ZXh0IGlzIGNyZWF0ZWQgYW5kIHN0b3JlZC5cbi8vIElmIHlvdSBjYWxsIGl0IHdpdGggYSBwYXJhbWV0ZXIsIHRoYXQgaXMgdXNlZCBhcyBhbiBhbHJlYWR5IGNyZWF0ZWQgQXVkaW9Db250ZXh0LlxuXG5mdW5jdGlvbiByZWdpc3RlckF1ZGlvQ29udGV4dChhYykge1xuXHRpZiAoIXdpbmRvdy5hYmNqc0F1ZGlvQ29udGV4dCkge1xuXHRcdGlmICghYWMpIHtcblx0XHRcdGFjID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fFxuXHRcdFx0XHR3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0IHx8XG5cdFx0XHRcdG5hdmlnYXRvci5tb3pBdWRpb0NvbnRleHQgfHxcblx0XHRcdFx0bmF2aWdhdG9yLm1zQXVkaW9Db250ZXh0O1xuXHRcdFx0YWMgPSBuZXcgYWMoKTtcblx0XHR9XG5cdFx0d2luZG93LmFiY2pzQXVkaW9Db250ZXh0ID0gYWM7XG5cdH1cblx0cmV0dXJuIHdpbmRvdy5hYmNqc0F1ZGlvQ29udGV4dC5zdGF0ZSAhPT0gXCJzdXNwZW5kZWRcIjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlckF1ZGlvQ29udGV4dDtcbiIsImZ1bmN0aW9uIGFjdGl2ZUF1ZGlvQ29udGV4dCgpIHtcblx0cmV0dXJuIHdpbmRvdy5hYmNqc0F1ZGlvQ29udGV4dDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhY3RpdmVBdWRpb0NvbnRleHQ7XG4iLCJ2YXIgYWN0aXZlQXVkaW9Db250ZXh0ID0gcmVxdWlyZSgnLi9hY3RpdmUtYXVkaW8tY29udGV4dCcpO1xuXG4vL1xuLy8gU3VwcG9ydCBmb3IgYXVkaW8gZGVwZW5kcyBvbiB0aHJlZSB0aGluZ3M6IHN1cHBvcnQgZm9yIFByb21pc2UsIHN1cHBvcnQgZm9yIEF1ZGlvQ29udGV4dCwgYW5kIHN1cHBvcnQgZm9yIEF1ZGlvQ29udGV4dC5yZXN1bWUuXG4vLyBVbmZvcnR1bmF0ZWx5LCBBdWRpb0NvbnRleHQucmVzdW1lIGNhbm5vdCBiZSBkZXRlY3RlZCB1bmxlc3MgYW4gQXVkaW9Db250ZXh0IGlzIGNyZWF0ZWQsIGFuZCBjcmVhdGluZyBhbiBBdWRpb0NvbnRleHQgY2FuJ3Rcbi8vIGJlIGRvbmUgdW50aWwgYSB1c2VyIGNsaWNrLCBzbyB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBmb3Igc3VyZSBpZiBhdWRpbyBpcyBzdXBwb3J0ZWQgdW50aWwgdGhlIHVzZXIgdHJpZXMuXG4vLyBXZSBjYW4gZ2V0IGNsb3NlLCB0aG91Z2ggLSB3ZSBjYW4gdGVzdCBmb3IgUHJvbWlzZXMgYW5kIEF1ZGlvQ29udGV4dCAtIHRoZXJlIGFyZSBqdXN0IGEgZmV3IGV2ZXJncmVlbiBicm93c2VycyB0aGF0IHN1cHBvcnRlZFxuLy8gdGhhdCBiZWZvcmUgc3VwcG9ydGluZyByZXN1bWUsIHNvIHdlJ2xsIHRlc3Qgd2hhdCB3ZSBjYW4uXG5cbi8vIFRoZSBiZXN0IHVzZSBvZiB0aGlzIHJvdXRpbmUgaXMgdG8gY2FsbCBpdCBiZWZvcmUgZG9pbmcgYW55IGF1ZGlvIHJlbGF0ZWQgc3R1ZmYgdG8gZGVjaWRlIHdoZXRoZXIgdG8gYm90aGVyLlxuLy8gQnV0IHRoZW4sIGNhbGwgaXQgYWdhaW4gYWZ0ZXIgYSB1c2VyIGludGVyYWN0aW9uIHRvIHRlc3QgZm9yIHJlc3VtZS5cblxuZnVuY3Rpb24gc3VwcG9ydHNBdWRpbygpIHtcblx0dmFyIGFhYyA9IGFjdGl2ZUF1ZGlvQ29udGV4dCgpO1xuXHRpZiAoYWFjKVxuXHRcdHJldHVybiBhYWMucmVzdW1lICE9PSB1bmRlZmluZWQ7XG5cblx0aWYgKCF3aW5kb3cuUHJvbWlzZSlcblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIHdpbmRvdy5BdWRpb0NvbnRleHQgfHxcblx0XHR3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0IHx8XG5cdFx0bmF2aWdhdG9yLm1vekF1ZGlvQ29udGV4dCB8fFxuXHRcdG5hdmlnYXRvci5tc0F1ZGlvQ29udGV4dDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c0F1ZGlvO1xuIiwidmFyIHBpdGNoVG9Ob3RlTmFtZSA9IHtcblx0MjE6ICdBMCcsXG5cdDIyOiAnQmIwJyxcblx0MjM6ICdCMCcsXG5cdDI0OiAnQzEnLFxuXHQyNTogJ0RiMScsXG5cdDI2OiAnRDEnLFxuXHQyNzogJ0ViMScsXG5cdDI4OiAnRTEnLFxuXHQyOTogJ0YxJyxcblx0MzA6ICdHYjEnLFxuXHQzMTogJ0cxJyxcblx0MzI6ICdBYjEnLFxuXHQzMzogJ0ExJyxcblx0MzQ6ICdCYjEnLFxuXHQzNTogJ0IxJyxcblx0MzY6ICdDMicsXG5cdDM3OiAnRGIyJyxcblx0Mzg6ICdEMicsXG5cdDM5OiAnRWIyJyxcblx0NDA6ICdFMicsXG5cdDQxOiAnRjInLFxuXHQ0MjogJ0diMicsXG5cdDQzOiAnRzInLFxuXHQ0NDogJ0FiMicsXG5cdDQ1OiAnQTInLFxuXHQ0NjogJ0JiMicsXG5cdDQ3OiAnQjInLFxuXHQ0ODogJ0MzJyxcblx0NDk6ICdEYjMnLFxuXHQ1MDogJ0QzJyxcblx0NTE6ICdFYjMnLFxuXHQ1MjogJ0UzJyxcblx0NTM6ICdGMycsXG5cdDU0OiAnR2IzJyxcblx0NTU6ICdHMycsXG5cdDU2OiAnQWIzJyxcblx0NTc6ICdBMycsXG5cdDU4OiAnQmIzJyxcblx0NTk6ICdCMycsXG5cdDYwOiAnQzQnLFxuXHQ2MTogJ0RiNCcsXG5cdDYyOiAnRDQnLFxuXHQ2MzogJ0ViNCcsXG5cdDY0OiAnRTQnLFxuXHQ2NTogJ0Y0Jyxcblx0NjY6ICdHYjQnLFxuXHQ2NzogJ0c0Jyxcblx0Njg6ICdBYjQnLFxuXHQ2OTogJ0E0Jyxcblx0NzA6ICdCYjQnLFxuXHQ3MTogJ0I0Jyxcblx0NzI6ICdDNScsXG5cdDczOiAnRGI1Jyxcblx0NzQ6ICdENScsXG5cdDc1OiAnRWI1Jyxcblx0NzY6ICdFNScsXG5cdDc3OiAnRjUnLFxuXHQ3ODogJ0diNScsXG5cdDc5OiAnRzUnLFxuXHQ4MDogJ0FiNScsXG5cdDgxOiAnQTUnLFxuXHQ4MjogJ0JiNScsXG5cdDgzOiAnQjUnLFxuXHQ4NDogJ0M2Jyxcblx0ODU6ICdEYjYnLFxuXHQ4NjogJ0Q2Jyxcblx0ODc6ICdFYjYnLFxuXHQ4ODogJ0U2Jyxcblx0ODk6ICdGNicsXG5cdDkwOiAnR2I2Jyxcblx0OTE6ICdHNicsXG5cdDkyOiAnQWI2Jyxcblx0OTM6ICdBNicsXG5cdDk0OiAnQmI2Jyxcblx0OTU6ICdCNicsXG5cdDk2OiAnQzcnLFxuXHQ5NzogJ0RiNycsXG5cdDk4OiAnRDcnLFxuXHQ5OTogJ0ViNycsXG5cdDEwMDogJ0U3Jyxcblx0MTAxOiAnRjcnLFxuXHQxMDI6ICdHYjcnLFxuXHQxMDM6ICdHNycsXG5cdDEwNDogJ0FiNycsXG5cdDEwNTogJ0E3Jyxcblx0MTA2OiAnQmI3Jyxcblx0MTA3OiAnQjcnLFxuXHQxMDg6ICdDOCcsXG5cdDEwOTogJ0RiOCcsXG5cdDExMDogJ0Q4Jyxcblx0MTExOiAnRWI4Jyxcblx0MTEyOiAnRTgnLFxuXHQxMTM6ICdGOCcsXG5cdDExNDogJ0diOCcsXG5cdDExNTogJ0c4Jyxcblx0MTE2OiAnQWI4Jyxcblx0MTE3OiAnQTgnLFxuXHQxMTg6ICdCYjgnLFxuXHQxMTk6ICdCOCcsXG5cdDEyMDogJ0M5Jyxcblx0MTIxOiAnRGI5J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwaXRjaFRvTm90ZU5hbWU7XG4iLCJ2YXIgZG93bmxvYWRCdWZmZXIgPSBmdW5jdGlvbihidWZmZXIpIHtcblx0cmV0dXJuIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJ1ZmZlclRvV2F2ZShidWZmZXIuYXVkaW9CdWZmZXJzKSk7XG59O1xuXG4vLyBDb252ZXJ0IGFuIEF1ZGlvQnVmZmVyIHRvIGEgQmxvYiB1c2luZyBXQVZFIHJlcHJlc2VudGF0aW9uXG5mdW5jdGlvbiBidWZmZXJUb1dhdmUoYXVkaW9CdWZmZXJzKSB7XG5cdHZhciBudW1PZkNoYW4gPSBhdWRpb0J1ZmZlcnMubGVuZ3RoO1xuXHR2YXIgbGVuZ3RoID0gYXVkaW9CdWZmZXJzWzBdLmxlbmd0aCAqIG51bU9mQ2hhbiAqIDIgKyA0NDtcblx0dmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuXHR2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuXHR2YXIgY2hhbm5lbHMgPSBbXTtcblx0dmFyIGk7XG5cdHZhciBzYW1wbGU7XG5cdHZhciBvZmZzZXQgPSAwO1xuXHR2YXIgcG9zID0gMDtcblxuXHQvLyB3cml0ZSBXQVZFIGhlYWRlclxuXHRzZXRVaW50MzIoMHg0NjQ2NDk1Mik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwiUklGRlwiXG5cdHNldFVpbnQzMihsZW5ndGggLSA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBsZW5ndGggLSA4XG5cdHNldFVpbnQzMigweDQ1NTY0MTU3KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJXQVZFXCJcblxuXHRzZXRVaW50MzIoMHgyMDc0NmQ2Nik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwiZm10IFwiIGNodW5rXG5cdHNldFVpbnQzMigxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoID0gMTZcblx0c2V0VWludDE2KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQQ00gKHVuY29tcHJlc3NlZClcblx0c2V0VWludDE2KG51bU9mQ2hhbik7XG5cdHNldFVpbnQzMihhdWRpb0J1ZmZlcnNbMF0uc2FtcGxlUmF0ZSk7XG5cdHNldFVpbnQzMihhdWRpb0J1ZmZlcnNbMF0uc2FtcGxlUmF0ZSAqIDIgKiBudW1PZkNoYW4pOyAvLyBhdmcuIGJ5dGVzL3NlY1xuXHRzZXRVaW50MTYobnVtT2ZDaGFuICogMik7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrLWFsaWduXG5cdHNldFVpbnQxNigxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTYtYml0IChoYXJkY29kZWQgaW4gdGhpcyBkZW1vKVxuXG5cdHNldFVpbnQzMigweDYxNzQ2MTY0KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJkYXRhXCIgLSBjaHVua1xuXHRzZXRVaW50MzIobGVuZ3RoIC0gcG9zIC0gNCk7ICAgICAgICAgICAgICAgICAgIC8vIGNodW5rIGxlbmd0aFxuXG5cdC8vIHdyaXRlIGludGVybGVhdmVkIGRhdGFcblx0Zm9yKGkgPSAwOyBpIDwgYXVkaW9CdWZmZXJzLmxlbmd0aDsgaSsrKVxuXHRcdGNoYW5uZWxzLnB1c2goYXVkaW9CdWZmZXJzW2ldLmdldENoYW5uZWxEYXRhKDApKTtcblxuXHR3aGlsZShwb3MgPCBsZW5ndGgpIHtcblx0XHRmb3IoaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeyAgICAgICAgICAgICAvLyBpbnRlcmxlYXZlIGNoYW5uZWxzXG5cdFx0XHRzYW1wbGUgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgY2hhbm5lbHNbaV1bb2Zmc2V0XSkpOyAvLyBjbGFtcFxuXHRcdFx0c2FtcGxlID0gKDAuNSArIHNhbXBsZSA8IDAgPyBzYW1wbGUgKiAzMjc2OCA6IHNhbXBsZSAqIDMyNzY3KXwwOyAvLyBzY2FsZSB0byAxNi1iaXQgc2lnbmVkIGludFxuXHRcdFx0dmlldy5zZXRJbnQxNihwb3MsIHNhbXBsZSwgdHJ1ZSk7ICAgICAgICAgIC8vIHdyaXRlIDE2LWJpdCBzYW1wbGVcblx0XHRcdHBvcyArPSAyO1xuXHRcdH1cblx0XHRvZmZzZXQrKzsgLy8gbmV4dCBzb3VyY2Ugc2FtcGxlXG5cdH1cblxuXHQvLyBjcmVhdGUgQmxvYlxuXHRyZXR1cm4gbmV3IEJsb2IoW2J1ZmZlcl0sIHt0eXBlOiBcImF1ZGlvL3dhdlwifSk7XG5cblx0ZnVuY3Rpb24gc2V0VWludDE2KGRhdGEpIHtcblx0XHR2aWV3LnNldFVpbnQxNihwb3MsIGRhdGEsIHRydWUpO1xuXHRcdHBvcyArPSAyO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VWludDMyKGRhdGEpIHtcblx0XHR2aWV3LnNldFVpbnQzMihwb3MsIGRhdGEsIHRydWUpO1xuXHRcdHBvcyArPSA0O1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZG93bmxvYWRCdWZmZXI7XG4iLCIvLyAgICBhYmNfbWlkaV9zZXF1ZW5jZXIuanM6IFR1cm4gcGFyc2VkIGFiYyBpbnRvIGEgbGluZWFyIHNlcmllcyBvZiBldmVudHMuXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pIGFuZCBQYXVsIFJvc2VuXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBzZXF1ZW5jZTtcblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgbWVhc3VyZUxlbmd0aDtcblx0Ly8gVGhlIGFiYyBpcyBwcm92aWRlZCB0byB1cyBsaW5lIGJ5IGxpbmUuIEl0IG1pZ2h0IGhhdmUgcmVwZWF0cyBpbiBpdC4gV2Ugd2FudCB0byByZSBhcnJhbmdlIHRoZSBlbGVtZW50cyB0b1xuXHQvLyBiZSBhbiBhcnJheSBvZiB2b2ljZXMgd2l0aCBhbGwgdGhlIHJlcGVhdHMgZW1iZWRkZWQsIGFuZCBubyBsaW5lcy4gVGhlbiBpdCBpcyB0cml2aWFsIHRvIGdvIHRocm91Z2ggdGhlIGV2ZW50c1xuXHQvLyBvbmUgYXQgYSB0aW1lIGFuZCB0dXJuIGl0IGludG8gbWlkaS5cblxuXHR2YXIgUEVSQ1VTU0lPTl9QUk9HUkFNID0gMTI4O1xuXG5cdHNlcXVlbmNlID0gZnVuY3Rpb24oYWJjdHVuZSwgb3B0aW9ucykge1xuXHRcdC8vIEdsb2JhbCBvcHRpb25zXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0dmFyIHFwbSA9IHVuZGVmaW5lZDtcblx0XHR2YXIgcHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbSB8fCAwO1x0Ly8gVGhlIHByb2dyYW0gaWYgdGhlcmUgaXNuJ3QgYSBwcm9ncmFtIHNwZWNpZmllZC5cblx0XHR2YXIgdHJhbnNwb3NlID0gb3B0aW9ucy5taWRpVHJhbnNwb3NlIHx8IDA7XG5cdFx0dmFyIGNoYW5uZWwgPSBvcHRpb25zLmNoYW5uZWwgfHwgMDtcblx0XHR2YXIgZHJ1bVBhdHRlcm4gPSBvcHRpb25zLmRydW0gfHwgXCJcIjtcblx0XHR2YXIgZHJ1bUJhcnMgPSBvcHRpb25zLmRydW1CYXJzIHx8IDE7XG5cdFx0dmFyIGRydW1JbnRybyA9IG9wdGlvbnMuZHJ1bUludHJvIHx8IDA7XG5cdFx0dmFyIGRydW1PbiA9IGRydW1QYXR0ZXJuICE9PSBcIlwiO1xuXG5cdFx0Ly8gQWxsIG9mIHRoZSBhYm92ZSBvdmVycmlkZXMgbmVlZCB0byBiZSBpbnRlZ2Vyc1xuXHRcdHByb2dyYW0gPSBwYXJzZUludChwcm9ncmFtLCAxMCk7XG5cdFx0dHJhbnNwb3NlID0gcGFyc2VJbnQodHJhbnNwb3NlLCAxMCk7XG5cdFx0Y2hhbm5lbCA9IHBhcnNlSW50KGNoYW5uZWwsIDEwKTtcblx0XHRpZiAoY2hhbm5lbCA9PT0gMTApXG5cdFx0XHRwcm9ncmFtID0gUEVSQ1VTU0lPTl9QUk9HUkFNO1xuXHRcdGRydW1QYXR0ZXJuID0gZHJ1bVBhdHRlcm4uc3BsaXQoXCIgXCIpO1xuXHRcdGRydW1CYXJzID0gcGFyc2VJbnQoZHJ1bUJhcnMsIDEwKTtcblx0XHRkcnVtSW50cm8gPSBwYXJzZUludChkcnVtSW50cm8sIDEwKTtcblxuXHRcdHZhciBiYWdwaXBlcyA9IGFiY3R1bmUuZm9ybWF0dGluZy5iYWdwaXBlczsgLy8gSWYgaXQgaXMgYmFncGlwZXMsIHRoZW4gdGhlIGdyYWNlbm90ZXMgYXJlIHBsYXllZCBvbiB0b3Agb2YgdGhlIG1haW4gbm90ZS5cblx0XHRpZiAoYmFncGlwZXMpXG5cdFx0XHRwcm9ncmFtID0gNzE7XG5cblx0XHQvLyAlJU1JREkgZmVybWF0YWZpeGVkXG5cdFx0Ly8gJSVNSURJIGZlcm1hdGFwcm9wb3J0aW9uYWxcblx0XHQvLyAlJU1JREkgZGVsdGFsb3VkbmVzcyBuXG5cdFx0Ly8gJSVNSURJIGdyYWNlZGl2aWRlciBiXG5cdFx0Ly8gJSVNSURJIHJhdGlvIG4gbVxuXHRcdC8vICUlTUlESSBiZWF0IGEgYiBjIG5cblx0XHQvLyAlJU1JREkgZ3JhY2UgYS9iXG5cdFx0Ly8gJSVNSURJIHRyaW0geC95XG5cblx0XHQvLyAlTUlESSBnY2hvcmRvblxuXHRcdC8vICVNSURJIGdjaG9yZG9mZlxuXHRcdC8vICUlTUlESSBiYXNzcHJvZyA0NVxuXHRcdC8vICUlTUlESSBjaG9yZHByb2cgMjRcblx0XHQvLyAlJU1JREkgY2hvcmRuYW1lIG5hbWUgbjEgbjIgbjMgbjQgbjUgbjZcblxuXHRcdC8vJSVNSURJIGJlYXQg4p+oaW50MeKfqSDin6hpbnQy4p+pIOKfqGludDPin6kg4p+oaW50NOKfqTogY29udHJvbHMgdGhlIHZvbHVtZXMgb2YgdGhlIG5vdGVzIGluIGEgbWVhc3VyZS4gVGhlIGZpcnN0IG5vdGUgaW4gYSBiYXIgaGFzIHZvbHVtZSDin6hpbnQx4p+pOyBvdGhlciDigJhzdHJvbmfigJkgbm90ZXMgaGF2ZSB2b2x1bWUg4p+oaW50MuKfqSBhbmQgYWxsIHRoZSByZXN0IGhhdmUgdm9sdW1lIOKfqGludDPin6kuIFRoZXNlIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAw4oCTMTI3LiBUaGUgcGFyYW1ldGVyIOKfqGludDTin6kgZGV0ZXJtaW5lcyB3aGljaCBub3RlcyBhcmUg4oCYc3Ryb25n4oCZLiBJZiB0aGUgdGltZSBzaWduYXR1cmUgaXMgeC95LCB0aGVuIGVhY2ggbm90ZSBpcyBnaXZlbiBhIHBvc2l0aW9uIG51bWJlciBrID0gMCwgMSwgMi4gLiAuIHgtMSB3aXRoaW4gZWFjaCBiYXIuIElmIGsgaXMgYSBtdWx0aXBsZSBvZiDin6hpbnQ04p+pLCB0aGVuIHRoZSBub3RlIGlzIOKAmHN0cm9uZ+KAmS5cblxuXHRcdHZhciBzdGFydGluZ01pZGkgPSBbXTtcblx0XHRpZiAoYWJjdHVuZS5mb3JtYXR0aW5nLm1pZGkpIHtcblx0XHRcdC8vY29uc29sZS5sb2coXCJNSURJIEZvcm1hdHRpbmc6XCIsIGFiY3R1bmUuZm9ybWF0dGluZy5taWRpKTtcblx0XHRcdHZhciBnbG9iYWxzID0gYWJjdHVuZS5mb3JtYXR0aW5nLm1pZGk7XG5cdFx0XHRpZiAoZ2xvYmFscy5wcm9ncmFtICYmIGdsb2JhbHMucHJvZ3JhbS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHByb2dyYW0gPSBnbG9iYWxzLnByb2dyYW1bMF07XG5cdFx0XHRcdGlmIChnbG9iYWxzLnByb2dyYW0ubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdHByb2dyYW0gPSBnbG9iYWxzLnByb2dyYW1bMV07XG5cdFx0XHRcdFx0Y2hhbm5lbCA9IGdsb2JhbHMucHJvZ3JhbVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGdsb2JhbHMudHJhbnNwb3NlKVxuXHRcdFx0XHR0cmFuc3Bvc2UgPSBnbG9iYWxzLnRyYW5zcG9zZVswXTtcblx0XHRcdGlmIChnbG9iYWxzLmNoYW5uZWwpXG5cdFx0XHRcdGNoYW5uZWwgPSBnbG9iYWxzLmNoYW5uZWxbMF07XG5cdFx0XHRpZiAoZ2xvYmFscy5kcnVtKVxuXHRcdFx0XHRkcnVtUGF0dGVybiA9IGdsb2JhbHMuZHJ1bTtcblx0XHRcdGlmIChnbG9iYWxzLmRydW1iYXJzKVxuXHRcdFx0XHRkcnVtQmFycyA9IGdsb2JhbHMuZHJ1bWJhcnNbMF07XG5cdFx0XHRpZiAoZ2xvYmFscy5kcnVtb24pXG5cdFx0XHRcdGRydW1PbiA9IHRydWU7XG5cdFx0XHRpZiAoY2hhbm5lbCA9PT0gMTApXG5cdFx0XHRcdHByb2dyYW0gPSBQRVJDVVNTSU9OX1BST0dSQU07XG5cdFx0XHRpZiAoZ2xvYmFscy5iZWF0KVxuXHRcdFx0XHRzdGFydGluZ01pZGkucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IGdsb2JhbHMuYmVhdCB9KVxuXHRcdFx0aWYgKGdsb2JhbHMubm9iZWF0YWNjZW50cylcblx0XHRcdFx0c3RhcnRpbmdNaWRpLnB1c2goeyBlbF90eXBlOiAnYmVhdGFjY2VudHMnLCB2YWx1ZTogZmFsc2UgfSk7XG5cblx0XHR9XG5cblx0XHQvLyBTcGVjaWZpZWQgb3B0aW9ucyBpbiBhYmMgc3RyaW5nLlxuXG5cdFx0Ly8gSWYgdGhlIHRlbXBvIHdhcyBwYXNzZWQgaW4sIHVzZSB0aGF0LlxuXHRcdC8vIElmIHRoZSB0ZW1wbyBpcyBzcGVjaWZpZWQsIHVzZSB0aGF0LlxuXHRcdC8vIElmIHRoZXJlIGlzIGEgZGVmYXVsdCwgdXNlIHRoYXQuXG5cdFx0Ly8gT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQuXG5cdFx0aWYgKG9wdGlvbnMucXBtKVxuXHRcdFx0cXBtID0gcGFyc2VJbnQob3B0aW9ucy5xcG0sIDEwKTtcblx0XHRlbHNlIGlmIChhYmN0dW5lLm1ldGFUZXh0LnRlbXBvKVxuXHRcdFx0cXBtID0gaW50ZXJwcmV0VGVtcG8oYWJjdHVuZS5tZXRhVGV4dC50ZW1wbyk7XG5cdFx0ZWxzZSBpZiAob3B0aW9ucy5kZWZhdWx0UXBtKVxuXHRcdFx0cXBtID0gb3B0aW9ucy5kZWZhdWx0UXBtO1xuXHRcdGVsc2Vcblx0XHRcdHFwbSA9IDE4MDsgXHQvLyBUaGUgdGVtcG8gaWYgdGhlcmUgaXNuJ3QgYSB0ZW1wbyBzcGVjaWZpZWQuXG5cblx0XHR2YXIgc3RhcnRWb2ljZSA9IFtdO1xuXHRcdGlmIChiYWdwaXBlcylcblx0XHRcdHN0YXJ0Vm9pY2UucHVzaCh7IGVsX3R5cGU6ICdiYWdwaXBlcycgfSk7XG5cdFx0c3RhcnRWb2ljZS5wdXNoKHsgZWxfdHlwZTogJ2luc3RydW1lbnQnLCBwcm9ncmFtOiBwcm9ncmFtIH0pO1xuXHRcdGlmIChjaGFubmVsKVxuXHRcdFx0c3RhcnRWb2ljZS5wdXNoKHsgZWxfdHlwZTogJ2NoYW5uZWwnLCBjaGFubmVsOiBjaGFubmVsIH0pO1xuXHRcdGlmICh0cmFuc3Bvc2UpXG5cdFx0XHRzdGFydFZvaWNlLnB1c2goeyBlbF90eXBlOiAndHJhbnNwb3NlJywgdHJhbnNwb3NlOiB0cmFuc3Bvc2UgfSk7XG5cdFx0c3RhcnRWb2ljZS5wdXNoKHsgZWxfdHlwZTogJ3RlbXBvJywgcXBtOiBxcG0gfSk7XG5cdFx0Zm9yICh2YXIgc3MgPSAwOyBzcyA8IHN0YXJ0aW5nTWlkaS5sZW5ndGg7c3MrKylcblx0XHRcdHN0YXJ0Vm9pY2UucHVzaChzdGFydGluZ01pZGlbc3NdKTtcblxuXHRcdC8vIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgaXM6XG5cdFx0Ly8gYWJjdHVuZVxuXHRcdC8vXHRcdGFycmF5IGxpbmVzXG5cdFx0Ly9cdFx0XHRhcnJheSBzdGFmZlxuXHRcdC8vXHRcdFx0XHRvYmplY3Qga2V5XG5cdFx0Ly9cdFx0XHRcdG9iamVjdCBtZXRlclxuXHRcdC8vXHRcdFx0XHRhcnJheSB2b2ljZXNcblx0XHQvL1x0XHRcdFx0XHRhcnJheSBhYmNlbGVtXG5cblx0XHQvLyB2aXNpdCBlYWNoIHZvaWNlIGNvbXBsZXRlbHkgaW4gdHVyblxuXHRcdHZhciB2b2ljZXMgPSBbXTtcblx0XHR2YXIgc3RhcnRSZXBlYXRQbGFjZWhvbGRlciA9IFtdOyAvLyBUaGVyZSBpcyBhIHBsYWNlIGhvbGRlciBmb3IgZWFjaCB2b2ljZS5cblx0XHR2YXIgc2tpcEVuZGluZ1BsYWNlaG9sZGVyID0gW107IC8vIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRoZSBmaXJzdCBlbmRpbmcgc3RhcnRzLlxuXHRcdHZhciBzdGFydGluZ0RydW1TZXQgPSBmYWxzZTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFiY3R1bmUubGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdC8vIEZvciBlYWNoIGdyb3VwIG9mIHN0YWZmIGxpbmVzIGluIHRoZSB0dW5lLlxuXHRcdFx0dmFyIGxpbmUgPSBhYmN0dW5lLmxpbmVzW2ldO1xuXHRcdFx0aWYgKGxpbmUuc3RhZmYpIHtcblx0XHRcdFx0dmFyIHN0YXZlcyA9IGxpbmUuc3RhZmY7XG5cdFx0XHRcdHZhciB2b2ljZU51bWJlciA9IDA7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgc3RhdmVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0dmFyIHN0YWZmID0gc3RhdmVzW2pdO1xuXHRcdFx0XHRcdC8vIEZvciBlYWNoIHN0YWZmIGxpbmVcblx0XHRcdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IHN0YWZmLnZvaWNlcy5sZW5ndGg7IGsrKykge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIGVhY2ggdm9pY2UgaW4gYSBzdGFmZiBsaW5lXG5cdFx0XHRcdFx0XHR2YXIgdm9pY2UgPSBzdGFmZi52b2ljZXNba107XG5cdFx0XHRcdFx0XHRpZiAoIXZvaWNlc1t2b2ljZU51bWJlcl0pIHtcblx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXSA9IFtdLmNvbmNhdChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YXJ0Vm9pY2UpKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoc3RhZmYuY2xlZiAmJiBzdGFmZi5jbGVmLnR5cGUgPT09ICdwZXJjJykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKHZhciBjbCA9IDA7IGNsIDwgdm9pY2VzW3ZvaWNlTnVtYmVyXS5sZW5ndGg7IGNsKyspIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodm9pY2VzW3ZvaWNlTnVtYmVyXVtjbF0uZWxfdHlwZSA9PT0gJ2luc3RydW1lbnQnKVxuXHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXVtjbF0ucHJvZ3JhbSA9IFBFUkNVU1NJT05fUFJPR1JBTTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzdGFmZi5rZXkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHN0YWZmLmtleS5yb290ID09PSAnSFAnKVxuXHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7ZWxfdHlwZTogJ2tleScsIGFjY2lkZW50YWxzOiBbe2FjYzogJ25hdHVyYWwnLCBub3RlOiAnZyd9LCB7YWNjOiAnc2hhcnAnLCBub3RlOiAnZid9LCB7YWNjOiAnc2hhcnAnLCBub3RlOiAnYyd9XX0pO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHtlbF90eXBlOiAna2V5JywgYWNjaWRlbnRhbHM6IHN0YWZmLmtleS5hY2NpZGVudGFscyB9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzdGFmZi5tZXRlcikge1xuXHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goaW50ZXJwcmV0TWV0ZXIoc3RhZmYubWV0ZXIpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghc3RhcnRpbmdEcnVtU2V0ICYmIGRydW1PbikgeyAvLyBkcnVtIGluZm9ybWF0aW9uIGlzIG9ubHkgbmVlZGVkIG9uY2UsIHNvIHVzZSB0aGUgZmlyc3QgbGluZSBhbmQgdHJhY2sgMC5cblx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHtlbF90eXBlOiAnZHJ1bScsIHBhcmFtczoge3BhdHRlcm46IGRydW1QYXR0ZXJuLCBiYXJzOiBkcnVtQmFycywgb246IGRydW1PbiwgaW50cm86IGRydW1JbnRyb319KTtcblx0XHRcdFx0XHRcdFx0c3RhcnRpbmdEcnVtU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzdGFmZi5jbGVmICYmIHN0YWZmLmNsZWYudHJhbnNwb3NlKSB7XG5cdFx0XHRcdFx0XHRcdHN0YWZmLmNsZWYuZWxfdHlwZSA9ICdjbGVmJztcblx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ3RyYW5zcG9zZScsIHRyYW5zcG9zZTogc3RhZmYuY2xlZi50cmFuc3Bvc2UgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYWJjdHVuZS5mb3JtYXR0aW5nLm1pZGkgJiYgYWJjdHVuZS5mb3JtYXR0aW5nLm1pZGkuZHJ1bW9mZikge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIGRydW0gb2ZmIGNvbW1hbmQgcmlnaHQgYXQgdGhlIGJlZ2lubmluZyBpdCBpcyBwdXQgaW4gdGhlIG1ldGFUZXh0IGluc3RlYWQgb2YgdGhlIHN0cmVhbSxcblx0XHRcdFx0XHRcdFx0Ly8gc28gd2Ugd2lsbCBqdXN0IGluc2VydCBpdCBoZXJlLlxuXHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAnYmFyJyB9KTtcblx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHtlbF90eXBlOiAnZHJ1bScsIHBhcmFtczoge3BhdHRlcm46IFwiXCIsIG9uOiBmYWxzZSB9fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR2YXIgbm90ZUV2ZW50c0luQmFyID0gMDtcblx0XHRcdFx0XHRcdGZvciAodmFyIHYgPSAwOyB2IDwgdm9pY2UubGVuZ3RoOyB2KyspIHtcblx0XHRcdFx0XHRcdFx0Ly8gRm9yIGVhY2ggZWxlbWVudCBpbiBhIHZvaWNlXG5cdFx0XHRcdFx0XHRcdHZhciBlbGVtID0gdm9pY2Vbdl07XG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoZWxlbS5lbF90eXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5vdGVcIjpcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlZ3VsYXIgaXRlbXMgYXJlIGp1c3QgcHVzaGVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFlbGVtLnJlc3QgfHwgZWxlbS5yZXN0LnR5cGUgIT09ICdzcGFjZXInKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtLmRlY29yYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlbS5kZWNvcmF0aW9uLmluZGV4T2YoJ3BwcCcpID49IDApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAnYmVhdCcsIGJlYXRzOiBbMzAsIDIwLCAxMCwgMV0gfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoZWxlbS5kZWNvcmF0aW9uLmluZGV4T2YoJ3BwJykgPj0gMClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IFs0NSwgMzUsIDIwLCAxXSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChlbGVtLmRlY29yYXRpb24uaW5kZXhPZigncCcpID49IDApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAnYmVhdCcsIGJlYXRzOiBbNjAsIDUwLCAzNSwgMV0gfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoZWxlbS5kZWNvcmF0aW9uLmluZGV4T2YoJ21wJykgPj0gMClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IFs3NSwgNjUsIDUwLCAxXSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChlbGVtLmRlY29yYXRpb24uaW5kZXhPZignbWYnKSA+PSAwKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ2JlYXQnLCBiZWF0czogWzkwLCA4MCwgNjUsIDFdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGVsZW0uZGVjb3JhdGlvbi5pbmRleE9mKCdmJykgPj0gMClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IFsxMDUsIDk1LCA4MCwgMV0gfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoZWxlbS5kZWNvcmF0aW9uLmluZGV4T2YoJ2ZmJykgPj0gMClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IFsxMjAsIDExMCwgOTUsIDFdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGVsZW0uZGVjb3JhdGlvbi5pbmRleE9mKCdmZmYnKSA+PSAwKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ2JlYXQnLCBiZWF0czogWzEyNywgMTI1LCAxMTAsIDFdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaChlbGVtKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm90ZUV2ZW50c0luQmFyKys7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwia2V5XCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlbS5yb290ID09PSAnSFAnKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goe2VsX3R5cGU6ICdrZXknLCBhY2NpZGVudGFsczogW3thY2M6ICduYXR1cmFsJywgbm90ZTogJ2cnfSwge2FjYzogJ3NoYXJwJywgbm90ZTogJ2YnfSwge2FjYzogJ3NoYXJwJywgbm90ZTogJ2MnfV19KTtcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHtlbF90eXBlOiAna2V5JywgYWNjaWRlbnRhbHM6IGVsZW0uYWNjaWRlbnRhbHMgfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwibWV0ZXJcIjpcblx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaChpbnRlcnByZXRNZXRlcihlbGVtKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiY2xlZlwiOiAvLyBuZWVkIHRvIGtlZXAgdGhpcyB0byBjYXRjaCB0aGUgXCJ0cmFuc3Bvc2VcIiBlbGVtZW50LlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW0udHJhbnNwb3NlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAndHJhbnNwb3NlJywgdHJhbnNwb3NlOiBlbGVtLnRyYW5zcG9zZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ0ZW1wb1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0cXBtID0gaW50ZXJwcmV0VGVtcG8oZWxlbSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAndGVtcG8nLCBxcG06IHFwbSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJiYXJcIjpcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChub3RlRXZlbnRzSW5CYXIgPiAwKSAvLyBkb24ndCBhZGQgdHdvIGJhcnMgaW4gYSByb3cuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiYXInIH0pOyAvLyBXZSBuZWVkIHRoZSBiYXIgbWFya2luZyB0byByZXNldCB0aGUgYWNjaWRlbnRhbHMuXG5cdFx0XHRcdFx0XHRcdFx0XHRub3RlRXZlbnRzSW5CYXIgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZmlndXJlIG91dCByZXBlYXRzIGFuZCBlbmRpbmdzIC0tXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgaW1wb3J0YW50IHBhcnQgaXMgd2hlcmUgdGhlcmUgaXMgYSBzdGFydCByZXBlYXQsIGFuZCBlbmQgcmVwZWF0LCBvciBhIGZpcnN0IGVuZGluZy5cblx0XHRcdFx0XHRcdFx0XHRcdHZhciBlbmRSZXBlYXQgPSAoZWxlbS50eXBlID09PSBcImJhcl9yaWdodF9yZXBlYXRcIiB8fCBlbGVtLnR5cGUgPT09IFwiYmFyX2RibF9yZXBlYXRcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgc3RhcnRFbmRpbmcgPSAoZWxlbS5zdGFydEVuZGluZyA9PT0gJzEnKTtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBzdGFydFJlcGVhdCA9IChlbGVtLnR5cGUgPT09IFwiYmFyX2xlZnRfcmVwZWF0XCIgfHwgZWxlbS50eXBlID09PSBcImJhcl9kYmxfcmVwZWF0XCIgfHwgZWxlbS50eXBlID09PSBcImJhcl9yaWdodF9yZXBlYXRcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZW5kUmVwZWF0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBzID0gc3RhcnRSZXBlYXRQbGFjZWhvbGRlclt2b2ljZU51bWJlcl07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghcykgcyA9IDA7IC8vIElmIHRoZXJlIHdhc24ndCBhIGxlZnQgcmVwZWF0LCB0aGVuIHdlIHJlcGVhdCBmcm9tIHRoZSBiZWdpbm5pbmcuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBlID0gc2tpcEVuZGluZ1BsYWNlaG9sZGVyW3ZvaWNlTnVtYmVyXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFlKSBlID0gdm9pY2VzW3ZvaWNlTnVtYmVyXS5sZW5ndGg7IC8vIElmIHRoZXJlIHdhc24ndCBhIGZpcnN0IGVuZGluZyBtYXJrZXIsIHRoZW4gd2UgY29weSBldmVyeXRoaW5nLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdID0gdm9pY2VzW3ZvaWNlTnVtYmVyXS5jb25jYXQodm9pY2VzW3ZvaWNlTnVtYmVyXS5zbGljZShzLCBlKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlc2V0IHRoZXNlIGluIGNhc2UgdGhlcmUgaXMgYSBzZWNvbmQgcmVwZWF0IGxhdGVyIG9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRza2lwRW5kaW5nUGxhY2Vob2xkZXJbdm9pY2VOdW1iZXJdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFJlcGVhdFBsYWNlaG9sZGVyW3ZvaWNlTnVtYmVyXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChzdGFydEVuZGluZylcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcEVuZGluZ1BsYWNlaG9sZGVyW3ZvaWNlTnVtYmVyXSA9IHZvaWNlc1t2b2ljZU51bWJlcl0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXJ0UmVwZWF0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFJlcGVhdFBsYWNlaG9sZGVyW3ZvaWNlTnVtYmVyXSA9IHZvaWNlc1t2b2ljZU51bWJlcl0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnc3R5bGUnOlxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETy1QRVI6IElmIHRoaXMgaXMgc2V0IHRvIHJoeXRobSBoZWFkcywgdGhlbiBpdCBzaG91bGQgdXNlIHRoZSBwZXJjdXNzaW9uIGNoYW5uZWwuXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlICdwYXJ0Jzpcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRPRE8tUEVSOiBJZiB0aGVyZSBpcyBhIHBhcnQgc2VjdGlvbiBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoaXMgc2hvdWxkIHByb2JhYmx5IGFmZmVjdCB0aGUgcmVwZWF0cy5cblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3N0ZW0nOlxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3NjYWxlJzpcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoZXNlIGVsZW1lbnRzIGRvbid0IGFmZmVjdCBzb3VuZFxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnbWlkaSc6XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKFwiTUlESSBpbmxpbmVcIiwgZWxlbSk7IC8vIFRPRE8tUEVSOiBmb3IgZGVidWdnaW5nLiBSZW1vdmUgdGhpcy5cblx0XHRcdFx0XHRcdFx0XHRcdHZhciBkcnVtQ2hhbmdlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGVsZW0uY21kKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJkcnVtb25cIjogZHJ1bU9uID0gdHJ1ZTsgZHJ1bUNoYW5nZSA9IHRydWU7IGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZHJ1bW9mZlwiOiBkcnVtT24gPSBmYWxzZTsgZHJ1bUNoYW5nZSA9IHRydWU7IGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZHJ1bVwiOiBkcnVtUGF0dGVybiA9IGVsZW0ucGFyYW1zOyBkcnVtQ2hhbmdlID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJkcnVtYmFyc1wiOiBkcnVtQmFycyA9IGVsZW0ucGFyYW1zWzBdOyBkcnVtQ2hhbmdlID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJkcnVtbWFwXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBoYW5kbGVkIGJlZm9yZSBnZXR0aW5nIGhlcmUgc28gaXQgY2FuIGJlIGlnbm9yZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJwcm9ncmFtXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ2luc3RydW1lbnQnLCBwcm9ncmFtOiBlbGVtLnBhcmFtc1swXSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInRyYW5zcG9zZVwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICd0cmFuc3Bvc2UnLCB0cmFuc3Bvc2U6IGVsZW0ucGFyYW1zWzBdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZ2Nob3Jkb2ZmXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ2djaG9yZCcsIHRhY2V0OiB0cnVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZ2Nob3Jkb25cIjpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAnZ2Nob3JkJywgdGFjZXQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiYmVhdFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0JywgYmVhdHM6IGVsZW0ucGFyYW1zIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwibm9iZWF0YWNjZW50c1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICdiZWF0YWNjZW50cycsIHZhbHVlOiBmYWxzZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImJlYXRhY2NlbnRzXCI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzW3ZvaWNlTnVtYmVyXS5wdXNoKHsgZWxfdHlwZTogJ2JlYXRhY2NlbnRzJywgdmFsdWU6IHRydWUgfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ2b2xcIjpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2b2ljZXNbdm9pY2VOdW1iZXJdLnB1c2goeyBlbF90eXBlOiAndm9sJywgdm9sdW1lOiBlbGVtLnBhcmFtc1swXSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInZvbGluY1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZvaWNlc1t2b2ljZU51bWJlcl0ucHVzaCh7IGVsX3R5cGU6ICd2b2xpbmMnLCB2b2x1bWU6IGVsZW0ucGFyYW1zWzBdIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiTUlESSBzZXE6IG1pZGkgY21kIG5vdCBoYW5kbGVkOiBcIiwgZWxlbS5jbWQsIGVsZW0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRydW1DaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dm9pY2VzWzBdLnB1c2goe2VsX3R5cGU6ICdkcnVtJywgcGFyYW1zOiB7IHBhdHRlcm46IGRydW1QYXR0ZXJuLCBiYXJzOiBkcnVtQmFycywgaW50cm86IGRydW1JbnRybywgb246IGRydW1Pbn19KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRpbmdEcnVtU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIk1JREk6IGVsZW1lbnQgdHlwZSBcIiArIGVsZW0uZWxfdHlwZSArIFwiIG5vdCBoYW5kbGVkLlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dm9pY2VOdW1iZXIrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGRydW1JbnRybykge1xuXHRcdFx0dmFyIHBpY2t1cHMgPSBhYmN0dW5lLmdldFBpY2t1cExlbmd0aCgpO1xuXHRcdFx0Ly8gYWRkIHNvbWUgbWVhc3VyZXMgb2YgcmVzdHMgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggdHJhY2suXG5cdFx0XHRmb3IgKHZhciB2diA9IDA7IHZ2IDwgdm9pY2VzLmxlbmd0aDsgdnYrKykge1xuXHRcdFx0XHR2YXIgaW5zZXJ0UG9pbnQgPSAwO1xuXHRcdFx0XHR3aGlsZSAodm9pY2VzW3Z2XVtpbnNlcnRQb2ludF0uZWxfdHlwZSAhPT0gXCJub3RlXCIgJiYgdm9pY2VzW3Z2XS5sZW5ndGggPiBpbnNlcnRQb2ludClcblx0XHRcdFx0XHRpbnNlcnRQb2ludCsrO1xuXHRcdFx0XHRpZiAodm9pY2VzW3Z2XS5sZW5ndGggPiBpbnNlcnRQb2ludCkge1xuXHRcdFx0XHRcdGZvciAodmFyIHcgPSAwOyB3IDwgZHJ1bUludHJvOyB3KyspIHtcblx0XHRcdFx0XHRcdC8vIElmIGl0IGlzIHRoZSBsYXN0IG1lYXN1cmUgb2YgaW50cm8sIHN1YnRyYWN0IHRoZSBwaWNrdXBzLlxuXHRcdFx0XHRcdFx0aWYgKHBpY2t1cHMgPT09IDAgfHwgdyA8IGRydW1JbnRyby0xKVxuXHRcdFx0XHRcdFx0XHR2b2ljZXNbdnZdLnNwbGljZShpbnNlcnRQb2ludCwgMCwge2VsX3R5cGU6IFwibm90ZVwiLCByZXN0OiB7dHlwZTogXCJyZXN0XCJ9LCBkdXJhdGlvbjogbWVhc3VyZUxlbmd0aH0sXG5cdFx0XHRcdFx0XHRcdFx0eyBlbF90eXBlOiBcImJhclwiIH0pO1xuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHZvaWNlc1t2dl0uc3BsaWNlKGluc2VydFBvaW50LCAwLCB7ZWxfdHlwZTogXCJub3RlXCIsIHJlc3Q6IHt0eXBlOiBcInJlc3RcIn0sIGR1cmF0aW9uOiBtZWFzdXJlTGVuZ3RoLXBpY2t1cHN9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZvaWNlcztcblx0fTtcblxuXHRmdW5jdGlvbiBpbnRlcnByZXRUZW1wbyhlbGVtZW50KSB7XG5cdFx0dmFyIGR1cmF0aW9uID0gMS80O1xuXHRcdGlmIChlbGVtZW50LmR1cmF0aW9uKSB7XG5cdFx0XHRkdXJhdGlvbiA9IGVsZW1lbnQuZHVyYXRpb25bMF07XG5cdFx0fVxuXHRcdHZhciBicG0gPSA2MDtcblx0XHRpZiAoZWxlbWVudC5icG0pIHtcblx0XHRcdGJwbSA9IGVsZW1lbnQuYnBtO1xuXHRcdH1cblx0XHQvLyBUaGUgdGVtcG8gaXMgZGVmaW5lZCB3aXRoIGEgYmVhdCBvZiBhIDEvNCBub3RlLCBzbyB3ZSBuZWVkIHRvIGFkanVzdCBpdCBpZiB0aGUgdGVtcG8gaXMgZXhwcmVzc2VkIHdpdGggb3RoZXIgdGhhbiBhIHF1YXJ0ZXIgbm90ZS5cblx0XHQvLyBleHByZXNzZWREdXJhdGlvbiAqIGV4cHJlc3NlZEJlYXRzUGVyTWludXRlIC8gbGVuZ3RoT2ZRdWFydGVyTm90ZSA9IHF1YXJ0ZXJOb3Rlc1Blck1pbnV0ZVxuXHRcdHJldHVybiBkdXJhdGlvbiAqIGJwbSAvIDAuMjU7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnRlcnByZXRNZXRlcihlbGVtZW50KSB7XG5cdFx0dmFyIG1ldGVyO1xuXHRcdHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG5cdFx0XHRjYXNlIFwiY29tbW9uX3RpbWVcIjpcblx0XHRcdFx0bWV0ZXIgPSB7IGVsX3R5cGU6ICdtZXRlcicsIG51bTogNCwgZGVuOiA0IH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImN1dF90aW1lXCI6XG5cdFx0XHRcdG1ldGVyID0geyBlbF90eXBlOiAnbWV0ZXInLCBudW06IDIsIGRlbjogMiB9O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzcGVjaWZpZWRcIjpcblx0XHRcdFx0Ly8gVE9ETy1QRVI6IG9ubHkgdGFraW5nIHRoZSBmaXJzdCBtZXRlciwgc28gdGhlIGNvbXBsZXggbWV0ZXJzIGFyZSBub3QgaGFuZGxlZC5cblx0XHRcdFx0bWV0ZXIgPSB7IGVsX3R5cGU6ICdtZXRlcicsIG51bTogZWxlbWVudC52YWx1ZVswXS5udW0sIGRlbjogZWxlbWVudC52YWx1ZVswXS5kZW4gfTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uXG5cdFx0XHRcdG1ldGVyID0geyBlbF90eXBlOiAnbWV0ZXInIH07XG5cdFx0fVxuXHRcdG1lYXN1cmVMZW5ndGggPSBtZXRlci5udW0vbWV0ZXIuZGVuO1xuXHRcdHJldHVybiBtZXRlcjtcblx0fVxufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXF1ZW5jZTtcbiIsIi8vICAgIGFiY19taWRpX2ZsYXR0ZW5lci5qczogVHVybiBhIGxpbmVhciBzZXJpZXMgb2YgZXZlbnRzIGludG8gYSBzZXJpZXMgb2YgTUlESSBjb21tYW5kcy5cbi8vICAgIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IEdyZWdvcnkgRHlrZSAoZ3JlZ2R5a2UgYXQgZ21haWwgZG90IGNvbSkgYW5kIFBhdWwgUm9zZW5cbi8vXG4vLyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWRcbi8vICAgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4vLyAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kXG4vLyAgICB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HXG4vLyAgICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyAgICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gV2UgaW5wdXQgYSBzZXQgb2Ygdm9pY2VzLCBidXQgdGhlIG5vdGVzIGFyZSBzdGlsbCBjb21wbGV4LiBUaGlzIHBhc3MgY2hhbmdlcyB0aGUgbG9naWNhbCBkZWZpbml0aW9uc1xuLy8gb2YgdGhlIGdyYWNlIG5vdGVzLCBkZWNvcmF0aW9ucywgdGllcywgdHJpcGxldHMsIHJlc3RzLCB0cmFuc3Bvc2l0aW9ucywga2V5cywgYW5kIGFjY2lkZW50YWxzIGludG8gYWN0dWFsIG5vdGUgZHVyYXRpb25zLlxuLy8gSXQgYWxzbyBleHRyYWN0cyBndWl0YXIgY2hvcmRzIHRvIGEgc2VwYXJhdGUgdm9pY2UgYW5kIHJlc29sdmVzIHRoZWlyIHJoeXRobS5cblxudmFyIGZsYXR0ZW47XG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGJhckFjY2lkZW50YWxzO1xuXHR2YXIgYWNjaWRlbnRhbHM7XG5cdHZhciB0cmFuc3Bvc2U7XG5cdHZhciBiYWdwaXBlcztcblx0dmFyIG11bHRpcGxpZXI7XG5cdHZhciB0cmFja3M7XG5cdHZhciBzdGFydGluZ1RlbXBvO1xuXHR2YXIgc3RhcnRpbmdNZXRlcjtcblx0dmFyIHRlbXBvQ2hhbmdlRmFjdG9yID0gMTtcblx0dmFyIGluc3RydW1lbnQ7XG5cdHZhciBjdXJyZW50SW5zdHJ1bWVudDtcblx0Ly8gdmFyIGNoYW5uZWw7XG5cdHZhciBjdXJyZW50VHJhY2s7XG5cdHZhciBwaXRjaGVzVGllZDtcblx0dmFyIGxhc3ROb3RlRHVyYXRpb25Qb3NpdGlvbjtcblx0dmFyIGN1cnJlbnRUcmFja0NvdW50ZXI7XG5cblx0dmFyIG1ldGVyID0geyBudW06IDQsIGRlbjogNCB9O1xuXHR2YXIgY2hvcmRUcmFjaztcblx0dmFyIGNob3JkVHJhY2tGaW5pc2hlZDtcblx0dmFyIGNob3JkQ2hhbm5lbDtcblx0dmFyIGNob3JkSW5zdHJ1bWVudCA9IDA7XG5cdHZhciBkcnVtSW5zdHJ1bWVudCA9IDEyODtcblx0dmFyIGN1cnJlbnRDaG9yZHM7XG5cdHZhciBsYXN0Q2hvcmQ7XG5cdHZhciBiYXJCZWF0O1xuXHR2YXIgZ0Nob3JkVGFjZXQgPSBmYWxzZTtcblx0dmFyIGRvQmVhdEFjY2VudHMgPSB0cnVlO1xuXHR2YXIgc3RyZXNzQmVhdDEgPSAxMDU7XG5cdHZhciBzdHJlc3NCZWF0RG93biA9IDk1O1xuXHR2YXIgc3RyZXNzQmVhdFVwID0gODU7XG5cdHZhciBiZWF0RnJhY3Rpb24gPSAwLjI1O1xuXHR2YXIgbmV4dFZvbHVtZTtcblx0dmFyIG5leHRWb2x1bWVEZWx0YTtcblxuXHR2YXIgZHJ1bVRyYWNrO1xuXHR2YXIgZHJ1bVRyYWNrRmluaXNoZWQ7XG5cdHZhciBkcnVtRGVmaW5pdGlvbiA9IHt9O1xuXG5cdHZhciBub3JtYWxCcmVha0JldHdlZW5Ob3RlcyA9IDEuMC8xMjg7XHQvLyBhIDEyOHRoIG5vdGUgb2Ygc2lsZW5jZSBiZXR3ZWVuIG5vdGVzIGZvciBhcnRpY3VsYXRpb24uXG5cblx0ZmxhdHRlbiA9IGZ1bmN0aW9uKHZvaWNlcywgb3B0aW9ucykge1xuXHRcdGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXHRcdGJhckFjY2lkZW50YWxzID0gW107XG5cdFx0YWNjaWRlbnRhbHMgPSBbMCwwLDAsMCwwLDAsMF07XG5cdFx0YmFncGlwZXMgPSBmYWxzZTtcblx0XHRtdWx0aXBsaWVyID0gMTtcblx0XHR0cmFja3MgPSBbXTtcblx0XHRzdGFydGluZ1RlbXBvID0gdW5kZWZpbmVkO1xuXHRcdHN0YXJ0aW5nTWV0ZXIgPSB1bmRlZmluZWQ7XG5cdFx0dGVtcG9DaGFuZ2VGYWN0b3IgPSAxO1xuXHRcdGluc3RydW1lbnQgPSB1bmRlZmluZWQ7XG5cdFx0Y3VycmVudEluc3RydW1lbnQgPSB1bmRlZmluZWQ7XG5cdFx0Ly8gY2hhbm5lbCA9IHVuZGVmaW5lZDtcblx0XHRjdXJyZW50VHJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0Y3VycmVudFRyYWNrQ291bnRlciA9IHVuZGVmaW5lZDtcblx0XHRwaXRjaGVzVGllZCA9IHt9O1xuXG5cdFx0Ly8gRm9yIHJlc29sdmluZyBjaG9yZHMuXG5cdFx0bWV0ZXIgPSB7IG51bTogNCwgZGVuOiA0IH07XG5cdFx0Y2hvcmRUcmFjayA9IFtdO1xuXHRcdGNob3JkQ2hhbm5lbCA9IHZvaWNlcy5sZW5ndGg7IC8vIGZpcnN0IGZyZWUgY2hhbm5lbCBmb3IgY2hvcmRzXG5cdFx0Y2hvcmRUcmFja0ZpbmlzaGVkID0gZmFsc2U7XG5cdFx0Y3VycmVudENob3JkcyA9IFtdO1xuXHRcdGxhc3RDaG9yZCA9IHVuZGVmaW5lZDtcblx0XHRiYXJCZWF0ID0gMDtcblx0XHRnQ2hvcmRUYWNldCA9IG9wdGlvbnMuY2hvcmRzT2ZmID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0ZG9CZWF0QWNjZW50cyA9IHRydWU7XG5cdFx0c3RyZXNzQmVhdDEgPSAxMDU7XG5cdFx0c3RyZXNzQmVhdERvd24gPSA5NTtcblx0XHRzdHJlc3NCZWF0VXAgPSA4NTtcblx0XHRiZWF0RnJhY3Rpb24gPSAwLjI1O1xuXHRcdG5leHRWb2x1bWUgPSB1bmRlZmluZWQ7XG5cdFx0bmV4dFZvbHVtZURlbHRhID0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gRm9yIHRoZSBkcnVtL21ldHJvbm9tZSB0cmFjay5cblx0XHRkcnVtVHJhY2sgPSBbXTtcblx0XHRkcnVtVHJhY2tGaW5pc2hlZCA9IGZhbHNlO1xuXHRcdGRydW1EZWZpbml0aW9uID0ge307XG5cblx0XHR6ZXJvT3V0TWlsbGlzZWNvbmRzKHZvaWNlcyk7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHZvaWNlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dHJhbnNwb3NlID0gMDtcblx0XHRcdGxhc3ROb3RlRHVyYXRpb25Qb3NpdGlvbiA9IC0xO1xuXHRcdFx0dmFyIHZvaWNlID0gdm9pY2VzW2ldO1xuXHRcdFx0Y3VycmVudFRyYWNrID0gW3sgY21kOiAncHJvZ3JhbScsIGNoYW5uZWw6IGksIGluc3RydW1lbnQ6IGluc3RydW1lbnQgfV07XG5cdFx0XHRjdXJyZW50VHJhY2tDb3VudGVyID0gMDtcblx0XHRcdHBpdGNoZXNUaWVkID0ge307XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHZhciBlbGVtZW50ID0gdm9pY2Vbal07XG5cdFx0XHRcdHN3aXRjaCAoZWxlbWVudC5lbF90eXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIm5vdGVcIjpcblx0XHRcdFx0XHRcdHdyaXRlTm90ZShlbGVtZW50LCBvcHRpb25zLnZvaWNlc09mZik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwia2V5XCI6XG5cdFx0XHRcdFx0XHRhY2NpZGVudGFscyA9IHNldEtleVNpZ25hdHVyZShlbGVtZW50KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJtZXRlclwiOlxuXHRcdFx0XHRcdFx0aWYgKCFzdGFydGluZ01ldGVyKVxuXHRcdFx0XHRcdFx0XHRzdGFydGluZ01ldGVyID0gZWxlbWVudDtcblx0XHRcdFx0XHRcdG1ldGVyID0gZWxlbWVudDtcblx0XHRcdFx0XHRcdGJlYXRGcmFjdGlvbiA9IGdldEJlYXRGcmFjdGlvbihtZXRlcik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwidGVtcG9cIjpcblx0XHRcdFx0XHRcdGlmICghc3RhcnRpbmdUZW1wbylcblx0XHRcdFx0XHRcdFx0c3RhcnRpbmdUZW1wbyA9IGVsZW1lbnQucXBtO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR0ZW1wb0NoYW5nZUZhY3RvciA9IGVsZW1lbnQucXBtID8gc3RhcnRpbmdUZW1wbyAvIGVsZW1lbnQucXBtIDogMTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJ0cmFuc3Bvc2VcIjpcblx0XHRcdFx0XHRcdHRyYW5zcG9zZSA9IGVsZW1lbnQudHJhbnNwb3NlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImJhclwiOlxuXHRcdFx0XHRcdFx0aWYgKGNob3JkVHJhY2subGVuZ3RoID4gMCAmJiBpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVDaG9yZHMoKTtcblx0XHRcdFx0XHRcdFx0Y3VycmVudENob3JkcyA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YmFyQmVhdCA9IDA7XG5cdFx0XHRcdFx0XHRiYXJBY2NpZGVudGFscyA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKGkgPT09IDApIC8vIE9ubHkgd3JpdGUgdGhlIGRydW0gcGFydCBvbiB0aGUgZmlyc3Qgdm9pY2Ugc28gdGhhdCBpdCBpcyBub3QgZHVwbGljYXRlZC5cblx0XHRcdFx0XHRcdFx0d3JpdGVEcnVtKHZvaWNlcy5sZW5ndGgrMSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiYmFncGlwZXNcIjpcblx0XHRcdFx0XHRcdGJhZ3BpcGVzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJpbnN0cnVtZW50XCI6XG5cdFx0XHRcdFx0XHRpZiAoaW5zdHJ1bWVudCA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHRpbnN0cnVtZW50ID0gZWxlbWVudC5wcm9ncmFtO1xuXHRcdFx0XHRcdFx0Y3VycmVudEluc3RydW1lbnQgPSBlbGVtZW50LnByb2dyYW07XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFRyYWNrLmxlbmd0aCA+IDAgJiYgY3VycmVudFRyYWNrW2N1cnJlbnRUcmFjay5sZW5ndGgtMV0uY21kID09PSAncHJvZ3JhbScpXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUcmFja1tjdXJyZW50VHJhY2subGVuZ3RoLTFdLmluc3RydW1lbnQgPSBlbGVtZW50LnByb2dyYW07XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0dmFyIGlpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGlpID0gY3VycmVudFRyYWNrLmxlbmd0aC0xOyBpaSA+PSAwICYmIGN1cnJlbnRUcmFja1tpaV0uY21kICE9PSAncHJvZ3JhbSc7IGlpLS0pXG5cdFx0XHRcdFx0XHRcdFx0O1xuXHRcdFx0XHRcdFx0XHRpZiAoaWkgPCAwIHx8IGN1cnJlbnRUcmFja1tpaV0uaW5zdHJ1bWVudCAhPT0gZWxlbWVudC5wcm9ncmFtKVxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUcmFjay5wdXNoKHtjbWQ6ICdwcm9ncmFtJywgY2hhbm5lbDogaSwgaW5zdHJ1bWVudDogZWxlbWVudC5wcm9ncmFtfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiY2hhbm5lbFwiOlxuXHRcdFx0XHRcdC8vIFx0aWYgKGNoYW5uZWwgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHQvLyBcdFx0Y2hhbm5lbCA9IGVsZW1lbnQuY2hhbm5lbDtcblx0XHRcdFx0XHQvLyBcdGN1cnJlbnRUcmFja1swXS5jaGFubmVsID0gZWxlbWVudC5jaGFubmVsO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImRydW1cIjpcblx0XHRcdFx0XHRcdGRydW1EZWZpbml0aW9uID0gbm9ybWFsaXplRHJ1bURlZmluaXRpb24oZWxlbWVudC5wYXJhbXMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImdjaG9yZFwiOlxuXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmNob3Jkc09mZilcblx0XHRcdFx0XHRcdFx0Z0Nob3JkVGFjZXQgPSBlbGVtZW50LnRhY2V0O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImJlYXRcIjpcblx0XHRcdFx0XHRcdHN0cmVzc0JlYXQxID0gZWxlbWVudC5iZWF0c1swXTtcblx0XHRcdFx0XHRcdHN0cmVzc0JlYXREb3duID0gZWxlbWVudC5iZWF0c1sxXTtcblx0XHRcdFx0XHRcdHN0cmVzc0JlYXRVcCA9IGVsZW1lbnQuYmVhdHNbMl07XG5cdFx0XHRcdFx0XHQvLyBUT0RPLVBFUjogYWxzbyB1c2UgdGhlIGxhc3QgcGFyYW1ldGVyIC0gd2hpY2ggY2hhbmdlcyB3aGljaCBiZWF0cyBhcmUgc3Ryb25nLlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInZvbFwiOlxuXHRcdFx0XHRcdFx0bmV4dFZvbHVtZSA9IGVsZW1lbnQudm9sdW1lO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInZvbGluY1wiOlxuXHRcdFx0XHRcdFx0bmV4dFZvbHVtZURlbHRhID0gZWxlbWVudC52b2x1bWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiYmVhdGFjY2VudHNcIjpcblx0XHRcdFx0XHRcdGRvQmVhdEFjY2VudHMgPSBlbGVtZW50LnZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJNSURJIGNyZWF0aW9uLiBVbmtub3duIGVsX3R5cGU6IFwiICsgZWxlbWVudC5lbF90eXBlICsgXCJcXG5cIik7Ly8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRUcmFja1swXS5pbnN0cnVtZW50ID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdGN1cnJlbnRUcmFja1swXS5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudCA/IGluc3RydW1lbnQgOiAwO1xuXHRcdFx0dHJhY2tzLnB1c2goY3VycmVudFRyYWNrKTtcblx0XHRcdGlmIChjaG9yZFRyYWNrLmxlbmd0aCA+IDApIC8vIERvbid0IGRvIGNob3JkcyBvbiBtb3JlIHRoYW4gb25lIHRyYWNrLCBzbyB0dXJuIG9mZiBjaG9yZCBkZXRlY3Rpb24gYWZ0ZXIgd2UgY3JlYXRlIGl0LlxuXHRcdFx0XHRjaG9yZFRyYWNrRmluaXNoZWQgPSB0cnVlO1xuXHRcdFx0aWYgKGRydW1UcmFjay5sZW5ndGggPiAwKSAvLyBEb24ndCBkbyBkcnVtcyBvbiBtb3JlIHRoYW4gb25lIHRyYWNrLCBzbyB0dXJuIG9mZiBkcnVtIGFmdGVyIHdlIGNyZWF0ZSBpdC5cblx0XHRcdFx0ZHJ1bVRyYWNrRmluaXNoZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoY2hvcmRUcmFjay5sZW5ndGggPiAwKVxuXHRcdFx0dHJhY2tzLnB1c2goY2hvcmRUcmFjayk7XG5cdFx0aWYgKGRydW1UcmFjay5sZW5ndGggPiAwKVxuXHRcdFx0dHJhY2tzLnB1c2goZHJ1bVRyYWNrKTtcblx0XHQvLyBBZGp1c3QgdGhlIHRlbXBvIGFjY29yZGluZyB0byB0aGUgbWV0ZXIuIFRoZSBydWxlcyBhcmUgdGhpczpcblx0XHQvLyAxKSBJZiB0aGUgZGVub21pbmF0b3IgaXMgMiBvciA0LCB0aGVuIGFsd2F5cyBtYWtlIGEgYmVhdCBiZSB0aGUgZGVub21pbmF0b3IuXG5cdFx0Ly9cblx0XHQvLyAyKSBJZiB0aGUgZGVub21pbmF0b3IgaXMgOCBvciAxNiwgdGhlbjpcblx0XHQvLyBhKSBJZiB0aGUgbnVtZXJhdG9yIGlzIGRpdmlzaWJsZSBieSAzLCB0aGUgYmVhdCBpcyAzKmRlbm9taW5hdG9yLlxuXHRcdC8vIGIpIE90aGVyd2lzZSB0aGUgYmVhdCBpcyB0aGUgZGVub21pbmF0b3IuXG5cdFx0Ly9cblx0XHQvLyAzKSBJZiB0aGUgZGVub21pbmF0b3IgaXMgYW55dGhpbmcgZWxzZSwgdGhlbiBkb24ndCB3b3JyeSBhYm91dCBpdCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4gRG9uJ3QgbW9kaWZ5IGl0IGFuZCBob3BlIGZvciB0aGUgYmVzdC5cblx0XHQvL1xuXHRcdC8vIFJpZ2h0IG5vdywgdGhlIHN0YXJ0aW5nVGVtcG8gaXMgY2FsY3VsYXRlZCBmb3IgYSBxdWFydGVyIG5vdGUsIHNvIG1vZGlmeSBpdCBpZiBuZWNlc3NhcnkuXG5cdFx0Ly8gdmFyIG51bSA9IHN0YXJ0aW5nTWV0ZXIgPyBwYXJzZUludChzdGFydGluZ01ldGVyLm51bSwgMTApIDogbWV0ZXIubnVtO1xuXHRcdC8vIHZhciBkZW4gPSBzdGFydGluZ01ldGVyID8gcGFyc2VJbnQoc3RhcnRpbmdNZXRlci5kZW4sIDEwKSA6IG1ldGVyLmRlbjtcblx0XHQvLyBpZiAoZGVuID09PSAyKVxuXHRcdC8vIFx0c3RhcnRpbmdUZW1wbyAqPSAyO1xuXHRcdC8vIGVsc2UgaWYgKGRlbiA9PT0gOCkge1xuXHRcdC8vIFx0aWYgKHBhcnNlSW50KG51bSwgMTApICUgMyA9PT0gMClcblx0XHQvLyBcdFx0c3RhcnRpbmdUZW1wbyAqPSAzLzI7XG5cdFx0Ly8gXHRlbHNlXG5cdFx0Ly8gXHRcdHN0YXJ0aW5nVGVtcG8gLz0gMjtcblx0XHQvLyB9IGVsc2UgaWYgKGRlbiA9PT0gMTYpIHtcblx0XHQvLyBcdGlmIChudW0gJSAzID09PSAwKVxuXHRcdC8vIFx0XHRzdGFydGluZ1RlbXBvICo9IDMvNDtcblx0XHQvLyBcdGVsc2Vcblx0XHQvLyBcdFx0c3RhcnRpbmdUZW1wbyAvPSA0O1xuXHRcdC8vIH1cblxuXHRcdHJldHVybiB7IHRlbXBvOiBzdGFydGluZ1RlbXBvLCBpbnN0cnVtZW50OiBpbnN0cnVtZW50LCB0cmFja3M6IHRyYWNrcywgdG90YWxEdXJhdGlvbjogdG90YWxEdXJhdGlvbih0cmFja3MpIH07XG5cdH07XG5cblx0ZnVuY3Rpb24gemVyb091dE1pbGxpc2Vjb25kcyh2b2ljZXMpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHZvaWNlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHZvaWNlID0gdm9pY2VzW2ldO1xuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHR2YXIgZWxlbWVudCA9IHZvaWNlW2pdO1xuXHRcdFx0XHRkZWxldGUgZWxlbWVudC5jdXJyZW50VHJhY2tNaWxsaXNlY29uZHM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gdG90YWxEdXJhdGlvbih0cmFja3MpIHtcblx0XHR2YXIgdG90YWwgPSAwO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cdFx0XHR2YXIgdHJhY2tUb3RhbCA9IDA7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRyYWNrLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHZhciBldmVudCA9IHRyYWNrW2pdO1xuXHRcdFx0XHRpZiAoZXZlbnQuZHVyYXRpb24pXG5cdFx0XHRcdFx0dHJhY2tUb3RhbCArPSBldmVudC5kdXJhdGlvbjtcblx0XHRcdH1cblx0XHRcdHRvdGFsID0gTWF0aC5tYXgodG90YWwsIHRyYWNrVG90YWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gdG90YWw7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRCZWF0RnJhY3Rpb24obWV0ZXIpIHtcblx0XHRzd2l0Y2ggKG1ldGVyLmRlbikge1xuXHRcdFx0Y2FzZSAyOiByZXR1cm4gMC41O1xuXHRcdFx0Y2FzZSA0OiByZXR1cm4gMC4yNTtcblx0XHRcdGNhc2UgODogcmV0dXJuIDAuMzc1O1xuXHRcdFx0Y2FzZSAxNjogcmV0dXJuIDAuMTI1O1xuXHRcdH1cblx0XHRyZXR1cm4gMC4yNTtcblx0fVxuXHQvL1xuXHQvLyBUaGUgYWxnb3JpdGhtIGZvciBjaG9yZHMgaXM6XG5cdC8vIC0gVGhlIGNob3JkcyBhcmUgZG9uZSBpbiBhIHNlcGFyYXRlIHRyYWNrLlxuXHQvLyAtIElmIHRoZXJlIGFyZSBub3RlcyBiZWZvcmUgdGhlIGZpcnN0IGNob3JkLCB0aGVuIHB1dCB0aGF0IG11Y2ggc2lsZW5jZSB0byBzdGFydCB0aGUgdHJhY2suXG5cdC8vIC0gVGhlIHBhdHRlcm4gb2YgY2hvcmQgZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBtZXRlciwgYW5kIGhvdyBtYW55IGNob3JkcyBhcmUgaW4gYSBtZWFzdXJlLlxuXHQvLyAtIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIG1lYXN1cmUgd2lsbCBoYXZlIGFuIGluY29ycmVjdCBudW1iZXIgb2YgYmVhdHMsIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZW5cblx0Ly8gc3RhcnQgdGhlIHBhdHRlcm4gYW5ldyBvbiB0aGUgbmV4dCBtZWFzdXJlIG51bWJlci5cblx0Ly8gLSBJZiBhIGNob3JkIHJvb3QgaXMgbm90IEEtRywgdGhlbiBpZ25vcmUgaXQgYXMgaWYgdGhlIGNob3JkIHdhc24ndCB0aGVyZSBhdCBhbGwuXG5cdC8vIC0gSWYgYSBjaG9yZCBtb2RpZmljYXRpb24gaXNuJ3QgaW4gb3VyIHN1cHBvcnRlZCBsaXN0LCBjaGFuZ2UgaXQgdG8gYSBtYWpvciB0cmlhZC5cblx0Ly9cblx0Ly8gLSBJZiB0aGVyZSBpcyBvbmx5IG9uZSBjaG9yZCBpbiBhIG1lYXN1cmU6XG5cdC8vXHRcdC0gSWYgMi80LCBwbGF5IHJvb3QgY2hvcmRcblx0Ly9cdFx0LSBJZiBjdXQgdGltZSwgcGxheSByb290KDEpIGNob3JkKDMpXG5cdC8vXHRcdC0gSWYgMy80LCBwbGF5IHJvb3QgY2hvcmQgY2hvcmRcblx0Ly9cdFx0LSBJZiA0LzQgb3IgY29tbW9uIHRpbWUsIHBsYXkgcm9vdCBjaG9yZCBmaWZ0aCBjaG9yZFxuXHQvL1x0XHQtIElmIDYvOCwgcGxheSByb290KDEpIGNob3JkKDMpIGZpZnRoKDQpIGNob3JkKDYpXG5cdC8vXHRcdC0gRm9yIGFueSBvdGhlciBtZXRlciwgcGxheSB0aGUgZnVsbCBjaG9yZCBvbiBlYWNoIGJlYXQuIChUT0RPLVBFUjogZXhwYW5kIHRoaXMgYXMgbW9yZSBzdXBwb3J0IGlzIGFkZGVkLilcblx0Ly9cblx0Ly9cdC0gSWYgdGhlcmUgaXMgYSBjaG9yZCBzcGVjaWZpZWQgdGhhdCBpcyBub3Qgb24gYSBiZWF0LCBtb3ZlIGl0IGVhcmxpZXIgdG8gdGhlIHByZXZpb3VzIGJlYXQsIHVubGVzcyB0aGVyZSBpcyBhbHJlYWR5IGEgY2hvcmQgb24gdGhhdCBiZWF0LlxuXHQvL1x0LSBPdGhlcndpc2UsIG1vdmUgaXQgbGF0ZXIsIHVubGVzcyB0aGVyZSBpcyBhbHJlYWR5IGEgY2hvcmQgb24gdGhhdCBiZWF0LlxuXHQvLyBcdC0gT3RoZXJ3aXNlLCBpZ25vcmUgaXQuIChUT0RPLVBFUjogZXhwYW5kIHRoaXMgYXMgbW9yZSBzdXBwb3J0IGlzIGFkZGVkLilcblx0Ly9cblx0Ly8gLSBJZiB0aGVyZSBpcyBhIGNob3JkIG9uIHRoZSBzZWNvbmQgYmVhdCwgcGxheSBhIGNob3JkIGZvciB0aGUgZmlyc3QgYmVhdCBpbnN0ZWFkIG9mIGEgYmFzcyBub3RlLlxuXHQvLyAtIExpa2V3aXNlLCBpZiB0aGVyZSBpcyBhIGNob3JkIG9uIHRoZSBmb3VydGggYmVhdCBvZiA0LzQsIHBsYXkgYSBjaG9yZCBvbiB0aGUgdGhpcmQgYmVhdCBpbnN0ZWFkIG9mIGEgYmFzcyBub3RlLlxuXHQvL1xuXHR2YXIgYnJlYWtTeW5vbnltcyA9IFsgJ2JyZWFrJywgJyhicmVhayknLCAnbm8gY2hvcmQnLCAnbi5jLicsICd0YWNldCddO1xuXG5cdGZ1bmN0aW9uIGZpbmRDaG9yZChlbGVtKSB7XG5cdFx0aWYgKGdDaG9yZFRhY2V0KVxuXHRcdFx0cmV0dXJuICdicmVhayc7XG5cblx0XHQvLyBUT0RPLVBFUjogSnVzdCB1c2luZyB0aGUgZmlyc3QgY2hvcmQgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUuXG5cdFx0aWYgKGNob3JkVHJhY2tGaW5pc2hlZCB8fCAhZWxlbS5jaG9yZCB8fCBlbGVtLmNob3JkLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBmaXJzdCBhbm5vdGF0aW9uIHRoYXQgaXMgYSByZWd1bGFyIGNob3JkOiB0aGF0IGlzLCBpdCBpcyBpbiB0aGUgZGVmYXVsdCBwbGFjZSBvciBpcyBhIHJlY29nbml6ZWQgXCJ0YWNldFwiIHBocmFzZS5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW0uY2hvcmQubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBjaCA9IGVsZW0uY2hvcmRbaV07XG5cdFx0XHRpZiAoY2gucG9zaXRpb24gPT09ICdkZWZhdWx0Jylcblx0XHRcdFx0cmV0dXJuIGNoLm5hbWU7XG5cdFx0XHRpZiAoYnJlYWtTeW5vbnltcy5pbmRleE9mKGNoLm5hbWUudG9Mb3dlckNhc2UoKSkgPj0gMClcblx0XHRcdFx0cmV0dXJuICdicmVhayc7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGltZUZyb21TdGFydCgpIHtcblx0XHR2YXIgZGlzdGFuY2UgPSAwO1xuXHRcdGZvciAodmFyIGN0ID0gMDsgY3QgPCBjdXJyZW50VHJhY2subGVuZ3RoOyBjdCsrKSB7XG5cdFx0XHRpZiAoY3VycmVudFRyYWNrW2N0XS5jbWQgPT09ICdtb3ZlJylcblx0XHRcdFx0ZGlzdGFuY2UgKz0gY3VycmVudFRyYWNrW2N0XS5kdXJhdGlvbjtcblx0XHR9XG5cdFx0cmV0dXJuIGRpc3RhbmNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVOb3RlKGVsZW0sIHZvaWNlT2ZmKSB7XG5cdFx0Ly9cblx0XHQvLyBDcmVhdGUgYSBzZXJpZXMgb2Ygbm90ZSBldmVudHMgdG8gYXBwZW5kIHRvIHRoZSBjdXJyZW50IHRyYWNrLlxuXHRcdC8vIFRoZSBvdXRwdXQgZXZlbnQgaXMgb25lIG9mOiB7IHBpdGNoU3RhcnQ6IHBpdGNoX2luX2FiY191bml0cywgdm9sdW1lOiBmcm9tXzFfdG9fNjQgfVxuXHRcdC8vIHsgcGl0Y2hTdG9wOiBwaXRjaF9pbl9hYmNfdW5pdHMgfVxuXHRcdC8vIHsgbW92ZVRpbWU6IGR1cmF0aW9uX2luX2FiY191bml0cyB9XG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGd1aXRhciBjaG9yZHMsIHRoZW4gdGhleSBhcmUgcHV0IGluIGEgc2VwYXJhdGUgdHJhY2ssIGJ1dCB0aGV5IGhhdmUgdGhlIHNhbWUgZm9ybWF0LlxuXHRcdC8vXG5cblx0XHR2YXIgdm9sdW1lO1xuXHRcdGlmIChuZXh0Vm9sdW1lKSB7XG5cdFx0XHR2b2x1bWUgPSBuZXh0Vm9sdW1lO1xuXHRcdFx0bmV4dFZvbHVtZSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCFkb0JlYXRBY2NlbnRzKSB7XG5cdFx0XHR2b2x1bWUgPSBzdHJlc3NCZWF0RG93bjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJhckJlYXQgPT09IDApXG5cdFx0XHRcdHZvbHVtZSA9IHN0cmVzc0JlYXQxO1xuXHRcdFx0ZWxzZSBpZiAoYmFyQmVhdCAlIGJlYXRGcmFjdGlvbiA8IDAuMDAxKSAvLyBBIGxpdHRsZSBzbG9wIGJlY2F1c2Ugb2YgSmF2YVNjcmlwdCBmbG9hdGluZyBwb2ludCBtYXRoLlxuXHRcdFx0XHR2b2x1bWUgPSBzdHJlc3NCZWF0RG93bjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dm9sdW1lID0gc3RyZXNzQmVhdFVwO1xuXHRcdH1cblx0XHRpZiAobmV4dFZvbHVtZURlbHRhKSB7XG5cdFx0XHR2b2x1bWUgKz0gbmV4dFZvbHVtZURlbHRhO1xuXHRcdFx0bmV4dFZvbHVtZURlbHRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAodm9sdW1lIDwgMClcblx0XHRcdHZvbHVtZSA9IDA7XG5cdFx0aWYgKHZvbHVtZSA+IDEyNylcblx0XHRcdHZvbHVtZSA9IDEyNztcblx0XHR2YXIgdmVsb2NpdHkgPSB2b2ljZU9mZiA/IDAgOiB2b2x1bWU7XG5cdFx0dmFyIGNob3JkID0gZmluZENob3JkKGVsZW0pO1xuXHRcdGlmIChjaG9yZCkge1xuXHRcdFx0dmFyIGMgPSBpbnRlcnByZXRDaG9yZChjaG9yZCk7XG5cdFx0XHQvLyBJZiB0aGlzIGlzbid0IGEgcmVjb2duaXplZCBjaG9yZCwganVzdCBjb21wbGV0ZWx5IGlnbm9yZSBpdC5cblx0XHRcdGlmIChjKSB7XG5cdFx0XHRcdC8vIElmIHdlIGV2ZXIgaGF2ZSBhIGNob3JkIGluIHRoaXMgdm9pY2UsIHRoZW4gd2UgYWRkIHRoZSBjaG9yZCB0cmFjay5cblx0XHRcdFx0Ly8gSG93ZXZlciwgaWYgdGhlcmUgYXJlIGNob3JkcyBvbiBtb3JlIHRoYW4gb25lIHZvaWNlLCB0aGVuIGp1c3QgdXNlIHRoZSBmaXJzdCB2b2ljZS5cblx0XHRcdFx0aWYgKGNob3JkVHJhY2subGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Y2hvcmRUcmFjay5wdXNoKHtjbWQ6ICdwcm9ncmFtJywgY2hhbm5lbDogY2hvcmRDaGFubmVsLCBpbnN0cnVtZW50OiBjaG9yZEluc3RydW1lbnR9KTtcblx0XHRcdFx0XHQvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGZhciBpbiB0aW1lIHRoZSBjaG9yZCBzdGFydGVkOiBpZiB0aGVyZSBhcmUgcGlja3VwIG5vdGVzIGJlZm9yZSB0aGUgY2hvcmRzIHN0YXJ0LCB3ZSBuZWVkIHBhdXNlcy5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSB0aW1lRnJvbVN0YXJ0KCk7XG5cdFx0XHRcdFx0aWYgKGRpc3RhbmNlID4gMClcblx0XHRcdFx0XHRcdGNob3JkVHJhY2sucHVzaCh7Y21kOiAnbW92ZScsIGR1cmF0aW9uOiBkaXN0YW5jZSp0ZW1wb0NoYW5nZUZhY3RvciB9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxhc3RDaG9yZCA9IGM7XG5cdFx0XHRcdGN1cnJlbnRDaG9yZHMucHVzaCh7Y2hvcmQ6IGxhc3RDaG9yZCwgYmVhdDogYmFyQmVhdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChlbGVtLnN0YXJ0VHJpcGxldCkge1xuXHRcdFx0bXVsdGlwbGllciA9IGVsZW0udHJpcGxldE11bHRpcGxpZXI7XG5cdFx0fVxuXG5cdFx0dmFyIGR1cmF0aW9uID0gKGVsZW0uZHVyYXRpb25DbGFzcyA/IGVsZW0uZHVyYXRpb25DbGFzcyA6IGVsZW0uZHVyYXRpb24pICptdWx0aXBsaWVyO1xuXHRcdGJhckJlYXQgKz0gZHVyYXRpb247XG5cblx0XHQvLyBpZiB0aGVyZSBhcmUgZ3JhY2Ugbm90ZXMsIHRoZW4gYWxzbyBwbGF5IHRoZW0uXG5cdFx0Ly8gSSdtIG5vdCBzdXJlIHRoZXJlIGlzIGFuIGV4YWN0IHJ1bGUgZm9yIHRoZSBsZW5ndGggb2YgdGhlIG5vdGVzLiBNeSBydWxlLCB1bmxlc3MgSSBmaW5kXG5cdFx0Ly8gYSBiZXR0ZXIgb25lIGlzOiB0aGUgZ3JhY2Ugbm90ZXMgY2Fubm90IHRha2UgbW9yZSB0aGFuIDEvMiBvZiB0aGUgbWFpbiBub3RlJ3MgdmFsdWUuXG5cdFx0Ly8gQSBncmFjZSBub3RlIChvZiAxLzggbm90ZSBkdXJhdGlvbikgdGFrZXMgMS84IG9mIHRoZSBtYWluIG5vdGUncyB2YWx1ZS5cblx0XHR2YXIgZ3JhY2VzO1xuXHRcdGlmIChlbGVtLmdyYWNlbm90ZXMpIHtcblx0XHRcdC8vIFRoZXJlIGFyZSB0d28gY2FzZXM6IGlmIHRoaXMgaXMgYmFncGlwZSwgdGhlIGdyYWNlIG5vdGVzIGFyZSBwbGF5ZWQgb24gdGhlIGJlYXQgd2l0aCB0aGUgY3VycmVudCBub3RlLlxuXHRcdFx0Ly8gTm9ybWFsbHksIHRoZSBncmFjZSBub3RlcyB3b3VsZCBiZSBwbGF5ZWQgYmVmb3JlIHRoZSBiZWF0LiAoSWYgdGhpcyBpcyB0aGUgZmlyc3Qgbm90ZSBpbiB0aGUgdHJhY2ssIGhvd2V2ZXIsIHRoZW4gaXQgaXMgcGxheWVkIG9uIHRoZSBjdXJyZW50IGJlYXQuKVxuXHRcdFx0Ly8gVGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbiBvbiB0aGUgZmlyc3Qgbm90ZSBpcyB0aGF0IGl0IHdvdWxkIG90aGVyd2lzZSBtb3ZlIHRoZSB3aG9sZSB0cmFjayBpbiB0aW1lIGFuZCB3b3VsZCBhZmZlY3QgYWxsIHRoZSBvdGhlciB0cmFja3MuXG5cdFx0XHR2YXIgc3RlYWxGcm9tQ3VycmVudCA9IChiYWdwaXBlcyB8fCBsYXN0Tm90ZUR1cmF0aW9uUG9zaXRpb24gPCAwIHx8IGN1cnJlbnRUcmFjay5sZW5ndGggPT09IDApO1xuXHRcdFx0dmFyIHN0ZWFsRnJvbUR1cmF0aW9uID0gc3RlYWxGcm9tQ3VycmVudCA/IGR1cmF0aW9uIDogY3VycmVudFRyYWNrW2xhc3ROb3RlRHVyYXRpb25Qb3NpdGlvbl0uZHVyYXRpb247XG5cdFx0XHRncmFjZXMgPSBwcm9jZXNzR3JhY2VOb3RlcyhlbGVtLmdyYWNlbm90ZXMsIHN0ZWFsRnJvbUR1cmF0aW9uKTtcblx0XHRcdGlmICghYmFncGlwZXMpIHtcblx0XHRcdFx0ZHVyYXRpb24gPSB3cml0ZUdyYWNlTm90ZXMoZ3JhY2VzLCBzdGVhbEZyb21DdXJyZW50LCBkdXJhdGlvbiwgbnVsbCwgdmVsb2NpdHkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRoZSBjdXJyZW50VHJhY2tDb3VudGVyIGlzIHRoZSBudW1iZXIgb2Ygd2hvbGUgbm90ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwaWVjZS5cblx0XHQvLyBUaGUgYmVhdCBmcmFjdGlvbiBpcyB0aGUgbm90ZSB0aGF0IGdldHMgYSBiZWF0ICguMjUgaXMgYSBxdWFydGVyIG5vdGUpXG5cdFx0Ly8gVGhlIHRlbXBvIGlzIGluIG1pbnV0ZXMgYW5kIHdlIHdhbnQgdG8gZ2V0IHRvIG1pbGxpc2Vjb25kcy5cblx0XHRpZiAoIWVsZW0uY3VycmVudFRyYWNrTWlsbGlzZWNvbmRzKVxuXHRcdFx0ZWxlbS5jdXJyZW50VHJhY2tNaWxsaXNlY29uZHMgPSBbXTtcblx0XHRlbGVtLmN1cnJlbnRUcmFja01pbGxpc2Vjb25kcy5wdXNoKGN1cnJlbnRUcmFja0NvdW50ZXIgLyBiZWF0RnJhY3Rpb24gLyBzdGFydGluZ1RlbXBvICogNjAqMTAwMCk7XG5cdFx0aWYgKGVsZW0ucGl0Y2hlcykge1xuXHRcdFx0aWYgKGdyYWNlcyAmJiBiYWdwaXBlcykge1xuXHRcdFx0XHQvLyBJZiBpdCBpcyBiYWdwaXBlcywgdGhlbiB0aGUgZ3JhY2VzIGFyZSBwbGF5ZWQgd2l0aCB0aGUgbm90ZS4gSWYgdGhlIGdyYWNlIGhhcyB0aGUgc2FtZSBwaXRjaCBhcyB0aGUgbm90ZSwgdGhlbiB3ZSBqdXN0IHNraXAgaXQuXG5cdFx0XHRcdGR1cmF0aW9uID0gd3JpdGVHcmFjZU5vdGVzKGdyYWNlcywgdHJ1ZSwgZHVyYXRpb24sIG51bGwsIHZlbG9jaXR5KTtcblx0XHRcdH1cblx0XHRcdHZhciBwaXRjaGVzID0gW107XG5cdFx0XHRlbGVtLm1pZGlQaXRjaGVzID0gW107XG5cdFx0XHRmb3IgKHZhciBpPTA7IGk8ZWxlbS5waXRjaGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBub3RlID0gZWxlbS5waXRjaGVzW2ldO1xuXHRcdFx0XHR2YXIgYWN0dWFsUGl0Y2ggPSBhZGp1c3RQaXRjaChub3RlKTtcblx0XHRcdFx0cGl0Y2hlcy5wdXNoKHsgcGl0Y2g6IGFjdHVhbFBpdGNoLCBzdGFydFRpZTogbm90ZS5zdGFydFRpZSB9KTtcblx0XHRcdFx0ZWxlbS5taWRpUGl0Y2hlcy5wdXNoKHsgcGl0Y2g6IGFjdHVhbFBpdGNoKzYwLCBkdXJhdGlvbkluTWVhc3VyZXM6IGR1cmF0aW9uKnRlbXBvQ2hhbmdlRmFjdG9yLCB2b2x1bWU6IHZvbHVtZSwgaW5zdHJ1bWVudDogY3VycmVudEluc3RydW1lbnQgfSk7IC8vIFRPRE8tUEVSOiB3aHkgaXMgdGhlIGludGVybmFsIG51bWJlcmluZyBzeXN0ZW0gb2Zmc2V0IGJ5IDYwIGZyb20gbWlkaT8gSXQgc2hvdWxkIHByb2JhYmx5IGJlIHRoZSBzYW1lIGFzIG1pZGkuXG5cblx0XHRcdFx0aWYgKCFwaXRjaGVzVGllZFsnJythY3R1YWxQaXRjaF0pXHQvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgbm90ZSBvZiBhIHRpZSwgd2UgZG9uJ3Qgc3RhcnQgaXQgYWdhaW4uXG5cdFx0XHRcdFx0Y3VycmVudFRyYWNrLnB1c2goeyBjbWQ6ICdzdGFydCcsIHBpdGNoOiBhY3R1YWxQaXRjaCwgdm9sdW1lOiB2ZWxvY2l0eSB9KTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYnV0IHdlIGRvIGFkZCB0aGUgZHVyYXRpb24gdG8gd2hhdCB3ZSBjYWxsIGJhY2suXG5cdFx0XHRcdFx0Zm9yICh2YXIgbGFzdCA9IGN1cnJlbnRUcmFjay5sZW5ndGgtMTsgbGFzdCA+PSAwOyBsYXN0LS0pIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50VHJhY2tbbGFzdF0uY21kID09PSAnc3RhcnQnICYmIGN1cnJlbnRUcmFja1tsYXN0XS5waXRjaCA9PT0gYWN0dWFsUGl0Y2ggJiYgY3VycmVudFRyYWNrW2xhc3RdLmVsZW0pIHtcblx0XHRcdFx0XHRcdFx0dmFyIHBpdGNoQXJyYXkgPSBjdXJyZW50VHJhY2tbbGFzdF0uZWxlbS5taWRpUGl0Y2hlcztcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgbGFzdDIgPSAwOyBsYXN0MiA8IHBpdGNoQXJyYXkubGVuZ3RoOyBsYXN0MisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBpdGNoQXJyYXlbbGFzdDJdLnBpdGNoLTYwID09PSBhY3R1YWxQaXRjaCkgeyAvLyBUT0RPLVBFUjogdGhlIDYwIGlzIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBtaWRpIHBpdGNoIG51bWJlcnMgYWdhaW4uXG5cdFx0XHRcdFx0XHRcdFx0XHRwaXRjaEFycmF5W2xhc3QyXS5kdXJhdGlvbkluTWVhc3VyZXMgKz0gZHVyYXRpb24gKiB0ZW1wb0NoYW5nZUZhY3Rvcjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG5vdGUuc3RhcnRUaWUpIHtcblx0XHRcdFx0XHRwaXRjaGVzVGllZFsnJyArIGFjdHVhbFBpdGNoXSA9IHRydWU7XG5cdFx0XHRcdFx0Y3VycmVudFRyYWNrW2N1cnJlbnRUcmFjay5sZW5ndGgtMV0uZWxlbSA9IGVsZW07XG5cdFx0XHRcdH0gZWxzZSBpZiAobm90ZS5lbmRUaWUpXG5cdFx0XHRcdFx0cGl0Y2hlc1RpZWRbJycrYWN0dWFsUGl0Y2hdID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZWxlbS5ncmFjZW5vdGVzKSB7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgZWxlbS5ncmFjZW5vdGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZWxlbS5taWRpR3JhY2VOb3RlUGl0Y2hlcyA9IFtdO1xuXHRcdFx0XHRcdHZhciBncmFjZSA9IGVsZW0uZ3JhY2Vub3Rlc1tqXTtcblx0XHRcdFx0XHRlbGVtLm1pZGlHcmFjZU5vdGVQaXRjaGVzLnB1c2goeyBwaXRjaDogYWRqdXN0UGl0Y2goZ3JhY2UpKzYwLCBkdXJhdGlvbkluTWVhc3VyZXM6IDAsIHZvbHVtZTogdm9sdW1lLCBpbnN0cnVtZW50OiBjdXJyZW50SW5zdHJ1bWVudH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR2YXIgdGhpc0JyZWFrQmV0d2Vlbk5vdGVzID0gbm9ybWFsQnJlYWtCZXR3ZWVuTm90ZXM7XG5cdFx0XHR2YXIgc291bmREdXJhdGlvbiA9IGR1cmF0aW9uLW5vcm1hbEJyZWFrQmV0d2Vlbk5vdGVzO1xuXHRcdFx0aWYgKHNvdW5kRHVyYXRpb24gPCAwKSB7XG5cdFx0XHRcdHNvdW5kRHVyYXRpb24gPSAwO1xuXHRcdFx0XHR0aGlzQnJlYWtCZXR3ZWVuTm90ZXMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudFRyYWNrLnB1c2goeyBjbWQ6ICdtb3ZlJywgZHVyYXRpb246IHNvdW5kRHVyYXRpb24qdGVtcG9DaGFuZ2VGYWN0b3IgfSk7XG5cdFx0XHRsYXN0Tm90ZUR1cmF0aW9uUG9zaXRpb24gPSBjdXJyZW50VHJhY2subGVuZ3RoLTE7XG5cdFx0XHRjdXJyZW50VHJhY2tDb3VudGVyICs9IHNvdW5kRHVyYXRpb24qdGVtcG9DaGFuZ2VGYWN0b3I7XG5cblx0XHRcdGZvciAodmFyIGlpID0gMDsgaWkgPCBwaXRjaGVzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRpZiAoIXBpdGNoZXNUaWVkWycnK3BpdGNoZXNbaWldLnBpdGNoXSlcblx0XHRcdFx0XHRjdXJyZW50VHJhY2sucHVzaCh7IGNtZDogJ3N0b3AnLCBwaXRjaDogcGl0Y2hlc1tpaV0ucGl0Y2ggfSk7XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50VHJhY2sucHVzaCh7IGNtZDogJ21vdmUnLCBkdXJhdGlvbjogdGhpc0JyZWFrQmV0d2Vlbk5vdGVzKnRlbXBvQ2hhbmdlRmFjdG9yIH0pO1xuXHRcdFx0Y3VycmVudFRyYWNrQ291bnRlciArPSB0aGlzQnJlYWtCZXR3ZWVuTm90ZXMqdGVtcG9DaGFuZ2VGYWN0b3I7XG5cdFx0fSBlbHNlIGlmIChlbGVtLnJlc3QpIHtcblx0XHRcdGN1cnJlbnRUcmFjay5wdXNoKHsgY21kOiAnbW92ZScsIGR1cmF0aW9uOiBkdXJhdGlvbip0ZW1wb0NoYW5nZUZhY3RvciB9KTtcblx0XHRcdGN1cnJlbnRUcmFja0NvdW50ZXIgKz0gZHVyYXRpb24qdGVtcG9DaGFuZ2VGYWN0b3I7XG5cdFx0fVxuXG5cdFx0aWYgKGVsZW0uZW5kVHJpcGxldCkge1xuXHRcdFx0bXVsdGlwbGllcj0xO1xuXHRcdH1cblx0fVxuXG5cdHZhciBzY2FsZSA9IFswLDIsNCw1LDcsOSwxMV07XG5cdGZ1bmN0aW9uIGFkanVzdFBpdGNoKG5vdGUpIHtcblx0XHRpZiAobm90ZS5taWRpcGl0Y2gpXG5cdFx0XHRyZXR1cm4gbm90ZS5taWRpcGl0Y2ggLSA2MDtcblx0XHR2YXIgcGl0Y2ggPSBub3RlLnBpdGNoO1xuXHRcdGlmIChub3RlLmFjY2lkZW50YWwpIHtcblx0XHRcdHN3aXRjaChub3RlLmFjY2lkZW50YWwpIHsgLy8gY2hhbmdlIHRoYXQgcGl0Y2ggKG5vdCBvdGhlciBvY3RhdmVzKSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJhclxuXHRcdFx0XHRjYXNlIFwic2hhcnBcIjpcblx0XHRcdFx0XHRiYXJBY2NpZGVudGFsc1twaXRjaF09MTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmbGF0XCI6XG5cdFx0XHRcdFx0YmFyQWNjaWRlbnRhbHNbcGl0Y2hdPS0xOyBicmVhaztcblx0XHRcdFx0Y2FzZSBcIm5hdHVyYWxcIjpcblx0XHRcdFx0XHRiYXJBY2NpZGVudGFsc1twaXRjaF09MDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJkYmxzaGFycFwiOlxuXHRcdFx0XHRcdGJhckFjY2lkZW50YWxzW3BpdGNoXT0yOyBicmVhaztcblx0XHRcdFx0Y2FzZSBcImRibGZsYXRcIjpcblx0XHRcdFx0XHRiYXJBY2NpZGVudGFsc1twaXRjaF09LTI7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBhY3R1YWxQaXRjaCA9IGV4dHJhY3RPY3RhdmUocGl0Y2gpICoxMiArIHNjYWxlW2V4dHJhY3ROb3RlKHBpdGNoKV07XG5cblx0XHRpZiAoIGJhckFjY2lkZW50YWxzW3BpdGNoXSE9PXVuZGVmaW5lZCkge1xuXHRcdFx0YWN0dWFsUGl0Y2ggKz0gIGJhckFjY2lkZW50YWxzW3BpdGNoXTtcblx0XHR9IGVsc2UgeyAvLyB1c2Ugbm9ybWFsIGFjY2lkZW50YWxzXG5cdFx0XHRhY3R1YWxQaXRjaCArPSAgYWNjaWRlbnRhbHNbZXh0cmFjdE5vdGUocGl0Y2gpXTtcblx0XHR9XG5cdFx0YWN0dWFsUGl0Y2ggKz0gdHJhbnNwb3NlO1xuXHRcdHJldHVybiBhY3R1YWxQaXRjaDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNldEtleVNpZ25hdHVyZShlbGVtKSB7XG5cdFx0dmFyIGFjY2lkZW50YWxzID0gWzAsMCwwLDAsMCwwLDBdO1xuXHRcdGlmICghZWxlbS5hY2NpZGVudGFscykgcmV0dXJuIGFjY2lkZW50YWxzO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS5hY2NpZGVudGFscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFjYyA9IGVsZW0uYWNjaWRlbnRhbHNbaV07XG5cdFx0XHR2YXIgZCA9IChhY2MuYWNjID09PSBcInNoYXJwXCIpID8gMSA6IChhY2MuYWNjID09PSBcIm5hdHVyYWxcIikgPzAgOiAtMTtcblxuXHRcdFx0dmFyIGxvd2VyY2FzZSA9IGFjYy5ub3RlLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR2YXIgbm90ZSA9IGV4dHJhY3ROb3RlKGxvd2VyY2FzZS5jaGFyQ29kZUF0KDApLSdjJy5jaGFyQ29kZUF0KDApKTtcblx0XHRcdGFjY2lkZW50YWxzW25vdGVdKz1kO1xuXHRcdH1cblx0XHRyZXR1cm4gYWNjaWRlbnRhbHM7XG5cdH1cblxuXHR2YXIgZ3JhY2VEaXZpZGVyID0gODsgLy8gVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgYSBub3RlIHRoYXQgdGhlIGdyYWNlIHJlcHJlc2VudHMuIFRoYXQgaXMsIGlmIHRoaXMgaXMgMiwgdGhlbiBhIGdyYWNlIG5vdGUgb2YgMS8xNiB3b3VsZCBiZSBhIDEvMzIuXG5cdGZ1bmN0aW9uIHByb2Nlc3NHcmFjZU5vdGVzKGdyYWNlcywgY29tcGFuaW9uRHVyYXRpb24pIHtcblx0XHR2YXIgZ3JhY2VEdXJhdGlvbiA9IDA7XG5cdFx0dmFyIHJldCA9IFtdO1xuXHRcdHZhciBncmFjZTtcblx0XHRmb3IgKHZhciBnID0gMDsgZyA8IGdyYWNlcy5sZW5ndGg7IGcrKykge1xuXHRcdFx0Z3JhY2UgPSBncmFjZXNbZ107XG5cdFx0XHRncmFjZUR1cmF0aW9uICs9IGdyYWNlLmR1cmF0aW9uO1xuXHRcdH1cblx0XHRncmFjZUR1cmF0aW9uID0gZ3JhY2VEdXJhdGlvbiAvIGdyYWNlRGl2aWRlcjtcblx0XHR2YXIgbXVsdGlwbGllciA9IChncmFjZUR1cmF0aW9uICogMiA+IGNvbXBhbmlvbkR1cmF0aW9uKSA/IGNvbXBhbmlvbkR1cmF0aW9uLyhncmFjZUR1cmF0aW9uICogMikgOiAxO1xuXG5cdFx0Zm9yIChnID0gMDsgZyA8IGdyYWNlcy5sZW5ndGg7IGcrKykge1xuXHRcdFx0Z3JhY2UgPSBncmFjZXNbZ107XG5cdFx0XHR2YXIgcGl0Y2ggPSBncmFjZS5taWRpcGl0Y2ggPyBncmFjZS5taWRpcGl0Y2ggLSA2MCA6IGdyYWNlLnBpdGNoO1xuXHRcdFx0cmV0LnB1c2goeyBwaXRjaDogcGl0Y2gsIGR1cmF0aW9uOiBncmFjZS5kdXJhdGlvbi9ncmFjZURpdmlkZXIqbXVsdGlwbGllciB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyaXRlR3JhY2VOb3RlcyhncmFjZXMsIHN0ZWFsRnJvbUN1cnJlbnQsIGR1cmF0aW9uLCBza2lwTm90ZSwgdmVsb2NpdHkpIHtcblx0XHRmb3IgKHZhciBnID0gMDsgZyA8IGdyYWNlcy5sZW5ndGg7IGcrKykge1xuXHRcdFx0dmFyIGdwID0gZ3JhY2VzW2ddO1xuXHRcdFx0aWYgKGdwICE9PSBza2lwTm90ZSlcblx0XHRcdFx0Y3VycmVudFRyYWNrLnB1c2goe2NtZDogJ3N0YXJ0JywgcGl0Y2g6IGdwLnBpdGNoLCB2b2x1bWU6IHZlbG9jaXR5fSk7XG5cdFx0XHRjdXJyZW50VHJhY2sucHVzaCh7Y21kOiAnbW92ZScsIGR1cmF0aW9uOiBncmFjZXNbZ10uZHVyYXRpb24qdGVtcG9DaGFuZ2VGYWN0b3IgfSk7XG5cdFx0XHRpZiAoZ3AgIT09IHNraXBOb3RlKVxuXHRcdFx0XHRjdXJyZW50VHJhY2sucHVzaCh7Y21kOiAnc3RvcCcsIHBpdGNoOiBncC5waXRjaH0pO1xuXHRcdFx0aWYgKCFzdGVhbEZyb21DdXJyZW50KVxuXHRcdFx0XHRjdXJyZW50VHJhY2tbbGFzdE5vdGVEdXJhdGlvblBvc2l0aW9uXS5kdXJhdGlvbiAtPSBncmFjZXNbZ10uZHVyYXRpb247XG5cdFx0XHRkdXJhdGlvbiAtPSBncmFjZXNbZ10uZHVyYXRpb247XG5cdFx0fVxuXHRcdHJldHVybiBkdXJhdGlvbjtcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dHJhY3RPY3RhdmUocGl0Y2gpIHtcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihwaXRjaC83KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dHJhY3ROb3RlKHBpdGNoKSB7XG5cdFx0cGl0Y2ggPSBwaXRjaCU3O1xuXHRcdGlmIChwaXRjaDwwKSBwaXRjaCs9Nztcblx0XHRyZXR1cm4gcGl0Y2g7XG5cdH1cblxuXHR2YXIgYmFzc2VzID0ge1xuXHRcdCdBJzogLTI3LCAnQic6IC0yNSwgJ0MnOiAtMjQsICdEJzogLTIyLCAnRSc6IC0yMCwgJ0YnOiAtMTksICdHJzogLTE3XG5cdH07XG5cdGZ1bmN0aW9uIGludGVycHJldENob3JkKG5hbWUpIHtcblx0XHQvLyBjaG9yZHMgaGF2ZSB0aGUgZm9ybWF0OlxuXHRcdC8vIFtyb290XVthY2NdW21vZGlmaWVyXVsvXVtiYXNzXVthY2NdXG5cdFx0Ly8gKFRoZSBjaG9yZCBtaWdodCBiZSBzdXJyb3VuZGVkIGJ5IHBhcmVucy4gSnVzdCBpZ25vcmUgdGhlbS4pXG5cdFx0Ly8gcm9vdCBtdXN0IGJlIHByZXNlbnQgYW5kIG11c3QgYmUgZnJvbSBBLUcuXG5cdFx0Ly8gYWNjIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgIyBvciBiXG5cdFx0Ly8gVGhlIG1vZGlmaWVyIGNhbiBiZSBhIHdpZGUgdmFyaWV0eSBvZiB0aGluZ3MsIGxpa2UgXCJtYWo3XCIuIEFzIHRoZXkgYXJlIGRpc2NvdmVyZWQsIG1vcmUgYXJlIHN1cHBvcnRlZCBoZXJlLlxuXHRcdC8vIElmIHRoZXJlIGlzIGEgc2xhc2gsIHRoZW4gdGhlcmUgaXMgYSBiYXNzIG5vdGUsIHdoaWNoIGNhbiBiZSBmcm9tIEEtRywgd2l0aCBhbiBvcHRpb25hbCBhY2MuXG5cdFx0Ly8gSWYgdGhlIHJvb3QgaXMgdW5yZWNvZ25pemVkLCB0aGVuIFwidW5kZWZpbmVkXCIgaXMgcmV0dXJuZWQgYW5kIHRoZXJlIGlzIG5vIGNob3JkLlxuXHRcdC8vIElmIHRoZSBtb2RpZmllciBpcyB1bnJlY29nbml6ZWQsIGEgbWFqb3IgdHJpYWQgaXMgcmV0dXJuZWQuXG5cdFx0Ly8gSWYgdGhlIGJhc3Mgbm90ZXMgaXMgdW5yZWNvZ25pemVkLCBpdCBpcyBpZ25vcmVkLlxuXHRcdGlmIChuYW1lLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0aWYgKG5hbWUgPT09ICdicmVhaycpXG5cdFx0XHRyZXR1cm4geyBjaGljazogW119O1xuXHRcdHZhciByb290ID0gbmFtZS5zdWJzdHJpbmcoMCwxKTtcblx0XHRpZiAocm9vdCA9PT0gJygnKSB7XG5cdFx0XHRuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSxuYW1lLmxlbmd0aC0yKTtcblx0XHRcdGlmIChuYW1lLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdHJvb3QgPSBuYW1lLnN1YnN0cmluZygwLDEpO1xuXHRcdH1cblx0XHR2YXIgYmFzcyA9IGJhc3Nlc1tyb290XTtcblx0XHRpZiAoIWJhc3MpXHQvLyBJZiB0aGUgYmFzcyBub3RlIGlzbid0IGxpc3RlZCwgdGhlbiB0aGlzIHdhcyBhbiB1bmtub3duIHJvb3QuIE9ubHkgQS1HIGFyZSBhY2NlcHRlZC5cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0YmFzcyAgKz0gdHJhbnNwb3NlO1xuXHRcdHZhciBiYXNzMiA9IGJhc3MgLSA1O1x0Ly8gVGhlIGFsdGVybmF0aW5nIGJhc3MgaXMgYSA0dGggYmVsb3dcblx0XHR2YXIgY2hpY2s7XG5cdFx0aWYgKG5hbWUubGVuZ3RoID09PSAxKVxuXHRcdFx0Y2hpY2sgPSBjaG9yZE5vdGVzKGJhc3MsICcnKTtcblx0XHR2YXIgcmVtYWluaW5nID0gbmFtZS5zdWJzdHJpbmcoMSk7XG5cdFx0dmFyIGFjYyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoMCwxKTtcblx0XHRpZiAoYWNjID09PSAnYicgfHwgYWNjID09PSAn4pmtJykge1xuXHRcdFx0YmFzcy0tO1xuXHRcdFx0YmFzczItLTtcblx0XHRcdHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoMSk7XG5cdFx0fSBlbHNlIGlmIChhY2MgPT09ICcjJyB8fCBhY2MgPT09ICfima8nKSB7XG5cdFx0XHRiYXNzKys7XG5cdFx0XHRiYXNzMisrO1xuXHRcdFx0cmVtYWluaW5nID0gcmVtYWluaW5nLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0dmFyIGFyciA9IHJlbWFpbmluZy5zcGxpdCgnLycpO1xuXHRcdGNoaWNrID0gY2hvcmROb3RlcyhiYXNzLCBhcnJbMF0pO1xuXHRcdGlmIChhcnIubGVuZ3RoID09PSAyKSB7XG5cdFx0XHR2YXIgZXhwbGljaXRCYXNzID0gYmFzc2VzW2FyclsxXS5zdWJzdHJpbmcoMCwxKV07XG5cdFx0XHRpZiAoZXhwbGljaXRCYXNzKSB7XG5cdFx0XHRcdHZhciBiYXNzQWNjID0gYXJyWzFdLnN1YnN0cmluZygxKTtcblx0XHRcdFx0dmFyIGJhc3NTaGlmdCA9IHsnIyc6IDEsICfima8nOiAxLCAnYic6IC0xLCAn4pmtJzogLTF9W2Jhc3NBY2NdIHx8IDA7XG5cdFx0XHRcdGJhc3MgPSBiYXNzZXNbYXJyWzFdLnN1YnN0cmluZygwLDEpXSArIGJhc3NTaGlmdCArIHRyYW5zcG9zZTtcblx0XHRcdFx0YmFzczIgPSBiYXNzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geyBib29tOiBiYXNzLCBib29tMjogYmFzczIsIGNoaWNrOiBjaGljayB9O1xuXHR9XG5cblx0dmFyIGNob3JkSW50ZXJ2YWxzID0ge1xuXHRcdC8vIGRpbWluaXNoZWQgKGFsbCBmbGF0IDUgY2hvcmRzKVxuXHRcdCdkaW0nOiBbIDAsIDMsIDYgXSxcblx0XHQnwrAnOiBbIDAsIDMsIDYgXSxcblx0XHQny5onOiBbIDAsIDMsIDYgXSxcblxuXHRcdCdkaW03JzogWyAwLCAzLCA2LCA5IF0sXG5cdFx0J8KwNyc6IFsgMCwgMywgNiwgOSBdLFxuXHRcdCfLmjcnOiBbIDAsIDMsIDYsIDkgXSxcblxuXHRcdCfDuDcnOiBbIDAsIDMsIDYsIDEwIF0sXG5cdFx0J203KGI1KSc6IFsgMCwgMywgNiwgMTAgXSxcblx0XHQnbTdiNSc6IFsgMCwgMywgNiwgMTAgXSxcblx0XHQnLTcoYjUpJzogWyAwLCAzLCA2LCAxMCBdLFxuXHRcdCctN2I1JzogWyAwLCAzLCA2LCAxMCBdLFxuXG5cdFx0JzdiNSc6IFsgMCwgNCwgNiwgMTAgXSxcblx0XHQnNyhiNSknOiBbIDAsIDQsIDYsIDEwIF0sXG5cdFx0Jzfima01JzogWyAwLCA0LCA2LCAxMCBdLFxuXG5cdFx0JzcoYjksYjUpJzogWyAwLCA0LCA2LCAxMCwgMTMgXSxcblx0XHQnN2I5LGI1JzogWyAwLCA0LCA2LCAxMCwgMTMgXSxcblx0XHQnNygjOSxiNSknOiBbIDAsIDQsIDYsIDEwLCAxNSBdLFxuXHRcdCc3IzliNSc6IFsgMCwgNCwgNiwgMTAsIDE1IF0sXG5cdFx0J21hajcoYjUpJzogWyAwLCAzLCA2LCAxMSBdLFxuXHRcdCdtYWo3YjUnOiBbIDAsIDMsIDYsIDExIF0sXG5cdFx0JzEzKGI1KSc6IFsgMCwgNCwgNiwgMTAsIDE0LCAxOCBdLFxuXHRcdCcxM2I1JzogWyAwLCA0LCA2LCAxMCwgMTQsIDE4IF0sXG5cblx0XHQvLyBtaW5vciAoYWxsIG5vcm1hbCA1LCBtaW5vciAzIGNob3Jkcylcblx0XHQnbSc6IFsgMCwgMywgNyBdLFxuXHRcdCctJzogWyAwLCAzLCA3IF0sXG5cdFx0J202JzogWyAwLCAzLCA3LCA5IF0sXG5cdFx0Jy02JzogWyAwLCAzLCA3LCA5IF0sXG5cdFx0J203JzogWyAwLCAzLCA3LCAxMCBdLFxuXHRcdCctNyc6IFsgMCwgMywgNywgMTAgXSxcblxuXHRcdCctKGI2KSc6IFsgMCwgMywgNywgOCBdLFxuXHRcdCctYjYnOiBbIDAsIDMsIDcsIDggXSxcblx0XHQnLTYvOSc6IFsgMCwgMywgNywgOSwgMTQgXSxcblx0XHQnLTcoYjkpJzogWyAwLCAzLCA3LCAxMCwgMTMgXSxcblx0XHQnLTdiOSc6IFsgMCwgMywgNywgMTAsIDEzIF0sXG5cdFx0Jy1tYWo3JzogWyAwLCAzLCA3LCAxMSBdLFxuXHRcdCctOSs3JzogWyAwLCAzLCA3LCAxMSwgMTMgXSxcblx0XHQnLTExJzogWyAgMCwgMywgNywgMTEsIDE0LCAxNiBdLFxuXG5cdFx0Ly8gbWFqb3IgKGFsbCBub3JtYWwgNSwgbWFqb3IgMyBjaG9yZHMpXG5cdFx0J00nOiBbIDAsIDQsIDcgXSxcblx0XHQnNic6IFsgMCwgNCwgNywgOSBdLFxuXHRcdCc2LzknOiBbIDAsIDQsIDcsIDksIDE0IF0sXG5cblx0XHQnNyc6IFsgMCwgNCwgNywgMTAgXSxcblx0XHQnOSc6IFsgMCwgNCwgNywgMTAsIDE0IF0sXG5cdFx0JzExJzogWyAwLCA0LCA3LCAxMCwgMTQsIDE2IF0sXG5cdFx0JzEzJzogWyAwLCA0LCA3LCAxMCwgMTQsIDE4IF0sXG5cdFx0JzdiOSc6IFsgMCwgNCwgNywgMTAsIDEzIF0sXG5cdFx0Jzfima05JzogWyAwLCA0LCA3LCAxMCwgMTMgXSxcblx0XHQnNyhiOSknOiBbIDAsIDQsIDcsIDEwLCAxMyBdLFxuXHRcdCc3KCM5KSc6IFsgMCwgNCwgNywgMTAsIDE1IF0sXG5cdFx0JzcjOSc6IFsgMCwgNCwgNywgMTAsIDE1IF0sXG5cdFx0JygxMyknOiBbIDAsIDQsIDcsIDEwLCAxNCwgMTggXSxcblx0XHQnNyg5LDEzKSc6IFsgMCwgNCwgNywgMTAsIDE0LCAxOCBdLFxuXHRcdCc3KCM5LGIxMyknOiBbIDAsIDQsIDcsIDEwLCAxNSwgMTcgXSxcblx0XHQnNygjMTEpJzogWyAwLCA0LCA3LCAxMCwgMTQsIDE3IF0sXG5cdFx0JzcjMTEnOiBbIDAsIDQsIDcsIDEwLCAxNCwgMTcgXSxcblx0XHQnNyhiMTMpJzogWyAwLCA0LCA3LCAxMCwgMTcgXSxcblx0XHQnN2IxMyc6IFsgMCwgNCwgNywgMTAsIDE3IF0sXG5cdFx0JzkoIzExKSc6IFsgMCwgNCwgNywgMTAsIDE0LCAxNyBdLFxuXHRcdCc5IzExJzogWyAwLCA0LCA3LCAxMCwgMTQsIDE3IF0sXG5cdFx0JzEzKCMxMSknOiBbIDAsIDQsIDcsIDEwLCAxNSwgMTggXSxcblx0XHQnMTMjMTEnOiBbIDAsIDQsIDcsIDEwLCAxNSwgMTggXSxcblxuXHRcdCdtYWo3JzogWyAwLCA0LCA3LCAxMSBdLFxuXHRcdCfiiIY3JzogWyAwLCA0LCA3LCAxMSBdLFxuXHRcdCfOlDcnOiBbIDAsIDQsIDcsIDExIF0sXG5cdFx0J21hajknOiBbIDAsIDQsIDcsIDExLCAxNCBdLFxuXHRcdCdtYWo3KDkpJzogWyAwLCA0LCA3LCAxMSwgMTQgXSxcblx0XHQnbWFqNygxMSknOiBbIDAsIDQsIDcsIDExLCAxNiBdLFxuXHRcdCdtYWo3KCMxMSknOiBbIDAsIDQsIDcsIDExLCAxNyBdLFxuXHRcdCdtYWo3KDEzKSc6IFsgMCwgNCwgNywgMTEsIDE4IF0sXG5cdFx0J21hajcoOSwxMyknOiBbIDAsIDQsIDcsIDExLCAxNCwgMTggXSxcblxuXHRcdCc3c3VzNCc6IFsgMCwgNSwgNywgMTAgXSxcblx0XHQnbTdzdXM0JzogWyAwLCA1LCA3LCAxMCBdLFxuXHRcdCdzdXM0JzogWyAwLCA1LCA3IF0sXG5cdFx0J3N1czInOiBbIDAsIDIsIDcgXSxcblx0XHQnN3N1czInOiBbIDAsIDIsIDcsIDEwIF0sXG5cdFx0JzlzdXM0JzogWyAwLCA1LCA3LCAxNCBdLFxuXHRcdCcxM3N1czQnOiBbIDAsIDUsIDcsIDE4IF0sXG5cblx0XHQvLyBhdWdtZW50ZWQgKGFsbCBzaGFycCA1IGNob3Jkcylcblx0XHQnYXVnNyc6IFsgMCwgNCwgOCwgMTAgXSxcblx0XHQnKzcnOiBbIDAsIDQsIDgsIDEwIF0sXG5cdFx0JysnOiBbIDAsIDQsIDggXSxcblx0XHQnNyM1JzogWyAwLCA0LCA4LCAxMCBdLFxuXHRcdCc34pmvNSc6IFsgMCwgNCwgOCwgMTAgXSxcblx0XHQnNys1JzogWyAwLCA0LCA4LCAxMCBdLFxuXHRcdCc5IzUnOiBbIDAsIDQsIDgsIDEwLCAxNCBdLFxuXHRcdCc54pmvNSc6IFsgMCwgNCwgOCwgMTAsIDE0IF0sXG5cdFx0JzkrNSc6IFsgMCwgNCwgOCwgMTAsIDE0IF0sXG5cdFx0Jy03KCM1KSc6IFsgMCwgMywgOCwgMTAgXSxcblx0XHQnLTcjNSc6IFsgMCwgMywgOCwgMTAgXSxcblx0XHQnNygjNSknOiBbIDAsIDQsIDgsIDEwIF0sXG5cdFx0JzcoYjksIzUpJzogWyAwLCA0LCA4LCAxMCwgMTMgXSxcblx0XHQnN2I5IzUnOiBbIDAsIDQsIDgsIDEwLCAxMyBdLFxuXHRcdCdtYWo3KCM1KSc6IFsgMCwgNCwgOCwgMTEgXSxcblx0XHQnbWFqNyM1JzogWyAwLCA0LCA4LCAxMSBdLFxuXHRcdCdtYWo3KCM1LCMxMSknOiBbIDAsIDQsIDgsIDExLCAxNCBdLFxuXHRcdCdtYWo3IzUjMTEnOiBbIDAsIDQsIDgsIDExLCAxNCBdLFxuXHRcdCc5KCM1KSc6IFsgMCwgNCwgOCwgMTAsIDE0IF0sXG5cdFx0JzEzKCM1KSc6IFsgMCwgNCwgOCwgMTAsIDE0LCAxOCBdLFxuXHRcdCcxMyM1JzogWyAwLCA0LCA4LCAxMCwgMTQsIDE4IF1cbn07XG5cdGZ1bmN0aW9uIGNob3JkTm90ZXMoYmFzcywgbW9kaWZpZXIpIHtcblx0XHR2YXIgaW50ZXJ2YWxzID0gY2hvcmRJbnRlcnZhbHNbbW9kaWZpZXJdO1xuXHRcdGlmICghaW50ZXJ2YWxzKVxuXHRcdFx0aW50ZXJ2YWxzID0gY2hvcmRJbnRlcnZhbHMuTTtcblx0XHRiYXNzICs9IDEyO1x0Ly8gdGhlIGNob3JkIGlzIGFuIG9jdGF2ZSBhYm92ZSB0aGUgYmFzcyBub3RlLlxuXHRcdHZhciBub3RlcyA9IFsgXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGludGVydmFscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bm90ZXMucHVzaChiYXNzICsgaW50ZXJ2YWxzW2ldKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5vdGVzO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVCb29tKGJvb20sIGJlYXRMZW5ndGgpIHtcblx0XHQvLyB1bmRlZmluZWQgbWVhbnMgdGhlcmUgaXMgYSBzdG9wIHRpbWUuXG5cdFx0aWYgKGJvb20gIT09IHVuZGVmaW5lZClcblx0XHRcdGNob3JkVHJhY2sucHVzaCh7Y21kOiAnc3RhcnQnLCBwaXRjaDogYm9vbSwgdm9sdW1lOiA2NH0pO1xuXHRcdGNob3JkVHJhY2sucHVzaCh7IGNtZDogJ21vdmUnLCBkdXJhdGlvbjogKGJlYXRMZW5ndGgvMikqdGVtcG9DaGFuZ2VGYWN0b3IgfSk7XG5cdFx0aWYgKGJvb20gIT09IHVuZGVmaW5lZClcblx0XHRcdGNob3JkVHJhY2sucHVzaCh7IGNtZDogJ3N0b3AnLCBwaXRjaDogYm9vbSB9KTtcblx0XHRjaG9yZFRyYWNrLnB1c2goeyBjbWQ6ICdtb3ZlJywgZHVyYXRpb246IChiZWF0TGVuZ3RoLzIpKnRlbXBvQ2hhbmdlRmFjdG9yIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVDaGljayhjaGljaywgYmVhdExlbmd0aCkge1xuXHRcdGZvciAodmFyIGMgPSAwOyBjIDwgY2hpY2subGVuZ3RoOyBjKyspXG5cdFx0XHRjaG9yZFRyYWNrLnB1c2goe2NtZDogJ3N0YXJ0JywgcGl0Y2g6IGNoaWNrW2NdLCB2b2x1bWU6IDQ4fSk7XG5cdFx0Y2hvcmRUcmFjay5wdXNoKHsgY21kOiAnbW92ZScsIGR1cmF0aW9uOiAoYmVhdExlbmd0aC8yKSp0ZW1wb0NoYW5nZUZhY3RvciB9KTtcblx0XHRmb3IgKGMgPSAwOyBjIDwgY2hpY2subGVuZ3RoOyBjKyspXG5cdFx0XHRjaG9yZFRyYWNrLnB1c2goeyBjbWQ6ICdzdG9wJywgcGl0Y2g6IGNoaWNrW2NdIH0pO1xuXHRcdGNob3JkVHJhY2sucHVzaCh7IGNtZDogJ21vdmUnLCBkdXJhdGlvbjogKGJlYXRMZW5ndGgvMikqdGVtcG9DaGFuZ2VGYWN0b3IgfSk7XG5cdH1cblxuXHR2YXIgcmh5dGhtUGF0dGVybnMgPSB7IFwiMi8yXCI6IFsgJ2Jvb20nLCAnY2hpY2snIF0sXG5cdFx0XCIyLzRcIjogWyAnYm9vbScsICdjaGljaycgXSxcblx0XHRcIjMvNFwiOiBbICdib29tJywgJ2NoaWNrJywgJ2NoaWNrJyBdLFxuXHRcdFwiNC80XCI6IFsgJ2Jvb20nLCAnY2hpY2snLCAnYm9vbTInLCAnY2hpY2snIF0sXG5cdFx0XCI1LzRcIjogWyAnYm9vbScsICdjaGljaycsICdjaGljaycsICdib29tMicsICdjaGljaycgXSxcblx0XHRcIjYvOFwiOiBbICdib29tJywgJycsICdjaGljaycsICdib29tMicsICcnLCAnY2hpY2snIF0sXG5cdFx0XCI5LzhcIjogWyAnYm9vbScsICcnLCAnY2hpY2snLCAnYm9vbTInLCAnJywgJ2NoaWNrJywgJ2Jvb20yJywgJycsICdjaGljaycgXSxcblx0XHRcIjEyLzhcIjogWyAnYm9vbScsICcnLCAnY2hpY2snLCAnYm9vbTInLCAnJywgJ2NoaWNrJywgJ2Jvb20yJywgJycsICdjaGljaycsICdib29tMicsICcnLCAnY2hpY2snIF0sXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzb2x2ZUNob3JkcygpIHtcblx0XHR2YXIgbnVtID0gbWV0ZXIubnVtO1xuXHRcdHZhciBkZW4gPSBtZXRlci5kZW47XG5cdFx0dmFyIGJlYXRMZW5ndGggPSAxL2Rlbjtcblx0XHR2YXIgcGF0dGVybiA9IHJoeXRobVBhdHRlcm5zW251bSsnLycrZGVuXTtcblx0XHR2YXIgdGhpc01lYXN1cmVMZW5ndGggPSBwYXJzZUludChudW0sMTApL3BhcnNlSW50KGRlbiwxMCk7XG5cdFx0Ly8gU2VlIGlmIHRoaXMgaXMgYSBmdWxsIG1lYXN1cmU6IHVuZm9ydHVuYXRlbHksIHdpdGggdHJpcGxldHMsIHRoZXJlIGlzbid0IGFuIGV4YWN0IG1hdGNoLCB3aGF0IHdpdGggdGhlIGZsb2F0aW5nIHBvaW50LCBzbyB3ZSBqdXN0IHNlZSBpZiBpdCBpcyBcImNsb3NlXCIuXG5cdFx0dmFyIHBvcnRpb25PZkFNZWFzdXJlID0gTWF0aC5hYnModGhpc01lYXN1cmVMZW5ndGggLSBiYXJCZWF0KTtcblx0XHRpZiAoIXBhdHRlcm4gfHwgcG9ydGlvbk9mQU1lYXN1cmUgPiAwLjAwNzgxMjUpIHsgLy8gSWYgaXQgaXMgYW4gdW5zdXBwb3J0ZWQgbWV0ZXIsIG9yIHRoaXMgaXNuJ3QgYSBmdWxsIGJhciwganVzdCBjaGljayBvbiBlYWNoIGJlYXQuXG5cdFx0XHRwYXR0ZXJuID0gW107XG5cdFx0XHR2YXIgYmVhdHNQcmVzZW50ID0gYmFyQmVhdCAvIGJlYXRMZW5ndGg7XG5cdFx0XHRmb3IgKHZhciBwID0gMDsgcCA8IGJlYXRzUHJlc2VudDsgcCsrKVxuXHRcdFx0XHRwYXR0ZXJuLnB1c2goXCJjaGlja1wiKTtcblx0XHR9XG5cblx0XHRpZiAoY3VycmVudENob3Jkcy5sZW5ndGggPT09IDApIHsgLy8gdGhlcmUgd2Fzbid0IGEgbmV3IGNob3JkIHRoaXMgbWVhc3VyZSwgc28gdXNlIHRoZSBsYXN0IGNob3JkIGRlY2xhcmVkLlxuXHRcdFx0Y3VycmVudENob3Jkcy5wdXNoKHsgYmVhdDogMCwgY2hvcmQ6IGxhc3RDaG9yZH0pO1xuXHRcdH1cblx0XHRpZiAoY3VycmVudENob3Jkc1swXS5iZWF0ICE9PSAwICYmIGxhc3RDaG9yZCkgeyAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGEgY2hvcmQgZGVjbGFyZWQgaW4gdGhlIG1lYXN1cmUsIGJ1dCBub3Qgb24gaXRzIGZpcnN0IGJlYXQuXG5cdFx0XHRjdXJyZW50Q2hvcmRzLnVuc2hpZnQoeyBiZWF0OiAwLCBjaG9yZDogbGFzdENob3JkfSk7XG5cdFx0fVxuXHRcdGlmIChjdXJyZW50Q2hvcmRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Zm9yICh2YXIgbSA9IDA7IG0gPCBwYXR0ZXJuLmxlbmd0aDsgbSsrKSB7XG5cdFx0XHRcdHN3aXRjaCAocGF0dGVyblttXSkge1xuXHRcdFx0XHRcdGNhc2UgJ2Jvb20nOlxuXHRcdFx0XHRcdFx0d3JpdGVCb29tKGN1cnJlbnRDaG9yZHNbMF0uY2hvcmQuYm9vbSwgYmVhdExlbmd0aCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdib29tMic6XG5cdFx0XHRcdFx0XHR3cml0ZUJvb20oY3VycmVudENob3Jkc1swXS5jaG9yZC5ib29tMiwgYmVhdExlbmd0aCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjaGljayc6XG5cdFx0XHRcdFx0XHR3cml0ZUNoaWNrKGN1cnJlbnRDaG9yZHNbMF0uY2hvcmQuY2hpY2ssIGJlYXRMZW5ndGgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJzpcblx0XHRcdFx0XHRcdGNob3JkVHJhY2sucHVzaCh7IGNtZDogJ21vdmUnLCBkdXJhdGlvbjogYmVhdExlbmd0aCp0ZW1wb0NoYW5nZUZhY3RvciB9KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgYXJlIGhlcmUgaXQgaXMgYmVjYXVzZSBtb3JlIHRoYW4gb25lIGNob3JkIHdhcyBkZWNsYXJlZCBpbiB0aGUgbWVhc3VyZSwgc28gd2UgaGF2ZSB0byBzb3J0IG91dCB3aGF0IGNob3JkIGdvZXMgd2hlcmUuXG5cblx0XHQvLyBGaXJzdCwgbm9ybWFsaXplIHRoZSBjaG9yZHMgb24gYmVhdHMuXG5cdFx0dmFyIGJlYXRzID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Q2hvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2MgPSBjdXJyZW50Q2hvcmRzW2ldO1xuXHRcdFx0dmFyIGJlYXQgPSBNYXRoLmZsb29yKGNjLmJlYXQgLyBiZWF0TGVuZ3RoKTtcdC8vIG5vdyBhbGwgdGhlIGJlYXRzIGFyZSBpbnRlZ2VycywgdGhlcmUgbWF5IGJlXG5cdFx0XHRiZWF0c1snJytiZWF0XSA9IGNjO1xuXHRcdH1cblxuXHRcdC8vIC0gSWYgdGhlcmUgaXMgYSBjaG9yZCBvbiB0aGUgc2Vjb25kIGJlYXQsIHBsYXkgYSBjaG9yZCBmb3IgdGhlIGZpcnN0IGJlYXQgaW5zdGVhZCBvZiBhIGJhc3Mgbm90ZS5cblx0XHQvLyAtIExpa2V3aXNlLCBpZiB0aGVyZSBpcyBhIGNob3JkIG9uIHRoZSBmb3VydGggYmVhdCBvZiA0LzQsIHBsYXkgYSBjaG9yZCBvbiB0aGUgdGhpcmQgYmVhdCBpbnN0ZWFkIG9mIGEgYmFzcyBub3RlLlxuXHRcdGZvciAodmFyIG0yID0gMDsgbTIgPCBwYXR0ZXJuLmxlbmd0aDsgbTIrKykge1xuXHRcdFx0dmFyIHRoaXNDaG9yZDtcblx0XHRcdGlmIChiZWF0c1snJyttMl0pXG5cdFx0XHRcdHRoaXNDaG9yZCA9IGJlYXRzWycnK20yXTtcblx0XHRcdHN3aXRjaCAocGF0dGVyblttMl0pIHtcblx0XHRcdFx0Y2FzZSAnYm9vbSc6XG5cdFx0XHRcdFx0aWYgKGJlYXRzWycnKyhtMisxKV0pIC8vIElmIHRoZXJlIGlzIG5vdCBhIGNob3JkIGNoYW5nZSBvbiB0aGUgbmV4dCBiZWF0LCBwbGF5IGEgYmFzcyBub3RlLlxuXHRcdFx0XHRcdFx0d3JpdGVDaGljayh0aGlzQ2hvcmQuY2hvcmQuY2hpY2ssIGJlYXRMZW5ndGgpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHdyaXRlQm9vbSh0aGlzQ2hvcmQuY2hvcmQuYm9vbSwgYmVhdExlbmd0aCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jvb20yJzpcblx0XHRcdFx0XHRpZiAoYmVhdHNbJycrKG0yKzEpXSlcblx0XHRcdFx0XHRcdHdyaXRlQ2hpY2sodGhpc0Nob3JkLmNob3JkLmNoaWNrLCBiZWF0TGVuZ3RoKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR3cml0ZUJvb20odGhpc0Nob3JkLmNob3JkLmJvb20yLCBiZWF0TGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY2hpY2snOlxuXHRcdFx0XHRcdHdyaXRlQ2hpY2sodGhpc0Nob3JkLmNob3JkLmNoaWNrLCBiZWF0TGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnJzpcblx0XHRcdFx0XHRpZiAoYmVhdHNbJycrbTJdKVx0Ly8gSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgY2hvcmQgb24gdGhpcyBiZWF0LCBwbGF5IGl0LlxuXHRcdFx0XHRcdFx0d3JpdGVDaGljayh0aGlzQ2hvcmQuY2hvcmQuY2hpY2ssIGJlYXRMZW5ndGgpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGNob3JkVHJhY2sucHVzaCh7Y21kOiAnbW92ZScsIGR1cmF0aW9uOiBiZWF0TGVuZ3RoKnRlbXBvQ2hhbmdlRmFjdG9yIH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZURydW1EZWZpbml0aW9uKHBhcmFtcykge1xuXHRcdC8vIEJlIHZlcnkgc3RyaWN0IHdpdGggdGhlIGRydW0gZGVmaW5pdGlvbi4gSWYgYW55dGhpbmcgaXMgbm90IHBlcmZlY3QsXG5cdFx0Ly8ganVzdCB0dXJuIHRoZSBkcnVtcyBvZmYuXG5cdFx0Ly8gUGVyaGFwcyBhbGwgb2YgdGhpcyBsb2dpYyBiZWxvbmdzIGluIHRoZSBwYXJzZXIgaW5zdGVhZC5cblx0XHRpZiAocGFyYW1zLnBhdHRlcm4ubGVuZ3RoID09PSAwIHx8IHBhcmFtcy5vbiA9PT0gZmFsc2UpXG5cdFx0XHRyZXR1cm4geyBvbjogZmFsc2UgfTtcblxuXHRcdHZhciBzdHIgPSBwYXJhbXMucGF0dGVyblswXTtcblx0XHR2YXIgZXZlbnRzID0gW107XG5cdFx0dmFyIGV2ZW50ID0gXCJcIjtcblx0XHR2YXIgdG90YWxQbGF5ID0gMDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHN0cltpXSA9PT0gJ2QnKVxuXHRcdFx0XHR0b3RhbFBsYXkrKztcblx0XHRcdGlmIChzdHJbaV0gPT09ICdkJyB8fCBzdHJbaV0gPT09ICd6Jykge1xuXHRcdFx0XHRpZiAoZXZlbnQubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0ZXZlbnRzLnB1c2goZXZlbnQpO1xuXHRcdFx0XHRcdGV2ZW50ID0gc3RyW2ldO1xuXHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRldmVudCA9IGV2ZW50ICsgc3RyW2ldO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGV2ZW50Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIHRoZXJlIHdhcyBhbiBlcnJvcjogdGhlIHN0cmluZyBzaG91bGQgaGF2ZSBzdGFydGVkIHdpdGggZCBvciB6XG5cdFx0XHRcdFx0cmV0dXJuIHtvbjogZmFsc2V9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGV2ZW50ID0gZXZlbnQgKyBzdHJbaV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGV2ZW50Lmxlbmd0aCAhPT0gMClcblx0XHRcdGV2ZW50cy5wdXNoKGV2ZW50KTtcblxuXHRcdC8vIE5vdyB0aGUgZXZlbnRzIGFycmF5IHNob3VsZCBoYXZlIG9uZSBpdGVtIHBlciBldmVudC5cblx0XHQvLyBUaGVyZSBzaG91bGQgYmUgdHdvIG1vcmUgcGFyYW1zIGZvciBlYWNoIGV2ZW50OiB0aGUgdm9sdW1lIGFuZCB0aGUgcGl0Y2guXG5cdFx0aWYgKHBhcmFtcy5wYXR0ZXJuLmxlbmd0aCAhPT0gdG90YWxQbGF5KjIgKyAxKVxuXHRcdFx0cmV0dXJuIHsgb246IGZhbHNlIH07XG5cblx0XHR2YXIgcmV0ID0geyBvbjogdHJ1ZSwgYmFyczogcGFyYW1zLmJhcnMsIHBhdHRlcm46IFtdfTtcblx0XHR2YXIgYmVhdExlbmd0aCA9IDEvbWV0ZXIuZGVuO1xuXHRcdHZhciBwbGF5Q291bnQgPSAwO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgZXZlbnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRldmVudCA9IGV2ZW50c1tqXTtcblx0XHRcdHZhciBsZW4gPSAxO1xuXHRcdFx0dmFyIGRpdiA9IGZhbHNlO1xuXHRcdFx0dmFyIG51bSA9IDA7XG5cdFx0XHRmb3IgKHZhciBrID0gMTsgayA8IGV2ZW50Lmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdHN3aXRjaChldmVudFtrXSkge1xuXHRcdFx0XHRcdGNhc2UgXCIvXCI6XG5cdFx0XHRcdFx0XHRpZiAobnVtICE9PSAwKVxuXHRcdFx0XHRcdFx0XHRsZW4gKj0gbnVtO1xuXHRcdFx0XHRcdFx0bnVtID0gMDtcblx0XHRcdFx0XHRcdGRpdiA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRcdFx0Y2FzZSBcIjNcIjpcblx0XHRcdFx0XHRjYXNlIFwiNFwiOlxuXHRcdFx0XHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRcdFx0Y2FzZSBcIjZcIjpcblx0XHRcdFx0XHRjYXNlIFwiN1wiOlxuXHRcdFx0XHRcdGNhc2UgXCI4XCI6XG5cdFx0XHRcdFx0Y2FzZSBcIjlcIjpcblx0XHRcdFx0XHRcdG51bSA9IG51bSoxMCArZXZlbnRba107XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgb246IGZhbHNlIH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChkaXYpIHtcblx0XHRcdFx0aWYgKG51bSA9PT0gMCkgbnVtID0gMjsgLy8gYSBzbGFzaCBieSBpdHNlbGYgaXMgaW50ZXJwcmV0ZWQgYXMgXCIvMlwiXG5cdFx0XHRcdGxlbiAvPSBudW07XG5cdFx0XHR9IGVsc2UgaWYgKG51bSlcblx0XHRcdFx0bGVuICo9IG51bTtcblx0XHRcdGlmIChldmVudFswXSA9PT0gJ2QnKSB7XG5cdFx0XHRcdHJldC5wYXR0ZXJuLnB1c2goeyBsZW46IGxlbiAqIGJlYXRMZW5ndGgsIHBpdGNoOiBwYXJhbXMucGF0dGVyblsxICsgcGxheUNvdW50XSwgdmVsb2NpdHk6IHBhcmFtcy5wYXR0ZXJuWzEgKyBwbGF5Q291bnQgKyB0b3RhbFBsYXldfSk7XG5cdFx0XHRcdHBsYXlDb3VudCsrO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHJldC5wYXR0ZXJuLnB1c2goeyBsZW46IGxlbiAqIGJlYXRMZW5ndGgsIHBpdGNoOiBudWxsfSk7XG5cdFx0fVxuXHRcdC8vIE5vdyBub3JtYWxpemUgdGhlIHBhdHRlcm4gdG8gY292ZXIgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIG1lYXN1cmVzLiBUaGUgbm90ZSBsZW5ndGhzIHBhc3NlZCBhcmUgcmVsYXRpdmUgdG8gZWFjaCBvdGhlciBhbmQgbmVlZCB0byBiZSBzY2FsZWQgdG8gZml0IGEgbWVhc3VyZS5cblx0XHR2YXIgdG90YWxUaW1lID0gMDtcblx0XHR2YXIgbWVhc3VyZXNQZXJCZWF0ID0gbWV0ZXIubnVtL21ldGVyLmRlbjtcblx0XHRmb3IgKHZhciBpaSA9IDA7IGlpIDwgcmV0LnBhdHRlcm4ubGVuZ3RoOyBpaSsrKVxuXHRcdFx0dG90YWxUaW1lICs9IHJldC5wYXR0ZXJuW2lpXS5sZW47XG5cdFx0dmFyIG51bUJhcnMgPSBwYXJhbXMuYmFycyA/IHBhcmFtcy5iYXJzIDogMTtcblx0XHR2YXIgZmFjdG9yID0gdG90YWxUaW1lIC8gIG51bUJhcnMgLyBtZWFzdXJlc1BlckJlYXQ7XG5cdFx0Zm9yIChpaSA9IDA7IGlpIDwgcmV0LnBhdHRlcm4ubGVuZ3RoOyBpaSsrKVxuXHRcdFx0cmV0LnBhdHRlcm5baWldLmxlbiA9IHJldC5wYXR0ZXJuW2lpXS5sZW4gLyBmYWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdGZ1bmN0aW9uIGRydW1CZWF0KHBpdGNoLCBzb3VuZExlbmd0aCwgdm9sdW1lKSB7XG5cdFx0ZHJ1bVRyYWNrLnB1c2goeyBjbWQ6ICdzdGFydCcsIHBpdGNoOiBwaXRjaCAtIDYwLCB2b2x1bWU6IHZvbHVtZX0pO1xuXHRcdGRydW1UcmFjay5wdXNoKHsgY21kOiAnbW92ZScsIGR1cmF0aW9uOiBzb3VuZExlbmd0aCB9KTtcblx0XHRkcnVtVHJhY2sucHVzaCh7IGNtZDogJ3N0b3AnLCBwaXRjaDogcGl0Y2ggLSA2MCB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyaXRlRHJ1bShjaGFubmVsKSB7XG5cdFx0aWYgKGRydW1UcmFjay5sZW5ndGggPT09IDAgJiYgIWRydW1EZWZpbml0aW9uLm9uKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dmFyIG1lYXN1cmVMZW4gPSBtZXRlci5udW0vbWV0ZXIuZGVuO1xuXHRcdGlmIChkcnVtVHJhY2subGVuZ3RoID09PSAwKSB7XG5cdFx0XHRkcnVtVHJhY2sucHVzaCh7Y21kOiAncHJvZ3JhbScsIGNoYW5uZWw6IGNoYW5uZWwsIGluc3RydW1lbnQ6IGRydW1JbnN0cnVtZW50fSk7XG5cdFx0XHQvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGZhciBpbiB0aW1lIHRoZSBiYXIgc3RhcnRlZDogaWYgdGhlcmUgYXJlIHBpY2t1cCBub3RlcyBiZWZvcmUgdGhlIGNob3JkcyBzdGFydCwgd2UgbmVlZCBwYXVzZXMuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSB0aW1lRnJvbVN0YXJ0KCk7XG5cdFx0XHRpZiAoZGlzdGFuY2UgPiAwICYmIGRpc3RhbmNlIDwgbWVhc3VyZUxlbiAtIDAuMDEpIHsgLy8gYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCwgYWRkaW5nIHRoZSBub3RlcyBtaWdodCBub3QgZXhhY3RseSBlcXVhbCB0aGUgbWVhc3VyZSBzaXplLlxuXHRcdFx0XHRkcnVtVHJhY2sucHVzaCh7Y21kOiAnbW92ZScsIGR1cmF0aW9uOiBkaXN0YW5jZSAqIHRlbXBvQ2hhbmdlRmFjdG9yfSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIWRydW1EZWZpbml0aW9uLm9uKSB7XG5cdFx0XHQvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGhhcyBiZWVuIGEgZHJ1bSB0cmFjaywgYnV0IGl0IHdhcyBzcGVjaWZpY2FsbHkgdHVybmVkIG9mZi5cblx0XHRcdGRydW1UcmFjay5wdXNoKHsgY21kOiAnbW92ZScsIGR1cmF0aW9uOiBtZWFzdXJlTGVuICogdGVtcG9DaGFuZ2VGYWN0b3IgfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZHJ1bURlZmluaXRpb24ucGF0dGVybi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGxlbiA9IGRydW1EZWZpbml0aW9uLnBhdHRlcm5baV0ubGVuICogdGVtcG9DaGFuZ2VGYWN0b3I7XG5cdFx0XHRpZiAoZHJ1bURlZmluaXRpb24ucGF0dGVybltpXS5waXRjaClcblx0XHRcdFx0ZHJ1bUJlYXQoZHJ1bURlZmluaXRpb24ucGF0dGVybltpXS5waXRjaCwgbGVuLCBkcnVtRGVmaW5pdGlvbi5wYXR0ZXJuW2ldLnZlbG9jaXR5KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZHJ1bVRyYWNrLnB1c2goeyBjbWQ6ICdtb3ZlJywgZHVyYXRpb246IGxlbiB9KTtcblx0XHR9XG5cdH1cbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsInZhciBnZXROb3RlID0gcmVxdWlyZSgnLi9sb2FkLW5vdGUnKTtcbnZhciBzb3VuZHNDYWNoZSA9IHJlcXVpcmUoJy4vc291bmRzLWNhY2hlJyk7XG52YXIgY3JlYXRlTm90ZU1hcCA9IHJlcXVpcmUoJy4vY3JlYXRlLW5vdGUtbWFwJyk7XG52YXIgcmVnaXN0ZXJBdWRpb0NvbnRleHQgPSByZXF1aXJlKCcuL3JlZ2lzdGVyLWF1ZGlvLWNvbnRleHQnKTtcbnZhciBhY3RpdmVBdWRpb0NvbnRleHQgPSByZXF1aXJlKCcuL2FjdGl2ZS1hdWRpby1jb250ZXh0Jyk7XG52YXIgc3VwcG9ydHNBdWRpbyA9IHJlcXVpcmUoJy4vc3VwcG9ydHMtYXVkaW8nKTtcbnZhciBwaXRjaFRvTm90ZU5hbWUgPSByZXF1aXJlKCcuL3BpdGNoLXRvLW5vdGUtbmFtZScpO1xudmFyIGluc3RydW1lbnRJbmRleFRvTmFtZSA9IHJlcXVpcmUoJy4vaW5zdHJ1bWVudC1pbmRleC10by1uYW1lJyk7XG52YXIgZG93bmxvYWRCdWZmZXIgPSByZXF1aXJlKCcuL2Rvd25sb2FkLWJ1ZmZlcicpO1xudmFyIHNlcXVlbmNlID0gcmVxdWlyZSgnLi4vbWlkaS9hYmNfbWlkaV9zZXF1ZW5jZXInKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi4vbWlkaS9hYmNfbWlkaV9mbGF0dGVuZXInKTtcblxuLy8gVE9ETy1QRVI6IHJlbW92ZSB0aGUgbWlkaSB0ZXN0cyBmcm9tIGhlcmU6IEkgZG9uJ3QgdGhpbmsgdGhlIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgdW5sZXNzIGl0IHBhc3Nlcy5cbnZhciBub3RTdXBwb3J0ZWRNZXNzYWdlID0gXCJNSURJIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLlwiO1xuXG52YXIgZGVmYXVsdFNvdW5kRm9udFVybCA9IFwiaHR0cHM6Ly9wYXVscm9zZW4uZ2l0aHViLmlvL21pZGktanMtc291bmRmb250cy9GbHVpZFIzX0dNL1wiO1xuXG5cbmZ1bmN0aW9uIENyZWF0ZVN5bnRoKCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdHNlbGYuYXVkaW9CdWZmZXJQb3NzaWJsZSA9IHVuZGVmaW5lZDtcblx0c2VsZi5kaXJlY3RTb3VyY2UgPSBbXTsgLy8gdHlwZTogQXVkaW9CdWZmZXJTb3VyY2VOb2RlXG5cdHNlbGYuc3RhcnRUaW1lU2VjID0gdW5kZWZpbmVkOyAvLyB0aGUgdGltZSB0aGF0IHRoZSBtaWRpIHN0YXJ0ZWQ6IHVzZWQgZm9yIHBhdXNlL3Jlc3VtZS5cblx0c2VsZi5wYXVzZWRUaW1lU2VjID0gdW5kZWZpbmVkOyAvLyB0aGUgdGltZSB0aGF0IHRoZSBtaWRpIHdhcyBwYXVzZWQ6IHVzZWQgZm9yIHJlc3VtZS5cblx0c2VsZi5hdWRpb0J1ZmZlcnMgPSBbXTsgLy8gY2FjaGUgb2YgdGhlIGJ1ZmZlcnMgc28gc3RhcnRpbmcgcGxheSBjYW4gYmUgZmFzdC5cblx0c2VsZi5kdXJhdGlvbiA9IHVuZGVmaW5lZDsgLy8gdGhlIGR1cmF0aW9uIG9mIHRoZSB0dW5lIGluIHNlY29uZHMuXG5cdHNlbGYuaXNSdW5uaW5nID0gZmFsc2U7IC8vIHdoZXRoZXIgdGhlcmUgaXMgY3VycmVudGx5IGEgc291bmQgYnVmZmVyIHJ1bm5pbmcuXG5cblx0Ly8gTG9hZCBhbmQgY2FjaGUgYWxsIG5lZWRlZCBzb3VuZHNcblx0c2VsZi5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdGlmICghb3B0aW9ucylcblx0XHRcdG9wdGlvbnMgPSB7fTtcblx0XHRyZWdpc3RlckF1ZGlvQ29udGV4dChvcHRpb25zLmF1ZGlvQ29udGV4dCk7IC8vIFRoaXMgd29ya3Mgbm8gbWF0dGVyIHdoYXQgLSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFjIGl0IGlzIGEgbm9wOyBpZiB0aGUgY29udGV4dCBpcyBub3QgcGFzc2VkIGluLCB0aGVuIGl0IGNyZWF0ZXMgb25lLlxuXHRcdHZhciBzdGFydFRpbWUgPSBhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZTtcblx0XHRzZWxmLmRlYnVnQ2FsbGJhY2sgPSBvcHRpb25zLmRlYnVnQ2FsbGJhY2s7XG5cdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdHNlbGYuZGVidWdDYWxsYmFjayhcImluaXQgY2FsbGVkXCIpO1xuXHRcdHNlbGYuYXVkaW9CdWZmZXJQb3NzaWJsZSA9IHNlbGYuX2RldmljZUNhcGFibGUoKTtcblx0XHRpZiAoIXNlbGYuYXVkaW9CdWZmZXJQb3NzaWJsZSlcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCh7IHN0YXR1czogXCJOb3RTdXBwb3J0ZWRcIiwgbWVzc2FnZTogbm90U3VwcG9ydGVkTWVzc2FnZX0pO1xuXHRcdHNlbGYuc291bmRGb250VXJsID0gb3B0aW9ucy5zb3VuZEZvbnRVcmwgPyBvcHRpb25zLnNvdW5kRm9udFVybCA6IGRlZmF1bHRTb3VuZEZvbnRVcmw7XG5cdFx0c2VsZi5taWxsaXNlY29uZHNQZXJNZWFzdXJlID0gb3B0aW9ucy5taWxsaXNlY29uZHNQZXJNZWFzdXJlID8gb3B0aW9ucy5taWxsaXNlY29uZHNQZXJNZWFzdXJlIDogKG9wdGlvbnMudmlzdWFsT2JqID8gb3B0aW9ucy52aXN1YWxPYmoubWlsbGlzZWNvbmRzUGVyTWVhc3VyZSgpIDogMTAwMCk7XG5cdFx0dmFyIHBhcmFtcyA9IG9wdGlvbnMub3B0aW9ucyA/IG9wdGlvbnMub3B0aW9ucyA6IHt9O1xuXHRcdHNlbGYubWV0ZXJTaXplID0gMTtcblx0XHRpZiAob3B0aW9ucy52aXN1YWxPYmopIHtcblx0XHRcdHZhciBzZXEgPSBzZXF1ZW5jZShvcHRpb25zLnZpc3VhbE9iaiwgcGFyYW1zKTtcblx0XHRcdHNlbGYuZmxhdHRlbmVkID0gZmxhdHRlbihzZXEsIHBhcmFtcyk7XG5cdFx0XHRzZWxmLm1ldGVyU2l6ZSA9IG9wdGlvbnMudmlzdWFsT2JqLmdldE1ldGVyRnJhY3Rpb24oKS5udW0gLyBvcHRpb25zLnZpc3VhbE9iai5nZXRNZXRlckZyYWN0aW9uKCkuZGVuO1xuXHRcdH0gZWxzZSBpZiAob3B0aW9ucy5zZXF1ZW5jZSlcblx0XHRcdHNlbGYuZmxhdHRlbmVkID0gb3B0aW9ucy5zZXF1ZW5jZTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTXVzdCBwYXNzIGluIGVpdGhlciBhIHZpc3VhbE9iaiBvciBhIHNlcXVlbmNlXCIpKTtcblx0XHRzZWxmLnNlcXVlbmNlQ2FsbGJhY2sgPSBwYXJhbXMuc2VxdWVuY2VDYWxsYmFjaztcblx0XHRzZWxmLmNhbGxiYWNrQ29udGV4dCA9IHBhcmFtcy5jYWxsYmFja0NvbnRleHQ7XG5cdFx0c2VsZi5vbkVuZGVkID0gb3B0aW9ucy5vbkVuZGVkO1xuXG5cdFx0dmFyIGFsbE5vdGVzID0ge307XG5cdFx0dmFyIGN1cnJlbnRJbnN0cnVtZW50ID0gaW5zdHJ1bWVudEluZGV4VG9OYW1lWzBdO1xuXHRcdHNlbGYuZmxhdHRlbmVkLnRyYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG5cdFx0XHR0cmFjay5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdGlmIChldmVudC5jbWQgPT09IFwicHJvZ3JhbVwiICYmIGluc3RydW1lbnRJbmRleFRvTmFtZVtldmVudC5pbnN0cnVtZW50XSlcblx0XHRcdFx0XHRjdXJyZW50SW5zdHJ1bWVudCA9IGluc3RydW1lbnRJbmRleFRvTmFtZVtldmVudC5pbnN0cnVtZW50XTtcblx0XHRcdFx0aWYgKGV2ZW50LnBpdGNoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR2YXIgcGl0Y2hOdW1iZXIgPSBldmVudC5waXRjaCArIDYwO1xuXHRcdFx0XHRcdHZhciBub3RlTmFtZSA9IHBpdGNoVG9Ob3RlTmFtZVtwaXRjaE51bWJlcl07XG5cdFx0XHRcdFx0aWYgKG5vdGVOYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWFsbE5vdGVzW2N1cnJlbnRJbnN0cnVtZW50XSlcblx0XHRcdFx0XHRcdFx0YWxsTm90ZXNbY3VycmVudEluc3RydW1lbnRdID0ge307XG5cdFx0XHRcdFx0XHRhbGxOb3Rlc1tjdXJyZW50SW5zdHJ1bWVudF1bcGl0Y2hUb05vdGVOYW1lW3BpdGNoTnVtYmVyXV0gPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJDYW4ndCBmaW5kIG5vdGU6IFwiLCBwaXRjaE51bWJlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdGlmIChzZWxmLmRlYnVnQ2FsbGJhY2spXG5cdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soXCJub3RlIGdhdGhlcmluZyB0aW1lID0gXCIgKyBNYXRoLmZsb29yKChhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSAtIHN0YXJ0VGltZSkqMTAwMCkrXCJtc1wiKTtcblx0XHRzdGFydFRpbWUgPSBhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZTtcblxuXHRcdHZhciBub3RlcyA9IFtdO1xuXHRcdE9iamVjdC5rZXlzKGFsbE5vdGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGluc3RydW1lbnQpIHtcblx0XHRcdE9iamVjdC5rZXlzKGFsbE5vdGVzW2luc3RydW1lbnRdKS5mb3JFYWNoKGZ1bmN0aW9uKG5vdGUpIHtcblx0XHRcdFx0bm90ZXMucHVzaCh7IGluc3RydW1lbnQ6IGluc3RydW1lbnQsIG5vdGU6IG5vdGUgfSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0XHQvLyBJZiB0aGVyZSBhcmUgbG90cyBvZiBub3RlcywgbG9hZCB0aGVtIGluIGJhdGNoZXNcblx0XHR2YXIgYmF0Y2hlcyA9IFtdO1xuXHRcdHZhciBDSFVOSyA9IDI1Njtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBub3Rlcy5sZW5ndGg7IGkgKz0gQ0hVTkspIHtcblx0XHRcdGJhdGNoZXMucHVzaChub3Rlcy5zbGljZShpLCBpICsgQ0hVTkspKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdFx0XHR2YXIgaW5kZXggPSAwO1xuXHRcdFx0dmFyIG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKGluZGV4IDwgYmF0Y2hlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRzZWxmLl9sb2FkQmF0Y2goYmF0Y2hlc1tpbmRleF0sIHNlbGYuc291bmRGb250VXJsLCBzdGFydFRpbWUpLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0XHRcdFx0c3RhcnRUaW1lID0gYWN0aXZlQXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWU7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRcdFx0bmV4dCgpO1xuXHRcdFx0XHRcdH0sIHJlamVjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG5leHQoKTtcblx0XHR9KTtcblx0fTtcblxuXHRzZWxmLl9sb2FkQmF0Y2ggPSAoZnVuY3Rpb24oYmF0Y2gsIHNvdW5kRm9udFVybCwgc3RhcnRUaW1lKSB7XG5cdFx0dmFyIHByb21pc2VzID0gW107XG5cdFx0YmF0Y2guZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKGdldE5vdGUoc291bmRGb250VXJsLCBpdGVtLmluc3RydW1lbnQsIGl0ZW0ubm90ZSwgYWN0aXZlQXVkaW9Db250ZXh0KCkpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdGlmIChzZWxmLmRlYnVnQ2FsbGJhY2spXG5cdFx0XHRcdHNlbGYuZGVidWdDYWxsYmFjayhcIm1wMyBsb2FkIHRpbWUgPSBcIiArIE1hdGguZmxvb3IoKGFjdGl2ZUF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lKSoxMDAwKStcIm1zXCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHNlbGYucHJpbWUgPSBmdW5jdGlvbigpIHtcblx0XHRzZWxmLmlzUnVubmluZyA9IGZhbHNlO1xuXHRcdGlmICghc2VsZi5hdWRpb0J1ZmZlclBvc3NpYmxlKVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihub3RTdXBwb3J0ZWRNZXNzYWdlKSk7XG5cdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdHNlbGYuZGVidWdDYWxsYmFjayhcInByaW1lIGNhbGxlZFwiKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuXHRcdFx0dmFyIHN0YXJ0VGltZSA9IGFjdGl2ZUF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lO1xuXHRcdFx0dmFyIHRlbXBvTXVsdGlwbGllciA9IHNlbGYubWlsbGlzZWNvbmRzUGVyTWVhc3VyZSAvIDEwMDAgLyBzZWxmLm1ldGVyU2l6ZTtcblx0XHRcdHNlbGYuZHVyYXRpb24gPSBzZWxmLmZsYXR0ZW5lZC50b3RhbER1cmF0aW9uICogdGVtcG9NdWx0aXBsaWVyO1xuXHRcdFx0dmFyIHRvdGFsU2FtcGxlcyA9IE1hdGguZmxvb3IoYWN0aXZlQXVkaW9Db250ZXh0KCkuc2FtcGxlUmF0ZSAqIHNlbGYuZHVyYXRpb24pO1xuXG5cdFx0XHQvLyBUaGVyZSBtaWdodCBiZSBhIHByZXZpb3VzIHJ1biB0aGF0IG5lZWRzIHRvIGJlIHR1cm5lZCBvZmYuXG5cdFx0XHRzZWxmLnN0b3AoKTtcblxuXHRcdFx0dmFyIG5vdGVNYXBUcmFja3MgPSBjcmVhdGVOb3RlTWFwKHNlbGYuZmxhdHRlbmVkKTtcblx0XHRcdGlmIChzZWxmLnNlcXVlbmNlQ2FsbGJhY2spXG5cdFx0XHRcdHNlbGYuc2VxdWVuY2VDYWxsYmFjayhub3RlTWFwVHJhY2tzLCBzZWxmLmNhbGxiYWNrQ29udGV4dCk7XG5cdFx0XHQvL2NvbnNvbGUubG9nKG5vdGVNYXBUcmFja3MpO1xuXG5cdFx0XHRzZWxmLmF1ZGlvQnVmZmVycyA9IFtdO1xuXHRcdFx0bm90ZU1hcFRyYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKG5vdGVNYXApIHtcblx0XHRcdFx0dmFyIGF1ZGlvQnVmZmVyID0gYWN0aXZlQXVkaW9Db250ZXh0KCkuY3JlYXRlQnVmZmVyKDEsIHRvdGFsU2FtcGxlcywgYWN0aXZlQXVkaW9Db250ZXh0KCkuc2FtcGxlUmF0ZSk7XG5cdFx0XHRcdHZhciBjaGFuRGF0YSA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xuXG5cdFx0XHRcdG5vdGVNYXAuZm9yRWFjaChmdW5jdGlvbihub3RlKSB7XG5cdFx0XHRcdFx0c2VsZi5fcGxhY2VOb3RlKGNoYW5EYXRhLCBub3RlLCB0ZW1wb011bHRpcGxpZXIsIHNvdW5kc0NhY2hlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi5hdWRpb0J1ZmZlcnMucHVzaChhdWRpb0J1ZmZlcik7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaykge1xuXHRcdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soXCJzYW1wbGVSYXRlID0gXCIgKyBhY3RpdmVBdWRpb0NvbnRleHQoKS5zYW1wbGVSYXRlKTtcblx0XHRcdFx0c2VsZi5kZWJ1Z0NhbGxiYWNrKFwidG90YWxTYW1wbGVzID0gXCIgKyB0b3RhbFNhbXBsZXMpO1xuXHRcdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soXCJjcmVhdGlvblRpbWUgPSBcIiArIE1hdGguZmxvb3IoKGFjdGl2ZUF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lKSoxMDAwKSArIFwibXNcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0c3RhdHVzOiBcIm9rXCIsXG5cdFx0XHRcdHNlY29uZHM6IDBcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBzbyBpdCBjYW4gcXVpY2tseSBtYWtlIHNvdW5kXG5cdHNlbGYuc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoc2VsZi5wYXVzZWRUaW1lU2VjKSB7XG5cdFx0XHRzZWxmLnJlc3VtZSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghc2VsZi5hdWRpb0J1ZmZlclBvc3NpYmxlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG5vdFN1cHBvcnRlZE1lc3NhZ2UpO1xuXHRcdGlmIChzZWxmLmRlYnVnQ2FsbGJhY2spXG5cdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2soXCJzdGFydCBjYWxsZWRcIik7XG5cblx0XHRzZWxmLl9raWNrT2ZmU291bmQoMCk7XG5cdFx0c2VsZi5zdGFydFRpbWVTZWMgPSBhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZTtcblx0XHRzZWxmLnBhdXNlZFRpbWVTZWMgPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoc2VsZi5kZWJ1Z0NhbGxiYWNrKVxuXHRcdFx0c2VsZi5kZWJ1Z0NhbGxiYWNrKFwiTUlESSBTVEFSVEVEXCIsIHNlbGYuc3RhcnRUaW1lU2VjKTtcblx0fTtcblxuXHRzZWxmLnBhdXNlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzZWxmLmF1ZGlvQnVmZmVyUG9zc2libGUpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3Iobm90U3VwcG9ydGVkTWVzc2FnZSk7XG5cdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdHNlbGYuZGVidWdDYWxsYmFjayhcInBhdXNlIGNhbGxlZFwiKTtcblxuXHRcdGlmICghc2VsZi5wYXVzZWRUaW1lU2VjKSB7IC8vIGlnbm9yZSBpZiBzZWxmIGlzIGFscmVhZHkgcGF1c2VkLlxuXHRcdFx0c2VsZi5zdG9wKCk7XG5cdFx0XHRzZWxmLnBhdXNlZFRpbWVTZWMgPSBhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZTtcblx0XHR9XG5cdH07XG5cblx0c2VsZi5yZXN1bWUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXNlbGYuYXVkaW9CdWZmZXJQb3NzaWJsZSlcblx0XHRcdHRocm93IG5ldyBFcnJvcihub3RTdXBwb3J0ZWRNZXNzYWdlKTtcblx0XHRpZiAoc2VsZi5kZWJ1Z0NhbGxiYWNrKVxuXHRcdFx0c2VsZi5kZWJ1Z0NhbGxiYWNrKFwicmVzdW1lIGNhbGxlZFwiKTtcblxuXHRcdHZhciBvZmZzZXQgPSBzZWxmLnBhdXNlZFRpbWVTZWMgLSBzZWxmLnN0YXJ0VGltZVNlYztcblx0XHRzZWxmLnN0YXJ0VGltZVNlYyA9IGFjdGl2ZUF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lIC0gb2Zmc2V0OyAvLyBXZSBtb3ZlIHRoZSBzdGFydCB0aW1lIGluIGNhc2UgdGhlcmUgaXMgYW5vdGhlciBwYXVzZS9yZXN1bWUuXG5cdFx0c2VsZi5wYXVzZWRUaW1lU2VjID0gdW5kZWZpbmVkO1xuXHRcdHNlbGYuX2tpY2tPZmZTb3VuZChvZmZzZXQpO1xuXHR9O1xuXG5cdHNlbGYuc2VlayA9IGZ1bmN0aW9uKHBlcmNlbnQpIHtcblx0XHR2YXIgb2Zmc2V0ID0gc2VsZi5kdXJhdGlvbiAqIHBlcmNlbnQ7XG5cblx0XHQvLyBUT0RPLVBFUjogY2FuIHNlZWsgd2hlbiBwYXVzZWQgb3Igd2hlbiBwbGF5aW5nXG5cdFx0aWYgKCFzZWxmLmF1ZGlvQnVmZmVyUG9zc2libGUpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3Iobm90U3VwcG9ydGVkTWVzc2FnZSk7XG5cdFx0aWYgKHNlbGYuZGVidWdDYWxsYmFjaylcblx0XHRcdHNlbGYuZGVidWdDYWxsYmFjayhcInNlZWsgY2FsbGVkIHNlYz1cIiArIG9mZnNldCk7XG5cblx0XHRpZiAoc2VsZi5pc1J1bm5pbmcpIHtcblx0XHRcdHNlbGYuc3RvcCgpO1xuXHRcdFx0c2VsZi5fa2lja09mZlNvdW5kKG9mZnNldCk7XG5cdFx0fVxuXHRcdHZhciBwYXVzZURpc3RhbmNlID0gc2VsZi5wYXVzZWRUaW1lU2VjID8gc2VsZi5wYXVzZWRUaW1lU2VjIC0gc2VsZi5zdGFydFRpbWVTZWMgOiB1bmRlZmluZWQ7XG5cdFx0c2VsZi5zdGFydFRpbWVTZWMgPSBhY3RpdmVBdWRpb0NvbnRleHQoKS5jdXJyZW50VGltZSAtIG9mZnNldDtcblx0XHRpZiAoc2VsZi5wYXVzZWRUaW1lU2VjKVxuXHRcdFx0c2VsZi5wYXVzZWRUaW1lU2VjID0gc2VsZi5zdGFydFRpbWVTZWMgKyBwYXVzZURpc3RhbmNlO1xuXHR9O1xuXG5cdHNlbGYuc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdHNlbGYuaXNSdW5uaW5nID0gZmFsc2U7XG5cdFx0c2VsZi5wYXVzZWRUaW1lU2VjID0gdW5kZWZpbmVkO1xuXHRcdHNlbGYuZGlyZWN0U291cmNlLmZvckVhY2goZnVuY3Rpb24oc291cmNlKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzb3VyY2Uuc3RvcCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gV2UgZG9uJ3QgY2FyZSBpZiBzZWxmIHN1Y2NlZWRzOiBpdCBtaWdodCBmYWlsIGlmIHNvbWV0aGluZyBlbHNlIHR1cm5lZCBvZmYgdGhlIHNvdW5kIG9yIGl0IGVuZGVkIGZvciBzb21lIHJlYXNvbi5cblx0XHRcdFx0Y29uc29sZS5sb2coXCJkaXJlY3Qgc291cmNlIGRpZG4ndCBzdG9wOlwiLCBlcnJvcilcblx0XHRcdH1cblx0XHR9KTtcblx0XHRzZWxmLmRpcmVjdFNvdXJjZSA9IFtdO1xuXHR9O1xuXG5cdHNlbGYuZG93bmxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG93bmxvYWRCdWZmZXIoc2VsZik7XG5cdH07XG5cblx0Ly8vLy8vLy8vLy8vLy8vIFByaXZhdGUgZnVuY3Rpb25zIC8vLy8vLy8vLy8vLy8vXG5cblx0c2VsZi5fZGV2aWNlQ2FwYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghc3VwcG9ydHNBdWRpbygpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4obm90U3VwcG9ydGVkTWVzc2FnZSk7XG5cdFx0XHRpZiAoc2VsZi5kZWJ1Z0NhbGxiYWNrKVxuXHRcdFx0XHRzZWxmLmRlYnVnQ2FsbGJhY2sobm90U3VwcG9ydGVkTWVzc2FnZSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdHNlbGYuX2tpY2tPZmZTb3VuZCA9IGZ1bmN0aW9uKHNlY29uZHMpIHtcblx0XHRzZWxmLmlzUnVubmluZyA9IHRydWU7XG5cdFx0c2VsZi5kaXJlY3RTb3VyY2UgPSBbXTtcblx0XHRzZWxmLmF1ZGlvQnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGF1ZGlvQnVmZmVyLCB0cmFja051bSkge1xuXHRcdFx0c2VsZi5kaXJlY3RTb3VyY2VbdHJhY2tOdW1dID0gYWN0aXZlQXVkaW9Db250ZXh0KCkuY3JlYXRlQnVmZmVyU291cmNlKCk7IC8vIGNyZWF0ZXMgYSBzb3VuZCBzb3VyY2Vcblx0XHRcdHNlbGYuZGlyZWN0U291cmNlW3RyYWNrTnVtXS5idWZmZXIgPSBhdWRpb0J1ZmZlcjsgLy8gdGVsbCB0aGUgc291cmNlIHdoaWNoIHNvdW5kIHRvIHBsYXlcblx0XHRcdHNlbGYuZGlyZWN0U291cmNlW3RyYWNrTnVtXS5jb25uZWN0KGFjdGl2ZUF1ZGlvQ29udGV4dCgpLmRlc3RpbmF0aW9uKTsgLy8gY29ubmVjdCB0aGUgc291cmNlIHRvIHRoZSBjb250ZXh0J3MgZGVzdGluYXRpb24gKHRoZSBzcGVha2Vycylcblx0XHR9KTtcblx0XHRzZWxmLmRpcmVjdFNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZSkge1xuXHRcdFx0c291cmNlLnN0YXJ0KDAsIHNlY29uZHMpO1xuXHRcdH0pO1xuXHRcdGlmIChzZWxmLm9uRW5kZWQpIHtcblx0XHRcdHNlbGYuZGlyZWN0U291cmNlWzBdLm9uZW5kZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYub25FbmRlZChzZWxmLmNhbGxiYWNrQ29udGV4dCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHRzZWxmLl9wbGFjZU5vdGUgPSBmdW5jdGlvbihjaGFuRGF0YSwgbm90ZSwgdGVtcG9NdWx0aXBsaWVyLCBzb3VuZHNDYWNoZSkge1xuXHRcdHZhciBzdGFydCA9IE1hdGguZmxvb3Iobm90ZS5zdGFydCphY3RpdmVBdWRpb0NvbnRleHQoKS5zYW1wbGVSYXRlICogdGVtcG9NdWx0aXBsaWVyKTtcblx0XHR2YXIgbnVtQmVhdHMgPSBub3RlLmVuZCAtIG5vdGUuc3RhcnQ7XG5cdFx0dmFyIG5vdGVUaW1lU2VjID0gbnVtQmVhdHMgKiB0ZW1wb011bHRpcGxpZXI7XG5cdFx0dmFyIG5vdGVOYW1lID0gcGl0Y2hUb05vdGVOYW1lW25vdGUucGl0Y2grNjBdO1xuXHRcdGlmIChub3RlTmFtZSkgeyAvLyBKdXN0IGlnbm9yZSBwaXRjaGVzIHRoYXQgZG9uJ3QgZXhpc3QuXG5cdFx0XHR2YXIgcGl0Y2ggPSBzb3VuZHNDYWNoZVtub3RlLmluc3RydW1lbnRdW25vdGVOYW1lXS5nZXRDaGFubmVsRGF0YSgwKTtcblx0XHRcdHZhciBkdXJhdGlvbiA9IE1hdGgubWluKHBpdGNoLmxlbmd0aCwgTWF0aC5mbG9vcihub3RlVGltZVNlYyAqIGFjdGl2ZUF1ZGlvQ29udGV4dCgpLnNhbXBsZVJhdGUpKTtcblx0XHRcdC8vY29uc29sZS5sb2cocGl0Y2hUb05vdGVbbm90ZS5waXRjaCsnJ10sIHN0YXJ0LCBudW1CZWF0cywgbm90ZVRpbWVTZWMsIGR1cmF0aW9uKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZHVyYXRpb247IGkrKykge1xuXHRcdFx0XHR2YXIgdGhpc1NhbXBsZSA9IHBpdGNoW2ldICogbm90ZS52b2x1bWUgLyAxMjg7XG5cdFx0XHRcdGlmIChjaGFuRGF0YVtzdGFydCArIGldKVxuXHRcdFx0XHRcdGNoYW5EYXRhW3N0YXJ0ICsgaV0gPSAoY2hhbkRhdGFbc3RhcnQgKyBpXSArIHRoaXNTYW1wbGUpICowLjc1O1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2hhbkRhdGFbc3RhcnQgKyBpXSA9IHRoaXNTYW1wbGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENyZWF0ZVN5bnRoO1xuIiwidmFyIFN5bnRoU2VxdWVuY2UgPSBmdW5jdGlvbigpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHRzZWxmLnRyYWNrcyA9IFtdO1xuXHRzZWxmLnRvdGFsRHVyYXRpb24gPSAwO1xuXG5cdHNlbGYuYWRkVHJhY2sgPSBmdW5jdGlvbigpIHtcblx0XHRzZWxmLnRyYWNrcy5wdXNoKFtdKTtcblx0XHRyZXR1cm4gc2VsZi50cmFja3MubGVuZ3RoIC0gMTtcblx0fTtcblxuXHRzZWxmLnNldEluc3RydW1lbnQgPSBmdW5jdGlvbih0cmFja051bWJlciwgaW5zdHJ1bWVudE51bWJlcikge1xuXHRcdHNlbGYudHJhY2tzW3RyYWNrTnVtYmVyXS5wdXNoKHtcblx0XHRcdGNoYW5uZWw6IDAsXG5cdFx0XHRjbWQ6IFwicHJvZ3JhbVwiLFxuXHRcdFx0aW5zdHJ1bWVudDogaW5zdHJ1bWVudE51bWJlclxuXHRcdH0pO1xuXHR9O1xuXG5cdHNlbGYuYXBwZW5kTm90ZSA9IGZ1bmN0aW9uKHRyYWNrTnVtYmVyLCBwaXRjaCwgZHVyYXRpb25Jbk1lYXN1cmVzLCB2b2x1bWUpIHtcblx0XHRzZWxmLnRyYWNrc1t0cmFja051bWJlcl0ucHVzaCh7XG5cdFx0XHRjbWQ6IFwic3RhcnRcIixcblx0XHRcdHBpdGNoOiBwaXRjaCAtIDYwLFxuXHRcdFx0dm9sdW1lOiB2b2x1bWVcblx0XHR9KTtcblx0XHRzZWxmLnRyYWNrc1t0cmFja051bWJlcl0ucHVzaCh7XG5cdFx0XHRjbWQ6IFwibW92ZVwiLFxuXHRcdFx0ZHVyYXRpb246IGR1cmF0aW9uSW5NZWFzdXJlc1xuXHRcdH0pO1xuXHRcdHNlbGYudHJhY2tzW3RyYWNrTnVtYmVyXS5wdXNoKHtcblx0XHRcdGNtZDogXCJzdG9wXCIsXG5cdFx0XHRwaXRjaDogcGl0Y2ggLSA2MFxuXHRcdH0pO1xuXHRcdHZhciBkdXJhdGlvbiA9IDA7XG5cdFx0c2VsZi50cmFja3NbdHJhY2tOdW1iZXJdLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdGlmIChldmVudC5kdXJhdGlvbilcblx0XHRcdFx0ZHVyYXRpb24gKz0gZXZlbnQuZHVyYXRpb247XG5cdFx0fSk7XG5cdFx0c2VsZi50b3RhbER1cmF0aW9uID0gTWF0aC5tYXgoc2VsZi50b3RhbER1cmF0aW9uLCBkdXJhdGlvbik7XG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoU2VxdWVuY2U7XG4iLCJ2YXIgc3VwcG9ydHNBdWRpbyA9IHJlcXVpcmUoJy4vc3VwcG9ydHMtYXVkaW8nKTtcbnZhciByZWdpc3RlckF1ZGlvQ29udGV4dCA9IHJlcXVpcmUoJy4vcmVnaXN0ZXItYXVkaW8tY29udGV4dCcpO1xudmFyIGFjdGl2ZUF1ZGlvQ29udGV4dCA9IHJlcXVpcmUoJy4vYWN0aXZlLWF1ZGlvLWNvbnRleHQnKTtcbnZhciBwYXJzZUNvbW1vbiA9IHJlcXVpcmUoJy4uL3BhcnNlL2FiY19jb21tb24nKTtcbi8vIFRPRE8tUEVSOiBUaGUgcmVxdWlyZSBzdGF0ZW1lbnRzIGZvciBzdmcgZG9uJ3QgcGxheSB3ZWxsIGZvciBub2RlIGFwcHMgd2l0aG91dCBleHRyYSBwbHVnaW5zLiBUaGUgZm9sbG93aW5nIGxpbmVzIHdvdWxkIGJlIGNsZWFyZXIgdGhhbiBpbmxpbmluZyB0aGUgU1ZHXG4vLyB2YXIgbG9vcEltYWdlID0gcmVxdWlyZSgnLi9pbWFnZXMvbG9vcC5zdmcnKTtcbi8vIHZhciBwbGF5SW1hZ2UgPSByZXF1aXJlKCcuL2ltYWdlcy9wbGF5LnN2ZycpO1xuLy8gdmFyIHBhdXNlSW1hZ2UgPSByZXF1aXJlKCcuL2ltYWdlcy9wYXVzZS5zdmcnKTtcbi8vIHZhciBsb2FkaW5nSW1hZ2UgPSByZXF1aXJlKCcuL2ltYWdlcy9sb2FkaW5nLnN2ZycpO1xuLy8gdmFyIHJlc2V0SW1hZ2UgPSByZXF1aXJlKCcuL2ltYWdlcy9yZXNldC5zdmcnKTtcbnZhciBsb29wSW1hZ2UgPSAnPHN2ZyB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNzAwIDcwMFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWlkWU1pZCBtZWV0XCI+XFxuJyArXG5cdCc8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMCw3MDApIHNjYWxlKDAuMSwtMC4xKVwiID5cXG4nICtcblx0JzxwYXRoIGQ9XCJNMzExMSA2OTgxIGMtMjAgLTM3IC05MCAtNTUgLTM2NCAtOTYgLTEyMCAtMTggLTE5MCAtMzMgLTI0NCAtNTUgJyArXG5cdCctNDIgLTE3IC0xMjQgLTQyIC0xODIgLTU2IC03OCAtMTggLTExOSAtMzQgLTE1NyAtNjAgLTI4IC0xOSAtODYgLTQ2IC0xMjggJyArXG5cdCctNjAgLTQzIC0xMyAtMTA3IC00MiAtMTQ0IC02NCAtMzcgLTIzIC04NCAtNDYgLTEwNiAtNTIgLTIxIC03IC01NiAtMjkgLTc5ICcgK1xuXHQnLTUwIC0yMiAtMjIgLTYxIC01MCAtODYgLTYzIC0yNiAtMTMgLTY3IC00MCAtOTEgLTYwIC0yNCAtMjAgLTY1IC00NyAtOTAgLTYwICcgK1xuXHQnLTI1IC0xMyAtNTMgLTMxIC02MSAtNDEgLTggLTkgLTMyIC0zMCAtNTQgLTQ2IC03NSAtNTQgLTQ4NiAtNDYwIC01MTIgLTUwNyAnICtcblx0Jy0xNSAtMjUgLTQ4IC02OSAtNzUgLTk4IC0yNiAtMjggLTQ4IC01NyAtNDggLTYzIDAgLTYgLTE4IC0yOSAtMzkgLTUzIC0yMSAnICtcblx0Jy0yMyAtNTYgLTcxIC03NyAtMTA3IC0yMCAtMzYgLTUwIC04MCAtNjUgLTk3IC0xNiAtMTggLTMzIC01MiAtNDAgLTc1IC0xMiAnICtcblx0Jy00NyAtNDcgLTExNSAtODQgLTE2NiAtMTMgLTE4IC0zMCAtNTYgLTM4IC04MyAtOCAtMjcgLTM0IC04MCAtNTYgLTExOCAtMzMgJyArXG5cdCctNTMgLTQ2IC05MSAtNjIgLTE2NyAtMTIgLTYzIC0zNCAtMTI3IC01OSAtMTc5IC00MiAtODQgLTYwIC0xNjYgLTYwIC0yNzAgMCAnICtcblx0Jy05MCAyNiAtMTIyIDEyNSAtMTU0IDU0IC0xNyA5NiAtMTkgNDMwIC0yMCAzMDUgLTEgMzgxIDIgNDMwIDE0IDgyIDIyIDE0MCA1MSAnICtcblx0JzE1MyA3OCA2IDEyIDIyIDQ3IDM3IDc3IDE0IDMwIDM4IDc3IDU0IDEwMyAxNSAyNyAzNCA3MyA0MCAxMDMgNyAzMCAyOCA3OCA0OCAnICtcblx0JzEwNyAxOSAyOCA0NCA3NCA1NSAxMDEgMTAgMjggMzQgNjcgNTMgODcgMTggMjAgNDkgNjEgNjggOTAgMTkgMzAgNDQgNjMgNTcgJyArXG5cdCc3NCAxMyAxMSAzNiA0MCA1MiA2NSA1OSA5NCAyMzIgMjcwIDMwNiAzMTMgMjAgMTEgNTcgMzcgODIgNTggMjUgMjAgNzAgNTIgJyArXG5cdCcxMDAgNzIgMzAgMTkgNjYgNDcgNzkgNjEgMTMgMTQgNDkgMzUgODAgNDYgMzAgMTIgODAgMzcgMTExIDU2IDMxIDE5IDk1IDQ1ICcgK1xuXHQnMTQzIDU4IDQ4IDEyIDExMCAzNyAxMzkgNTUgNjMgNDAgMTI3IDU1IDMyMyA3NiA4MyA5IDIwOCAyOCAyNzkgNDEgMTU2IDI5ICcgK1xuXHQnMTY1IDI5IDMzMCA0IDQ1MyAtNzEgNTE0IC04NCA2MDYgLTEzMCAzMSAtMTYgODMgLTM2IDExNiAtNDUgMzIgLTkgODQgLTM0ICcgK1xuXHQnMTE1IC01NiAzMSAtMjEgODIgLTQ4IDExMyAtNjAgMzIgLTExIDcyIC0zMyA4OSAtNDggMTggLTE2IDU5IC00NSA5MiAtNjUgMzMgJyArXG5cdCctMjEgNzQgLTUxIDkwIC02NiAxNyAtMTUgNDkgLTQwIDczIC01NCA1MiAtMzIgNjUgLTYxIDUwIC0xMTMgLTggLTMxIC02MSAtOTAgJyArXG5cdCctMjc3IC0zMDggLTMwMCAtMzAzIC0zNjEgLTM4MiAtMzY5IC00ODEgLTIgLTI5IDAgLTY2IDYgLTgxIDEzIC00MCA4OCAtMTM4ICcgK1xuXHQnMTE1IC0xNTEgMTIgLTYgNTQgLTI2IDkyIC00NCBsNzAgLTMzIDk0NSAtMiBjNTIwIC0xIDk3NSAyIDEwMTIgNyA2NCA4IDE5MSAnICtcblx0JzUwIDIzMSA3NiAxMSA3IDMzIDM0IDUwIDYwIDIyIDM0IDQyIDUxIDY1IDU4IGwzMiA5IDAgMTEwMSAwIDExMDIgLTMyIDkgYy0yMSAnICtcblx0JzcgLTQ0IDI2IC02NCA1NSAtNjAgODQgLTc3IDk3IC0xNDAgMTEwIC00NCA5IC03NiAxMCAtMTI3IDIgLTU5IC05IC03NyAtMTcgJyArXG5cdCctMTM0IC02MiAtMzcgLTI4IC0xNzIgLTE1NSAtMzAxIC0yODEgLTEyOSAtMTI3IC0yNDkgLTIzNyAtMjY3IC0yNDUgLTI1IC0xMCAnICtcblx0Jy00MSAtMTEgLTcxIC0yIC01OCAxNSAtMTEyIDQ1IC0xMjQgNjkgLTYgMTEgLTM1IDM1IC02NCA1NCAtMjggMTggLTU4IDQxIC02NiAnICtcblx0JzUwIC04IDkgLTQxIDM1IC03NSA1OCAtMzMgMjIgLTc3IDU2IC05OSA3NSAtMjEgMTggLTY0IDQ2IC05NSA2MSAtMzEgMTQgLTczICcgK1xuXHQnMzkgLTkzIDU1IC0yMCAxNSAtNzAgNDAgLTExMCA1NSAtNDAgMTUgLTk3IDQ0IC0xMjcgNjQgLTI5IDIxIC03OCA0NCAtMTA3IDUzICcgK1xuXHQnLTMwIDggLTc3IDMxIC0xMDUgNTEgLTQyIDI4IC03MyAzOSAtMTczIDYwIC02OCAxNCAtMTU0IDM5IC0xOTYgNTggLTk1IDQzICcgK1xuXHQnLTEzMSA1MSAtMzQzIDc2IC0yMDkgMjQgLTI0MiAzMiAtMjc5IDcwIGwtMzAgMjkgLTMyOCAwIGMtMzEyIDAgLTMzMCAtMSAtMzM5ICcgK1xuXHQnLTE5elwiPjwvcGF0aD5cXG4nICtcblx0JzxwYXRoIGQ9XCJNMjU0IDI4NzUgYy04OSAtMTYgLTEwNyAtMjYgLTE0NSAtNzggLTMyIC00NCAtNjIgLTY2IC05MSAtNjcgLTE3IDAgJyArXG5cdCctMTggLTYxIC0xOCAtMTE0MCBsMCAtMTE0MCAyNCAwIGMxNiAwIDQxIC0xNyA3MiAtNTAgNDAgLTQyIDYxIC01NSAxMTcgLTcyICcgK1xuXHQnbDY5IC0yMSA4MiAyMyBjNDQgMTIgOTYgMzAgMTE0IDM5IDE4IDkgMTQ4IDEzMiAyOTAgMjcyIDE0MSAxNDEgMjY3IDI2MSAyNzkgJyArXG5cdCcyNjggNTEgMjYgODYgMTQgMTc2IC02MSAzMiAtMjYgNjIgLTQ4IDY2IC00OCA1IDAgMzYgLTI1IDcwIC01NSAzNCAtMzAgNzQgJyArXG5cdCctNjEgODkgLTY5IDE1IC04IDM3IC0yOCA1MCAtNDUgMTIgLTE3IDUwIC00NSA4NCAtNjIgMzQgLTE3IDc4IC00NCA5OCAtNjAgMTkgJyArXG5cdCctMTYgNjEgLTM3IDkzIC00OCAzMiAtMTEgODEgLTM3IDEwNyAtNTYgMjcgLTIwIDc2IC00NSAxMDkgLTU2IDMzIC0xMiA3NSAtMzEgJyArXG5cdCc5MyAtNDQgNjIgLTQ1IDkzIC01OCAxOTEgLTgyIDU0IC0xMiAxMzAgLTM3IDE2OCAtNTQgNjggLTI5IDE4MCAtNTggMjI2IC01OSAnICtcblx0JzYyIDAgMTgzIC02NCAxODMgLTk2IDAgLTEyIDg4IC0xNCA2MzkgLTE0IGw2MzkgMCAxMiAzMCBjMTggNDQgNzYgNjYgMjMzIDg5ICcgK1xuXHQnODkgMTQgMTYwIDMwIDIwMCA0NyAzNCAxNSAxMDYgNDIgMTU5IDYwIDU0IDE4IDExMiA0NCAxMzAgNTcgNDcgMzUgODUgNTIgMTQ2ICcgK1xuXHQnNjcgMjkgNyA3NiAyOCAxMDUgNDggMjkgMjAgNzcgNDggMTA3IDYzIDMwIDE1IDY2IDM5IDgwIDU0IDE0IDE1IDUwIDQwIDgxIDU2ICcgK1xuXHQnMzEgMTUgNzggNDYgMTA0IDY5IDI2IDIyIDYxIDQ2IDc5IDU0IDE3IDcgNDMgMjYgNTYgNDIgMTQgMTYgNDEgNDEgNjAgNTYgNjQgJyArXG5cdCc0OCAzODAgMzYyIDQwOCA0MDUgMTUgMjMgNDAgNTEgNTUgNjMgMTUgMTIgMzYgMzggNDYgNTggMTEgMjEgMzcgNTcgNTggODIgMjIgJyArXG5cdCcyNSA0OSA2MiA2MiA4MyAxMyAyMCAzOCA1NiA1NyA3OCAxOSAyMyA1MCA3NCA2OSAxMTMgMTkgMzkgNDYgODYgNTkgMTA0IDE0ICcgK1xuXHQnMTggMzQgNjIgNDYgOTggMTIgMzYgMzIgNzcgNDUgOTIgMzEgMzggNjAgOTcgODAgMTY3IDkgMzMgMjYgNzYgMzcgOTUgMjkgNTAgJyArXG5cdCc0NyAxMDMgNjggMjA2IDEwIDUyIDMyIDExNyA1MSAxNTUgMjkgNTYgMzMgNzQgMzQgMTQwIDAgOTQgLTEwIDEwOCAtMTAxIDEzOCAnICtcblx0Jy02MSAyMCAtODMgMjEgLTQ2MyAyMSAtMjI2IDAgLTQyMSAtNCAtNDUxIC0xMCAtNjMgLTEyIC04NiAtMzAgLTExMCAtODUgLTEwICcgK1xuXHQnLTIyIC0zMyAtNjMgLTUyIC05MiAtMjEgLTMxIC00MiAtODAgLTUzIC0xMjMgLTExIC00NCAtMzIgLTkzIC01NiAtMTI4IC0yMCAnICtcblx0Jy0zMiAtNDcgLTgzIC01OSAtMTE1IC0xMiAtMzIgLTM3IC03NyAtNTYgLTEwMCAtMTkgLTIzIC01MCAtNjUgLTY5IC05NCAtMTkgJyArXG5cdCctMjkgLTQ0IC01NyAtNTQgLTYzIC0xMSAtNSAtMjkgLTI3IC00MiAtNDcgLTUyIC04NSAtMjM0IC0yNzcgLTMwMCAtMzE1IC0yNSAnICtcblx0Jy0xNSAtNTMgLTM4IC02MiAtNTEgLTkgLTE0IC00MiAtMzkgLTc0IC01NyAtMzIgLTE4IC03NSAtNDggLTk1IC02NiAtMjEgLTE4ICcgK1xuXHQnLTU5IC00NCAtODUgLTU4IC0yNiAtMTMgLTcyIC00MCAtMTAwIC01OSAtMzUgLTI0IC03OCAtNDEgLTEyOCAtNTIgLTQ3IC0xMSAnICtcblx0Jy05OSAtMzEgLTEzOSAtNTYgLTY5IC00MiAtOTQgLTQ5IC0zOTEgLTExMCAtMjQ1IC01MSAtNDI1IC02NiAtNTk1IC01MCAtMTY4ICcgK1xuXHQnMTYgLTIzMCAyNyAtMzMwIDYxIC00NyAxNiAtMTIzIDM1IC0xNzAgNDQgLTk4IDE3IC0xMjMgMjUgLTE3MiA1OCAtMjAgMTQgLTcxICcgK1xuXHQnMzcgLTExNCA1MyAtNDQgMTUgLTk1IDQwIC0xMTUgNTYgLTIwIDE2IC03MCA0MiAtMTEwIDU5IC00MCAxNiAtODggNDUgLTEwOCAnICtcblx0JzYzIC0yMCAxOSAtNTUgNDYgLTc4IDYxIC0yNCAxNCAtNDkgMzUgLTU1IDQ3IC03IDExIC0zNCAzMyAtNjAgNDkgLTUwIDMxIC02NSAnICtcblx0JzYxIC01MyAxMDIgNCAxMyAxMzAgMTQ3IDI4MSAyOTggMjM2IDIzOCAyNzcgMjgzIDI5OSAzMzUgMTUgMzIgMzUgNzEgNDYgODYgJyArXG5cdCcxMiAxOCAxOSA0NCAxOSA3NiAwIDQyIC04IDYzIC01MyAxMzggLTkyIDE1MSAxMSAxMzkgLTEyMDcgMTQxIC03OTggMiAtMTAzMCAnICtcblx0JzAgLTEwODYgLTExelwiPjwvcGF0aD5cXG4nICtcblx0JzwvZz5cXG4nICtcblx0Jzwvc3ZnPlxcbic7XG52YXIgcGxheUltYWdlID0gJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBjbGFzcz1cImFiY2pzLXBsYXktc3ZnXCI+XFxuJyArXG5cdCcgICAgPGc+XFxuJyArXG5cdCcgICAgPHBvbHlnb24gcG9pbnRzPVwiNCAwIDIzIDEyLjUgNCAyNVwiLz5cXG4nICtcblx0JyAgICA8L2c+XFxuJyArXG5cdCc8L3N2Zz4nO1xudmFyIHBhdXNlSW1hZ2UgPSAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGNsYXNzPVwiYWJjanMtcGF1c2Utc3ZnXCI+XFxuJyArXG5cdCcgIDxnPlxcbicgK1xuXHQnICAgIDxyZWN0IHdpZHRoPVwiOC4yM1wiIGhlaWdodD1cIjI1XCIvPlxcbicgK1xuXHQnICAgIDxyZWN0IHdpZHRoPVwiOC4yM1wiIGhlaWdodD1cIjI1XCIgeD1cIjE3XCIvPlxcbicgK1xuXHQnICA8L2c+XFxuJyArXG5cdCc8L3N2Zz4nO1xudmFyIGxvYWRpbmdJbWFnZSA9ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiBjbGFzcz1cImFiY2pzLWxvYWRpbmctc3ZnXCI+XFxuJyArXG5cdCcgICAgPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMjBcIiByPVwiMzVcIiBzdHJva2UtZGFzaGFycmF5PVwiMTYwIDU1XCI+PC9jaXJjbGU+XFxuJyArXG5cdCc8L3N2Zz4nO1xudmFyIHJlc2V0SW1hZ2UgPSAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNSAyNVwiPlxcbicgK1xuXHQnICA8Zz5cXG4nICtcblx0JyAgICA8cG9seWdvbiBwb2ludHM9XCI1IDEyLjUgMjQgMCAyNCAyNVwiLz5cXG4nICtcblx0JyAgICA8cmVjdCB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIyNVwiIHg9XCIwXCIgeT1cIjBcIi8+XFxuJyArXG5cdCcgIDwvZz5cXG4nICtcblx0Jzwvc3ZnPic7XG5cbmZ1bmN0aW9uIENyZWF0ZVN5bnRoQ29udHJvbChwYXJlbnQsIG9wdGlvbnMpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHQvLyBwYXJlbnQgaXMgZWl0aGVyIGFuIGVsZW1lbnQgb3IgYSBzZWxlY3Rvci5cblx0aWYgKHR5cGVvZiBwYXJlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgc2VsZWN0b3IgPSBwYXJlbnQ7XG5cdFx0cGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cdFx0aWYgKCFwYXJlbnQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBlbGVtZW50IFxcXCJcIiArIHNlbGVjdG9yICsgXCJcXFwiIGluIHRoZSBET00uXCIpO1xuXHR9IGVsc2UgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQgb3Igc2VsZWN0b3IgaW4gdGhlIERPTS5cIik7XG5cblx0c2VsZi5wYXJlbnQgPSBwYXJlbnQ7XG5cdHNlbGYub3B0aW9ucyA9IHt9O1xuXHRpZiAob3B0aW9ucylcblx0XHRzZWxmLm9wdGlvbnMgPSBwYXJzZUNvbW1vbi5jbG9uZShvcHRpb25zKTtcblxuXHQvLyBUaGlzIGNhbiBiZSBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gQUMgYWxyZWFkeSByZWdpc3RlcmVkIGFuZCBub3Qgc3VzcGVuZGVkXG5cdC8vIEFDIGFscmVhZHkgcmVnaXN0ZXJlZCBhbmQgc3VzcGVuZGVkXG5cdC8vIEFDIG5vdCByZWdpc3RlcmVkIGFuZCBub3QgcGFzc2VkIGluXG5cdC8vIEFDIG5vdCByZWdpc3RlcmVkIGJ1dCBwYXNzZWQgaW4gKGJ1dCBzdXNwZW5kZWQpXG5cdC8vIEFDIG5vdCByZWdpc3RlcmVkIGJ1dCBwYXNzZWQgaW4gKG5vdCBzdXNwZW5kZWQpXG5cdC8vIElmIHRoZSBBQyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsIHRoZW4ganVzdCB1c2UgaXQgLSBpZ25vcmUgd2hhdCBpcyBwYXNzZWQgaW5cblx0Ly8gQ3JlYXRlIHRoZSBBQyBpZiBuZWNlc3NhcnkgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkuXG5cdC8vIFdlIGRvbid0IGNhcmUgcmlnaHQgbm93IGlmIHRoZSBBQyBpcyBzdXNwZW5kZWQgLSB3aGVuZXZlciBhIGJ1dHRvbiBpcyBjbGlja2VkIHRoZW4gd2UgY2hlY2sgaXQuXG5cdGlmIChzZWxmLm9wdGlvbnMuYWMpXG5cdFx0cmVnaXN0ZXJBdWRpb0NvbnRleHQoc2VsZi5vcHRpb25zLmFjKTtcblx0YnVpbGREb20oc2VsZi5wYXJlbnQsIHNlbGYub3B0aW9ucyk7XG5cdGF0dGFjaExpc3RlbmVycyhzZWxmKTtcblxuXHRzZWxmLnNldFRlbXBvID0gZnVuY3Rpb24odGVtcG8pIHtcblx0XHR2YXIgZWwgPSBzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktY3VycmVudC10ZW1wb1wiKTtcblx0XHRpZiAoZWwpXG5cdFx0XHRlbC5pbm5lckhUTUwgPSB0ZW1wbztcblx0fTtcblx0c2VsZi5yZXNldEFsbCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwdXNoZWRCdXR0b25zID0gc2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvckFsbChcIi5hYmNqcy1wdXNoZWRcIik7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwdXNoZWRCdXR0b25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYnV0dG9uID0gcHVzaGVkQnV0dG9uc1tpXTtcblx0XHRcdGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWJjanMtcHVzaGVkXCIpO1xuXHRcdH1cblx0fTtcblx0c2VsZi5wdXNoUGxheSA9IGZ1bmN0aW9uKHB1c2gpIHtcblx0XHR2YXIgc3RhcnRCdXR0b24gPSBzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktc3RhcnRcIik7XG5cdFx0aWYgKCFzdGFydEJ1dHRvbilcblx0XHRcdHJldHVybjtcblx0XHRpZiAocHVzaClcblx0XHRcdHN0YXJ0QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJhYmNqcy1wdXNoZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0c3RhcnRCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcImFiY2pzLXB1c2hlZFwiKTtcblx0fTtcblx0c2VsZi5wdXNoTG9vcCA9IGZ1bmN0aW9uKHB1c2gpIHtcblx0XHR2YXIgbG9vcEJ1dHRvbiA9IHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYWJjanMtbWlkaS1sb29wXCIpO1xuXHRcdGlmICghbG9vcEJ1dHRvbilcblx0XHRcdHJldHVybjtcblx0XHRpZiAocHVzaClcblx0XHRcdGxvb3BCdXR0b24uY2xhc3NMaXN0LmFkZChcImFiY2pzLXB1c2hlZFwiKTtcblx0XHRlbHNlXG5cdFx0XHRsb29wQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJhYmNqcy1wdXNoZWRcIik7XG5cdH07XG5cblx0c2VsZi5zZXRQcm9ncmVzcyA9IGZ1bmN0aW9uIChwZXJjZW50LCB0b3RhbFRpbWUpIHtcblx0XHR2YXIgcHJvZ3Jlc3NCYWNrZ3JvdW5kID0gc2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5hYmNqcy1taWRpLXByb2dyZXNzLWJhY2tncm91bmRcIik7XG5cdFx0dmFyIHByb2dyZXNzVGh1bWIgPSBzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktcHJvZ3Jlc3MtaW5kaWNhdG9yXCIpO1xuXHRcdGlmICghcHJvZ3Jlc3NCYWNrZ3JvdW5kIHx8ICFwcm9ncmVzc1RodW1iKVxuXHRcdFx0cmV0dXJuO1xuXHRcdHZhciB3aWR0aCA9IHByb2dyZXNzQmFja2dyb3VuZC5jbGllbnRXaWR0aDtcblx0XHR2YXIgbGVmdCA9IHdpZHRoICogcGVyY2VudDtcblx0XHRwcm9ncmVzc1RodW1iLnN0eWxlLmxlZnQgPSBsZWZ0ICsgXCJweFwiO1xuXG5cdFx0dmFyIGNsb2NrID0gc2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5hYmNqcy1taWRpLWNsb2NrXCIpO1xuXHRcdGlmIChjbG9jaykge1xuXHRcdFx0dmFyIHRvdGFsU2Vjb25kcyA9ICh0b3RhbFRpbWUgKiBwZXJjZW50KSAvIDEwMDA7XG5cdFx0XHR2YXIgbWludXRlcyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gNjApO1xuXHRcdFx0dmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAlIDYwKTtcblx0XHRcdHZhciBzZWNvbmRzRm9ybWF0dGVkID0gc2Vjb25kcyA8IDEwID8gXCIwXCIgKyBzZWNvbmRzIDogc2Vjb25kcztcblx0XHRcdGNsb2NrLmlubmVySFRNTCA9IG1pbnV0ZXMgKyBcIjpcIiArIHNlY29uZHNGb3JtYXR0ZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmIChzZWxmLm9wdGlvbnMuYWZ0ZXJSZXN1bWUpIHtcblx0XHR2YXIgaXNSZXN1bWVkID0gZmFsc2U7XG5cdFx0aWYgKHNlbGYub3B0aW9ucy5hYykge1xuXHRcdFx0aXNSZXN1bWVkID0gc2VsZi5vcHRpb25zLmFjLnN0YXRlICE9PSBcInN1c3BlbmRlZFwiO1xuXHRcdH0gZWxzZSBpZiAoYWN0aXZlQXVkaW9Db250ZXh0KCkpIHtcblx0XHRcdGlzUmVzdW1lZCA9IGFjdGl2ZUF1ZGlvQ29udGV4dCgpLnN0YXRlICE9PSBcInN1c3BlbmRlZFwiO1xuXHRcdH1cblx0XHRpZiAoaXNSZXN1bWVkKVxuXHRcdFx0c2VsZi5vcHRpb25zLmFmdGVyUmVzdW1lKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGREb20ocGFyZW50LCBvcHRpb25zKSB7XG5cdHZhciBoYXNMb29wID0gISFvcHRpb25zLmxvb3BIYW5kbGVyO1xuXHR2YXIgaGFzUmVzdGFydCA9ICEhb3B0aW9ucy5yZXN0YXJ0SGFuZGxlcjtcblx0dmFyIGhhc1BsYXkgPSAhIW9wdGlvbnMucGxheUhhbmRsZXIgfHwgISFvcHRpb25zLnBsYXlQcm9taXNlSGFuZGxlcjtcblx0dmFyIGhhc1Byb2dyZXNzID0gISFvcHRpb25zLnByb2dyZXNzSGFuZGxlcjtcblx0dmFyIGhhc1dhcnAgPSAhIW9wdGlvbnMud2FycEhhbmRsZXI7XG5cdHZhciBoYXNDbG9jayA9IG9wdGlvbnMuaGFzQ2xvY2sgIT09IGZhbHNlO1xuXG5cdHZhciBodG1sID0gJzxkaXYgY2xhc3M9XCJhYmNqcy1pbmxpbmUtYXVkaW9cIj5cXG4nO1xuXHRpZiAoaGFzTG9vcCkge1xuXHRcdHZhciByZXBlYXRUaXRsZSA9IG9wdGlvbnMucmVwZWF0VGl0bGUgPyBvcHRpb25zLnJlcGVhdFRpdGxlIDogXCJDbGljayB0byB0b2dnbGUgcGxheSBvbmNlL3JlcGVhdC5cIjtcblx0XHR2YXIgcmVwZWF0QXJpYSA9IG9wdGlvbnMucmVwZWF0QXJpYSA/IG9wdGlvbnMucmVwZWF0QXJpYSA6IHJlcGVhdFRpdGxlO1xuXHRcdGh0bWwgKz0gJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWJjanMtbWlkaS1sb29wIGFiY2pzLWJ0blwiIHRpdGxlPVwiJyArIHJlcGVhdFRpdGxlICsgJ1wiIGFyaWEtbGFiZWw9XCInICsgcmVwZWF0QXJpYSArICdcIj4nICsgbG9vcEltYWdlICsgJzwvYnV0dG9uPlxcbic7XG5cdH1cblx0aWYgKGhhc1Jlc3RhcnQpIHtcblx0XHR2YXIgcmVzdGFydFRpdGxlID0gb3B0aW9ucy5yZXN0YXJ0VGl0bGUgPyBvcHRpb25zLnJlc3RhcnRUaXRsZSA6IFwiQ2xpY2sgdG8gZ28gdG8gYmVnaW5uaW5nLlwiO1xuXHRcdHZhciByZXN0YXJ0QXJpYSA9IG9wdGlvbnMucmVzdGFydEFyaWEgPyBvcHRpb25zLnJlc3RhcnRBcmlhIDogcmVzdGFydFRpdGxlO1xuXHRcdGh0bWwgKz0gJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWJjanMtbWlkaS1yZXNldCBhYmNqcy1idG5cIiB0aXRsZT1cIicgKyByZXN0YXJ0VGl0bGUgKyAnXCIgYXJpYS1sYWJlbD1cIicgKyByZXN0YXJ0QXJpYSArICdcIj4nICsgcmVzZXRJbWFnZSArICc8L2J1dHRvbj5cXG4nO1xuXHR9XG5cdGlmIChoYXNQbGF5KSB7XG5cdFx0dmFyIHBsYXlUaXRsZSA9IG9wdGlvbnMucGxheVRpdGxlID8gb3B0aW9ucy5wbGF5VGl0bGUgOiBcIkNsaWNrIHRvIHBsYXkvcGF1c2UuXCI7XG5cdFx0dmFyIHBsYXlBcmlhID0gb3B0aW9ucy5wbGF5QXJpYSA/IG9wdGlvbnMucGxheUFyaWEgOiBwbGF5VGl0bGU7XG5cdFx0aHRtbCArPSAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhYmNqcy1taWRpLXN0YXJ0IGFiY2pzLWJ0blwiIHRpdGxlPVwiJyArIHBsYXlUaXRsZSArICdcIiBhcmlhLWxhYmVsPVwiJyArIHBsYXlBcmlhICsgJ1wiPicgKyBwbGF5SW1hZ2UgKyBwYXVzZUltYWdlICsgbG9hZGluZ0ltYWdlICsgJzwvYnV0dG9uPlxcbic7XG5cdH1cblx0aWYgKGhhc1Byb2dyZXNzKSB7XG5cdFx0dmFyIHJhbmRvbVRpdGxlID0gb3B0aW9ucy5yYW5kb21UaXRsZSA/IG9wdGlvbnMucmFuZG9tVGl0bGUgOiBcIkNsaWNrIHRvIGNoYW5nZSB0aGUgcGxheWJhY2sgcG9zaXRpb24uXCI7XG5cdFx0dmFyIHJhbmRvbUFyaWEgPSBvcHRpb25zLnJhbmRvbUFyaWEgPyBvcHRpb25zLnJhbmRvbUFyaWEgOiByYW5kb21UaXRsZTtcblx0XHRodG1sICs9ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFiY2pzLW1pZGktcHJvZ3Jlc3MtYmFja2dyb3VuZFwiIHRpdGxlPVwiJyArIHJhbmRvbVRpdGxlICsgJ1wiIGFyaWEtbGFiZWw9XCInICsgcmFuZG9tQXJpYSArICdcIj48c3BhbiBjbGFzcz1cImFiY2pzLW1pZGktcHJvZ3Jlc3MtaW5kaWNhdG9yXCI+PC9zcGFuPjwvYnV0dG9uPlxcbic7XG5cdH1cblx0aWYgKGhhc0Nsb2NrKSB7XG5cdFx0aHRtbCArPSAnPHNwYW4gY2xhc3M9XCJhYmNqcy1taWRpLWNsb2NrXCI+PC9zcGFuPlxcbic7XG5cdH1cblx0aWYgKGhhc1dhcnApIHtcblx0XHR2YXIgd2FycFRpdGxlID0gb3B0aW9ucy53YXJwVGl0bGUgPyBvcHRpb25zLndhcnBUaXRsZSA6IFwiQ2hhbmdlIHRoZSBwbGF5YmFjayBzcGVlZC5cIjtcblx0XHR2YXIgd2FycEFyaWEgPSBvcHRpb25zLndhcnBBcmlhID8gb3B0aW9ucy53YXJwQXJpYSA6IHdhcnBUaXRsZTtcblx0XHR2YXIgYnBtID0gb3B0aW9ucy5icG0gPyBvcHRpb25zLmJwbSA6IFwiQlBNXCI7XG5cdFx0aHRtbCArPSAnPHNwYW4gY2xhc3M9XCJhYmNqcy10ZW1wby13cmFwcGVyXCI+PGxhYmVsPjxpbnB1dCBjbGFzcz1cImFiY2pzLW1pZGktdGVtcG9cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIG1heD1cIjMwMFwiIHZhbHVlPVwiMTAwXCIgdGl0bGU9XCInICsgd2FycFRpdGxlICsgJ1wiIGFyaWEtbGFiZWw9XCInICsgd2FycEFyaWEgKyAnXCI+JTwvbGFiZWw+PHNwYW4+Jm5ic3A7KDxzcGFuIGNsYXNzPVwiYWJjanMtbWlkaS1jdXJyZW50LXRlbXBvXCI+PC9zcGFuPiAnICsgYnBtICsgJyk8L3NwYW4+PC9zcGFuPlxcbic7XG5cdH1cblx0aHRtbCArPSAnPC9kaXY+XFxuJztcblx0cGFyZW50LmlubmVySFRNTCA9IGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFjUmVzdW1lck1pZGRsZVdhcmUobmV4dCwgZXYsIHBsYXlCdG4sIGFmdGVyUmVzdW1lLCBpc1Byb21pc2UpIHtcblx0dmFyIG5lZWRzSW5pdCA9IHRydWU7XG5cdGlmICghYWN0aXZlQXVkaW9Db250ZXh0KCkpIHtcblx0XHRyZWdpc3RlckF1ZGlvQ29udGV4dCgpO1xuXHR9IGVsc2Uge1xuXHRcdG5lZWRzSW5pdCA9IGFjdGl2ZUF1ZGlvQ29udGV4dCgpLnN0YXRlID09PSBcInN1c3BlbmRlZFwiO1xuXHR9XG5cdGlmICghc3VwcG9ydHNBdWRpbygpKSB7XG5cdFx0dGhyb3cgeyBzdGF0dXM6IFwiTm90U3VwcG9ydGVkXCIsIG1lc3NhZ2U6IFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8uXCJ9O1xuXHR9XG5cblx0aWYgKChuZWVkc0luaXQgfHwgaXNQcm9taXNlKSAmJiBwbGF5QnRuKVxuXHRcdHBsYXlCdG4uY2xhc3NMaXN0LmFkZChcImFiY2pzLWxvYWRpbmdcIik7XG5cblx0aWYgKG5lZWRzSW5pdCkge1xuXHRcdGFjdGl2ZUF1ZGlvQ29udGV4dCgpLnJlc3VtZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGFmdGVyUmVzdW1lKSB7XG5cdFx0XHRcdGFmdGVyUmVzdW1lKCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRkb05leHQobmV4dCwgZXYsIHBsYXlCdG4sIGlzUHJvbWlzZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG9OZXh0KG5leHQsIGV2LCBwbGF5QnRuLCBpc1Byb21pc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGRvTmV4dChuZXh0LCBldiwgcGxheUJ0biwgaXNQcm9taXNlKTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb05leHQobmV4dCwgZXYsIHBsYXlCdG4sIGlzUHJvbWlzZSkge1xuXHRpZiAoaXNQcm9taXNlKSB7XG5cdFx0bmV4dChldikudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdGlmIChwbGF5QnRuKVxuXHRcdFx0XHRwbGF5QnRuLmNsYXNzTGlzdC5yZW1vdmUoXCJhYmNqcy1sb2FkaW5nXCIpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG5leHQoZXYpO1xuXHRcdGlmIChwbGF5QnRuKVxuXHRcdFx0cGxheUJ0bi5jbGFzc0xpc3QucmVtb3ZlKFwiYWJjanMtbG9hZGluZ1wiKTtcblx0fVxufVxuXG5mdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcnMoc2VsZikge1xuXHR2YXIgaGFzTG9vcCA9ICEhc2VsZi5vcHRpb25zLmxvb3BIYW5kbGVyO1xuXHR2YXIgaGFzUmVzdGFydCA9ICEhc2VsZi5vcHRpb25zLnJlc3RhcnRIYW5kbGVyO1xuXHR2YXIgaGFzUGxheSA9ICEhc2VsZi5vcHRpb25zLnBsYXlIYW5kbGVyIHx8ICEhc2VsZi5vcHRpb25zLnBsYXlQcm9taXNlSGFuZGxlcjtcblx0dmFyIGhhc1Byb2dyZXNzID0gISFzZWxmLm9wdGlvbnMucHJvZ3Jlc3NIYW5kbGVyO1xuXHR2YXIgaGFzV2FycCA9ICEhc2VsZi5vcHRpb25zLndhcnBIYW5kbGVyO1xuXHR2YXIgcGxheUJ0biA9IHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYWJjanMtbWlkaS1zdGFydFwiKTtcblxuXHRpZiAoaGFzTG9vcClcblx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktbG9vcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZXYpe2FjUmVzdW1lck1pZGRsZVdhcmUoc2VsZi5vcHRpb25zLmxvb3BIYW5kbGVyLCBldiwgcGxheUJ0biwgc2VsZi5vcHRpb25zLmFmdGVyUmVzdW1lKX0pO1xuXHRpZiAoaGFzUmVzdGFydClcblx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktcmVzZXRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGV2KXthY1Jlc3VtZXJNaWRkbGVXYXJlKHNlbGYub3B0aW9ucy5yZXN0YXJ0SGFuZGxlciwgZXYsIHBsYXlCdG4sIHNlbGYub3B0aW9ucy5hZnRlclJlc3VtZSl9KTtcblx0aWYgKGhhc1BsYXkpXG5cdFx0cGxheUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZXYpe1xuXHRcdFx0YWNSZXN1bWVyTWlkZGxlV2FyZShcblx0XHRcdFx0c2VsZi5vcHRpb25zLnBsYXlQcm9taXNlSGFuZGxlciB8fCBzZWxmLm9wdGlvbnMucGxheUhhbmRsZXIsXG5cdFx0XHRcdGV2LFxuXHRcdFx0XHRwbGF5QnRuLFxuXHRcdFx0XHRzZWxmLm9wdGlvbnMuYWZ0ZXJSZXN1bWUsXG5cdFx0XHRcdCEhc2VsZi5vcHRpb25zLnBsYXlQcm9taXNlSGFuZGxlcilcblx0XHR9KTtcblx0aWYgKGhhc1Byb2dyZXNzKVxuXHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYWJjanMtbWlkaS1wcm9ncmVzcy1iYWNrZ3JvdW5kXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihldil7YWNSZXN1bWVyTWlkZGxlV2FyZShzZWxmLm9wdGlvbnMucHJvZ3Jlc3NIYW5kbGVyLCBldiwgcGxheUJ0biwgc2VsZi5vcHRpb25zLmFmdGVyUmVzdW1lKX0pO1xuXHRpZiAoaGFzV2FycClcblx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmFiY2pzLW1pZGktdGVtcG9cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihldil7YWNSZXN1bWVyTWlkZGxlV2FyZShzZWxmLm9wdGlvbnMud2FycEhhbmRsZXIsIGV2LCBwbGF5QnRuLCBzZWxmLm9wdGlvbnMuYWZ0ZXJSZXN1bWUpfSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IENyZWF0ZVN5bnRoQ29udHJvbDtcbiIsInZhciBTeW50aFNlcXVlbmNlID0gcmVxdWlyZSgnLi9zeW50aC1zZXF1ZW5jZScpO1xudmFyIENyZWF0ZVN5bnRoID0gcmVxdWlyZSgnLi9jcmVhdGUtc3ludGgnKTtcblxuZnVuY3Rpb24gcGxheUV2ZW50KG1pZGlQaXRjaGVzLCBtaWRpR3JhY2VQaXRjaGVzLCBtaWxsaXNlY29uZHNQZXJNZWFzdXJlKSB7XG5cdHZhciBzZXF1ZW5jZSA9IG5ldyBTeW50aFNlcXVlbmNlKCk7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtaWRpUGl0Y2hlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBub3RlID0gbWlkaVBpdGNoZXNbaV07XG5cdFx0dmFyIHRyYWNrTnVtID0gc2VxdWVuY2UuYWRkVHJhY2soKTtcblx0XHRzZXF1ZW5jZS5zZXRJbnN0cnVtZW50KHRyYWNrTnVtLCBub3RlLmluc3RydW1lbnQpO1xuXHRcdGlmIChpID09PSAwICYmIG1pZGlHcmFjZVBpdGNoZXMpIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgbWlkaUdyYWNlUGl0Y2hlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHR2YXIgZ3JhY2UgPSBtaWRpR3JhY2VQaXRjaGVzW2pdO1xuXHRcdFx0XHRzZXF1ZW5jZS5hcHBlbmROb3RlKHRyYWNrTnVtLCBncmFjZS5waXRjaCwgMSAvIDY0LCBncmFjZS52b2x1bWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRzZXF1ZW5jZS5hcHBlbmROb3RlKHRyYWNrTnVtLCBub3RlLnBpdGNoLCBub3RlLmR1cmF0aW9uSW5NZWFzdXJlcywgbm90ZS52b2x1bWUpO1xuXHR9XG5cblx0dmFyIGJ1ZmZlciA9IG5ldyBDcmVhdGVTeW50aCgpO1xuXHRyZXR1cm4gYnVmZmVyLmluaXQoe1xuXHRcdHNlcXVlbmNlOiBzZXF1ZW5jZSxcblx0XHRtaWxsaXNlY29uZHNQZXJNZWFzdXJlOiBtaWxsaXNlY29uZHNQZXJNZWFzdXJlXG5cdH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBidWZmZXIucHJpbWUoKTtcblx0fSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGJ1ZmZlci5zdGFydCgpO1xuXHR9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gcGxheUV2ZW50O1xuIiwidmFyIENyZWF0ZVN5bnRoQ29udHJvbCA9IHJlcXVpcmUoJy4vY3JlYXRlLXN5bnRoLWNvbnRyb2wnKTtcbnZhciBDcmVhdGVTeW50aCA9IHJlcXVpcmUoJy4vY3JlYXRlLXN5bnRoJyk7XG52YXIgVGltaW5nQ2FsbGJhY2tzID0gcmVxdWlyZSgnLi4vYXBpL2FiY190aW1pbmdfY2FsbGJhY2tzJyk7XG5cbmZ1bmN0aW9uIFN5bnRoQ29udHJvbGxlcigpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHRzZWxmLndhcnAgPSAxMDA7XG5cdHNlbGYuY3Vyc29yQ29udHJvbCA9IG51bGw7XG5cdHNlbGYudmlzdWFsT2JqID0gbnVsbDtcblx0c2VsZi50aW1lciA9IG51bGw7XG5cdHNlbGYubWlkaUJ1ZmZlciA9IG51bGw7XG5cdHNlbGYub3B0aW9ucyA9IG51bGw7XG5cdHNlbGYuY3VycmVudFRlbXBvID0gbnVsbDtcblx0c2VsZi5jb250cm9sID0gbnVsbDtcblx0c2VsZi5pc0xvb3BpbmcgPSBmYWxzZTtcblx0c2VsZi5pc1N0YXJ0ZWQgPSBmYWxzZTtcblx0c2VsZi5pc0xvYWRlZCA9IGZhbHNlO1xuXG5cdHNlbGYubG9hZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY3Vyc29yQ29udHJvbCwgdmlzdWFsT3B0aW9ucykge1xuXHRcdGlmICghdmlzdWFsT3B0aW9ucylcblx0XHRcdHZpc3VhbE9wdGlvbnMgPSB7fTtcblx0XHRzZWxmLmNvbnRyb2wgPSBuZXcgQ3JlYXRlU3ludGhDb250cm9sKHNlbGVjdG9yLCB7XG5cdFx0XHRsb29wSGFuZGxlcjogdmlzdWFsT3B0aW9ucy5kaXNwbGF5TG9vcCA/IHNlbGYudG9nZ2xlTG9vcCA6IHVuZGVmaW5lZCxcblx0XHRcdHJlc3RhcnRIYW5kbGVyOiB2aXN1YWxPcHRpb25zLmRpc3BsYXlSZXN0YXJ0ID8gc2VsZi5yZXN0YXJ0IDogdW5kZWZpbmVkLFxuXHRcdFx0cGxheVByb21pc2VIYW5kbGVyOiB2aXN1YWxPcHRpb25zLmRpc3BsYXlQbGF5ID8gc2VsZi5wbGF5IDogdW5kZWZpbmVkLFxuXHRcdFx0cHJvZ3Jlc3NIYW5kbGVyOiB2aXN1YWxPcHRpb25zLmRpc3BsYXlQcm9ncmVzcyA/IHNlbGYucmFuZG9tQWNjZXNzIDogdW5kZWZpbmVkLFxuXHRcdFx0d2FycEhhbmRsZXI6IHZpc3VhbE9wdGlvbnMuZGlzcGxheVdhcnAgPyBzZWxmLm9uV2FycCA6IHVuZGVmaW5lZCxcblx0XHRcdGFmdGVyUmVzdW1lOiBzZWxmLmluaXRcblx0XHR9KTtcblx0XHRzZWxmLmN1cnNvckNvbnRyb2wgPSBjdXJzb3JDb250cm9sO1xuXHR9O1xuXG5cdHNlbGYuc2V0VHVuZSA9IGZ1bmN0aW9uKHZpc3VhbE9iaiwgdXNlckFjdGlvbiwgYXVkaW9QYXJhbXMpIHtcblx0XHRzZWxmLmlzTG9hZGVkID0gZmFsc2U7XG5cdFx0c2VsZi52aXN1YWxPYmogPSB2aXN1YWxPYmo7XG5cdFx0c2VsZi5vcHRpb25zID0gYXVkaW9QYXJhbXM7XG5cblx0XHRpZiAoc2VsZi5jb250cm9sKSB7XG5cdFx0XHRzZWxmLnBhdXNlKCk7XG5cdFx0XHRzZWxmLnNldFByb2dyZXNzKDAsIDEpO1xuXHRcdFx0c2VsZi5jb250cm9sLnJlc2V0QWxsKCk7XG5cdFx0XHRzZWxmLnJlc3RhcnQoKTtcblx0XHRcdHNlbGYuaXNTdGFydGVkID0gZmFsc2U7XG5cdFx0fVxuXHRcdHNlbGYuaXNMb29waW5nID0gZmFsc2U7XG5cblx0XHRpZiAodXNlckFjdGlvbilcblx0XHRcdHJldHVybiBzZWxmLmdvKCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtzdGF0dXM6IFwibm8tYXVkaW8tY29udGV4dFwifSk7XG5cdFx0fVxuXHR9O1xuXG5cdHNlbGYuZ28gPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIG1pbGxpc2Vjb25kc1Blck1lYXN1cmUgPSBzZWxmLnZpc3VhbE9iai5taWxsaXNlY29uZHNQZXJNZWFzdXJlKCkgKiAxMDAgLyBzZWxmLndhcnA7XG5cdFx0c2VsZi5jdXJyZW50VGVtcG8gPSBNYXRoLnJvdW5kKHNlbGYudmlzdWFsT2JqLmdldEJlYXRzUGVyTWVhc3VyZSgpIC8gbWlsbGlzZWNvbmRzUGVyTWVhc3VyZSAqIDYwMDAwKTtcblx0XHRpZiAoc2VsZi5jb250cm9sKVxuXHRcdFx0c2VsZi5jb250cm9sLnNldFRlbXBvKHNlbGYuY3VycmVudFRlbXBvKTtcblx0XHRzZWxmLnBlcmNlbnQgPSAwO1xuXG5cdFx0aWYgKCFzZWxmLm1pZGlCdWZmZXIpXG5cdFx0XHRzZWxmLm1pZGlCdWZmZXIgPSBuZXcgQ3JlYXRlU3ludGgoKTtcblx0XHRyZXR1cm4gc2VsZi5taWRpQnVmZmVyLmluaXQoe1xuXHRcdFx0dmlzdWFsT2JqOiBzZWxmLnZpc3VhbE9iaixcblx0XHRcdG9wdGlvbnM6IHNlbGYub3B0aW9ucyxcblx0XHRcdG1pbGxpc2Vjb25kc1Blck1lYXN1cmU6IG1pbGxpc2Vjb25kc1Blck1lYXN1cmVcblx0XHR9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBzZWxmLm1pZGlCdWZmZXIucHJpbWUoKTtcblx0XHR9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzdWJkaXZpc2lvbnMgPSAxNjtcblx0XHRcdGlmIChzZWxmLmN1cnNvckNvbnRyb2wgJiZcblx0XHRcdFx0c2VsZi5jdXJzb3JDb250cm9sLmJlYXRTdWJkaXZpc2lvbnMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRwYXJzZUludChzZWxmLmN1cnNvckNvbnRyb2wuYmVhdFN1YmRpdmlzaW9ucywgMTApID49IDEgJiZcblx0XHRcdFx0cGFyc2VJbnQoc2VsZi5jdXJzb3JDb250cm9sLmJlYXRTdWJkaXZpc2lvbnMsIDEwKSA8PSA2NClcblx0XHRcdFx0c3ViZGl2aXNpb25zID0gcGFyc2VJbnQoc2VsZi5jdXJzb3JDb250cm9sLmJlYXRTdWJkaXZpc2lvbnMsIDEwKTtcblxuXHRcdFx0Ly8gTmVlZCB0byBjcmVhdGUgdGhlIFRpbWluZ0NhbGxiYWNrcyBhZnRlciBwcmltaW5nIHRoZSBtaWRpIHNvIHRoYXQgdGhlIG1pZGkgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBjYWxsYmFja3MuXG5cdFx0XHRzZWxmLnRpbWVyID0gbmV3IFRpbWluZ0NhbGxiYWNrcyhzZWxmLnZpc3VhbE9iaiwge1xuXHRcdFx0XHRiZWF0Q2FsbGJhY2s6IHNlbGYuYmVhdENhbGxiYWNrLFxuXHRcdFx0XHRldmVudENhbGxiYWNrOiBzZWxmLmV2ZW50Q2FsbGJhY2ssXG5cdFx0XHRcdGxpbmVFbmRDYWxsYmFjazogc2VsZi5saW5lRW5kQ2FsbGJhY2ssXG5cdFx0XHRcdHFwbTogc2VsZi5jdXJyZW50VGVtcG8sXG5cblx0XHRcdFx0ZXh0cmFNZWFzdXJlc0F0QmVnaW5uaW5nOiBzZWxmLmN1cnNvckNvbnRyb2wgPyBzZWxmLmN1cnNvckNvbnRyb2wuZXh0cmFNZWFzdXJlc0F0QmVnaW5uaW5nIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRsaW5lRW5kQW50aWNpcGF0aW9uOiBzZWxmLmN1cnNvckNvbnRyb2wgPyBzZWxmLmN1cnNvckNvbnRyb2wubGluZUVuZEFudGljaXBhdGlvbiA6IHVuZGVmaW5lZCxcblx0XHRcdFx0YmVhdFN1YmRpdmlzaW9uczogc3ViZGl2aXNpb25zLFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoc2VsZi5jdXJzb3JDb250cm9sICYmIHNlbGYuY3Vyc29yQ29udHJvbC5vblJlYWR5ICYmIHR5cGVvZiBzZWxmLmN1cnNvckNvbnRyb2wub25SZWFkeSAgPT09ICdmdW5jdGlvbicpXG5cdFx0XHRcdHNlbGYuY3Vyc29yQ29udHJvbC5vblJlYWR5KHNlbGYpO1xuXHRcdFx0c2VsZi5pc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgc3RhdHVzOiBcImNyZWF0ZWRcIiB9KTtcblx0XHR9KTtcblx0fTtcblxuXHRzZWxmLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHNlbGYudGltZXIpIHtcblx0XHRcdHNlbGYudGltZXIucmVzZXQoKTtcblx0XHRcdHNlbGYudGltZXIuc3RvcCgpO1xuXHRcdFx0c2VsZi50aW1lciA9IG51bGw7XG5cdFx0fVxuXHRcdGlmIChzZWxmLm1pZGlCdWZmZXIpIHtcblx0XHRcdHNlbGYubWlkaUJ1ZmZlci5zdG9wKCk7XG5cdFx0XHRzZWxmLm1pZGlCdWZmZXIgPSBudWxsO1xuXHRcdH1cblx0XHRzZWxmLnNldFByb2dyZXNzKDAsIDEpO1xuXHRcdGlmIChzZWxmLmNvbnRyb2wpXG5cdFx0XHRzZWxmLmNvbnRyb2wucmVzZXRBbGwoKTtcblx0fTtcblxuXHRzZWxmLnBsYXkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCFzZWxmLmlzTG9hZGVkKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5nbygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBzZWxmLl9wbGF5KCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Vcblx0XHRcdHJldHVybiBzZWxmLl9wbGF5KCk7XG5cdH07XG5cblx0c2VsZi5fcGxheSA9IGZ1bmN0aW9uICgpIHtcblx0XHRzZWxmLmlzU3RhcnRlZCA9ICFzZWxmLmlzU3RhcnRlZDtcblx0XHRpZiAoc2VsZi5pc1N0YXJ0ZWQpIHtcblx0XHRcdGlmIChzZWxmLmN1cnNvckNvbnRyb2wgJiYgc2VsZi5jdXJzb3JDb250cm9sLm9uU3RhcnQgJiYgdHlwZW9mIHNlbGYuY3Vyc29yQ29udHJvbC5vblN0YXJ0ICA9PT0gJ2Z1bmN0aW9uJylcblx0XHRcdFx0c2VsZi5jdXJzb3JDb250cm9sLm9uU3RhcnQoKTtcblx0XHRcdHNlbGYubWlkaUJ1ZmZlci5zdGFydCgpO1xuXHRcdFx0c2VsZi50aW1lci5zdGFydCgpO1xuXHRcdFx0aWYgKHNlbGYuY29udHJvbClcblx0XHRcdFx0c2VsZi5jb250cm9sLnB1c2hQbGF5KHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxmLnBhdXNlKCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBzdGF0dXM6IFwib2tcIiB9KTtcblx0fTtcblxuXHRzZWxmLnBhdXNlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHNlbGYudGltZXIpIHtcblx0XHRcdHNlbGYudGltZXIucGF1c2UoKTtcblx0XHRcdHNlbGYubWlkaUJ1ZmZlci5wYXVzZSgpO1xuXHRcdFx0aWYgKHNlbGYuY29udHJvbClcblx0XHRcdFx0c2VsZi5jb250cm9sLnB1c2hQbGF5KGZhbHNlKTtcblx0XHR9XG5cdH07XG5cblx0c2VsZi50b2dnbGVMb29wID0gZnVuY3Rpb24gKCkge1xuXHRcdHNlbGYuaXNMb29waW5nID0gIXNlbGYuaXNMb29waW5nO1xuXHRcdGlmIChzZWxmLmNvbnRyb2wpXG5cdFx0XHRzZWxmLmNvbnRyb2wucHVzaExvb3Aoc2VsZi5pc0xvb3BpbmcpO1xuXHR9O1xuXG5cdHNlbGYucmVzdGFydCA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoc2VsZi50aW1lcikge1xuXHRcdFx0c2VsZi50aW1lci5zZXRQcm9ncmVzcygwKTtcblx0XHRcdHNlbGYubWlkaUJ1ZmZlci5zZWVrKDApO1xuXHRcdH1cblx0fTtcblxuXHRzZWxmLnJhbmRvbUFjY2VzcyA9IGZ1bmN0aW9uIChldikge1xuXHRcdGlmICghc2VsZi5pc0xvYWRlZCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuZ28oKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gc2VsZi5fcmFuZG9tQWNjZXNzKGV2KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZVxuXHRcdFx0cmV0dXJuIHNlbGYuX3JhbmRvbUFjY2Vzcyhldik7XG5cdH07XG5cblx0c2VsZi5fcmFuZG9tQWNjZXNzID0gZnVuY3Rpb24gKGV2KSB7XG5cdFx0dmFyIGJhY2tncm91bmQgPSAoZXYudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYWJjanMtbWlkaS1wcm9ncmVzcy1pbmRpY2F0b3InKSkgPyBldi50YXJnZXQucGFyZW50Tm9kZSA6IGV2LnRhcmdldDtcblx0XHR2YXIgcGVyY2VudCA9IChldi54IC0gYmFja2dyb3VuZC5vZmZzZXRMZWZ0KSAvIGJhY2tncm91bmQub2Zmc2V0V2lkdGg7XG5cdFx0aWYgKHBlcmNlbnQgPCAwKVxuXHRcdFx0cGVyY2VudCA9IDA7XG5cdFx0aWYgKHBlcmNlbnQgPiAxMDApXG5cdFx0XHRwZXJjZW50ID0gMTAwO1xuXHRcdHNlbGYudGltZXIuc2V0UHJvZ3Jlc3MocGVyY2VudCk7XG5cdFx0c2VsZi5taWRpQnVmZmVyLnNlZWsocGVyY2VudCk7XG5cdH07XG5cblx0c2VsZi5vbldhcnAgPSBmdW5jdGlvbiAoZXYpIHtcblx0XHR2YXIgbmV3V2FycCA9IGV2LnRhcmdldC52YWx1ZTtcblx0XHRpZiAocGFyc2VJbnQobmV3V2FycCwgMTApID4gMCkge1xuXHRcdFx0c2VsZi53YXJwID0gcGFyc2VJbnQobmV3V2FycCwgMTApO1xuXHRcdFx0dmFyIHdhc1BsYXlpbmcgPSBzZWxmLmlzU3RhcnRlZDtcblx0XHRcdHZhciBzdGFydFBlcmNlbnQgPSBzZWxmLnBlcmNlbnQ7XG5cdFx0XHRzZWxmLmRlc3Ryb3koKTtcblx0XHRcdHNlbGYuaXNTdGFydGVkID0gZmFsc2U7XG5cdFx0XHRzZWxmLmdvKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuc2V0UHJvZ3Jlc3Moc3RhcnRQZXJjZW50LCBzZWxmLm1pZGlCdWZmZXIuZHVyYXRpb24gKiAxMDAwKTtcblx0XHRcdFx0aWYgKHdhc1BsYXlpbmcpIHtcblx0XHRcdFx0XHRzZWxmLnBsYXkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnRpbWVyLnNldFByb2dyZXNzKHN0YXJ0UGVyY2VudCk7XG5cdFx0XHRcdHNlbGYubWlkaUJ1ZmZlci5zZWVrKHN0YXJ0UGVyY2VudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0c2VsZi5zZXRQcm9ncmVzcyA9IGZ1bmN0aW9uIChwZXJjZW50LCB0b3RhbFRpbWUpIHtcblx0XHRzZWxmLnBlcmNlbnQgPSBwZXJjZW50O1xuXHRcdGlmIChzZWxmLmNvbnRyb2wpXG5cdFx0XHRzZWxmLmNvbnRyb2wuc2V0UHJvZ3Jlc3MocGVyY2VudCwgdG90YWxUaW1lKTtcblx0fTtcblxuXHRzZWxmLmZpbmlzaGVkID0gZnVuY3Rpb24gKCkge1xuXHRcdHNlbGYudGltZXIucmVzZXQoKTtcblx0XHRpZiAoc2VsZi5pc0xvb3BpbmcpIHtcblx0XHRcdHNlbGYudGltZXIuc3RhcnQoKTtcblx0XHRcdHNlbGYubWlkaUJ1ZmZlci5zdGFydCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxmLnRpbWVyLnN0b3AoKTtcblx0XHRcdGlmIChzZWxmLmlzU3RhcnRlZCkge1xuXHRcdFx0XHRpZiAoc2VsZi5jb250cm9sKVxuXHRcdFx0XHRcdHNlbGYuY29udHJvbC5wdXNoUGxheShmYWxzZSk7XG5cdFx0XHRcdHNlbGYuaXNTdGFydGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmIChzZWxmLmN1cnNvckNvbnRyb2wgJiYgc2VsZi5jdXJzb3JDb250cm9sLm9uRmluaXNoZWQgJiYgdHlwZW9mIHNlbGYuY3Vyc29yQ29udHJvbC5vbkZpbmlzaGVkICA9PT0gJ2Z1bmN0aW9uJylcblx0XHRcdFx0XHRzZWxmLmN1cnNvckNvbnRyb2wub25GaW5pc2hlZCgpO1xuXHRcdFx0XHRzZWxmLnNldFByb2dyZXNzKDAsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRzZWxmLmJlYXRDYWxsYmFjayA9IGZ1bmN0aW9uIChiZWF0TnVtYmVyLCB0b3RhbEJlYXRzLCB0b3RhbFRpbWUpIHtcblx0XHR2YXIgcGVyY2VudCA9IGJlYXROdW1iZXIgLyB0b3RhbEJlYXRzO1xuXHRcdHNlbGYuc2V0UHJvZ3Jlc3MocGVyY2VudCwgdG90YWxUaW1lKTtcblx0XHRpZiAoc2VsZi5jdXJzb3JDb250cm9sICYmIHNlbGYuY3Vyc29yQ29udHJvbC5vbkJlYXQgJiYgdHlwZW9mIHNlbGYuY3Vyc29yQ29udHJvbC5vbkJlYXQgID09PSAnZnVuY3Rpb24nKVxuXHRcdFx0c2VsZi5jdXJzb3JDb250cm9sLm9uQmVhdChiZWF0TnVtYmVyLCB0b3RhbEJlYXRzLCB0b3RhbFRpbWUpO1xuXHR9O1xuXG5cdHNlbGYuZXZlbnRDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdGlmIChldmVudCkge1xuXHRcdFx0aWYgKHNlbGYuY3Vyc29yQ29udHJvbCAmJiBzZWxmLmN1cnNvckNvbnRyb2wub25FdmVudCAmJiB0eXBlb2Ygc2VsZi5jdXJzb3JDb250cm9sLm9uRXZlbnQgID09PSAnZnVuY3Rpb24nKVxuXHRcdFx0XHRzZWxmLmN1cnNvckNvbnRyb2wub25FdmVudChldmVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGYuZmluaXNoZWQoKTtcblx0XHR9XG5cdH07XG5cblx0c2VsZi5saW5lRW5kQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdGlmIChzZWxmLmN1cnNvckNvbnRyb2wgJiYgc2VsZi5jdXJzb3JDb250cm9sLm9uTGluZUVuZCAmJiB0eXBlb2Ygc2VsZi5jdXJzb3JDb250cm9sLm9uTGluZUVuZCAgPT09ICdmdW5jdGlvbicpXG5cdFx0XHRzZWxmLmN1cnNvckNvbnRyb2wub25MaW5lRW5kKGRhdGEpO1xuXHR9O1xuXG5cdHNlbGYuZ2V0VXJsID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzZWxmLm1pZGlCdWZmZXIuZG93bmxvYWQoKTtcblx0fTtcblxuXHRzZWxmLmRvd25sb2FkID0gZnVuY3Rpb24oZmlsZU5hbWUpIHtcblx0XHR2YXIgdXJsID0gc2VsZi5nZXRVcmwoKTtcblx0XHR2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKFwic3R5bGVcIixcImRpc3BsYXk6IG5vbmU7XCIpO1xuXHRcdGxpbmsuaHJlZiA9IHVybDtcblx0XHRsaW5rLmRvd25sb2FkID0gZmlsZU5hbWUgPyBmaWxlTmFtZSA6ICdvdXRwdXQud2F2Jztcblx0XHRsaW5rLmNsaWNrKCk7XG5cdFx0d2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoQ29udHJvbGxlcjtcbiIsIi8vICAgIGFiYzJhYmNfd3JpdGUuanM6IFByaW50cyBhbiBhYmMgZmlsZSBpbiB0ZXh0IGZvcm1hdCBwYXJzZWQgYnkgYWJjX3BhcnNlLmpzXG4vLyAgICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBHcmVnb3J5IER5a2UgKGdyZWdkeWtlIGF0IGdtYWlsIGRvdCBjb20pXG4vL1xuLy8gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkXG4vLyAgICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuLy8gICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZFxuLy8gICAgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xuLy8gICAgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gICAgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBUZXh0UHJpbnRlciA9IGZ1bmN0aW9uKGVsZW0sIHJlcG9zaXRpb24pIHtcbiAgICB0aGlzLmVsZW0gPSBlbGVtO1xuICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgdGhpcy5sID0gMS84O1xuICAgIHRoaXMucmVwb3NpdGlvbiA9IHJlcG9zaXRpb24gfHwgZmFsc2U7XG59XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5wcmludFN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgZWxlbSkge1xuICAgIGlmICh0aGlzLnJlcG9zaXRpb24gJiYgZWxlbSkgZWxlbS5zdGFydENoYXIgPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIHRoaXMudGV4dCArPSBzdHI7XG4gICAgaWYgKHRoaXMucmVwb3NpdGlvbiAmJiBlbGVtKSBlbGVtLmVuZENoYXIgPSB0aGlzLnRleHQubGVuZ3RoO1xufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLnByaW50TmV3TGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRleHQgKz0gXCJcXG5cIjtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5wcmludFNwYWNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnRleHRbdGhpcy50ZXh0Lmxlbmd0aC0xXS5tYXRjaCgvXFxzLykpIHJldHVybjsgLy9UT0RPIG1hdGNoIHdoaXRlc3BhY2VcbiAgICB0aGlzLnRleHQgKz0gXCIgXCI7XG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUucHJpbnRBQkMgPSBmdW5jdGlvbihhYmN0dW5lKSB7XG4gICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICB0aGlzLmFiY3R1bmUgPSBhYmN0dW5lO1xuICAgIC8vVE9ETyBmb3JtYXR0aW5nXG4gICAgdGhpcy5wcmludEhlYWRlcigpO1xuICAgIHRoaXMucHJpbnRCb2R5KCk7XG4gICAgdGhpcy5lbGVtLnZhbHVlPXRoaXMudGV4dDtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5wcmludEhlYWRlciA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIG11Y2ggb2YgdGhpcyBpbmZvIGlzIGR1cGxpY2F0ZWQgaW4gbWV0YVRleHRIRWFkZXJzIGluIGFiY19wYXJzZV9oZWFkZXIuanNcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcInhcIixcIlhcIixcIjFcIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJ0aXRsZVwiLFwiVFwiKTtcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcImNvbXBvc2VyXCIsXCJDXCIpO1xuICAgIHRoaXMucHJpbnRIZWFkZXJMaW5lKFwiaGlzdG9yeVwiLFwiSFwiKTtcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcImF1dGhvclwiLFwiQVwiKTtcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcImJvb2tcIixcIkJcIik7ICBcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcImRpc2NvZ3JhcGh5XCIsXCJEXCIpOyAgXG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJ1cmxcIixcIkZcIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJncm91cFwiLFwiR1wiKTtcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcImluc3RydWN0aW9uXCIsXCJJXCIpO1xuICAgIHRoaXMucHJpbnRIZWFkZXJMaW5lKFwibm90ZXNcIixcIk5cIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJvcmlnaW5cIixcIk9cIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJyaHl0aG1cIixcIlJcIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJzb3VyY2VcIixcIlNcIik7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJ1bmFsaWduZWR3b3Jkc1wiLFwiV1wiKTtcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcInRyYW5zY3JpcHRpb25cIixcIlpcIik7XG4gICAgLy9UT0RPIHBhcnQgb3JkZXJcbiAgICAvL1RPRE8gUSB0ZW1wb1xuICAgIC8vVE9ETyB0ZXh0QmxvY2tcbiAgICB0aGlzLnByaW50SGVhZGVyTGluZShcIk5VTExcIixcIkxcIixcIjEvOFwiKTsgLy9UT0RPIExcblxuICAgIHRoaXMucHJpbnRIZWFkZXJMaW5lKFwiTlVMTFwiLFwiTVwiLHRoaXMuZ2V0TWV0ZXJTdHJpbmcodGhpcy5hYmN0dW5lLmxpbmVzWzBdLnN0YWZmWzBdLm1ldGVyKSk7XG4gICAgdGhpcy5wcmludEhlYWRlckxpbmUoXCJOVUxMXCIsXCJLXCIsdGhpcy5nZXRLZXlTdHJpbmcodGhpcy5hYmN0dW5lLmxpbmVzWzBdLnN0YWZmWzBdLmtleSkpOy8vVE9ETyBLXG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUuZ2V0S2V5U3RyaW5nID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGtleS5yb290K2tleS5hY2Mra2V5Lm1vZGU7XG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUuZ2V0TWV0ZXJTdHJpbmcgPSBmdW5jdGlvbihtZXRlcikge1xuICAgIHN3aXRjaCAobWV0ZXIudHlwZSkge1xuICAgIGNhc2UgXCJjdXRfdGltZVwiOiByZXR1cm4gXCJDfFwiO1xuICAgIGNhc2UgXCJjb21tb25fdGltZVwiOiByZXR1cm4gXCJDXCI7XG4gICAgY2FzZSBcInNwZWNpZmllZFwiOlxuICAgICAgaWYgKG1ldGVyLnZhbHVlWzBdLmRlbilcblx0XHRyZXR1cm4gbWV0ZXIudmFsdWVbMF0ubnVtK1wiL1wiK21ldGVyLnZhbHVlWzBdLmRlbjtcbiAgICAgIGVsc2Vcblx0ICAgIHJldHVybiBtZXRlci52YWx1ZVswXS5udW07XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLnByaW50SGVhZGVyTGluZSA9IGZ1bmN0aW9uKGZpZWxkbmFtZSwgYWJjZmllbGQsIGRlZmF1dCkge1xuICAgIHZhciB2YWwgPSB0aGlzLmFiY3R1bmUubWV0YVRleHRbZmllbGRuYW1lXSB8fCBkZWZhdXQ7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdHZhciB2YWxhcnJheSA9IHZhbC5zcGxpdChcIlxcblwiKTtcblx0Zm9yICh2YXIgaT0wOyBpPHZhbGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICB0aGlzLnByaW50U3RyaW5nKGFiY2ZpZWxkK1wiOiBcIit2YWxhcnJheVtpXSk7XG5cdCAgICB0aGlzLnByaW50TmV3TGluZSgpO1xuXHR9IFxuICAgIH1cbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5nZXRFbGVtID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYWJjbGluZS5sZW5ndGggPD0gdGhpcy5wb3MpXG5cdHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmFiY2xpbmVbdGhpcy5wb3NdO1xufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLmdldE5leHRFbGVtID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYWJjbGluZS5sZW5ndGggPD0gdGhpcy5wb3MrMSlcblx0cmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuYWJjbGluZVt0aGlzLnBvcysxXTtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5wcmludEJvZHkgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGxpbmU9MDsgbGluZTx0aGlzLmFiY3R1bmUubGluZXMubGVuZ3RoOyBsaW5lKyspIHtcblx0dmFyIGFiY2xpbmUgPSB0aGlzLmFiY3R1bmUubGluZXNbbGluZV07XG5cdGlmIChhYmNsaW5lLnN0YWZmKSB7XG5cdCAgICB0aGlzLnByaW50QUJDTGluZShhYmNsaW5lLnN0YWZmKTtcblx0fSBlbHNlIGlmIChhYmNsaW5lLnN1YnRpdGxlICYmIGxpbmUhPT0wKSB7XG5cdCAgICAvL1RPRE9cblx0fSBlbHNlIGlmIChhYmNsaW5lLnRleHQpIHtcblx0ICAgIC8vVE9ET1xuXHR9XG4gICAgfVxufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLnByaW50QUJDTGluZSA9IGZ1bmN0aW9uKHN0YWZmcykge1xuICAgIGZvciAodGhpcy5zID0gMDsgdGhpcy5zIDwgc3RhZmZzLmxlbmd0aDsgdGhpcy5zKyspIHtcblx0dGhpcy5wcmludEFCQ1N0YWZmKHN0YWZmc1t0aGlzLnNdKTtcbiAgICB9XG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUucHJpbnRBQkNTdGFmZiA9IGZ1bmN0aW9uKGFiY3N0YWZmKSB7XG4gICAgXG4gICAgLy8gVE9ETyBpZiAoYWJjc3RhZmYuYnJhY2tldCkgaGVhZGVyICs9IFwiYnJhY2tldCBcIithYmNzdGFmZi5icmFja2V0K1wiIFwiO1xuICAgIC8vIFRPRE8gaWYgKGFiY3N0YWZmLmJyYWNlKSBoZWFkZXIgKz0gXCJicmFjZSBcIithYmNzdGFmZi5icmFjZStcIiBcIjtcbiAgICBcbiAgICBcbiAgICBmb3IgKHRoaXMudiA9IDA7IHRoaXMudiA8IGFiY3N0YWZmLnZvaWNlcy5sZW5ndGg7IHRoaXMudisrKSB7XG5cdC8vIFRPRE8gc3R1ZmYgYWJvdXQgdm9pY2VzXG5cdFxuXHQvLyBUT0RPIHRoaXMgaXMgd2hlcmUga2V5IHNpZyBpcyB0aGlzLnZvaWNlLmFkZENoaWxkKHRoaXMucHJpbnRDbGVmKGFiY3N0YWZmLmNsZWYpKTtcblx0Ly8gdGhpcy52b2ljZS5hZGRDaGlsZCh0aGlzLnByaW50S2V5U2lnbmF0dXJlKGFiY3N0YWZmLmtleSkpO1xuXHQvLyBpZiAoYWJjc3RhZmYubWV0ZXIpIHRoaXMudm9pY2UuYWRkQ2hpbGQodGhpcy5wcmludFRpbWVTaWduYXR1cmUoYWJjc3RhZmYubWV0ZXIpKTtcblx0dGhpcy5wcmludEFCQ1ZvaWNlKGFiY3N0YWZmLnZvaWNlc1t0aGlzLnZdKTtcbiAgICB9XG4gICAgXG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUucHJpbnRBQkNWb2ljZSA9IGZ1bmN0aW9uKGFiY2xpbmUpIHtcbiAgICB0aGlzLmFiY2xpbmUgPSBhYmNsaW5lO1xuICAgIGZvciAodGhpcy5wb3M9MDsgdGhpcy5wb3M8dGhpcy5hYmNsaW5lLmxlbmd0aDsgdGhpcy5wb3MrKykge1xuXHR0aGlzLnByaW50QUJDRWxlbWVudCgpO1xuICAgIH1cbiAgICB0aGlzLnByaW50TmV3TGluZSgpO1xufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLnByaW50QUJDRWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGVtID0gdGhpcy5nZXRFbGVtKCk7XG4gICAgc3dpdGNoIChlbGVtLmVsX3R5cGUpIHtcbiAgICBjYXNlIFwibm90ZVwiOlxuXHR0aGlzLnByaW50QmVhbSgpO1xuXHRicmVhaztcbiAgICBjYXNlIFwiYmFyXCI6XG5cdHRoaXMucHJpbnRCYXJMaW5lKGVsZW0pO1xuXHRicmVhaztcbiAgICBjYXNlIFwibWV0ZXJcIjpcblx0Ly9UT0RPIHRoaXMucHJpbnRUaW1lU2lnbmF0dXJlKGVsZW0pO1xuXHRicmVhaztcbiAgICBjYXNlIFwiY2xlZlwiOlxuXHQvL1RPRE8gdGhpcy5wcmludENsZWYoZWxlbSk7XG5cdGJyZWFrO1xuICAgIGNhc2UgXCJrZXlcIjpcblx0Ly9UT0RPIHRoaXMucHJpbnRLZXlTaWduYXR1cmUoZWxlbSk7XG4gICAgY2FzZSBcInN0ZW1cIjpcblx0Ly9UT0RPIGRvIG5vdGhpbmc/XG5cdGJyZWFrO1xuICAgIGNhc2UgXCJwYXJ0XCI6XG5cdC8vVE9ETyBwcmludCBwYXJ0XG5cdGJyZWFrO1xuICAgIGRlZmF1bHQ6XG5cdC8vVE9ETyBzaG93IHdlJ3JlIG1pc3Npbmcgc29tZXRoaW5nXG4gICAgfVxufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLnByaW50QmVhbSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucHJpbnRTcGFjZSgpO1xuICAgIGlmICh0aGlzLmdldEVsZW0oKS5zdGFydEJlYW0gJiYgIXRoaXMuZ2V0RWxlbSgpLmVuZEJlYW0pIHtcblx0d2hpbGUgKHRoaXMuZ2V0RWxlbSgpKSB7XG5cdCAgICB0aGlzLnByaW50Tm90ZSh0aGlzLmdldEVsZW0oKSk7XG5cdCAgICBpZiAodGhpcy5nZXRFbGVtKCkuZW5kQmVhbSkge1xuXHRcdGJyZWFrO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wb3MrKztcblx0fVxuICAgIH0gZWxzZSB7XG5cdHRoaXMucHJpbnROb3RlKHRoaXMuZ2V0RWxlbSgpKTtcbiAgICB9XG4gICAgdGhpcy5wcmludFNwYWNlKCk7XG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUucHJpbnROb3RlID0gZnVuY3Rpb24oZWxlbSkge1xuICAgIHZhciBzdHIgPSBcIlwiO1xuXHR2YXIgaTtcbiAgICBpZiAoZWxlbS5jaG9yZCAhPT0gdW5kZWZpbmVkKSB7XG5cdGZvciAoaT0wOyBpPGVsZW0uY2hvcmQubGVuZ3RoOyBpKyspIHtcblx0ICAgIHN0cis9ICdcIicrZWxlbS5jaG9yZFtpXS5uYW1lKydcIic7XG5cdH1cbiAgICB9XG4gICAgXG4gICAgLy9UT0RPIHVuaWZ5IG1hcCBiZXR3ZWVuIG5hbWVzIGFuZCBzeW1ib2xzICh0byBiZSB1c2VkIHdpdGggYWJjcGFyc2U/KVxuICAgIHZhciBkZWNvcmF0aW9ucyA9IHtcblx0XCJzdGFjY2F0b1wiIDogXCIuXCIsXG5cdFwidXBib3dcIiA6IFwidVwiLFxuXHRcImRvd25ib3dcIiA6IFwidlwiLFxuXHRcInJvbGxcIiA6IFwiflwiLFxuXHRcImZlcm1hdGFcIiA6IFwiSFwiLFxuXHRcInNsaWRlXCIgOiBcIkpcIixcblx0XCJhY2NlbnRcIiA6IFwiTFwiLFxuXHRcIm1vcmRlbnRcIiA6IFwiTVwiLFxuXHRcInByYWxsdHJpbGxlclwiIDogXCJQXCIsXG5cdFwidHJpbGxcIiA6IFwiVFwiLFxuXHRcImxvd2VyXCIgOiBcIi5cIlxuICAgIH07XG5cbiAgICBpZiAoZWxlbS5kZWNvcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0Zm9yIChpPTA7IGk8ZWxlbS5kZWNvcmF0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgZGVjID0gZWxlbS5kZWNvcmF0aW9uW2ldO1xuXHQgICAgaWYgKGRlY29yYXRpb25zW2RlY10pIHtcblx0XHRzdHIrPWRlY29yYXRpb25zW2RlY107XG5cdCAgICB9IGVsc2Uge1xuXHRcdHN0cis9XCIhXCI7IC8vVE9ETyBoYXJkY29kZWRcblx0XHRzdHIrPWRlYztcblx0XHRzdHIrPVwiIVwiOyAvL1RPRE8gaGFyZGNvZGVkXG5cdCAgICB9XG5cdH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbS5ncmFjZW5vdGVzICE9PSB1bmRlZmluZWQpIHtcblx0c3RyKz1cIntcIjtcblx0Zm9yIChpPTA7IGk8ZWxlbS5ncmFjZW5vdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBzdHIrPXRoaXMuZ2V0Tm90ZVN0cmluZyhlbGVtLmdyYWNlbm90ZXNbaV0pO1xuXHR9XG5cdHN0cis9XCJ9XCI7XG4gICAgfVxuXG4gICAgdmFyIGlnbm9yZXNsdXIgPSBmYWxzZTtcbiAgICBpZiAoZWxlbS5waXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBlbGVtLnBpdGNoZXNbMF0uc3RhcnRTbHVyKSB7XG5cdGlnbm9yZXNsdXIgPSB0cnVlO1xuXHRzdHIrPXRoaXMubXVsdGlwbHlTdHJpbmcoXCIoXCIsZWxlbS5waXRjaGVzWzBdLnN0YXJ0U2x1ci5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChlbGVtLnN0YXJ0U2x1cikge1xuXHRzdHIrPXRoaXMubXVsdGlwbHlTdHJpbmcoXCIoXCIsZWxlbS5zdGFydFNsdXIubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoKGVsZW0ucGl0Y2hlcy5sZW5ndGggPT09IDEgJiYgZWxlbS5waXRjaGVzWzBdLmVuZFNsdXIpIHx8IGVsZW0uZW5kU2x1cikge1xuXHRpZ25vcmVzbHVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbS5zdGFydFRyaXBsZXQpIHtcblx0c3RyKz1cIigzXCI7XG4gICAgfVxuXG4gICAgaWYgKGVsZW0ucGl0Y2hlcykge1xuXHRpZiAoZWxlbS5waXRjaGVzLmxlbmd0aCA+IDEpIHN0cis9XCJbXCI7XG5cdGZvciAoaT0wOyBpPGVsZW0ucGl0Y2hlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgZWxlbS5waXRjaGVzW2ldLmR1cmF0aW9uID0gZWxlbS5kdXJhdGlvbjtcblx0ICAgIHN0cis9dGhpcy5nZXROb3RlU3RyaW5nKGVsZW0ucGl0Y2hlc1tpXSwgaWdub3Jlc2x1cik7XG5cdH1cblx0aWYgKGVsZW0ucGl0Y2hlcy5sZW5ndGggPiAxKSBzdHIrPVwiXVwiO1xuICAgIH0gXG5cbiAgICBpZiAoZWxlbS5waXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBlbGVtLnBpdGNoZXNbMF0uZW5kU2x1cikge1xuXHRzdHIrPXRoaXMubXVsdGlwbHlTdHJpbmcoXCIpXCIsZWxlbS5waXRjaGVzWzBdLmVuZFNsdXIubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbS5lbmRTbHVyKSB7XG5cdHN0cis9dGhpcy5tdWx0aXBseVN0cmluZyhcIilcIixlbGVtLmVuZFNsdXIubGVuZ3RoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByaW50U3RyaW5nKHN0cixlbGVtKTtcblxufTtcblxuLy8gYWNjaWRlbnRhbHMsIHRpZXMgYW5kIHNvbWV0aW1lcyBzbHVycywgc29tZXRpbWVzIGR1cmF0aW9uXG5UZXh0UHJpbnRlci5wcm90b3R5cGUuZ2V0Tm90ZVN0cmluZyA9IGZ1bmN0aW9uKHBpdGNoZWxlbSwgaWdub3Jlc2x1cikge1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGlmICghaWdub3Jlc2x1ciAmJiBwaXRjaGVsZW0uc3RhcnRTbHVyKSB7XG5cdHN0cis9XCIoXCI7XG4gICAgfVxuXG4gICAgdmFyIHN5bWIgPSBcIlwiO1xuICAgIHN3aXRjaCAocGl0Y2hlbGVtLmFjY2lkZW50YWwpIHtcbiAgICBjYXNlIFwicXVhcnRlcnNoYXJwXCI6XG5cdHN5bWIgPSBcIl4vXCI7XG5cdGJyZWFrO1xuICAgIGNhc2UgXCJkYmxzaGFycFwiOlxuXHRzeW1iID0gXCJeXlwiO1xuXHRicmVhaztcbiAgICBjYXNlIFwic2hhcnBcIjpcblx0c3ltYiA9IFwiXlwiO1xuXHRicmVhaztcbiAgICBjYXNlIFwicXVhcnRlcmZsYXRcIjpcblx0c3ltYiA9IFwiXy9cIjtcblx0YnJlYWs7XG4gICAgY2FzZSBcImZsYXRcIjpcblx0c3ltYiA9IFwiX1wiO1xuXHRicmVhaztcbiAgICBjYXNlIFwiZGJsZmxhdFwiOlxuXHRzeW1iID0gXCJfX1wiO1xuXHRicmVhaztcbiAgICBjYXNlIFwibmF0dXJhbFwiOlxuXHRzeW1iID0gXCI9XCI7XG4gICAgfVxuICAgIHN0cis9c3ltYjtcblxuICAgIHZhciBwaXRjaGVzID0gW1wiQ1wiLFwiRFwiLFwiRVwiLFwiRlwiLFwiR1wiLFwiQVwiLFwiQlwiXTtcbiAgICB2YXIgcGl0Y2hzdHIgPSBwaXRjaGVzW3RoaXMuZXh0cmFjdE5vdGUocGl0Y2hlbGVtLnBpdGNoKV07XG4gICAgdmFyIG9jdGF2ZSA9IHRoaXMuZXh0cmFjdE9jdGF2ZShwaXRjaGVsZW0ucGl0Y2gpO1xuICAgIGlmIChvY3RhdmU+MCkge1xuXHRwaXRjaHN0ciA9IHBpdGNoc3RyLnRvTG93ZXJDYXNlKCk7XG5cdG9jdGF2ZS0tO1xuXHR3aGlsZSAob2N0YXZlPjApIHtcblx0ICAgIHBpdGNoc3RyKz1cIidcIjtcblx0ICAgIG9jdGF2ZS0tO1xuXHR9XG4gICAgfSBlbHNlIHtcblx0d2hpbGUgKG9jdGF2ZTwwKSB7XG5cdCAgICBwaXRjaHN0cis9XCIsXCI7XG5cdCAgICBvY3RhdmUrKztcblx0fVxuICAgIH1cbiAgICBcbiAgICBzdHIrPXBpdGNoc3RyO1xuICAgIFxuICAgIGlmIChwaXRjaGVsZW0uZHVyYXRpb24pIHtcblx0c3RyKz10aGlzLmdldER1cmF0aW9uU3RyaW5nKHBpdGNoZWxlbS5kdXJhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFpZ25vcmVzbHVyICYmIHBpdGNoZWxlbS5lbmRTbHVyKSB7XG5cdHN0cis9XCIpXCI7XG4gICAgfVxuXG4gICAgaWYgKHBpdGNoZWxlbS5zdGFydFRpZSkge1xuXHRzdHIrPVwiLVwiO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5UZXh0UHJpbnRlci5wcm90b3R5cGUuZ2V0RHVyYXRpb25TdHJpbmcgPSBmdW5jdGlvbihkdXJhdGlvbikge1xuICAgIC8vVE9ETyBkZXRlY3QgY3Jvb2tlZCByaHl0aG1cbiAgICBpZiAoZHVyYXRpb24vdGhpcy5sID4gMSkge1xuXHRyZXR1cm4gZHVyYXRpb24vdGhpcy5sO1xuICAgIH0gXG4gICAgdmFyIHJldCA9IFwiXCI7XG4gICAgaWYgKHRoaXMubC9kdXJhdGlvbj4xKSB7XG5cdHJldCs9XCIvXCI7XG5cdGlmICh0aGlzLmwvZHVyYXRpb24+Mikge1xuXHQgICAgcmV0Kz10aGlzLmwvZHVyYXRpb247XG5cdH0gICBcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5leHRyYWN0Tm90ZSA9IGZ1bmN0aW9uKHBpdGNoKSB7XG4gICAgdmFyIHBpdGNoMiA9IHBpdGNoJTc7XG4gICAgaWYgKHBpdGNoMjwwKSBwaXRjaDIrPTc7XG4gICAgcmV0dXJuIHBpdGNoMjtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5leHRyYWN0T2N0YXZlID0gZnVuY3Rpb24ocGl0Y2gpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihwaXRjaC83KTtcbn07XG5cblRleHRQcmludGVyLnByb3RvdHlwZS5wcmludEJhckxpbmUgPSBmdW5jdGlvbihlbGVtKSB7XG4gICAgdmFyIGJhcnN0ciA9IFwiXCI7XG4gICAgc3dpdGNoIChlbGVtLnR5cGUpIHtcbiAgICBjYXNlIFwiYmFyX3RoaW5cIjogYmFyc3RyKz1cInxcIjsgYnJlYWs7XG4gICAgY2FzZSBcImJhcl90aGluX3RoaWNrXCI6IGJhcnN0cis9XCJ8XVwiOyBicmVhaztcbiAgICBjYXNlIFwiYmFyX3RoaW5fdGhpblwiOiBiYXJzdHIrPVwifHxcIjsgYnJlYWs7XG4gICAgY2FzZSBcImJhcl90aGlja190aGluXCI6IGJhcnN0cis9XCJbfFwiOyBicmVhaztcbiAgICBjYXNlIFwiYmFyX2RibF9yZXBlYXRcIjogYmFyc3RyKz1cIjp8fDpcIjsgYnJlYWs7XG4gICAgY2FzZSBcImJhcl9sZWZ0X3JlcGVhdFwiOiBiYXJzdHIrPVwifDpcIjsgYnJlYWs7XG4gICAgY2FzZSBcImJhcl9yaWdodF9yZXBlYXRcIjogYmFyc3RyKz1cIjp8XCI7IGJyZWFrO1xuICAgIGNhc2UgXCJiYXJfaW52aXNpYmxlXCI6IGJhcnN0cis9XCJcIjsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucHJpbnRTdHJpbmcoYmFyc3RyLGVsZW0pO1xufTtcblxuVGV4dFByaW50ZXIucHJvdG90eXBlLm11bHRpcGx5U3RyaW5nID0gZnVuY3Rpb24gKHMsIG4pIHtcbiAgICB2YXIgcmV0ID0gXCJcIjtcbiAgICBmb3IgKDtuPjA7bi0tKSByZXQrPXM7XG4gICAgcmV0dXJuIHJldDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVGV4dFByaW50ZXI7XG4iLCIvLyBhYmNfZWRpdG9yLmpzXG4vLyB3aW5kb3cuQUJDSlMuRWRpdG9yIGlzIHRoZSBpbnRlcmZhY2UgY2xhc3MgZm9yIHRoZSBhcmVhIHRoYXQgY29udGFpbnMgdGhlIEFCQyB0ZXh0LiBJdCBpcyByZXNwb25zaWJsZSBmb3Jcbi8vIGhvbGRpbmcgdGhlIHRleHQgb2YgdGhlIHR1bmUgYW5kIGNhbGxpbmcgdGhlIHBhcnNlciBhbmQgdGhlIHJlbmRlcmluZyBlbmdpbmVzLlxuLy9cbi8vIEVkaXRBcmVhIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgYSB0ZXh0YXJlYSBhcyB0aGUgY29udHJvbCB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLiBBcyBsb25nIGFzXG4vLyB0aGUgc2FtZSBpbnRlcmZhY2UgaXMgdXNlZCwgd2luZG93LkFCQ0pTLkVkaXRvciBjYW4gdXNlIGEgZGlmZmVyZW50IHR5cGUgb2Ygb2JqZWN0LlxuLy9cbi8vIEVkaXRBcmVhOlxuLy8gLSBjb25zdHJ1Y3Rvcih0ZXh0YXJlYWlkKVxuLy9cdFx0VGhpcyBjb250YWlucyB0aGUgaWQgb2YgYSB0ZXh0YXJlYSBjb250cm9sIHRoYXQgd2lsbCBiZSB1c2VkLlxuLy8gLSBhZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcilcbi8vXHRcdEEgY2FsbGJhY2sgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgZW50cnkgcG9pbnQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoKVxuLy8gLSBhZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcilcbi8vXHRcdEEgY2FsbGJhY2sgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgZW50cnkgcG9pbnQgZmlyZUNoYW5nZWQoKVxuLy8gLSBnZXRTZWxlY3Rpb24oKVxuLy9cdFx0cmV0dXJucyB0aGUgb2JqZWN0IHsgc3RhcnQ6ICwgZW5kOiB9IHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIGNoYXJhY3RlcnNcbi8vIC0gc2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpXG4vL1x0XHRzdGFydCBhbmQgZW5kIGFyZSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9ucyB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZC5cbi8vIC0gZ2V0U3RyaW5nKClcbi8vXHRcdHJldHVybnMgdGhlIEFCQyB0ZXh0IHRoYXQgaXMgY3VycmVudGx5IGRpc3BsYXllZC5cbi8vIC0gc2V0U3RyaW5nKHN0cilcbi8vXHRcdHNldHMgdGhlIEFCQyB0ZXh0IHRoYXQgaXMgY3VycmVudGx5IGRpc3BsYXllZCwgYW5kIHJlc2V0cyB0aGUgaW5pdGlhbFRleHQgdmFyaWFibGVcbi8vIC0gZ2V0RWxlbSgpXG4vL1x0XHRyZXR1cm5zIHRoZSB0ZXh0YXJlYSBlbGVtZW50XG4vLyAtIHN0cmluZyBpbml0aWFsVGV4dFxuLy9cdFx0Q29udGFpbnMgdGhlIHN0YXJ0aW5nIHRleHQuIFRoaXMgY2FuIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIGN1cnJlbnQgdGV4dCB0byBzZWUgaWYgYW55dGhpbmcgY2hhbmdlZC5cbi8vXG5cbi8qZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIGNsZWFyVGltZW91dCwgc2V0VGltZW91dCAqL1xuXG52YXIgVHVuZUJvb2sgPSByZXF1aXJlKCcuLi9hcGkvYWJjX3R1bmVib29rJykuVHVuZUJvb2s7XG52YXIgcGFyc2VDb21tb24gPSByZXF1aXJlKCcuLi9wYXJzZS9hYmNfY29tbW9uJyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCcuLi9wYXJzZS9hYmNfcGFyc2UnKTtcbnZhciBUZXh0UHJpbnRlciA9IHJlcXVpcmUoJy4uL3RyYW5zZm9ybS9hYmMyYWJjX3dyaXRlJyk7XG52YXIgRW5ncmF2ZXJDb250cm9sbGVyID0gcmVxdWlyZSgnLi4vd3JpdGUvYWJjX2VuZ3JhdmVyX2NvbnRyb2xsZXInKTtcbnZhciBTeW50aENvbnRyb2xsZXIgPSByZXF1aXJlKCcuLi9zeW50aC9zeW50aC1jb250cm9sbGVyJyk7XG52YXIgc3VwcG9ydHNBdWRpbyA9IHJlcXVpcmUoJy4uL3N5bnRoL3N1cHBvcnRzLWF1ZGlvJyk7XG5cbi8vIFBvbHlmaWxsIGZvciBDdXN0b21FdmVudCBmb3Igb2xkIElFIHZlcnNpb25zXG5pZiAoIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgIT09IFwiZnVuY3Rpb25cIiApIHtcblx0dmFyIEN1c3RvbUV2ZW50ID0gZnVuY3Rpb24oZXZlbnQsIHBhcmFtcykge1xuXHRcdHBhcmFtcyA9IHBhcmFtcyB8fCB7YnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlLCBkZXRhaWw6IHVuZGVmaW5lZH07XG5cdFx0dmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuXHRcdGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG5cdFx0cmV0dXJuIGV2dDtcblx0fTtcblx0Q3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblx0d2luZG93LkN1c3RvbUV2ZW50ID0gQ3VzdG9tRXZlbnQ7XG59XG5cbnZhciBFZGl0QXJlYSA9IGZ1bmN0aW9uKHRleHRhcmVhaWQpIHtcbiAgdGhpcy50ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRleHRhcmVhaWQpO1xuICB0aGlzLmluaXRpYWxUZXh0ID0gdGhpcy50ZXh0YXJlYS52YWx1ZTtcbiAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG59XG5cbkVkaXRBcmVhLnByb3RvdHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciA9IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gIHRoaXMudGV4dGFyZWEub25tb3VzZW1vdmUgPSBmdW5jdGlvbihldikge1xuXHQgIGlmICh0aGlzLmlzRHJhZ2dpbmcpXG5cdCAgICBsaXN0ZW5lci5maXJlU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICB9O1xufTtcblxuRWRpdEFyZWEucHJvdG90eXBlLmFkZENoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgdGhpcy5jaGFuZ2VsaXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLnRleHRhcmVhLm9ua2V5dXAgPSBmdW5jdGlvbigpIHtcbiAgICBsaXN0ZW5lci5maXJlQ2hhbmdlZCgpO1xuICB9O1xuICB0aGlzLnRleHRhcmVhLm9ubW91c2Vkb3duID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgbGlzdGVuZXIuZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfTtcbiAgdGhpcy50ZXh0YXJlYS5vbm1vdXNldXAgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGlzdGVuZXIuZmlyZUNoYW5nZWQoKTtcbiAgfTtcbiAgdGhpcy50ZXh0YXJlYS5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgIGxpc3RlbmVyLmZpcmVDaGFuZ2VkKCk7XG4gIH07XG59O1xuXG4vL1RPRE8gd29uJ3Qgd29yayB1bmRlciBJRT9cbkVkaXRBcmVhLnByb3RvdHlwZS5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtzdGFydDogdGhpcy50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCwgZW5kOiB0aGlzLnRleHRhcmVhLnNlbGVjdGlvbkVuZH07XG59O1xuXG5FZGl0QXJlYS5wcm90b3R5cGUuc2V0U2VsZWN0aW9uID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuXHRpZih0aGlzLnRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKVxuXHQgICB0aGlzLnRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuXHRlbHNlIGlmKHRoaXMudGV4dGFyZWEuY3JlYXRlVGV4dFJhbmdlKSB7XG5cdFx0Ly8gRm9yIElFOFxuXHQgICB2YXIgZSA9IHRoaXMudGV4dGFyZWEuY3JlYXRlVGV4dFJhbmdlKCk7XG5cdCAgIGUuY29sbGFwc2UodHJ1ZSk7XG5cdCAgIGUubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kKTtcblx0ICAgZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTtcblx0ICAgZS5zZWxlY3QoKTtcblx0fVxuICB0aGlzLnRleHRhcmVhLmZvY3VzKCk7XG59O1xuXG5FZGl0QXJlYS5wcm90b3R5cGUuZ2V0U3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnRleHRhcmVhLnZhbHVlO1xufTtcblxuRWRpdEFyZWEucHJvdG90eXBlLnNldFN0cmluZyA9IGZ1bmN0aW9uKHN0cikge1xuICB0aGlzLnRleHRhcmVhLnZhbHVlID0gc3RyO1xuICB0aGlzLmluaXRpYWxUZXh0ID0gdGhpcy5nZXRTdHJpbmcoKTtcbiAgaWYgKHRoaXMuY2hhbmdlbGlzdGVuZXIpIHtcbiAgICB0aGlzLmNoYW5nZWxpc3RlbmVyLmZpcmVDaGFuZ2VkKCk7XG4gIH1cbn07XG5cbkVkaXRBcmVhLnByb3RvdHlwZS5nZXRFbGVtID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnRleHRhcmVhO1xufTtcblxuLy9cbi8vIHdpbmRvdy5BQkNKUy5FZGl0b3I6XG4vL1xuLy8gY29uc3RydWN0b3IoZWRpdGFyZWEsIHBhcmFtcylcbi8vXHRcdGlmIGVkaXRhcmVhIGlzIGEgc3RyaW5nLCB0aGVuIGl0IGlzIGFuIEhUTUwgaWQgb2YgYSB0ZXh0YXJlYSBjb250cm9sLlxuLy9cdFx0T3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgYW4gaW5zdGFudGlhdGlvbiBvZiBhbiBvYmplY3QgdGhhdCBleHByZXNzZXMgdGhlIEVkaXRBcmVhIGludGVyZmFjZS5cbi8vXG4vL1x0XHRwYXJhbXMgaXMgYSBoYXNoIG9mOlxuLy9cdFx0Y2FudmFzX2lkOiBvciBwYXBlcl9pZDogSFRNTCBpZCB0byBkcmF3IGluLiBJZiBub3QgcHJlc2VudCwgdGhlbiB0aGUgZHJhd2luZyBoYXBwZW5zIGp1c3QgYmVsb3cgdGhlIGVkaXRvci5cbi8vXHRcdGdlbmVyYXRlX21pZGk6IGlmIHByZXNlbnQsIHRoZW4gbWlkaSBpcyBnZW5lcmF0ZWQuXG4vL1x0XHRtaWRpX2lkOiBpZiBwcmVzZW50LCB0aGUgSFRNTCBpZCB0byBwbGFjZSB0aGUgbWlkaSBjb250cm9sLiBPdGhlcndpc2UgaXQgaXMgcGxhY2VkIGluIHRoZSBzYW1lIGRpdiBhcyB0aGUgcGFwZXIuXG4vL1x0XHRtaWRpX2Rvd25sb2FkX2lkOiBpZiBwcmVzZW50LCB0aGUgSFRNTCBpZCB0byBwbGFjZSB0aGUgbWlkaSBkb3dubG9hZCBsaW5rLiBPdGhlcndpc2UgaXQgaXMgcGxhY2VkIGluIHRoZSBzYW1lIGRpdiBhcyB0aGUgcGFwZXIuXG4vL1x0XHRnZW5lcmF0ZV93YXJuaW5nczogaWYgcHJlc2VudCwgdGhlbiBwYXJzZXIgd2FybmluZ3MgYXJlIGRpc3BsYXllZCBvbiB0aGUgcGFnZS5cbi8vXHRcdHdhcm5pbmdzX2lkOiBpZiBwcmVzZW50LCB0aGUgSFRNTCBpZCB0byBwbGFjZSB0aGUgd2FybmluZ3MuIE90aGVyd2lzZSB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIHNhbWUgZGl2IGFzIHRoZSBwYXBlci5cbi8vXHRcdG9uY2hhbmdlOiBpZiBwcmVzZW50LCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlciB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZS5cbi8vXHRcdGd1aTogaWYgcHJlc2VudCwgdGhlIHBhcGVyIGNhbiBzZW5kIGNoYW5nZXMgYmFjayB0byB0aGUgZWRpdG9yIChwcmVzdW1hYmx5IGJlY2F1c2UgdGhlIHVzZXIgY2hhbmdlZCBzb21ldGhpbmcgZGlyZWN0bHkuKVxuLy9cdFx0cGFyc2VyX29wdGlvbnM6IG9wdGlvbnMgdG8gc2VuZCB0byB0aGUgcGFyc2VyIGVuZ2luZS5cbi8vXHRcdG1pZGlfb3B0aW9uczogb3B0aW9ucyB0byBzZW5kIHRvIHRoZSBtaWRpIGVuZ2luZS5cbi8vXHRcdHJlbmRlcl9vcHRpb25zOiBvcHRpb25zIHRvIHNlbmQgdG8gdGhlIHJlbmRlciBlbmdpbmUuXG4vL1x0XHRpbmRpY2F0ZV9jaGFuZ2VkOiB0aGUgZGlydHkgZmxhZyBpcyBzZXQgaWYgdGhpcyBpcyB0cnVlLlxuLy9cbi8vIC0gc2V0UmVhZE9ubHkoYm9vbClcbi8vXHRcdGFkZHMgb3IgcmVtb3ZlcyB0aGUgY2xhc3MgYWJjX3RleHRhcmVhX3JlYWRvbmx5LCBhbmQgYWRkcyBvciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgcmVhZG9ubHk9eWVzXG4vLyAtIHNldERpcnR5U3R5bGUoYm9vbClcbi8vXHRcdGFkZHMgb3IgcmVtb3ZlcyB0aGUgY2xhc3MgYWJjX3RleHRhcmVhX2RpcnR5XG4vLyAtIHJlbmRlclR1bmUoYWJjLCBwYXJzZXJwYXJhbXMsIGRpdilcbi8vXHRcdEltbWVkaWF0ZWx5IHJlbmRlcnMgdGhlIHR1bmUuIChVc2VmdWwgZm9yIGNyZWF0aW5nIHRoZSBTVkcgb3V0cHV0IGJlaGluZCB0aGUgc2NlbmVzLCBpZiBkaXYgaXMgaGlkZGVuKVxuLy9cdFx0c3RyaW5nIGFiYzogdGhlIEFCQyB0ZXh0XG4vL1x0XHRwYXJzZXJwYXJhbXM6IHBhcmFtcyB0byBzZW5kIHRvIHRoZSBwYXJzZXJcbi8vXHRcdGRpdjogdGhlIEhUTUwgaWQgdG8gcmVuZGVyIHRvLlxuLy8gLSBtb2RlbENoYW5nZWQoKVxuLy9cdFx0Q2FsbGVkIHdoZW4gdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQgdG8gdHJpZ2dlciByZS1yZW5kZXJpbmdcbi8vIC0gcGFyc2VBQkMoKVxuLy9cdFx0Q2FsbGVkIGludGVybmFsbHkgYnkgZmlyZUNoYW5nZWQoKVxuLy9cdFx0cmV0dXJucyB0cnVlIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIHNpbmNlIGxhc3QgY2FsbC5cbi8vIC0gdXBkYXRlU2VsZWN0aW9uKClcbi8vXHRcdENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSBzZWxlY3Rpb24uIFRoaXMgY2FsbHMgdGhlIGVuZ3JhdmVyX2NvbnRyb2xsZXIgdG8gc2hvdyB0aGUgc2VsZWN0aW9uLlxuLy8gLSBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpXG4vL1x0XHRDYWxsZWQgYnkgdGhlIHRleHRhcmVhIG9iamVjdCB3aGVuIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSBzZWxlY3Rpb24uXG4vLyAtIHBhcmFtQ2hhbmdlZChlbmdyYXZlcnBhcmFtcylcbi8vXHRcdENhbGxlZCB0byBzaWduYWwgdGhhdCB0aGUgZW5ncmF2ZXIgcGFyYW1zIGhhdmUgY2hhbmdlZCwgc28gcmUtcmVuZGVyaW5nIHNob3VsZCBvY2N1ci5cbi8vIC0gZmlyZUNoYW5nZWQoKVxuLy9cdFx0Q2FsbGVkIGJ5IHRoZSB0ZXh0YXJlYSBvYmplY3Qgd2hlbiB0aGUgdXNlciBoYXMgY2hhbmdlZCBzb21ldGhpbmcuXG4vLyAtIHNldE5vdERpcnR5KClcbi8vXHRcdENhbGxlZCBieSB0aGUgY2xpZW50IGFwcCB0byByZXNldCB0aGUgZGlydHkgZmxhZ1xuLy8gLSBpc0RpcnR5KClcbi8vXHRcdFJldHVybnMgdHJ1ZSBvciBmYWxzZSwgd2hldGhlciB0aGUgdGV4dGFyZWEgY29udGFpbnMgdGhlIHNhbWUgdGV4dCB0aGF0IGl0IHN0YXJ0ZWQgd2l0aC5cbi8vIC0gaGlnaGxpZ2h0KGFiY2VsZW0pXG4vL1x0XHRDYWxsZWQgYnkgdGhlIGVuZ3JhdmVyX2NvbnRyb2xsZXIgdG8gaGlnaGxpZ2h0IGFuIGFyZWEuXG4vLyAtIHBhdXNlKGJvb2wpXG4vL1x0XHRTdG9wcyB0aGUgYXV0b21hdGljIHJlbmRlcmluZyB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZy5cbi8vXG5cbnZhciBFZGl0b3IgPSBmdW5jdGlvbihlZGl0YXJlYSwgcGFyYW1zKSB7XG5cdC8vIENvcHkgYWxsIHRoZSBvcHRpb25zIHRoYXQgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaFxuXHR0aGlzLmFiY2pzUGFyYW1zID0ge307XG5cdHZhciBrZXk7XG5cdGlmIChwYXJhbXMuYWJjanNQYXJhbXMpIHtcblx0XHRmb3IgKGtleSBpbiBwYXJhbXMuYWJjanNQYXJhbXMpIHtcblx0XHRcdGlmIChwYXJhbXMuYWJjanNQYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHR0aGlzLmFiY2pzUGFyYW1zW2tleV0gPSBwYXJhbXMuYWJjanNQYXJhbXNba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKHBhcmFtcy5taWRpX29wdGlvbnMpIHtcblx0XHRmb3IgKGtleSBpbiBwYXJhbXMubWlkaV9vcHRpb25zKSB7XG5cdFx0XHRpZiAocGFyYW1zLm1pZGlfb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdHRoaXMuYWJjanNQYXJhbXNba2V5XSA9IHBhcmFtcy5taWRpX29wdGlvbnNba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKHBhcmFtcy5wYXJzZXJfb3B0aW9ucykge1xuXHRcdGZvciAoa2V5IGluIHBhcmFtcy5wYXJzZXJfb3B0aW9ucykge1xuXHRcdFx0aWYgKHBhcmFtcy5wYXJzZXJfb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdHRoaXMuYWJjanNQYXJhbXNba2V5XSA9IHBhcmFtcy5wYXJzZXJfb3B0aW9uc1trZXldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAocGFyYW1zLnJlbmRlcl9vcHRpb25zKSB7XG5cdFx0Zm9yIChrZXkgaW4gcGFyYW1zLnJlbmRlcl9vcHRpb25zKSB7XG5cdFx0XHRpZiAocGFyYW1zLnJlbmRlcl9vcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0dGhpcy5hYmNqc1BhcmFtc1trZXldID0gcGFyYW1zLnJlbmRlcl9vcHRpb25zW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKHBhcmFtcy5pbmRpY2F0ZV9jaGFuZ2VkKVxuXHRcdHRoaXMuaW5kaWNhdGVfY2hhbmdlZCA9IHRydWU7XG4gIGlmICh0eXBlb2YgZWRpdGFyZWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICB0aGlzLmVkaXRhcmVhID0gbmV3IEVkaXRBcmVhKGVkaXRhcmVhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmVkaXRhcmVhID0gZWRpdGFyZWE7XG4gIH1cbiAgdGhpcy5lZGl0YXJlYS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTtcbiAgdGhpcy5lZGl0YXJlYS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTtcblxuICBpZiAocGFyYW1zLmNhbnZhc19pZCkge1xuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLmNhbnZhc19pZCk7XG4gIH0gZWxzZSBpZiAocGFyYW1zLnBhcGVyX2lkKSB7XG4gICAgdGhpcy5kaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMucGFwZXJfaWQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTtcbiAgICB0aGlzLmVkaXRhcmVhLmdldEVsZW0oKS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmRpdiwgdGhpcy5lZGl0YXJlYS5nZXRFbGVtKCkpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjaykge1xuICBcdHRoaXMuc2VsZWN0aW9uQ2hhbmdlQ2FsbGJhY2sgPSBwYXJhbXMuc2VsZWN0aW9uQ2hhbmdlQ2FsbGJhY2s7XG4gIH1cblxuICBpZiAocGFyYW1zLnN5bnRoKSB7XG4gIFx0aWYgKHN1cHBvcnRzQXVkaW8oKSkge1xuXHQgICAgdGhpcy5zeW50aCA9IHtcblx0XHQgICAgZWw6IHBhcmFtcy5zeW50aC5lbCxcblx0XHQgICAgY3Vyc29yQ29udHJvbDogcGFyYW1zLnN5bnRoLmN1cnNvckNvbnRyb2wsXG5cdFx0ICAgIG9wdGlvbnM6IHBhcmFtcy5zeW50aC5vcHRpb25zXG5cdCAgICB9XG4gICAgfVxuICB9XG5cdC8vIElmIHRoZSB1c2VyIHdhbnRzIG1pZGksIHRoZW4gc3RvcmUgdGhlIGVsZW1lbnRzIHRoYXQgaXQgd2lsbCBiZSB3cml0dGVuIHRvLiBUaGUgZWxlbWVudCBjb3VsZCBlaXRoZXIgYmUgcGFzc2VkIGluIGFzIGFuIGlkLFxuXHQvLyBhbiBlbGVtZW50LCBvciBub3RoaW5nLiBJZiBub3RoaW5nIGlzIHBhc3NlZCBpbiwgdGhlbiBqdXN0IHB1dCB0aGUgbWlkaSBvbiB0b3Agb2YgdGhlIGdlbmVyYXRlZCBtdXNpYy5cblx0aWYgKHBhcmFtcy5nZW5lcmF0ZV9taWRpKSB7XG5cdCAgXHR0aGlzLmdlbmVyYXRlX21pZGkgPSBwYXJhbXMuZ2VuZXJhdGVfbWlkaTtcblx0XHRpZiAodGhpcy5hYmNqc1BhcmFtcy5nZW5lcmF0ZURvd25sb2FkKSB7XG5cdFx0XHRpZiAodHlwZW9mIHBhcmFtcy5taWRpX2Rvd25sb2FkX2lkID09PSAnc3RyaW5nJylcblx0XHRcdFx0dGhpcy5kb3dubG9hZE1pZGkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMubWlkaV9kb3dubG9hZF9pZCk7XG5cdFx0XHRlbHNlIGlmIChwYXJhbXMubWlkaV9kb3dubG9hZF9pZCkgLy8gYXNzdW1lLCBpZiB0aGUgdmFyIGlzIG5vdCBhIHN0cmluZyBpdCBpcyBhbiBlbGVtZW50LiBJZiBub3QsIGl0IHdpbGwgY3Jhc2ggc29vbiBlbm91Z2guXG5cdFx0XHRcdHRoaXMuZG93bmxvYWRNaWRpID0gcGFyYW1zLm1pZGlfZG93bmxvYWRfaWQ7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmFiY2pzUGFyYW1zLmdlbmVyYXRlSW5saW5lICE9PSBmYWxzZSkgeyAvLyBUaGUgZGVmYXVsdCBmb3IgdGhpcyBpcyB0cnVlLCBzbyB1bmRlZmluZWQgaXMgYWxzbyB0cnVlLlxuXHRcdFx0aWYgKHR5cGVvZiBwYXJhbXMubWlkaV9pZCA9PT0gJ3N0cmluZycpXG5cdFx0XHRcdHRoaXMuaW5saW5lTWlkaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5taWRpX2lkKTtcblx0XHRcdGVsc2UgaWYgKHBhcmFtcy5taWRpX2lkKSAvLyBhc3N1bWUsIGlmIHRoZSB2YXIgaXMgbm90IGEgc3RyaW5nIGl0IGlzIGFuIGVsZW1lbnQuIElmIG5vdCwgaXQgd2lsbCBjcmFzaCBzb29uIGVub3VnaC5cblx0XHRcdFx0dGhpcy5pbmxpbmVNaWRpID0gcGFyYW1zLm1pZGlfaWQ7XG5cdFx0fVxuXHR9XG5cbiAgaWYgKHBhcmFtcy5nZW5lcmF0ZV93YXJuaW5ncyB8fCBwYXJhbXMud2FybmluZ3NfaWQpIHtcbiAgICBpZiAocGFyYW1zLndhcm5pbmdzX2lkKSB7XG4gICAgICB0aGlzLndhcm5pbmdzZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLndhcm5pbmdzX2lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53YXJuaW5nc2RpdiA9IHRoaXMuZGl2O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMub25jaGFuZ2VDYWxsYmFjayA9IHBhcmFtcy5vbmNoYW5nZTtcblxuICBpZiAocGFyYW1zLmd1aSkge1xuICAgIHRoaXMudGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdGFyZWEpO1xuICAgIHRoaXMuYWJjanNQYXJhbXMuZWRpdGFibGUgPSB0cnVlO1xuICB9XG4gIHRoaXMub2xkdCA9IFwiXCI7XG4gIHRoaXMuYlJlZW50cnkgPSBmYWxzZTtcbiAgdGhpcy5wYXJzZUFCQygpO1xuICB0aGlzLm1vZGVsQ2hhbmdlZCgpO1xuXG4gIHRoaXMuYWRkQ2xhc3NOYW1lID0gZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgdmFyIGhhc0NsYXNzTmFtZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnRDbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZTtcbiAgICAgIHJldHVybiAoZWxlbWVudENsYXNzTmFtZS5sZW5ndGggPiAwICYmIChlbGVtZW50Q2xhc3NOYW1lID09PSBjbGFzc05hbWUgfHxcbiAgICAgICAgbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xhc3NOYW1lICsgXCIoXFxcXHN8JClcIikudGVzdChlbGVtZW50Q2xhc3NOYW1lKSkpO1xuICAgIH07XG5cbiAgICBpZiAoIWhhc0NsYXNzTmFtZShlbGVtZW50LCBjbGFzc05hbWUpKVxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xhc3NOYW1lID8gJyAnIDogJycpICsgY2xhc3NOYW1lO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIHRoaXMucmVtb3ZlQ2xhc3NOYW1lID0gZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBwYXJzZUNvbW1vbi5zdHJpcChlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChcIihefFxcXFxzKylcIiArIGNsYXNzTmFtZSArIFwiKFxcXFxzK3wkKVwiKSwgJyAnKSk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgdGhpcy5zZXRSZWFkT25seSA9IGZ1bmN0aW9uKHJlYWRPbmx5KSB7XG5cdCAgdmFyIHJlYWRvbmx5Q2xhc3MgPSAnYWJjX3RleHRhcmVhX3JlYWRvbmx5Jztcblx0ICB2YXIgZWwgPSB0aGlzLmVkaXRhcmVhLmdldEVsZW0oKTtcbiAgICBpZiAocmVhZE9ubHkpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAneWVzJyk7XG5cdCAgdGhpcy5hZGRDbGFzc05hbWUoZWwsIHJlYWRvbmx5Q2xhc3MpO1xuXHR9IGVsc2Uge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpO1xuXHQgIHRoaXMucmVtb3ZlQ2xhc3NOYW1lKGVsLCByZWFkb25seUNsYXNzKTtcbiAgICB9XG4gIH07XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLnJlbmRlclR1bmUgPSBmdW5jdGlvbihhYmMsIHBhcmFtcywgZGl2KSB7XG4gIHZhciB0dW5lYm9vayA9IG5ldyBUdW5lQm9vayhhYmMpO1xuICB2YXIgYWJjUGFyc2VyID0gUGFyc2UoKTtcbiAgYWJjUGFyc2VyLnBhcnNlKHR1bmVib29rLnR1bmVzWzBdLmFiYywgcGFyYW1zLCB0dW5lYm9vay50dW5lc1swXS5zdGFydFBvcyAtIHR1bmVib29rLmhlYWRlci5sZW5ndGgpOyAvL1RPRE8gaGFuZGxlIG11bHRpcGxlIHR1bmVzXG4gIHZhciB0dW5lID0gYWJjUGFyc2VyLmdldFR1bmUoKTtcbiAgdmFyIGVuZ3JhdmVyX2NvbnRyb2xsZXIgPSBuZXcgRW5ncmF2ZXJDb250cm9sbGVyKGRpdiwgdGhpcy5hYmNqc1BhcmFtcyk7XG4gIGVuZ3JhdmVyX2NvbnRyb2xsZXIuZW5ncmF2ZUFCQyh0dW5lKTtcbn07XG5cbkVkaXRvci5wcm90b3R5cGUucmVkcmF3TWlkaSA9IGZ1bmN0aW9uKCkge1xuXHRpZiAodGhpcy5nZW5lcmF0ZV9taWRpICYmICF0aGlzLm1pZGlQYXVzZSkge1xuXHRcdHZhciBldmVudCA9IG5ldyB3aW5kb3cuQ3VzdG9tRXZlbnQoXCJnZW5lcmF0ZU1pZGlcIiwge1xuXHRcdFx0ZGV0YWlsOiB7XG5cdFx0XHRcdHR1bmVzOiB0aGlzLnR1bmVzLFxuXHRcdFx0XHRhYmNqc1BhcmFtczogdGhpcy5hYmNqc1BhcmFtcyxcblx0XHRcdFx0ZG93bmxvYWRNaWRpRWw6IHRoaXMuZG93bmxvYWRNaWRpLFxuXHRcdFx0XHRpbmxpbmVNaWRpRWw6IHRoaXMuaW5saW5lTWlkaSxcblx0XHRcdFx0ZW5ncmF2aW5nRWw6IHRoaXMuZGl2XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0d2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cdGlmICh0aGlzLnN5bnRoKSB7XG5cdFx0aWYgKCF0aGlzLnN5bnRoLnN5bnRoQ29udHJvbCkge1xuXHRcdFx0dGhpcy5zeW50aC5zeW50aENvbnRyb2wgPSBuZXcgU3ludGhDb250cm9sbGVyKCk7XG5cdFx0XHR0aGlzLnN5bnRoLnN5bnRoQ29udHJvbC5sb2FkKHRoaXMuc3ludGguZWwsIHRoaXMuc3ludGguY3Vyc29yQ29udHJvbCwgdGhpcy5zeW50aC5vcHRpb25zKTtcblx0XHR9XG5cdFx0dGhpcy5zeW50aC5zeW50aENvbnRyb2wuc2V0VHVuZSh0aGlzLnR1bmVzWzBdLCBmYWxzZSk7XG5cdH1cbn07XG5cbkVkaXRvci5wcm90b3R5cGUubW9kZWxDaGFuZ2VkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnR1bmVzID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5kb3dubG9hZE1pZGkgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLmRvd25sb2FkTWlkaS5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmlubGluZU1pZGkgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLmlubGluZU1pZGkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB0aGlzLmRpdi5pbm5lckhUTUwgPSBcIlwiO1xuXHRyZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5iUmVlbnRyeSlcbiAgICByZXR1cm47IC8vIFRPRE8gaXMgdGhpcyBsaWtlbHk/IG1heWJlLCBpZiB3ZSByZXdyaXRlIGFiYyBpbW1lZGlhdGVseSB3LyBhYmMyYWJjXG4gIHRoaXMuYlJlZW50cnkgPSB0cnVlO1xuICB0aGlzLnRpbWVySWQgPSBudWxsO1xuICB0aGlzLmRpdi5pbm5lckhUTUwgPSBcIlwiO1xuICB0aGlzLmVuZ3JhdmVyX2NvbnRyb2xsZXIgPSBuZXcgRW5ncmF2ZXJDb250cm9sbGVyKHRoaXMuZGl2LCB0aGlzLmFiY2pzUGFyYW1zKTtcbiAgdGhpcy5lbmdyYXZlcl9jb250cm9sbGVyLmVuZ3JhdmVBQkModGhpcy50dW5lcyk7XG5cdHRoaXMudHVuZXNbMF0uZW5ncmF2ZXIgPSB0aGlzLmVuZ3JhdmVyX2NvbnRyb2xsZXI7XHQvLyBUT0RPLVBFUjogV2UgYWN0dWFsbHkgd2FudCBhbiBvdXRwdXQgb2JqZWN0IGZvciBlYWNoIHR1bmUsIG5vdCB0aGUgZW50aXJlIGNvbnRyb2xsZXIuIFdoZW4gcmVmYWN0b3JpbmcsIGRvbid0IHNhdmUgZGF0YSBpbiB0aGUgY29udHJvbGxlci5cblx0dGhpcy5yZWRyYXdNaWRpKCk7XG5cbiAgaWYgKHRoaXMud2FybmluZ3NkaXYpIHtcbiAgICB0aGlzLndhcm5pbmdzZGl2LmlubmVySFRNTCA9ICh0aGlzLndhcm5pbmdzKSA/IHRoaXMud2FybmluZ3Muam9pbihcIjxiciAvPlwiKSA6IFwiTm8gZXJyb3JzXCI7XG4gIH1cbiAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgdmFyIHRleHRwcmludGVyID0gbmV3IFRleHRQcmludGVyKHRoaXMudGFyZ2V0LCB0cnVlKTtcbiAgICB0ZXh0cHJpbnRlci5wcmludEFCQyh0aGlzLnR1bmVzWzBdKTsgLy9UT0RPIGhhbmRsZSBtdWx0aXBsZSB0dW5lc1xuICB9XG4gIHRoaXMuZW5ncmF2ZXJfY29udHJvbGxlci5hZGRTZWxlY3RMaXN0ZW5lcih0aGlzLmhpZ2hsaWdodC5iaW5kKHRoaXMpKTtcbiAgdGhpcy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgdGhpcy5iUmVlbnRyeSA9IGZhbHNlO1xufTtcblxuLy8gQ2FsbCB0aGlzIHRvIHJlcGFyc2UgaW4gcmVzcG9uc2UgdG8gdGhlIHByaW50aW5nIHBhcmFtZXRlcnMgY2hhbmdpbmdcbkVkaXRvci5wcm90b3R5cGUucGFyYW1DaGFuZ2VkID0gZnVuY3Rpb24oZW5ncmF2ZXJQYXJhbXMpIHtcblx0aWYgKGVuZ3JhdmVyUGFyYW1zKSB7XG5cdFx0Zm9yICh2YXIga2V5IGluIGVuZ3JhdmVyUGFyYW1zKSB7XG5cdFx0XHRpZiAoZW5ncmF2ZXJQYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHR0aGlzLmFiY2pzUGFyYW1zW2tleV0gPSBlbmdyYXZlclBhcmFtc1trZXldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0aGlzLm9sZHQgPSBcIlwiO1xuXHR0aGlzLmZpcmVDaGFuZ2VkKCk7XG59O1xuXG4vLyByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWRcbkVkaXRvci5wcm90b3R5cGUucGFyc2VBQkMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHQgPSB0aGlzLmVkaXRhcmVhLmdldFN0cmluZygpO1xuICBpZiAodD09PXRoaXMub2xkdCkge1xuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhpcy5vbGR0ID0gdDtcbiAgaWYgKHQgPT09IFwiXCIpIHtcblx0dGhpcy50dW5lcyA9IHVuZGVmaW5lZDtcblx0dGhpcy53YXJuaW5ncyA9IFwiXCI7XG5cdHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB0dW5lYm9vayA9IG5ldyBUdW5lQm9vayh0KTtcblxuICB0aGlzLnR1bmVzID0gW107XG4gIHRoaXMuc3RhcnRQb3MgPSBbXTtcbiAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICBmb3IgKHZhciBpPTA7IGk8dHVuZWJvb2sudHVuZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYWJjUGFyc2VyID0gbmV3IFBhcnNlKCk7XG4gICAgYWJjUGFyc2VyLnBhcnNlKHR1bmVib29rLnR1bmVzW2ldLmFiYywgdGhpcy5hYmNqc1BhcmFtcywgdHVuZWJvb2sudHVuZXNbaV0uc3RhcnRQb3MgLSB0dW5lYm9vay5oZWFkZXIubGVuZ3RoKTtcbiAgICB0aGlzLnR1bmVzW2ldID0gYWJjUGFyc2VyLmdldFR1bmUoKTtcblx0ICB0aGlzLnN0YXJ0UG9zW2ldID0gdHVuZWJvb2sudHVuZXNbaV0uc3RhcnRQb3M7XG4gICAgdmFyIHdhcm5pbmdzID0gYWJjUGFyc2VyLmdldFdhcm5pbmdzKCkgfHwgW107XG4gICAgZm9yICh2YXIgaj0wOyBqPHdhcm5pbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICB0aGlzLndhcm5pbmdzLnB1c2god2FybmluZ3Nbal0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkVkaXRvci5wcm90b3R5cGUudXBkYXRlU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxlY3Rpb24gPSB0aGlzLmVkaXRhcmVhLmdldFNlbGVjdGlvbigpO1xuICB0cnkge1xuICAgIHRoaXMuZW5ncmF2ZXJfY29udHJvbGxlci5yYW5nZUhpZ2hsaWdodChzZWxlY3Rpb24uc3RhcnQsIHNlbGVjdGlvbi5lbmQpO1xuICB9IGNhdGNoIChlKSB7fSAvLyBtYXliZSBwcmludGVyIGlzbid0IGRlZmluZWQgeWV0P1xuXHRpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjaylcblx0XHR0aGlzLnNlbGVjdGlvbkNoYW5nZUNhbGxiYWNrKHNlbGVjdGlvbi5zdGFydCwgc2VsZWN0aW9uLmVuZCk7XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLmZpcmVTZWxlY3Rpb25DaGFuZ2VkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMudXBkYXRlU2VsZWN0aW9uKCk7XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLnNldERpcnR5U3R5bGUgPSBmdW5jdGlvbihpc0RpcnR5KSB7XG5cdGlmICh0aGlzLmluZGljYXRlX2NoYW5nZWQgPT09IHVuZGVmaW5lZClcblx0XHRyZXR1cm47XG4gIHZhciBhZGRDbGFzc05hbWUgPSBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICB2YXIgaGFzQ2xhc3NOYW1lID0gZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lO1xuICAgICAgcmV0dXJuIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA+IDAgJiYgKGVsZW1lbnRDbGFzc05hbWUgPT09IGNsYXNzTmFtZSB8fFxuICAgICAgICBuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBjbGFzc05hbWUgKyBcIihcXFxcc3wkKVwiKS50ZXN0KGVsZW1lbnRDbGFzc05hbWUpKSk7XG4gICAgfTtcblxuICAgIGlmICghaGFzQ2xhc3NOYW1lKGVsZW1lbnQsIGNsYXNzTmFtZSkpXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAoZWxlbWVudC5jbGFzc05hbWUgPyAnICcgOiAnJykgKyBjbGFzc05hbWU7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgdmFyIHJlbW92ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gcGFyc2VDb21tb24uc3RyaXAoZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoXCIoXnxcXFxccyspXCIgKyBjbGFzc05hbWUgKyBcIihcXFxccyt8JClcIiksICcgJykpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG5cdHZhciByZWFkb25seUNsYXNzID0gJ2FiY190ZXh0YXJlYV9kaXJ0eSc7XG5cdHZhciBlbCA9IHRoaXMuZWRpdGFyZWEuZ2V0RWxlbSgpO1xuXHRpZiAoaXNEaXJ0eSkge1xuXHRcdGFkZENsYXNzTmFtZShlbCwgcmVhZG9ubHlDbGFzcyk7XG5cdH0gZWxzZSB7XG5cdFx0cmVtb3ZlQ2xhc3NOYW1lKGVsLCByZWFkb25seUNsYXNzKTtcbiAgICB9XG59O1xuXG4vLyBjYWxsIHdoZW4gYWJjIHRleHQgaXMgY2hhbmdlZCBhbmQgbmVlZHMgcmUtcGFyc2luZ1xuRWRpdG9yLnByb3RvdHlwZS5maXJlQ2hhbmdlZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5iSXNQYXVzZWQpXG4gICAgcmV0dXJuO1xuICBpZiAodGhpcy5wYXJzZUFCQygpKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnRpbWVySWQpXHQvLyBJZiB0aGUgdXNlciBpcyBzdGlsbCB0eXBpbmcsIGNhbmNlbCB0aGUgdXBkYXRlXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcbiAgICB0aGlzLnRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYubW9kZWxDaGFuZ2VkKCk7XG4gICAgfSwgMzAwKTtcdC8vIElzIHRoaXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiByZXNwb25zaXZlbmVzcyBhbmQgbm90IHJlZHJhd2luZyB0b28gbXVjaD9cblx0ICB2YXIgaXNEaXJ0eSA9IHRoaXMuaXNEaXJ0eSgpO1xuXHQgIGlmICh0aGlzLndhc0RpcnR5ICE9PSBpc0RpcnR5KSB7XG5cdFx0ICB0aGlzLndhc0RpcnR5ID0gaXNEaXJ0eTtcblx0XHQgIHRoaXMuc2V0RGlydHlTdHlsZShpc0RpcnR5KTtcblx0ICB9XG5cdCAgaWYgKHRoaXMub25jaGFuZ2VDYWxsYmFjaylcblx0XHQgIHRoaXMub25jaGFuZ2VDYWxsYmFjayh0aGlzKTtcblx0ICB9XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLnNldE5vdERpcnR5ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuZWRpdGFyZWEuaW5pdGlhbFRleHQgPSB0aGlzLmVkaXRhcmVhLmdldFN0cmluZygpO1xuXHR0aGlzLndhc0RpcnR5ID0gZmFsc2U7XG5cdHRoaXMuc2V0RGlydHlTdHlsZShmYWxzZSk7XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLmlzRGlydHkgPSBmdW5jdGlvbigpIHtcblx0aWYgKHRoaXMuaW5kaWNhdGVfY2hhbmdlZCA9PT0gdW5kZWZpbmVkKVxuXHRcdHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRoaXMuZWRpdGFyZWEuaW5pdGlhbFRleHQgIT09IHRoaXMuZWRpdGFyZWEuZ2V0U3RyaW5nKCk7XG59O1xuXG5FZGl0b3IucHJvdG90eXBlLmhpZ2hsaWdodCA9IGZ1bmN0aW9uKGFiY2VsZW0sIHR1bmVOdW1iZXIsIGNsYXNzZXMpIHtcblx0Ly8gVE9ETy1QRVI6IFRoZSBtYXJrZXIgYXBwZWFycyB0byBnZXQgb2ZmIGJ5IG9uZSBmb3IgZWFjaCB0dW5lIHBhcnNlZC4gSSdtIG5vdCBzdXJlIHdoeSwgYnV0IGFkZGluZyB0aGUgdHVuZU51bWJlciBpbiBjb3JyZWN0cyBpdCBmb3IgdGhlIHRpbWUgYmVpbmcuXG4vL1x0dmFyIG9mZnNldCA9ICh0dW5lTnVtYmVyICE9PSB1bmRlZmluZWQpID8gdGhpcy5zdGFydFBvc1t0dW5lTnVtYmVyXSArIHR1bmVOdW1iZXIgOiAwO1xuXG4gIHRoaXMuZWRpdGFyZWEuc2V0U2VsZWN0aW9uKGFiY2VsZW0uc3RhcnRDaGFyLCBhYmNlbGVtLmVuZENoYXIpO1xuXHRpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VDYWxsYmFjaylcblx0XHR0aGlzLnNlbGVjdGlvbkNoYW5nZUNhbGxiYWNrKGFiY2VsZW0uc3RhcnRDaGFyLCBhYmNlbGVtLmVuZENoYXIpO1xufTtcblxuRWRpdG9yLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKHNob3VsZFBhdXNlKSB7XG5cdHRoaXMuYklzUGF1c2VkID0gc2hvdWxkUGF1c2U7XG5cdGlmICghc2hvdWxkUGF1c2UpXG5cdFx0dGhpcy5maXJlQ2hhbmdlZCgpO1xufTtcblxuRWRpdG9yLnByb3RvdHlwZS5taWxsaXNlY29uZHNQZXJNZWFzdXJlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnN5bnRoLnN5bnRoQ29udHJvbC52aXN1YWxPYmoubWlsbGlzZWNvbmRzUGVyTWVhc3VyZSgpO1xufTtcblxuRWRpdG9yLnByb3RvdHlwZS5wYXVzZU1pZGkgPSBmdW5jdGlvbihzaG91bGRQYXVzZSkge1xuXHR0aGlzLm1pZGlQYXVzZSA9IHNob3VsZFBhdXNlO1xuXHRpZiAoIXNob3VsZFBhdXNlKVxuXHRcdHRoaXMucmVkcmF3TWlkaSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3I7XG4iLCJ2YXIgdmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpO1xudmFyIGFuaW1hdGlvbiA9IHJlcXVpcmUoJy4vc3JjL2FwaS9hYmNfYW5pbWF0aW9uJyk7XG52YXIgdHVuZUJvb2sgPSByZXF1aXJlKCcuL3NyYy9hcGkvYWJjX3R1bmVib29rJyk7XG5cbnZhciBhYmNqcyA9IHt9O1xuXG5hYmNqcy5zaWduYXR1cmUgPSBcImFiY2pzLWJhc2ljIHZcIiArIHZlcnNpb247XG5cbk9iamVjdC5rZXlzKGFuaW1hdGlvbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdGFiY2pzW2tleV0gPSBhbmltYXRpb25ba2V5XTtcbn0pO1xuXG5PYmplY3Qua2V5cyh0dW5lQm9vaykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdGFiY2pzW2tleV0gPSB0dW5lQm9va1trZXldO1xufSk7XG5cbmFiY2pzLnJlbmRlckFiYyA9IHJlcXVpcmUoJy4vc3JjL2FwaS9hYmNfdHVuZWJvb2tfc3ZnJyk7XG5hYmNqcy5UaW1pbmdDYWxsYmFja3MgPSByZXF1aXJlKCcuL3NyYy9hcGkvYWJjX3RpbWluZ19jYWxsYmFja3MnKTtcblxudmFyIGdseXBocyA9IHJlcXVpcmUoJy4vc3JjL3dyaXRlL2FiY19nbHlwaHMnKTtcbmFiY2pzLnNldEdseXBoID0gZ2x5cGhzLnNldFN5bWJvbDtcblxudmFyIENyZWF0ZVN5bnRoID0gcmVxdWlyZSgnLi9zcmMvc3ludGgvY3JlYXRlLXN5bnRoJyk7XG52YXIgaW5zdHJ1bWVudEluZGV4VG9OYW1lID0gcmVxdWlyZSgnLi9zcmMvc3ludGgvaW5zdHJ1bWVudC1pbmRleC10by1uYW1lJyk7XG52YXIgcGl0Y2hUb05vdGVOYW1lID0gcmVxdWlyZSgnLi9zcmMvc3ludGgvcGl0Y2gtdG8tbm90ZS1uYW1lJyk7XG52YXIgU3ludGhTZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc3JjL3N5bnRoL3N5bnRoLXNlcXVlbmNlJyk7XG52YXIgQ3JlYXRlU3ludGhDb250cm9sID0gcmVxdWlyZSgnLi9zcmMvc3ludGgvY3JlYXRlLXN5bnRoLWNvbnRyb2wnKTtcbnZhciByZWdpc3RlckF1ZGlvQ29udGV4dCA9IHJlcXVpcmUoJy4vc3JjL3N5bnRoL3JlZ2lzdGVyLWF1ZGlvLWNvbnRleHQnKTtcbnZhciBhY3RpdmVBdWRpb0NvbnRleHQgPSByZXF1aXJlKCcuL3NyYy9zeW50aC9hY3RpdmUtYXVkaW8tY29udGV4dCcpO1xudmFyIHN1cHBvcnRzQXVkaW8gPSByZXF1aXJlKCcuL3NyYy9zeW50aC9zdXBwb3J0cy1hdWRpbycpO1xudmFyIHBsYXlFdmVudCA9IHJlcXVpcmUoJy4vc3JjL3N5bnRoL3BsYXktZXZlbnQnKTtcbnZhciBTeW50aENvbnRyb2xsZXIgPSByZXF1aXJlKCcuL3NyYy9zeW50aC9zeW50aC1jb250cm9sbGVyJyk7XG5cbmFiY2pzLnN5bnRoID0ge1xuXHRDcmVhdGVTeW50aDogQ3JlYXRlU3ludGgsXG5cdGluc3RydW1lbnRJbmRleFRvTmFtZTogaW5zdHJ1bWVudEluZGV4VG9OYW1lLFxuXHRwaXRjaFRvTm90ZU5hbWU6IHBpdGNoVG9Ob3RlTmFtZSxcblx0U3ludGhDb250cm9sbGVyOiBTeW50aENvbnRyb2xsZXIsXG5cdFN5bnRoU2VxdWVuY2U6IFN5bnRoU2VxdWVuY2UsXG5cdENyZWF0ZVN5bnRoQ29udHJvbDogQ3JlYXRlU3ludGhDb250cm9sLFxuXHRyZWdpc3RlckF1ZGlvQ29udGV4dDogcmVnaXN0ZXJBdWRpb0NvbnRleHQsXG5cdGFjdGl2ZUF1ZGlvQ29udGV4dDogYWN0aXZlQXVkaW9Db250ZXh0LFxuXHRzdXBwb3J0c0F1ZGlvOiBzdXBwb3J0c0F1ZGlvLFxuXHRwbGF5RXZlbnQ6IHBsYXlFdmVudFxufTtcblxudmFyIGVkaXRvciA9IHJlcXVpcmUoJy4vc3JjL2VkaXQvYWJjX2VkaXRvcicpO1xuYWJjanNbJ0VkaXRvciddID0gZWRpdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFiY2pzO1xuIiwiaW1wb3J0IHsgQXBwLCBNYXJrZG93blBvc3RQcm9jZXNzb3IsIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLCBNYXJrZG93blJlbmRlcmVyLCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IHNpZ25hdHVyZSwgcmVuZGVyQWJjIH0gZnJvbSAnYWJjanMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXVzaWNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHN0YXRpYyBwb3N0cHJvY2Vzc29yOiBNYXJrZG93blBvc3RQcm9jZXNzb3IgPSAoZWw6IEhUTUxFbGVtZW50LCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQpID0+IHtcclxuXHRcdC8vIEFzc3VtcHRpb246IE9uZSBzZWN0aW9uIGFsd2F5cyBjb250YWlucyBvbmx5IHRoZSBjb2RlIGJsb2NrXHJcblxyXG5cdFx0Y29uc3QgYmxvY2tUb1JlcGxhY2UgPSBlbC5xdWVyeVNlbGVjdG9yKCdwcmUnKVxyXG5cdFx0aWYgKCFibG9ja1RvUmVwbGFjZSkgcmV0dXJuXHJcblxyXG5cdFx0Y29uc3QgbXVzaWNCbG9jayA9IGJsb2NrVG9SZXBsYWNlLnF1ZXJ5U2VsZWN0b3IoJ2NvZGUubGFuZ3VhZ2UtbXVzaWMtYWJjJylcclxuXHRcdGlmICghbXVzaWNCbG9jaykgcmV0dXJuXHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gbXVzaWNCbG9jay50ZXh0Q29udGVudFxyXG5cdFx0Y29uc3QgZGVzdGluYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG5cdFx0cmVuZGVyQWJjKGRlc3RpbmF0aW9uLCBzb3VyY2UsIHtcclxuXHRcdFx0YWRkX2NsYXNzZXM6IHRydWUsXHJcblx0XHRcdHJlc3BvbnNpdmU6ICdyZXNpemUnXHJcblx0XHR9KVxyXG5cclxuXHRcdGVsLnJlcGxhY2VDaGlsZChkZXN0aW5hdGlvbiwgYmxvY2tUb1JlcGxhY2UpXHJcblx0fVxyXG5cclxuXHRvbmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygnbG9hZGluZyBhYmNqcyBwbHVnaW4nKTtcclxuXHRcdE1hcmtkb3duUHJldmlld1JlbmRlcmVyLnJlZ2lzdGVyUG9zdFByb2Nlc3NvcihNdXNpY1BsdWdpbi5wb3N0cHJvY2Vzc29yKVxyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygndW5sb2FkaW5nIGFiY2pzIHBsdWdpbicpO1xyXG5cdFx0TWFya2Rvd25QcmV2aWV3UmVuZGVyZXIudW5yZWdpc3RlclBvc3RQcm9jZXNzb3IoTXVzaWNQbHVnaW4ucG9zdHByb2Nlc3NvcilcclxuXHR9XHJcbn1cclxuIl0sIm5hbWVzIjpbIlRpbWluZ0NhbGxiYWNrcyIsInBhcnNlQ29tbW9uIiwidHJhbnNwb3NlIiwicGFyc2VEaXJlY3RpdmUiLCJwYXJzZUtleVZvaWNlIiwic3BhY2luZyIsIlR1bmUiLCJUb2tlbml6ZXIiLCJQYXJzZUhlYWRlciIsIndyYXAiLCJQYXJzZSIsIlJlbGF0aXZlRWxlbWVudCIsIkFic29sdXRlRWxlbWVudCIsImdseXBocyIsInNwcmludGYiLCJUaWVFbGVtIiwiRHluYW1pY0RlY29yYXRpb24iLCJDcmVzY2VuZG9FbGVtIiwiRGVjb3JhdGlvbiIsIlN0YWZmR3JvdXBFbGVtZW50IiwiVm9pY2VFbGVtZW50IiwiY3JlYXRlQ2xlZiIsImNyZWF0ZUtleVNpZ25hdHVyZSIsImNyZWF0ZVRpbWVTaWduYXR1cmUiLCJCcmFjZUVsZW0iLCJFbmRpbmdFbGVtIiwiVGVtcG9FbGVtZW50IiwiQmVhbUVsZW0iLCJUcmlwbGV0RWxlbSIsIlN2ZyIsInJlcXVpcmUkJDAiLCJSZW5kZXJlciIsIkFic3RyYWN0RW5ncmF2ZXIiLCJFbmdyYXZlckNvbnRyb2xsZXIiLCJ0dW5lYm9vayIsInNvdW5kc0NhY2hlIiwiaW5zdHJ1bWVudEluZGV4VG9OYW1lIiwiYWN0aXZlQXVkaW9Db250ZXh0IiwicmVnaXN0ZXJBdWRpb0NvbnRleHQiLCJzZXF1ZW5jZSIsImZsYXR0ZW4iLCJwaXRjaFRvTm90ZU5hbWUiLCJnZXROb3RlIiwiY3JlYXRlTm90ZU1hcCIsImRvd25sb2FkQnVmZmVyIiwic3VwcG9ydHNBdWRpbyIsIlN5bnRoU2VxdWVuY2UiLCJDcmVhdGVTeW50aCIsIkNyZWF0ZVN5bnRoQ29udHJvbCIsIlN5bnRoQ29udHJvbGxlciIsIlRleHRQcmludGVyIiwidmVyc2lvbiIsImFuaW1hdGlvbiIsInR1bmVCb29rIiwicmVxdWlyZSQkMSIsInBsYXlFdmVudCIsImVkaXRvciIsIk1hcmtkb3duUHJldmlld1JlbmRlcmVyIiwicmVuZGVyQWJjIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUks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SSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5SCxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNoSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxN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SSxRQUFRLEtBQUssU0FBUyxFQUFFO0FBQ3JDO0FBQ0EsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ25GLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3pELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3pFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQy9ELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUN0SCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQy9DLElBQUksSUFBSSxDQUFD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QUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEYsU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0RixTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdkUsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLFNBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN2RSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEY7QUFDQSxLQUFLLE9BQU8sQ0FBQyxPQUFP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QUFHLEVBQUUsQ0FBQztBQUNuQjtBQUNBLElBQUksUUFBUSxHQUFHO0FBQ2YsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNQLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDUixDQUFDLElBQUksRUFBRSxDQUFDO0FBQ1IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNQLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDUixDQUFDLElBQUksRUFBRSxDQUFDO0FBQ1IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNQLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDUCxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ1IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNSLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDUCxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ1IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNSLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDUCxDQUFDLElBQUksRUFBRSxFQUFFO0FBQ1QsQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNULENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDUixDQUFDLENBQUM7QUFDRixJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0UsSUFBSSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BGO0FBQ0EsU0FBUyxDQUFDLFlBQVksR0FBRyxTQUFTLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFO0FBQzNGLENBQUMsSUFBSSxDQUFDLGNB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QUUsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFO0FBQ2hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsTUFBTTtBQUNULEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLEdBQUc7QUFDSCxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QyxFQUFFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUMxQixJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELElBQUksUUFBUSxJQUFJLGVB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QztBQUM1QyxFQUFFLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsRUFBRSxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QyxFQUFFLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLEVBQUUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQyxFQUFFLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLEVBQUUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQyxFQUFFLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUM7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHO0FBQ2IsR0FBRyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDeEYsR0FBRyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDekYsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0YsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0YsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0YsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0YsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDM0Y7QUFDQSxHQUFHLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQzdFLEdBQUcsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDOUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUNoRixHQUFHLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ2hGLEdBQUcsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDaEYsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUMvRSxHQUFHLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ2hGO0FBQ0EsR0FBRyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ2pFLEdBQUcsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUNuRSxHQUFHLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDckUsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ3JFLEdBQUcsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUNyRSxHQUFHLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDcEUsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ3JFO0FBQ0EsR0FBRyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDdEQsR0FBRyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDeEQsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDekQsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDMUQsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDMUQsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDekQsR0FBRyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDMUQ7QUFDQSxHQUFHLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQzNDLEdBQUcsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDN0MsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUM5QyxHQUFHLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQzlDLEdBQUcsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDL0MsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUM5QyxHQUFHLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQy9DO0FBQ0EsR0FBRyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ2hDLEdBQUcsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUNqQyxHQUFHLE1BQU0sRUFBRSxFQUFFLFNBQVMs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UUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN0RCxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN0RCxHQUFHLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNyRCxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN0RCxHQUFHLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNyRDtBQUNBLEdBQUcsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUM3RCxHQUFHLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDOUQsR0FBRyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ2hFLEdBQUcsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNoRSxHQUFHLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDL0QsR0FBRyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ2hFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUMvRDtBQUNBLEdBQUcsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDdkUsR0FBRyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN4RSxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQzFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDMUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUMxRSxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQzFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDekU7QUFDQSxHQUFHLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNqRixHQUFHLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNsRixHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNwRixHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNwRixHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNwRixHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNwRixHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUNwRjtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDL0IsR0FBRyxJQUFJLEVBQUUsRUFBRTtBQUNYLEdBQUcsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDekMsR0FBRyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUU7QUFDckIsR0FBRyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDbkQsR0FBRyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDekYsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU9DLGFBQVMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN6RixFQUFFLENBQUM7QUFDSDtBQUNBLENBQUMsSUFBSSxTQUFTLEdBQUc7QUFDakIsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoRCxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3BELEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEQsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNwRCxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3BELEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakQsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNqRCxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDbEQsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2xELEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNuRCxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEQsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xELEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEQsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakQsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUM5QyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDOUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9DLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMvQyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzlDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUMvQyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDL0MsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQy9DLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUMvQyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakQsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzdDLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUM5QyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDOUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzlDLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUM5QyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2pELEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNqRCxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDakQsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2pELEVBQUUsQ0FBQztBQUNIO0FBQ0EsQ0FBQyxJQUFJLFVBQVUsR0FBRyxTQUFTLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDdEMsRUFBRSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbEMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDakIsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxJQUFJLEVBQUU7QUFDeEMsRUFBRSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsSUFBSSxLQUFLLEVBQUU7QUFDYixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM5QixHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMxQixHQUFHO0FBQ0gsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLEVBQUU7QUFDM0MsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM5RSxFQUFFRCxVQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDaEQsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQ0EsVUFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLEVBQUUsQ0FBQztBQUNIO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hHO0FBQ0EsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNqRDtBQUNBO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQzdCLEVBQUVBLFVBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNsRCxHQUFHLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUN2QixHQUFHLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRSxJQUFJLEdBQUcsQ0FBQyxlQUFlO0FBQ3pCLEdBQUdBLFVBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUN2RCxJQUFJLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUN4QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzVCLElBQUksQ0FBQyxDQUFDO0FBQ047QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ2pCLEdBQUdBLFVBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNuRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0FBQ3pCLElBQUksSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsV0FBVyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQztBQUMvRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0FBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLE9BQU87QUFDL0MsS0FBSyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN6QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU07QUFDcEUsS0FBSyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN6QixJQUFJLENBQUMsQ0FBQztBQUNOLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZTtBQUMxQixJQUFJQSxVQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDeEQsS0FBSyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztBQUMxQixLQUFLLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLFdBQVcsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUM7QUFDaEYsTUFBTSxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztBQUMzQixLQUFLLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxPQUFPO0FBQ2hELE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNO0FBQ3JFLE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDMUIsS0FBSyxDQUFDLENBQUM7QUFDUCxHQUFHLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsR0FBR0EsVUFBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ25ELElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDekIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssT0FBTztBQUNuRixLQUFLLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLElBQUksQ0FBQyxDQUFDO0FBQ04sR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlO0FBQzFCLElBQUlBLFVBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUN4RCxLQUFLLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0FBQzFCLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLE9BQU87QUFDcEYsTUFBTSxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUMxQixLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7QUFDdkIsR0FBR0EsVUFBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ25ELElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDekIsSUFBSSxDQUFDLENBQUM7QUFDTixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWU7QUFDMUIsSUFBSUEsVUFBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ3hELEtBQUssR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDMUIsS0FBSyxDQUFDLENBQUM7QUFDUCxHQUFHO0FBQ0gsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzVDLEVBQUUsSUFBSSxRQUFRLEdBQUdBLFVBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1QyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLEVBQUUsQ0FBQztBQUNIO0FBQ0EsQ0FBQyxJQUFJLFdBQVcsR0FBRyxTQUFTLEdBQUcsRUFBRTtBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHO0FBQzVCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QixHQUFHLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksR0FBRyxLQUFLLFNBQVM7QUFDdkIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsRUFBRSxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9CLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzVDLFFBQVEsTUFBTTtBQUNkLEdBQUc7QUFDSCxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pELEVBQUUsQ0FBQztBQUNIO0FBQ0EsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLFNBQVMsSUFBSSxFQUFFO0FBQzNDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRztBQUMzQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFDaEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUN2QixRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHO0FBQ2hDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFDdkIsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRztBQUNoQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFDaEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUN2QixRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHO0FBQ2hDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFDdkIsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTztBQUMzRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU07QUFDMUQsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUN2QixHQUFHO0FBQ0gsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHO0FBQ3RDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN4QjtBQUNBLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUNoQixHQUFHO0FBQ0gsRUFBRSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2Y7QUFDQTtBQUNBLEVBQUUsUUFBUSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUN6QixHQUFHLEtBQUssSUFBSTtBQUNaLElBQUlFLG1CQUFjLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLElBQUksYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUMzRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ25CLElBQUksTUFBTTtBQUNWLEdBQUcsS0FBSyxJQUFJO0FBQ1osSUFBSUEsbUJBQWMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDNUMsSUFBSSxhQUFhLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQzVKLElBQUksR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDeEIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbkIsSUFBSSxNQUFNO0FBQ1YsR0FBRyxLQUFLLE1BQU07QUFDZDtBQUNBLElBQUksYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUM3RSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ25CLElBQUksTUFBTTtBQUNWLEdBQUc7QUFDSCxJQUFJLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELElBQUksSUFBSSxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTtBQUMxQixLQUFLLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEtBQUssSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ25CO0FBQ0EsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDbkMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDckIsS0FBSyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQzlCO0FBQ0EsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzVCLE1BQU0sSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0QsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQzFCLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQ3JDLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RDtBQUNBLFFBQVEsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZCLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDM0IsT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUMxQixPQUFPO0FBQ1AsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzdCLE9BQU8sSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQzVCLFFBQVEsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZCLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDN0IsUUFBUSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUM3QixRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0EsTUFBTSxJQUFJLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNoRixPQUFPLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pELE9BQU8sT0FBTyxHQUFHLENBQUM7QUFDbEIsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLEtBQUssSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0Q7QUFDQSxLQUFLLElBQUksYUFBYSxHQUFHLGFBQWEsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztBQUM1RixLQUFLLGFBQWEsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3ZILEtBQUssYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25DLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDakI7QUFDQSxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2IsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUMxRCxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUM1SSxTQUFTLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1QyxRQUFRO0FBQ1IsT0FBTztBQUNQLE1BQU0sS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN6RCxPQUFPLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7QUFDeEMsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxlQUFlO0FBQzlDLFNBQVMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2hELFFBQVEsYUFBYSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RHLFFBQVE7QUFDUixPQUFPO0FBQ1AsTUFBTTtBQUNOLEtBQUs7QUFDTCxJQUFJLE1BQU07QUFDVixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUN0QyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hELEVBQUUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUN0QyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hEO0FBQ0E7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDdEMsRUFBRSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEQsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJO0FBQ2YsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0I7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNqQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO0FBQ3RCLElBQUksR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDeEIsSUFBSSxhQUFhLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQzdFLElBQUk7QUFDSixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0UsS0FBSyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtBQUN0RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbkIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUNyRTtBQUNBLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQy9ELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CO0FBQ2pELFFBQVEsYUFBYSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFDbkQsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsT0FBTztBQUNQLE1BQU07QUFDTixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2hCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CO0FBQy9DLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFDakQsS0FBSyxhQUFhLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsS0FBSyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEtBQUssSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRTtBQUM1QyxNQUFNLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7QUFDL0UsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDNUUsUUFBUSxhQUFhLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pELE9BQU87QUFDUCxNQUFNO0FBQ04sS0FBSztBQUNMLElBQUk7QUFDSixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFDWixFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDNUIsR0FBRyxRQUFRLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQzFCLElBQUksS0FBSyxHQUFHLENBQUM7QUFDYixJQUFJLEtBQUssUUFBUTtBQUNqQixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNwQixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUN0RixLQUFLLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDNUIsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDM0YsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDL0YsS0FBSyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJO0FBQ25CLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUTtBQUN2QixNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQzFELEtBQUssTUFBTTtBQUNYLElBQUksS0FBSyxXQUFXO0FBQ3BCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO0FBQ3pGLEtBQUssS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM1QixLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUM5RixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUNsRyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMvRyxLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkQsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsS0FBSyxNQUFNO0FBQ1gsSUFBSSxLQUFLLFlBQVk7QUFDckIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDMUYsS0FBSyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzVCLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQy9GLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO0FBQ25HLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ2hILEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNwQixLQUFLLE1BQU07QUFDWCxJQUFJLEtBQUssWUFBWTtBQUNyQixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNwQixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUMxRixLQUFLLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDNUIsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDL0YsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDbkcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDaEgsS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLEtBQUssTUFBTTtBQUNYLElBQUksS0FBSyxPQUFPO0FBQ2hCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO0FBQ3JGLEtBQUssS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM1QixLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUM5RixLQUFLLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDNUIsTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUNwQixNQUFNLEtBQUssVUFBVSxDQUFDO0FBQ3RCLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFDcEIsTUFBTSxLQUFLLEdBQUc7QUFDZCxPQUFPLGFBQWEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QixPQUFPLE1BQU07QUFDYixNQUFNO0FBQ04sT0FBTyxJQUFJLENBQUMsK0JBQStCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLE9BQU8sTUFBTTtBQUNiLE1BQU07QUFDTixLQUFLLE1BQU07QUFDWCxJQUFJLEtBQUssTUFBTTtBQUNmLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO0FBQ3BGLEtBQUssS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM1QixLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN6RixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUM3RjtBQUNBLElBQUksS0FBSyxRQUFRLENBQUM7QUFDbEIsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNoQixJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hCLElBQUksS0FBSyxPQUFPLENBQUM7QUFDakIsSUFBSSxLQUFLLE1BQU07QUFDZjtBQUNBLEtBQUssSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQy9CLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSztBQUN2QixNQUFNLEtBQUssUUFBUSxDQUFDO0FBQ3BCLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFDbkIsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUNsQixNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ2xCLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFDbEIsTUFBTSxLQUFLLE1BQU07QUFDakIsT0FBTyxNQUFNO0FBQ2IsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU07QUFDM0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU07QUFDM0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLE1BQU07QUFDN0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU07QUFDM0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU07QUFDM0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLE1BQU07QUFDN0MsTUFBTTtBQUNOLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RSxPQUFPLE1BQU07QUFDYixNQUFNO0FBQ04sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQzNELE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCLE1BQU07QUFDTixLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsRUFBRTtBQUNySyxNQUFNLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RELE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCLE1BQU07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QUFFLFFBQVEsVUFBVTtBQUNwQixHQUFHLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUQsR0FBRyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVELEdBQUcsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1RCxHQUFHLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUQsR0FBRyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVELEdBQUcsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRCxHQUFHLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekQsR0FBRyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELEdBQUcsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEdB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QUFJLEtBQUssR0FBRyxDQUFDO0FBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUNiLElBQUksS0FBSyxHQUFHLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUNiLElBQUksS0FBSyxHQUFHLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUNiLElBQUksS0FBSyxHQUFHLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUNiLElBQUksS0FBSyxHQUFHLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRztBQUNaLEtBQUssSUFBSSxJQUFJLEtBQUssU0FBUztBQUMzQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlELEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQ3JDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEtBQUssTUFBTTtBQUNYLElBQUk7QUFDSixLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSwyQkFBMkIsR0FBRyxHQUFHLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNsRyxJQUFJO0FBQ0osR0FBRztBQUNILEVB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Q0EsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUosSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixJQUFJLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUNwQixJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztBQUN0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3BELElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM5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RyxDQUFDLENBQUM7QUFDZCxHQUFHLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRztBQUNwRixJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ1QsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFELEdBQUc7QUFDSCxFQUFFLENBQUM7QUFDSDtBQUNBLENBQUMsSUFBSSxPQUFPLEdBQUc7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQy9HLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUN6RixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQzlFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUN6RixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUNwRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQy9HLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUN6RixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUNwRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7QUFDekYsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7QUFDcEcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQ3ZELEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7QUFDOUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQ3RCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUc7QUFDdEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNwRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUNqQztBQUNBO0FBQ0EsRUFBRSxDQUFDO0FBQ0gsQ0FBQyxJQUFJLFFBQVEsR0FBRztBQUNoQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ1YsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNWLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDVixFQUFFLENBQUM7QUFDSCxDQUFDLElBQUksUUFBUSxHQUFHO0FBQ2hCLEVBQUUsS0FBSyxFQUFFLEdBQUc7QUFDWixFQUFFLEtBQUssRUFBRSxHQUFHO0FBQ1osRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNaLEVBQUUsS0FBSyxFQUFFLEdBQUc7QUFDWixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNoSixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNoSixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNwSixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNuSixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNsSixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztBQUNqSixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUc7QUFDdEksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2SSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxHQUFHLEVBQUU7QUFDdEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNuQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFQSxVQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUNwQyxHQUFHLElBQUksR0FBRyxLQUFLLElBQUk7QUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ1osUUFBUTtBQUNSLElBQUksSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTO0FBQ3ZCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFNBQVM7QUFDVCxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxLQUFLLElBQUksQ0FBQyxLQUFLLFNBQVM7QUFDeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsVUFBVTtBQUNWLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sSUFBSSxDQUFDLEtBQUssU0FBUztBQUN6QixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLE9BQU8sR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTTtBQUNOLEtBQUs7QUFDTCxJQUFJO0FBQ0osR0FBRyxDQUFDLENBQUM7QUFDTCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsRUFBRSxDQUFDO0FBQ0gsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUN4QyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUM5QixHQUFHLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDN0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNO0FBQ3hDLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU07QUFDMUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTTtBQUMxQyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNO0FBQzFDLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU07QUFDMUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTTtBQUMxQyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNO0FBQzFDLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU07QUFDMUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTTtBQUMxQyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNO0FBQzFDLElBQUk7QUFDSixLQUFLLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FB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R0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25FLEdBQUc7QUFDSCxFQUFFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBLGlCQUFjLEdBQUcsU0FBUzs7QUNsdkIxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7QUFDckMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7QUFDM0MsRUFBRSxPQUFPO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CO0FBQ0EsQ0FBQyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDdkIsQ0FBQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdEIsQ0FBQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDcEIsQ0FBQyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDckIsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUMzQjtBQUNBLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMs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LEVBQUUsRUFBRTtBQUN6QyxFQUFFLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxFQUFFO0FBQ3ZDLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7QUFDbkMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLEdBQUc7QUFDSCxFQUFFO0FBQ0YsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ2pJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUQsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRixDQUFDLElBQUksZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM3SCxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3ZHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFVBQVU7QUFDN0MsRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUNqSCxDQUFDLElBQUksd0JBQXdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxD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VyxFQUFFO0FBQ3RDLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbkMsUUFBUSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbkQsUUFBUSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbkQsUUFBUSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsUUFBUSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDckIsUUFBUTtBQUNSO0FBQ0EsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsT0FBTyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7QUFDNUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsT0FBTyxNQUFNO0FBQ2IsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsT0FBTztBQUNQ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QUFFO0FBQ25GLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25CO0FBQ0E7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUTtBQUNyRixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO0FBQzNEO0FBQ0E7QUFDQSxFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUMxQyxJQUFJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN2QixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JELEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDO0FBQ0EsTUFBTSxNQUFNO0FBQ1osTUFBTSxLQUFL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LE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRixNQUFNO0FBQ04sS0FBS0EsVUFBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekYsS0FBS0EsVUFBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekY7QUFDQSxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsS0FBSyxPQUFPLEVBQUUsQ0FBQztBQUNmLEtBQUs7QUFDTCxJQUFJLENBQUM7QUFDTDtBQUNBLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7QUFDL0IsS0FBSyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7QUFDeEIsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsT0FBTyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FB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QUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQ3RDO0FBQ0EsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUMvRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEdBQUdBLFVBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUdBLFVBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pILElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUMvQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHQSxVQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FB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QyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUztBQUNoTSxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlFLE9BQU8sT0FBTyxJQUFJLENBQUM7QUFDbkIsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ3JELEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDM0IsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUMzQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7QUFDNUIsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUss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VUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsR0FBRyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO0FBQ3RDLEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUdJLFdBQU8sQ0FBQyxJQUFJLENBQUM7QUFDckQsR0FBRyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7QUFDakMsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBR0EsV0FBTyxDQUFDLElBQUksQ0FBQztBQUMxRCxHQUFHLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDN0I7QUFDQSxHQUFHLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDN0IsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxJQUFJLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztBQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFJLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDdEMsSUFBSSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUN2RCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FB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QUFDRCxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO0FBQzVCLEVBQUU7QUFDRixHQUFHLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxJQUFJLENBQUMsMERBQTBELEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9FO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQzFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakYsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDdkIsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqRixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN0QixJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pGLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakY7QUFDQSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FB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QUFDakQsR0FBRyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQztBQUNBLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RCxFQUFFLENBQUM7QUFDSDtBQUNBLENBQUMsSUFBSSxRQUFRLEdBQUc7QUFDaEIsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ04sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ04sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLENBQUM7QUFDSCxDQUFDLElBQUksaUNBQWlDLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNmLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzRSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDL0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDbkYsS0FBSyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssU0FBUztBQUNsQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0MsVUFBVTtBQUNWLE1BQU0sR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0MsTUFBTSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7QUFDbEMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDMUQ7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtBQUN2RixTQUFTLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FB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RyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO0FBQzlELEtBQUssT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUI7QUFDQSxLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLEdBQUcsS0FBSyxHQUFHO0FBQ1gsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO0FBQzlELEtBQUssT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUI7QUFDQSxLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLEdBQUc7QUFDSCxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsRUFBRSxDQUFDO0FBQ0g7QUFDQTtBQUNBLENBQUMsSUFBSSxVQUFVLEdBQUcsU0FBUyxFQUFFLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSTtBQUNyRCxHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixFQUFFLENBQUM7QUFDSDtBQUNBLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFF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QUFDbEQsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDN0UsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDMUUsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDbkYsUUFBUSxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDL0UsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDaEYsUUFBUSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFDNUUsUUFBUSxNQUFNO0FBQ2QsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDNUIsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNsRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNwRSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ3hFLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzFFLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO0FBQ3RFLFFBQVE7QUFDUjtBQUNBLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDM0QsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUNwRSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzFFLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDMUUsT0FBTyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDM0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3RELFFBQVEsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtBQUN0QyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUNyQyxTQUFTLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFD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LElBQUk7QUFDSixHQUFHRixVQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsWUFBWSxLQUFLLEtBQUs7QUFDcEUsS0FBSyxNQUFNLGNBQWMsQ0FBQztBQUMxQixJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsSUFBSSxhQUFhLENBQUMsUUFBUTtBQUMxRCxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBQzFCLElBQUksSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFO0FBQ3JDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQyxNQUFNLGFBQWEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQzFDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLE1BQU07QUFDTixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0YsS0FBSyxNQUFNLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRTtBQUMxQyxLQUFLLElBQUlBLFVBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFO0FBQ3BEO0FBQ0EsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxNQUFNLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQ3hDLE1BQU07QUFDTixVQUFVO0FBQ1YsTUFBTSxJQUFJQSxVQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDNUMsT0FBTyxhQUFhLENBQUMsU0FBUyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFEO0FBQ0EsT0FBTyxhQUFhLENBQUMs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QUksR0FBRyxJQUFJLENBQUM7QUFDbEIsRUFBRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxJQUFJLEdBQUdSLFVBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRUEsVUFBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxJQUFJLEVBQUU7QUFDekMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEQsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDMUIsR0FBRyxDQUFDLENBQUM7QUFDTCxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUNBLFVBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDakY7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hDLEdBQUcsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLEdBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7QUFDeEIsSUFBSSxTQUFTO0FBQ2I7QUFDQSxHQUFHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztBQUM5QyxHQUFHLElBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzFDLEdBQUcsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEUsR0FBRyxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEdBQUcsSUFBSSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxHQUFHLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQy9CLEdBQUcsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0UsR0FBRyxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEMsR0FBRyxJQUFJLENBQUMsR0FB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QUFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQzlELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUN2QixDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQVUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDNUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQ7QUFDQSxDQUFDLENBQUM7QUFDRjtBQUNBLHFCQUFjLEdBQUcsU0FBUzs7QUN6QzFCO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSxNQUFNO0FBQ1gsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcjFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzltQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDOWtELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDOTBELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcmtELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN4akQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN2K0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzk3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN0Z0QsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDOUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDclQsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyVCxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN4dkMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2gxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMXpDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDNXdELEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzFwRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUM3dkYsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUM3bUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcitDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNsaEMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeGtDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN0aUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDdmlFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMzeUQsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3hQLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RyRCxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2NEIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2x4QixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzFlLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4WCxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwZ0MsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMTJCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDOTFCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDL3ZCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQy9OLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2xSLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQy9qQixFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN0Z0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbDdCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzNzQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ25lLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3p1QyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM1aUYsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMTVFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcm5FLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3ZjLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQy8yQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNzZCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzEyQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeHNCLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcnRDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxc0QsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDaDBFLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNsdUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hYLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMzWCxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMXdDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN0b0QsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNubkUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM1OEcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3Q3QyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3I5RyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN0a0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMXdDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3gyRCxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDL0UsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2hGLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3RSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDOUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDOS9DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMzN0QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ25xRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2psQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDOXJDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNubEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2OUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDN2dCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMVIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDOU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDcmhCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNsbUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzV3QixFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM1VSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6VSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2VSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2ckI7QUFDQTtBQUNBLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hRO0FBQ0EsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEc7QUFDQSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xiO0FBQ0EsSUFBSSxTQUFTLEdBQUcsVUFBVSxTQUFTLEVBQUU7QUFDckMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDZCxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsRUFBRSxHQUFH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RSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDMUUsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN4QixFQUFFLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDbkIsR0FBRyxLQUFLLFFBQVEsRUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsTUFBTTtBQUMxQyxHQUFHLEtBQUssT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNO0FBQ3ZDLEdBQUcsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU07QUFDdEMsR0FBRyxLQUFLLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTTtBQUN0QyxHQUFHLEtBQUssVUFBVSxFQUFFLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUN4RCxHQUFHLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUNwRCxHQUFHLEtBQUssUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUNwRCxHQUFHLEtBQUssUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUNwRCxHQUFHLEtBQUssVUFBVSxFQUFFLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ3pELEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDckQsR0FBRyxLQUFLLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyxHQUFHLEVBQUU7QUFDM0IsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDdEIsS0FBSyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTtBQUN6RCxNQUFNLFFBQVEsSUFBSUEsVUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RSxLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUN0QixLQUFLLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTtBQUNyRCxNQUFNLFFBQVEsSUFBSUEsVUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RSxLQUFLLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJRixvQkFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUVFLFVBQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FB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LElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ3pDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQzVDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNO0FBQzFELE9BQU87QUFDUCxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25DLEtBQUs7QUFDTCxTQUFTLE9BQU8sUUFBUSxFQUFFO0FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMs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R0FBRyxVQUFVLEtBQUssRUFBRTtBQUNsRCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUNGO0FBQ0EsWUFBWSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsWUFBWTtBQUNuRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7QUFDMUIsRUFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUN2RCxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDdEcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDWCxFQUFFO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZO0FBQ2pELENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLENBQUMsQ0FBQztBQUNGO0FBQ0EsWUFBWSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZO0FBQ3RELENBQUMsT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkcsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBLFlBQVksQ0FBQyxTQUFTLENBQUMsZUFB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QUFHLElBQUlBLG9CQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdEQsR0FBRyxNQUFNO0FBQ1QsSUFBSSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxJQUFJLFNBQVMsQ0FBQyxhQUFhLEVBQUU7QUFDakMsTUFBTSxJQUFJLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUNFLFVBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQ0EsVUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQy9HLEtBQUs7QUFDTCxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRUEsVUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQy9GLElBQUksUUFBUSxHQUFHLElBQUlGLG9CQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRUUsVUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9GLElBQUksUUFBUSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDM0IsSUFBSSxJQUFJLElBQUksRUFBRTtBQUNkLE1BQU0sSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDbEQ7QUFDQSxLQUFLLElBQUksZ0JBQWdCLEVBQUU7QUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFN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LENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xEO0FBQ0EsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUMvRCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxjQUFjLENBQUM7QUFDNUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDekMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDOUI7QUFDQSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDMUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsRUFBRSxJQUFJLENBQUMsR0FBRztBQUNWLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2hFLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztBQUM3QyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLGtCQUFrQixDQUFDLENBQUM7QUFDdkUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsY0FBYyxDQUFDO0FBQ3hELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUNyRCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDOUM7QUFDQTtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzlELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQ3pELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztBQUNuRCxFQUFFO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQztBQUNGO0FBQ0EsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxLQUFLLEVBQUU7QUFDekMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDbEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUMxRCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDakUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDckUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUM3QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakQsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsTUFBTTtBQUNSLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzNDLEVBQUU7QUFDRixDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFNBQVMsSUFBSSxFQUFFO0FBQy9DO0FBQ0EsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUN2QixFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNoQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVO0FBQzFCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDcEIsRUFBRSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEMsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztBQUN2QixFQUFFO0FBQ0Y7QUFDQSxDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFO0FBQ3BDLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEQsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUN2QixFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNoQyxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUM5QixJQUFJLFNBQVM7QUFDYixHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxHQUFHO0FBQ0gsRUFBRTtBQUNGLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqQixDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ2xELENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEQsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUN2QixFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNoQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25DLEdBQUc7QUFDSCxFQUFFO0FBQ0YsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEMsRUFBRSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RCxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNiLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLEVBQUU7QUFDRixDQUFDLElBQUksTUFBTTtBQUNYLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QjtBQUNBLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDaEQsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDakMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNWLENBQUMsSUFBSTtBQUNMLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN2QixFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ3hDLEdBQUcsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN4RTtBQUNBLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRCxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDZCxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDdkUsRUFBRTtBQUNGLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQixDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxXQUFXO0FBQzFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDckIsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQzlCLEVBQUUsSUFBSSxNQUFNLEdBQUc7QUFDZixHQUFHLDRCQUE0QjtBQUMvQixHQUFHLGNBQWM7QUFDakIsR0FBRyxhQUFhO0FBQ2hCLEdBQUcscUJBQXFCO0FBQ3hCLEdBQUcsQ0FBQztBQUNKLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsQyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDckQsQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7QUFDN0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztBQUNqQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDakMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakMsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN2QixDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ1IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNWLENBQUMsSUFBSTtBQUNMLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN2QixFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ3hDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25ELEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUNkLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JDLEVBQUU7QUFDRixDQUFDLElBQUksV0FBVyxFQUFFO0FBQ2xCLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWTtBQUN2QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QixFQUFFO0FBQ0YsQ0FBQyxPQUFPLElBQUksQ0FBQztBQUNiLENBQUMsQ0FBQztBQUNGO0FBQ0EsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxPQUFPLEVBQUU7QUFDNUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbEMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMvQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU87QUFDcEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqRDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxXQUFXO0FBQ3RDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztBQUMzQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzFCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDVixDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFO0FBQ3BDLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEQsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUN2QixFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNoQyxHQUFHLElBQUksR0FBRyxLQUFLLE1BQU07QUFDckIsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUMsR0FBRztBQUNILEVBQUU7QUFDRixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUNGO0FBQ0EsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxJQUFJLEVBQUU7QUFDMUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRCxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3ZCLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2hDLEdBQUcsSUFBSSxHQUFHLEtBQUssTUFBTTtBQUNyQixJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUM7QUFDQSxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QyxHQUFHO0FBQ0gsRUFBRTtBQUNGLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsRUFBRTtBQUNwQyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVk7QUFDdEIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQztBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEVBQUUsRUFBRTtBQUNyQztBQUNBLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWTtBQUN0QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRjtBQUNBLEdBQUcsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQ3pELENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdkIsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDaEMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsR0FBRztBQUNILEVBQUU7QUFDRixDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsU0FBUyxHQUFHO0FBQ3JCLENBQUMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLCtCQUErQixFQUFFLGFBQWEsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3BHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyxPQUFPLEdBQUcsQ0FBQztBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0EsT0FBYyxHQUFHLEdBQUc7O0FDdFNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNxQztBQUNFO0FBQ0o7QUFDUjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsR0FBRyxTQUFTLEtBQUssRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUU7QUFDL0QsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUlJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3pCO0FBQ0EsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQ3hCLFdBQU8sQ0FBQyxLQUFLLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNwQixFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ25DLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQzNDLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWTtBQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxXQUFXO0FBQ3RDO0FBQ0EsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUN0QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDdEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUMxQixDQUFDLElBQUksSUFBSSxDQUFDLFlBQVk7QUFDdEIsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7QUFDRjtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxFQUFFO0FBQy9DLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDeEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN4QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxXQUFXO0FBQzlDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVztBQUM3QyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxPQUFPLEVBQUU7QUFDckQsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUFVLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0FBQ3pFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQzdDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztBQUM1QyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU87QUFDakIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEI7QUFDQSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVk7QUFDdEIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekQ7QUFDQTtBQUNBLENBQUMsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDO0FBQzFCLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUs7QUFDekUsRUFBRSxJQUFJLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDeEQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQjtBQUNBLENBQUMsSUFBSSxZQUFZLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDM0MsQ0FBQyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7QUFDOUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLE1BQU07QUFDUixFQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQzFCLEVBQUUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQ2pCLEdBQUcsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDNUMsR0FBRztBQUNILEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUU7QUFDRixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxNQUFNLEVBQUU7QUFDekQsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxhQUFhO0FBQzlFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN6RCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxPQUFPLEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUU7QUFDM0YsRUFBRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUztBQUNyRCxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRSxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTO0FBQ3pELEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTztBQUN2QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQzNDO0FBQ0EsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztBQUM1QyxFQUFFO0FBQ0Y7QUFDQTtBQUNBLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLG9CQUFvQixHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQzNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQzNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO0FBQzlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQzVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO0FBQzdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7QUFDbEQsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUNsRCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsV0FBVztBQUNsRDtBQUNBO0FBQ0EsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHO0FBQ2hCLEVBQUUsUUFBUSxFQUFFLElBQUk7QUFDaEIsRUFBRSxXQUFXLEVBQUUsSUFBSTtBQUNuQixFQUFFLFdBQVcsRUFBRSxLQUFLO0FBQ3BCLEVBQUUsVUFBVSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsY0FBYyxFQUFFLEdBQUc7QUFDckIsRUFBRSxLQUFLLEVBQUUsSUFBSTtBQUNiLEVBQUUsbUJBQW1CLEVBQUUsR0FBRztBQUMxQixFQUFFLEtBQUssRUFBRSxLQUFLO0FBQ2QsRUFBRSxVQUFVLEVBQUUsR0FBRztBQUNqQixFQUFFLGVBQWUsRUFBRSxLQUFLO0FBQ3hCLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLEVBQUUsUUFBUSxFQUFFLElBQUk7QUFDaEIsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO0FBQzNCLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDWixFQUFFLEtBQUssRUFBRSxJQUFJO0FBQ2IsRUFBRSxHQUFHLEVBQUUsS0FBSztBQUNaLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDZCxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ1YsRUFBRSxDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsVUFBVSxFQUFFO0FBQzNEO0FBQ0EsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUztBQUN0QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxTQUFTO0FBQzNDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVM7QUFDeEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUztBQUN2QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxTQUFTO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVM7QUFDeEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEtBQUssU0FBUztBQUN6QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUMsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVM7QUFDM0MsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUztBQUN0QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxTQUFTO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVM7QUFDeEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsT0FBTyxFQUFFO0FBQ2pELEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsV0FBVztBQUNoRCxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFNBQVMsY0FBYyxFQUFFLGNBQWMsRUFBRTtBQUM5RSxDQUFDLElBQUksU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxJQUFJLGNBQWMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQyxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFDdEQsQ0FBQyxJQUFJLGtCQUFrQixHQUFHLGlCQUFpQixHQUFHQSxXQUFPLENBQUMsSUFBSSxDQUFDO0FBQzNELENBQUMsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7QUFDdEQsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsU0FBUyxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQzdELENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzlDO0FBQ0E7QUFDQSxFQUFFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLDZCQUE2QixDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztBQUM1QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hILEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN2SSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvSCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUM7QUFDN0IsRUFBRTtBQUNGLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTztBQUNqQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFJLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNuSjtBQUNBLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtBQUN0RixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZIO0FBQ0EsRUFBRSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsRUFBRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUMzRSxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDcEYsRUFBRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQy9CLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0SCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsR0FBRyxNQUFNO0FBQ1QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoSDtBQUNBO0FBQ0EsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3RyxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUMvRCxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN4QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFO0FBQ3RDLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDN0QsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDaEU7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDaEQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNuRSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUNoRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO0FBQ3BFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBR0EsV0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekksSUFBSSxNQUFNO0FBQ1YsSUFBSSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDckIsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDcEIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hFLEtBQUssSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7QUFDOUQsS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHQSxXQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvSCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDckUsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDM0I7QUFDQSxLQUFLLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDeEQsTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM3QixNQUFNO0FBQ04sS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSTtBQUNKLEdBQUc7QUFDSCxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDaEQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqRixDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdkYsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3RHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwRixDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxJQUFJLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUM1RyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDMUYsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM5RyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5RztBQUNBLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzSCxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEksRUFBRTtBQUNGLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDM0QsQ0FBQyxJQUFJLEtBQUs7QUFDVixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUM1RCxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTtBQUNsQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6QyxFQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsRUFBRSxNQUFNO0FBQ1IsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtBQUNuQixJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFDeEMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2QixHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLEdBQUc7QUFDSCxFQUFFLElBQUksU0FBUyxHQUFHLFVBQVUsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBQ2xELEVBQUUsSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNyRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDekUsRUFBRTtBQUNGLENBQUMsQ0FBQztBQUNGO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxTQUFTLEVBQUU7QUFDMUQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVU7QUFDMUIsRUFBRSxPQUFPO0FBQ1QsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDL0QsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pJLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsWUFBWTtBQUM1QyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQzdDLEVBQUUsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDcEIsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE9BQU87QUFDOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDeEMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFDMUIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEtBQUs7QUFDTCxJQUFJ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QUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDakMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDakMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BIO0FBQ0EsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRztBQUNBLENB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QUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNoTDtBQUNBLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNyQixFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQzFELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsR0FBRztBQUNILEVBQUU7QUFDRixDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFDRjtBQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUMxRCxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ1YsQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFB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QUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDNUQsWUFBWSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUM1RCxZQUFZLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQzVELFlBQVksUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFDaEUsWUFBWSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUM1RCxZQUFZLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO0FBQ2xFLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUN4QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakMsWUFBWSxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ2xCLFFBQVEsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO0FBQ3RELFlBQVksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFB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RUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ1YsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ1YsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ1YsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ1YsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsRUFBRSxFQUFFLElBQUk7QUFDVCxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ1YsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsSUFBSTtBQUNULENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDVixDQUFDLEVBQUUsRUFBRSxJQUFJO0FBQ1QsQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUNWLENBQUMsR0FBRyxFQUFFLElBQUk7QUFDVixDQUFDLEdBQUcsRUFBRSxJQUFJO0FBQ1YsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUNYLENBQUMsR0FBRyxFQUFFLElBQUk7QUFDVixDQUFDLEdBQUcsRUFBRSxLQUFLO0FBQ1gsQ0FBQyxHQUFHLEVBQUUsSUFBSTtBQUNWLENBQUMsR0FBRyxFQUFFLEtBQUs7QUFDWCxDQUFDLEdBQUcsRUFBRSxJQUFJO0FBQ1YsQ0FBQyxHQUFHLEVBQUUsSUFBSTtBQUNWLENBQUMsR0FBRyxFQUFFLEtBQUs7QUFDWCxDQUFDLEdBQUcsRUFBRSxJQUFJO0FBQ1YsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUNYLENBQUMsR0FBRyxFQUFFLElBQUk7QUFDVixDQUFDLEdBQUcsRUFBRSxJQUFJO0FBQ1YsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUNYLENBQUMsR0FBRyxFQUFFLElBQUk7QUFDVixDQUFDLEdBQUcsRUFBRSxLQUFLO0FBQ1gsQ0FBQyxHQUFHLEVBQUUsSUFBSTtBQUNWLENBQUMsR0FBRyxFQUFFLEtBQUs7QUFDWCxDQUFDLEdBQUcsRUFBRSxJQUFJO0FBQ1YsQ0FBQyxHQUFHLEVBQUUsSUFBSTtBQUNWLENBQUMsR0FBRyxFQUFFLEtBQUs7QUFDWCxDQUFDLENBQUM7QUFDRjtBQUNBLHFCQUFjLEdBQUcsZUFBZTs7QUN4R2hDLElBQUksY0FBYyxHQUFHLFNBQVMsTUFBTSxFQUFFO0FBQ3RDLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBLFNBQVMsWUFBWSxDQUFDLFlBQVksRUFBRTtBQUNwQyxDQUFDLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFDckMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFELENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNuQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxJQUFJLE1BQU0sQ0FBQztBQUNaLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2I7QUFDQTtBQUNBLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN2QjtBQUNBLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2Y7QUFDQSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN2QixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdCO0FBQ0E7QUFDQSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRDtBQUNBLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFO0FBQ3JCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDbkUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ1osR0FBRztBQUNILEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDWCxFQUFFO0FBQ0Y7QUFDQTtBQUNBLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDaEQ7QUFDQSxDQUFDLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRTtBQUMxQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDWCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRTtBQUMxQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDWCxFQUFFO0FBQ0YsQ0FBQztBQUNEO0FBQ0Esb0JBQWMsR0FBRyxjQUFjOztBQzdEL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQztBQUNiO0FBQ0EsQ0FBQyxXQUFXO0FBRVo7QUFDQSxD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QUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakQ7QUFDQSxHQUFHLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDbkIsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQzVCLElBQUksSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0I7QUFDQSxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNuRDtBQUNBLE1BQU0sSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLE9BQU87QUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7QUFDcEQsT0FBTyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0s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QUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUNqRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsSUFBSTtBQUNKLEdBQUc7QUFDSCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3BELEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxjQUFjLEdBQUc7QUFDdEI7QUFDQSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BCLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQjtBQUNBLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDdkIsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDM0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDekIsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDM0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDekI7QUFDQSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN4QixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUMxQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN4QjtBQUNBLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNqQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2pDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM5QixFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUM3QixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUMzQixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ25DLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDakM7QUFDQTtBQUNBLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0QixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0QixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN2QixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN2QjtBQUNBLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUM1QixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzdCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzFCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM3QixFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xCLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUMzQjtBQUNBLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ3RCLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUMxQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQy9CLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzVCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM1QixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDOUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM1QixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2pDLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDcEMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN0QyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ25DLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDakMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQy9CLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM3QixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ25DLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDakMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2xDO0FBQ0EsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDekIsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDdkIsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDdkIsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzdCLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDakMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2xDLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNqQyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3ZDO0FBQ0EsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDMUIsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDM0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzFCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzFCLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzNCO0FBQ0E7QUFDQSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN6QixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUN2QixFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ3hCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ3hCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ3hCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM1QixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDNUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzVCLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzNCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ3pCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQzFCLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNqQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDOUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDN0IsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7QUFDM0IsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3JDLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFB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QUMsV0FBVyxHQUFHLFdBQVc7QUFDL0M7QUFDQSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxJQUFJLElBQUksQ0FBQyxlQUFl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 diff --git a/.obsidian/plugins/music-code-blocks/manifest.json b/.obsidian/plugins/music-code-blocks/manifest.json deleted file mode 100644 index 2264d2ff..00000000 --- a/.obsidian/plugins/music-code-blocks/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "music-code-blocks", - "name": "Music notation", - "version": "1.0.3", - "minAppVersion": "0.9.15", - "description": "Plugin which renders music notation from code blocks. Uses the `music-abc` language.", - "author": "Til Blechschmidt", - "authorUrl": "https://github.com/TilBlechschmidt/obsidian-plugin-abcjs", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/music-code-blocks/styles.css b/.obsidian/plugins/music-code-blocks/styles.css deleted file mode 100644 index abf9b919..00000000 --- a/.obsidian/plugins/music-code-blocks/styles.css +++ /dev/null @@ -1,9 +0,0 @@ -/* Default abcjs styles look good. Just adapting it to the current theme. */ - -.abcjs-container svg path { - fill: var(--text-normal); -} - -.abcjs-container svg text { - fill: var(--text-normal); -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-dice-roller/main.js b/.obsidian/plugins/obsidian-dice-roller/main.js index 80b54e2a..e1aeedea 100644 --- a/.obsidian/plugins/obsidian-dice-roller/main.js +++ b/.obsidian/plugins/obsidian-dice-roller/main.js @@ -1,2 +1,2 @@ /*! For license information please see main.js.LICENSE.txt */ -(()=>{var t={885:t=>{function e(t){"function"!=typeof t&&(t=e.defunct);var i=[],n=[],r=0;function s(){for(var t=[],e=0,i=this.state,r=this.index,s=this.input,a=0,o=n.length;a=0||i%2&&1===h&&!c[0]){var u=l.pattern;u.lastIndex=r;var d=u.exec(s);if(d&&d.index===r){var p=t.push({result:d,action:l.action,length:d[0].length});for(l.global&&(e=p);--p>e;){var f=p-1;if(t[p].length>t[f].length){var m=t[p];t[p]=t[f],t[f]=m}}}}}return t}this.state=0,this.index=0,this.input="",this.addRule=function(t,e,i){var r=t.global;if(!r){var s="g";t.multiline&&(s+="m"),t.ignoreCase&&(s+="i"),t=new RegExp(t.source,s)}return"[object Array]"!==Object.prototype.toString.call(i)&&(i=[0]),n.push({pattern:t,global:r,action:e,start:i}),this},this.setInput=function(t){return r=0,this.state=0,this.index=0,i.length=0,this.input=t,this},this.lex=function(){if(i.length)return i.shift();for(this.reject=!0;this.index<=this.input.length;){for(var e=s.call(this).splice(r),n=this.index;e.length&&this.reject;){var a=e.shift(),o=a.result,l=a.length;this.index+=l,this.reject=!1,r++;var c=a.action.apply(this,o);if(this.reject)this.index=o.index;else if(void 0!==c)return"[object Array]"===Object.prototype.toString.call(c)&&(i=c.slice(1),c=c[0]),l&&(r=0),c}var h=this.input;if(n{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";function t(t,e,i,n){return new(i||(i=Promise))((function(r,s){function a(t){try{l(n.next(t))}catch(t){s(t)}}function o(t){try{l(n.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}l((n=n.apply(t,e||[])).next())}))}i.r(n),i.d(n,{default:()=>jf}),Object.create,Object.create;const e=require("obsidian");var r=i(885),s=i.n(r),a={prefix:"fas",iconName:"dice",icon:[640,512,[],"f522","M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"]},o={prefix:"far",iconName:"copy",icon:[448,512,[],"f0c5","M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"]};function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function c(t,e){for(var i=0;i0;)e+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[62*Math.random()|0];return e}function it(t){return"".concat(t).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function nt(t){return Object.keys(t||{}).reduce((function(e,i){return e+"".concat(i,": ").concat(t[i],";")}),"")}function rt(t){return t.size!==tt.size||t.x!==tt.x||t.y!==tt.y||t.rotate!==tt.rotate||t.flipX||t.flipY}function st(t){var e=t.transform,i=t.containerWidth,n=t.iconWidth,r={transform:"translate(".concat(i/2," 256)")},s="translate(".concat(32*e.x,", ").concat(32*e.y,") "),a="scale(".concat(e.size/16*(e.flipX?-1:1),", ").concat(e.size/16*(e.flipY?-1:1),") "),o="rotate(".concat(e.rotate," 0 0)");return{outer:r,inner:{transform:"".concat(s," ").concat(a," ").concat(o)},path:{transform:"translate(".concat(n/2*-1," -256)")}}}var at={x:0,y:0,width:"100%",height:"100%"};function ot(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.attributes&&(t.attributes.fill||e)&&(t.attributes.fill="black"),t}function lt(t){var e=t.icons,i=e.main,n=e.mask,r=t.prefix,s=t.iconName,a=t.transform,o=t.symbol,l=t.title,c=t.maskId,h=t.titleId,d=t.extra,p=t.watchable,f=void 0!==p&&p,m=n.found?n:i,g=m.width,v=m.height,y="fak"===r,x=y?"":"fa-w-".concat(Math.ceil(g/v*16)),w=[C.replacementClass,s?"".concat(C.familyPrefix,"-").concat(s):"",x].filter((function(t){return-1===d.classes.indexOf(t)})).filter((function(t){return""!==t||!!t})).concat(d.classes).join(" "),b={children:[],attributes:u({},d.attributes,{"data-prefix":r,"data-icon":s,class:w,role:d.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(g," ").concat(v)})},_=y&&!~d.classes.indexOf("fa-fw")?{width:"".concat(g/v*16*.0625,"em")}:{};f&&(b.attributes["data-fa-i2svg"]=""),l&&b.children.push({tag:"title",attributes:{id:b.attributes["aria-labelledby"]||"title-".concat(h||et())},children:[l]});var M=u({},b,{prefix:r,iconName:s,main:i,mask:n,maskId:c,transform:a,symbol:o,styles:u({},_,d.styles)}),S=n.found&&i.found?function(t){var e,i=t.children,n=t.attributes,r=t.main,s=t.mask,a=t.maskId,o=t.transform,l=r.width,c=r.icon,h=s.width,d=s.icon,p=st({transform:o,containerWidth:h,iconWidth:l}),f={tag:"rect",attributes:u({},at,{fill:"white"})},m=c.children?{children:c.children.map(ot)}:{},g={tag:"g",attributes:u({},p.inner),children:[ot(u({tag:c.tag,attributes:u({},c.attributes,p.path)},m))]},v={tag:"g",attributes:u({},p.outer),children:[g]},y="mask-".concat(a||et()),x="clip-".concat(a||et()),w={tag:"mask",attributes:u({},at,{id:y,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[f,v]},b={tag:"defs",children:[{tag:"clipPath",attributes:{id:x},children:(e=d,"g"===e.tag?e.children:[e])},w]};return i.push(b,{tag:"rect",attributes:u({fill:"currentColor","clip-path":"url(#".concat(x,")"),mask:"url(#".concat(y,")")},at)}),{children:i,attributes:n}}(M):function(t){var e=t.children,i=t.attributes,n=t.main,r=t.transform,s=nt(t.styles);if(s.length>0&&(i.style=s),rt(r)){var a=st({transform:r,containerWidth:n.width,iconWidth:n.width});e.push({tag:"g",attributes:u({},a.outer),children:[{tag:"g",attributes:u({},a.inner),children:[{tag:n.icon.tag,children:n.icon.children,attributes:u({},n.icon.attributes,a.path)}]}]})}else e.push(n.icon);return{children:e,attributes:i}}(M),E=S.children,T=S.attributes;return M.children=E,M.attributes=T,o?function(t){var e=t.prefix,i=t.iconName,n=t.children,r=t.attributes,s=t.symbol;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:u({},r,{id:!0===s?"".concat(e,"-").concat(C.familyPrefix,"-").concat(i):s}),children:n}]}]}(M):function(t){var e=t.children,i=t.main,n=t.mask,r=t.attributes,s=t.styles,a=t.transform;if(rt(a)&&i.found&&!n.found){var o={x:i.width/i.height/2,y:.5};r.style=nt(u({},s,{"transform-origin":"".concat(o.x+a.x/16,"em ").concat(o.y+a.y/16,"em")}))}return[{tag:"svg",attributes:r,children:e}]}(M)}var ct=(C.measurePerformance&&b&&b.mark&&b.measure,function(t,e,i,n){var r,s,a,o=Object.keys(t),l=o.length,c=void 0!==n?function(t,e){return function(i,n,r,s){return t.call(e,i,n,r,s)}}(e,n):e;for(void 0===i?(r=1,a=t[o[0]]):(r=0,a=i);r2&&void 0!==arguments[2]?arguments[2]:{},n=i.skipHooks,r=void 0!==n&&n,s=Object.keys(e).reduce((function(t,i){var n=e[i];return n.icon?t[n.iconName]=n.icon:t[i]=n,t}),{});"function"!=typeof P.hooks.addPack||r?P.styles[t]=u({},P.styles[t]||{},s):P.hooks.addPack(t,s),"fas"===t&&ht("fa",e)}var ut=P.styles,dt=P.shims,pt=function(){var t=function(t){return ct(ut,(function(e,i,n){return e[n]=ct(i,t,{}),e}),{})};t((function(t,e,i){return e[3]&&(t[e[3]]=i),t})),t((function(t,e,i){var n=e[2];return t[i]=i,n.forEach((function(e){t[e]=i})),t}));var e="far"in ut;ct(dt,(function(t,i){var n=i[0],r=i[1],s=i[2];return"far"!==r||e||(r="fas"),t[n]={prefix:r,iconName:s},t}),{})};function ft(t,e,i){if(t&&t[e]&&t[e][i])return{prefix:e,iconName:i,icon:t[e][i]}}function mt(t){var e=t.tag,i=t.attributes,n=void 0===i?{}:i,r=t.children,s=void 0===r?[]:r;return"string"==typeof t?it(t):"<".concat(e," ").concat(function(t){return Object.keys(t||{}).reduce((function(e,i){return e+"".concat(i,'="').concat(it(t[i]),'" ')}),"").trim()}(n),">").concat(s.map(mt).join(""),"")}function gt(t){this.name="MissingIcon",this.message=t||"Icon unavailable",this.stack=(new Error).stack}pt(),P.styles,gt.prototype=Object.create(Error.prototype),gt.prototype.constructor=gt;var vt={fill:"currentColor"},yt={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},xt=(u({},vt,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"}),u({},yt,{attributeName:"opacity"}));function wt(t){var e=t[0],i=t[1],n=d(t.slice(4),1)[0];return{found:!0,width:e,height:i,icon:Array.isArray(n)?{tag:"g",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.GROUP)},children:[{tag:"path",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.SECONDARY),fill:"currentColor",d:n[0]}},{tag:"path",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.PRIMARY),fill:"currentColor",d:n[1]}}]}:{tag:"path",attributes:{fill:"currentColor",d:n}}}}u({},vt,{cx:"256",cy:"364",r:"28"}),u({},yt,{attributeName:"r",values:"28;14;28;28;14;28;"}),u({},xt,{values:"1;0;1;1;0;1;"}),u({},vt,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),u({},xt,{values:"1;0;0;0;0;1;"}),u({},vt,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),u({},xt,{values:"0;0;1;1;0;0;"}),P.styles,P.styles;var bt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.definitions={}}var e,i;return e=t,i=[{key:"add",value:function(){for(var t=this,e=arguments.length,i=new Array(e),n=0;n-1;r--){var s=i[r],a=(s.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(a)>-1&&(n=s)}w.head.insertBefore(e,n)}}(function(){var t="fa",e=M,i=C.familyPrefix,n=C.replacementClass,r='svg:not(:root).svg-inline--fa {\n overflow: visible;\n}\n\n.svg-inline--fa {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.225em;\n}\n.svg-inline--fa.fa-w-1 {\n width: 0.0625em;\n}\n.svg-inline--fa.fa-w-2 {\n width: 0.125em;\n}\n.svg-inline--fa.fa-w-3 {\n width: 0.1875em;\n}\n.svg-inline--fa.fa-w-4 {\n width: 0.25em;\n}\n.svg-inline--fa.fa-w-5 {\n width: 0.3125em;\n}\n.svg-inline--fa.fa-w-6 {\n width: 0.375em;\n}\n.svg-inline--fa.fa-w-7 {\n width: 0.4375em;\n}\n.svg-inline--fa.fa-w-8 {\n width: 0.5em;\n}\n.svg-inline--fa.fa-w-9 {\n width: 0.5625em;\n}\n.svg-inline--fa.fa-w-10 {\n width: 0.625em;\n}\n.svg-inline--fa.fa-w-11 {\n width: 0.6875em;\n}\n.svg-inline--fa.fa-w-12 {\n width: 0.75em;\n}\n.svg-inline--fa.fa-w-13 {\n width: 0.8125em;\n}\n.svg-inline--fa.fa-w-14 {\n width: 0.875em;\n}\n.svg-inline--fa.fa-w-15 {\n width: 0.9375em;\n}\n.svg-inline--fa.fa-w-16 {\n width: 1em;\n}\n.svg-inline--fa.fa-w-17 {\n width: 1.0625em;\n}\n.svg-inline--fa.fa-w-18 {\n width: 1.125em;\n}\n.svg-inline--fa.fa-w-19 {\n width: 1.1875em;\n}\n.svg-inline--fa.fa-w-20 {\n width: 1.25em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-border {\n height: 1.5em;\n}\n.svg-inline--fa.fa-li {\n width: 2em;\n}\n.svg-inline--fa.fa-fw {\n width: 1.25em;\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-align: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: #ff253a;\n border-radius: 1em;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n color: #fff;\n height: 1.5em;\n line-height: 1;\n max-width: 5em;\n min-width: 1.5em;\n overflow: hidden;\n padding: 0.25em;\n right: 0;\n text-overflow: ellipsis;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: 0;\n right: 0;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom right;\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: 0;\n left: 0;\n right: auto;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom left;\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n right: 0;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: 0;\n right: auto;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n\n.fa-lg {\n font-size: 1.3333333333em;\n line-height: 0.75em;\n vertical-align: -0.0667em;\n}\n\n.fa-xs {\n font-size: 0.75em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n}\n\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit;\n}\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: 0.1em;\n padding: 0.2em 0.25em 0.15em;\n}\n\n.fa-pull-left {\n float: left;\n}\n\n.fa-pull-right {\n float: right;\n}\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: 0.3em;\n}\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: 0.3em;\n}\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1);\n}\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none;\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n position: relative;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.svg-inline--fa.fa-stack-1x {\n height: 1em;\n width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n height: 2em;\n width: 2.5em;\n}\n\n.fa-inverse {\n color: #fff;\n}\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n}\n\n.svg-inline--fa .fa-primary {\n fill: var(--fa-primary-color, currentColor);\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n fill: var(--fa-secondary-color, currentColor);\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n fill: black;\n}\n\n.fad.fa-inverse {\n color: #fff;\n}';if(i!==t||n!==e){var s=new RegExp("\\.".concat(t,"\\-"),"g"),a=new RegExp("\\--".concat(t,"\\-"),"g"),o=new RegExp("\\.".concat(e),"g");r=r.replace(s,".".concat(i,"-")).replace(a,"--".concat(i,"-")).replace(o,".".concat(n))}return r}()),At=!0)}function Mt(t,e){return Object.defineProperty(t,"abstract",{get:e}),Object.defineProperty(t,"html",{get:function(){return t.abstract.map((function(t){return mt(t)}))}}),Object.defineProperty(t,"node",{get:function(){if(_){var e=w.createElement("div");return e.innerHTML=t.html,e.children}}}),t}function St(t){var e=t.prefix,i=void 0===e?"fa":e,n=t.iconName;if(n)return ft(Tt.definitions,i,n)||ft(P.styles,i,n)}var Et,Tt=new bt,At=!1,Lt=(Et=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.transform,n=void 0===i?tt:i,r=e.symbol,s=void 0!==r&&r,a=e.mask,o=void 0===a?null:a,l=e.maskId,c=void 0===l?null:l,h=e.title,d=void 0===h?null:h,p=e.titleId,f=void 0===p?null:p,m=e.classes,g=void 0===m?[]:m,v=e.attributes,y=void 0===v?{}:v,x=e.styles,w=void 0===x?{}:x;if(t){var b=t.prefix,_=t.iconName,M=t.icon;return Mt(u({type:"icon"},t),(function(){return _t(),C.autoA11y&&(d?y["aria-labelledby"]="".concat(C.replacementClass,"-title-").concat(f||et()):(y["aria-hidden"]="true",y.focusable="false")),lt({icons:{main:wt(M),mask:o?wt(o.icon):{found:!1,width:null,height:null,icon:{}}},prefix:b,iconName:_,transform:u({},tt,n),symbol:s,title:d,maskId:c,titleId:f,extra:{attributes:y,styles:w,classes:g}})}))}},function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=(t||{}).icon?t:St(t||{}),n=e.mask;return n&&(n=(n||{}).icon?n:St(n||{})),Et(i,u({},e,{mask:n}))});class Ct{constructor(t){this.table=t}parse(t){for(var e=t.length,i=this.table,n=[],r=[],s=0;sc||l===c&&"right"===o.associativity)break;n.push(r.shift())}r.unshift(h)}else n.push(h)}for(;r.length;){var h;if("("===(h=r.shift()).data)throw new Error("Mismatched parentheses.");n.push(h)}return n}}const Rt=/(?:(?\d+)[Dd])?#(?[\p{Letter}\p{Emoji_Presentation}\w/-]+)(?:\|(?[\+-]))?(?:\|(?[^\+-]+))?/u,Pt=/(?:(?\d+)[Dd])?\[\[(?[\s\S]+?)#?\^(?[\s\S]+?)\]\]\|?(?
[\s\S]+)?/,It=/(?:(?\d+)[Dd])?\[\[(?[\s\S]+)\]\]\|?(?[\s\S]+)?/,Nt=/[\(\^\+\-\*\/\)]/,zt=/(?(?\d+)(?:[Dd]?\[?(?:-?\d+\s?,)?\s?(?:-?\d+|%|F)\]?)?)(?(?:(?:=|=!|<|>|<=|>=|=<|=>|\-=|=\-)\d+)*)?/,Dt=/(?\d+)?[Dd](?\[?(?:-?\d+\s?,)?\s?(?:-?\d+|%|F)\]?)?(?(?:(?:=|=!|<|>|<=|>=|=<|=>|\-=|=\-)\d+)*)?/,Bt=/(?:(?=|=!|<|>|<=|>=|=<|=>|\-=|=\-)(?\d+))/g,Ft="dice-roller-icon",Ot="dice-roller-copy";function kt(t,e,i){[...t].slice(e).reverse().forEach((([e,i])=>{t.set(e+1,i)})),t.set(e,i)}class Ht extends e.Events{constructor(t,i,n){super(),this.plugin=t,this.original=i,this.lexemes=n,this.loaded=!1,this.containerEl=createDiv({cls:"dice-roller",attr:{"aria-label-position":"top","data-dice":this.original}}),this.resultEl=this.containerEl.createDiv("dice-roller-result");const r=this.containerEl.createDiv({cls:"dice-roller-button"});(0,e.setIcon)(r,Ft),this.containerEl.onclick=this.onClick.bind(this),r.onclick=this.onClick.bind(this)}setTooltip(){this.plugin.data.displayResultsInline||this.containerEl.setAttrs({"aria-label":this.tooltip})}getRandomBetween(t,e){return Math.floor(Math.random()*(e-t+1))+t}render(){return t(this,void 0,void 0,(function*(){this.setTooltip(),yield this.build()}))}get inlineText(){return`${this.tooltip.split("\n").join(" -> ")} -> `}onClick(e){var i;return t(this,void 0,void 0,(function*(){e.stopPropagation(),e.stopImmediatePropagation(),(null===(i=window.getSelection())||void 0===i?void 0:i.isCollapsed)&&(yield this.roll())}))}}class Ut extends Ht{}class Vt extends Ut{constructor(t,e,i,n){super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n,this.getPath(),this.getFile()}getFile(){return t(this,void 0,void 0,(function*(){if(this.file=this.plugin.app.metadataCache.getFirstLinkpathDest(this.path,this.source),!(this.file&&this.file instanceof e.TFile))throw new Error("Could not load file.");yield this.load(),this.registerFileWatcher()}))}registerFileWatcher(){this.plugin.registerEvent(this.plugin.app.vault.on("modify",(e=>t(this,void 0,void 0,(function*(){e===this.file&&(yield this.getOptions())})))))}}class Gt{constructor(t,e={original:t,conditionals:[],type:"dice",data:t}){var i;if(this.lexeme=e,this.modifiers=new Map,this.modifiersAllowed=!0,this.static=!1,this.conditions=[],!/(\-?\d+)[dD]?(\d+|%|\[\d+,\s?\d+\])?/.test(t))throw new Error("Non parseable dice string passed to DiceRoll.");this.dice=t.split(" ").join(""),/^-?\d+$/.test(this.dice)&&(this.static=!0,this.modifiersAllowed=!1);let[,n,r=null,s=1]=this.dice.match(/(\-?\d+)[dD]\[?(?:(-?\d+)\s?,)?\s?(-?\d+|%|F)\]?/)||[,1,null,1];this.multiplier=n<0?-1:1,this.rolls=Math.abs(Number(n))||1,Number(s)<0&&!r&&(r=-1),"%"===s&&(s=100),"F"===s&&(s=1,r=-1),Number(s)[e,{usable:!0,value:t,display:`${t}`,modifiers:new Set}])))}get text(){return`${this.result}`}get result(){return this.static?Number(this.dice):[...this.results].map((([,{usable:t,value:e}])=>t?e:0)).reduce(((t,e)=>t+e),0)}get display(){return this.static?`${this.result}`:`[${[...this.results].map((([,{modifiers:t,display:e}])=>`${e}${[...t].join("")}`)).join(", ")}]`}keepLow(t=1){this.modifiersAllowed?[...this.results].sort(((t,e)=>t[1].value-e[1].value)).slice(t-this.results.size).forEach((([t])=>{const e=this.results.get(t);e.usable=!1,e.modifiers.add("d"),this.results.set(t,Object.assign({},e))})):new e.Notice("Modifiers are only allowed on dice rolls.")}keepHigh(t=1){this.modifiersAllowed?[...this.results].sort(((t,e)=>e[1].value-t[1].value)).slice(t).forEach((([t])=>{const e=this.results.get(t);e.usable=!1,e.modifiers.add("d"),this.results.set(t,Object.assign({},e))})):new e.Notice("Modifiers are only allowed on dice rolls.")}reroll(t,i){if(!this.modifiersAllowed)return void new e.Notice("Modifiers are only allowed on dice rolls.");i.length||i.push({operator:"=",comparer:this.faces.min});let n=0,r=[...this.results].filter((([,{value:t}])=>this.checkCondition(t,i)));for(;nthis.checkCondition(t,i))).length>0;)n++,r.map((([,t])=>{t.modifiers.add("r"),t.value=this.getRandomBetween(this.faces.min,this.faces.max)}));r.forEach((([t,e])=>{this.results.set(t,e)}))}explodeAndCombine(t,i){if(!this.modifiersAllowed)return void new e.Notice("Modifiers are only allowed on dice rolls.");i.length||i.push({operator:"=",comparer:this.faces.max});let n=0;[...this.results].filter((([,{value:t}])=>this.checkCondition(t,i))).forEach((([e,r])=>{let s=this.getRandomBetween(this.faces.min,this.faces.max);for(n++,r.modifiers.add("!"),r.value+=s,r.display=`${r.value}`,this.results.set(e,r);nthis.multiplier*this.getRandomBetween(this.faces.min,this.faces.max)))}roll(){var t;const e=this._roll();this.results=new Map([...e].map(((t,e)=>[e,{usable:!0,value:t,display:`${t}`,modifiers:new Set}])));for(let[t,e]of this.modifiers)this.applyModifier(t,e);return(null===(t=this.conditions)||void 0===t?void 0:t.length)&&this.applyConditions(),e}applyConditions(){for(let[t,e]of this.results){const t=this.conditions.find((({operator:t})=>"-="===t||"=-"===t));t&&e.value===t.comparer?(e.value=-1,e.modifiers.add("-")):this.checkCondition(e.value,this.conditions)?(e.modifiers.add("*"),e.value=1):e.usable=!1}}applyModifier(t,e){switch(t){case"kh":this.keepHigh(e.data);break;case"kl":this.keepLow(e.data);break;case"!":this.explode(e.data,e.conditionals);break;case"!!":this.explodeAndCombine(e.data,e.conditionals);break;case"r":this.reroll(e.data,e.conditionals)}}checkCondition(t,e){return e&&e.length?e.some((({operator:e,comparer:i})=>{if(Number.isNaN(t)||Number.isNaN(i))return!1;let n=!1;switch(e){case"=":n=t===i;break;case"!=":case"=!":n=t!==i;break;case"<":n=t":n=t>i;break;case">=":n=t>=i}return n})):t}getRandomBetween(t,e){return Math.floor(Math.random()*(e-t+1))+t}}class Wt extends Gt{constructor(t,e){super("3d6",e),this.lexeme=e,this.dice=t}get doubles(){return new Set([...this.results].map((([,{usable:t,value:e}])=>t?e:0))).size<3}get result(){return this.static?Number(this.dice):[...this.results].map((([,{usable:t,value:e}])=>t?e:0)).reduce(((t,e)=>t+e),0)}get display(){let t=[];for(let e of this.results)0==e[0]&&this.doubles?t.push(`${e[1].value}S`):t.push(`${e[1].value}`);return`[${t.join(", ")}]`}}class jt extends Ut{constructor(t,e,i){super(t,e,i),this.plugin=t,this.original=e,this.lexemes=i,this.stunted="",this.operators={"+":(t,e)=>t+e,"-":(t,e)=>t-e,"*":(t,e)=>t*e,"/":(t,e)=>t/e,"^":(t,e)=>Math.pow(t,e)},this.stack=[],this.dice=[],this.loaded=!0,this.trigger("loaded")}get resultText(){let t=this.original;return this.dice.forEach((e=>{t=t.replace(e.lexeme.original,e.display)})),t}get tooltip(){return this._tooltip?this._tooltip:`${this.original}\n${this.resultText}`}build(){return t(this,void 0,void 0,(function*(){const t=[this.result.toLocaleString(navigator.language,{maximumFractionDigits:2})];this.plugin.data.displayResultsInline&&t.unshift(this.inlineText),this.resultEl.setText(t.join("")+this.stunted)}))}roll(){return t(this,void 0,void 0,(function*(){let t=0;this.stunted="";for(const e of this.lexemes)switch(e.type){case"+":case"-":case"*":case"/":case"^":case"math":let i=this.stack.pop(),n=this.stack.pop();if(!n){"-"===e.data&&(i=new Gt(`-${i.dice}`,i.lexeme)),this.stack.push(i);continue}i.roll(),i instanceof Wt&&i.doubles&&(this.stunted=` - ${i.results.get(0).value} Stunt Points`),n.roll(),n instanceof Wt&&n.doubles&&(this.stunted=` - ${n.results.get(0).value} Stunt Points`);const r=this.operators[e.data](n.result,i.result);this.stack.push(new Gt(`${r}`,e));break;case"kh":{let i=this.dice[t-1],n=e.data?Number(e.data):1;i.modifiers.set("kh",{data:n,conditionals:[]});break}case"dl":{let i=this.dice[t-1],n=e.data?Number(e.data):1;n=i.results.size-n,i.modifiers.set("kh",{data:n,conditionals:[]});break}case"kl":{let i=this.dice[t-1],n=e.data?Number(e.data):1;i.modifiers.set("kl",{data:n,conditionals:[]});break}case"dh":{let i=this.dice[t-1],n=e.data?Number(e.data):1;n=i.results.size-n,i.modifiers.set("kl",{data:n,conditionals:[]});break}case"!":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("!",{data:n,conditionals:e.conditionals});break}case"!!":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("!!",{data:n,conditionals:e.conditionals});break}case"r":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("r",{data:n,conditionals:e.conditionals});break}case"dice":this.dice[t]||(this.dice[t]=new Gt(e.data,e)),this.stack.push(this.dice[t]),t++;break;case"stunt":this.dice[t]||(this.dice[t]=new Wt(e.original,e)),this.stack.push(this.dice[t]),t++}const e=this.stack.pop();return e.roll(),e instanceof Wt&&e.doubles&&(this.stunted=` - ${e.results.get(0).value} Stunt Points`),this.result=e.result,this._tooltip=null,this.render(),this.trigger("new-result"),this.result}))}toResult(){return{type:"dice",result:this.result,tooltip:this.tooltip}}applyResult(e){return t(this,void 0,void 0,(function*(){"dice"===e.type&&(e.result&&(this.result=e.result),e.tooltip&&(this._tooltip=e.tooltip),yield this.render())}))}setResult(t){}}class qt extends Vt{constructor(i,n,r,s,a=!0){super(i,n,r,s),this.plugin=i,this.original=n,this.lexeme=r,this.inline=a,this.containerEl.addClasses(["has-embed","markdown-embed"]),this.resultEl.addClass("internal-embed"),this.resultEl.setAttrs({src:s}),this.copy=this.containerEl.createDiv({cls:"dice-content-copy dice-roller-button no-show",attr:{"aria-label":"Copy Contents"}}),this.copy.addEventListener("click",(i=>{i.stopPropagation(),navigator.clipboard.writeText(this.displayFromCache(...this.results).trim()).then((()=>t(this,void 0,void 0,(function*(){new e.Notice("Result copied to clipboard.")}))))})),(0,e.setIcon)(this.copy,Ot)}get tooltip(){return`${this.original}\n${this.path}`}build(){return t(this,void 0,void 0,(function*(){if(this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.inline&&this.resultEl.createSpan({text:this.inlineText}),this.results&&this.results.length){this.plugin.data.copyContentButton&&this.copy.removeClass("no-show");for(const i of this.results){this.resultEl.onclick=e=>t(this,void 0,void 0,(function*(){(e&&e.getModifierState("Control")||e.getModifierState("Meta"))&&e.stopPropagation()}));const n=this.resultEl.createDiv({cls:"markdown-embed"});if(!this.plugin.data.displayResultsInline){const t="type"in i?i.type:"List Item";n.setAttrs({"aria-label":`${this.file.basename}: ${t}`})}if(i){if(e.MarkdownRenderer.renderMarkdown(this.displayFromCache(i),n.createDiv(),this.source,null),this.plugin.data.copyContentButton&&this.results.length>1){let r=n.createDiv({cls:"dice-content-copy dice-roller-button",attr:{"aria-label":"Copy Contents"}});r.addEventListener("click",(n=>{n.stopPropagation(),navigator.clipboard.writeText(this.displayFromCache(i).trim()).then((()=>t(this,void 0,void 0,(function*(){new e.Notice("Result copied to clipboard.")}))))})),(0,e.setIcon)(r,Ot)}}else n.createDiv({cls:"dice-no-results",text:"No results."})}}else this.resultEl.createDiv({cls:"dice-no-results",text:"No results."})}))}load(){return t(this,void 0,void 0,(function*(){yield this.getOptions()}))}displayFromCache(...t){let e=[];for(let i of t)e.push(this.content.slice(i.position.start.offset,i.position.end.offset));return e.join("\n\n")}getPath(){var t;const{groups:e}=this.lexeme.data.match(It),{roll:i=1,link:n,types:r}=e;if(!n)throw new Error("Could not parse link.");this.rolls=null!==(t=i&&!isNaN(Number(i))&&Number(i))&&void 0!==t?t:1,this.path=n.replace(/(\[|\])/g,""),this.types=null==r?void 0:r.split(",")}getOptions(){return t(this,void 0,void 0,(function*(){if(this.cache=this.plugin.app.metadataCache.getFileCache(this.file),!this.cache||!this.cache.sections)throw new Error("Could not read file cache.");this.content=yield this.plugin.app.vault.cachedRead(this.file),this.options=this.cache.sections.filter((({type:t})=>this.types?this.types.includes(t):!["yaml","thematicBreak"].includes(t))),this.types&&this.types.includes("listItem")&&this.options.push(...this.cache.listItems),this.loaded=!0,this.trigger("loaded")}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{if(this.loaded){const e=[...this.options];this.results=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).filter((t=>t)),this.render(),this.trigger("new-result"),t(this.results[0])}else this.on("loaded",(()=>{const e=[...this.options];this.results=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).filter((t=>t)),this.render(),this.trigger("new-result"),t(this.results[0])}))}))}))}toResult(){return{type:"section",result:this.results}}applyResult(e){return t(this,void 0,void 0,(function*(){"section"===e.type&&(e.result&&(this.results=e.result),yield this.render())}))}}class Xt extends Ut{constructor(t,e,i,n){super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n,this.loaded=!1,this.containerEl.addClasses(["has-embed","markdown-embed"]);const{roll:r=1,tag:s,collapse:a,types:o}=i.data.match(Rt).groups;this.collapse="-"===a||"+"!==a&&!this.plugin.data.returnAllTags,this.tag=`#${s}`,this.rolls=Number(r),this.types=o,this.getFiles()}get typeText(){var t;return(null===(t=this.types)||void 0===t?void 0:t.length)?`|${this.types}`:""}getFiles(){return t(this,void 0,void 0,(function*(){const t=this.plugin.app.plugins.plugins.dataview.index.tags.invMap.get(this.tag);if(t&&t.delete(this.source),!t||!t.size)throw new Error("No files found with that tag. Is the tag correct?\n\n"+this.tag);const e=Array.from(t).map((t=>`${this.rolls}d[[${t}]]${this.typeText}`));this.results=e.map((t=>new qt(this.plugin,t,{data:t,original:t,conditionals:null,type:"section"},this.source,!1))),this.loaded=!0,this.trigger("loaded")}))}build(){var e;return t(this,void 0,void 0,(function*(){if(this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.resultEl.createSpan({text:this.inlineText}),this.collapse){this.chosen=null!==(e=this.random)&&void 0!==e?e:this.getRandomBetween(0,this.results.length-1);let t=this.results[this.chosen];this.random=null;const i=this.resultEl.createDiv();i.createEl("h5",{cls:"dice-file-name",text:t.file.basename}),i.appendChild(t.containerEl)}else for(let t of this.results){const e=this.resultEl.createDiv();e.createEl("h5",{cls:"dice-file-name",text:t.file.basename}),e.appendChild(t.containerEl)}}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise(((e,i)=>{this.loaded?(this.results.forEach((e=>t(this,void 0,void 0,(function*(){return yield e.roll()})))),this.render(),this.trigger("new-result"),e(this.result)):this.on("loaded",(()=>{this.results.forEach((e=>t(this,void 0,void 0,(function*(){return yield e.roll()})))),this.render(),this.trigger("new-result"),e(this.result)}))}))}))}get tooltip(){return this.original}toResult(){return{type:"tag",random:this.chosen,result:Object.fromEntries(this.results.map((t=>[t.path,t.toResult()])))}}applyResult(e){return t(this,void 0,void 0,(function*(){if("tag"===e.type){if(e.result)for(let t in e.result){const i=this.results.find((e=>e.path===t));i&&i.applyResult(e.result[t])}e.random&&(this.random=e.random),yield this.render()}}))}}class Yt extends Ut{constructor(t,e,i,n){var r;super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n;const{roll:s=1,tag:a}=i.data.match(Rt).groups;this.tag=`#${a}`,this.rolls=null!==(r=s&&!isNaN(Number(s))&&Number(s))&&void 0!==r?r:1,this.getFiles()}get tooltip(){return`${this.original}\n${this.result.basename}`}roll(){return t(this,void 0,void 0,(function*(){return this.result=this.links[this.getRandomBetween(0,this.links.length-1)],yield this.render(),this.trigger("new-result"),this.result}))}build(){return t(this,void 0,void 0,(function*(){this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.resultEl.createSpan({text:this.inlineText});const e=this.resultEl.createEl("a",{cls:"internal-link",text:this.result.basename});e.onclick=e=>t(this,void 0,void 0,(function*(){var t;e.stopPropagation(),this.plugin.app.workspace.openLinkText(this.result.path,null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path,!0)})),e.onmouseenter=i=>t(this,void 0,void 0,(function*(){var t;this.plugin.app.workspace.trigger("link-hover",this,e,this.result.path,null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path)}))}))}getFiles(){return t(this,void 0,void 0,(function*(){const t=this.plugin.app.plugins.plugins.dataview.index.tags.invMap.get(this.tag);if(t&&t.delete(this.source),!t||!t.size)throw new Error("No files found with that tag. Is the tag correct?\n\n"+this.tag);this.links=Array.from(t).map((t=>this.plugin.app.metadataCache.getFirstLinkpathDest(t,this.source)))}))}toResult(){return{type:"link",result:this.result.path}}applyResult(i){return t(this,void 0,void 0,(function*(){if("link"===i.type){if(i.result){const t=this.plugin.app.vault.getAbstractFileByPath(i.result);t&&t instanceof e.TFile&&(this.result=t)}yield this.render()}}))}}class Zt extends Vt{getPath(){var t;const{groups:e}=this.lexeme.data.match(Pt),{roll:i=1,link:n,block:r,header:s}=e;if(!n||!r)throw new Error("Could not parse link.");this.rolls=null!==(t=i&&!isNaN(Number(i))&&Number(i))&&void 0!==t?t:1,this.path=n.replace(/(\[|\])/g,""),this.block=r.replace(/(\^|#)/g,"").trim().toLowerCase(),this.header=s}get tooltip(){return`${this.original}\n${this.path} > ${this.block}${this.header?" | "+this.header:""}`}build(){return t(this,void 0,void 0,(function*(){this.resultEl.empty();const e=[this.result];this.plugin.data.displayResultsInline&&e.unshift(this.inlineText);const i=e.join("").split(/(\[\[(?:[\s\S]+?)\]\])/);for(let e of i)if(/\[\[(?:[\s\S]+?)\]\]/.test(e)){const[,i]=e.match(/\[\[([\s\S]+?)\]\]/),n=this.resultEl.createEl("a",{cls:"internal-link",text:i});n.onmouseover=()=>{var t;this.plugin.app.workspace.trigger("link-hover",this,n,i.replace("^","#^").split("|").shift(),null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path)},n.onclick=e=>t(this,void 0,void 0,(function*(){var t;e.stopPropagation(),yield this.plugin.app.workspace.openLinkText(i.replace("^","#^").split(/\|/).shift(),null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path,e.getModifierState("Control"))}))}else this.resultEl.createSpan({text:e})}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise((t=>{if(this.loaded){const e=[...this.options];this.result=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).join("||"),this.render(),this.trigger("new-result"),t(this.result)}else this.on("loaded",(()=>{const e=[...this.options];this.result=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).join("||"),this.render(),this.trigger("new-result"),t(this.result)}))}))}))}load(){return t(this,void 0,void 0,(function*(){yield this.getOptions()}))}getOptions(){var e,i;return t(this,void 0,void 0,(function*(){if(this.cache=this.plugin.app.metadataCache.getFileCache(this.file),!this.cache||!this.cache.blocks||!(this.block in this.cache.blocks))throw new Error(`Could not read file cache. Does the block reference exist?\n\n${this.path} > ${this.block}`);const t=null===(e=this.cache.sections)||void 0===e?void 0:e.find((t=>t.position==this.cache.blocks[this.block].position));if(this.position=this.cache.blocks[this.block].position,this.content=null===(i=yield this.plugin.app.vault.cachedRead(this.file))||void 0===i?void 0:i.slice(this.position.start.offset,this.position.end.offset),t&&"list"===t.type)this.options=this.content.split("\n");else{let t=function(t){const e=t.split("\n"),i=e.map((t=>{var e;return(null!==(e=t.trim().match(Jt))&&void 0!==e?e:[,t.trim()])[1]})),n=i[0].split(Qt),r=[],s=[];for(let t in n){let e=n[t];e.trim().length||(e=t),s.push([e.trim(),[]])}for(let t of e.slice(2)){const e=t.trim().split(Qt).map((t=>t.trim())).filter((t=>t.length));r.push(e.join(" | "));for(let t in e){const i=e[t].trim();i.length&&s[t]&&s[t][1].push(i)}}return{columns:Object.fromEntries(s),rows:r}}(this.content);if(this.header&&t.columns[this.header])this.options=t.columns[this.header];else{if(this.header)throw new Error(`Header ${this.header} was not found in table ${this.path} > ${this.block}.`);this.options=t.rows}}this.loaded=!0,this.trigger("loaded")}))}toResult(){return{type:"table",result:this.result}}applyResult(e){return t(this,void 0,void 0,(function*(){"table"===e.type&&(e.result&&(this.result=e.result),yield this.render())}))}}const Jt=/^\|?([\s\S]+?)\|?$/,Qt=/\|/;class $t extends e.PluginSettingTab{constructor(t,e){super(t,e),this.plugin=e,this.plugin=e}display(){return t(this,void 0,void 0,(function*(){let{containerEl:i}=this;i.empty(),i.addClass("dice-roller-settings"),i.createEl("h2",{text:"Dice Roller Settings"}),new e.Setting(i).setName("Roll All Files for Tags").setDesc("Return a result for each file when rolling tags.").addToggle((e=>{e.setValue(this.plugin.data.returnAllTags),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.returnAllTags=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Always Return Links for Tags").setDesc("Enables random link rolling with the link parameter. Override by specifying a section type.").addToggle((e=>{e.setValue(this.plugin.data.rollLinksForTags),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.rollLinksForTags=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Add Copy Button to Section Results").setDesc("Randomly rolled sections will have a copy-content button to easy add result to clipboard.").addToggle((e=>{e.setValue(this.plugin.data.copyContentButton),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.copyContentButton=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Display Formula With Results").setDesc("Both the formula and the results will both be displayed in preview mode.").addToggle((e=>{e.setValue(this.plugin.data.displayResultsInline),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.displayResultsInline=e,yield this.plugin.saveSettings()}))))}));const n=new e.Setting(i).setName("Globally Save Results").setDesc("Dice results will be saved by default. This can be overridden using ").addToggle((e=>{e.setValue(this.plugin.data.persistResults),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.persistResults=e,yield this.plugin.saveSettings()}))))}));new e.Setting(i).setName("Display graphics for Dice View Rolls").setDesc("Dice rolls from dice view will be displayed on screen.").addToggle((e=>{e.setValue(this.plugin.data.renderer),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.renderer=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Dice Base Color").setDesc("Rendered dice will be this color.").controlEl.createEl("input",{type:"color",value:this.plugin.data.diceColor},(e=>{e.value=this.plugin.data.diceColor,e.onchange=({target:e})=>t(this,void 0,void 0,(function*(){let t=e.value;this.plugin.data.diceColor=t,yield this.plugin.saveSettings(),this.plugin.app.workspace.trigger("dice-roller:update-colors")}))})),new e.Setting(i).setName("Dice Text Color").setDesc("Rendered dice will use this color for their numbers.").controlEl.createEl("input",{type:"color",value:this.plugin.data.textColor},(e=>{e.value=this.plugin.data.textColor,e.onchange=({target:e})=>t(this,void 0,void 0,(function*(){let t=e.value;t&&(this.plugin.data.textColor=t,yield this.plugin.saveSettings(),this.plugin.app.workspace.trigger("dice-roller:update-colors"))}))})),new e.Setting(i).setName("Default Face").setDesc("Use this as the number of faces when it is omitted.").addText((i=>{i.setValue(`${this.plugin.data.defaultFace}`),i.inputEl.onblur=()=>t(this,void 0,void 0,(function*(){isNaN(Number(i.inputEl.value))&&new e.Notice("The default face must be a number."),this.plugin.data.defaultFace=Number(i.inputEl.value),yield this.plugin.saveSettings()}))})),n.descEl.createEl("code",{text:"dice-: formula"}),n.descEl.createEl("p",{text:"Please note that the plugin will attempt to save the result but may not be able to."}),this.additionalContainer=i.createDiv("dice-roller-setting-additional-container"),this.buildFormulaSettings(),i.createDiv("coffee").createEl("a",{href:"https://www.buymeacoffee.com/valentine195"}).createEl("img",{attr:{src:"https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=☕&slug=valentine195&button_colour=e3e7ef&font_colour=262626&font_family=Inter&outline_colour=262626&coffee_colour=ff0000"}})}))}buildFormulaSettings(){this.additionalContainer.empty();const i=this.additionalContainer.createDiv();new e.Setting(i).setName("Add Formula").setDesc("Add a new formula shortcut.").addButton((e=>e.setTooltip("Add Formula").setButtonText("+").onClick((()=>t(this,void 0,void 0,(function*(){const t=yield this.buildFormulaForm(i);t&&(this.plugin.data.formulas[t.alias]=t.formula,this.buildFormulaSettings(),yield this.plugin.saveSettings())}))))));const n=this.additionalContainer.createDiv("additional"),r=this.plugin.data.formulas;for(const[s,a]of Object.entries(r)){const r=new e.Setting(n).setName(s);r.controlEl.createSpan({text:a}),r.addExtraButton((e=>e.setIcon("pencil").setTooltip("Edit").onClick((()=>t(this,void 0,void 0,(function*(){const t=yield this.buildFormulaForm(i,{alias:s,formula:a});t&&(delete this.plugin.data.formulas[s],this.plugin.data.formulas[t.alias]=t.formula,this.buildFormulaSettings(),yield this.plugin.saveSettings())})))))).addExtraButton((e=>e.setIcon("trash").setTooltip("Delete").onClick((()=>t(this,void 0,void 0,(function*(){delete this.plugin.data.formulas[s],yield this.plugin.saveSettings(),this.buildFormulaSettings()}))))))}Object.values(r).length||n.createSpan({text:"Create a formula to see it here!",cls:"no-formulas"})}buildFormulaForm(i,n={alias:null,formula:null}){return t(this,void 0,void 0,(function*(){return new Promise((r=>{const s=i.createDiv("add-new-formula"),a=s.createDiv("formula-data");new e.Setting(a).setName("Alias").addText((t=>{t.setValue(n.alias).onChange((t=>n.alias=t))})),new e.Setting(a).setName("Formula").addText((t=>{t.setValue(n.formula).onChange((t=>n.formula=t))}));const o=s.createDiv("formula-buttons");new e.Setting(o).addButton((e=>e.setCta().setButtonText("Save").onClick((()=>t(this,void 0,void 0,(function*(){s.detach(),r(n)})))))).addExtraButton((t=>t.setIcon("cross").setTooltip("Cancel").onClick((()=>{s.detach(),r(null)}))))}))}))}}const Kt=100,te=301,ee=302,ie=306,ne=1e3,re=1001,se=1002,ae=1003,oe=1006,le=1008,ce=1009,he=1012,ue=1014,de=1015,pe=1016,fe=1020,me=1022,ge=1023,ve=1026,ye=1027,xe=2300,we=2301,be=2302,_e=2400,Me=2401,Se=2402,Ee=3e3,Te=3001,Ae=3007,Le=3002,Ce=7680,Re=35044,Pe=35048,Ie="300 es";class Ne{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const i=this._listeners[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const i=e.slice(0);for(let e=0,n=i.length;e>8&255]+ze[t>>16&255]+ze[t>>24&255]+"-"+ze[255&e]+ze[e>>8&255]+"-"+ze[e>>16&15|64]+ze[e>>24&255]+"-"+ze[63&i|128]+ze[i>>8&255]+"-"+ze[i>>16&255]+ze[i>>24&255]+ze[255&n]+ze[n>>8&255]+ze[n>>16&255]+ze[n>>24&255]).toUpperCase()}function Oe(t,e,i){return Math.max(e,Math.min(i,t))}function ke(t,e,i){return(1-i)*t+i*e}function He(t){return 0==(t&t-1)&&0!==t}function Ue(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}class Ve{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}Ve.prototype.isVector2=!0;class Ge{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=n,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],h=i[7],u=i[2],d=i[5],p=i[8],f=n[0],m=n[3],g=n[6],v=n[1],y=n[4],x=n[7],w=n[2],b=n[5],_=n[8];return r[0]=s*f+a*v+o*w,r[3]=s*m+a*y+o*b,r[6]=s*g+a*x+o*_,r[1]=l*f+c*v+h*w,r[4]=l*m+c*y+h*b,r[7]=l*g+c*x+h*_,r[2]=u*f+d*v+p*w,r[5]=u*m+d*y+p*b,r[8]=u*g+d*x+p*_,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=h*f,t[1]=(n*l-c*i)*f,t[2]=(a*i-n*s)*f,t[3]=u*f,t[4]=(c*e-n*o)*f,t[5]=(n*r-a*e)*f,t[6]=d*f,t[7]=(i*o-l*e)*f,t[8]=(s*e-i*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+t,-n*l,n*o,-n*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const i=this.elements;return i[0]*=t,i[3]*=t,i[6]*=t,i[1]*=e,i[4]*=e,i[7]*=e,this}rotate(t){const e=Math.cos(t),i=Math.sin(t),n=this.elements,r=n[0],s=n[3],a=n[6],o=n[1],l=n[4],c=n[7];return n[0]=e*r+i*o,n[3]=e*s+i*l,n[6]=e*a+i*c,n[1]=-i*r+e*o,n[4]=-i*s+e*l,n[7]=-i*a+e*c,this}translate(t,e){const i=this.elements;return i[0]+=t*i[2],i[3]+=t*i[5],i[6]+=t*i[8],i[1]+=e*i[2],i[4]+=e*i[5],i[7]+=e*i[8],this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}let We;Ge.prototype.isMatrix3=!0;class je{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===We&&(We=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),We.width=t.width,We.height=t.height;const i=We.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=We}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}}let qe=0;class Xe extends Ne{constructor(t=Xe.DEFAULT_IMAGE,e=Xe.DEFAULT_MAPPING,i=1001,n=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:qe++}),this.uuid=Fe(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=i,this.wrapT=n,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new Ve(0,0),this.repeat=new Ve(1,1),this.center=new Ve(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Ge,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const n=this.image;if(void 0===n.uuid&&(n.uuid=Fe()),!e&&void 0===t.images[n.uuid]){let e;if(Array.isArray(n)){e=[];for(let t=0,i=n.length;t1)switch(this.wrapS){case ne:t.x=t.x-Math.floor(t.x);break;case re:t.x=t.x<0?0:1;break;case se:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case ne:t.y=t.y-Math.floor(t.y);break;case re:t.y=t.y<0?0:1;break;case se:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Ye(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?je.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Xe.DEFAULT_IMAGE=void 0,Xe.DEFAULT_MAPPING=300,Xe.prototype.isTexture=!0;class Ze{constructor(t=0,e=0,i=0,n=1){this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],f=o[2],m=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?o=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+f*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const i=t._x,n=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),h=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=i+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-n)*t}else if(i>a&&i>h){const t=2*Math.sqrt(1+i-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-i-h);this._w=(r-l)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-i-a);this._w=(s-n)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Oe(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*t._w+i*t._x+n*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=i*h+this._x*u,this._y=n*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){this.copy(t).slerp(e,i)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}$e.prototype.isQuaternion=!0;class Ke{constructor(t=0,e=0,i=0){this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(ei.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ei.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*n-a*i,c=o*i+a*e-r*n,h=o*n+r*i-s*e,u=-r*e-s*i-a*n;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return ti.copy(this).projectOnVector(t),this.sub(ti)}reflect(t){return this.sub(ti.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Oe(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}Ke.prototype.isVector3=!0;const ti=new Ke,ei=new $e;class ii{constructor(t=new Ke(1/0,1/0,1/0),e=new Ke(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,ri),ri.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(di),pi.subVectors(this.max,di),ai.subVectors(t.a,di),oi.subVectors(t.b,di),li.subVectors(t.c,di),ci.subVectors(oi,ai),hi.subVectors(li,oi),ui.subVectors(ai,li);let e=[0,-ci.z,ci.y,0,-hi.z,hi.y,0,-ui.z,ui.y,ci.z,0,-ci.x,hi.z,0,-hi.x,ui.z,0,-ui.x,-ci.y,ci.x,0,-hi.y,hi.x,0,-ui.y,ui.x,0];return!!gi(e,ai,oi,li,pi)&&(e=[1,0,0,0,1,0,0,0,1],!!gi(e,ai,oi,li,pi)&&(fi.crossVectors(ci,hi),e=[fi.x,fi.y,fi.z],gi(e,ai,oi,li,pi)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return ri.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.getCenter(t.center),t.radius=.5*this.getSize(ri).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(ni[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),ni[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),ni[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),ni[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),ni[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),ni[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),ni[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),ni[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(ni)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}ii.prototype.isBox3=!0;const ni=[new Ke,new Ke,new Ke,new Ke,new Ke,new Ke,new Ke,new Ke],ri=new Ke,si=new ii,ai=new Ke,oi=new Ke,li=new Ke,ci=new Ke,hi=new Ke,ui=new Ke,di=new Ke,pi=new Ke,fi=new Ke,mi=new Ke;function gi(t,e,i,n,r){for(let s=0,a=t.length-3;s<=a;s+=3){mi.fromArray(t,s);const a=r.x*Math.abs(mi.x)+r.y*Math.abs(mi.y)+r.z*Math.abs(mi.z),o=e.dot(mi),l=i.dot(mi),c=n.dot(mi);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const vi=new ii,yi=new Ke,xi=new Ke,wi=new Ke;class bi{constructor(t=new Ke,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):vi.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){wi.subVectors(t,this.center);const e=wi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.add(wi.multiplyScalar(i/t)),this.radius+=i}return this}union(t){return xi.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(yi.copy(t.center).add(xi)),this.expandByPoint(yi.copy(t.center).sub(xi)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const _i=new Ke,Mi=new Ke,Si=new Ke,Ei=new Ke,Ti=new Ke,Ai=new Ke,Li=new Ke;class Ci{constructor(t=new Ke,e=new Ke(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_i)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_i.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_i.copy(this.direction).multiplyScalar(e).add(this.origin),_i.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Mi.copy(t).add(e).multiplyScalar(.5),Si.copy(e).sub(t).normalize(),Ei.copy(this.origin).sub(Mi);const r=.5*t.distanceTo(e),s=-this.direction.dot(Si),a=Ei.dot(this.direction),o=-Ei.dot(Si),l=Ei.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return i&&i.copy(this.direction).multiplyScalar(h).add(this.origin),n&&n.copy(Si).multiplyScalar(u).add(Mi),d}intersectSphere(t,e){_i.subVectors(t.center,this.origin);const i=_i.dot(this.direction),n=_i.dot(_i)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(i=(t.min.x-u.x)*l,n=(t.max.x-u.x)*l):(i=(t.max.x-u.x)*l,n=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,_i)}intersectTriangle(t,e,i,n,r){Ti.subVectors(e,t),Ai.subVectors(i,t),Li.crossVectors(Ti,Ai);let s,a=this.direction.dot(Li);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Ei.subVectors(this.origin,t);const o=s*this.direction.dot(Ai.crossVectors(Ei,Ai));if(o<0)return null;const l=s*this.direction.dot(Ti.cross(Ei));if(l<0)return null;if(o+l>a)return null;const c=-s*Ei.dot(Li);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Ri{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,a,o,l,c,h,u,d,p,f,m){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=f,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Ri).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Pi.setFromMatrixColumn(t,0).length(),r=1/Pi.setFromMatrixColumn(t,1).length(),s=1/Pi.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=i+n*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=n+i*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t+r*a,e[4]=n*a-i,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=i*a-n,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=n+i*a,e[1]=i+n*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=n*l-i,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=i*l-n,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=n*h+i,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=i*h+n,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=i*h-n,e[2]=n*h-i,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ni,t,zi)}lookAt(t,e,i){const n=this.elements;return Fi.subVectors(t,e),0===Fi.lengthSq()&&(Fi.z=1),Fi.normalize(),Di.crossVectors(i,Fi),0===Di.lengthSq()&&(1===Math.abs(i.z)?Fi.x+=1e-4:Fi.z+=1e-4,Fi.normalize(),Di.crossVectors(i,Fi)),Di.normalize(),Bi.crossVectors(Fi,Di),n[0]=Di.x,n[4]=Bi.x,n[8]=Fi.x,n[1]=Di.y,n[5]=Bi.y,n[9]=Fi.y,n[2]=Di.z,n[6]=Bi.z,n[10]=Fi.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],h=i[5],u=i[9],d=i[13],p=i[2],f=i[6],m=i[10],g=i[14],v=i[3],y=i[7],x=i[11],w=i[15],b=n[0],_=n[4],M=n[8],S=n[12],E=n[1],T=n[5],A=n[9],L=n[13],C=n[2],R=n[6],P=n[10],I=n[14],N=n[3],z=n[7],D=n[11],B=n[15];return r[0]=s*b+a*E+o*C+l*N,r[4]=s*_+a*T+o*R+l*z,r[8]=s*M+a*A+o*P+l*D,r[12]=s*S+a*L+o*I+l*B,r[1]=c*b+h*E+u*C+d*N,r[5]=c*_+h*T+u*R+d*z,r[9]=c*M+h*A+u*P+d*D,r[13]=c*S+h*L+u*I+d*B,r[2]=p*b+f*E+m*C+g*N,r[6]=p*_+f*T+m*R+g*z,r[10]=p*M+f*A+m*P+g*D,r[14]=p*S+f*L+m*I+g*B,r[3]=v*b+y*E+x*C+w*N,r[7]=v*_+y*T+x*R+w*z,r[11]=v*M+y*A+x*P+w*D,r[15]=v*S+y*L+x*I+w*B,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-n*l*h-r*a*u+i*l*u+n*a*d-i*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-n*s*d+n*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+i*s*d+r*a*c-i*l*c)+t[15]*(-n*a*c-e*o*h+e*a*u+n*s*h-i*s*u+i*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],f=t[13],m=t[14],g=t[15],v=h*m*l-f*u*l+f*o*d-a*m*d-h*o*g+a*u*g,y=p*u*l-c*m*l-p*o*d+s*m*d+c*o*g-s*u*g,x=c*f*l-p*h*l+p*a*d-s*f*d-c*a*g+s*h*g,w=p*h*o-c*f*o-p*a*u+s*f*u+c*a*m-s*h*m,b=e*v+i*y+n*x+r*w;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const _=1/b;return t[0]=v*_,t[1]=(f*u*r-h*m*r-f*n*d+i*m*d+h*n*g-i*u*g)*_,t[2]=(a*m*r-f*o*r+f*n*l-i*m*l-a*n*g+i*o*g)*_,t[3]=(h*o*r-a*u*r-h*n*l+i*u*l+a*n*d-i*o*d)*_,t[4]=y*_,t[5]=(c*m*r-p*u*r+p*n*d-e*m*d-c*n*g+e*u*g)*_,t[6]=(p*o*r-s*m*r-p*n*l+e*m*l+s*n*g-e*o*g)*_,t[7]=(s*u*r-c*o*r+c*n*l-e*u*l-s*n*d+e*o*d)*_,t[8]=x*_,t[9]=(p*h*r-c*f*r-p*i*d+e*f*d+c*i*g-e*h*g)*_,t[10]=(s*f*r-p*a*r+p*i*l-e*f*l-s*i*g+e*a*g)*_,t[11]=(c*a*r-s*h*r-c*i*l+e*h*l+s*i*d-e*a*d)*_,t[12]=w*_,t[13]=(c*f*n-p*h*n+p*i*u-e*f*u-c*i*m+e*h*m)*_,t[14]=(p*a*n-s*f*n-p*i*o+e*f*o+s*i*m-e*a*m)*_,t[15]=(s*h*n-c*a*n+c*i*o-e*h*o-s*i*u+e*a*u)*_,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,n,r,s){return this.set(1,i,r,0,t,1,s,0,e,n,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,f=s*c,m=s*h,g=a*h,v=o*l,y=o*c,x=o*h,w=i.x,b=i.y,_=i.z;return n[0]=(1-(f+g))*w,n[1]=(d+x)*w,n[2]=(p-y)*w,n[3]=0,n[4]=(d-x)*b,n[5]=(1-(u+g))*b,n[6]=(m+v)*b,n[7]=0,n[8]=(p+y)*_,n[9]=(m-v)*_,n[10]=(1-(u+f))*_,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Pi.set(n[0],n[1],n[2]).length();const s=Pi.set(n[4],n[5],n[6]).length(),a=Pi.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Ii.copy(this);const o=1/r,l=1/s,c=1/a;return Ii.elements[0]*=o,Ii.elements[1]*=o,Ii.elements[2]*=o,Ii.elements[4]*=l,Ii.elements[5]*=l,Ii.elements[6]*=l,Ii.elements[8]*=c,Ii.elements[9]*=c,Ii.elements[10]*=c,e.setFromRotationMatrix(Ii),i.x=r,i.y=s,i.z=a,this}makePerspective(t,e,i,n,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(i-n),c=(e+t)/(e-t),h=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,n,r,s){const a=this.elements,o=1/(e-t),l=1/(i-n),c=1/(s-r),h=(e+t)*o,u=(i+n)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}Ri.prototype.isMatrix4=!0;const Pi=new Ke,Ii=new Ri,Ni=new Ke(0,0,0),zi=new Ke(1,1,1),Di=new Ke,Bi=new Ke,Fi=new Ke,Oi=new Ri,ki=new $e;class Hi{constructor(t=0,e=0,i=0,n=Hi.DefaultOrder){this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n=this._order){return this._x=t,this._y=e,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const n=t.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],h=n[2],u=n[6],d=n[10];switch(e){case"XYZ":this._y=Math.asin(Oe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-Oe(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(Oe(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Oe(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(Oe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Oe(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Oi.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Oi,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ki.setFromEuler(this),this.setFromQuaternion(ki,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new Ke(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}Hi.prototype.isEuler=!0,Hi.DefaultOrder="XYZ",Hi.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class Ui{constructor(){this.mask=1}set(t){this.mask=1<1){for(let t=0;t1){for(let t=0;t0){n.children=[];for(let e=0;e0){n.animations=[];for(let e=0;e0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){nn.subVectors(n,e),rn.subVectors(i,e),sn.subVectors(t,e);const s=nn.dot(nn),a=nn.dot(rn),o=nn.dot(sn),l=rn.dot(rn),c=rn.dot(sn),h=s*l-a*a;if(0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,an),an.x>=0&&an.y>=0&&an.x+an.y<=1}static getUV(t,e,i,n,r,s,a,o){return this.getBarycoord(t,e,i,n,an),o.set(0,0),o.addScaledVector(r,an.x),o.addScaledVector(s,an.y),o.addScaledVector(a,an.z),o}static isFrontFacing(t,e,i,n){return nn.subVectors(i,e),rn.subVectors(t,e),nn.cross(rn).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return nn.subVectors(this.c,this.b),rn.subVectors(this.a,this.b),.5*nn.cross(rn).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return pn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return pn.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return pn.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return pn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return pn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,n=this.b,r=this.c;let s,a;on.subVectors(n,i),ln.subVectors(r,i),hn.subVectors(t,i);const o=on.dot(hn),l=ln.dot(hn);if(o<=0&&l<=0)return e.copy(i);un.subVectors(t,n);const c=on.dot(un),h=ln.dot(un);if(c>=0&&h<=c)return e.copy(n);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(i).addScaledVector(on,s);dn.subVectors(t,r);const d=on.dot(dn),p=ln.dot(dn);if(p>=0&&d<=p)return e.copy(r);const f=d*l-o*p;if(f<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(i).addScaledVector(ln,a);const m=c*p-d*h;if(m<=0&&h-c>=0&&d-p>=0)return cn.subVectors(r,n),a=(h-c)/(h-c+(d-p)),e.copy(n).addScaledVector(cn,a);const g=1/(m+f+u);return s=f*g,a=u*g,e.copy(i).addScaledVector(on,s).addScaledVector(ln,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let fn=0;class mn extends Ne{constructor(){super(),Object.defineProperty(this,"id",{value:fn++}),this.uuid=Fe(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.format=ge,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=Kt,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Ce,this.stencilZFail=Ce,this.stencilZPass=Ce,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),this.sheenTint&&this.sheenTint.isColor&&(i.sheenTint=this.sheenTint.getHex()),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularTint&&this.specularTint.isColor&&(i.specularTint=this.specularTint.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularTintMap&&this.specularTintMap.isTexture&&(i.specularTintMap=this.specularTintMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationTint&&(i.attenuationTint=this.attenuationTint.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),this.format!==ge&&(i.format=this.format),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.format=t.format,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}mn.prototype.isMaterial=!0;const gn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},vn={h:0,s:0,l:0},yn={h:0,s:0,l:0};function xn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}function wn(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function bn(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class _n{constructor(t,e,i){return void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,i){return this.r=t,this.g=e,this.b=i,this}setHSL(t,e,i){if(t=(t%(n=1)+n)%n,e=Oe(e,0,1),i=Oe(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=xn(r,n,t+1/3),this.g=xn(r,n,t),this.b=xn(r,n,t-1/3)}var n;return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const i=parseFloat(t[1])/360,n=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(i,n,r)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=i[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=gn[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const i=e>0?1/e:1;return this.r=Math.pow(t.r,i),this.g=Math.pow(t.g,i),this.b=Math.pow(t.b,i),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=bn(t.r),this.g=bn(t.g),this.b=bn(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){const e=this.r,i=this.g,n=this.b,r=Math.max(e,i,n),s=Math.min(e,i,n);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(i-n)/t+(ie&&(e=t[i]);return e}Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;let Pn=0;const In=new Ri,Nn=new en,zn=new Ke,Dn=new ii,Bn=new ii,Fn=new Ke;class On extends Ne{constructor(){super(),Object.defineProperty(this,"id",{value:Pn++}),this.uuid=Fe(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(Rn(t)>65535?Ln:An)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,i=0){this.groups.push({start:t,count:e,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const e=(new Ge).getNormalMatrix(t);i.applyNormalMatrix(e),i.needsUpdate=!0}const n=this.attributes.tangent;return void 0!==n&&(n.transformDirection(t),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return In.makeRotationFromQuaternion(t),this.applyMatrix4(In),this}rotateX(t){return In.makeRotationX(t),this.applyMatrix4(In),this}rotateY(t){return In.makeRotationY(t),this.applyMatrix4(In),this}rotateZ(t){return In.makeRotationZ(t),this.applyMatrix4(In),this}translate(t,e,i){return In.makeTranslation(t,e,i),this.applyMatrix4(In),this}scale(t,e,i){return In.makeScale(t,e,i),this.applyMatrix4(In),this}lookAt(t){return Nn.lookAt(t),Nn.updateMatrix(),this.applyMatrix4(Nn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(zn).negate(),this.translate(zn.x,zn.y,zn.z),this}setFromPoints(t){const e=[];for(let i=0,n=t.length;i0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e];t.data.attributes[e]=n.toJSON(t.data)}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new On).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const i=this.geometry,n=this.material,r=this.matrixWorld;if(void 0===n)return;if(null===i.boundingSphere&&i.computeBoundingSphere(),Un.copy(i.boundingSphere),Un.applyMatrix4(r),!1===t.ray.intersectsSphere(Un))return;if(kn.copy(r).invert(),Hn.copy(t.ray).applyMatrix4(kn),null!==i.boundingBox&&!1===Hn.intersectsBox(i.boundingBox))return;let s;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position,o=i.morphAttributes.position,l=i.morphTargetsRelative,c=i.attributes.uv,h=i.attributes.uv2,u=i.groups,d=i.drawRange;if(null!==r)if(Array.isArray(n))for(let i=0,p=u.length;ii.far?null:{distance:c,point:er.clone(),object:t}}(t,e,i,n,Vn,Gn,Wn,tr);if(p){o&&(Qn.fromBufferAttribute(o,c),$n.fromBufferAttribute(o,h),Kn.fromBufferAttribute(o,u),p.uv=pn.getUV(tr,Vn,Gn,Wn,Qn,$n,Kn,new Ve)),l&&(Qn.fromBufferAttribute(l,c),$n.fromBufferAttribute(l,h),Kn.fromBufferAttribute(l,u),p.uv2=pn.getUV(tr,Vn,Gn,Wn,Qn,$n,Kn,new Ve));const t={a:c,b:h,c:u,normal:new Ke,materialIndex:0};pn.getNormal(Vn,Gn,Wn,t.normal),p.face=t}return p}ir.prototype.isMesh=!0;class rr extends On{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,i,n,r,s,p,f,m,g,v){const y=s/m,x=p/g,w=s/2,b=p/2,_=f/2,M=m+1,S=g+1;let E=0,T=0;const A=new Ke;for(let s=0;s0?1:-1,c.push(A.x,A.y,A.z),h.push(o/m),h.push(1-s/g),E+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}lr.prototype.isShaderMaterial=!0;class cr extends en{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Ri,this.projectionMatrix=new Ri,this.projectionMatrixInverse=new Ri}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}cr.prototype.isCamera=!0;class hr extends cr{constructor(t=50,e=1,i=.1,n=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Be*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*De*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Be*Math.atan(Math.tan(.5*De*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*De*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/a,n*=s.width/t,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}hr.prototype.isPerspectiveCamera=!0;const ur=90;class dr extends en{constructor(t,e,i){if(super(),this.type="CubeCamera",!0!==i.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=i;const n=new hr(ur,1,t,e);n.layers=this.layers,n.up.set(0,-1,0),n.lookAt(new Ke(1,0,0)),this.add(n);const r=new hr(ur,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Ke(-1,0,0)),this.add(r);const s=new hr(ur,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Ke(0,1,0)),this.add(s);const a=new hr(ur,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Ke(0,-1,0)),this.add(a);const o=new hr(ur,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Ke(0,0,1)),this.add(o);const l=new hr(ur,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Ke(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,l]=this.children,c=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;const u=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,a),t.setRenderTarget(i,4),t.render(e,o),i.texture.generateMipmaps=u,t.setRenderTarget(i,5),t.render(e,l),t.setRenderTarget(h),t.xr.enabled=c}}class pr extends Xe{constructor(t,e,i,n,r,s,a,o,l,c){super(t=void 0!==t?t:[],e=void 0!==e?e:te,i,n,r,s,a=void 0!==a?a:me,o,l,c),this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}pr.prototype.isCubeTexture=!0;class fr extends Je{constructor(t,e,i){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=i),super(t,t,e),e=e||{},this.texture=new pr(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:oe,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=ge,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={tEquirect:{value:null}},n="\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",r="\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t",s=new rr(5,5,5),a=new lr({name:"CubemapFromEquirect",uniforms:sr(i),vertexShader:n,fragmentShader:r,side:1,blending:0});a.uniforms.tEquirect.value=e;const o=new ir(s,a),l=e.minFilter;return e.minFilter===le&&(e.minFilter=oe),new dr(1,10,this).update(t,o),e.minFilter=l,o.geometry.dispose(),o.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}fr.prototype.isWebGLCubeRenderTarget=!0;const mr=new Ke,gr=new Ke,vr=new Ge;class yr{constructor(t=new Ke(1,0,0),e=0){this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=mr.subVectors(i,e).cross(gr.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const i=t.delta(mr),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:e.copy(i).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||vr.getNormalMatrix(t),n=this.coplanarPoint(mr).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}yr.prototype.isPlane=!0;const xr=new bi,wr=new Ke;class br{constructor(t=new yr,e=new yr,i=new yr,n=new yr,r=new yr,s=new yr){this.planes=[t,e,i,n,r,s]}set(t,e,i,n,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7],u=i[8],d=i[9],p=i[10],f=i[11],m=i[12],g=i[13],v=i[14],y=i[15];return e[0].setComponents(a-n,h-o,f-u,y-m).normalize(),e[1].setComponents(a+n,h+o,f+u,y+m).normalize(),e[2].setComponents(a+r,h+l,f+d,y+g).normalize(),e[3].setComponents(a-r,h-l,f-d,y-g).normalize(),e[4].setComponents(a-s,h-c,f-p,y-v).normalize(),e[5].setComponents(a+s,h+c,f+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),xr.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(xr)}intersectsSprite(t){return xr.center.set(0,0,0),xr.radius=.7071067811865476,xr.applyMatrix4(t.matrixWorld),this.intersectsSphere(xr)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++)if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,wr.y=n.normal.y>0?t.max.y:t.min.y,wr.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(wr)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function _r(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function Mr(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotVH = saturate( dot( geometry.viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float NoH ) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float NoV, float NoL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( NoL + NoV - NoL * NoV ) ) );\n}\nvec3 BRDF_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in GeometricContext geometry ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularTintFactor = specularTint;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARTINTMAP\n\t\t\tspecularTintFactor *= specularTintMapTexelToLinear( texture2D( specularTintMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularTintFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularTintFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenTint = sheenTint;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenTint;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += irradiance * BRDF_Sheen( material.roughness, directLight.direction, geometry, material.sheenTint );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationTint, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = transmission.a;\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationTint;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularTint;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARTINTMAP\n\t\tuniform sampler2D specularTintMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenTint;\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - clearcoat * Fcc ) + clearcoatSpecular * clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},Tr={common:{diffuse:{value:new _n(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Ge},uv2Transform:{value:new Ge},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Ve(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new _n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new _n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Ge}},sprite:{diffuse:{value:new _n(16777215)},opacity:{value:1},center:{value:new Ve(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Ge}}},Ar={basic:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.fog]),vertexShader:Er.meshbasic_vert,fragmentShader:Er.meshbasic_frag},lambert:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)}}]),vertexShader:Er.meshlambert_vert,fragmentShader:Er.meshlambert_frag},phong:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)},specular:{value:new _n(1118481)},shininess:{value:30}}]),vertexShader:Er.meshphong_vert,fragmentShader:Er.meshphong_frag},standard:{uniforms:ar([Tr.common,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.roughnessmap,Tr.metalnessmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Er.meshphysical_vert,fragmentShader:Er.meshphysical_frag},toon:{uniforms:ar([Tr.common,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.gradientmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)}}]),vertexShader:Er.meshtoon_vert,fragmentShader:Er.meshtoon_frag},matcap:{uniforms:ar([Tr.common,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.fog,{matcap:{value:null}}]),vertexShader:Er.meshmatcap_vert,fragmentShader:Er.meshmatcap_frag},points:{uniforms:ar([Tr.points,Tr.fog]),vertexShader:Er.points_vert,fragmentShader:Er.points_frag},dashed:{uniforms:ar([Tr.common,Tr.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Er.linedashed_vert,fragmentShader:Er.linedashed_frag},depth:{uniforms:ar([Tr.common,Tr.displacementmap]),vertexShader:Er.depth_vert,fragmentShader:Er.depth_frag},normal:{uniforms:ar([Tr.common,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,{opacity:{value:1}}]),vertexShader:Er.meshnormal_vert,fragmentShader:Er.meshnormal_frag},sprite:{uniforms:ar([Tr.sprite,Tr.fog]),vertexShader:Er.sprite_vert,fragmentShader:Er.sprite_frag},background:{uniforms:{uvTransform:{value:new Ge},t2D:{value:null}},vertexShader:Er.background_vert,fragmentShader:Er.background_frag},cube:{uniforms:ar([Tr.envmap,{opacity:{value:1}}]),vertexShader:Er.cube_vert,fragmentShader:Er.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Er.equirect_vert,fragmentShader:Er.equirect_frag},distanceRGBA:{uniforms:ar([Tr.common,Tr.displacementmap,{referencePosition:{value:new Ke},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Er.distanceRGBA_vert,fragmentShader:Er.distanceRGBA_frag},shadow:{uniforms:ar([Tr.lights,Tr.fog,{color:{value:new _n(0)},opacity:{value:1}}]),vertexShader:Er.shadow_vert,fragmentShader:Er.shadow_frag}};function Lr(t,e,i,n,r){const s=new _n(0);let a,o,l=0,c=null,h=0,u=null;function d(t,e){i.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),l=e,d(s,l)},getClearAlpha:function(){return l},setClearAlpha:function(t){l=t,d(s,l)},render:function(i,r){let p=!1,f=!0===r.isScene?r.background:null;f&&f.isTexture&&(f=e.get(f));const m=t.xr,g=m.getSession&&m.getSession();g&&"additive"===g.environmentBlendMode&&(f=null),null===f?d(s,l):f&&f.isColor&&(d(f,1),p=!0),(t.autoClear||p)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.mapping===ie)?(void 0===o&&(o=new ir(new rr(1,1,1),new lr({name:"BackgroundCubeMaterial",uniforms:sr(Ar.cube.uniforms),vertexShader:Ar.cube.vertexShader,fragmentShader:Ar.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(o)),o.material.uniforms.envMap.value=f,o.material.uniforms.flipEnvMap.value=f.isCubeTexture&&!1===f.isRenderTargetTexture?-1:1,c===f&&h===f.version&&u===t.toneMapping||(o.material.needsUpdate=!0,c=f,h=f.version,u=t.toneMapping),i.unshift(o,o.geometry,o.material,0,0,null)):f&&f.isTexture&&(void 0===a&&(a=new ir(new Sr(2,2),new lr({name:"BackgroundMaterial",uniforms:sr(Ar.background.uniforms),vertexShader:Ar.background.vertexShader,fragmentShader:Ar.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(a)),a.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),a.material.uniforms.uvTransform.value.copy(f.matrix),c===f&&h===f.version&&u===t.toneMapping||(a.material.needsUpdate=!0,c=f,h=f.version,u=t.toneMapping),i.unshift(a,a.geometry,a.material,0,0,null))}}}function Cr(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=d(null);let c=l;function h(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],i=[],n=[];for(let t=0;t=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=i.get(s);if(void 0===l)continue;const c=l.buffer,h=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,l=i.stride,d=s.offset;if(i&&i.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),f=t.getParameter(34921),m=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),y=u>0,x=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===e.has("EXT_texture_filter_anisotropic")){const i=e.get("EXT_texture_filter_anisotropic");n=t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:f,maxVertexUniforms:m,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:y&&x,maxSamples:s?t.getParameter(36183):0}}function Ir(t){const e=this;let i=null,n=0,r=!1,s=!1;const a=new yr,o=new Ge,l={value:null,needsUpdate:!1};function c(){l.value!==i&&(l.value=i,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(t,i,n,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0){const a=t.getRenderTarget(),o=new fr(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",n),i(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}Ar.physical={uniforms:ar([Ar.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new Ve(1,1)},clearcoatNormalMap:{value:null},sheenTint:{value:new _n(0)},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new Ve},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationTint:{value:new _n(0)},specularIntensity:{value:0},specularIntensityMap:{value:null},specularTint:{value:new _n(1,1,1)},specularTintMap:{value:null}}]),vertexShader:Er.meshphysical_vert,fragmentShader:Er.meshphysical_frag};class zr extends cr{constructor(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,a=n+e,o=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}zr.prototype.isOrthographicCamera=!0;class Dr extends lr{constructor(t){super(t),this.type="RawShaderMaterial"}}Dr.prototype.isRawShaderMaterial=!0;const Br=Math.pow(2,8),Fr=[.125,.215,.35,.446,.526,.582],Or=5+Fr.length,kr={[Ee]:0,[Te]:1,[Le]:2,3004:3,3005:4,3006:5,[Ae]:6},Hr=new zr,{_lodPlanes:Ur,_sizeLods:Vr,_sigmas:Gr}=Qr(),Wr=new _n;let jr=null;const qr=(1+Math.sqrt(5))/2,Xr=1/qr,Yr=[new Ke(1,1,1),new Ke(-1,1,1),new Ke(1,1,-1),new Ke(-1,1,-1),new Ke(0,qr,Xr),new Ke(0,qr,-Xr),new Ke(Xr,0,qr),new Ke(-Xr,0,qr),new Ke(qr,Xr,0),new Ke(-qr,Xr,0)];class Zr{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=function(t){const e=new Float32Array(20),i=new Ke(0,1,0);return new Dr({name:"SphericalGaussianBlur",defines:{n:20},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:e},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}(),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,i=.1,n=100){jr=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,i,n,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t){return this._fromTexture(t)}fromCubemap(t){return this._fromTexture(t)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=es(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=ts(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t2?Br:0,Br,Br),o.setRenderTarget(n),p&&o.render(d,r),o.render(t,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=h,o.outputEncoding=c,o.autoClear=l,t.background=f}_textureToCubeUV(t,e){const i=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=es()):null==this._equirectShader&&(this._equirectShader=ts());const n=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new ir(Ur[0],n),s=n.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=kr[t.encoding],s.outputEncoding.value=kr[e.texture.encoding],Kr(e,0,0,3*Br,2*Br),i.setRenderTarget(e),i.render(r,Hr)}_applyPMREM(t){const e=this._renderer,i=e.autoClear;e.autoClear=!1;for(let e=1;e20&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const m=[];let g=0;for(let t=0;t<20;++t){const e=t/p,i=Math.exp(-e*e/2);m.push(i),0==t?g+=i:t4?n-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Hr)}}function Jr(t){return void 0!==t&&t.type===ce&&(t.encoding===Ee||t.encoding===Te||t.encoding===Ae)}function Qr(){const t=[],e=[],i=[];let n=8;for(let r=0;r4?a=Fr[r-8+4-1]:0==r&&(a=0),i.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,f=2,m=1,g=new Float32Array(p*d*u),v=new Float32Array(f*d*u),y=new Float32Array(m*d*u);for(let t=0;t2?0:-1,n=[e,i,0,e+2/3,i,0,e+2/3,i+1,0,e,i,0,e+2/3,i+1,0,e,i+1,0];g.set(n,p*d*t),v.set(h,f*d*t);const r=[t,t,t,t,t,t];y.set(r,m*d*t)}const x=new On;x.setAttribute("position",new Tn(g,p)),x.setAttribute("uv",new Tn(v,f)),x.setAttribute("faceIndex",new Tn(y,m)),t.push(x),n>4&&n--}return{_lodPlanes:t,_sizeLods:e,_sigmas:i}}function $r(t){const e=new Je(3*Br,3*Br,t);return e.texture.mapping=ie,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Kr(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function ts(){const t=new Ve(1,1);return new Dr({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function es(){return new Dr({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function is(t){let e=new WeakMap,i=null;function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping,a=303===s||304===s,o=s===te||s===ee;if(a||o){if(e.has(r))return e.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(t){let e=0;for(let i=0;i<6;i++)void 0!==t[i]&&e++;return 6===e}(s)){const s=t.getRenderTarget();null===i&&(i=new Zr(t));const o=a?i.fromEquirectangular(r):i.fromCubemap(r);return e.set(r,o),t.setRenderTarget(s),r.addEventListener("dispose",n),o.texture}return null}}}return r},dispose:function(){e=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function ns(t){const e={};function i(i){if(void 0!==e[i])return e[i];let n;switch(i){case"WEBGL_depth_texture":n=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=t.getExtension(i)}return e[i]=n,n}return{has:function(t){return null!==i(t)},init:function(t){t.isWebGL2?i("EXT_color_buffer_float"):(i("WEBGL_depth_texture"),i("OES_texture_float"),i("OES_texture_half_float"),i("OES_texture_half_float_linear"),i("OES_standard_derivatives"),i("OES_element_index_uint"),i("OES_vertex_array_object"),i("ANGLE_instanced_arrays")),i("OES_texture_float_linear"),i("EXT_color_buffer_half_float")},get:function(t){const e=i(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function rs(t,e,i,n){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),n.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,i.memory.geometries--}function o(t){const i=[],n=t.index,r=t.attributes.position;let a=0;if(null!==n){const t=n.array;a=n.version;for(let e=0,n=t.length;e65535?Ln:An)(i,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,i.memory.geometries++),e},update:function(t){const i=t.attributes;for(const t in i)e.update(i[t],34962);const n=t.morphAttributes;for(const t in n){const i=n[t];for(let t=0,n=i.length;t0)return t;const r=e*i;let s=vs[r];if(void 0===s&&(s=new Float32Array(r),vs[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function Ms(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i/gm;function Ta(t){return t.replace(Ea,Aa)}function Aa(t,e){const i=Er[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return Ta(i)}const La=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Ca=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Ra(t){return t.replace(Ca,Ia).replace(La,Pa)}function Pa(t,e,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Ia(0,e,i,n)}function Ia(t,e,i,n){let r="";for(let t=parseInt(e);t0?t.gammaFactor:1,p=i.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap||t.transmission)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(_a).join("\n")}(i),f=function(t){const e=[];for(const i in t){const n=t[i];!1!==n&&e.push("#define "+i+" "+n)}return e.join("\n")}(s),m=r.createProgram();let g,v,y=i.glslVersion?"#version "+i.glslVersion+"\n":"";i.isRawShaderMaterial?(g=[f].filter(_a).join("\n"),g.length>0&&(g+="\n"),v=[p,f].filter(_a).join("\n"),v.length>0&&(v+="\n")):(g=[Na(i),"#define SHADER_NAME "+i.shaderName,f,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+h:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularTintMap?"#define USE_SPECULARTINTMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+l:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(_a).join("\n"),v=[p,Na(i),"#define SHADER_NAME "+i.shaderName,f,"#define GAMMA_FACTOR "+d,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+c:"",i.envMap?"#define "+h:"",i.envMap?"#define "+u:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularTintMap?"#define USE_SPECULARTINTMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheenTint?"#define USE_SHEEN":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+l:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(i.extensionShaderTextureLOD||i.envMap)&&i.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?Er.tonemapping_pars_fragment:"",0!==i.toneMapping?ba("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.format===me?"#define OPAQUE":"",Er.encodings_pars_fragment,i.map?xa("mapTexelToLinear",i.mapEncoding):"",i.matcap?xa("matcapTexelToLinear",i.matcapEncoding):"",i.envMap?xa("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMap?xa("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.specularTintMap?xa("specularTintMapTexelToLinear",i.specularTintMapEncoding):"",i.lightMap?xa("lightMapTexelToLinear",i.lightMapEncoding):"",wa("linearToOutputTexel",i.outputEncoding),i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(_a).join("\n")),a=Ta(a),a=Ma(a,i),a=Sa(a,i),o=Ta(o),o=Ma(o,i),o=Sa(o,i),a=Ra(a),o=Ra(o),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(y="#version 300 es\n",g=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",i.glslVersion===Ie?"":"out highp vec4 pc_fragColor;",i.glslVersion===Ie?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v);const x=y+v+o,w=ma(r,35633,y+g+a),b=ma(r,35632,x);if(r.attachShader(m,w),r.attachShader(m,b),void 0!==i.index0AttributeName?r.bindAttribLocation(m,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(m,0,"position"),r.linkProgram(m),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(m).trim(),e=r.getShaderInfoLog(w).trim(),i=r.getShaderInfoLog(b).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(m,35714)){n=!1;const e=ya(r,w,"vertex"),i=ya(r,b,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(m,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+i)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:g},fragmentShader:{log:i,prefix:v}})}let _,M;return r.deleteShader(w),r.deleteShader(b),this.getUniforms=function(){return void 0===_&&(_=new fa(r,m)),_},this.getAttributes=function(){return void 0===M&&(M=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r0,L=s.clearcoat>0;return{isWebGL2:l,shaderID:_,shaderName:s.type,vertexShader:S,fragmentShader:E,defines:s.defines,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:p,instancing:!0===y.isInstancedMesh,instancingColor:!0===y.isInstancedMesh&&null!==y.instanceColor,supportsVertexTextures:d,outputEncoding:null!==T?g(T.texture):t.outputEncoding,map:!!s.map,mapEncoding:g(s.map),matcap:!!s.matcap,matcapEncoding:g(s.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:g(b),envMapCubeUV:!!b&&(b.mapping===ie||307===b.mapping),lightMap:!!s.lightMap,lightMapEncoding:g(s.lightMap),aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,emissiveMapEncoding:g(s.emissiveMap),bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,clearcoat:L,clearcoatMap:L&&!!s.clearcoatMap,clearcoatRoughnessMap:L&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:L&&!!s.clearcoatNormalMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularTintMap:!!s.specularTintMap,specularTintMapEncoding:g(s.specularTintMap),alphaMap:!!s.alphaMap,alphaTest:A,gradientMap:!!s.gradientMap,sheenTint:!!s.sheenTint&&(s.sheenTint.r>0||s.sheenTint.g>0||s.sheenTint.b>0),transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!y.geometry&&!!y.geometry.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!y.geometry&&!!y.geometry.attributes.color&&4===y.geometry.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularTintMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularTintMap||!s.displacementMap),fog:!!x,useFog:s.fog,fogExp2:x&&x.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:c,skinning:!0===y.isSkinnedMesh&&M>0,maxBones:M,useVertexTexture:h,morphTargets:!!y.geometry&&!!y.geometry.morphAttributes.position,morphNormals:!!y.geometry&&!!y.geometry.morphAttributes.normal,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,format:s.format,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&m.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,depthPacking:void 0!==s.depthPacking&&s.depthPacking,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:l||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:l||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:l||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.fragmentShader),i.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t0?r.push(h):!0===i.transparent?s.push(h):n.push(h)},unshift:function(t,e,i,a,l,c){const h=o(t,e,i,a,l,c);i.transmission>0?r.unshift(h):!0===i.transparent?s.unshift(h):n.unshift(h)},finish:function(){for(let t=i,n=e.length;t1&&n.sort(t||Fa),r.length>1&&r.sort(e||Oa),s.length>1&&s.sort(e||Oa)}}}function Ha(t){let e=new WeakMap;return{get:function(i,n){let r;return!1===e.has(i)?(r=new ka(t),e.set(i,[r])):n>=e.get(i).length?(r=new ka(t),e.get(i).push(r)):r=e.get(i)[n],r},dispose:function(){e=new WeakMap}}}function Ua(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new Ke,color:new _n};break;case"SpotLight":i={position:new Ke,direction:new Ke,color:new _n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new Ke,color:new _n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new Ke,skyColor:new _n,groundColor:new _n};break;case"RectAreaLight":i={color:new _n,position:new Ke,halfWidth:new Ke,halfHeight:new Ke}}return t[e.id]=i,i}}}let Va=0;function Ga(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function Wa(t,e){const i=new Ua,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ve};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ve,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new Ke);const s=new Ke,a=new Ri,o=new Ri;return{setup:function(s,a){let o=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,u=0,d=0,p=0,f=0,m=0,g=0,v=0;s.sort(Ga);const y=!0!==a?Math.PI:1;for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Tr.LTC_FLOAT_1,r.rectAreaLTC2=Tr.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Tr.LTC_HALF_1,r.rectAreaLTC2=Tr.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const x=r.hash;x.directionalLength===h&&x.pointLength===u&&x.spotLength===d&&x.rectAreaLength===p&&x.hemiLength===f&&x.numDirectionalShadows===m&&x.numPointShadows===g&&x.numSpotShadows===v||(r.directional.length=h,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=f,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=g,r.spotShadowMatrix.length=v,x.directionalLength=h,x.pointLength=u,x.spotLength=d,x.rectAreaLength=p,x.hemiLength=f,x.numDirectionalShadows=m,x.numPointShadows=g,x.numSpotShadows=v,r.version=Va++)},setupView:function(t,e){let i=0,n=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=i.get(n).length?(s=new ja(t,e),i.get(n).push(s)):s=i.get(n)[r],s},dispose:function(){i=new WeakMap}}}class Xa extends mn{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}Xa.prototype.isMeshDepthMaterial=!0;class Ya extends mn{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Ke,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}function Za(t,e,i){let n=new br;const r=new Ve,s=new Ve,a=new Ze,o=new Xa({depthPacking:3201}),l=new Ya,c={},h=i.maxTextureSize,u={0:1,1:0,2:2},d=new lr({uniforms:{shadow_pass:{value:null},resolution:{value:new Ve},radius:{value:4},samples:{value:8}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nuniform float samples;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const f=new On;f.setAttribute("position",new Tn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new ir(f,d),g=this;function v(i,n){const r=e.update(m);d.uniforms.shadow_pass.value=i.map.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,d.uniforms.samples.value=i.blurSamples,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,r,d,m,null),p.uniforms.shadow_pass.value=i.mapPass.texture,p.uniforms.resolution.value=i.mapSize,p.uniforms.radius.value=i.radius,p.uniforms.samples.value=i.blurSamples,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,r,p,m,null)}function y(e,i,n,r,s,a,h){let d=null;const p=!0===r.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(d=void 0!==p?p:!0===r.isPointLight?l:o,t.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0){const t=d.uuid,e=n.uuid;let i=c[t];void 0===i&&(i={},c[t]=i);let r=i[e];void 0===r&&(r=d.clone(),i[e]=r),d=r}return d.visible=n.visible,d.wireframe=n.wireframe,d.side=3===h?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],d.alphaMap=n.alphaMap,d.alphaTest=n.alphaTest,d.clipShadows=n.clipShadows,d.clippingPlanes=n.clippingPlanes,d.clipIntersection=n.clipIntersection,d.displacementMap=n.displacementMap,d.displacementScale=n.displacementScale,d.displacementBias=n.displacementBias,d.wireframeLinewidth=n.wireframeLinewidth,d.linewidth=n.linewidth,!0===r.isPointLight&&!0===d.isMeshDistanceMaterial&&(d.referencePosition.setFromMatrixPosition(r.matrixWorld),d.nearDistance=s,d.farDistance=a),d}function x(i,r,s,a,o){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let l=0,c=e.length;lh||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:oe,magFilter:oe,format:ge};u.map=new Je(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Je(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:ae,magFilter:ae,format:ge};u.map=new Je(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t=1):-1!==L.indexOf("OpenGL ES")&&(A=parseFloat(/^OpenGL ES (\d)/.exec(L)[1]),T=A>=2);let C=null,R={};const P=t.getParameter(3088),I=t.getParameter(2978),N=(new Ze).fromArray(P),z=(new Ze).fromArray(I);function D(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;en||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?Ue:Math.floor,s=n(r*t.width),a=n(r*t.height);void 0===p&&(p=m(s,a));const o=i?m(s,a):p;return o.width=s,o.height=a,o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function v(t){return He(t.width)&&He(t.height)}function y(t,e){return t.generateMipmaps&&e&&t.minFilter!==ae&&t.minFilter!==oe}function x(e,i,r,s,a=1){t.generateMipmap(e),n.get(i).__maxMipLevel=Math.log2(Math.max(r,s,a))}function w(i,n,r){if(!1===o)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let s=n;return 6403===n&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===n&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===n&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function b(t){return t===ae||1004===t||1005===t?9728:9729}function _(e){const i=e.target;i.removeEventListener("dispose",_),function(e){const i=n.get(e);void 0!==i.__webglInit&&(t.deleteTexture(i.__webglTexture),n.remove(e))}(i),i.isVideoTexture&&d.delete(i),a.memory.textures--}function M(e){const i=e.target;i.removeEventListener("dispose",M),function(e){const i=e.texture,r=n.get(e),s=n.get(i);if(e){if(void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--),e.depthTexture&&e.depthTexture.dispose(),e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(e.isWebGLMultipleRenderTargets)for(let e=0,r=i.length;e0&&r.__version!==t.version){const i=t.image;if(void 0===i)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==i.complete)return void P(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+e),i.bindTexture(3553,r.__webglTexture)}function T(e,r){const a=n.get(e);e.version>0&&a.__version!==e.version?function(e,n,r){if(6!==n.image.length)return;R(e,n),i.activeTexture(33984+r),i.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment),t.pixelStorei(37443,0);const a=n&&(n.isCompressedTexture||n.image[0].isCompressedTexture),l=n.image[0]&&n.image[0].isDataTexture,h=[];for(let t=0;t<6;t++)h[t]=a||l?l?n.image[t].image:n.image[t]:g(n.image[t],!1,!0,c);const u=h[0],d=v(u)||o,p=s.convert(n.format),f=s.convert(n.type),m=w(n.internalFormat,p,f);let b;if(C(34067,n,d),a){for(let t=0;t<6;t++){b=h[t].mipmaps;for(let e=0;e1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function R(e,i){void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",_),e.__webglTexture=t.createTexture(),a.memory.textures++)}function P(e,n,r){let a=3553;n.isDataTexture2DArray&&(a=35866),n.isDataTexture3D&&(a=32879),R(e,n),i.activeTexture(33984+r),i.bindTexture(a,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment),t.pixelStorei(37443,0);const l=function(t){return!o&&(t.wrapS!==re||t.wrapT!==re||t.minFilter!==ae&&t.minFilter!==oe)}(n)&&!1===v(n.image),c=g(n.image,l,!1,h),u=v(c)||o,d=s.convert(n.format);let p,f=s.convert(n.type),m=w(n.internalFormat,d,f);C(a,n,u);const b=n.mipmaps;if(n.isDepthTexture)m=6402,o?m=n.type===de?36012:n.type===ue?33190:n.type===fe?35056:33189:n.type===de&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===ve&&6402===m&&n.type!==he&&n.type!==ue&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=he,f=s.convert(n.type)),n.format===ye&&6402===m&&(m=34041,n.type!==fe&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=fe,f=s.convert(n.type))),i.texImage2D(3553,0,m,c.width,c.height,0,d,f,null);else if(n.isDataTexture)if(b.length>0&&u){for(let t=0,e=b.length;t0&&u){for(let t=0,e=b.length;t=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),S+=1,t},this.resetTextureUnits=function(){S=0},this.setTexture2D=E,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?P(r,t,e):(i.activeTexture(33984+e),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?P(r,t,e):(i.activeTexture(33984+e),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=T,this.setupRenderTarget=function(e){const l=e.texture,c=n.get(e),h=n.get(l);e.addEventListener("dispose",M),!0!==e.isWebGLMultipleRenderTargets&&(h.__webglTexture=t.createTexture(),h.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=!0===e.isWebGLMultisampleRenderTarget,f=l.isDataTexture3D||l.isDataTexture2DArray,m=v(e)||o;if(!o||l.format!==me||l.type!==de&&l.type!==pe||(l.format=ge,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let e=0;e<6;e++)c.__webglFramebuffer[e]=t.createFramebuffer()}else if(c.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const i=e.texture;for(let e=0,r=i.length;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class no extends Ne{constructor(t,e){super();const i=this,n=t.state;let r=null,s=1,a=null,o="local-floor",l=null,c=null,h=null,u=null,d=null,p=!1,f=null,m=null,g=null,v=null,y=null,x=null;const w=[],b=new Map,_=new hr;_.layers.enable(1),_.viewport=new Ze;const M=new hr;M.layers.enable(2),M.viewport=new Ze;const S=[_,M],E=new Ka;E.layers.enable(1),E.layers.enable(2);let T=null,A=null;function L(t){const e=b.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function C(){b.forEach((function(t,e){t.disconnect(e)})),b.clear(),T=null,A=null,n.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),h&&e.deleteFramebuffer(h),f&&e.deleteFramebuffer(f),m&&e.deleteRenderbuffer(m),g&&e.deleteRenderbuffer(g),h=null,f=null,m=null,g=null,d=null,u=null,c=null,r=null,D.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function R(t){const e=r.inputSources;for(let t=0;t0&&(e.alphaTest.value=i.alphaTest);const n=t.get(i).envMap;if(n){e.envMap.value=n,e.flipEnvMap.value=n.isCubeTexture&&!1===n.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio;const r=t.get(n).__maxMipLevel;void 0!==r&&(e.maxMipLevel.value=r)}let r,s;i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity),i.map?r=i.map:i.specularMap?r=i.specularMap:i.displacementMap?r=i.displacementMap:i.normalMap?r=i.normalMap:i.bumpMap?r=i.bumpMap:i.roughnessMap?r=i.roughnessMap:i.metalnessMap?r=i.metalnessMap:i.alphaMap?r=i.alphaMap:i.emissiveMap?r=i.emissiveMap:i.clearcoatMap?r=i.clearcoatMap:i.clearcoatNormalMap?r=i.clearcoatNormalMap:i.clearcoatRoughnessMap?r=i.clearcoatRoughnessMap:i.specularIntensityMap?r=i.specularIntensityMap:i.specularTintMap?r=i.specularTintMap:i.transmissionMap?r=i.transmissionMap:i.thicknessMap&&(r=i.thicknessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),i.aoMap?s=i.aoMap:i.lightMap&&(s=i.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),e.uv2Transform.value.copy(s.matrix))}function i(e,i){e.roughness.value=i.roughness,e.metalness.value=i.metalness,i.roughnessMap&&(e.roughnessMap.value=i.roughnessMap),i.metalnessMap&&(e.metalnessMap.value=i.metalnessMap),i.emissiveMap&&(e.emissiveMap.value=i.emissiveMap),i.bumpMap&&(e.bumpMap.value=i.bumpMap,e.bumpScale.value=i.bumpScale,1===i.side&&(e.bumpScale.value*=-1)),i.normalMap&&(e.normalMap.value=i.normalMap,e.normalScale.value.copy(i.normalScale),1===i.side&&e.normalScale.value.negate()),i.displacementMap&&(e.displacementMap.value=i.displacementMap,e.displacementScale.value=i.displacementScale,e.displacementBias.value=i.displacementBias),t.get(i).envMap&&(e.envMapIntensity.value=i.envMapIntensity)}return{refreshFogUniforms:function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)},refreshMaterialUniforms:function(t,n,r,s,a){n.isMeshBasicMaterial?e(t,n):n.isMeshLambertMaterial?(e(t,n),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(t,n)):n.isMeshToonMaterial?(e(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshPhongMaterial?(e(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshStandardMaterial?(e(t,n),n.isMeshPhysicalMaterial?function(t,e,n){i(t,e),t.ior.value=e.ior,e.sheenTint&&t.sheenTint.value.copy(e.sheenTint),e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate())),e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=n.texture,t.transmissionSamplerSize.value.set(n.width,n.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationTint.value.copy(e.attenuationTint)),t.specularIntensity.value=e.specularIntensity,t.specularTint.value.copy(e.specularTint),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap),e.specularTintMap&&(t.specularTintMap.value=e.specularTintMap)}(t,n,a):i(t,n)):n.isMeshMatcapMaterial?(e(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDepthMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDistanceMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?(e(t,n),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){let r;t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.alphaTest>0&&(t.alphaTest.value=e.alphaTest),e.map?r=e.map:e.alphaMap&&(r=e.alphaMap),void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){let i;t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.alphaTest>0&&(t.alphaTest.value=e.alphaTest),e.map?i=e.map:e.alphaMap&&(i=e.alphaMap),void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function so(t={}){const e=void 0!==t.canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),i=void 0!==t.context?t.context:null,n=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],f=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=Ee,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const m=this;let g=!1,v=0,y=0,x=null,w=-1,b=null;const _=new Ze,M=new Ze;let S=null,E=e.width,T=e.height,A=1,L=null,C=null;const R=new Ze(0,0,E,T),P=new Ze(0,0,E,T);let I=!1;const N=[],z=new br;let D=!1,B=!1,F=null;const O=new Ri,k=new Ke,H={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function U(){return null===x?A:1}let V,G,W,j,q,X,Y,Z,J,Q,$,K,tt,et,it,nt,rt,st,at,ot,lt,ct,ht,ut=i;function dt(t,i){for(let n=0;n0&&function(t,e,i){if(null===F){const t=!0===a&&!0===G.isWebGL2;F=new(t?Qe:Je)(1024,1024,{generateMipmaps:!0,type:null!==ct.convert(pe)?pe:ce,minFilter:le,magFilter:ae,wrapS:re,wrapT:re})}const n=m.getRenderTarget();m.setRenderTarget(F),m.clear();const r=m.toneMapping;m.toneMapping=0,St(t,e,i),m.toneMapping=r,X.updateMultisampleRenderTarget(F),X.updateRenderTargetMipmap(F),m.setRenderTarget(n)}(r,e,i),n&&W.viewport(_.copy(n)),r.length>0&&St(r,e,i),s.length>0&&St(s,e,i),o.length>0&&St(o,e,i)}function St(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r0?f[f.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return v},this.getActiveMipmapLevel=function(){return y},this.getRenderTarget=function(){return x},this.setRenderTarget=function(t,e=0,i=0){x=t,v=e,y=i,t&&void 0===q.get(t).__webglFramebuffer&&X.setupRenderTarget(t);let n=null,r=!1,s=!1;if(t){const i=t.texture;(i.isDataTexture3D||i.isDataTexture2DArray)&&(s=!0);const a=q.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(n=a[e],r=!0):n=t.isWebGLMultisampleRenderTarget?q.get(t).__webglMultisampledFramebuffer:a,_.copy(t.viewport),M.copy(t.scissor),S=t.scissorTest}else _.copy(R).multiplyScalar(A).floor(),M.copy(P).multiplyScalar(A).floor(),S=I;if(W.bindFramebuffer(36160,n)&&G.drawBuffers){let e=!1;if(t)if(t.isWebGLMultipleRenderTargets){const i=t.texture;if(N.length!==i.length||36064!==N[0]){for(let t=0,e=i.length;t=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&ut.readPixels(e,i,n,r,ct.convert(o),ct.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==x?q.get(x).__webglFramebuffer:null;W.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n);let a=ct.convert(e.format);G.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),X.setTexture2D(e,0),ut.copyTexImage2D(3553,i,a,t.x,t.y,r,s,0),W.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,a=ct.convert(i.format),o=ct.convert(i.type);X.setTexture2D(i,0),ut.pixelStorei(37440,i.flipY),ut.pixelStorei(37441,i.premultiplyAlpha),ut.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?ut.texSubImage2D(3553,n,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?ut.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):ut.texSubImage2D(3553,n,t.x,t.y,a,o,e.image),0===n&&i.generateMipmaps&&ut.generateMipmap(3553),W.unbindTexture()},this.copyTextureToTexture3D=function(t,e,i,n,r=0){if(m.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=ct.convert(n.format),c=ct.convert(n.type);let h;if(n.isDataTexture3D)X.setTexture3D(n,0),h=32879;else{if(!n.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");X.setTexture2DArray(n,0),h=35866}ut.pixelStorei(37440,n.flipY),ut.pixelStorei(37441,n.premultiplyAlpha),ut.pixelStorei(3317,n.unpackAlignment);const u=ut.getParameter(3314),d=ut.getParameter(32878),p=ut.getParameter(3316),f=ut.getParameter(3315),g=ut.getParameter(32877),v=i.isCompressedTexture?i.mipmaps[0]:i.image;ut.pixelStorei(3314,v.width),ut.pixelStorei(32878,v.height),ut.pixelStorei(3316,t.min.x),ut.pixelStorei(3315,t.min.y),ut.pixelStorei(32877,t.min.z),i.isDataTexture||i.isDataTexture3D?ut.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v.data):i.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),ut.compressedTexSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,v.data)):ut.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v),ut.pixelStorei(3314,u),ut.pixelStorei(32878,d),ut.pixelStorei(3316,p),ut.pixelStorei(3315,f),ut.pixelStorei(32877,g),0===r&&n.generateMipmaps&&ut.generateMipmap(h),W.unbindTexture()},this.initTexture=function(t){X.setTexture2D(t,0),W.unbindTexture()},this.resetState=function(){v=0,y=0,x=null,W.reset(),ht.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}(class extends so{}).prototype.isWebGL1Renderer=!0;class ao{constructor(t,e=25e-5){this.name="",this.color=new _n(t),this.density=e}clone(){return new ao(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}ao.prototype.isFogExp2=!0;class oo{constructor(t,e=1,i=1e3){this.name="",this.color=new _n(t),this.near=e,this.far=i}clone(){return new oo(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}oo.prototype.isFog=!0;class lo extends en{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}lo.prototype.isScene=!0;class co{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=Re,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Fe()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;nt.far||e.push({distance:o,point:mo.clone(),uv:pn.getUV(mo,bo,_o,Mo,So,Eo,To,new Ve),face:null,object:this})}copy(t){return super.copy(t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}).prototype.isSprite=!0;const Lo=new Ke,Co=new Ze,Ro=new Ze,Po=new Ke,Io=new Ri;class No extends ir{constructor(t,e){super(t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Ri,this.bindMatrixInverse=new Ri}copy(t){return super.copy(t),this.bindMode=t.bindMode,this.bindMatrix.copy(t.bindMatrix),this.bindMatrixInverse.copy(t.bindMatrixInverse),this.skeleton=t.skeleton,this}bind(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.copy(e).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const t=new Ze,e=this.geometry.attributes.skinWeight;for(let i=0,n=e.count;io)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);dt.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}else for(let i=Math.max(0,s.start),n=Math.min(r.count,s.start+s.count)-1;io)continue;u.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(u);nt.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else i.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,i=Object.keys(e);if(i.length>0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}jo.prototype.isLine=!0;const qo=new Ke,Xo=new Ke;class Yo extends jo{constructor(t,e){super(t,e),this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,n=e.count;tr.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,object:a})}}(class extends en{constructor(t=new On,e=new Zo){super(),this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),this.material=t.material,this.geometry=t.geometry,this}raycast(t,e){const i=this.geometry,n=this.matrixWorld,r=t.params.Points.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),$o.copy(i.boundingSphere),$o.applyMatrix4(n),$o.radius+=r,!1===t.ray.intersectsSphere($o))return;Jo.copy(n).invert(),Qo.copy(t.ray).applyMatrix4(Jo);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position;if(null!==r)for(let i=Math.max(0,s.start),l=Math.min(r.count,s.start+s.count);i0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}).prototype.isPoints=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.format=void 0!==a?a:me,this.minFilter=void 0!==s?s:oe,this.magFilter=void 0!==r?r:oe,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1=="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}.prototype.isVideoTexture=!0;(class extends Xe{constructor(t,e,i,n,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,n,r,h,u),this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isCompressedTexture=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.needsUpdate=!0}}.prototype.isCanvasTexture=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:ve)!==ve&&c!==ye)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===ve&&(i=he),void 0===i&&c===ye&&(i=fe),super(null,n,r,s,a,o,c,i,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:ae,this.minFilter=void 0!==o?o:ae,this.flipY=!1,this.generateMipmaps=!1}}.prototype.isDepthTexture=!0,new Ke,new Ke,new Ke,new pn;class el{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let a,o=0,l=r-1;for(;o<=l;)if(n=Math.floor(o+(l-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){l=n;break}l=n-1}if(n=l,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=e||(s.isVector2?new Ve:new Ke);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new Ke,n=[],r=[],s=[],a=new Ke,o=new Ri;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new Ke),n[e].normalize()}r[0]=new Ke,s[0]=new Ke;let l=Number.MAX_VALUE;const c=Math.abs(n[0].x),h=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=l&&(l=c,i.set(1,0,0)),h<=l&&(l=h,i.set(0,1,0)),u<=l&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(n[e-1],n[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Oe(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(Oe(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class il extends el{constructor(t=0,e=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const i=e||new Ve,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)n;)r-=n;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=n[(l-1)%r]:(sl.subVectors(n[0],n[1]).add(n[0]),a=sl);const h=n[l%r],u=n[(l+1)%r];if(this.closed||l+2n.length-2?n.length-1:s+1],h=n[s>n.length-3?n.length-1:s+2];return i.set(hl(a,o.x,l.x,c.x,h.x),hl(a,o.y,l.y,c.y,h.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e0)for(s=e;s=e;s-=n)a=Ul(s,t[s],t[s+1],a);return a&&Dl(a,a.next)&&(Vl(a),a=a.next),a}function bl(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!Dl(n,n.next)&&0!==zl(n.prev,n,n.next))n=n.next;else{if(Vl(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function _l(t,e,i,n,r,s,a){if(!t)return;!a&&s&&function(t,e,i,n){let r=t;do{null===r.z&&(r.z=Rl(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,a,o,l,c=1;do{for(i=t,t=null,s=null,a=0;i;){for(a++,n=i,o=0,e=0;e0||l>0&&n;)0!==o&&(0===l||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(t,n,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?Sl(t,n,r,s):Ml(t))e.push(o.i/i),e.push(t.i/i),e.push(l.i/i),Vl(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?_l(t=El(bl(t),e,i),e,i,n,r,s,2):2===a&&Tl(t,e,i,n,r,s):_l(bl(t),e,i,n,r,s,1);break}}function Ml(t){const e=t.prev,i=t,n=t.next;if(zl(e,i,n)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(Il(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&zl(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Sl(t,e,i,n){const r=t.prev,s=t,a=t.next;if(zl(r,s,a)>=0)return!1;const o=r.xs.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Rl(o,l,e,i,n),d=Rl(c,h,e,i,n);let p=t.prevZ,f=t.nextZ;for(;p&&p.z>=u&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&zl(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,f.x,f.y)&&zl(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&zl(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,f.x,f.y)&&zl(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function El(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!Dl(r,s)&&Bl(r,n,n.next,s)&&kl(r,s)&&kl(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),Vl(n),Vl(n.next),n=t=s),n=n.next}while(n!==t);return bl(n)}function Tl(t,e,i,n,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Nl(a,t)){let o=Hl(a,t);return a=bl(a,a.next),o=bl(o,o.next),_l(a,e,i,n,r,s),void _l(o,e,i,n,r,s)}t=t.next}a=a.next}while(a!==t)}function Al(t,e){return t.x-e.x}function Ll(t,e){if(e=function(t,e){let i=e;const n=t.x,r=t.y;let s,a=-1/0;do{if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=n&&t>a){if(a=t,t===n){if(r===i.y)return i;if(r===i.next.y)return i.next}s=i.x=i.x&&i.x>=l&&n!==i.x&&Il(rs.x||i.x===s.x&&Cl(s,i)))&&(s=i,u=h)),i=i.next}while(i!==o);return s}(t,e),e){const i=Hl(e,t);bl(e,e.next),bl(i,i.next)}}function Cl(t,e){return zl(t.prev,t,e.prev)<0&&zl(e.next,t,t.next)<0}function Rl(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Pl(t){let e=t,i=t;do{(e.x=0&&(t-a)*(n-o)-(i-a)*(e-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function Nl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Bl(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(kl(t,e)&&kl(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(zl(t.prev,t,e.prev)||zl(t,e.prev,e))||Dl(t,e)&&zl(t.prev,t,t.next)>0&&zl(e.prev,e,e.next)>0)}function zl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Dl(t,e){return t.x===e.x&&t.y===e.y}function Bl(t,e,i,n){const r=Ol(zl(t,e,i)),s=Ol(zl(t,e,n)),a=Ol(zl(i,n,t)),o=Ol(zl(i,n,e));return r!==s&&a!==o||!(0!==r||!Fl(t,i,e))||!(0!==s||!Fl(t,n,e))||!(0!==a||!Fl(i,t,n))||!(0!==o||!Fl(i,e,n))}function Fl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Ol(t){return t>0?1:t<0?-1:0}function kl(t,e){return zl(t.prev,t,t.next)<0?zl(t,e,t.next)>=0&&zl(t,t.prev,e)>=0:zl(t,e,t.prev)<0||zl(t,t.next,e)<0}function Hl(t,e){const i=new Gl(t.i,t.x,t.y),n=new Gl(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Ul(t,e,i,n){const r=new Gl(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Vl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Gl(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Wl{static area(t){const e=t.length;let i=0;for(let n=e-1,r=0;r80*i){o=c=t[0],l=h=t[1];for(let e=i;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return _l(s,a,i,o,l,p),a}(i,n);for(let t=0;t2&&t[e-1].equals(t[0])&&t.pop()}function ql(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,f=e.y+a/u,m=((i.x-c/d-p)*c-(i.y+l/d-f)*l)/(a*c-o*l);n=p+a*m-t.x,r=f+o*m-t.y;const g=n*n+r*r;if(g<=2)return new Ve(n,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(n=-o,r=a,s=Math.sqrt(h)):(n=a,r=o,s=Math.sqrt(h/2))}return new Ve(n/s,r/s)}const P=[];for(let t=0,e=T.length,i=e-1,n=t+1;t=0;t--){const e=t/p,i=h*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=T.length;t=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0!=t>0&&this.version++,this._clearcoat=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.ior=t.ior,this.sheenTint.copy(t.sheenTint),this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationTint.copy(t.attenuationTint),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularTint.copy(t.specularTint),this.specularTintMap=t.specularTintMap,this}}).prototype.isMeshPhysicalMaterial=!0;class $l extends mn{constructor(t){super(),this.type="MeshPhongMaterial",this.color=new _n(16777215),this.specular=new _n(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this}}$l.prototype.isMeshPhongMaterial=!0;(class extends mn{constructor(t){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new _n(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this}}).prototype.isMeshToonMaterial=!0;(class extends mn{constructor(t){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}).prototype.isMeshNormalMaterial=!0;(class extends mn{constructor(t){super(),this.type="MeshLambertMaterial",this.color=new _n(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this}}).prototype.isMeshLambertMaterial=!0;(class extends mn{constructor(t){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new _n(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this}}).prototype.isMeshMatcapMaterial=!0;(class extends ko{constructor(t){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}).prototype.isLineDashedMaterial=!0;const Kl={arraySlice:function(t,e,i){return Kl.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)},convertArray:function(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i},sortedArray:function(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[a++]=t[n+i]}return r},flattenJSON:function(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(e.push(s.time),i.push.apply(i,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(e.push(s.time),a.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(e.push(s.time),i.push(a)),s=t[r++]}while(void 0!==s)},subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t=n)){l.push(e.times[t]);for(let i=0;is.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=n.times[u]){const t=u*l+o,e=t+l-o;d=Kl.arraySlice(n.values,t,e)}else{const t=n.createInterpolant(),e=o,i=l-o;t.evaluate(s),d=Kl.arraySlice(t.resultBuffer,e,i)}"quaternion"===r&&(new $e).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=i,i=0}}for(;i>>1;te;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Kl.arraySlice(i,r,s),this.values=Kl.arraySlice(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&Kl.isTypedArray(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=Kl.arraySlice(this.times),e=Kl.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===be,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*i,n=s*i,a=0;a!==i;++a)e[n+a]=e[t+a];++s}return s!==t.length?(this.times=Kl.arraySlice(t,0,s),this.values=Kl.arraySlice(e,0,s*i)):(this.times=t,this.values=e),this}clone(){const t=Kl.arraySlice(this.times,0),e=Kl.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}rc.prototype.TimeBufferType=Float32Array,rc.prototype.ValueBufferType=Float32Array,rc.prototype.DefaultInterpolation=we;class sc extends rc{}sc.prototype.ValueTypeName="bool",sc.prototype.ValueBufferType=Array,sc.prototype.DefaultInterpolation=xe,sc.prototype.InterpolantFactoryMethodLinear=void 0,sc.prototype.InterpolantFactoryMethodSmooth=void 0;class ac extends rc{}ac.prototype.ValueTypeName="color";class oc extends rc{}oc.prototype.ValueTypeName="number";class lc extends tc{constructor(t,e,i,n){super(t,e,i,n)}interpolate_(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-e)/(n-e);let l=t*a;for(let t=l+a;l!==t;l+=4)$e.slerpFlat(r,0,s,l-a,s,l,o);return r}}class cc extends rc{InterpolantFactoryMethodLinear(t){return new lc(this.times,this.values,this.getValueSize(),t)}}cc.prototype.ValueTypeName="quaternion",cc.prototype.DefaultInterpolation=we,cc.prototype.InterpolantFactoryMethodSmooth=void 0;class hc extends rc{}hc.prototype.ValueTypeName="string",hc.prototype.ValueBufferType=Array,hc.prototype.DefaultInterpolation=xe,hc.prototype.InterpolantFactoryMethodLinear=void 0,hc.prototype.InterpolantFactoryMethodSmooth=void 0;class uc extends rc{}uc.prototype.ValueTypeName="vector";class dc{constructor(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=Fe(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(pc(i[t]).scale(n));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(rc.toJSON(i[t]));return n}static CreateFromMorphTargetSequence(t,e,i,n){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(this.CreateFromMorphTargetSequence(t,n[t],e,i));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],a=[];Kl.flattenJSON(i,s,a,n),0!==s.length&&r.push(new t(e,s,a))}},n=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t0||0===t.search(/^data\:image\/jpeg/);r.format=n?me:ge,r.needsUpdate=!0,void 0!==e&&e(r)}),i,n),r}}class _c extends el{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(t){this.curves.push(t)}closePath(){const t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new ml(e,t))}getPoint(t){const e=t*this.getLength(),i=this.getCurveLengths();let n=0;for(;n=e){const t=i[n]-e,r=this.curves[n],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}n++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Sc extends Mc{constructor(t){super(t),this.uuid=Fe(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,n=this.holes.length;i0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,n);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]}_slerp(t,e,i,n){$e.slerpFlat(t,e,t,e,t,i,n)}_slerpAdditive(t,e,i,n,r){const s=this._workIndex*r;$e.multiplyQuaternionsFlat(t,s,t,e,t,i),$e.slerpFlat(t,e,t,e,t,s,n)}_lerp(t,e,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[i+a]*n}}_lerpAdditive(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}}const Gc=new RegExp("[\\[\\]\\.:\\/]","g"),Wc="[^\\[\\]\\.:\\/]",jc="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",qc=/((?:WC+[\/:])*)/.source.replace("WC",Wc),Xc=/(WCOD+)?/.source.replace("WCOD",jc),Yc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Wc),Zc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Wc),Jc=new RegExp("^"+qc+Xc+Yc+Zc+"$"),Qc=["material","materials","bones"];class $c{constructor(t,e,i){this.path=e,this.parsedPath=i||$c.parseTrackName(e),this.node=$c.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new $c.Composite(t,e,i):new $c(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Gc,"")}static parseTrackName(t){const e=Jc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==Qc.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n0){const t=this._interpolants,e=this._propertyBindings;if(2501===this.blendMode)for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;null!==i&&(e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e))}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=Me,n.endingEnd=Me):(n.endingStart=t?this.zeroSlopeAtStart?Me:_e:Se,n.endingEnd=e?this.zeroSlopeAtEnd?Me:_e:Se)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}(class extends Ne{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,n=t._clip.tracks,r=n.length,s=t._propertyBindings,a=t._interpolants,o=i.uuid,l=this._bindingsByRootAndName;let c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=n[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const n=e&&e._propertyBindings[t].binding.parsedPath;h=new Vc($c.create(i,l,n),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,n=this._actionsByClip[i];this._bindAction(t,n&&n.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==i;++a)e[a]._update(n,t,r,s);const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;tthis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return eh.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}ih.prototype.isBox2=!0,class extends en{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}.prototype.isImmediateRenderObject=!0;const nh=new Ke,rh=new Ri,sh=new Ri;function ah(t){const e=[];t&&t.isBone&&e.push(t);for(let i=0;i0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0){const t=1/n;this.x*=t,this.y*=t,this.z*=t}else this.x=0,this.y=0,this.z=0;return n}unit(t=new hh){const e=this.x,i=this.y,n=this.z;let r=Math.sqrt(e*e+i*i+n*n);return r>0?(r=1/r,t.x=e*r,t.y=i*r,t.z=n*r):(t.x=1,t.y=0,t.z=0),t}length(){const t=this.x,e=this.y,i=this.z;return Math.sqrt(t*t+e*e+i*i)}lengthSquared(){return this.dot(this)}distanceTo(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z;return Math.sqrt((r-e)*(r-e)+(s-i)*(s-i)+(a-n)*(a-n))}distanceSquared(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z;return(r-e)*(r-e)+(s-i)*(s-i)+(a-n)*(a-n)}scale(t,e=new hh){const i=this.x,n=this.y,r=this.z;return e.x=t*i,e.y=t*n,e.z=t*r,e}vmul(t,e=new hh){return e.x=t.x*this.x,e.y=t.y*this.y,e.z=t.z*this.z,e}addScaledVector(t,e,i=new hh){return i.x=this.x+t*e.x,i.y=this.y+t*e.y,i.z=this.z+t*e.z,i}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}isZero(){return 0===this.x&&0===this.y&&0===this.z}negate(t=new hh){return t.x=-this.x,t.y=-this.y,t.z=-this.z,t}tangents(t,e){const i=this.length();if(i>0){const n=uh,r=1/i;n.set(this.x*r,this.y*r,this.z*r);const s=dh;Math.abs(n.x)<.9?(s.set(1,0,0),n.cross(s,t)):(s.set(0,1,0),n.cross(s,t)),n.cross(t,e)}else t.set(1,0,0),e.set(0,1,0)}toString(){return this.x+","+this.y+","+this.z}toArray(){return[this.x,this.y,this.z]}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}lerp(t,e,i){const n=this.x,r=this.y,s=this.z;i.x=n+(t.x-n)*e,i.y=r+(t.y-r)*e,i.z=s+(t.z-s)*e}almostEquals(t,e=1e-6){return!(Math.abs(this.x-t.x)>e||Math.abs(this.y-t.y)>e||Math.abs(this.z-t.z)>e)}almostZero(t=1e-6){return!(Math.abs(this.x)>t||Math.abs(this.y)>t||Math.abs(this.z)>t)}isAntiparallelTo(t,e){return this.negate(ph),ph.almostEquals(t,e)}clone(){return new hh(this.x,this.y,this.z)}}hh.ZERO=void 0,hh.UNIT_X=void 0,hh.UNIT_Y=void 0,hh.UNIT_Z=void 0,hh.ZERO=new hh(0,0,0),hh.UNIT_X=new hh(1,0,0),hh.UNIT_Y=new hh(0,1,0),hh.UNIT_Z=new hh(0,0,1);const uh=new hh,dh=new hh,ph=new hh;class fh{constructor(t={}){this.lowerBound=void 0,this.upperBound=void 0,this.lowerBound=new hh,this.upperBound=new hh,t.lowerBound&&this.lowerBound.copy(t.lowerBound),t.upperBound&&this.upperBound.copy(t.upperBound)}setFromPoints(t,e,i,n){const r=this.lowerBound,s=this.upperBound,a=i;r.copy(t[0]),a&&a.vmult(r,r),s.copy(r);for(let e=1;es.x&&(s.x=i.x),i.xs.y&&(s.y=i.y),i.ys.z&&(s.z=i.z),i.z=r.x&&e.y<=n.y&&i.y>=r.y&&e.z<=n.z&&i.z>=r.z}getCorners(t,e,i,n,r,s,a,o){const l=this.lowerBound,c=this.upperBound;t.copy(l),e.set(c.x,l.y,l.z),i.set(c.x,c.y,l.z),n.set(l.x,c.y,c.z),r.set(c.x,l.y,c.z),s.set(l.x,c.y,l.z),a.set(l.x,l.y,c.z),o.copy(c)}toLocalFrame(t,e){const i=gh,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7];this.getCorners(n,r,s,a,o,l,c,h);for(let e=0;8!==e;e++){const n=i[e];t.pointToLocal(n,n)}return e.setFromPoints(i)}toWorldFrame(t,e){const i=gh,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7];this.getCorners(n,r,s,a,o,l,c,h);for(let e=0;8!==e;e++){const n=i[e];t.pointToWorld(n,n)}return e.setFromPoints(i)}overlapsRay(t){const{direction:e,from:i}=t,n=1/e.x,r=1/e.y,s=1/e.z,a=(this.lowerBound.x-i.x)*n,o=(this.upperBound.x-i.x)*n,l=(this.lowerBound.y-i.y)*r,c=(this.upperBound.y-i.y)*r,h=(this.lowerBound.z-i.z)*s,u=(this.upperBound.z-i.z)*s,d=Math.max(Math.max(Math.min(a,o),Math.min(l,c)),Math.min(h,u)),p=Math.min(Math.min(Math.max(a,o),Math.max(l,c)),Math.max(h,u));return!(p<0||d>p)}}const mh=new hh,gh=[new hh,new hh,new hh,new hh,new hh,new hh,new hh,new hh];class vh{constructor(){this.matrix=void 0,this.matrix=[]}get(t,e){let{index:i}=t,{index:n}=e;if(n>i){const t=n;n=i,i=t}return this.matrix[(i*(i+1)>>1)+n-1]}set(t,e,i){let{index:n}=t,{index:r}=e;if(r>n){const t=r;r=n,n=t}this.matrix[(n*(n+1)>>1)+r-1]=i?1:0}reset(){for(let t=0,e=this.matrix.length;t!==e;t++)this.matrix[t]=0}setNumObjects(t){this.matrix.length=t*(t-1)>>1}}class yh{constructor(){this._listeners=void 0}addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;return void 0===i[t]&&(i[t]=[]),i[t].includes(e)||i[t].push(e),this}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return!(void 0===i[t]||!i[t].includes(e))}hasAnyEventListener(t){return void 0!==this._listeners&&void 0!==this._listeners[t]}removeEventListener(t,e){if(void 0===this._listeners)return this;const i=this._listeners;if(void 0===i[t])return this;const n=i[t].indexOf(e);return-1!==n&&i[t].splice(n,1),this}dispatchEvent(t){if(void 0===this._listeners)return this;const e=this._listeners[t.type];if(void 0!==e){t.target=this;for(let i=0,n=e.length;i.499&&(i=2*Math.atan2(s,l),n=Math.PI/2,r=0),t<-.499&&(i=-2*Math.atan2(s,l),n=-Math.PI/2,r=0),void 0===i){const e=s*s,c=a*a,h=o*o;i=Math.atan2(2*a*l-2*s*o,1-2*c-2*h),n=Math.asin(2*t),r=Math.atan2(2*s*l-2*a*o,1-2*e-2*h)}}t.y=i,t.z=n,t.x=r}setFromEuler(t,e,i,n="XYZ"){const r=Math.cos(t/2),s=Math.cos(e/2),a=Math.cos(i/2),o=Math.sin(t/2),l=Math.sin(e/2),c=Math.sin(i/2);return"XYZ"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a-o*l*c):"YXZ"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a+o*l*c):"ZXY"===n?(this.x=o*s*a-r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a-o*l*c):"ZYX"===n?(this.x=o*s*a-r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a+o*l*c):"YZX"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a-o*l*c):"XZY"===n&&(this.x=o*s*a-r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a+o*l*c),this}clone(){return new xh(this.x,this.y,this.z,this.w)}slerp(t,e,i=new xh){const n=this.x,r=this.y,s=this.z,a=this.w;let o,l,c,h,u,d=t.x,p=t.y,f=t.z,m=t.w;return l=n*d+r*p+s*f+a*m,l<0&&(l=-l,d=-d,p=-p,f=-f,m=-m),1-l>1e-6?(o=Math.acos(l),c=Math.sin(o),h=Math.sin((1-e)*o)/c,u=Math.sin(e*o)/c):(h=1-e,u=e),i.x=h*n+u*d,i.y=h*r+u*p,i.z=h*s+u*f,i.w=h*a+u*m,i}integrate(t,e,i,n=new xh){const r=t.x*i.x,s=t.y*i.y,a=t.z*i.z,o=this.x,l=this.y,c=this.z,h=this.w,u=.5*e;return n.x+=u*(r*h+s*c-a*l),n.y+=u*(s*h+a*o-r*c),n.z+=u*(a*h+r*l-s*o),n.w+=u*(-r*o-s*l-a*c),n}}const wh=new hh,bh=new hh;class _h{constructor(t={}){this.id=void 0,this.type=void 0,this.boundingSphereRadius=void 0,this.collisionResponse=void 0,this.collisionFilterGroup=void 0,this.collisionFilterMask=void 0,this.material=void 0,this.body=void 0,this.id=_h.idCounter++,this.type=t.type||0,this.boundingSphereRadius=0,this.collisionResponse=!t.collisionResponse||t.collisionResponse,this.collisionFilterGroup=void 0!==t.collisionFilterGroup?t.collisionFilterGroup:1,this.collisionFilterMask=void 0!==t.collisionFilterMask?t.collisionFilterMask:-1,this.material=t.material?t.material:null,this.body=null}updateBoundingSphereRadius(){throw"computeBoundingSphereRadius() not implemented for shape type "+this.type}volume(){throw"volume() not implemented for shape type "+this.type}calculateLocalInertia(t,e){throw"calculateLocalInertia() not implemented for shape type "+this.type}calculateWorldAABB(t,e,i,n){throw"calculateWorldAABB() not implemented for shape type "+this.type}}_h.idCounter=0,_h.types={SPHERE:1,PLANE:2,BOX:4,COMPOUND:8,CONVEXPOLYHEDRON:16,HEIGHTFIELD:32,PARTICLE:64,CYLINDER:128,TRIMESH:256};class Mh{constructor(t={}){this.position=void 0,this.quaternion=void 0,this.position=new hh,this.quaternion=new xh,t.position&&this.position.copy(t.position),t.quaternion&&this.quaternion.copy(t.quaternion)}pointToLocal(t,e){return Mh.pointToLocalFrame(this.position,this.quaternion,t,e)}pointToWorld(t,e){return Mh.pointToWorldFrame(this.position,this.quaternion,t,e)}vectorToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e}static pointToLocalFrame(t,e,i,n=new hh){return i.vsub(t,n),e.conjugate(Sh),Sh.vmult(n,n),n}static pointToWorldFrame(t,e,i,n=new hh){return e.vmult(i,n),n.vadd(t,n),n}static vectorToWorldFrame(t,e,i=new hh){return t.vmult(e,i),i}static vectorToLocalFrame(t,e,i,n=new hh){return e.w*=-1,e.vmult(i,n),e.w*=-1,n}}const Sh=new xh;class Eh extends _h{constructor(t={}){const{vertices:e=[],faces:i=[],normals:n=[],axes:r,boundingSphereRadius:s}=t;super({type:_h.types.CONVEXPOLYHEDRON}),this.vertices=void 0,this.faces=void 0,this.faceNormals=void 0,this.worldVertices=void 0,this.worldVerticesNeedsUpdate=void 0,this.worldFaceNormals=void 0,this.worldFaceNormalsNeedsUpdate=void 0,this.uniqueAxes=void 0,this.uniqueEdges=void 0,this.vertices=e,this.faces=i,this.faceNormals=n,0===this.faceNormals.length&&this.computeNormals(),s?this.boundingSphereRadius=s:this.updateBoundingSphereRadius(),this.worldVertices=[],this.worldVerticesNeedsUpdate=!0,this.worldFaceNormals=[],this.worldFaceNormalsNeedsUpdate=!0,this.uniqueAxes=r?r.slice():null,this.uniqueEdges=[],this.computeEdges()}computeEdges(){const t=this.faces,e=this.vertices,i=this.uniqueEdges;i.length=0;const n=new hh;for(let r=0;r!==t.length;r++){const s=t[r],a=s.length;for(let t=0;t!==a;t++){const r=(t+1)%a;e[s[t]].vsub(e[s[r]],n),n.normalize();let o=!1;for(let t=0;t!==i.length;t++)if(i[t].almostEquals(n)||i[t].almostEquals(n)){o=!0;break}o||i.push(n.clone())}}}computeNormals(){this.faceNormals.length=this.faces.length;for(let t=0;tu&&(u=e,h=t)}const d=[];for(let t=0;t=0&&this.clipFaceAgainstHull(s,t,e,d,a,o,l)}findSeparatingAxis(t,e,i,n,r,s,a,o){const l=new hh,c=new hh,h=new hh,u=new hh,d=new hh,p=new hh;let f=Number.MAX_VALUE;const m=this;if(m.uniqueAxes)for(let a=0;a!==m.uniqueAxes.length;a++){i.vmult(m.uniqueAxes[a],l);const o=m.testSepAxis(l,t,e,i,n,r);if(!1===o)return!1;o0&&s.negate(s),!0}testSepAxis(t,e,i,n,r,s){Eh.project(this,t,i,n,Th),Eh.project(e,t,r,s,Ah);const a=Th[0],o=Th[1],l=Ah[0],c=Ah[1];if(a0?1/e:0,this.material=t.material||null,this.linearDamping="number"==typeof t.linearDamping?t.linearDamping:.01,this.type=e<=0?Nh.STATIC:Nh.DYNAMIC,typeof t.type==typeof Nh.STATIC&&(this.type=t.type),this.allowSleep=void 0===t.allowSleep||t.allowSleep,this.sleepState=Nh.AWAKE,this.sleepSpeedLimit=void 0!==t.sleepSpeedLimit?t.sleepSpeedLimit:.1,this.sleepTimeLimit=void 0!==t.sleepTimeLimit?t.sleepTimeLimit:1,this.timeLastSleepy=0,this.wakeUpAfterNarrowphase=!1,this.torque=new hh,this.quaternion=new xh,this.initQuaternion=new xh,this.previousQuaternion=new xh,this.interpolatedQuaternion=new xh,t.quaternion&&(this.quaternion.copy(t.quaternion),this.initQuaternion.copy(t.quaternion),this.previousQuaternion.copy(t.quaternion),this.interpolatedQuaternion.copy(t.quaternion)),this.angularVelocity=new hh,t.angularVelocity&&this.angularVelocity.copy(t.angularVelocity),this.initAngularVelocity=new hh,this.shapes=[],this.shapeOffsets=[],this.shapeOrientations=[],this.inertia=new hh,this.invInertia=new hh,this.invInertiaWorld=new lh,this.invMassSolve=0,this.invInertiaSolve=new hh,this.invInertiaWorldSolve=new lh,this.fixedRotation=void 0!==t.fixedRotation&&t.fixedRotation,this.angularDamping=void 0!==t.angularDamping?t.angularDamping:.01,this.linearFactor=new hh(1,1,1),t.linearFactor&&this.linearFactor.copy(t.linearFactor),this.angularFactor=new hh(1,1,1),t.angularFactor&&this.angularFactor.copy(t.angularFactor),this.aabb=new fh,this.aabbNeedsUpdate=!0,this.boundingRadius=0,this.wlambda=new hh,this.isTrigger=Boolean(t.isTrigger),t.shape&&this.addShape(t.shape),this.updateMassProperties()}wakeUp(){const t=this.sleepState;this.sleepState=Nh.AWAKE,this.wakeUpAfterNarrowphase=!1,t===Nh.SLEEPING&&this.dispatchEvent(Nh.wakeupEvent)}sleep(){this.sleepState=Nh.SLEEPING,this.velocity.set(0,0,0),this.angularVelocity.set(0,0,0),this.wakeUpAfterNarrowphase=!1}sleepTick(t){if(this.allowSleep){const e=this.sleepState,i=this.velocity.lengthSquared()+this.angularVelocity.lengthSquared(),n=this.sleepSpeedLimit**2;e===Nh.AWAKE&&in?this.wakeUp():e===Nh.SLEEPY&&t-this.timeLastSleepy>this.sleepTimeLimit&&(this.sleep(),this.dispatchEvent(Nh.sleepEvent))}}updateSolveMassProperties(){this.sleepState===Nh.SLEEPING||this.type===Nh.KINEMATIC?(this.invMassSolve=0,this.invInertiaSolve.setZero(),this.invInertiaWorldSolve.setZero()):(this.invMassSolve=this.invMass,this.invInertiaSolve.copy(this.invInertia),this.invInertiaWorldSolve.copy(this.invInertiaWorld))}pointToLocalFrame(t,e=new hh){return t.vsub(this.position,e),this.quaternion.conjugate().vmult(e,e),e}vectorToLocalFrame(t,e=new hh){return this.quaternion.conjugate().vmult(t,e),e}pointToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e.vadd(this.position,e),e}vectorToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e}addShape(t,e,i){const n=new hh,r=new xh;return e&&n.copy(e),i&&r.copy(i),this.shapes.push(t),this.shapeOffsets.push(n),this.shapeOrientations.push(r),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=this,this}removeShape(t){const e=this.shapes.indexOf(t);return-1===e?(console.warn("Shape does not belong to the body"),this):(this.shapes.splice(e,1),this.shapeOffsets.splice(e,1),this.shapeOrientations.splice(e,1),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=null,this)}updateBoundingRadius(){const t=this.shapes,e=this.shapeOffsets,i=t.length;let n=0;for(let r=0;r!==i;r++){const i=t[r];i.updateBoundingSphereRadius();const s=e[r].length(),a=i.boundingSphereRadius;s+a>n&&(n=s+a)}this.boundingRadius=n}updateAABB(){const t=this.shapes,e=this.shapeOffsets,i=this.shapeOrientations,n=t.length,r=zh,s=Dh,a=this.quaternion,o=this.aabb,l=Bh;for(let c=0;c!==n;c++){const n=t[c];a.vmult(e[c],r),r.vadd(this.position,r),a.mult(i[c],s),n.calculateWorldAABB(r,s,l.lowerBound,l.upperBound),0===c?o.copy(l):o.extend(l)}this.aabbNeedsUpdate=!1}updateInertiaWorld(t){const e=this.invInertia;if(e.x!==e.y||e.y!==e.z||t){const t=Fh,i=Oh;t.setRotationFromQuaternion(this.quaternion),t.transpose(i),t.scale(e,t),t.mmult(i,this.invInertiaWorld)}}applyForce(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;this.sleepState===Nh.SLEEPING&&this.wakeUp();const i=kh;e.cross(t,i),this.force.vadd(t,this.force),this.torque.vadd(i,this.torque)}applyLocalForce(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;const i=Hh,n=Uh;this.vectorToWorldFrame(t,i),this.vectorToWorldFrame(e,n),this.applyForce(i,n)}applyTorque(t){this.type===Nh.DYNAMIC&&(this.sleepState===Nh.SLEEPING&&this.wakeUp(),this.torque.vadd(t,this.torque))}applyImpulse(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;this.sleepState===Nh.SLEEPING&&this.wakeUp();const i=e,n=Vh;n.copy(t),n.scale(this.invMass,n),this.velocity.vadd(n,this.velocity);const r=Gh;i.cross(t,r),this.invInertiaWorld.vmult(r,r),this.angularVelocity.vadd(r,this.angularVelocity)}applyLocalImpulse(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;const i=Wh,n=jh;this.vectorToWorldFrame(t,i),this.vectorToWorldFrame(e,n),this.applyImpulse(i,n)}updateMassProperties(){const t=qh;this.invMass=this.mass>0?1/this.mass:0;const e=this.inertia,i=this.fixedRotation;this.updateAABB(),t.set((this.aabb.upperBound.x-this.aabb.lowerBound.x)/2,(this.aabb.upperBound.y-this.aabb.lowerBound.y)/2,(this.aabb.upperBound.z-this.aabb.lowerBound.z)/2),Rh.calculateInertia(t,this.mass,e),this.invInertia.set(e.x>0&&!i?1/e.x:0,e.y>0&&!i?1/e.y:0,e.z>0&&!i?1/e.z:0),this.updateInertiaWorld(!0)}getVelocityAtWorldPoint(t,e){const i=new hh;return t.vsub(this.position,i),this.angularVelocity.cross(i,e),this.velocity.vadd(e,e),e}integrate(t,e,i){if(this.previousPosition.copy(this.position),this.previousQuaternion.copy(this.quaternion),this.type!==Nh.DYNAMIC&&this.type!==Nh.KINEMATIC||this.sleepState===Nh.SLEEPING)return;const n=this.velocity,r=this.angularVelocity,s=this.position,a=this.force,o=this.torque,l=this.quaternion,c=this.invMass,h=this.invInertiaWorld,u=this.linearFactor,d=c*t;n.x+=a.x*d*u.x,n.y+=a.y*d*u.y,n.z+=a.z*d*u.z;const p=h.elements,f=this.angularFactor,m=o.x*f.x,g=o.y*f.y,v=o.z*f.z;r.x+=t*(p[0]*m+p[1]*g+p[2]*v),r.y+=t*(p[3]*m+p[4]*g+p[5]*v),r.z+=t*(p[6]*m+p[7]*g+p[8]*v),s.x+=n.x*t,s.y+=n.y*t,s.z+=n.z*t,l.integrate(this.angularVelocity,t,this.angularFactor,l),e&&(i?l.normalizeFast():l.normalize()),this.aabbNeedsUpdate=!0,this.updateInertiaWorld()}}Nh.idCounter=0,Nh.COLLIDE_EVENT_NAME="collide",Nh.DYNAMIC=1,Nh.STATIC=2,Nh.KINEMATIC=4,Nh.AWAKE=0,Nh.SLEEPY=1,Nh.SLEEPING=2,Nh.wakeupEvent={type:"wakeup"},Nh.sleepyEvent={type:"sleepy"},Nh.sleepEvent={type:"sleep"};const zh=new hh,Dh=new xh,Bh=new fh,Fh=new lh,Oh=new lh,kh=new hh,Hh=new hh,Uh=new hh,Vh=new hh,Gh=new hh,Wh=new hh,jh=new hh,qh=new hh;const Xh=new hh,Yh={keys:[]},Zh=[],Jh=[];new hh;class Qh extends class{constructor(){this.world=void 0,this.useBoundingBoxes=void 0,this.dirty=void 0,this.world=null,this.useBoundingBoxes=!1,this.dirty=!0}collisionPairs(t,e,i){throw new Error("collisionPairs not implemented for this BroadPhase class!")}needBroadphaseCollision(t,e){return 0!=(t.collisionFilterGroup&e.collisionFilterMask)&&0!=(e.collisionFilterGroup&t.collisionFilterMask)&&(0==(t.type&Nh.STATIC)&&t.sleepState!==Nh.SLEEPING||0==(e.type&Nh.STATIC)&&e.sleepState!==Nh.SLEEPING)}intersectionTest(t,e,i,n){this.useBoundingBoxes?this.doBoundingBoxBroadphase(t,e,i,n):this.doBoundingSphereBroadphase(t,e,i,n)}doBoundingSphereBroadphase(t,e,i,n){const r=Xh;e.position.vsub(t.position,r);const s=(t.boundingRadius+e.boundingRadius)**2;r.lengthSquared()i.lengthSquared()}aabbQuery(t,e,i){return console.warn(".aabbQuery is not implemented in this Broadphase subclass."),[]}}{constructor(){super()}collisionPairs(t,e,i){const n=t.bodies,r=n.length;let s,a;for(let t=0;t!==r;t++)for(let r=0;r!==t;r++)s=n[t],a=n[r],this.needBroadphaseCollision(s,a)&&this.intersectionTest(s,a,e,i)}aabbQuery(t,e,i=[]){for(let n=0;n{}}intersectWorld(t,e){return this.mode=e.mode||au.ANY,this.result=e.result||new $h,this.skipBackfaces=!!e.skipBackfaces,this.collisionFilterMask=void 0!==e.collisionFilterMask?e.collisionFilterMask:-1,this.collisionFilterGroup=void 0!==e.collisionFilterGroup?e.collisionFilterGroup:-1,this.checkCollisionResponse=void 0===e.checkCollisionResponse||e.checkCollisionResponse,e.from&&this.from.copy(e.from),e.to&&this.to.copy(e.to),this.callback=e.callback||(()=>{}),this.hasHit=!1,this.result.reset(),this.updateDirection(),this.getAABB(ou),lu.length=0,t.broadphase.aabbQuery(t,ou,lu),this.intersectBodies(lu),this.hasHit}intersectBody(t,e){e&&(this.result=e,this.updateDirection());const i=this.checkCollisionResponse;if(i&&!t.collisionResponse)return;if(0==(this.collisionFilterGroup&t.collisionFilterMask)||0==(t.collisionFilterGroup&this.collisionFilterMask))return;const n=uu,r=du;for(let e=0,s=t.shapes.length;et.boundingSphereRadius)return;const s=this[t.type];s&&s.call(this,t,e,i,n,t)}_intersectBox(t,e,i,n,r){return this._intersectConvex(t.convexPolyhedronRepresentation,e,i,n,r)}_intersectPlane(t,e,i,n,r){const s=this.from,a=this.to,o=this.direction,l=new hh(0,0,1);e.vmult(l,l);const c=new hh;s.vsub(i,c);const h=c.dot(l);if(a.vsub(i,c),h*c.dot(l)>0)return;if(s.distanceTo(a)=0&&t<=1&&(s.lerp(a,t,u),u.vsub(i,d),d.normalize(),this.reportIntersection(d,u,r,n,-1)),this.result.shouldStop)return;e>=0&&e<=1&&(s.lerp(a,e,u),u.vsub(i,d),d.normalize(),this.reportIntersection(d,u,r,n,-1))}}_intersectConvex(t,e,i,n,r,s){const a=Mu,o=Su,l=s&&s.faceList||null,c=t.faces,h=t.vertices,u=t.faceNormals,d=this.direction,p=this.from,f=this.to,m=p.distanceTo(f),g=l?l.length:c.length,v=this.result;for(let t=0;!v.shouldStop&&tm||this.reportIntersection(a,pu,r,n,s)}}}}_intersectTrimesh(t,e,i,n,r,s){const a=Eu,o=Pu,l=Iu,c=Su,h=Tu,u=Au,d=Lu,p=Ru,f=Cu,m=t.indices;t.vertices;const g=this.from,v=this.to,y=this.direction;l.position.copy(i),l.quaternion.copy(e),Mh.vectorToLocalFrame(i,e,y,h),Mh.pointToLocalFrame(i,e,g,u),Mh.pointToLocalFrame(i,e,v,d),d.x*=t.scale.x,d.y*=t.scale.y,d.z*=t.scale.z,u.x*=t.scale.x,u.y*=t.scale.y,u.z*=t.scale.z,d.vsub(u,h),h.normalize();const x=u.distanceSquared(d);t.tree.rayQuery(this,l,o);for(let s=0,l=o.length;!this.result.shouldStop&&s!==l;s++){const l=o[s];t.getNormal(l,a),t.getVertex(m[3*l],fu),fu.vsub(u,c);const d=h.dot(a),g=a.dot(c)/d;if(g<0)continue;h.scale(g,pu),pu.vadd(u,pu),t.getVertex(m[3*l+1],mu),t.getVertex(m[3*l+2],gu);const v=pu.distanceSquared(u);!au.pointInTriangle(pu,mu,fu,gu)&&!au.pointInTriangle(pu,fu,mu,gu)||v>x||(Mh.vectorToWorldFrame(e,a,f),Mh.pointToWorldFrame(i,e,pu,p),this.reportIntersection(f,p,r,n,l))}o.length=0}reportIntersection(t,e,i,n,r){const s=this.from,a=this.to,o=s.distanceTo(e),l=this.result;if(!(this.skipBackfaces&&t.dot(this.direction)>0))switch(l.hitFaceIndex=void 0!==r?r:-1,this.mode){case au.ALL:this.hasHit=!0,l.set(s,a,t,e,i,n,o),l.hasHit=!0,this.callback(l);break;case au.CLOSEST:(o=0&&(h=r*l-s*a)>=0&&c+he.maxForce&&(d=e.maxForce-m),y[t]+=d,p+=d>0?d:-d,e.addToWlambda(d)}if(p*pt;)e.pop();for(;e.length=0&&c.restitution>=0&&(a.restitution=l.restitution*c.restitution),a.si=r||i,a.sj=s||n,a}createFrictionEquationsFromContact(t,e){const i=t.bi,n=t.bj,r=t.si,s=t.sj,a=this.world,o=this.currentContactMaterial;let l=o.friction;const c=r.material||i.material,h=s.material||n.material;if(c&&h&&c.friction>=0&&h.friction>=0&&(l=c.friction*h.friction),l>0){const r=l*a.gravity.length();let s=i.invMass+n.invMass;s>0&&(s=1/s);const c=this.frictionEquationPool,h=c.length?c.pop():new td(i,n,r*s),u=c.length?c.pop():new td(i,n,r*s);return h.bi=u.bi=i,h.bj=u.bj=n,h.minForce=u.minForce=-r*s,h.maxForce=u.maxForce=r*s,h.ri.copy(t.ri),h.rj.copy(t.rj),u.ri.copy(t.ri),u.rj.copy(t.rj),t.ni.tangents(h.t,u.t),h.setSpookParams(o.frictionEquationStiffness,o.frictionEquationRelaxation,a.dt),u.setSpookParams(o.frictionEquationStiffness,o.frictionEquationRelaxation,a.dt),h.enabled=u.enabled=t.enabled,e.push(h,u),!0}return!1}createFrictionFromAverage(t){let e=this.result[this.result.length-1];if(!this.createFrictionEquationsFromContact(e,this.frictionResult)||1===t)return;const i=this.frictionResult[this.frictionResult.length-2],n=this.frictionResult[this.frictionResult.length-1];kd.setZero(),Hd.setZero(),Ud.setZero();const r=e.bi;e.bj;for(let i=0;i!==t;i++)e=this.result[this.result.length-1-i],e.bi!==r?(kd.vadd(e.ni,kd),Hd.vadd(e.ri,Hd),Ud.vadd(e.rj,Ud)):(kd.vsub(e.ni,kd),Hd.vadd(e.rj,Hd),Ud.vadd(e.ri,Ud));const s=1/t;Hd.scale(s,i.ri),Ud.scale(s,i.rj),n.ri.copy(i.ri),n.rj.copy(i.rj),kd.normalize(),kd.tangents(i.t,n.t)}getContacts(t,e,i,n,r,s,a){this.contactPointPool=r,this.frictionEquationPool=a,this.result=n,this.frictionResult=s;const o=Wd,l=jd,c=Vd,h=Gd;for(let n=0,r=t.length;n!==r;n++){const r=t[n],s=e[n];let a=null;r.material&&s.material&&(a=i.getContactMaterial(r.material,s.material)||null);const u=r.type&Nh.KINEMATIC&&s.type&Nh.STATIC||r.type&Nh.STATIC&&s.type&Nh.KINEMATIC||r.type&Nh.KINEMATIC&&s.type&Nh.KINEMATIC;for(let t=0;te.boundingSphereRadius+n.boundingSphereRadius)continue;let d=null;e.material&&n.material&&(d=i.getContactMaterial(e.material,n.material)||null),this.currentContactMaterial=d||a||i.defaultContactMaterial;const p=this[e.type|n.type];if(p){let t=!1;t=e.type0){const r=yp,s=xp;r.copy(d[(t+1)%3]),s.copy(d[(t+2)%3]);const a=r.length(),o=s.length();r.normalize(),s.normalize();const l=gp.dot(r),c=gp.dot(s);if(l-a&&c-o){const t=Math.abs(n-i-p);if((null===_||t<_)&&(_=t,w=l,b=c,y=i,m.copy(e),g.copy(r),v.copy(s),x++,h))return!0}}}if(x){f=!0;const r=this.createContactEquation(a,o,t,e,l,c);m.scale(-p,r.ri),r.ni.copy(m),r.ni.negate(r.ni),m.scale(y,m),g.scale(w,g),m.vadd(g,m),v.scale(b,v),m.vadd(v,r.rj),r.ri.vadd(i,r.ri),r.ri.vsub(a.position,r.ri),r.rj.vadd(n,r.rj),r.rj.vsub(o.position,r.rj),this.result.push(r),this.createFrictionEquationsFromContact(r,this.frictionResult)}let M=u.get();const S=bp;for(let r=0;2!==r&&!f;r++)for(let s=0;2!==s&&!f;s++)for(let u=0;2!==u&&!f;u++)if(M.set(0,0,0),r?M.vadd(d[0],M):M.vsub(d[0],M),s?M.vadd(d[1],M):M.vsub(d[1],M),u?M.vadd(d[2],M):M.vsub(d[2],M),n.vadd(M,S),S.vsub(i,S),S.lengthSquared()t.boundingSphereRadius+e.boundingSphereRadius)&&t.findSeparatingAxis(e,i,r,n,s,p,u,d)){const u=[],d=Hp;t.clipAgainstHull(i,r,e,n,s,p,-100,100,u);let f=0;for(let r=0;r!==u.length;r++){if(h)return!0;const s=this.createContactEquation(a,o,t,e,l,c),m=s.ri,g=s.rj;p.negate(s.ni),u[r].normal.negate(d),d.scale(u[r].depth,d),u[r].point.vadd(d,m),g.copy(u[r].point),m.vsub(i,m),g.vsub(n,g),m.vadd(i,m),m.vsub(a.position,m),g.vadd(n,g),g.vsub(o.position,g),this.result.push(s),f++,this.enableFrictionReduction||this.createFrictionEquationsFromContact(s,this.frictionResult)}this.enableFrictionReduction&&f&&this.createFrictionFromAverage(f)}}sphereConvex(t,e,i,n,r,s,a,o,l,c,h){const u=this.v3pool;i.vsub(n,Ep);const d=e.faceNormals,p=e.faces,f=e.vertices,m=t.radius;let g=!1;for(let r=0;r!==f.length;r++){const u=f[r],d=Cp;s.vmult(u,d),n.vadd(d,d);const p=Lp;if(d.vsub(i,p),p.lengthSquared()0){const r=[];for(let t=0,e=y.length;t!==e;t++){const e=u.get();s.vmult(f[y[t]],e),n.vadd(e,e),r.push(e)}if(mp(r,x,i)){if(h)return!0;g=!0;const s=this.createContactEquation(a,o,t,e,l,c);x.scale(-m,s.ri),x.negate(s.ni);const d=u.get();x.scale(-M,d);const p=u.get();x.scale(-m,p),i.vsub(n,s.rj),s.rj.vadd(p,s.rj),s.rj.vadd(d,s.rj),s.rj.vadd(n,s.rj),s.rj.vsub(o.position,s.rj),s.ri.vadd(i,s.ri),s.ri.vsub(a.position,s.ri),u.release(d),u.release(p),this.result.push(s),this.createFrictionEquationsFromContact(s,this.frictionResult);for(let t=0,e=r.length;t!==e;t++)u.release(r[t]);return}for(let d=0;d!==y.length;d++){const p=u.get(),g=u.get();s.vmult(f[y[(d+1)%y.length]],p),s.vmult(f[y[(d+2)%y.length]],g),n.vadd(p,p),n.vadd(g,g);const v=Tp;g.vsub(p,v);const x=Ap;v.unit(x);const w=u.get(),b=u.get();i.vsub(p,b);const _=b.dot(x);x.scale(_,w),w.vadd(p,w);const M=u.get();if(w.vsub(i,M),_>0&&_*_u.length||y>u[0].length)return;g<0&&(g=0),v<0&&(v=0),y<0&&(y=0),x<0&&(x=0),g>=u.length&&(g=u.length-1),v>=u.length&&(v=u.length-1),x>=u[0].length&&(x=u[0].length-1),y>=u[0].length&&(y=u[0].length-1);const w=[];e.getRectMinMax(g,y,v,x,w);const b=w[0],_=w[1];if(m.z-d>_||m.z+d2)return}}boxHeightfield(t,e,i,n,r,s,a,o,l,c,h){return t.convexPolyhedronRepresentation.material=t.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,this.convexHeightfield(t.convexPolyhedronRepresentation,e,i,n,r,s,a,o,t,e,h)}convexHeightfield(t,e,i,n,r,s,a,o,l,c,h){const u=e.data,d=e.elementSize,p=t.boundingSphereRadius,f=Qp,m=$p,g=Jp;Mh.pointToLocalFrame(n,s,i,g);let v=Math.floor((g.x-p)/d)-1,y=Math.ceil((g.x+p)/d)+1,x=Math.floor((g.y-p)/d)-1,w=Math.ceil((g.y+p)/d)+1;if(y<0||w<0||v>u.length||x>u[0].length)return;v<0&&(v=0),y<0&&(y=0),x<0&&(x=0),w<0&&(w=0),v>=u.length&&(v=u.length-1),y>=u.length&&(y=u.length-1),w>=u[0].length&&(w=u[0].length-1),x>=u[0].length&&(x=u[0].length-1);const b=[];e.getRectMinMax(v,x,y,w,b);const _=b[0],M=b[1];if(!(g.z-p>M||g.z+p<_))for(let l=v;l0&&y<0&&(m.vsub(u,g),f.copy(p),f.normalize(),x=g.dot(f),f.scale(x,g),g.vadd(u,g),g.distanceTo(m)0&&!0===n||h<=0&&!1===n))return!1;null===n&&(n=h>0)}return!0}const gp=new hh,vp=new hh,yp=new hh,xp=new hh,wp=[new hh,new hh,new hh,new hh,new hh,new hh],bp=new hh,_p=new hh,Mp=new hh,Sp=new hh,Ep=new hh,Tp=new hh,Ap=new hh,Lp=new hh,Cp=new hh,Rp=new hh,Pp=new hh,Ip=new hh,Np=new hh,zp=new hh,Dp=new hh,Bp=new hh,Fp=new hh,Op=new hh,kp=new hh,Hp=new hh,Up=new hh,Vp=new hh,Gp=new hh,Wp=new hh,jp=new xh,qp=new hh,Xp=new hh,Yp=new hh,Zp=new hh,Jp=new hh,Qp=new hh,$p=[0],Kp=new hh,tf=new hh;class ef{constructor(){this.current=void 0,this.previous=void 0,this.current=[],this.previous=[]}getKey(t,e){if(en[r];)r++;if(i!==n[r]){for(let t=n.length-1;t>=r;t--)n[t+1]=n[t];n[r]=i}}tick(){const t=this.current;this.current=this.previous,this.previous=t,this.current.length=0}getDiff(t,e){const i=this.current,n=this.previous,r=i.length,s=n.length;let a=0;for(let e=0;en[a];)a++;r=s===n[a],r||nf(t,s)}a=0;for(let t=0;ti[a];)a++;r=i[a]===s,r||nf(e,s)}}}function nf(t,e){t.push((4294901760&e)>>16,65535&e)}class rf{constructor(){this.data={keys:[]}}get(t,e){if(t>e){const i=e;e=t,t=i}return this.data[t+"-"+e]}set(t,e,i){if(t>e){const i=e;e=t,t=i}const n=t+"-"+e;this.get(t,e)||this.data.keys.push(n),this.data[n]=i}reset(){const t=this.data,e=t.keys;for(;e.length>0;)delete t[e.pop()]}}class sf extends yh{constructor(t={}){super(),this.dt=void 0,this.allowSleep=void 0,this.contacts=void 0,this.frictionEquations=void 0,this.quatNormalizeSkip=void 0,this.quatNormalizeFast=void 0,this.time=void 0,this.stepnumber=void 0,this.default_dt=void 0,this.nextId=void 0,this.gravity=void 0,this.broadphase=void 0,this.bodies=void 0,this.hasActiveBodies=void 0,this.solver=void 0,this.constraints=void 0,this.narrowphase=void 0,this.collisionMatrix=void 0,this.collisionMatrixPrevious=void 0,this.bodyOverlapKeeper=void 0,this.shapeOverlapKeeper=void 0,this.materials=void 0,this.contactmaterials=void 0,this.contactMaterialTable=void 0,this.defaultMaterial=void 0,this.defaultContactMaterial=void 0,this.doProfiling=void 0,this.profile=void 0,this.accumulator=void 0,this.subsystems=void 0,this.addBodyEvent=void 0,this.removeBodyEvent=void 0,this.idToBodyMap=void 0,this.dt=-1,this.allowSleep=!!t.allowSleep,this.contacts=[],this.frictionEquations=[],this.quatNormalizeSkip=void 0!==t.quatNormalizeSkip?t.quatNormalizeSkip:0,this.quatNormalizeFast=void 0!==t.quatNormalizeFast&&t.quatNormalizeFast,this.time=0,this.stepnumber=0,this.default_dt=1/60,this.nextId=0,this.gravity=new hh,t.gravity&&this.gravity.copy(t.gravity),this.broadphase=void 0!==t.broadphase?t.broadphase:new Qh,this.bodies=[],this.hasActiveBodies=!1,this.solver=void 0!==t.solver?t.solver:new od,this.constraints=[],this.narrowphase=new Od(this),this.collisionMatrix=new vh,this.collisionMatrixPrevious=new vh,this.bodyOverlapKeeper=new ef,this.shapeOverlapKeeper=new ef,this.materials=[],this.contactmaterials=[],this.contactMaterialTable=new rf,this.defaultMaterial=new rd("default"),this.defaultContactMaterial=new nd(this.defaultMaterial,this.defaultMaterial,{friction:.3,restitution:0}),this.doProfiling=!1,this.profile={solve:0,makeContactConstraints:0,broadphase:0,integrate:0,narrowphase:0},this.accumulator=0,this.subsystems=[],this.addBodyEvent={type:"addBody",body:null},this.removeBodyEvent={type:"removeBody",body:null},this.idToBodyMap={},this.broadphase.setWorld(this)}getContactMaterial(t,e){return this.contactMaterialTable.get(t.id,e.id)}numObjects(){return this.bodies.length}collisionMatrixTick(){const t=this.collisionMatrixPrevious;this.collisionMatrixPrevious=this.collisionMatrix,this.collisionMatrix=t,this.collisionMatrix.reset(),this.bodyOverlapKeeper.tick(),this.shapeOverlapKeeper.tick()}addConstraint(t){this.constraints.push(t)}removeConstraint(t){const e=this.constraints.indexOf(t);-1!==e&&this.constraints.splice(e,1)}rayTest(t,e,i){i instanceof $h?this.raycastClosest(t,e,{skipBackfaces:!0},i):this.raycastAll(t,e,{skipBackfaces:!0},i)}raycastAll(t,e,i={},n){return i.mode=au.ALL,i.from=t,i.to=e,i.callback=n,af.intersectWorld(this,i)}raycastAny(t,e,i={},n){return i.mode=au.ANY,i.from=t,i.to=e,i.result=n,af.intersectWorld(this,i)}raycastClosest(t,e,i={},n){return i.mode=au.CLOSEST,i.from=t,i.to=e,i.result=n,af.intersectWorld(this,i)}addBody(t){this.bodies.includes(t)||(t.index=this.bodies.length,this.bodies.push(t),t.world=this,t.initPosition.copy(t.position),t.initVelocity.copy(t.velocity),t.timeLastSleepy=this.time,t instanceof Nh&&(t.initAngularVelocity.copy(t.angularVelocity),t.initQuaternion.copy(t.quaternion)),this.collisionMatrix.setNumObjects(this.bodies.length),this.addBodyEvent.body=t,this.idToBodyMap[t.id]=t,this.dispatchEvent(this.addBodyEvent))}removeBody(t){t.world=null;const e=this.bodies.length-1,i=this.bodies,n=i.indexOf(t);if(-1!==n){i.splice(n,1);for(let t=0;t!==i.length;t++)i[t].index=t;this.collisionMatrix.setNumObjects(e),this.removeBodyEvent.body=t,delete this.idToBodyMap[t.id],this.dispatchEvent(this.removeBodyEvent)}}getBodyById(t){return this.idToBodyMap[t]}getShapeById(t){const e=this.bodies;for(let i=0;i=t&&r1e3*t)););this.accumulator=this.accumulator%t;const s=this.accumulator/t;for(let t=0;t!==this.bodies.length;t++){const e=this.bodies[t];e.previousPosition.lerp(e.position,s,e.interpolatedPosition),e.previousQuaternion.slerp(e.quaternion,s,e.interpolatedQuaternion),e.previousQuaternion.normalize()}this.time+=e}}internalStep(t){this.dt=t;const e=this.contacts,i=pf,n=ff,r=this.numObjects(),s=this.bodies,a=this.solver,o=this.gravity,l=this.doProfiling,c=this.profile,h=Nh.DYNAMIC;let u=-1/0;const d=this.constraints,p=df;o.length();const f=o.x,m=o.y,g=o.z;let v=0;for(l&&(u=of.now()),v=0;v!==r;v++){const t=s[v];if(t.type===h){const e=t.force,i=t.mass;e.x+=i*f,e.y+=i*m,e.z+=i*g}}for(let t=0,e=this.subsystems.length;t!==e;t++)this.subsystems[t].update();l&&(u=of.now()),i.length=0,n.length=0,this.broadphase.collisionPairs(this,i,n),l&&(c.broadphase=of.now()-u);let y=d.length;for(v=0;v!==y;v++){const t=d[v];if(!t.collideConnected)for(let e=i.length-1;e>=0;e-=1)(t.bodyA===i[e]&&t.bodyB===n[e]||t.bodyB===i[e]&&t.bodyA===n[e])&&(i.splice(e,1),n.splice(e,1))}this.collisionMatrixTick(),l&&(u=of.now());const x=uf,w=e.length;for(v=0;v!==w;v++)x.push(e[v]);e.length=0;const b=this.frictionEquations.length;for(v=0;v!==b;v++)p.push(this.frictionEquations[v]);for(this.frictionEquations.length=0,this.narrowphase.getContacts(i,n,this,e,x,this.frictionEquations,p),l&&(c.narrowphase=of.now()-u),l&&(u=of.now()),v=0;v=0&&r.material.friction>=0&&(n.material.friction,r.material.friction),n.material.restitution>=0&&r.material.restitution>=0&&(i.restitution=n.material.restitution*r.material.restitution)),a.addEquation(i),n.allowSleep&&n.type===Nh.DYNAMIC&&n.sleepState===Nh.SLEEPING&&r.sleepState===Nh.AWAKE&&r.type!==Nh.STATIC&&r.velocity.lengthSquared()+r.angularVelocity.lengthSquared()>=2*r.sleepSpeedLimit**2&&(n.wakeUpAfterNarrowphase=!0),r.allowSleep&&r.type===Nh.DYNAMIC&&r.sleepState===Nh.SLEEPING&&n.sleepState===Nh.AWAKE&&n.type!==Nh.STATIC&&n.velocity.lengthSquared()+n.angularVelocity.lengthSquared()>=2*n.sleepSpeedLimit**2&&(r.wakeUpAfterNarrowphase=!0),this.collisionMatrix.set(n,r,!0),this.collisionMatrixPrevious.get(n,r)||(hf.body=r,hf.contact=i,n.dispatchEvent(hf),hf.body=n,r.dispatchEvent(hf)),this.bodyOverlapKeeper.set(n.id,r.id),this.shapeOverlapKeeper.set(s.id,o.id)}for(this.emitContactEvents(),l&&(c.makeContactConstraints=of.now()-u,u=of.now()),v=0;v!==r;v++){const t=s[v];t.wakeUpAfterNarrowphase&&(t.wakeUp(),t.wakeUpAfterNarrowphase=!1)}for(y=d.length,v=0;v!==y;v++){const t=d[v];t.update();for(let e=0,i=t.equations.length;e!==i;e++){const i=t.equations[e];a.addEquation(i)}}a.solve(t,this),l&&(c.solve=of.now()-u),a.removeAllEquations();const M=Math.pow;for(v=0;v!==r;v++){const e=s[v];if(e.type&h){const i=M(1-e.linearDamping,t),n=e.velocity;n.scale(i,n);const r=e.angularVelocity;if(r){const i=M(1-e.angularDamping,t);r.scale(i,r)}}}for(this.dispatchEvent(cf),v=0;v!==r;v++){const t=s[v];t.preStep&&t.preStep.call(t)}l&&(u=of.now());const S=this.stepnumber%(this.quatNormalizeSkip+1)==0,E=this.quatNormalizeFast;for(v=0;v!==r;v++)s[v].integrate(t,S,E);for(this.clearForces(),this.broadphase.dirty=!0,l&&(c.integrate=of.now()-u),this.stepnumber+=1,this.dispatchEvent(lf),v=0;v!==r;v++){const t=s[v],e=t.postStep;e&&e.call(t)}let T=!0;if(this.allowSleep)for(T=!1,v=0;v!==r;v++){const t=s[v];t.sleepTick(this.time),t.sleepState!==Nh.SLEEPING&&(T=!0)}this.hasActiveBodies=T}emitContactEvents(){const t=this.hasAnyEventListener("beginContact"),e=this.hasAnyEventListener("endContact");if((t||e)&&this.bodyOverlapKeeper.getDiff(mf,gf),t){for(let t=0,e=mf.length;tDate.now()-t}const lf={type:"postStep"},cf={type:"preStep"},hf={type:Nh.COLLIDE_EVENT_NAME,body:null,contact:null},uf=[],df=[],pf=[],ff=[],mf=[],gf=[],vf={type:"beginContact",bodyA:null,bodyB:null},yf={type:"endContact",bodyA:null,bodyB:null},xf={type:"beginShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null},wf={type:"endShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null},bf={specular:1515554,color:15790320,shininess:60,flatShading:!0},_f={diceColor:"#202020",textColor:"#ffffff"};class Mf{constructor(t,e,i={diceColor:"#202020",textColor:"#aaaaaa"}){this.w=t,this.h=e,this.options=i,this.scale=50,this.labels=[" ","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"],this.options=Object.assign(Object.assign({},_f),i)}setColor({diceColor:t,textColor:e}){this.options.diceColor=t,this.options.textColor=e}get radius(){return this.scale*this.scaleFactor}get diceColor(){return this.options.diceColor}get textColor(){return this.options.textColor}get buffer(){return this.geometry.geometry}create(){this.geometry=new ir(this.getGeometry(),this.getMaterials()),this.geometry.receiveShadow=!0,this.geometry.castShadow=!0,this.body.position.set(0+2*this.radius*Math.random(),0+2*this.radius*Math.random(),0+4*this.radius),this.body.velocity.x=500*Math.random()*2-1,this.body.velocity.y=500*Math.random()*2-1,this.body.angularVelocity.x=100*Math.random(),this.body.angularVelocity.y=100*Math.random()}getGeometry(){let t=new Array(this.vertices.length);for(let e=0;e=0&&s=0&&i!==r+1?n.unshift([t,i],[e,s]):n.push([t,i],[e,s]),r=i)}4===n.length&&i.push([i[n[0][0]][n[0][1]],i[n[1][0]][n[1][1]],i[n[3][0]][n[3][1]],i[n[2][0]][n[2][1]],-1])}for(let t=0;t=0&&n<4){-1==--n&&(n=3);let s=i[t][n];if(e.indexOf(s)>=0){r.push(s);break}}}--s}r.push(-1),i.push(r)}return{vectors:e,faces:i}}makeGeometry(t,e){let i=new On;for(let e=0;e6&&("6"==e||"9"==e)&&n.fillText(" .",i.width/2,i.height/2);var a=new Xe(i);return a.needsUpdate=!0,a}clone(){return{body:new Nh({mass:this.mass,shape:this.shape}),geometry:this.geometry.clone()}}}class Sf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.sides=20,this.tab=-.2,this.af=-Math.PI/4/2,this.chamfer=.955,this.vertices=[],this.faces=[[0,11,5,1],[0,5,1,2],[0,1,7,3],[0,7,10,4],[0,10,11,5],[1,5,9,6],[5,11,4,7],[11,10,2,8],[10,7,6,9],[7,1,8,10],[3,9,4,11],[3,4,2,12],[3,2,6,13],[3,6,8,14],[3,8,9,15],[4,9,5,16],[2,4,11,17],[6,2,10,18],[8,6,7,19],[9,8,1,20]],this.scaleFactor=1,this.values=[...Array(20).keys()],this.margin=1,this.mass=400;let n=(1+Math.sqrt(5))/2;this.vertices=[[-1,n,0],[1,n,0],[-1,-n,0],[1,-n,0],[0,-1,n],[0,1,n],[0,-1,-n],[0,1,-n],[n,0,-1],[n,0,1],[-n,0,-1],[-n,0,1]],this.create()}}class Ef extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=350,this.sides=12,this.tab=.2,this.af=-Math.PI/4/2,this.chamfer=.968,this.vertices=[],this.faces=[[2,14,4,12,0,1],[15,9,11,19,3,2],[16,10,17,7,6,3],[6,7,19,11,18,4],[6,18,2,0,16,5],[18,11,9,14,2,6],[1,17,10,8,13,7],[1,13,5,15,3,8],[13,8,12,4,5,9],[5,4,14,9,15,10],[0,12,8,10,16,11],[3,19,7,17,1,12]],this.scaleFactor=.9,this.values=[...Array(12).keys()],this.margin=1;let n=(1+Math.sqrt(5))/2,r=1/n;this.vertices=[[0,r,n],[0,r,-n],[0,-r,n],[0,-r,-n],[n,0,r],[n,0,-r],[-n,0,r],[-n,0,-r],[r,n,0],[r,-n,0],[-r,n,0],[-r,-n,0],[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]],this.create()}}class Tf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=350,this.sides=10,this.tab=0,this.af=6*-Math.PI/5,this.chamfer=.945,this.vertices=[],this.faces=[[5,7,11,0],[4,2,10,1],[1,3,11,2],[0,8,10,3],[7,9,11,4],[8,6,10,5],[9,1,11,6],[2,0,10,7],[3,5,11,8],[6,4,10,9],[1,0,2,-1],[1,2,3,-1],[3,2,4,-1],[3,4,5,-1],[5,4,6,-1],[5,6,7,-1],[7,6,8,-1],[7,8,9,-1],[9,8,0,-1],[9,0,1,-1]],this.scaleFactor=.9,this.values=[...Array(10).keys()],this.margin=1;for(let t=0,e=0;t<10;++t,e+=2*Math.PI/10)this.vertices.push([Math.cos(e),Math.sin(e),.105*(t%2?1:-1)]);this.vertices.push([0,0,-1]),this.vertices.push([0,0,1]),this.create()}}class Af extends Mf{constructor(t,e,i=_f){super(t,e,i),this.labels=["","00","10","20","30","40","50","60","70","80","90"],this.sides=100,this.mass=350,this.tab=0,this.af=6*-Math.PI/5,this.chamfer=.945,this.vertices=[],this.faces=[[5,7,11,0],[4,2,10,1],[1,3,11,2],[0,8,10,3],[7,9,11,4],[8,6,10,5],[9,1,11,6],[2,0,10,7],[3,5,11,8],[6,4,10,9],[1,0,2,-1],[1,2,3,-1],[3,2,4,-1],[3,4,5,-1],[5,4,6,-1],[5,6,7,-1],[7,6,8,-1],[7,8,9,-1],[9,8,0,-1],[9,0,1,-1]],this.scaleFactor=.9,this.values=[...Array(10).keys()],this.margin=1;for(let t=0,e=0;t<10;++t,e+=2*Math.PI/10)this.vertices.push([Math.cos(e),Math.sin(e),.105*(t%2?1:-1)]);this.vertices.push([0,0,-1]),this.vertices.push([0,0,1]),this.create()}}class Lf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=340,this.sides=8,this.tab=0,this.af=-Math.PI/4/2,this.chamfer=.965,this.vertices=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],this.faces=[[0,2,4,1],[0,4,3,2],[0,3,5,3],[0,5,2,4],[1,3,4,5],[1,4,2,6],[1,2,5,7],[1,5,3,8]],this.scaleFactor=1,this.values=[...Array(8).keys()],this.margin=1.2,this.create()}}class Cf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=300,this.tab=.1,this.af=Math.PI/4,this.chamfer=.96,this.vertices=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]],this.faces=[[0,3,2,1,1],[1,2,6,5,2],[0,1,5,4,3],[3,7,6,2,4],[0,4,7,3,5],[4,5,6,7,6]],this.scaleFactor=.9,this.sides=6,this.margin=1,this.values=[...Array(6).keys()],this.create()}}class Rf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=300,this.tab=-.1,this.af=7*Math.PI/6,this.chamfer=.96,this.vertices=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],this.faces=[[1,0,2,1],[0,1,3,2],[0,3,2,3],[1,2,3,4]],this.scaleFactor=1.2,this.sides=4,this.margin=1,this.d4FaceTexts=[[[],[0,0,0],[2,4,3],[1,3,4],[2,1,4],[1,2,3]],[[],[0,0,0],[2,3,4],[3,1,4],[2,4,1],[3,2,1]],[[],[0,0,0],[4,3,2],[3,4,1],[4,2,1],[3,1,2]],[[],[0,0,0],[4,2,3],[1,4,3],[4,1,2],[1,3,2]]],this.faceTexts=this.d4FaceTexts[0],this.values=[...Array(4).keys()],this.create()}getMaterials(){let t=[];for(let e=0;et.geometry))),this.world.add(...this.current)):this.unload()}onload(){this.container.empty(),this.container.style.opacity="1",document.body.appendChild(this.container),this.renderer.shadowMap.enabled=this.shadows,this.renderer.shadowMap.type=2,this.container.appendChild(this.renderer.domElement),this.renderer.setClearColor(0,0),this.scene=new lo,this.initScene(),this.registerDomEvent(window,"resize",(()=>{this.initScene()})),this.initWorld()}start(){return t(this,void 0,void 0,(function*(){return new Promise((e=>t(this,void 0,void 0,(function*(){this.event.on("throw-finished",(t=>{e(t)})),this.animating=!0,this.render()}))))}))}enableShadows(){this.shadows=!0,this.renderer&&(this.renderer.shadowMap.enabled=this.shadows),this.light&&(this.light.castShadow=this.shadows),this.desk&&(this.desk.receiveShadow=this.shadows)}disableShadows(){this.shadows=!1,this.renderer&&(this.renderer.shadowMap.enabled=this.shadows),this.light&&(this.light.castShadow=this.shadows),this.desk&&(this.desk.receiveShadow=this.shadows)}get mw(){return Math.max(this.WIDTH,this.HEIGHT)}setDimensions(t){this.display.currentWidth=this.container.clientWidth/2,this.display.currentHeight=this.container.clientHeight/2,t?(this.display.containerWidth=t.w,this.display.containerHeight=t.h):(this.display.containerWidth=this.display.currentWidth,this.display.containerHeight=this.display.currentHeight),this.display.aspect=Math.min(this.display.currentWidth/this.display.containerWidth,this.display.currentHeight/this.display.containerHeight),this.display.scale=Math.sqrt(this.display.containerWidth*this.display.containerWidth+this.display.containerHeight*this.display.containerHeight)/13,this.renderer.setSize(2*this.display.currentWidth,2*this.display.currentHeight),this.cameraHeight.max=this.display.currentHeight/this.display.aspect/Math.tan(10*Math.PI/180),this.factory.width=this.display.currentWidth,this.factory.height=this.display.currentHeight,this.cameraHeight.medium=this.cameraHeight.max/1.5,this.cameraHeight.far=this.cameraHeight.max,this.cameraHeight.close=this.cameraHeight.max/2}initCamera(){this.camera&&this.scene.remove(this.camera),this.camera=new hr(20,this.display.currentWidth/this.display.currentHeight,1,1.3*this.cameraHeight.max),this.camera.position.z=this.cameraHeight.far,this.camera.lookAt(new Ke(0,0,0))}initLighting(){const t=Math.max(this.display.containerWidth,this.display.containerHeight);this.light&&this.scene.remove(this.light),this.ambientLight&&this.scene.remove(this.ambientLight),this.light=new Pc(this.colors.spotlight,1),this.light.position.set(-t/2,t/2,3*t),this.light.target.position.set(0,0,0),this.light.distance=5*t,this.light.angle=Math.PI/4,this.light.castShadow=this.shadows,this.light.shadow.camera.near=t/10,this.light.shadow.camera.far=5*t,this.light.shadow.camera.fov=50,this.light.shadow.bias=.001,this.light.shadow.mapSize.width=1024,this.light.shadow.mapSize.height=1024,this.scene.add(this.light),this.ambientLight=new Fc(16777215,.9),this.scene.add(this.ambientLight)}initDesk(){this.desk&&this.scene.remove(this.desk);let t=new Jl;t.opacity=.5,this.desk=new ir(new Sr(6*this.display.containerWidth,6*this.display.containerHeight,1,1),t),this.desk.receiveShadow=this.shadows,this.scene.add(this.desk)}initScene(){this.setDimensions(),this.initCamera(),this.initLighting(),this.initDesk(),this.camera.updateProjectionMatrix(),this.renderer.render(this.scene,this.camera)}initWorld(){this.world=new If(this.WIDTH,this.HEIGHT),this.iterations=0}render(){var t,e,i;if(this.throwFinished()){const n={};let r=null!==(t=this.current.filter((t=>t instanceof Of&&t.isPercentile)))&&void 0!==t?t:[];r.length%2!=0&&(r[r.length-1].isPercentile=!1,r.pop());for(let t=0;tt.geometry)))}this.current=this.current.filter((t=>!(t instanceof Of&&t.isPercentile))),this.current.forEach((t=>{var e;n[t.sides]=[...null!==(e=n[t.sides])&&void 0!==e?e:[],t.getUpsideValue()]}));const s=Object.entries(n).sort(((t,e)=>e[0]-t[0]));return this.event.trigger("throw-finished",s),void this.registerInterval(window.setTimeout((()=>{this.container.style.opacity="0",this.registerInterval(window.setTimeout((()=>{this.animating=!1,this.unload()}),1e3))}),2e3))}this.animation=requestAnimationFrame((()=>this.render())),this.world.step(this.frame_rate),this.iterations++,this.current.forEach((t=>{t.set()})),this.renderer.render(this.scene,this.camera)}dispose(...t){t.forEach((t=>{"dispose"in t&&t.dispose(),t.children&&this.dispose(...t.children)}))}detach(){}onunload(){cancelAnimationFrame(this.animation),this.container.detach(),this.container.empty(),this.renderer.domElement.detach(),this.renderer.dispose(),this.factory.dispose(),this.ambientLight.dispose(),this.light.dispose(),this.scene.children.forEach((t=>this.dispose(t))),this.scene.remove(this.scene,...this.scene.children,...this.current.map((t=>t.geometry))),this.current.forEach((t=>{[...Array.isArray(t.geometry.material)?t.geometry.material:[t.geometry.material]].forEach((t=>t&&t.dispose())),this.world.world.removeBody(t.body)})),this.current=[]}onThrowFinished(){}throwFinished(){let t=!0;if(this.iterations<10/this.frame_rate)for(let e=0;e3){i.stopped=!0;continue}}else i.stopped=this.iterations;t=!1}else i.stopped=void 0,t=!1}return t}}class If{constructor(t,e){this.WIDTH=t,this.HEIGHT=e,this.world=new sf({gravity:new hh(0,0,-3928)}),this.ground=this.getPlane(),this.diceMaterial=new rd,this.deskMaterial=new rd,this.barrierMaterial=new rd,this.world.broadphase=new Qh,this.world.allowSleep=!0,this.ground.position.set(0,0,0),this.world.addBody(this.ground),this.buildWalls()}add(...t){t.forEach((t=>{this.world.addBody(t.body)}))}step(t=1/60){const e=performance.now()/1e3;if(this.lastCallTime){const i=e-this.lastCallTime;this.world.step(t,i)}else this.world.step(t);this.lastCallTime=e}buildWalls(){this.world.addContactMaterial(new nd(this.deskMaterial,this.diceMaterial,{friction:.01,restitution:.5})),this.world.addContactMaterial(new nd(this.barrierMaterial,this.diceMaterial,{friction:0,restitution:1})),this.world.addContactMaterial(new nd(this.diceMaterial,this.diceMaterial,{friction:0,restitution:.5})),this.world.addBody(new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.deskMaterial}));let t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial});t.quaternion.setFromAxisAngle(new hh(1,0,0),Math.PI/2),t.position.set(0,.93*this.HEIGHT,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(1,0,0),-Math.PI/2),t.position.set(0,.93*-this.HEIGHT,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(0,1,0),-Math.PI/2),t.position.set(.93*this.WIDTH,0,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(0,1,0),Math.PI/2),t.position.set(.93*-this.WIDTH,0,0),this.world.addBody(t)}getPlane(){return new Nh({type:Nh.STATIC,shape:new sd})}}const Nf={pos:{x:0+100*Math.random(),y:0+100*Math.random(),z:100},velocity:{x:500*Math.random()*2-1,y:500*Math.random()*2-1,z:0},angular:{x:100*Math.random(),y:100*Math.random(),z:100*Math.random()},axis:{x:Math.random(),y:Math.random(),z:Math.random(),w:Math.random()}};class zf{constructor(t,e,i){this.w=t,this.h=e,this.data=i,this.scale=50,this.stopped=!1,this.iteration=0,this.vector=Object.assign({},Nf),this.geometry=i.geometry,this.body=i.body}generateVector(t){const e=Math.sqrt(t.x*t.x+t.y*t.y),i=(Math.random()+3)*e,n={x:t.x/e,y:t.y/e},r=this.makeRandomVector(n),s={x:this.w*(r.x>0?-1:1)*.9,y:this.h*(r.y>0?-1:1)*.9,z:200*Math.random()+200},a=Math.abs(r.x/r.y);a>1?s.y/=a:s.x*=a;const o=this.makeRandomVector(n);return{pos:s,velocity:{x:o.x*i,y:o.y*i,z:-10},angular:{x:-(Math.random()*r.y*5+this.inertia*r.y),y:Math.random()*r.x*5+this.inertia*r.x,z:0},axis:{x:Math.random(),y:Math.random(),z:Math.random(),w:Math.random()}}}makeRandomVector(t){const e=Math.random()*Math.PI/5-Math.PI/5/2,i={x:t.x*Math.cos(e)-t.y*Math.sin(e),y:t.x*Math.sin(e)+t.y*Math.cos(e)};return 0==i.x&&(i.x=.01),0==i.y&&(i.y=.01),i}get buffer(){return this.geometry.geometry}getUpsideValue(){let t,e=new Ke(0,0,4==this.sides?-1:1),i=2*Math.PI;const n=this.buffer.getAttribute("normal").array;for(let r=0,s=this.buffer.groups.length;rthis.sides;)r-=this.sides;for(;r<1;)r+=this.sides;e.groups[n].materialIndex=r+1}}this.updateMaterialsForValue(t-i),this.geometry.geometry=e}resetBody(){this.body.vlambda=new hh,this.body.position=new hh,this.body.previousPosition=new hh,this.body.initPosition=new hh,this.body.velocity=new hh,this.body.initVelocity=new hh,this.body.force=new hh,this.body.torque=new hh,this.body.quaternion=new xh,this.body.initQuaternion=new xh,this.body.angularVelocity=new hh,this.body.initAngularVelocity=new hh,this.body.interpolatedPosition=new hh,this.body.interpolatedQuaternion=new xh,this.body.inertia=new hh,this.body.invInertia=new hh,this.body.invInertiaWorld=new lh,this.body.invInertiaSolve=new hh,this.body.invInertiaWorldSolve=new lh,this.body.wlambda=new hh,this.body.updateMassProperties()}updateMaterialsForValue(t){}set(){this.geometry.position.set(this.body.position.x,this.body.position.y,this.body.position.z),this.geometry.quaternion.set(this.body.quaternion.x,this.body.quaternion.y,this.body.quaternion.z,this.body.quaternion.w)}create(){this.body.position.set(this.vector.pos.x,this.vector.pos.y,this.vector.pos.z),this.body.quaternion.setFromAxisAngle(new hh(this.vector.axis.x,this.vector.axis.y,this.vector.axis.z),this.vector.axis.w*Math.PI*2),this.body.angularVelocity.set(this.vector.angular.x,this.vector.angular.y,this.vector.angular.z),this.body.velocity.set(this.vector.velocity.x,this.vector.velocity.y,this.vector.velocity.z),this.body.linearDamping=.1,this.body.angularDamping=.1}}class Df extends e.Component{constructor(t,e,i){super(),this.width=t,this.height=e,this.plugin=i,this.d100=new Af(this.width,this.height,this.colors),this.d20=new Sf(this.width,this.height,this.colors),this.d12=new Ef(this.width,this.height,this.colors),this.d10=new Tf(this.width,this.height,this.colors),this.d8=new Lf(this.width,this.height,this.colors),this.d6=new Cf(this.width,this.height,this.colors),this.d4=new Rf(this.width,this.height,this.colors)}get colors(){return{diceColor:this.plugin.data.diceColor,textColor:this.plugin.data.textColor}}updateColors(){this.dispose(),this.d100=new Af(this.width,this.height,this.colors),this.d20=new Sf(this.width,this.height,this.colors),this.d12=new Ef(this.width,this.height,this.colors),this.d10=new Tf(this.width,this.height,this.colors),this.d8=new Lf(this.width,this.height,this.colors),this.d6=new Cf(this.width,this.height,this.colors),this.d4=new Rf(this.width,this.height,this.colors)}onunload(){this.dispose()}disposeChildren(...t){t.forEach((t=>{"dispose"in t&&t.dispose(),t.children&&this.disposeChildren(...t.children)}))}dispose(){this.disposeChildren(this.d100.geometry.children),this.disposeChildren(this.d20.geometry.children),this.disposeChildren(this.d12.geometry.children),this.disposeChildren(this.d10.geometry.children),this.disposeChildren(this.d8.geometry.children),this.disposeChildren(this.d6.geometry.children),this.disposeChildren(this.d4.geometry.children)}getDice(t,e){const i=[];for(const n of t)switch(n.faces.max){case 4:i.push(...new Array(n.rolls).fill(0).map((t=>new Uf(this.width,this.height,this.d4.clone(),e))));break;case 6:i.push(...new Array(n.rolls).fill(0).map((t=>new Hf(this.width,this.height,this.d6.clone(),e))));break;case 8:i.push(...new Array(n.rolls).fill(0).map((t=>new kf(this.width,this.height,this.d8.clone(),e))));break;case 10:i.push(...new Array(n.rolls).fill(0).map((t=>new Of(this.width,this.height,this.d10.clone(),e))));break;case 12:i.push(...new Array(n.rolls).fill(0).map((t=>new Ff(this.width,this.height,this.d12.clone(),e))));break;default:i.push(...new Array(n.rolls).fill(0).map((t=>new Bf(this.width,this.height,this.d20.clone(),e))));break;case 100:i.push(...new Array(n.rolls).fill(0).map((t=>[new Of(this.width,this.height,this.d100.clone(),e,!0),new Of(this.width,this.height,this.d10.clone(),e,!0)])).flat())}return i}}class Bf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=20,this.inertia=6,n&&(this.vector=this.generateVector(n)),this.create()}}class Ff extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=12,this.inertia=8,n&&(this.vector=this.generateVector(n)),this.create()}}class Of extends zf{constructor(t,e,i,n,r=!1){super(t,e,i),this.w=t,this.h=e,this.data=i,this.isPercentile=r,this.sides=10,this.inertia=9,n&&(this.vector=this.generateVector(n)),this.create()}}class kf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=8,this.inertia=10,n&&(this.vector=this.generateVector(n)),this.create()}}class Hf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=6,this.inertia=13,n&&(this.vector=this.generateVector(n)),this.create()}}class Uf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=4,this.inertia=5,n&&(this.vector=this.generateVector(n)),this.create()}}const Vf="DICE_ROLLER_VIEW";(0,e.addIcon)("d4",''),(0,e.addIcon)("d6",''),(0,e.addIcon)("d8",''),(0,e.addIcon)("d10",''),(0,e.addIcon)("d12",''),(0,e.addIcon)("d20",''),(0,e.addIcon)("d100",''),(0,e.addIcon)("dice-roller-save",''),(0,e.addIcon)("dice-roller-plus",''),(0,e.addIcon)("dice-roller-minus",'');class Gf extends e.ItemView{constructor(t,e){super(e),this.plugin=t,this.leaf=e,this.dice=Gf.DICE(),this.custom="",this.adv=!1,this.dis=!1,this.add=0,this.renderer=new Pf(this.plugin),this.contentEl.addClass("dice-roller-view"),this.registerEvent(this.plugin.app.workspace.on("dice-roller:update-colors",(()=>{this.renderer.factory.updateColors()})))}static DICE(){return{d4:0,d6:0,d8:0,d10:0,d12:0,d20:0,d100:0}}onOpen(){return t(this,void 0,void 0,(function*(){this.display()}))}display(){return t(this,void 0,void 0,(function*(){this.contentEl.empty(),this.gridEl=this.contentEl.createDiv("dice-roller-grid"),this.formulaEl=this.contentEl.createDiv("dice-roller-formula");const t=this.contentEl.createDiv("dice-roller-results-container");t.createEl("h4",{text:"Results"}),this.resultEl=t.createDiv("dice-roller-results"),this.noResultsEl=this.resultEl.createSpan({text:"No results yet! Roll some dice to get started :)"}),this.buildButtons(),this.buildFormula()}))}buildButtons(){this.gridEl.empty();const i=this.gridEl.createDiv("dice-buttons");for(let n in this.dice)new e.ExtraButtonComponent(i.createDiv("dice-button")).setIcon(n).extraSettingsEl.onclick=e=>t(this,void 0,void 0,(function*(){let t=e.getModifierState("Shift")?-1:1;this.dice[n]+=t,this.setFormula();const i=yield this.plugin.getRoller(this.formulaComponent.inputEl.value,"view");i instanceof jt&&(this.stack=i)}));const n=this.gridEl.createDiv("advantage-disadvantage"),r=new e.ButtonComponent(n).setButtonText("ADV").onClick((()=>{this.adv=!this.adv,this.dis=!1,this.adv?(r.setCta(),s.removeCta()):r.removeCta(),this.setFormula()})),s=new e.ButtonComponent(n).setButtonText("DIS").onClick((()=>{this.dis=!this.dis,this.dis?(s.setCta(),r.removeCta()):s.removeCta(),this.adv=!1,this.setFormula()})),a=this.gridEl.createDiv("dice-context").createDiv("add-subtract");new e.ExtraButtonComponent(a).setIcon("dice-roller-minus").onClick((()=>{this.add-=1,o.setValue(`${this.add}`),this.setFormula()}));const o=new e.TextComponent(a).setValue(`${this.add?this.add:""}`).onChange((t=>{isNaN(Number(t))||(this.add=Number(t)),this.setFormula()}));new e.ExtraButtonComponent(a).setIcon("dice-roller-plus").onClick((()=>{this.add+=1,o.setValue(`${this.add}`),this.setFormula()}))}buildFormula(){this.formulaEl.empty(),this.formulaComponent=new e.TextAreaComponent(this.formulaEl).setPlaceholder("Dice Formula"),this.formulaComponent.onChange((0,e.debounce)((e=>t(this,void 0,void 0,(function*(){}))),500,!0));const i=new e.ButtonComponent(this.formulaEl).setIcon(Ft).setCta().setTooltip("Roll").onClick((()=>t(this,void 0,void 0,(function*(){i.setDisabled(!0);const t=yield this.plugin.getRoller(this.formulaComponent.inputEl.value,"view");if(!(t instanceof jt))return void new e.Notice("The Dice View only supports dice rolls.");yield t.roll();let n=t.resultText;if(this.plugin.data.renderer){this.addChild(this.renderer),this.renderer.setDice(t.dice);const e=yield this.renderer.start();let i=0;n=t.original;for(let t=0;te!=t?`${e}d`:`${e}`))}]`}else i+=r[1].reduce(((t,e)=>t+e)),s=`[${r[1]}]`;n=n.replace(new RegExp(`\\d+d${r[0]}`),s)}t.result=i}i.setDisabled(!1),this.addResult({result:t.result,original:t.original,resultText:n}),this.dice=Gf.DICE(),this.add=null,this.adv=!1,this.dis=!1,this.buildButtons(),this.setFormula()}))));i.buttonEl.addClass("dice-roller-roll")}addResult(i){this.noResultsEl&&this.noResultsEl.detach();const n=createDiv("view-result");n.createSpan({text:i.original}),n.createEl("strong",{text:`${i.result}`,attr:{"aria-label":i.resultText}});const r=n.createDiv("result-context");r.createEl("em",{text:(new Date).toLocaleString()}),new e.ExtraButtonComponent(r).setIcon("trash").onClick((()=>{n.detach(),0===this.resultEl.children.length&&this.resultEl.prepend(this.noResultsEl)})),new e.ExtraButtonComponent(r).setIcon(Ot).setTooltip("Copy Result").onClick((()=>t(this,void 0,void 0,(function*(){yield navigator.clipboard.writeText(`${i.result}`)})))).extraSettingsEl.addClass("dice-content-copy"),this.resultEl.prepend(n)}get formulaString(){const t=[],e=Object.entries(this.dice).filter((([t,e])=>0!=e));if(!e.length)return"";e.sort(((t,e)=>Number(e[0].slice(1))-Number(t[0].slice(1))));const i=e.shift();return t.push(`${i[1]}${i[0]}`),this.adv?t.push("kh"):this.dis&&t.push("dh"),e.length&&t.push(...e.map((([t,e])=>`${e>0?"+":"-"}${Math.abs(e)}${t}`))),this.add&&0!=this.add&&(t.push(this.add>0?"+":"-"),t.push(Math.abs(this.add))),t.join("")}setFormula(){this.formulaComponent.setValue(this.formulaString)}getDisplayText(){return"Dice Roller"}getViewType(){return Vf}getIcon(){return Ft}onClose(){const e=Object.create(null,{onClose:{get:()=>super.onClose}});return t(this,void 0,void 0,(function*(){yield e.onClose.call(this),this.renderer.unload()}))}}String.prototype.matchAll=String.prototype.matchAll||function*(t){const e=t.global?t.flags:t.flags+"g",i=new RegExp(t,e);let n;for(;n=i.exec(this);)yield n};const Wf={returnAllTags:!0,rollLinksForTags:!1,copyContentButton:!0,displayResultsInline:!1,formulas:{},persistResults:!1,results:{},defaultRoll:1,defaultFace:100,renderer:!1,diceColor:"#202020",textColor:"#ffffff"};class jf extends e.Plugin{constructor(){super(...arguments),this.persistingFiles=new Set,this.operators={"+":(t,e)=>t+e,"-":(t,e)=>t-e,"*":(t,e)=>t*e,"/":(t,e)=>t/e,"^":(t,e)=>Math.pow(t,e)}}get view(){const t=this.app.workspace.getLeavesOfType(Vf),e=t.length?t[0]:null;if(e&&e.view&&e.view instanceof Gf)return e.view}addDiceView(){return t(this,void 0,void 0,(function*(){this.app.workspace.getLeavesOfType(Vf).length||(yield this.app.workspace.getRightLeaf(!1).setViewState({type:Vf}),this.app.workspace.revealLeaf(this.view.leaf))}))}onload(){return t(this,void 0,void 0,(function*(){console.log("DiceRoller plugin loaded"),this.data=Object.assign(Wf,yield this.loadData()),this.addSettingTab(new $t(this.app,this)),this.registerView(Vf,(t=>new Gf(this,t))),this.app.workspace.onLayoutReady((()=>this.addDiceView())),this.addCommand({id:"open-view",name:"Open Dice View",checkCallback:t=>{if(!this.view)return t||this.addDiceView(),!0}});const i=Lt(a).html[0];(0,e.addIcon)(Ft,i);const n=Lt(o).html[0];(0,e.addIcon)(Ot,n),this.registerMarkdownPostProcessor(((i,n)=>t(this,void 0,void 0,(function*(){var r;let s=i.querySelectorAll("code");if(!s.length)return;const a=n.sourcePath,o=n.getSectionInfo(i),l=null===(r=n.getSectionInfo(i))||void 0===r?void 0:r.lineStart,c=this.app.vault.getAbstractFileByPath(n.sourcePath);if(!(c&&c instanceof e.TFile&&o))return;const h={};for(let i=0;it(this,void 0,void 0,(function*(){var t,e,o,c;if(yield s.roll(),this.data.persistResults&&!/dice\-/.test(r.innerText)||/dice\+/.test(r.innerText)){this.persistingFiles.add(n.sourcePath),h[i]=s;const r=null!==(c=null===(o=null===(e=null===(t=this.data.results)||void 0===t?void 0:t[a])||void 0===e?void 0:e[l])||void 0===o?void 0:o[i])&&void 0!==c?c:null;r&&(yield s.applyResult(r))}r.replaceWith(s.containerEl)}));s.loaded?yield o():s.on("loaded",(()=>t(this,void 0,void 0,(function*(){yield o()}))))}catch(t){console.error(t),new e.Notice(`There was an error parsing the dice string: ${r.innerText}.\n\n${t}`,5e3);continue}}if(a in this.data.results&&(this.data.results[a][l]={}),Object.entries(h).length){const r=this.app.workspace.getActiveViewOfType(e.MarkdownView);if(r){const e=this;let s=function(t,e){const i=Object.keys(e).map((i=>function(t,e,i){const n=t[e],r=t.hasOwnProperty(e);let s=i(n);return n&&Object.setPrototypeOf(s,n),Object.setPrototypeOf(a,s),t[e]=a,o;function a(...i){return s===n&&t[e]===a&&o(),s.apply(this,i)}function o(){t[e]===a&&(r?t[e]=n:delete t[e]),s!==n&&(s=n,Object.setPrototypeOf(a,n||Function))}}(t,i,e[i])));return 1===i.length?i[0]:function(){i.forEach((t=>t()))}}(r,{onUnloadFile:function(r){return function(o){var l,u,d,p;return t(this,void 0,void 0,(function*(){if(o=c){e.persistingFiles.has(a)&&(e.persistingFiles.delete(a),e.data.results[a]={});for(let t in h){const r=h[t],s=null===(l=n.getSectionInfo(i))||void 0===l?void 0:l.lineStart;if(null==s)continue;const o={[s]:Object.assign(Object.assign({},null!==(d=null===(u=e.data.results[a])||void 0===u?void 0:u[s])&&void 0!==d?d:{}),{[t]:r.toResult()})};e.data.results[a]=Object.assign(Object.assign({},null!==(p=e.data.results[a])&&void 0!==p?p:{}),o),yield e.saveSettings()}}return s(),yield r.call(this,o)}))}}});r.register(s),r.register((()=>t(this,void 0,void 0,(function*(){var t,e,r,s;this.persistingFiles.has(a)&&(this.persistingFiles.delete(a),this.data.results[a]={});for(let o in h){const l=h[o],c=null===(t=n.getSectionInfo(i))||void 0===t?void 0:t.lineStart;if(null==c)continue;const u={[c]:Object.assign(Object.assign({},null!==(r=null===(e=this.data.results[a])||void 0===e?void 0:e[c])&&void 0!==r?r:{}),{[o]:l.toResult()})};this.data.results[a]=Object.assign(Object.assign({},null!==(s=this.data.results[a])&&void 0!==s?s:{}),u),yield this.saveSettings()}}))))}}})))),this.lexer=new(s()),this.addLexerRules();var r={precedence:2,associativity:"left"},l={precedence:1,associativity:"left"};this.parser=new Ct({"+":l,"-":l,"*":r,"/":r,"^":{precedence:3,associativity:"right"}})}))}parseDice(e,i){return t(this,void 0,void 0,(function*(){const t=this.getRoller(e,i);return{result:yield t.roll(),roller:t}}))}clearEmpties(t){for(var e in t)t[e]&&"object"==typeof t[e]&&(this.clearEmpties(t[e]),0===Object.keys(t[e]).length&&delete t[e])}saveSettings(){return t(this,void 0,void 0,(function*(){this.clearEmpties(this.data.results),yield this.saveData(this.data)}))}getRoller(t,e){t in this.data.formulas&&(t=this.data.formulas[t]);const i=this.parse(t);switch(this.getTypeFromLexemes(i)){case"dice":return new jt(this,t,i);case"table":return new Zt(this,t,i[0],e);case"section":return new qt(this,t,i[0],e);case"tag":if(!this.app.plugins.plugins.dataview)throw new Error("Tags are only supported with the Dataview plugin installed.");return new Xt(this,t,i[0],e);case"link":return new Yt(this,t,i[0],e)}}getTypeFromLexemes(t){return t.some((({type:t})=>"table"===t))?"table":t.some((({type:t})=>"section"===t))?"section":t.some((({type:t})=>"tag"===t))?"tag":t.some((({type:t})=>"link"===t))?"link":"dice"}addLexerRules(){this.lexer.addRule(/\s+/,(function(){})),this.lexer.addRule(/[{}]+/,(function(){})),this.lexer.addRule(Pt,(function(t){return{type:"table",data:t,original:t,conditionals:null}})),this.lexer.addRule(It,(function(t){return{type:"section",data:t,original:t,conditionals:null}})),this.lexer.addRule(Rt,(t=>{var e;const{groups:i}=t.match(Rt);let n="tag";return("link"===i.types||this.data.rollLinksForTags&&!(null===(e=i.types)||void 0===e?void 0:e.length))&&(n="link"),{type:n,data:t,original:t,conditionals:null}})),this.lexer.addRule(zt,(function(t){const{dice:e,conditional:i}=t.match(zt).groups;let n=[];if(i){let t=i.matchAll(Bt);if(t)for(let e of t){if(!e)continue;const{comparer:t,operator:i}=e.groups;n.push({comparer:Number(t),operator:i})}}return{type:"dice",data:e,original:t,conditionals:n}})),this.lexer.addRule(Dt,(t=>{const{roll:e=this.data.defaultRoll,faces:i=this.data.defaultFace,conditional:n}=t.match(Dt).groups;let r=[];if(n){let t=n.matchAll(Bt);if(t)for(let e of t){if(!e)continue;const{comparer:t,operator:i}=e.groups;r.push({comparer:Number(t),operator:i})}}return{type:"dice",data:`${e}d${i}`,original:t,conditionals:r}})),this.lexer.addRule(Nt,(function(t){return{type:"math",data:t,original:t,conditionals:null}})),this.lexer.addRule(/1[Dd]S/,(function(t){var e;const[,i]=null!==(e=t.match(/1[Dd]S/))&&void 0!==e?e:[,"1"];return{type:"stunt",data:i,original:t,conditionals:[]}})),this.lexer.addRule(/kh?(?!:l)(\d*)/,(function(t){return{type:"kh",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/dl?(?!:h)\d*/,(function(t){return{type:"dl",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/kl\d*/,(function(t){return{type:"kl",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/dh\d*/,(function(t){return{type:"dh",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/!!(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/!!(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?=|=!|>=?|<=?)(-?\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/!!i/.test(t)&&(e="100"),{type:"!!",data:e,original:t,conditionals:i}})),this.lexer.addRule(/!(i|\d+)?(?:(!?=|=!?|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/!(i|\d+)?(?:(!?=|=!?|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?=|=!|>=?|<=?)(\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!?|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/!i/.test(t)&&(e="100"),{type:"!",data:e,original:t,conditionals:i}})),this.lexer.addRule(/r(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/r(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?={1,2}|>=?|<=?)(-?\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/ri/.test(t)&&(e="100"),{type:"r",data:e,original:t,conditionals:i}}))}onunload(){console.log("DiceRoller unloaded"),this.app.workspace.getLeavesOfType(Vf).forEach((t=>t.detach())),"__THREE__"in window&&delete window.__THREE__}parse(t){this.lexer.setInput(t);for(var e,i=[];e=this.tryLex();)i.push(e);return this.parser.parse(i)}tryLex(){try{return this.lexer.lex()}catch(t){}}}})();var r=exports;for(var s in n)r[s]=n[s];n.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})(); \ No newline at end of file +(()=>{var t={885:t=>{function e(t){"function"!=typeof t&&(t=e.defunct);var i=[],n=[],r=0;function s(){for(var t=[],e=0,i=this.state,r=this.index,s=this.input,a=0,o=n.length;a=0||i%2&&1===h&&!c[0]){var u=l.pattern;u.lastIndex=r;var d=u.exec(s);if(d&&d.index===r){var p=t.push({result:d,action:l.action,length:d[0].length});for(l.global&&(e=p);--p>e;){var f=p-1;if(t[p].length>t[f].length){var m=t[p];t[p]=t[f],t[f]=m}}}}}return t}this.state=0,this.index=0,this.input="",this.addRule=function(t,e,i){var r=t.global;if(!r){var s="g";t.multiline&&(s+="m"),t.ignoreCase&&(s+="i"),t=new RegExp(t.source,s)}return"[object Array]"!==Object.prototype.toString.call(i)&&(i=[0]),n.push({pattern:t,global:r,action:e,start:i}),this},this.setInput=function(t){return r=0,this.state=0,this.index=0,i.length=0,this.input=t,this},this.lex=function(){if(i.length)return i.shift();for(this.reject=!0;this.index<=this.input.length;){for(var e=s.call(this).splice(r),n=this.index;e.length&&this.reject;){var a=e.shift(),o=a.result,l=a.length;this.index+=l,this.reject=!1,r++;var c=a.action.apply(this,o);if(this.reject)this.index=o.index;else if(void 0!==c)return"[object Array]"===Object.prototype.toString.call(c)&&(i=c.slice(1),c=c[0]),l&&(r=0),c}var h=this.input;if(n{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";function t(t,e,i,n){return new(i||(i=Promise))((function(r,s){function a(t){try{l(n.next(t))}catch(t){s(t)}}function o(t){try{l(n.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}l((n=n.apply(t,e||[])).next())}))}i.r(n),i.d(n,{default:()=>jf}),Object.create,Object.create;const e=require("obsidian");var r=i(885),s=i.n(r),a={prefix:"fas",iconName:"dice",icon:[640,512,[],"f522","M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"]},o={prefix:"far",iconName:"copy",icon:[448,512,[],"f0c5","M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"]};function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function c(t,e){for(var i=0;i0;)e+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[62*Math.random()|0];return e}function it(t){return"".concat(t).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function nt(t){return Object.keys(t||{}).reduce((function(e,i){return e+"".concat(i,": ").concat(t[i],";")}),"")}function rt(t){return t.size!==tt.size||t.x!==tt.x||t.y!==tt.y||t.rotate!==tt.rotate||t.flipX||t.flipY}function st(t){var e=t.transform,i=t.containerWidth,n=t.iconWidth,r={transform:"translate(".concat(i/2," 256)")},s="translate(".concat(32*e.x,", ").concat(32*e.y,") "),a="scale(".concat(e.size/16*(e.flipX?-1:1),", ").concat(e.size/16*(e.flipY?-1:1),") "),o="rotate(".concat(e.rotate," 0 0)");return{outer:r,inner:{transform:"".concat(s," ").concat(a," ").concat(o)},path:{transform:"translate(".concat(n/2*-1," -256)")}}}var at={x:0,y:0,width:"100%",height:"100%"};function ot(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.attributes&&(t.attributes.fill||e)&&(t.attributes.fill="black"),t}function lt(t){var e=t.icons,i=e.main,n=e.mask,r=t.prefix,s=t.iconName,a=t.transform,o=t.symbol,l=t.title,c=t.maskId,h=t.titleId,d=t.extra,p=t.watchable,f=void 0!==p&&p,m=n.found?n:i,g=m.width,v=m.height,y="fak"===r,x=y?"":"fa-w-".concat(Math.ceil(g/v*16)),w=[C.replacementClass,s?"".concat(C.familyPrefix,"-").concat(s):"",x].filter((function(t){return-1===d.classes.indexOf(t)})).filter((function(t){return""!==t||!!t})).concat(d.classes).join(" "),b={children:[],attributes:u({},d.attributes,{"data-prefix":r,"data-icon":s,class:w,role:d.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(g," ").concat(v)})},_=y&&!~d.classes.indexOf("fa-fw")?{width:"".concat(g/v*16*.0625,"em")}:{};f&&(b.attributes["data-fa-i2svg"]=""),l&&b.children.push({tag:"title",attributes:{id:b.attributes["aria-labelledby"]||"title-".concat(h||et())},children:[l]});var M=u({},b,{prefix:r,iconName:s,main:i,mask:n,maskId:c,transform:a,symbol:o,styles:u({},_,d.styles)}),S=n.found&&i.found?function(t){var e,i=t.children,n=t.attributes,r=t.main,s=t.mask,a=t.maskId,o=t.transform,l=r.width,c=r.icon,h=s.width,d=s.icon,p=st({transform:o,containerWidth:h,iconWidth:l}),f={tag:"rect",attributes:u({},at,{fill:"white"})},m=c.children?{children:c.children.map(ot)}:{},g={tag:"g",attributes:u({},p.inner),children:[ot(u({tag:c.tag,attributes:u({},c.attributes,p.path)},m))]},v={tag:"g",attributes:u({},p.outer),children:[g]},y="mask-".concat(a||et()),x="clip-".concat(a||et()),w={tag:"mask",attributes:u({},at,{id:y,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[f,v]},b={tag:"defs",children:[{tag:"clipPath",attributes:{id:x},children:(e=d,"g"===e.tag?e.children:[e])},w]};return i.push(b,{tag:"rect",attributes:u({fill:"currentColor","clip-path":"url(#".concat(x,")"),mask:"url(#".concat(y,")")},at)}),{children:i,attributes:n}}(M):function(t){var e=t.children,i=t.attributes,n=t.main,r=t.transform,s=nt(t.styles);if(s.length>0&&(i.style=s),rt(r)){var a=st({transform:r,containerWidth:n.width,iconWidth:n.width});e.push({tag:"g",attributes:u({},a.outer),children:[{tag:"g",attributes:u({},a.inner),children:[{tag:n.icon.tag,children:n.icon.children,attributes:u({},n.icon.attributes,a.path)}]}]})}else e.push(n.icon);return{children:e,attributes:i}}(M),E=S.children,T=S.attributes;return M.children=E,M.attributes=T,o?function(t){var e=t.prefix,i=t.iconName,n=t.children,r=t.attributes,s=t.symbol;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:u({},r,{id:!0===s?"".concat(e,"-").concat(C.familyPrefix,"-").concat(i):s}),children:n}]}]}(M):function(t){var e=t.children,i=t.main,n=t.mask,r=t.attributes,s=t.styles,a=t.transform;if(rt(a)&&i.found&&!n.found){var o={x:i.width/i.height/2,y:.5};r.style=nt(u({},s,{"transform-origin":"".concat(o.x+a.x/16,"em ").concat(o.y+a.y/16,"em")}))}return[{tag:"svg",attributes:r,children:e}]}(M)}var ct=(C.measurePerformance&&b&&b.mark&&b.measure,function(t,e,i,n){var r,s,a,o=Object.keys(t),l=o.length,c=void 0!==n?function(t,e){return function(i,n,r,s){return t.call(e,i,n,r,s)}}(e,n):e;for(void 0===i?(r=1,a=t[o[0]]):(r=0,a=i);r2&&void 0!==arguments[2]?arguments[2]:{},n=i.skipHooks,r=void 0!==n&&n,s=Object.keys(e).reduce((function(t,i){var n=e[i];return n.icon?t[n.iconName]=n.icon:t[i]=n,t}),{});"function"!=typeof P.hooks.addPack||r?P.styles[t]=u({},P.styles[t]||{},s):P.hooks.addPack(t,s),"fas"===t&&ht("fa",e)}var ut=P.styles,dt=P.shims,pt=function(){var t=function(t){return ct(ut,(function(e,i,n){return e[n]=ct(i,t,{}),e}),{})};t((function(t,e,i){return e[3]&&(t[e[3]]=i),t})),t((function(t,e,i){var n=e[2];return t[i]=i,n.forEach((function(e){t[e]=i})),t}));var e="far"in ut;ct(dt,(function(t,i){var n=i[0],r=i[1],s=i[2];return"far"!==r||e||(r="fas"),t[n]={prefix:r,iconName:s},t}),{})};function ft(t,e,i){if(t&&t[e]&&t[e][i])return{prefix:e,iconName:i,icon:t[e][i]}}function mt(t){var e=t.tag,i=t.attributes,n=void 0===i?{}:i,r=t.children,s=void 0===r?[]:r;return"string"==typeof t?it(t):"<".concat(e," ").concat(function(t){return Object.keys(t||{}).reduce((function(e,i){return e+"".concat(i,'="').concat(it(t[i]),'" ')}),"").trim()}(n),">").concat(s.map(mt).join(""),"")}function gt(t){this.name="MissingIcon",this.message=t||"Icon unavailable",this.stack=(new Error).stack}pt(),P.styles,gt.prototype=Object.create(Error.prototype),gt.prototype.constructor=gt;var vt={fill:"currentColor"},yt={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},xt=(u({},vt,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"}),u({},yt,{attributeName:"opacity"}));function wt(t){var e=t[0],i=t[1],n=d(t.slice(4),1)[0];return{found:!0,width:e,height:i,icon:Array.isArray(n)?{tag:"g",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.GROUP)},children:[{tag:"path",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.SECONDARY),fill:"currentColor",d:n[0]}},{tag:"path",attributes:{class:"".concat(C.familyPrefix,"-").concat(T.PRIMARY),fill:"currentColor",d:n[1]}}]}:{tag:"path",attributes:{fill:"currentColor",d:n}}}}u({},vt,{cx:"256",cy:"364",r:"28"}),u({},yt,{attributeName:"r",values:"28;14;28;28;14;28;"}),u({},xt,{values:"1;0;1;1;0;1;"}),u({},vt,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),u({},xt,{values:"1;0;0;0;0;1;"}),u({},vt,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),u({},xt,{values:"0;0;1;1;0;0;"}),P.styles,P.styles;var bt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.definitions={}}var e,i;return e=t,i=[{key:"add",value:function(){for(var t=this,e=arguments.length,i=new Array(e),n=0;n-1;r--){var s=i[r],a=(s.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(a)>-1&&(n=s)}w.head.insertBefore(e,n)}}(function(){var t="fa",e=M,i=C.familyPrefix,n=C.replacementClass,r='svg:not(:root).svg-inline--fa {\n overflow: visible;\n}\n\n.svg-inline--fa {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.225em;\n}\n.svg-inline--fa.fa-w-1 {\n width: 0.0625em;\n}\n.svg-inline--fa.fa-w-2 {\n width: 0.125em;\n}\n.svg-inline--fa.fa-w-3 {\n width: 0.1875em;\n}\n.svg-inline--fa.fa-w-4 {\n width: 0.25em;\n}\n.svg-inline--fa.fa-w-5 {\n width: 0.3125em;\n}\n.svg-inline--fa.fa-w-6 {\n width: 0.375em;\n}\n.svg-inline--fa.fa-w-7 {\n width: 0.4375em;\n}\n.svg-inline--fa.fa-w-8 {\n width: 0.5em;\n}\n.svg-inline--fa.fa-w-9 {\n width: 0.5625em;\n}\n.svg-inline--fa.fa-w-10 {\n width: 0.625em;\n}\n.svg-inline--fa.fa-w-11 {\n width: 0.6875em;\n}\n.svg-inline--fa.fa-w-12 {\n width: 0.75em;\n}\n.svg-inline--fa.fa-w-13 {\n width: 0.8125em;\n}\n.svg-inline--fa.fa-w-14 {\n width: 0.875em;\n}\n.svg-inline--fa.fa-w-15 {\n width: 0.9375em;\n}\n.svg-inline--fa.fa-w-16 {\n width: 1em;\n}\n.svg-inline--fa.fa-w-17 {\n width: 1.0625em;\n}\n.svg-inline--fa.fa-w-18 {\n width: 1.125em;\n}\n.svg-inline--fa.fa-w-19 {\n width: 1.1875em;\n}\n.svg-inline--fa.fa-w-20 {\n width: 1.25em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-border {\n height: 1.5em;\n}\n.svg-inline--fa.fa-li {\n width: 2em;\n}\n.svg-inline--fa.fa-fw {\n width: 1.25em;\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-align: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: #ff253a;\n border-radius: 1em;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n color: #fff;\n height: 1.5em;\n line-height: 1;\n max-width: 5em;\n min-width: 1.5em;\n overflow: hidden;\n padding: 0.25em;\n right: 0;\n text-overflow: ellipsis;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: 0;\n right: 0;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom right;\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: 0;\n left: 0;\n right: auto;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom left;\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n right: 0;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: 0;\n right: auto;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n\n.fa-lg {\n font-size: 1.3333333333em;\n line-height: 0.75em;\n vertical-align: -0.0667em;\n}\n\n.fa-xs {\n font-size: 0.75em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n}\n\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit;\n}\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: 0.1em;\n padding: 0.2em 0.25em 0.15em;\n}\n\n.fa-pull-left {\n float: left;\n}\n\n.fa-pull-right {\n float: right;\n}\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: 0.3em;\n}\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: 0.3em;\n}\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1);\n}\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none;\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n position: relative;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.svg-inline--fa.fa-stack-1x {\n height: 1em;\n width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n height: 2em;\n width: 2.5em;\n}\n\n.fa-inverse {\n color: #fff;\n}\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n}\n\n.svg-inline--fa .fa-primary {\n fill: var(--fa-primary-color, currentColor);\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n fill: var(--fa-secondary-color, currentColor);\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n fill: black;\n}\n\n.fad.fa-inverse {\n color: #fff;\n}';if(i!==t||n!==e){var s=new RegExp("\\.".concat(t,"\\-"),"g"),a=new RegExp("\\--".concat(t,"\\-"),"g"),o=new RegExp("\\.".concat(e),"g");r=r.replace(s,".".concat(i,"-")).replace(a,"--".concat(i,"-")).replace(o,".".concat(n))}return r}()),At=!0)}function Mt(t,e){return Object.defineProperty(t,"abstract",{get:e}),Object.defineProperty(t,"html",{get:function(){return t.abstract.map((function(t){return mt(t)}))}}),Object.defineProperty(t,"node",{get:function(){if(_){var e=w.createElement("div");return e.innerHTML=t.html,e.children}}}),t}function St(t){var e=t.prefix,i=void 0===e?"fa":e,n=t.iconName;if(n)return ft(Tt.definitions,i,n)||ft(P.styles,i,n)}var Et,Tt=new bt,At=!1,Lt=(Et=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.transform,n=void 0===i?tt:i,r=e.symbol,s=void 0!==r&&r,a=e.mask,o=void 0===a?null:a,l=e.maskId,c=void 0===l?null:l,h=e.title,d=void 0===h?null:h,p=e.titleId,f=void 0===p?null:p,m=e.classes,g=void 0===m?[]:m,v=e.attributes,y=void 0===v?{}:v,x=e.styles,w=void 0===x?{}:x;if(t){var b=t.prefix,_=t.iconName,M=t.icon;return Mt(u({type:"icon"},t),(function(){return _t(),C.autoA11y&&(d?y["aria-labelledby"]="".concat(C.replacementClass,"-title-").concat(f||et()):(y["aria-hidden"]="true",y.focusable="false")),lt({icons:{main:wt(M),mask:o?wt(o.icon):{found:!1,width:null,height:null,icon:{}}},prefix:b,iconName:_,transform:u({},tt,n),symbol:s,title:d,maskId:c,titleId:f,extra:{attributes:y,styles:w,classes:g}})}))}},function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=(t||{}).icon?t:St(t||{}),n=e.mask;return n&&(n=(n||{}).icon?n:St(n||{})),Et(i,u({},e,{mask:n}))});class Ct{constructor(t){this.table=t}parse(t){for(var e=t.length,i=this.table,n=[],r=[],s=0;sc||l===c&&"right"===o.associativity)break;n.push(r.shift())}r.unshift(h)}else n.push(h)}for(;r.length;){var h;if("("===(h=r.shift()).data)throw new Error("Mismatched parentheses.");n.push(h)}return n}}const Rt=/(?:(?\d+)[Dd])?#(?[\p{Letter}\p{Emoji_Presentation}\w/-]+)(?:\|(?[\+-]))?(?:\|(?[^\+-]+))?/u,Pt=/(?:(?\d+)[Dd])?\[\[(?[\s\S]+?)#?\^(?[\s\S]+?)\]\]\|?(?
[\s\S]+)?/,It=/(?:(?\d+)[Dd])?\[\[(?[\s\S]+)\]\]\|?(?[\s\S]+)?/,Nt=/[\(\^\+\-\*\/\)]/,zt=/(?(?\d+)(?:[Dd]?\[?(?:-?\d+\s?,)?\s?(?:-?\d+|%|F)\]?)?)(?(?:(?:=|=!|<|>|<=|>=|=<|=>|\-=|=\-)\d+)*)?/,Dt=/(?\d+)?[Dd](?\[?(?:-?\d+\s?,)?\s?(?:-?\d+|%|F)\]?)?(?(?:(?:=|=!|<|>|<=|>=|=<|=>|\-=|=\-)\d+)*)?/,Bt=/(?:(?=|=!|<|>|<=|>=|=<|=>|\-=|=\-)(?\d+))/g,Ft="dice-roller-icon",Ot="dice-roller-copy";function kt(t,e,i){[...t].slice(e).reverse().forEach((([e,i])=>{t.set(e+1,i)})),t.set(e,i)}class Ht extends e.Events{constructor(t,i,n){super(),this.plugin=t,this.original=i,this.lexemes=n,this.loaded=!1,this.containerEl=createDiv({cls:"dice-roller",attr:{"aria-label-position":"top","data-dice":this.original}}),this.resultEl=this.containerEl.createDiv("dice-roller-result");const r=this.containerEl.createDiv({cls:"dice-roller-button"});(0,e.setIcon)(r,Ft),this.containerEl.onclick=this.onClick.bind(this),r.onclick=this.onClick.bind(this)}setTooltip(){this.plugin.data.displayResultsInline||this.containerEl.setAttrs({"aria-label":this.tooltip})}getRandomBetween(t,e){return Math.floor(Math.random()*(e-t+1))+t}render(){return t(this,void 0,void 0,(function*(){this.setTooltip(),yield this.build()}))}get inlineText(){return`${this.tooltip.split("\n").join(" -> ")} -> `}onClick(e){var i;return t(this,void 0,void 0,(function*(){e.stopPropagation(),e.stopImmediatePropagation(),(null===(i=window.getSelection())||void 0===i?void 0:i.isCollapsed)&&(yield this.roll())}))}}class Ut extends Ht{}class Vt extends Ut{constructor(t,e,i,n){super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n,this.getPath(),this.getFile()}getFile(){return t(this,void 0,void 0,(function*(){if(this.file=this.plugin.app.metadataCache.getFirstLinkpathDest(this.path,this.source),!(this.file&&this.file instanceof e.TFile))throw new Error("Could not load file.");yield this.load(),this.registerFileWatcher()}))}registerFileWatcher(){this.plugin.registerEvent(this.plugin.app.vault.on("modify",(e=>t(this,void 0,void 0,(function*(){e===this.file&&(yield this.getOptions())})))))}}class Gt{constructor(t,e={original:t,conditionals:[],type:"dice",data:t}){var i;if(this.lexeme=e,this.modifiers=new Map,this.modifiersAllowed=!0,this.static=!1,this.conditions=[],!/(\-?\d+)[dD]?(\d+|%|\[\d+,\s?\d+\])?/.test(t))throw new Error("Non parseable dice string passed to DiceRoll.");this.dice=t.split(" ").join(""),/^-?\d+$/.test(this.dice)&&(this.static=!0,this.modifiersAllowed=!1);let[,n,r=null,s=1]=this.dice.match(/(\-?\d+)[dD]\[?(?:(-?\d+)\s?,)?\s?(-?\d+|%|F)\]?/)||[,1,null,1];this.multiplier=n<0?-1:1,this.rolls=Math.abs(Number(n))||1,Number(s)<0&&!r&&(r=-1),"%"===s&&(s=100),"F"===s&&(s=1,r=-1),Number(s)[e,{usable:!0,value:t,display:`${t}`,modifiers:new Set}])))}get text(){return`${this.result}`}get result(){return this.static?Number(this.dice):[...this.results].map((([,{usable:t,value:e}])=>t?e:0)).reduce(((t,e)=>t+e),0)}get display(){return this.static?`${this.result}`:`[${[...this.results].map((([,{modifiers:t,display:e}])=>`${e}${[...t].join("")}`)).join(", ")}]`}keepLow(t=1){this.modifiersAllowed?[...this.results].sort(((t,e)=>t[1].value-e[1].value)).slice(t-this.results.size).forEach((([t])=>{const e=this.results.get(t);e.usable=!1,e.modifiers.add("d"),this.results.set(t,Object.assign({},e))})):new e.Notice("Modifiers are only allowed on dice rolls.")}keepHigh(t=1){this.modifiersAllowed?[...this.results].sort(((t,e)=>e[1].value-t[1].value)).slice(t).forEach((([t])=>{const e=this.results.get(t);e.usable=!1,e.modifiers.add("d"),this.results.set(t,Object.assign({},e))})):new e.Notice("Modifiers are only allowed on dice rolls.")}reroll(t,i){if(!this.modifiersAllowed)return void new e.Notice("Modifiers are only allowed on dice rolls.");i.length||i.push({operator:"=",comparer:this.faces.min});let n=0,r=[...this.results].filter((([,{value:t}])=>this.checkCondition(t,i)));for(;nthis.checkCondition(t,i))).length>0;)n++,r.map((([,t])=>{t.modifiers.add("r"),t.value=this.getRandomBetween(this.faces.min,this.faces.max)}));r.forEach((([t,e])=>{this.results.set(t,e)}))}explodeAndCombine(t,i){if(!this.modifiersAllowed)return void new e.Notice("Modifiers are only allowed on dice rolls.");i.length||i.push({operator:"=",comparer:this.faces.max});let n=0;[...this.results].filter((([,{value:t}])=>this.checkCondition(t,i))).forEach((([e,r])=>{let s=this.getRandomBetween(this.faces.min,this.faces.max);for(n++,r.modifiers.add("!"),r.value+=s,r.display=`${r.value}`,this.results.set(e,r);nthis.multiplier*this.getRandomBetween(this.faces.min,this.faces.max)))}roll(){var t;const e=this._roll();this.results=new Map([...e].map(((t,e)=>[e,{usable:!0,value:t,display:`${t}`,modifiers:new Set}])));for(let[t,e]of this.modifiers)this.applyModifier(t,e);return(null===(t=this.conditions)||void 0===t?void 0:t.length)&&this.applyConditions(),e}applyConditions(){for(let[t,e]of this.results){const t=this.conditions.find((({operator:t})=>"-="===t||"=-"===t));t&&e.value===t.comparer?(e.value=-1,e.modifiers.add("-")):this.checkCondition(e.value,this.conditions)?(e.modifiers.add("*"),e.value=1):e.usable=!1}}applyModifier(t,e){switch(t){case"kh":this.keepHigh(e.data);break;case"kl":this.keepLow(e.data);break;case"!":this.explode(e.data,e.conditionals);break;case"!!":this.explodeAndCombine(e.data,e.conditionals);break;case"r":this.reroll(e.data,e.conditionals)}}checkCondition(t,e){return e&&e.length?e.some((({operator:e,comparer:i})=>{if(Number.isNaN(t)||Number.isNaN(i))return!1;let n=!1;switch(e){case"=":n=t===i;break;case"!=":case"=!":n=t!==i;break;case"<":n=t":n=t>i;break;case">=":n=t>=i}return n})):t}getRandomBetween(t,e){return Math.floor(Math.random()*(e-t+1))+t}}class Wt extends Gt{constructor(t,e){super("3d6",e),this.lexeme=e,this.dice=t}get doubles(){return new Set([...this.results].map((([,{usable:t,value:e}])=>t?e:0))).size<3}get result(){return this.static?Number(this.dice):[...this.results].map((([,{usable:t,value:e}])=>t?e:0)).reduce(((t,e)=>t+e),0)}get display(){let t=[];for(let e of this.results)0==e[0]&&this.doubles?t.push(`${e[1].value}S`):t.push(`${e[1].value}`);return`[${t.join(", ")}]`}}class jt extends Ut{constructor(t,e,i){super(t,e,i),this.plugin=t,this.original=e,this.lexemes=i,this.stunted="",this.operators={"+":(t,e)=>t+e,"-":(t,e)=>t-e,"*":(t,e)=>t*e,"/":(t,e)=>t/e,"^":(t,e)=>Math.pow(t,e)},this.stack=[],this.dice=[],this.loaded=!0,this.trigger("loaded")}get resultText(){let t=this.original;return this.dice.forEach((e=>{t=t.replace(e.lexeme.original,e.display)})),t}get tooltip(){return this._tooltip?this._tooltip:`${this.original}\n${this.resultText}`}build(){return t(this,void 0,void 0,(function*(){const t=[this.result.toLocaleString(navigator.language,{maximumFractionDigits:2})];this.plugin.data.displayResultsInline&&t.unshift(this.inlineText),this.resultEl.setText(t.join("")+this.stunted)}))}roll(){return t(this,void 0,void 0,(function*(){let t=0;this.stunted="";for(const e of this.lexemes)switch(e.type){case"+":case"-":case"*":case"/":case"^":case"math":let i=this.stack.pop(),n=this.stack.pop();if(!n){"-"===e.data&&(i=new Gt(`-${i.dice}`,i.lexeme)),this.stack.push(i);continue}i.roll(),i instanceof Wt&&i.doubles&&(this.stunted=` - ${i.results.get(0).value} Stunt Points`),n.roll(),n instanceof Wt&&n.doubles&&(this.stunted=` - ${n.results.get(0).value} Stunt Points`);const r=this.operators[e.data](n.result,i.result);this.stack.push(new Gt(`${r}`,e));break;case"kh":{let i=this.dice[t-1],n=e.data?Number(e.data):1;i.modifiers.set("kh",{data:n,conditionals:[]});break}case"dl":{let i=this.dice[t-1],n=e.data?Number(e.data):1;n=i.results.size-n,i.modifiers.set("kh",{data:n,conditionals:[]});break}case"kl":{let i=this.dice[t-1],n=e.data?Number(e.data):1;i.modifiers.set("kl",{data:n,conditionals:[]});break}case"dh":{let i=this.dice[t-1],n=e.data?Number(e.data):1;n=i.results.size-n,i.modifiers.set("kl",{data:n,conditionals:[]});break}case"!":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("!",{data:n,conditionals:e.conditionals});break}case"!!":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("!!",{data:n,conditionals:e.conditionals});break}case"r":{let i=this.dice[t-1],n=Number(e.data)||1;i.modifiers.set("r",{data:n,conditionals:e.conditionals});break}case"dice":this.dice[t]||(this.dice[t]=new Gt(e.data,e)),this.stack.push(this.dice[t]),t++;break;case"stunt":this.dice[t]||(this.dice[t]=new Wt(e.original,e)),this.stack.push(this.dice[t]),t++}const e=this.stack.pop();return e.roll(),e instanceof Wt&&e.doubles&&(this.stunted=` - ${e.results.get(0).value} Stunt Points`),this.result=e.result,this._tooltip=null,this.render(),this.trigger("new-result"),this.result}))}toResult(){return{type:"dice",result:this.result,tooltip:this.tooltip}}applyResult(e){return t(this,void 0,void 0,(function*(){"dice"===e.type&&(e.result&&(this.result=e.result),e.tooltip&&(this._tooltip=e.tooltip),yield this.render())}))}setResult(t){}}class qt extends Vt{constructor(i,n,r,s,a=!0){super(i,n,r,s),this.plugin=i,this.original=n,this.lexeme=r,this.inline=a,this.containerEl.addClasses(["has-embed","markdown-embed"]),this.resultEl.addClass("internal-embed"),this.resultEl.setAttrs({src:s}),this.copy=this.containerEl.createDiv({cls:"dice-content-copy dice-roller-button no-show",attr:{"aria-label":"Copy Contents"}}),this.copy.addEventListener("click",(i=>{i.stopPropagation(),navigator.clipboard.writeText(this.displayFromCache(...this.results).trim()).then((()=>t(this,void 0,void 0,(function*(){new e.Notice("Result copied to clipboard.")}))))})),(0,e.setIcon)(this.copy,Ot)}get tooltip(){return`${this.original}\n${this.path}`}build(){return t(this,void 0,void 0,(function*(){if(this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.inline&&this.resultEl.createSpan({text:this.inlineText}),this.results&&this.results.length){this.plugin.data.copyContentButton&&this.copy.removeClass("no-show");for(const i of this.results){this.resultEl.onclick=e=>t(this,void 0,void 0,(function*(){(e&&e.getModifierState("Control")||e.getModifierState("Meta"))&&e.stopPropagation()}));const n=this.resultEl.createDiv({cls:"markdown-embed"});if(!this.plugin.data.displayResultsInline){const t="type"in i?i.type:"List Item";n.setAttrs({"aria-label":`${this.file.basename}: ${t}`})}if(i){if(e.MarkdownRenderer.renderMarkdown(this.displayFromCache(i),n.createDiv(),this.source,null),this.plugin.data.copyContentButton&&this.results.length>1){let r=n.createDiv({cls:"dice-content-copy dice-roller-button",attr:{"aria-label":"Copy Contents"}});r.addEventListener("click",(n=>{n.stopPropagation(),navigator.clipboard.writeText(this.displayFromCache(i).trim()).then((()=>t(this,void 0,void 0,(function*(){new e.Notice("Result copied to clipboard.")}))))})),(0,e.setIcon)(r,Ot)}}else n.createDiv({cls:"dice-no-results",text:"No results."})}}else this.resultEl.createDiv({cls:"dice-no-results",text:"No results."})}))}load(){return t(this,void 0,void 0,(function*(){yield this.getOptions()}))}displayFromCache(...t){let e=[];for(let i of t)e.push(this.content.slice(i.position.start.offset,i.position.end.offset));return e.join("\n\n")}getPath(){var t;const{groups:e}=this.lexeme.data.match(It),{roll:i=1,link:n,types:r}=e;if(!n)throw new Error("Could not parse link.");this.rolls=null!==(t=i&&!isNaN(Number(i))&&Number(i))&&void 0!==t?t:1,this.path=n.replace(/(\[|\])/g,""),this.types=null==r?void 0:r.split(",")}getOptions(){return t(this,void 0,void 0,(function*(){if(this.cache=this.plugin.app.metadataCache.getFileCache(this.file),!this.cache||!this.cache.sections)throw new Error("Could not read file cache.");this.content=yield this.plugin.app.vault.cachedRead(this.file),this.options=this.cache.sections.filter((({type:t})=>this.types?this.types.includes(t):!["yaml","thematicBreak"].includes(t))),this.types&&this.types.includes("listItem")&&this.options.push(...this.cache.listItems),this.loaded=!0,this.trigger("loaded")}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{if(this.loaded){const e=[...this.options];this.results=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).filter((t=>t)),this.render(),this.trigger("new-result"),t(this.results[0])}else this.on("loaded",(()=>{const e=[...this.options];this.results=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).filter((t=>t)),this.render(),this.trigger("new-result"),t(this.results[0])}))}))}))}toResult(){return{type:"section",result:this.results}}applyResult(e){return t(this,void 0,void 0,(function*(){"section"===e.type&&(e.result&&(this.results=e.result),yield this.render())}))}}class Xt extends Ut{constructor(t,e,i,n){super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n,this.loaded=!1,this.containerEl.addClasses(["has-embed","markdown-embed"]);const{roll:r=1,tag:s,collapse:a,types:o}=i.data.match(Rt).groups;this.collapse="-"===a||"+"!==a&&!this.plugin.data.returnAllTags,this.tag=`#${s}`,this.rolls=Number(r),this.types=o,this.getFiles()}get typeText(){var t;return(null===(t=this.types)||void 0===t?void 0:t.length)?`|${this.types}`:""}getFiles(){return t(this,void 0,void 0,(function*(){const t=this.plugin.app.plugins.plugins.dataview.index.tags.invMap.get(this.tag);if(t&&t.delete(this.source),!t||!t.size)throw new Error("No files found with that tag. Is the tag correct?\n\n"+this.tag);const e=Array.from(t).map((t=>`${this.rolls}d[[${t}]]${this.typeText}`));this.results=e.map((t=>new qt(this.plugin,t,{data:t,original:t,conditionals:null,type:"section"},this.source,!1))),this.loaded=!0,this.trigger("loaded")}))}build(){var e;return t(this,void 0,void 0,(function*(){if(this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.resultEl.createSpan({text:this.inlineText}),this.collapse){this.chosen=null!==(e=this.random)&&void 0!==e?e:this.getRandomBetween(0,this.results.length-1);let t=this.results[this.chosen];this.random=null;const i=this.resultEl.createDiv();i.createEl("h5",{cls:"dice-file-name",text:t.file.basename}),i.appendChild(t.containerEl)}else for(let t of this.results){const e=this.resultEl.createDiv();e.createEl("h5",{cls:"dice-file-name",text:t.file.basename}),e.appendChild(t.containerEl)}}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise(((e,i)=>{this.loaded?(this.results.forEach((e=>t(this,void 0,void 0,(function*(){return yield e.roll()})))),this.render(),this.trigger("new-result"),e(this.result)):this.on("loaded",(()=>{this.results.forEach((e=>t(this,void 0,void 0,(function*(){return yield e.roll()})))),this.render(),this.trigger("new-result"),e(this.result)}))}))}))}get tooltip(){return this.original}toResult(){return{type:"tag",random:this.chosen,result:Object.fromEntries(this.results.map((t=>[t.path,t.toResult()])))}}applyResult(e){return t(this,void 0,void 0,(function*(){if("tag"===e.type){if(e.result)for(let t in e.result){const i=this.results.find((e=>e.path===t));i&&i.applyResult(e.result[t])}e.random&&(this.random=e.random),yield this.render()}}))}}class Yt extends Ut{constructor(t,e,i,n){var r;super(t,e,[i]),this.plugin=t,this.original=e,this.lexeme=i,this.source=n;const{roll:s=1,tag:a}=i.data.match(Rt).groups;this.tag=`#${a}`,this.rolls=null!==(r=s&&!isNaN(Number(s))&&Number(s))&&void 0!==r?r:1,this.getFiles()}get tooltip(){return`${this.original}\n${this.result.basename}`}roll(){return t(this,void 0,void 0,(function*(){return this.result=this.links[this.getRandomBetween(0,this.links.length-1)],yield this.render(),this.trigger("new-result"),this.result}))}build(){return t(this,void 0,void 0,(function*(){this.resultEl.empty(),this.plugin.data.displayResultsInline&&this.resultEl.createSpan({text:this.inlineText});const e=this.resultEl.createEl("a",{cls:"internal-link",text:this.result.basename});e.onclick=e=>t(this,void 0,void 0,(function*(){var t;e.stopPropagation(),this.plugin.app.workspace.openLinkText(this.result.path,null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path,!0)})),e.onmouseenter=i=>t(this,void 0,void 0,(function*(){var t;this.plugin.app.workspace.trigger("link-hover",this,e,this.result.path,null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path)}))}))}getFiles(){return t(this,void 0,void 0,(function*(){const t=this.plugin.app.plugins.plugins.dataview.index.tags.invMap.get(this.tag);if(t&&t.delete(this.source),!t||!t.size)throw new Error("No files found with that tag. Is the tag correct?\n\n"+this.tag);this.links=Array.from(t).map((t=>this.plugin.app.metadataCache.getFirstLinkpathDest(t,this.source)))}))}toResult(){return{type:"link",result:this.result.path}}applyResult(i){return t(this,void 0,void 0,(function*(){if("link"===i.type){if(i.result){const t=this.plugin.app.vault.getAbstractFileByPath(i.result);t&&t instanceof e.TFile&&(this.result=t)}yield this.render()}}))}}class Zt extends Vt{getPath(){var t;const{groups:e}=this.lexeme.data.match(Pt),{roll:i=1,link:n,block:r,header:s}=e;if(!n||!r)throw new Error("Could not parse link.");this.rolls=null!==(t=i&&!isNaN(Number(i))&&Number(i))&&void 0!==t?t:1,this.path=n.replace(/(\[|\])/g,""),this.block=r.replace(/(\^|#)/g,"").trim().toLowerCase(),this.header=s}get tooltip(){return`${this.original}\n${this.path} > ${this.block}${this.header?" | "+this.header:""}`}build(){return t(this,void 0,void 0,(function*(){this.resultEl.empty();const e=[this.result];this.plugin.data.displayResultsInline&&e.unshift(this.inlineText);const i=e.join("").split(/(\[\[(?:[\s\S]+?)\]\])/);for(let e of i)if(/\[\[(?:[\s\S]+?)\]\]/.test(e)){const[,i]=e.match(/\[\[([\s\S]+?)\]\]/),n=this.resultEl.createEl("a",{cls:"internal-link",text:i});n.onmouseover=()=>{var t;this.plugin.app.workspace.trigger("link-hover",this,n,i.replace("^","#^").split("|").shift(),null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path)},n.onclick=e=>t(this,void 0,void 0,(function*(){var t;e.stopPropagation(),yield this.plugin.app.workspace.openLinkText(i.replace("^","#^").split(/\|/).shift(),null===(t=this.plugin.app.workspace.getActiveFile())||void 0===t?void 0:t.path,e.getModifierState("Control"))}))}else this.resultEl.createSpan({text:e})}))}roll(){return t(this,void 0,void 0,(function*(){return new Promise((t=>{if(this.loaded){const e=[...this.options];this.result=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).join("||"),this.render(),this.trigger("new-result"),t(this.result)}else this.on("loaded",(()=>{const e=[...this.options];this.result=[...Array(this.rolls)].map((()=>{let t=e[this.getRandomBetween(0,e.length-1)];return e.splice(e.indexOf(t),1),t})).join("||"),this.render(),this.trigger("new-result"),t(this.result)}))}))}))}load(){return t(this,void 0,void 0,(function*(){yield this.getOptions()}))}getOptions(){var e,i;return t(this,void 0,void 0,(function*(){if(this.cache=this.plugin.app.metadataCache.getFileCache(this.file),!this.cache||!this.cache.blocks||!(this.block in this.cache.blocks))throw new Error(`Could not read file cache. Does the block reference exist?\n\n${this.path} > ${this.block}`);const t=null===(e=this.cache.sections)||void 0===e?void 0:e.find((t=>t.position==this.cache.blocks[this.block].position));if(this.position=this.cache.blocks[this.block].position,this.content=null===(i=yield this.plugin.app.vault.cachedRead(this.file))||void 0===i?void 0:i.slice(this.position.start.offset,this.position.end.offset),t&&"list"===t.type)this.options=this.content.split("\n");else{let t=function(t){const e=t.split("\n"),i=e.map((t=>{var e;return(null!==(e=t.trim().match(Jt))&&void 0!==e?e:[,t.trim()])[1]})),n=i[0].split(Qt),r=[],s=[];for(let t in n){let e=n[t];e.trim().length||(e=t),s.push([e.trim(),[]])}for(let t of e.slice(2)){const e=t.trim().split(Qt).map((t=>t.trim())).filter((t=>t.length));r.push(e.join(" | "));for(let t in e){const i=e[t].trim();i.length&&s[t]&&s[t][1].push(i)}}return{columns:Object.fromEntries(s),rows:r}}(this.content);if(this.header&&t.columns[this.header])this.options=t.columns[this.header];else{if(this.header)throw new Error(`Header ${this.header} was not found in table ${this.path} > ${this.block}.`);this.options=t.rows}}this.loaded=!0,this.trigger("loaded")}))}toResult(){return{type:"table",result:this.result}}applyResult(e){return t(this,void 0,void 0,(function*(){"table"===e.type&&(e.result&&(this.result=e.result),yield this.render())}))}}const Jt=/^\|?([\s\S]+?)\|?$/,Qt=/\|/;class $t extends e.PluginSettingTab{constructor(t,e){super(t,e),this.plugin=e,this.plugin=e}display(){return t(this,void 0,void 0,(function*(){let{containerEl:i}=this;i.empty(),i.addClass("dice-roller-settings"),i.createEl("h2",{text:"Dice Roller Settings"}),new e.Setting(i).setName("Roll All Files for Tags").setDesc("Return a result for each file when rolling tags.").addToggle((e=>{e.setValue(this.plugin.data.returnAllTags),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.returnAllTags=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Always Return Links for Tags").setDesc("Enables random link rolling with the link parameter. Override by specifying a section type.").addToggle((e=>{e.setValue(this.plugin.data.rollLinksForTags),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.rollLinksForTags=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Add Copy Button to Section Results").setDesc("Randomly rolled sections will have a copy-content button to easy add result to clipboard.").addToggle((e=>{e.setValue(this.plugin.data.copyContentButton),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.copyContentButton=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Display Formula With Results").setDesc("Both the formula and the results will both be displayed in preview mode.").addToggle((e=>{e.setValue(this.plugin.data.displayResultsInline),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.displayResultsInline=e,yield this.plugin.saveSettings()}))))}));const n=new e.Setting(i).setName("Globally Save Results").setDesc("Dice results will be saved by default. This can be overridden using ").addToggle((e=>{e.setValue(this.plugin.data.persistResults),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.persistResults=e,yield this.plugin.saveSettings()}))))}));new e.Setting(i).setName("Display graphics for Dice View Rolls").setDesc("Dice rolls from dice view will be displayed on screen.").addToggle((e=>{e.setValue(this.plugin.data.renderer),e.onChange((e=>t(this,void 0,void 0,(function*(){this.plugin.data.renderer=e,yield this.plugin.saveSettings()}))))})),new e.Setting(i).setName("Dice Base Color").setDesc("Rendered dice will be this color.").controlEl.createEl("input",{type:"color",value:this.plugin.data.diceColor},(e=>{e.value=this.plugin.data.diceColor,e.onchange=({target:e})=>t(this,void 0,void 0,(function*(){let t=e.value;this.plugin.data.diceColor=t,yield this.plugin.saveSettings(),this.plugin.app.workspace.trigger("dice-roller:update-colors")}))})),new e.Setting(i).setName("Dice Text Color").setDesc("Rendered dice will use this color for their numbers.").controlEl.createEl("input",{type:"color",value:this.plugin.data.textColor},(e=>{e.value=this.plugin.data.textColor,e.onchange=({target:e})=>t(this,void 0,void 0,(function*(){let t=e.value;t&&(this.plugin.data.textColor=t,yield this.plugin.saveSettings(),this.plugin.app.workspace.trigger("dice-roller:update-colors"))}))})),new e.Setting(i).setName("Default Face").setDesc("Use this as the number of faces when it is omitted.").addText((i=>{i.setValue(`${this.plugin.data.defaultFace}`),i.inputEl.onblur=()=>t(this,void 0,void 0,(function*(){isNaN(Number(i.inputEl.value))&&new e.Notice("The default face must be a number."),this.plugin.data.defaultFace=Number(i.inputEl.value),yield this.plugin.saveSettings()}))})),n.descEl.createEl("code",{text:"dice-: formula"}),n.descEl.createEl("p",{text:"Please note that the plugin will attempt to save the result but may not be able to."}),this.additionalContainer=i.createDiv("dice-roller-setting-additional-container"),this.buildFormulaSettings(),i.createDiv("coffee").createEl("a",{href:"https://www.buymeacoffee.com/valentine195"}).createEl("img",{attr:{src:"https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=☕&slug=valentine195&button_colour=e3e7ef&font_colour=262626&font_family=Inter&outline_colour=262626&coffee_colour=ff0000"}})}))}buildFormulaSettings(){this.additionalContainer.empty();const i=this.additionalContainer.createDiv();new e.Setting(i).setName("Add Formula").setDesc("Add a new formula shortcut.").addButton((e=>e.setTooltip("Add Formula").setButtonText("+").onClick((()=>t(this,void 0,void 0,(function*(){const t=yield this.buildFormulaForm(i);t&&(this.plugin.data.formulas[t.alias]=t.formula,this.buildFormulaSettings(),yield this.plugin.saveSettings())}))))));const n=this.additionalContainer.createDiv("additional"),r=this.plugin.data.formulas;for(const[s,a]of Object.entries(r)){const r=new e.Setting(n).setName(s);r.controlEl.createSpan({text:a}),r.addExtraButton((e=>e.setIcon("pencil").setTooltip("Edit").onClick((()=>t(this,void 0,void 0,(function*(){const t=yield this.buildFormulaForm(i,{alias:s,formula:a});t&&(delete this.plugin.data.formulas[s],this.plugin.data.formulas[t.alias]=t.formula,this.buildFormulaSettings(),yield this.plugin.saveSettings())})))))).addExtraButton((e=>e.setIcon("trash").setTooltip("Delete").onClick((()=>t(this,void 0,void 0,(function*(){delete this.plugin.data.formulas[s],yield this.plugin.saveSettings(),this.buildFormulaSettings()}))))))}Object.values(r).length||n.createSpan({text:"Create a formula to see it here!",cls:"no-formulas"})}buildFormulaForm(i,n={alias:null,formula:null}){return t(this,void 0,void 0,(function*(){return new Promise((r=>{const s=i.createDiv("add-new-formula"),a=s.createDiv("formula-data");new e.Setting(a).setName("Alias").addText((t=>{t.setValue(n.alias).onChange((t=>n.alias=t))})),new e.Setting(a).setName("Formula").addText((t=>{t.setValue(n.formula).onChange((t=>n.formula=t))}));const o=s.createDiv("formula-buttons");new e.Setting(o).addButton((e=>e.setCta().setButtonText("Save").onClick((()=>t(this,void 0,void 0,(function*(){s.detach(),r(n)})))))).addExtraButton((t=>t.setIcon("cross").setTooltip("Cancel").onClick((()=>{s.detach(),r(null)}))))}))}))}}const Kt=100,te=301,ee=302,ie=306,ne=1e3,re=1001,se=1002,ae=1003,oe=1006,le=1008,ce=1009,he=1012,ue=1014,de=1015,pe=1016,fe=1020,me=1022,ge=1023,ve=1026,ye=1027,xe=2300,we=2301,be=2302,_e=2400,Me=2401,Se=2402,Ee=3e3,Te=3001,Ae=3007,Le=3002,Ce=7680,Re=35044,Pe=35048,Ie="300 es";class Ne{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const i=this._listeners[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const i=e.slice(0);for(let e=0,n=i.length;e>8&255]+ze[t>>16&255]+ze[t>>24&255]+"-"+ze[255&e]+ze[e>>8&255]+"-"+ze[e>>16&15|64]+ze[e>>24&255]+"-"+ze[63&i|128]+ze[i>>8&255]+"-"+ze[i>>16&255]+ze[i>>24&255]+ze[255&n]+ze[n>>8&255]+ze[n>>16&255]+ze[n>>24&255]).toUpperCase()}function Oe(t,e,i){return Math.max(e,Math.min(i,t))}function ke(t,e,i){return(1-i)*t+i*e}function He(t){return 0==(t&t-1)&&0!==t}function Ue(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}class Ve{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}Ve.prototype.isVector2=!0;class Ge{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=n,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],h=i[7],u=i[2],d=i[5],p=i[8],f=n[0],m=n[3],g=n[6],v=n[1],y=n[4],x=n[7],w=n[2],b=n[5],_=n[8];return r[0]=s*f+a*v+o*w,r[3]=s*m+a*y+o*b,r[6]=s*g+a*x+o*_,r[1]=l*f+c*v+h*w,r[4]=l*m+c*y+h*b,r[7]=l*g+c*x+h*_,r[2]=u*f+d*v+p*w,r[5]=u*m+d*y+p*b,r[8]=u*g+d*x+p*_,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=h*f,t[1]=(n*l-c*i)*f,t[2]=(a*i-n*s)*f,t[3]=u*f,t[4]=(c*e-n*o)*f,t[5]=(n*r-a*e)*f,t[6]=d*f,t[7]=(i*o-l*e)*f,t[8]=(s*e-i*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+t,-n*l,n*o,-n*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const i=this.elements;return i[0]*=t,i[3]*=t,i[6]*=t,i[1]*=e,i[4]*=e,i[7]*=e,this}rotate(t){const e=Math.cos(t),i=Math.sin(t),n=this.elements,r=n[0],s=n[3],a=n[6],o=n[1],l=n[4],c=n[7];return n[0]=e*r+i*o,n[3]=e*s+i*l,n[6]=e*a+i*c,n[1]=-i*r+e*o,n[4]=-i*s+e*l,n[7]=-i*a+e*c,this}translate(t,e){const i=this.elements;return i[0]+=t*i[2],i[3]+=t*i[5],i[6]+=t*i[8],i[1]+=e*i[2],i[4]+=e*i[5],i[7]+=e*i[8],this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}let We;Ge.prototype.isMatrix3=!0;class je{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===We&&(We=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),We.width=t.width,We.height=t.height;const i=We.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=We}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}}let qe=0;class Xe extends Ne{constructor(t=Xe.DEFAULT_IMAGE,e=Xe.DEFAULT_MAPPING,i=1001,n=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:qe++}),this.uuid=Fe(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=i,this.wrapT=n,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new Ve(0,0),this.repeat=new Ve(1,1),this.center=new Ve(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Ge,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const n=this.image;if(void 0===n.uuid&&(n.uuid=Fe()),!e&&void 0===t.images[n.uuid]){let e;if(Array.isArray(n)){e=[];for(let t=0,i=n.length;t1)switch(this.wrapS){case ne:t.x=t.x-Math.floor(t.x);break;case re:t.x=t.x<0?0:1;break;case se:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case ne:t.y=t.y-Math.floor(t.y);break;case re:t.y=t.y<0?0:1;break;case se:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Ye(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?je.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Xe.DEFAULT_IMAGE=void 0,Xe.DEFAULT_MAPPING=300,Xe.prototype.isTexture=!0;class Ze{constructor(t=0,e=0,i=0,n=1){this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],f=o[2],m=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?o=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+f*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const i=t._x,n=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),h=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=i+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-n)*t}else if(i>a&&i>h){const t=2*Math.sqrt(1+i-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-i-h);this._w=(r-l)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-i-a);this._w=(s-n)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Oe(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*t._w+i*t._x+n*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=i*h+this._x*u,this._y=n*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){this.copy(t).slerp(e,i)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}$e.prototype.isQuaternion=!0;class Ke{constructor(t=0,e=0,i=0){this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(ei.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ei.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*n-a*i,c=o*i+a*e-r*n,h=o*n+r*i-s*e,u=-r*e-s*i-a*n;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return ti.copy(this).projectOnVector(t),this.sub(ti)}reflect(t){return this.sub(ti.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Oe(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}Ke.prototype.isVector3=!0;const ti=new Ke,ei=new $e;class ii{constructor(t=new Ke(1/0,1/0,1/0),e=new Ke(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,ri),ri.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(di),pi.subVectors(this.max,di),ai.subVectors(t.a,di),oi.subVectors(t.b,di),li.subVectors(t.c,di),ci.subVectors(oi,ai),hi.subVectors(li,oi),ui.subVectors(ai,li);let e=[0,-ci.z,ci.y,0,-hi.z,hi.y,0,-ui.z,ui.y,ci.z,0,-ci.x,hi.z,0,-hi.x,ui.z,0,-ui.x,-ci.y,ci.x,0,-hi.y,hi.x,0,-ui.y,ui.x,0];return!!gi(e,ai,oi,li,pi)&&(e=[1,0,0,0,1,0,0,0,1],!!gi(e,ai,oi,li,pi)&&(fi.crossVectors(ci,hi),e=[fi.x,fi.y,fi.z],gi(e,ai,oi,li,pi)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return ri.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.getCenter(t.center),t.radius=.5*this.getSize(ri).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(ni[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),ni[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),ni[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),ni[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),ni[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),ni[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),ni[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),ni[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(ni)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}ii.prototype.isBox3=!0;const ni=[new Ke,new Ke,new Ke,new Ke,new Ke,new Ke,new Ke,new Ke],ri=new Ke,si=new ii,ai=new Ke,oi=new Ke,li=new Ke,ci=new Ke,hi=new Ke,ui=new Ke,di=new Ke,pi=new Ke,fi=new Ke,mi=new Ke;function gi(t,e,i,n,r){for(let s=0,a=t.length-3;s<=a;s+=3){mi.fromArray(t,s);const a=r.x*Math.abs(mi.x)+r.y*Math.abs(mi.y)+r.z*Math.abs(mi.z),o=e.dot(mi),l=i.dot(mi),c=n.dot(mi);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const vi=new ii,yi=new Ke,xi=new Ke,wi=new Ke;class bi{constructor(t=new Ke,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):vi.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){wi.subVectors(t,this.center);const e=wi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.add(wi.multiplyScalar(i/t)),this.radius+=i}return this}union(t){return xi.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(yi.copy(t.center).add(xi)),this.expandByPoint(yi.copy(t.center).sub(xi)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const _i=new Ke,Mi=new Ke,Si=new Ke,Ei=new Ke,Ti=new Ke,Ai=new Ke,Li=new Ke;class Ci{constructor(t=new Ke,e=new Ke(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_i)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_i.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_i.copy(this.direction).multiplyScalar(e).add(this.origin),_i.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Mi.copy(t).add(e).multiplyScalar(.5),Si.copy(e).sub(t).normalize(),Ei.copy(this.origin).sub(Mi);const r=.5*t.distanceTo(e),s=-this.direction.dot(Si),a=Ei.dot(this.direction),o=-Ei.dot(Si),l=Ei.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return i&&i.copy(this.direction).multiplyScalar(h).add(this.origin),n&&n.copy(Si).multiplyScalar(u).add(Mi),d}intersectSphere(t,e){_i.subVectors(t.center,this.origin);const i=_i.dot(this.direction),n=_i.dot(_i)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(i=(t.min.x-u.x)*l,n=(t.max.x-u.x)*l):(i=(t.max.x-u.x)*l,n=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,_i)}intersectTriangle(t,e,i,n,r){Ti.subVectors(e,t),Ai.subVectors(i,t),Li.crossVectors(Ti,Ai);let s,a=this.direction.dot(Li);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Ei.subVectors(this.origin,t);const o=s*this.direction.dot(Ai.crossVectors(Ei,Ai));if(o<0)return null;const l=s*this.direction.dot(Ti.cross(Ei));if(l<0)return null;if(o+l>a)return null;const c=-s*Ei.dot(Li);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Ri{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,a,o,l,c,h,u,d,p,f,m){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=f,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Ri).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Pi.setFromMatrixColumn(t,0).length(),r=1/Pi.setFromMatrixColumn(t,1).length(),s=1/Pi.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=i+n*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=n+i*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t+r*a,e[4]=n*a-i,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=i*a-n,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=n+i*a,e[1]=i+n*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=n*l-i,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=i*l-n,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=n*h+i,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=i*h+n,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=i*h-n,e[2]=n*h-i,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ni,t,zi)}lookAt(t,e,i){const n=this.elements;return Fi.subVectors(t,e),0===Fi.lengthSq()&&(Fi.z=1),Fi.normalize(),Di.crossVectors(i,Fi),0===Di.lengthSq()&&(1===Math.abs(i.z)?Fi.x+=1e-4:Fi.z+=1e-4,Fi.normalize(),Di.crossVectors(i,Fi)),Di.normalize(),Bi.crossVectors(Fi,Di),n[0]=Di.x,n[4]=Bi.x,n[8]=Fi.x,n[1]=Di.y,n[5]=Bi.y,n[9]=Fi.y,n[2]=Di.z,n[6]=Bi.z,n[10]=Fi.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],h=i[5],u=i[9],d=i[13],p=i[2],f=i[6],m=i[10],g=i[14],v=i[3],y=i[7],x=i[11],w=i[15],b=n[0],_=n[4],M=n[8],S=n[12],E=n[1],T=n[5],A=n[9],L=n[13],C=n[2],R=n[6],P=n[10],I=n[14],N=n[3],z=n[7],D=n[11],B=n[15];return r[0]=s*b+a*E+o*C+l*N,r[4]=s*_+a*T+o*R+l*z,r[8]=s*M+a*A+o*P+l*D,r[12]=s*S+a*L+o*I+l*B,r[1]=c*b+h*E+u*C+d*N,r[5]=c*_+h*T+u*R+d*z,r[9]=c*M+h*A+u*P+d*D,r[13]=c*S+h*L+u*I+d*B,r[2]=p*b+f*E+m*C+g*N,r[6]=p*_+f*T+m*R+g*z,r[10]=p*M+f*A+m*P+g*D,r[14]=p*S+f*L+m*I+g*B,r[3]=v*b+y*E+x*C+w*N,r[7]=v*_+y*T+x*R+w*z,r[11]=v*M+y*A+x*P+w*D,r[15]=v*S+y*L+x*I+w*B,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-n*l*h-r*a*u+i*l*u+n*a*d-i*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-n*s*d+n*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+i*s*d+r*a*c-i*l*c)+t[15]*(-n*a*c-e*o*h+e*a*u+n*s*h-i*s*u+i*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],f=t[13],m=t[14],g=t[15],v=h*m*l-f*u*l+f*o*d-a*m*d-h*o*g+a*u*g,y=p*u*l-c*m*l-p*o*d+s*m*d+c*o*g-s*u*g,x=c*f*l-p*h*l+p*a*d-s*f*d-c*a*g+s*h*g,w=p*h*o-c*f*o-p*a*u+s*f*u+c*a*m-s*h*m,b=e*v+i*y+n*x+r*w;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const _=1/b;return t[0]=v*_,t[1]=(f*u*r-h*m*r-f*n*d+i*m*d+h*n*g-i*u*g)*_,t[2]=(a*m*r-f*o*r+f*n*l-i*m*l-a*n*g+i*o*g)*_,t[3]=(h*o*r-a*u*r-h*n*l+i*u*l+a*n*d-i*o*d)*_,t[4]=y*_,t[5]=(c*m*r-p*u*r+p*n*d-e*m*d-c*n*g+e*u*g)*_,t[6]=(p*o*r-s*m*r-p*n*l+e*m*l+s*n*g-e*o*g)*_,t[7]=(s*u*r-c*o*r+c*n*l-e*u*l-s*n*d+e*o*d)*_,t[8]=x*_,t[9]=(p*h*r-c*f*r-p*i*d+e*f*d+c*i*g-e*h*g)*_,t[10]=(s*f*r-p*a*r+p*i*l-e*f*l-s*i*g+e*a*g)*_,t[11]=(c*a*r-s*h*r-c*i*l+e*h*l+s*i*d-e*a*d)*_,t[12]=w*_,t[13]=(c*f*n-p*h*n+p*i*u-e*f*u-c*i*m+e*h*m)*_,t[14]=(p*a*n-s*f*n-p*i*o+e*f*o+s*i*m-e*a*m)*_,t[15]=(s*h*n-c*a*n+c*i*o-e*h*o-s*i*u+e*a*u)*_,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,n,r,s){return this.set(1,i,r,0,t,1,s,0,e,n,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,f=s*c,m=s*h,g=a*h,v=o*l,y=o*c,x=o*h,w=i.x,b=i.y,_=i.z;return n[0]=(1-(f+g))*w,n[1]=(d+x)*w,n[2]=(p-y)*w,n[3]=0,n[4]=(d-x)*b,n[5]=(1-(u+g))*b,n[6]=(m+v)*b,n[7]=0,n[8]=(p+y)*_,n[9]=(m-v)*_,n[10]=(1-(u+f))*_,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Pi.set(n[0],n[1],n[2]).length();const s=Pi.set(n[4],n[5],n[6]).length(),a=Pi.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Ii.copy(this);const o=1/r,l=1/s,c=1/a;return Ii.elements[0]*=o,Ii.elements[1]*=o,Ii.elements[2]*=o,Ii.elements[4]*=l,Ii.elements[5]*=l,Ii.elements[6]*=l,Ii.elements[8]*=c,Ii.elements[9]*=c,Ii.elements[10]*=c,e.setFromRotationMatrix(Ii),i.x=r,i.y=s,i.z=a,this}makePerspective(t,e,i,n,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(i-n),c=(e+t)/(e-t),h=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,n,r,s){const a=this.elements,o=1/(e-t),l=1/(i-n),c=1/(s-r),h=(e+t)*o,u=(i+n)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}Ri.prototype.isMatrix4=!0;const Pi=new Ke,Ii=new Ri,Ni=new Ke(0,0,0),zi=new Ke(1,1,1),Di=new Ke,Bi=new Ke,Fi=new Ke,Oi=new Ri,ki=new $e;class Hi{constructor(t=0,e=0,i=0,n=Hi.DefaultOrder){this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n=this._order){return this._x=t,this._y=e,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const n=t.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],h=n[2],u=n[6],d=n[10];switch(e){case"XYZ":this._y=Math.asin(Oe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-Oe(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(Oe(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Oe(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(Oe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Oe(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Oi.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Oi,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ki.setFromEuler(this),this.setFromQuaternion(ki,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new Ke(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}Hi.prototype.isEuler=!0,Hi.DefaultOrder="XYZ",Hi.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class Ui{constructor(){this.mask=1}set(t){this.mask=1<1){for(let t=0;t1){for(let t=0;t0){n.children=[];for(let e=0;e0){n.animations=[];for(let e=0;e0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){nn.subVectors(n,e),rn.subVectors(i,e),sn.subVectors(t,e);const s=nn.dot(nn),a=nn.dot(rn),o=nn.dot(sn),l=rn.dot(rn),c=rn.dot(sn),h=s*l-a*a;if(0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,an),an.x>=0&&an.y>=0&&an.x+an.y<=1}static getUV(t,e,i,n,r,s,a,o){return this.getBarycoord(t,e,i,n,an),o.set(0,0),o.addScaledVector(r,an.x),o.addScaledVector(s,an.y),o.addScaledVector(a,an.z),o}static isFrontFacing(t,e,i,n){return nn.subVectors(i,e),rn.subVectors(t,e),nn.cross(rn).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return nn.subVectors(this.c,this.b),rn.subVectors(this.a,this.b),.5*nn.cross(rn).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return pn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return pn.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return pn.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return pn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return pn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,n=this.b,r=this.c;let s,a;on.subVectors(n,i),ln.subVectors(r,i),hn.subVectors(t,i);const o=on.dot(hn),l=ln.dot(hn);if(o<=0&&l<=0)return e.copy(i);un.subVectors(t,n);const c=on.dot(un),h=ln.dot(un);if(c>=0&&h<=c)return e.copy(n);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(i).addScaledVector(on,s);dn.subVectors(t,r);const d=on.dot(dn),p=ln.dot(dn);if(p>=0&&d<=p)return e.copy(r);const f=d*l-o*p;if(f<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(i).addScaledVector(ln,a);const m=c*p-d*h;if(m<=0&&h-c>=0&&d-p>=0)return cn.subVectors(r,n),a=(h-c)/(h-c+(d-p)),e.copy(n).addScaledVector(cn,a);const g=1/(m+f+u);return s=f*g,a=u*g,e.copy(i).addScaledVector(on,s).addScaledVector(ln,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let fn=0;class mn extends Ne{constructor(){super(),Object.defineProperty(this,"id",{value:fn++}),this.uuid=Fe(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.format=ge,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=Kt,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Ce,this.stencilZFail=Ce,this.stencilZPass=Ce,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),this.sheenTint&&this.sheenTint.isColor&&(i.sheenTint=this.sheenTint.getHex()),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularTint&&this.specularTint.isColor&&(i.specularTint=this.specularTint.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularTintMap&&this.specularTintMap.isTexture&&(i.specularTintMap=this.specularTintMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationTint&&(i.attenuationTint=this.attenuationTint.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),this.format!==ge&&(i.format=this.format),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.format=t.format,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}mn.prototype.isMaterial=!0;const gn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},vn={h:0,s:0,l:0},yn={h:0,s:0,l:0};function xn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}function wn(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function bn(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class _n{constructor(t,e,i){return void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,i){return this.r=t,this.g=e,this.b=i,this}setHSL(t,e,i){if(t=(t%(n=1)+n)%n,e=Oe(e,0,1),i=Oe(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=xn(r,n,t+1/3),this.g=xn(r,n,t),this.b=xn(r,n,t-1/3)}var n;return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const i=parseFloat(t[1])/360,n=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(i,n,r)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=i[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=gn[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const i=e>0?1/e:1;return this.r=Math.pow(t.r,i),this.g=Math.pow(t.g,i),this.b=Math.pow(t.b,i),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=bn(t.r),this.g=bn(t.g),this.b=bn(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){const e=this.r,i=this.g,n=this.b,r=Math.max(e,i,n),s=Math.min(e,i,n);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(i-n)/t+(ie&&(e=t[i]);return e}Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;let Pn=0;const In=new Ri,Nn=new en,zn=new Ke,Dn=new ii,Bn=new ii,Fn=new Ke;class On extends Ne{constructor(){super(),Object.defineProperty(this,"id",{value:Pn++}),this.uuid=Fe(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(Rn(t)>65535?Ln:An)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,i=0){this.groups.push({start:t,count:e,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const e=(new Ge).getNormalMatrix(t);i.applyNormalMatrix(e),i.needsUpdate=!0}const n=this.attributes.tangent;return void 0!==n&&(n.transformDirection(t),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return In.makeRotationFromQuaternion(t),this.applyMatrix4(In),this}rotateX(t){return In.makeRotationX(t),this.applyMatrix4(In),this}rotateY(t){return In.makeRotationY(t),this.applyMatrix4(In),this}rotateZ(t){return In.makeRotationZ(t),this.applyMatrix4(In),this}translate(t,e,i){return In.makeTranslation(t,e,i),this.applyMatrix4(In),this}scale(t,e,i){return In.makeScale(t,e,i),this.applyMatrix4(In),this}lookAt(t){return Nn.lookAt(t),Nn.updateMatrix(),this.applyMatrix4(Nn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(zn).negate(),this.translate(zn.x,zn.y,zn.z),this}setFromPoints(t){const e=[];for(let i=0,n=t.length;i0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e];t.data.attributes[e]=n.toJSON(t.data)}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new On).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const i=this.geometry,n=this.material,r=this.matrixWorld;if(void 0===n)return;if(null===i.boundingSphere&&i.computeBoundingSphere(),Un.copy(i.boundingSphere),Un.applyMatrix4(r),!1===t.ray.intersectsSphere(Un))return;if(kn.copy(r).invert(),Hn.copy(t.ray).applyMatrix4(kn),null!==i.boundingBox&&!1===Hn.intersectsBox(i.boundingBox))return;let s;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position,o=i.morphAttributes.position,l=i.morphTargetsRelative,c=i.attributes.uv,h=i.attributes.uv2,u=i.groups,d=i.drawRange;if(null!==r)if(Array.isArray(n))for(let i=0,p=u.length;ii.far?null:{distance:c,point:er.clone(),object:t}}(t,e,i,n,Vn,Gn,Wn,tr);if(p){o&&(Qn.fromBufferAttribute(o,c),$n.fromBufferAttribute(o,h),Kn.fromBufferAttribute(o,u),p.uv=pn.getUV(tr,Vn,Gn,Wn,Qn,$n,Kn,new Ve)),l&&(Qn.fromBufferAttribute(l,c),$n.fromBufferAttribute(l,h),Kn.fromBufferAttribute(l,u),p.uv2=pn.getUV(tr,Vn,Gn,Wn,Qn,$n,Kn,new Ve));const t={a:c,b:h,c:u,normal:new Ke,materialIndex:0};pn.getNormal(Vn,Gn,Wn,t.normal),p.face=t}return p}ir.prototype.isMesh=!0;class rr extends On{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,i,n,r,s,p,f,m,g,v){const y=s/m,x=p/g,w=s/2,b=p/2,_=f/2,M=m+1,S=g+1;let E=0,T=0;const A=new Ke;for(let s=0;s0?1:-1,c.push(A.x,A.y,A.z),h.push(o/m),h.push(1-s/g),E+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}lr.prototype.isShaderMaterial=!0;class cr extends en{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Ri,this.projectionMatrix=new Ri,this.projectionMatrixInverse=new Ri}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}cr.prototype.isCamera=!0;class hr extends cr{constructor(t=50,e=1,i=.1,n=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Be*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*De*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Be*Math.atan(Math.tan(.5*De*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*De*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/a,n*=s.width/t,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}hr.prototype.isPerspectiveCamera=!0;const ur=90;class dr extends en{constructor(t,e,i){if(super(),this.type="CubeCamera",!0!==i.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=i;const n=new hr(ur,1,t,e);n.layers=this.layers,n.up.set(0,-1,0),n.lookAt(new Ke(1,0,0)),this.add(n);const r=new hr(ur,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Ke(-1,0,0)),this.add(r);const s=new hr(ur,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Ke(0,1,0)),this.add(s);const a=new hr(ur,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Ke(0,-1,0)),this.add(a);const o=new hr(ur,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Ke(0,0,1)),this.add(o);const l=new hr(ur,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Ke(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,l]=this.children,c=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;const u=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,a),t.setRenderTarget(i,4),t.render(e,o),i.texture.generateMipmaps=u,t.setRenderTarget(i,5),t.render(e,l),t.setRenderTarget(h),t.xr.enabled=c}}class pr extends Xe{constructor(t,e,i,n,r,s,a,o,l,c){super(t=void 0!==t?t:[],e=void 0!==e?e:te,i,n,r,s,a=void 0!==a?a:me,o,l,c),this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}pr.prototype.isCubeTexture=!0;class fr extends Je{constructor(t,e,i){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=i),super(t,t,e),e=e||{},this.texture=new pr(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:oe,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=ge,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={tEquirect:{value:null}},n="\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",r="\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t",s=new rr(5,5,5),a=new lr({name:"CubemapFromEquirect",uniforms:sr(i),vertexShader:n,fragmentShader:r,side:1,blending:0});a.uniforms.tEquirect.value=e;const o=new ir(s,a),l=e.minFilter;return e.minFilter===le&&(e.minFilter=oe),new dr(1,10,this).update(t,o),e.minFilter=l,o.geometry.dispose(),o.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}fr.prototype.isWebGLCubeRenderTarget=!0;const mr=new Ke,gr=new Ke,vr=new Ge;class yr{constructor(t=new Ke(1,0,0),e=0){this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=mr.subVectors(i,e).cross(gr.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const i=t.delta(mr),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:e.copy(i).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||vr.getNormalMatrix(t),n=this.coplanarPoint(mr).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}yr.prototype.isPlane=!0;const xr=new bi,wr=new Ke;class br{constructor(t=new yr,e=new yr,i=new yr,n=new yr,r=new yr,s=new yr){this.planes=[t,e,i,n,r,s]}set(t,e,i,n,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7],u=i[8],d=i[9],p=i[10],f=i[11],m=i[12],g=i[13],v=i[14],y=i[15];return e[0].setComponents(a-n,h-o,f-u,y-m).normalize(),e[1].setComponents(a+n,h+o,f+u,y+m).normalize(),e[2].setComponents(a+r,h+l,f+d,y+g).normalize(),e[3].setComponents(a-r,h-l,f-d,y-g).normalize(),e[4].setComponents(a-s,h-c,f-p,y-v).normalize(),e[5].setComponents(a+s,h+c,f+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),xr.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(xr)}intersectsSprite(t){return xr.center.set(0,0,0),xr.radius=.7071067811865476,xr.applyMatrix4(t.matrixWorld),this.intersectsSphere(xr)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++)if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,wr.y=n.normal.y>0?t.max.y:t.min.y,wr.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(wr)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function _r(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function Mr(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotVH = saturate( dot( geometry.viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float NoH ) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float NoV, float NoL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( NoL + NoV - NoL * NoV ) ) );\n}\nvec3 BRDF_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in GeometricContext geometry ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularTintFactor = specularTint;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARTINTMAP\n\t\t\tspecularTintFactor *= specularTintMapTexelToLinear( texture2D( specularTintMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularTintFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularTintFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenTint = sheenTint;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenTint;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += irradiance * BRDF_Sheen( material.roughness, directLight.direction, geometry, material.sheenTint );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationTint, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = transmission.a;\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationTint;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularTint;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARTINTMAP\n\t\tuniform sampler2D specularTintMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenTint;\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - clearcoat * Fcc ) + clearcoatSpecular * clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},Tr={common:{diffuse:{value:new _n(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Ge},uv2Transform:{value:new Ge},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Ve(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new _n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new _n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Ge}},sprite:{diffuse:{value:new _n(16777215)},opacity:{value:1},center:{value:new Ve(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Ge}}},Ar={basic:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.fog]),vertexShader:Er.meshbasic_vert,fragmentShader:Er.meshbasic_frag},lambert:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)}}]),vertexShader:Er.meshlambert_vert,fragmentShader:Er.meshlambert_frag},phong:{uniforms:ar([Tr.common,Tr.specularmap,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)},specular:{value:new _n(1118481)},shininess:{value:30}}]),vertexShader:Er.meshphong_vert,fragmentShader:Er.meshphong_frag},standard:{uniforms:ar([Tr.common,Tr.envmap,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.roughnessmap,Tr.metalnessmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Er.meshphysical_vert,fragmentShader:Er.meshphysical_frag},toon:{uniforms:ar([Tr.common,Tr.aomap,Tr.lightmap,Tr.emissivemap,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.gradientmap,Tr.fog,Tr.lights,{emissive:{value:new _n(0)}}]),vertexShader:Er.meshtoon_vert,fragmentShader:Er.meshtoon_frag},matcap:{uniforms:ar([Tr.common,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,Tr.fog,{matcap:{value:null}}]),vertexShader:Er.meshmatcap_vert,fragmentShader:Er.meshmatcap_frag},points:{uniforms:ar([Tr.points,Tr.fog]),vertexShader:Er.points_vert,fragmentShader:Er.points_frag},dashed:{uniforms:ar([Tr.common,Tr.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Er.linedashed_vert,fragmentShader:Er.linedashed_frag},depth:{uniforms:ar([Tr.common,Tr.displacementmap]),vertexShader:Er.depth_vert,fragmentShader:Er.depth_frag},normal:{uniforms:ar([Tr.common,Tr.bumpmap,Tr.normalmap,Tr.displacementmap,{opacity:{value:1}}]),vertexShader:Er.meshnormal_vert,fragmentShader:Er.meshnormal_frag},sprite:{uniforms:ar([Tr.sprite,Tr.fog]),vertexShader:Er.sprite_vert,fragmentShader:Er.sprite_frag},background:{uniforms:{uvTransform:{value:new Ge},t2D:{value:null}},vertexShader:Er.background_vert,fragmentShader:Er.background_frag},cube:{uniforms:ar([Tr.envmap,{opacity:{value:1}}]),vertexShader:Er.cube_vert,fragmentShader:Er.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Er.equirect_vert,fragmentShader:Er.equirect_frag},distanceRGBA:{uniforms:ar([Tr.common,Tr.displacementmap,{referencePosition:{value:new Ke},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Er.distanceRGBA_vert,fragmentShader:Er.distanceRGBA_frag},shadow:{uniforms:ar([Tr.lights,Tr.fog,{color:{value:new _n(0)},opacity:{value:1}}]),vertexShader:Er.shadow_vert,fragmentShader:Er.shadow_frag}};function Lr(t,e,i,n,r){const s=new _n(0);let a,o,l=0,c=null,h=0,u=null;function d(t,e){i.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),l=e,d(s,l)},getClearAlpha:function(){return l},setClearAlpha:function(t){l=t,d(s,l)},render:function(i,r){let p=!1,f=!0===r.isScene?r.background:null;f&&f.isTexture&&(f=e.get(f));const m=t.xr,g=m.getSession&&m.getSession();g&&"additive"===g.environmentBlendMode&&(f=null),null===f?d(s,l):f&&f.isColor&&(d(f,1),p=!0),(t.autoClear||p)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.mapping===ie)?(void 0===o&&(o=new ir(new rr(1,1,1),new lr({name:"BackgroundCubeMaterial",uniforms:sr(Ar.cube.uniforms),vertexShader:Ar.cube.vertexShader,fragmentShader:Ar.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(o)),o.material.uniforms.envMap.value=f,o.material.uniforms.flipEnvMap.value=f.isCubeTexture&&!1===f.isRenderTargetTexture?-1:1,c===f&&h===f.version&&u===t.toneMapping||(o.material.needsUpdate=!0,c=f,h=f.version,u=t.toneMapping),i.unshift(o,o.geometry,o.material,0,0,null)):f&&f.isTexture&&(void 0===a&&(a=new ir(new Sr(2,2),new lr({name:"BackgroundMaterial",uniforms:sr(Ar.background.uniforms),vertexShader:Ar.background.vertexShader,fragmentShader:Ar.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(a)),a.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),a.material.uniforms.uvTransform.value.copy(f.matrix),c===f&&h===f.version&&u===t.toneMapping||(a.material.needsUpdate=!0,c=f,h=f.version,u=t.toneMapping),i.unshift(a,a.geometry,a.material,0,0,null))}}}function Cr(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=d(null);let c=l;function h(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],i=[],n=[];for(let t=0;t=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=i.get(s);if(void 0===l)continue;const c=l.buffer,h=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,l=i.stride,d=s.offset;if(i&&i.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),f=t.getParameter(34921),m=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),y=u>0,x=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===e.has("EXT_texture_filter_anisotropic")){const i=e.get("EXT_texture_filter_anisotropic");n=t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:f,maxVertexUniforms:m,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:y&&x,maxSamples:s?t.getParameter(36183):0}}function Ir(t){const e=this;let i=null,n=0,r=!1,s=!1;const a=new yr,o=new Ge,l={value:null,needsUpdate:!1};function c(){l.value!==i&&(l.value=i,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(t,i,n,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0){const a=t.getRenderTarget(),o=new fr(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",n),i(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}Ar.physical={uniforms:ar([Ar.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new Ve(1,1)},clearcoatNormalMap:{value:null},sheenTint:{value:new _n(0)},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new Ve},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationTint:{value:new _n(0)},specularIntensity:{value:0},specularIntensityMap:{value:null},specularTint:{value:new _n(1,1,1)},specularTintMap:{value:null}}]),vertexShader:Er.meshphysical_vert,fragmentShader:Er.meshphysical_frag};class zr extends cr{constructor(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,a=n+e,o=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}zr.prototype.isOrthographicCamera=!0;class Dr extends lr{constructor(t){super(t),this.type="RawShaderMaterial"}}Dr.prototype.isRawShaderMaterial=!0;const Br=Math.pow(2,8),Fr=[.125,.215,.35,.446,.526,.582],Or=5+Fr.length,kr={[Ee]:0,[Te]:1,[Le]:2,3004:3,3005:4,3006:5,[Ae]:6},Hr=new zr,{_lodPlanes:Ur,_sizeLods:Vr,_sigmas:Gr}=Qr(),Wr=new _n;let jr=null;const qr=(1+Math.sqrt(5))/2,Xr=1/qr,Yr=[new Ke(1,1,1),new Ke(-1,1,1),new Ke(1,1,-1),new Ke(-1,1,-1),new Ke(0,qr,Xr),new Ke(0,qr,-Xr),new Ke(Xr,0,qr),new Ke(-Xr,0,qr),new Ke(qr,Xr,0),new Ke(-qr,Xr,0)];class Zr{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=function(t){const e=new Float32Array(20),i=new Ke(0,1,0);return new Dr({name:"SphericalGaussianBlur",defines:{n:20},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:e},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}(),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,i=.1,n=100){jr=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,i,n,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t){return this._fromTexture(t)}fromCubemap(t){return this._fromTexture(t)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=es(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=ts(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t2?Br:0,Br,Br),o.setRenderTarget(n),p&&o.render(d,r),o.render(t,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=h,o.outputEncoding=c,o.autoClear=l,t.background=f}_textureToCubeUV(t,e){const i=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=es()):null==this._equirectShader&&(this._equirectShader=ts());const n=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new ir(Ur[0],n),s=n.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=kr[t.encoding],s.outputEncoding.value=kr[e.texture.encoding],Kr(e,0,0,3*Br,2*Br),i.setRenderTarget(e),i.render(r,Hr)}_applyPMREM(t){const e=this._renderer,i=e.autoClear;e.autoClear=!1;for(let e=1;e20&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const m=[];let g=0;for(let t=0;t<20;++t){const e=t/p,i=Math.exp(-e*e/2);m.push(i),0==t?g+=i:t4?n-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Hr)}}function Jr(t){return void 0!==t&&t.type===ce&&(t.encoding===Ee||t.encoding===Te||t.encoding===Ae)}function Qr(){const t=[],e=[],i=[];let n=8;for(let r=0;r4?a=Fr[r-8+4-1]:0==r&&(a=0),i.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,f=2,m=1,g=new Float32Array(p*d*u),v=new Float32Array(f*d*u),y=new Float32Array(m*d*u);for(let t=0;t2?0:-1,n=[e,i,0,e+2/3,i,0,e+2/3,i+1,0,e,i,0,e+2/3,i+1,0,e,i+1,0];g.set(n,p*d*t),v.set(h,f*d*t);const r=[t,t,t,t,t,t];y.set(r,m*d*t)}const x=new On;x.setAttribute("position",new Tn(g,p)),x.setAttribute("uv",new Tn(v,f)),x.setAttribute("faceIndex",new Tn(y,m)),t.push(x),n>4&&n--}return{_lodPlanes:t,_sizeLods:e,_sigmas:i}}function $r(t){const e=new Je(3*Br,3*Br,t);return e.texture.mapping=ie,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Kr(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function ts(){const t=new Ve(1,1);return new Dr({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function es(){return new Dr({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:kr[3e3]},outputEncoding:{value:kr[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function is(t){let e=new WeakMap,i=null;function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping,a=303===s||304===s,o=s===te||s===ee;if(a||o){if(e.has(r))return e.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(t){let e=0;for(let i=0;i<6;i++)void 0!==t[i]&&e++;return 6===e}(s)){const s=t.getRenderTarget();null===i&&(i=new Zr(t));const o=a?i.fromEquirectangular(r):i.fromCubemap(r);return e.set(r,o),t.setRenderTarget(s),r.addEventListener("dispose",n),o.texture}return null}}}return r},dispose:function(){e=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function ns(t){const e={};function i(i){if(void 0!==e[i])return e[i];let n;switch(i){case"WEBGL_depth_texture":n=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=t.getExtension(i)}return e[i]=n,n}return{has:function(t){return null!==i(t)},init:function(t){t.isWebGL2?i("EXT_color_buffer_float"):(i("WEBGL_depth_texture"),i("OES_texture_float"),i("OES_texture_half_float"),i("OES_texture_half_float_linear"),i("OES_standard_derivatives"),i("OES_element_index_uint"),i("OES_vertex_array_object"),i("ANGLE_instanced_arrays")),i("OES_texture_float_linear"),i("EXT_color_buffer_half_float")},get:function(t){const e=i(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function rs(t,e,i,n){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),n.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,i.memory.geometries--}function o(t){const i=[],n=t.index,r=t.attributes.position;let a=0;if(null!==n){const t=n.array;a=n.version;for(let e=0,n=t.length;e65535?Ln:An)(i,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,i.memory.geometries++),e},update:function(t){const i=t.attributes;for(const t in i)e.update(i[t],34962);const n=t.morphAttributes;for(const t in n){const i=n[t];for(let t=0,n=i.length;t0)return t;const r=e*i;let s=vs[r];if(void 0===s&&(s=new Float32Array(r),vs[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function Ms(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i/gm;function Ta(t){return t.replace(Ea,Aa)}function Aa(t,e){const i=Er[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return Ta(i)}const La=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Ca=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Ra(t){return t.replace(Ca,Ia).replace(La,Pa)}function Pa(t,e,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Ia(0,e,i,n)}function Ia(t,e,i,n){let r="";for(let t=parseInt(e);t0?t.gammaFactor:1,p=i.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap||t.transmission)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(_a).join("\n")}(i),f=function(t){const e=[];for(const i in t){const n=t[i];!1!==n&&e.push("#define "+i+" "+n)}return e.join("\n")}(s),m=r.createProgram();let g,v,y=i.glslVersion?"#version "+i.glslVersion+"\n":"";i.isRawShaderMaterial?(g=[f].filter(_a).join("\n"),g.length>0&&(g+="\n"),v=[p,f].filter(_a).join("\n"),v.length>0&&(v+="\n")):(g=[Na(i),"#define SHADER_NAME "+i.shaderName,f,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+h:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularTintMap?"#define USE_SPECULARTINTMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+l:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(_a).join("\n"),v=[p,Na(i),"#define SHADER_NAME "+i.shaderName,f,"#define GAMMA_FACTOR "+d,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+c:"",i.envMap?"#define "+h:"",i.envMap?"#define "+u:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularTintMap?"#define USE_SPECULARTINTMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheenTint?"#define USE_SHEEN":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+l:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(i.extensionShaderTextureLOD||i.envMap)&&i.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?Er.tonemapping_pars_fragment:"",0!==i.toneMapping?ba("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.format===me?"#define OPAQUE":"",Er.encodings_pars_fragment,i.map?xa("mapTexelToLinear",i.mapEncoding):"",i.matcap?xa("matcapTexelToLinear",i.matcapEncoding):"",i.envMap?xa("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMap?xa("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.specularTintMap?xa("specularTintMapTexelToLinear",i.specularTintMapEncoding):"",i.lightMap?xa("lightMapTexelToLinear",i.lightMapEncoding):"",wa("linearToOutputTexel",i.outputEncoding),i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(_a).join("\n")),a=Ta(a),a=Ma(a,i),a=Sa(a,i),o=Ta(o),o=Ma(o,i),o=Sa(o,i),a=Ra(a),o=Ra(o),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(y="#version 300 es\n",g=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",i.glslVersion===Ie?"":"out highp vec4 pc_fragColor;",i.glslVersion===Ie?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v);const x=y+v+o,w=ma(r,35633,y+g+a),b=ma(r,35632,x);if(r.attachShader(m,w),r.attachShader(m,b),void 0!==i.index0AttributeName?r.bindAttribLocation(m,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(m,0,"position"),r.linkProgram(m),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(m).trim(),e=r.getShaderInfoLog(w).trim(),i=r.getShaderInfoLog(b).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(m,35714)){n=!1;const e=ya(r,w,"vertex"),i=ya(r,b,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(m,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+i)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:g},fragmentShader:{log:i,prefix:v}})}let _,M;return r.deleteShader(w),r.deleteShader(b),this.getUniforms=function(){return void 0===_&&(_=new fa(r,m)),_},this.getAttributes=function(){return void 0===M&&(M=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r0,L=s.clearcoat>0;return{isWebGL2:l,shaderID:_,shaderName:s.type,vertexShader:S,fragmentShader:E,defines:s.defines,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:p,instancing:!0===y.isInstancedMesh,instancingColor:!0===y.isInstancedMesh&&null!==y.instanceColor,supportsVertexTextures:d,outputEncoding:null!==T?g(T.texture):t.outputEncoding,map:!!s.map,mapEncoding:g(s.map),matcap:!!s.matcap,matcapEncoding:g(s.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:g(b),envMapCubeUV:!!b&&(b.mapping===ie||307===b.mapping),lightMap:!!s.lightMap,lightMapEncoding:g(s.lightMap),aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,emissiveMapEncoding:g(s.emissiveMap),bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,clearcoat:L,clearcoatMap:L&&!!s.clearcoatMap,clearcoatRoughnessMap:L&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:L&&!!s.clearcoatNormalMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularTintMap:!!s.specularTintMap,specularTintMapEncoding:g(s.specularTintMap),alphaMap:!!s.alphaMap,alphaTest:A,gradientMap:!!s.gradientMap,sheenTint:!!s.sheenTint&&(s.sheenTint.r>0||s.sheenTint.g>0||s.sheenTint.b>0),transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!y.geometry&&!!y.geometry.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!y.geometry&&!!y.geometry.attributes.color&&4===y.geometry.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularTintMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularTintMap||!s.displacementMap),fog:!!x,useFog:s.fog,fogExp2:x&&x.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:c,skinning:!0===y.isSkinnedMesh&&M>0,maxBones:M,useVertexTexture:h,morphTargets:!!y.geometry&&!!y.geometry.morphAttributes.position,morphNormals:!!y.geometry&&!!y.geometry.morphAttributes.normal,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,format:s.format,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&m.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,depthPacking:void 0!==s.depthPacking&&s.depthPacking,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:l||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:l||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:l||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.fragmentShader),i.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t0?r.push(h):!0===i.transparent?s.push(h):n.push(h)},unshift:function(t,e,i,a,l,c){const h=o(t,e,i,a,l,c);i.transmission>0?r.unshift(h):!0===i.transparent?s.unshift(h):n.unshift(h)},finish:function(){for(let t=i,n=e.length;t1&&n.sort(t||Fa),r.length>1&&r.sort(e||Oa),s.length>1&&s.sort(e||Oa)}}}function Ha(t){let e=new WeakMap;return{get:function(i,n){let r;return!1===e.has(i)?(r=new ka(t),e.set(i,[r])):n>=e.get(i).length?(r=new ka(t),e.get(i).push(r)):r=e.get(i)[n],r},dispose:function(){e=new WeakMap}}}function Ua(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new Ke,color:new _n};break;case"SpotLight":i={position:new Ke,direction:new Ke,color:new _n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new Ke,color:new _n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new Ke,skyColor:new _n,groundColor:new _n};break;case"RectAreaLight":i={color:new _n,position:new Ke,halfWidth:new Ke,halfHeight:new Ke}}return t[e.id]=i,i}}}let Va=0;function Ga(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function Wa(t,e){const i=new Ua,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ve};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ve,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new Ke);const s=new Ke,a=new Ri,o=new Ri;return{setup:function(s,a){let o=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,u=0,d=0,p=0,f=0,m=0,g=0,v=0;s.sort(Ga);const y=!0!==a?Math.PI:1;for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Tr.LTC_FLOAT_1,r.rectAreaLTC2=Tr.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Tr.LTC_HALF_1,r.rectAreaLTC2=Tr.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const x=r.hash;x.directionalLength===h&&x.pointLength===u&&x.spotLength===d&&x.rectAreaLength===p&&x.hemiLength===f&&x.numDirectionalShadows===m&&x.numPointShadows===g&&x.numSpotShadows===v||(r.directional.length=h,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=f,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=g,r.spotShadowMatrix.length=v,x.directionalLength=h,x.pointLength=u,x.spotLength=d,x.rectAreaLength=p,x.hemiLength=f,x.numDirectionalShadows=m,x.numPointShadows=g,x.numSpotShadows=v,r.version=Va++)},setupView:function(t,e){let i=0,n=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=i.get(n).length?(s=new ja(t,e),i.get(n).push(s)):s=i.get(n)[r],s},dispose:function(){i=new WeakMap}}}class Xa extends mn{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}Xa.prototype.isMeshDepthMaterial=!0;class Ya extends mn{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Ke,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}function Za(t,e,i){let n=new br;const r=new Ve,s=new Ve,a=new Ze,o=new Xa({depthPacking:3201}),l=new Ya,c={},h=i.maxTextureSize,u={0:1,1:0,2:2},d=new lr({uniforms:{shadow_pass:{value:null},resolution:{value:new Ve},radius:{value:4},samples:{value:8}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nuniform float samples;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const f=new On;f.setAttribute("position",new Tn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new ir(f,d),g=this;function v(i,n){const r=e.update(m);d.uniforms.shadow_pass.value=i.map.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,d.uniforms.samples.value=i.blurSamples,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,r,d,m,null),p.uniforms.shadow_pass.value=i.mapPass.texture,p.uniforms.resolution.value=i.mapSize,p.uniforms.radius.value=i.radius,p.uniforms.samples.value=i.blurSamples,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,r,p,m,null)}function y(e,i,n,r,s,a,h){let d=null;const p=!0===r.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(d=void 0!==p?p:!0===r.isPointLight?l:o,t.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0){const t=d.uuid,e=n.uuid;let i=c[t];void 0===i&&(i={},c[t]=i);let r=i[e];void 0===r&&(r=d.clone(),i[e]=r),d=r}return d.visible=n.visible,d.wireframe=n.wireframe,d.side=3===h?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],d.alphaMap=n.alphaMap,d.alphaTest=n.alphaTest,d.clipShadows=n.clipShadows,d.clippingPlanes=n.clippingPlanes,d.clipIntersection=n.clipIntersection,d.displacementMap=n.displacementMap,d.displacementScale=n.displacementScale,d.displacementBias=n.displacementBias,d.wireframeLinewidth=n.wireframeLinewidth,d.linewidth=n.linewidth,!0===r.isPointLight&&!0===d.isMeshDistanceMaterial&&(d.referencePosition.setFromMatrixPosition(r.matrixWorld),d.nearDistance=s,d.farDistance=a),d}function x(i,r,s,a,o){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let l=0,c=e.length;lh||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:oe,magFilter:oe,format:ge};u.map=new Je(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Je(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:ae,magFilter:ae,format:ge};u.map=new Je(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t=1):-1!==L.indexOf("OpenGL ES")&&(A=parseFloat(/^OpenGL ES (\d)/.exec(L)[1]),T=A>=2);let C=null,R={};const P=t.getParameter(3088),I=t.getParameter(2978),N=(new Ze).fromArray(P),z=(new Ze).fromArray(I);function D(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;en||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?Ue:Math.floor,s=n(r*t.width),a=n(r*t.height);void 0===p&&(p=m(s,a));const o=i?m(s,a):p;return o.width=s,o.height=a,o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function v(t){return He(t.width)&&He(t.height)}function y(t,e){return t.generateMipmaps&&e&&t.minFilter!==ae&&t.minFilter!==oe}function x(e,i,r,s,a=1){t.generateMipmap(e),n.get(i).__maxMipLevel=Math.log2(Math.max(r,s,a))}function w(i,n,r){if(!1===o)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let s=n;return 6403===n&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===n&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===n&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function b(t){return t===ae||1004===t||1005===t?9728:9729}function _(e){const i=e.target;i.removeEventListener("dispose",_),function(e){const i=n.get(e);void 0!==i.__webglInit&&(t.deleteTexture(i.__webglTexture),n.remove(e))}(i),i.isVideoTexture&&d.delete(i),a.memory.textures--}function M(e){const i=e.target;i.removeEventListener("dispose",M),function(e){const i=e.texture,r=n.get(e),s=n.get(i);if(e){if(void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--),e.depthTexture&&e.depthTexture.dispose(),e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(e.isWebGLMultipleRenderTargets)for(let e=0,r=i.length;e0&&r.__version!==t.version){const i=t.image;if(void 0===i)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==i.complete)return void P(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+e),i.bindTexture(3553,r.__webglTexture)}function T(e,r){const a=n.get(e);e.version>0&&a.__version!==e.version?function(e,n,r){if(6!==n.image.length)return;R(e,n),i.activeTexture(33984+r),i.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment),t.pixelStorei(37443,0);const a=n&&(n.isCompressedTexture||n.image[0].isCompressedTexture),l=n.image[0]&&n.image[0].isDataTexture,h=[];for(let t=0;t<6;t++)h[t]=a||l?l?n.image[t].image:n.image[t]:g(n.image[t],!1,!0,c);const u=h[0],d=v(u)||o,p=s.convert(n.format),f=s.convert(n.type),m=w(n.internalFormat,p,f);let b;if(C(34067,n,d),a){for(let t=0;t<6;t++){b=h[t].mipmaps;for(let e=0;e1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function R(e,i){void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",_),e.__webglTexture=t.createTexture(),a.memory.textures++)}function P(e,n,r){let a=3553;n.isDataTexture2DArray&&(a=35866),n.isDataTexture3D&&(a=32879),R(e,n),i.activeTexture(33984+r),i.bindTexture(a,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment),t.pixelStorei(37443,0);const l=function(t){return!o&&(t.wrapS!==re||t.wrapT!==re||t.minFilter!==ae&&t.minFilter!==oe)}(n)&&!1===v(n.image),c=g(n.image,l,!1,h),u=v(c)||o,d=s.convert(n.format);let p,f=s.convert(n.type),m=w(n.internalFormat,d,f);C(a,n,u);const b=n.mipmaps;if(n.isDepthTexture)m=6402,o?m=n.type===de?36012:n.type===ue?33190:n.type===fe?35056:33189:n.type===de&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===ve&&6402===m&&n.type!==he&&n.type!==ue&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=he,f=s.convert(n.type)),n.format===ye&&6402===m&&(m=34041,n.type!==fe&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=fe,f=s.convert(n.type))),i.texImage2D(3553,0,m,c.width,c.height,0,d,f,null);else if(n.isDataTexture)if(b.length>0&&u){for(let t=0,e=b.length;t0&&u){for(let t=0,e=b.length;t=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),S+=1,t},this.resetTextureUnits=function(){S=0},this.setTexture2D=E,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?P(r,t,e):(i.activeTexture(33984+e),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?P(r,t,e):(i.activeTexture(33984+e),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=T,this.setupRenderTarget=function(e){const l=e.texture,c=n.get(e),h=n.get(l);e.addEventListener("dispose",M),!0!==e.isWebGLMultipleRenderTargets&&(h.__webglTexture=t.createTexture(),h.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=!0===e.isWebGLMultisampleRenderTarget,f=l.isDataTexture3D||l.isDataTexture2DArray,m=v(e)||o;if(!o||l.format!==me||l.type!==de&&l.type!==pe||(l.format=ge,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let e=0;e<6;e++)c.__webglFramebuffer[e]=t.createFramebuffer()}else if(c.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const i=e.texture;for(let e=0,r=i.length;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class no extends Ne{constructor(t,e){super();const i=this,n=t.state;let r=null,s=1,a=null,o="local-floor",l=null,c=null,h=null,u=null,d=null,p=!1,f=null,m=null,g=null,v=null,y=null,x=null;const w=[],b=new Map,_=new hr;_.layers.enable(1),_.viewport=new Ze;const M=new hr;M.layers.enable(2),M.viewport=new Ze;const S=[_,M],E=new Ka;E.layers.enable(1),E.layers.enable(2);let T=null,A=null;function L(t){const e=b.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function C(){b.forEach((function(t,e){t.disconnect(e)})),b.clear(),T=null,A=null,n.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),h&&e.deleteFramebuffer(h),f&&e.deleteFramebuffer(f),m&&e.deleteRenderbuffer(m),g&&e.deleteRenderbuffer(g),h=null,f=null,m=null,g=null,d=null,u=null,c=null,r=null,D.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function R(t){const e=r.inputSources;for(let t=0;t0&&(e.alphaTest.value=i.alphaTest);const n=t.get(i).envMap;if(n){e.envMap.value=n,e.flipEnvMap.value=n.isCubeTexture&&!1===n.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio;const r=t.get(n).__maxMipLevel;void 0!==r&&(e.maxMipLevel.value=r)}let r,s;i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity),i.map?r=i.map:i.specularMap?r=i.specularMap:i.displacementMap?r=i.displacementMap:i.normalMap?r=i.normalMap:i.bumpMap?r=i.bumpMap:i.roughnessMap?r=i.roughnessMap:i.metalnessMap?r=i.metalnessMap:i.alphaMap?r=i.alphaMap:i.emissiveMap?r=i.emissiveMap:i.clearcoatMap?r=i.clearcoatMap:i.clearcoatNormalMap?r=i.clearcoatNormalMap:i.clearcoatRoughnessMap?r=i.clearcoatRoughnessMap:i.specularIntensityMap?r=i.specularIntensityMap:i.specularTintMap?r=i.specularTintMap:i.transmissionMap?r=i.transmissionMap:i.thicknessMap&&(r=i.thicknessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),i.aoMap?s=i.aoMap:i.lightMap&&(s=i.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),e.uv2Transform.value.copy(s.matrix))}function i(e,i){e.roughness.value=i.roughness,e.metalness.value=i.metalness,i.roughnessMap&&(e.roughnessMap.value=i.roughnessMap),i.metalnessMap&&(e.metalnessMap.value=i.metalnessMap),i.emissiveMap&&(e.emissiveMap.value=i.emissiveMap),i.bumpMap&&(e.bumpMap.value=i.bumpMap,e.bumpScale.value=i.bumpScale,1===i.side&&(e.bumpScale.value*=-1)),i.normalMap&&(e.normalMap.value=i.normalMap,e.normalScale.value.copy(i.normalScale),1===i.side&&e.normalScale.value.negate()),i.displacementMap&&(e.displacementMap.value=i.displacementMap,e.displacementScale.value=i.displacementScale,e.displacementBias.value=i.displacementBias),t.get(i).envMap&&(e.envMapIntensity.value=i.envMapIntensity)}return{refreshFogUniforms:function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)},refreshMaterialUniforms:function(t,n,r,s,a){n.isMeshBasicMaterial?e(t,n):n.isMeshLambertMaterial?(e(t,n),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(t,n)):n.isMeshToonMaterial?(e(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshPhongMaterial?(e(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshStandardMaterial?(e(t,n),n.isMeshPhysicalMaterial?function(t,e,n){i(t,e),t.ior.value=e.ior,e.sheenTint&&t.sheenTint.value.copy(e.sheenTint),e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate())),e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=n.texture,t.transmissionSamplerSize.value.set(n.width,n.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationTint.value.copy(e.attenuationTint)),t.specularIntensity.value=e.specularIntensity,t.specularTint.value.copy(e.specularTint),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap),e.specularTintMap&&(t.specularTintMap.value=e.specularTintMap)}(t,n,a):i(t,n)):n.isMeshMatcapMaterial?(e(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDepthMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDistanceMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?(e(t,n),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){let r;t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.alphaTest>0&&(t.alphaTest.value=e.alphaTest),e.map?r=e.map:e.alphaMap&&(r=e.alphaMap),void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){let i;t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.alphaTest>0&&(t.alphaTest.value=e.alphaTest),e.map?i=e.map:e.alphaMap&&(i=e.alphaMap),void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function so(t={}){const e=void 0!==t.canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),i=void 0!==t.context?t.context:null,n=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],f=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=Ee,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const m=this;let g=!1,v=0,y=0,x=null,w=-1,b=null;const _=new Ze,M=new Ze;let S=null,E=e.width,T=e.height,A=1,L=null,C=null;const R=new Ze(0,0,E,T),P=new Ze(0,0,E,T);let I=!1;const N=[],z=new br;let D=!1,B=!1,F=null;const O=new Ri,k=new Ke,H={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function U(){return null===x?A:1}let V,G,W,j,q,X,Y,Z,J,Q,$,K,tt,et,it,nt,rt,st,at,ot,lt,ct,ht,ut=i;function dt(t,i){for(let n=0;n0&&function(t,e,i){if(null===F){const t=!0===a&&!0===G.isWebGL2;F=new(t?Qe:Je)(1024,1024,{generateMipmaps:!0,type:null!==ct.convert(pe)?pe:ce,minFilter:le,magFilter:ae,wrapS:re,wrapT:re})}const n=m.getRenderTarget();m.setRenderTarget(F),m.clear();const r=m.toneMapping;m.toneMapping=0,St(t,e,i),m.toneMapping=r,X.updateMultisampleRenderTarget(F),X.updateRenderTargetMipmap(F),m.setRenderTarget(n)}(r,e,i),n&&W.viewport(_.copy(n)),r.length>0&&St(r,e,i),s.length>0&&St(s,e,i),o.length>0&&St(o,e,i)}function St(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r0?f[f.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return v},this.getActiveMipmapLevel=function(){return y},this.getRenderTarget=function(){return x},this.setRenderTarget=function(t,e=0,i=0){x=t,v=e,y=i,t&&void 0===q.get(t).__webglFramebuffer&&X.setupRenderTarget(t);let n=null,r=!1,s=!1;if(t){const i=t.texture;(i.isDataTexture3D||i.isDataTexture2DArray)&&(s=!0);const a=q.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(n=a[e],r=!0):n=t.isWebGLMultisampleRenderTarget?q.get(t).__webglMultisampledFramebuffer:a,_.copy(t.viewport),M.copy(t.scissor),S=t.scissorTest}else _.copy(R).multiplyScalar(A).floor(),M.copy(P).multiplyScalar(A).floor(),S=I;if(W.bindFramebuffer(36160,n)&&G.drawBuffers){let e=!1;if(t)if(t.isWebGLMultipleRenderTargets){const i=t.texture;if(N.length!==i.length||36064!==N[0]){for(let t=0,e=i.length;t=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&ut.readPixels(e,i,n,r,ct.convert(o),ct.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==x?q.get(x).__webglFramebuffer:null;W.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n);let a=ct.convert(e.format);G.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),X.setTexture2D(e,0),ut.copyTexImage2D(3553,i,a,t.x,t.y,r,s,0),W.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,a=ct.convert(i.format),o=ct.convert(i.type);X.setTexture2D(i,0),ut.pixelStorei(37440,i.flipY),ut.pixelStorei(37441,i.premultiplyAlpha),ut.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?ut.texSubImage2D(3553,n,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?ut.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):ut.texSubImage2D(3553,n,t.x,t.y,a,o,e.image),0===n&&i.generateMipmaps&&ut.generateMipmap(3553),W.unbindTexture()},this.copyTextureToTexture3D=function(t,e,i,n,r=0){if(m.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=ct.convert(n.format),c=ct.convert(n.type);let h;if(n.isDataTexture3D)X.setTexture3D(n,0),h=32879;else{if(!n.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");X.setTexture2DArray(n,0),h=35866}ut.pixelStorei(37440,n.flipY),ut.pixelStorei(37441,n.premultiplyAlpha),ut.pixelStorei(3317,n.unpackAlignment);const u=ut.getParameter(3314),d=ut.getParameter(32878),p=ut.getParameter(3316),f=ut.getParameter(3315),g=ut.getParameter(32877),v=i.isCompressedTexture?i.mipmaps[0]:i.image;ut.pixelStorei(3314,v.width),ut.pixelStorei(32878,v.height),ut.pixelStorei(3316,t.min.x),ut.pixelStorei(3315,t.min.y),ut.pixelStorei(32877,t.min.z),i.isDataTexture||i.isDataTexture3D?ut.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v.data):i.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),ut.compressedTexSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,v.data)):ut.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v),ut.pixelStorei(3314,u),ut.pixelStorei(32878,d),ut.pixelStorei(3316,p),ut.pixelStorei(3315,f),ut.pixelStorei(32877,g),0===r&&n.generateMipmaps&&ut.generateMipmap(h),W.unbindTexture()},this.initTexture=function(t){X.setTexture2D(t,0),W.unbindTexture()},this.resetState=function(){v=0,y=0,x=null,W.reset(),ht.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}(class extends so{}).prototype.isWebGL1Renderer=!0;class ao{constructor(t,e=25e-5){this.name="",this.color=new _n(t),this.density=e}clone(){return new ao(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}ao.prototype.isFogExp2=!0;class oo{constructor(t,e=1,i=1e3){this.name="",this.color=new _n(t),this.near=e,this.far=i}clone(){return new oo(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}oo.prototype.isFog=!0;class lo extends en{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}lo.prototype.isScene=!0;class co{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=Re,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Fe()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;nt.far||e.push({distance:o,point:mo.clone(),uv:pn.getUV(mo,bo,_o,Mo,So,Eo,To,new Ve),face:null,object:this})}copy(t){return super.copy(t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}).prototype.isSprite=!0;const Lo=new Ke,Co=new Ze,Ro=new Ze,Po=new Ke,Io=new Ri;class No extends ir{constructor(t,e){super(t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Ri,this.bindMatrixInverse=new Ri}copy(t){return super.copy(t),this.bindMode=t.bindMode,this.bindMatrix.copy(t.bindMatrix),this.bindMatrixInverse.copy(t.bindMatrixInverse),this.skeleton=t.skeleton,this}bind(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.copy(e).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const t=new Ze,e=this.geometry.attributes.skinWeight;for(let i=0,n=e.count;io)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);dt.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}else for(let i=Math.max(0,s.start),n=Math.min(r.count,s.start+s.count)-1;io)continue;u.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(u);nt.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else i.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,i=Object.keys(e);if(i.length>0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}jo.prototype.isLine=!0;const qo=new Ke,Xo=new Ke;class Yo extends jo{constructor(t,e){super(t,e),this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,n=e.count;tr.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,object:a})}}(class extends en{constructor(t=new On,e=new Zo){super(),this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),this.material=t.material,this.geometry=t.geometry,this}raycast(t,e){const i=this.geometry,n=this.matrixWorld,r=t.params.Points.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),$o.copy(i.boundingSphere),$o.applyMatrix4(n),$o.radius+=r,!1===t.ray.intersectsSphere($o))return;Jo.copy(n).invert(),Qo.copy(t.ray).applyMatrix4(Jo);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position;if(null!==r)for(let i=Math.max(0,s.start),l=Math.min(r.count,s.start+s.count);i0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}).prototype.isPoints=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.format=void 0!==a?a:me,this.minFilter=void 0!==s?s:oe,this.magFilter=void 0!==r?r:oe,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1=="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}.prototype.isVideoTexture=!0;(class extends Xe{constructor(t,e,i,n,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,n,r,h,u),this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isCompressedTexture=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.needsUpdate=!0}}.prototype.isCanvasTexture=!0,class extends Xe{constructor(t,e,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:ve)!==ve&&c!==ye)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===ve&&(i=he),void 0===i&&c===ye&&(i=fe),super(null,n,r,s,a,o,c,i,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:ae,this.minFilter=void 0!==o?o:ae,this.flipY=!1,this.generateMipmaps=!1}}.prototype.isDepthTexture=!0,new Ke,new Ke,new Ke,new pn;class el{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let a,o=0,l=r-1;for(;o<=l;)if(n=Math.floor(o+(l-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){l=n;break}l=n-1}if(n=l,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=e||(s.isVector2?new Ve:new Ke);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new Ke,n=[],r=[],s=[],a=new Ke,o=new Ri;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new Ke),n[e].normalize()}r[0]=new Ke,s[0]=new Ke;let l=Number.MAX_VALUE;const c=Math.abs(n[0].x),h=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=l&&(l=c,i.set(1,0,0)),h<=l&&(l=h,i.set(0,1,0)),u<=l&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(n[e-1],n[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Oe(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(Oe(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class il extends el{constructor(t=0,e=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const i=e||new Ve,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)n;)r-=n;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=n[(l-1)%r]:(sl.subVectors(n[0],n[1]).add(n[0]),a=sl);const h=n[l%r],u=n[(l+1)%r];if(this.closed||l+2n.length-2?n.length-1:s+1],h=n[s>n.length-3?n.length-1:s+2];return i.set(hl(a,o.x,l.x,c.x,h.x),hl(a,o.y,l.y,c.y,h.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e0)for(s=e;s=e;s-=n)a=Ul(s,t[s],t[s+1],a);return a&&Dl(a,a.next)&&(Vl(a),a=a.next),a}function bl(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!Dl(n,n.next)&&0!==zl(n.prev,n,n.next))n=n.next;else{if(Vl(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function _l(t,e,i,n,r,s,a){if(!t)return;!a&&s&&function(t,e,i,n){let r=t;do{null===r.z&&(r.z=Rl(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,a,o,l,c=1;do{for(i=t,t=null,s=null,a=0;i;){for(a++,n=i,o=0,e=0;e0||l>0&&n;)0!==o&&(0===l||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(t,n,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?Sl(t,n,r,s):Ml(t))e.push(o.i/i),e.push(t.i/i),e.push(l.i/i),Vl(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?_l(t=El(bl(t),e,i),e,i,n,r,s,2):2===a&&Tl(t,e,i,n,r,s):_l(bl(t),e,i,n,r,s,1);break}}function Ml(t){const e=t.prev,i=t,n=t.next;if(zl(e,i,n)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(Il(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&zl(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Sl(t,e,i,n){const r=t.prev,s=t,a=t.next;if(zl(r,s,a)>=0)return!1;const o=r.xs.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Rl(o,l,e,i,n),d=Rl(c,h,e,i,n);let p=t.prevZ,f=t.nextZ;for(;p&&p.z>=u&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&zl(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,f.x,f.y)&&zl(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&zl(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Il(r.x,r.y,s.x,s.y,a.x,a.y,f.x,f.y)&&zl(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function El(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!Dl(r,s)&&Bl(r,n,n.next,s)&&kl(r,s)&&kl(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),Vl(n),Vl(n.next),n=t=s),n=n.next}while(n!==t);return bl(n)}function Tl(t,e,i,n,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Nl(a,t)){let o=Hl(a,t);return a=bl(a,a.next),o=bl(o,o.next),_l(a,e,i,n,r,s),void _l(o,e,i,n,r,s)}t=t.next}a=a.next}while(a!==t)}function Al(t,e){return t.x-e.x}function Ll(t,e){if(e=function(t,e){let i=e;const n=t.x,r=t.y;let s,a=-1/0;do{if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=n&&t>a){if(a=t,t===n){if(r===i.y)return i;if(r===i.next.y)return i.next}s=i.x=i.x&&i.x>=l&&n!==i.x&&Il(rs.x||i.x===s.x&&Cl(s,i)))&&(s=i,u=h)),i=i.next}while(i!==o);return s}(t,e),e){const i=Hl(e,t);bl(e,e.next),bl(i,i.next)}}function Cl(t,e){return zl(t.prev,t,e.prev)<0&&zl(e.next,t,t.next)<0}function Rl(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Pl(t){let e=t,i=t;do{(e.x=0&&(t-a)*(n-o)-(i-a)*(e-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function Nl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Bl(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(kl(t,e)&&kl(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(zl(t.prev,t,e.prev)||zl(t,e.prev,e))||Dl(t,e)&&zl(t.prev,t,t.next)>0&&zl(e.prev,e,e.next)>0)}function zl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Dl(t,e){return t.x===e.x&&t.y===e.y}function Bl(t,e,i,n){const r=Ol(zl(t,e,i)),s=Ol(zl(t,e,n)),a=Ol(zl(i,n,t)),o=Ol(zl(i,n,e));return r!==s&&a!==o||!(0!==r||!Fl(t,i,e))||!(0!==s||!Fl(t,n,e))||!(0!==a||!Fl(i,t,n))||!(0!==o||!Fl(i,e,n))}function Fl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Ol(t){return t>0?1:t<0?-1:0}function kl(t,e){return zl(t.prev,t,t.next)<0?zl(t,e,t.next)>=0&&zl(t,t.prev,e)>=0:zl(t,e,t.prev)<0||zl(t,t.next,e)<0}function Hl(t,e){const i=new Gl(t.i,t.x,t.y),n=new Gl(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Ul(t,e,i,n){const r=new Gl(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Vl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Gl(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Wl{static area(t){const e=t.length;let i=0;for(let n=e-1,r=0;r80*i){o=c=t[0],l=h=t[1];for(let e=i;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return _l(s,a,i,o,l,p),a}(i,n);for(let t=0;t2&&t[e-1].equals(t[0])&&t.pop()}function ql(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,f=e.y+a/u,m=((i.x-c/d-p)*c-(i.y+l/d-f)*l)/(a*c-o*l);n=p+a*m-t.x,r=f+o*m-t.y;const g=n*n+r*r;if(g<=2)return new Ve(n,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(n=-o,r=a,s=Math.sqrt(h)):(n=a,r=o,s=Math.sqrt(h/2))}return new Ve(n/s,r/s)}const P=[];for(let t=0,e=T.length,i=e-1,n=t+1;t=0;t--){const e=t/p,i=h*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=T.length;t=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0!=t>0&&this.version++,this._clearcoat=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.ior=t.ior,this.sheenTint.copy(t.sheenTint),this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationTint.copy(t.attenuationTint),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularTint.copy(t.specularTint),this.specularTintMap=t.specularTintMap,this}}).prototype.isMeshPhysicalMaterial=!0;class $l extends mn{constructor(t){super(),this.type="MeshPhongMaterial",this.color=new _n(16777215),this.specular=new _n(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this}}$l.prototype.isMeshPhongMaterial=!0;(class extends mn{constructor(t){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new _n(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this}}).prototype.isMeshToonMaterial=!0;(class extends mn{constructor(t){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}).prototype.isMeshNormalMaterial=!0;(class extends mn{constructor(t){super(),this.type="MeshLambertMaterial",this.color=new _n(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _n(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this}}).prototype.isMeshLambertMaterial=!0;(class extends mn{constructor(t){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new _n(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Ve(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this}}).prototype.isMeshMatcapMaterial=!0;(class extends ko{constructor(t){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}).prototype.isLineDashedMaterial=!0;const Kl={arraySlice:function(t,e,i){return Kl.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)},convertArray:function(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i},sortedArray:function(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[a++]=t[n+i]}return r},flattenJSON:function(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(e.push(s.time),i.push.apply(i,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(e.push(s.time),a.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(e.push(s.time),i.push(a)),s=t[r++]}while(void 0!==s)},subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t=n)){l.push(e.times[t]);for(let i=0;is.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=n.times[u]){const t=u*l+o,e=t+l-o;d=Kl.arraySlice(n.values,t,e)}else{const t=n.createInterpolant(),e=o,i=l-o;t.evaluate(s),d=Kl.arraySlice(t.resultBuffer,e,i)}"quaternion"===r&&(new $e).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=i,i=0}}for(;i>>1;te;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Kl.arraySlice(i,r,s),this.values=Kl.arraySlice(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&Kl.isTypedArray(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=Kl.arraySlice(this.times),e=Kl.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===be,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*i,n=s*i,a=0;a!==i;++a)e[n+a]=e[t+a];++s}return s!==t.length?(this.times=Kl.arraySlice(t,0,s),this.values=Kl.arraySlice(e,0,s*i)):(this.times=t,this.values=e),this}clone(){const t=Kl.arraySlice(this.times,0),e=Kl.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}rc.prototype.TimeBufferType=Float32Array,rc.prototype.ValueBufferType=Float32Array,rc.prototype.DefaultInterpolation=we;class sc extends rc{}sc.prototype.ValueTypeName="bool",sc.prototype.ValueBufferType=Array,sc.prototype.DefaultInterpolation=xe,sc.prototype.InterpolantFactoryMethodLinear=void 0,sc.prototype.InterpolantFactoryMethodSmooth=void 0;class ac extends rc{}ac.prototype.ValueTypeName="color";class oc extends rc{}oc.prototype.ValueTypeName="number";class lc extends tc{constructor(t,e,i,n){super(t,e,i,n)}interpolate_(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-e)/(n-e);let l=t*a;for(let t=l+a;l!==t;l+=4)$e.slerpFlat(r,0,s,l-a,s,l,o);return r}}class cc extends rc{InterpolantFactoryMethodLinear(t){return new lc(this.times,this.values,this.getValueSize(),t)}}cc.prototype.ValueTypeName="quaternion",cc.prototype.DefaultInterpolation=we,cc.prototype.InterpolantFactoryMethodSmooth=void 0;class hc extends rc{}hc.prototype.ValueTypeName="string",hc.prototype.ValueBufferType=Array,hc.prototype.DefaultInterpolation=xe,hc.prototype.InterpolantFactoryMethodLinear=void 0,hc.prototype.InterpolantFactoryMethodSmooth=void 0;class uc extends rc{}uc.prototype.ValueTypeName="vector";class dc{constructor(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=Fe(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(pc(i[t]).scale(n));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(rc.toJSON(i[t]));return n}static CreateFromMorphTargetSequence(t,e,i,n){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(this.CreateFromMorphTargetSequence(t,n[t],e,i));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],a=[];Kl.flattenJSON(i,s,a,n),0!==s.length&&r.push(new t(e,s,a))}},n=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t0||0===t.search(/^data\:image\/jpeg/);r.format=n?me:ge,r.needsUpdate=!0,void 0!==e&&e(r)}),i,n),r}}class _c extends el{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(t){this.curves.push(t)}closePath(){const t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new ml(e,t))}getPoint(t){const e=t*this.getLength(),i=this.getCurveLengths();let n=0;for(;n=e){const t=i[n]-e,r=this.curves[n],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}n++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Sc extends Mc{constructor(t){super(t),this.uuid=Fe(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,n=this.holes.length;i0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,n);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]}_slerp(t,e,i,n){$e.slerpFlat(t,e,t,e,t,i,n)}_slerpAdditive(t,e,i,n,r){const s=this._workIndex*r;$e.multiplyQuaternionsFlat(t,s,t,e,t,i),$e.slerpFlat(t,e,t,e,t,s,n)}_lerp(t,e,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[i+a]*n}}_lerpAdditive(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}}const Gc=new RegExp("[\\[\\]\\.:\\/]","g"),Wc="[^\\[\\]\\.:\\/]",jc="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",qc=/((?:WC+[\/:])*)/.source.replace("WC",Wc),Xc=/(WCOD+)?/.source.replace("WCOD",jc),Yc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Wc),Zc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Wc),Jc=new RegExp("^"+qc+Xc+Yc+Zc+"$"),Qc=["material","materials","bones"];class $c{constructor(t,e,i){this.path=e,this.parsedPath=i||$c.parseTrackName(e),this.node=$c.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new $c.Composite(t,e,i):new $c(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Gc,"")}static parseTrackName(t){const e=Jc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==Qc.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n0){const t=this._interpolants,e=this._propertyBindings;if(2501===this.blendMode)for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;null!==i&&(e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e))}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=Me,n.endingEnd=Me):(n.endingStart=t?this.zeroSlopeAtStart?Me:_e:Se,n.endingEnd=e?this.zeroSlopeAtEnd?Me:_e:Se)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}(class extends Ne{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,n=t._clip.tracks,r=n.length,s=t._propertyBindings,a=t._interpolants,o=i.uuid,l=this._bindingsByRootAndName;let c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=n[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const n=e&&e._propertyBindings[t].binding.parsedPath;h=new Vc($c.create(i,l,n),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,n=this._actionsByClip[i];this._bindAction(t,n&&n.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==i;++a)e[a]._update(n,t,r,s);const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;tthis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return eh.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}ih.prototype.isBox2=!0,class extends en{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}.prototype.isImmediateRenderObject=!0;const nh=new Ke,rh=new Ri,sh=new Ri;function ah(t){const e=[];t&&t.isBone&&e.push(t);for(let i=0;i0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0){const t=1/n;this.x*=t,this.y*=t,this.z*=t}else this.x=0,this.y=0,this.z=0;return n}unit(t=new hh){const e=this.x,i=this.y,n=this.z;let r=Math.sqrt(e*e+i*i+n*n);return r>0?(r=1/r,t.x=e*r,t.y=i*r,t.z=n*r):(t.x=1,t.y=0,t.z=0),t}length(){const t=this.x,e=this.y,i=this.z;return Math.sqrt(t*t+e*e+i*i)}lengthSquared(){return this.dot(this)}distanceTo(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z;return Math.sqrt((r-e)*(r-e)+(s-i)*(s-i)+(a-n)*(a-n))}distanceSquared(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z;return(r-e)*(r-e)+(s-i)*(s-i)+(a-n)*(a-n)}scale(t,e=new hh){const i=this.x,n=this.y,r=this.z;return e.x=t*i,e.y=t*n,e.z=t*r,e}vmul(t,e=new hh){return e.x=t.x*this.x,e.y=t.y*this.y,e.z=t.z*this.z,e}addScaledVector(t,e,i=new hh){return i.x=this.x+t*e.x,i.y=this.y+t*e.y,i.z=this.z+t*e.z,i}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}isZero(){return 0===this.x&&0===this.y&&0===this.z}negate(t=new hh){return t.x=-this.x,t.y=-this.y,t.z=-this.z,t}tangents(t,e){const i=this.length();if(i>0){const n=uh,r=1/i;n.set(this.x*r,this.y*r,this.z*r);const s=dh;Math.abs(n.x)<.9?(s.set(1,0,0),n.cross(s,t)):(s.set(0,1,0),n.cross(s,t)),n.cross(t,e)}else t.set(1,0,0),e.set(0,1,0)}toString(){return this.x+","+this.y+","+this.z}toArray(){return[this.x,this.y,this.z]}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}lerp(t,e,i){const n=this.x,r=this.y,s=this.z;i.x=n+(t.x-n)*e,i.y=r+(t.y-r)*e,i.z=s+(t.z-s)*e}almostEquals(t,e=1e-6){return!(Math.abs(this.x-t.x)>e||Math.abs(this.y-t.y)>e||Math.abs(this.z-t.z)>e)}almostZero(t=1e-6){return!(Math.abs(this.x)>t||Math.abs(this.y)>t||Math.abs(this.z)>t)}isAntiparallelTo(t,e){return this.negate(ph),ph.almostEquals(t,e)}clone(){return new hh(this.x,this.y,this.z)}}hh.ZERO=void 0,hh.UNIT_X=void 0,hh.UNIT_Y=void 0,hh.UNIT_Z=void 0,hh.ZERO=new hh(0,0,0),hh.UNIT_X=new hh(1,0,0),hh.UNIT_Y=new hh(0,1,0),hh.UNIT_Z=new hh(0,0,1);const uh=new hh,dh=new hh,ph=new hh;class fh{constructor(t={}){this.lowerBound=void 0,this.upperBound=void 0,this.lowerBound=new hh,this.upperBound=new hh,t.lowerBound&&this.lowerBound.copy(t.lowerBound),t.upperBound&&this.upperBound.copy(t.upperBound)}setFromPoints(t,e,i,n){const r=this.lowerBound,s=this.upperBound,a=i;r.copy(t[0]),a&&a.vmult(r,r),s.copy(r);for(let e=1;es.x&&(s.x=i.x),i.xs.y&&(s.y=i.y),i.ys.z&&(s.z=i.z),i.z=r.x&&e.y<=n.y&&i.y>=r.y&&e.z<=n.z&&i.z>=r.z}getCorners(t,e,i,n,r,s,a,o){const l=this.lowerBound,c=this.upperBound;t.copy(l),e.set(c.x,l.y,l.z),i.set(c.x,c.y,l.z),n.set(l.x,c.y,c.z),r.set(c.x,l.y,c.z),s.set(l.x,c.y,l.z),a.set(l.x,l.y,c.z),o.copy(c)}toLocalFrame(t,e){const i=gh,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7];this.getCorners(n,r,s,a,o,l,c,h);for(let e=0;8!==e;e++){const n=i[e];t.pointToLocal(n,n)}return e.setFromPoints(i)}toWorldFrame(t,e){const i=gh,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7];this.getCorners(n,r,s,a,o,l,c,h);for(let e=0;8!==e;e++){const n=i[e];t.pointToWorld(n,n)}return e.setFromPoints(i)}overlapsRay(t){const{direction:e,from:i}=t,n=1/e.x,r=1/e.y,s=1/e.z,a=(this.lowerBound.x-i.x)*n,o=(this.upperBound.x-i.x)*n,l=(this.lowerBound.y-i.y)*r,c=(this.upperBound.y-i.y)*r,h=(this.lowerBound.z-i.z)*s,u=(this.upperBound.z-i.z)*s,d=Math.max(Math.max(Math.min(a,o),Math.min(l,c)),Math.min(h,u)),p=Math.min(Math.min(Math.max(a,o),Math.max(l,c)),Math.max(h,u));return!(p<0||d>p)}}const mh=new hh,gh=[new hh,new hh,new hh,new hh,new hh,new hh,new hh,new hh];class vh{constructor(){this.matrix=void 0,this.matrix=[]}get(t,e){let{index:i}=t,{index:n}=e;if(n>i){const t=n;n=i,i=t}return this.matrix[(i*(i+1)>>1)+n-1]}set(t,e,i){let{index:n}=t,{index:r}=e;if(r>n){const t=r;r=n,n=t}this.matrix[(n*(n+1)>>1)+r-1]=i?1:0}reset(){for(let t=0,e=this.matrix.length;t!==e;t++)this.matrix[t]=0}setNumObjects(t){this.matrix.length=t*(t-1)>>1}}class yh{constructor(){this._listeners=void 0}addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;return void 0===i[t]&&(i[t]=[]),i[t].includes(e)||i[t].push(e),this}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return!(void 0===i[t]||!i[t].includes(e))}hasAnyEventListener(t){return void 0!==this._listeners&&void 0!==this._listeners[t]}removeEventListener(t,e){if(void 0===this._listeners)return this;const i=this._listeners;if(void 0===i[t])return this;const n=i[t].indexOf(e);return-1!==n&&i[t].splice(n,1),this}dispatchEvent(t){if(void 0===this._listeners)return this;const e=this._listeners[t.type];if(void 0!==e){t.target=this;for(let i=0,n=e.length;i.499&&(i=2*Math.atan2(s,l),n=Math.PI/2,r=0),t<-.499&&(i=-2*Math.atan2(s,l),n=-Math.PI/2,r=0),void 0===i){const e=s*s,c=a*a,h=o*o;i=Math.atan2(2*a*l-2*s*o,1-2*c-2*h),n=Math.asin(2*t),r=Math.atan2(2*s*l-2*a*o,1-2*e-2*h)}}t.y=i,t.z=n,t.x=r}setFromEuler(t,e,i,n="XYZ"){const r=Math.cos(t/2),s=Math.cos(e/2),a=Math.cos(i/2),o=Math.sin(t/2),l=Math.sin(e/2),c=Math.sin(i/2);return"XYZ"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a-o*l*c):"YXZ"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a+o*l*c):"ZXY"===n?(this.x=o*s*a-r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a-o*l*c):"ZYX"===n?(this.x=o*s*a-r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a+o*l*c):"YZX"===n?(this.x=o*s*a+r*l*c,this.y=r*l*a+o*s*c,this.z=r*s*c-o*l*a,this.w=r*s*a-o*l*c):"XZY"===n&&(this.x=o*s*a-r*l*c,this.y=r*l*a-o*s*c,this.z=r*s*c+o*l*a,this.w=r*s*a+o*l*c),this}clone(){return new xh(this.x,this.y,this.z,this.w)}slerp(t,e,i=new xh){const n=this.x,r=this.y,s=this.z,a=this.w;let o,l,c,h,u,d=t.x,p=t.y,f=t.z,m=t.w;return l=n*d+r*p+s*f+a*m,l<0&&(l=-l,d=-d,p=-p,f=-f,m=-m),1-l>1e-6?(o=Math.acos(l),c=Math.sin(o),h=Math.sin((1-e)*o)/c,u=Math.sin(e*o)/c):(h=1-e,u=e),i.x=h*n+u*d,i.y=h*r+u*p,i.z=h*s+u*f,i.w=h*a+u*m,i}integrate(t,e,i,n=new xh){const r=t.x*i.x,s=t.y*i.y,a=t.z*i.z,o=this.x,l=this.y,c=this.z,h=this.w,u=.5*e;return n.x+=u*(r*h+s*c-a*l),n.y+=u*(s*h+a*o-r*c),n.z+=u*(a*h+r*l-s*o),n.w+=u*(-r*o-s*l-a*c),n}}const wh=new hh,bh=new hh;class _h{constructor(t={}){this.id=void 0,this.type=void 0,this.boundingSphereRadius=void 0,this.collisionResponse=void 0,this.collisionFilterGroup=void 0,this.collisionFilterMask=void 0,this.material=void 0,this.body=void 0,this.id=_h.idCounter++,this.type=t.type||0,this.boundingSphereRadius=0,this.collisionResponse=!t.collisionResponse||t.collisionResponse,this.collisionFilterGroup=void 0!==t.collisionFilterGroup?t.collisionFilterGroup:1,this.collisionFilterMask=void 0!==t.collisionFilterMask?t.collisionFilterMask:-1,this.material=t.material?t.material:null,this.body=null}updateBoundingSphereRadius(){throw"computeBoundingSphereRadius() not implemented for shape type "+this.type}volume(){throw"volume() not implemented for shape type "+this.type}calculateLocalInertia(t,e){throw"calculateLocalInertia() not implemented for shape type "+this.type}calculateWorldAABB(t,e,i,n){throw"calculateWorldAABB() not implemented for shape type "+this.type}}_h.idCounter=0,_h.types={SPHERE:1,PLANE:2,BOX:4,COMPOUND:8,CONVEXPOLYHEDRON:16,HEIGHTFIELD:32,PARTICLE:64,CYLINDER:128,TRIMESH:256};class Mh{constructor(t={}){this.position=void 0,this.quaternion=void 0,this.position=new hh,this.quaternion=new xh,t.position&&this.position.copy(t.position),t.quaternion&&this.quaternion.copy(t.quaternion)}pointToLocal(t,e){return Mh.pointToLocalFrame(this.position,this.quaternion,t,e)}pointToWorld(t,e){return Mh.pointToWorldFrame(this.position,this.quaternion,t,e)}vectorToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e}static pointToLocalFrame(t,e,i,n=new hh){return i.vsub(t,n),e.conjugate(Sh),Sh.vmult(n,n),n}static pointToWorldFrame(t,e,i,n=new hh){return e.vmult(i,n),n.vadd(t,n),n}static vectorToWorldFrame(t,e,i=new hh){return t.vmult(e,i),i}static vectorToLocalFrame(t,e,i,n=new hh){return e.w*=-1,e.vmult(i,n),e.w*=-1,n}}const Sh=new xh;class Eh extends _h{constructor(t={}){const{vertices:e=[],faces:i=[],normals:n=[],axes:r,boundingSphereRadius:s}=t;super({type:_h.types.CONVEXPOLYHEDRON}),this.vertices=void 0,this.faces=void 0,this.faceNormals=void 0,this.worldVertices=void 0,this.worldVerticesNeedsUpdate=void 0,this.worldFaceNormals=void 0,this.worldFaceNormalsNeedsUpdate=void 0,this.uniqueAxes=void 0,this.uniqueEdges=void 0,this.vertices=e,this.faces=i,this.faceNormals=n,0===this.faceNormals.length&&this.computeNormals(),s?this.boundingSphereRadius=s:this.updateBoundingSphereRadius(),this.worldVertices=[],this.worldVerticesNeedsUpdate=!0,this.worldFaceNormals=[],this.worldFaceNormalsNeedsUpdate=!0,this.uniqueAxes=r?r.slice():null,this.uniqueEdges=[],this.computeEdges()}computeEdges(){const t=this.faces,e=this.vertices,i=this.uniqueEdges;i.length=0;const n=new hh;for(let r=0;r!==t.length;r++){const s=t[r],a=s.length;for(let t=0;t!==a;t++){const r=(t+1)%a;e[s[t]].vsub(e[s[r]],n),n.normalize();let o=!1;for(let t=0;t!==i.length;t++)if(i[t].almostEquals(n)||i[t].almostEquals(n)){o=!0;break}o||i.push(n.clone())}}}computeNormals(){this.faceNormals.length=this.faces.length;for(let t=0;tu&&(u=e,h=t)}const d=[];for(let t=0;t=0&&this.clipFaceAgainstHull(s,t,e,d,a,o,l)}findSeparatingAxis(t,e,i,n,r,s,a,o){const l=new hh,c=new hh,h=new hh,u=new hh,d=new hh,p=new hh;let f=Number.MAX_VALUE;const m=this;if(m.uniqueAxes)for(let a=0;a!==m.uniqueAxes.length;a++){i.vmult(m.uniqueAxes[a],l);const o=m.testSepAxis(l,t,e,i,n,r);if(!1===o)return!1;o0&&s.negate(s),!0}testSepAxis(t,e,i,n,r,s){Eh.project(this,t,i,n,Th),Eh.project(e,t,r,s,Ah);const a=Th[0],o=Th[1],l=Ah[0],c=Ah[1];if(a0?1/e:0,this.material=t.material||null,this.linearDamping="number"==typeof t.linearDamping?t.linearDamping:.01,this.type=e<=0?Nh.STATIC:Nh.DYNAMIC,typeof t.type==typeof Nh.STATIC&&(this.type=t.type),this.allowSleep=void 0===t.allowSleep||t.allowSleep,this.sleepState=Nh.AWAKE,this.sleepSpeedLimit=void 0!==t.sleepSpeedLimit?t.sleepSpeedLimit:.1,this.sleepTimeLimit=void 0!==t.sleepTimeLimit?t.sleepTimeLimit:1,this.timeLastSleepy=0,this.wakeUpAfterNarrowphase=!1,this.torque=new hh,this.quaternion=new xh,this.initQuaternion=new xh,this.previousQuaternion=new xh,this.interpolatedQuaternion=new xh,t.quaternion&&(this.quaternion.copy(t.quaternion),this.initQuaternion.copy(t.quaternion),this.previousQuaternion.copy(t.quaternion),this.interpolatedQuaternion.copy(t.quaternion)),this.angularVelocity=new hh,t.angularVelocity&&this.angularVelocity.copy(t.angularVelocity),this.initAngularVelocity=new hh,this.shapes=[],this.shapeOffsets=[],this.shapeOrientations=[],this.inertia=new hh,this.invInertia=new hh,this.invInertiaWorld=new lh,this.invMassSolve=0,this.invInertiaSolve=new hh,this.invInertiaWorldSolve=new lh,this.fixedRotation=void 0!==t.fixedRotation&&t.fixedRotation,this.angularDamping=void 0!==t.angularDamping?t.angularDamping:.01,this.linearFactor=new hh(1,1,1),t.linearFactor&&this.linearFactor.copy(t.linearFactor),this.angularFactor=new hh(1,1,1),t.angularFactor&&this.angularFactor.copy(t.angularFactor),this.aabb=new fh,this.aabbNeedsUpdate=!0,this.boundingRadius=0,this.wlambda=new hh,this.isTrigger=Boolean(t.isTrigger),t.shape&&this.addShape(t.shape),this.updateMassProperties()}wakeUp(){const t=this.sleepState;this.sleepState=Nh.AWAKE,this.wakeUpAfterNarrowphase=!1,t===Nh.SLEEPING&&this.dispatchEvent(Nh.wakeupEvent)}sleep(){this.sleepState=Nh.SLEEPING,this.velocity.set(0,0,0),this.angularVelocity.set(0,0,0),this.wakeUpAfterNarrowphase=!1}sleepTick(t){if(this.allowSleep){const e=this.sleepState,i=this.velocity.lengthSquared()+this.angularVelocity.lengthSquared(),n=this.sleepSpeedLimit**2;e===Nh.AWAKE&&in?this.wakeUp():e===Nh.SLEEPY&&t-this.timeLastSleepy>this.sleepTimeLimit&&(this.sleep(),this.dispatchEvent(Nh.sleepEvent))}}updateSolveMassProperties(){this.sleepState===Nh.SLEEPING||this.type===Nh.KINEMATIC?(this.invMassSolve=0,this.invInertiaSolve.setZero(),this.invInertiaWorldSolve.setZero()):(this.invMassSolve=this.invMass,this.invInertiaSolve.copy(this.invInertia),this.invInertiaWorldSolve.copy(this.invInertiaWorld))}pointToLocalFrame(t,e=new hh){return t.vsub(this.position,e),this.quaternion.conjugate().vmult(e,e),e}vectorToLocalFrame(t,e=new hh){return this.quaternion.conjugate().vmult(t,e),e}pointToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e.vadd(this.position,e),e}vectorToWorldFrame(t,e=new hh){return this.quaternion.vmult(t,e),e}addShape(t,e,i){const n=new hh,r=new xh;return e&&n.copy(e),i&&r.copy(i),this.shapes.push(t),this.shapeOffsets.push(n),this.shapeOrientations.push(r),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=this,this}removeShape(t){const e=this.shapes.indexOf(t);return-1===e?(console.warn("Shape does not belong to the body"),this):(this.shapes.splice(e,1),this.shapeOffsets.splice(e,1),this.shapeOrientations.splice(e,1),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=null,this)}updateBoundingRadius(){const t=this.shapes,e=this.shapeOffsets,i=t.length;let n=0;for(let r=0;r!==i;r++){const i=t[r];i.updateBoundingSphereRadius();const s=e[r].length(),a=i.boundingSphereRadius;s+a>n&&(n=s+a)}this.boundingRadius=n}updateAABB(){const t=this.shapes,e=this.shapeOffsets,i=this.shapeOrientations,n=t.length,r=zh,s=Dh,a=this.quaternion,o=this.aabb,l=Bh;for(let c=0;c!==n;c++){const n=t[c];a.vmult(e[c],r),r.vadd(this.position,r),a.mult(i[c],s),n.calculateWorldAABB(r,s,l.lowerBound,l.upperBound),0===c?o.copy(l):o.extend(l)}this.aabbNeedsUpdate=!1}updateInertiaWorld(t){const e=this.invInertia;if(e.x!==e.y||e.y!==e.z||t){const t=Fh,i=Oh;t.setRotationFromQuaternion(this.quaternion),t.transpose(i),t.scale(e,t),t.mmult(i,this.invInertiaWorld)}}applyForce(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;this.sleepState===Nh.SLEEPING&&this.wakeUp();const i=kh;e.cross(t,i),this.force.vadd(t,this.force),this.torque.vadd(i,this.torque)}applyLocalForce(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;const i=Hh,n=Uh;this.vectorToWorldFrame(t,i),this.vectorToWorldFrame(e,n),this.applyForce(i,n)}applyTorque(t){this.type===Nh.DYNAMIC&&(this.sleepState===Nh.SLEEPING&&this.wakeUp(),this.torque.vadd(t,this.torque))}applyImpulse(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;this.sleepState===Nh.SLEEPING&&this.wakeUp();const i=e,n=Vh;n.copy(t),n.scale(this.invMass,n),this.velocity.vadd(n,this.velocity);const r=Gh;i.cross(t,r),this.invInertiaWorld.vmult(r,r),this.angularVelocity.vadd(r,this.angularVelocity)}applyLocalImpulse(t,e=new hh){if(this.type!==Nh.DYNAMIC)return;const i=Wh,n=jh;this.vectorToWorldFrame(t,i),this.vectorToWorldFrame(e,n),this.applyImpulse(i,n)}updateMassProperties(){const t=qh;this.invMass=this.mass>0?1/this.mass:0;const e=this.inertia,i=this.fixedRotation;this.updateAABB(),t.set((this.aabb.upperBound.x-this.aabb.lowerBound.x)/2,(this.aabb.upperBound.y-this.aabb.lowerBound.y)/2,(this.aabb.upperBound.z-this.aabb.lowerBound.z)/2),Rh.calculateInertia(t,this.mass,e),this.invInertia.set(e.x>0&&!i?1/e.x:0,e.y>0&&!i?1/e.y:0,e.z>0&&!i?1/e.z:0),this.updateInertiaWorld(!0)}getVelocityAtWorldPoint(t,e){const i=new hh;return t.vsub(this.position,i),this.angularVelocity.cross(i,e),this.velocity.vadd(e,e),e}integrate(t,e,i){if(this.previousPosition.copy(this.position),this.previousQuaternion.copy(this.quaternion),this.type!==Nh.DYNAMIC&&this.type!==Nh.KINEMATIC||this.sleepState===Nh.SLEEPING)return;const n=this.velocity,r=this.angularVelocity,s=this.position,a=this.force,o=this.torque,l=this.quaternion,c=this.invMass,h=this.invInertiaWorld,u=this.linearFactor,d=c*t;n.x+=a.x*d*u.x,n.y+=a.y*d*u.y,n.z+=a.z*d*u.z;const p=h.elements,f=this.angularFactor,m=o.x*f.x,g=o.y*f.y,v=o.z*f.z;r.x+=t*(p[0]*m+p[1]*g+p[2]*v),r.y+=t*(p[3]*m+p[4]*g+p[5]*v),r.z+=t*(p[6]*m+p[7]*g+p[8]*v),s.x+=n.x*t,s.y+=n.y*t,s.z+=n.z*t,l.integrate(this.angularVelocity,t,this.angularFactor,l),e&&(i?l.normalizeFast():l.normalize()),this.aabbNeedsUpdate=!0,this.updateInertiaWorld()}}Nh.idCounter=0,Nh.COLLIDE_EVENT_NAME="collide",Nh.DYNAMIC=1,Nh.STATIC=2,Nh.KINEMATIC=4,Nh.AWAKE=0,Nh.SLEEPY=1,Nh.SLEEPING=2,Nh.wakeupEvent={type:"wakeup"},Nh.sleepyEvent={type:"sleepy"},Nh.sleepEvent={type:"sleep"};const zh=new hh,Dh=new xh,Bh=new fh,Fh=new lh,Oh=new lh,kh=new hh,Hh=new hh,Uh=new hh,Vh=new hh,Gh=new hh,Wh=new hh,jh=new hh,qh=new hh;const Xh=new hh,Yh={keys:[]},Zh=[],Jh=[];new hh;class Qh extends class{constructor(){this.world=void 0,this.useBoundingBoxes=void 0,this.dirty=void 0,this.world=null,this.useBoundingBoxes=!1,this.dirty=!0}collisionPairs(t,e,i){throw new Error("collisionPairs not implemented for this BroadPhase class!")}needBroadphaseCollision(t,e){return 0!=(t.collisionFilterGroup&e.collisionFilterMask)&&0!=(e.collisionFilterGroup&t.collisionFilterMask)&&(0==(t.type&Nh.STATIC)&&t.sleepState!==Nh.SLEEPING||0==(e.type&Nh.STATIC)&&e.sleepState!==Nh.SLEEPING)}intersectionTest(t,e,i,n){this.useBoundingBoxes?this.doBoundingBoxBroadphase(t,e,i,n):this.doBoundingSphereBroadphase(t,e,i,n)}doBoundingSphereBroadphase(t,e,i,n){const r=Xh;e.position.vsub(t.position,r);const s=(t.boundingRadius+e.boundingRadius)**2;r.lengthSquared()i.lengthSquared()}aabbQuery(t,e,i){return console.warn(".aabbQuery is not implemented in this Broadphase subclass."),[]}}{constructor(){super()}collisionPairs(t,e,i){const n=t.bodies,r=n.length;let s,a;for(let t=0;t!==r;t++)for(let r=0;r!==t;r++)s=n[t],a=n[r],this.needBroadphaseCollision(s,a)&&this.intersectionTest(s,a,e,i)}aabbQuery(t,e,i=[]){for(let n=0;n{}}intersectWorld(t,e){return this.mode=e.mode||au.ANY,this.result=e.result||new $h,this.skipBackfaces=!!e.skipBackfaces,this.collisionFilterMask=void 0!==e.collisionFilterMask?e.collisionFilterMask:-1,this.collisionFilterGroup=void 0!==e.collisionFilterGroup?e.collisionFilterGroup:-1,this.checkCollisionResponse=void 0===e.checkCollisionResponse||e.checkCollisionResponse,e.from&&this.from.copy(e.from),e.to&&this.to.copy(e.to),this.callback=e.callback||(()=>{}),this.hasHit=!1,this.result.reset(),this.updateDirection(),this.getAABB(ou),lu.length=0,t.broadphase.aabbQuery(t,ou,lu),this.intersectBodies(lu),this.hasHit}intersectBody(t,e){e&&(this.result=e,this.updateDirection());const i=this.checkCollisionResponse;if(i&&!t.collisionResponse)return;if(0==(this.collisionFilterGroup&t.collisionFilterMask)||0==(t.collisionFilterGroup&this.collisionFilterMask))return;const n=uu,r=du;for(let e=0,s=t.shapes.length;et.boundingSphereRadius)return;const s=this[t.type];s&&s.call(this,t,e,i,n,t)}_intersectBox(t,e,i,n,r){return this._intersectConvex(t.convexPolyhedronRepresentation,e,i,n,r)}_intersectPlane(t,e,i,n,r){const s=this.from,a=this.to,o=this.direction,l=new hh(0,0,1);e.vmult(l,l);const c=new hh;s.vsub(i,c);const h=c.dot(l);if(a.vsub(i,c),h*c.dot(l)>0)return;if(s.distanceTo(a)=0&&t<=1&&(s.lerp(a,t,u),u.vsub(i,d),d.normalize(),this.reportIntersection(d,u,r,n,-1)),this.result.shouldStop)return;e>=0&&e<=1&&(s.lerp(a,e,u),u.vsub(i,d),d.normalize(),this.reportIntersection(d,u,r,n,-1))}}_intersectConvex(t,e,i,n,r,s){const a=Mu,o=Su,l=s&&s.faceList||null,c=t.faces,h=t.vertices,u=t.faceNormals,d=this.direction,p=this.from,f=this.to,m=p.distanceTo(f),g=l?l.length:c.length,v=this.result;for(let t=0;!v.shouldStop&&tm||this.reportIntersection(a,pu,r,n,s)}}}}_intersectTrimesh(t,e,i,n,r,s){const a=Eu,o=Pu,l=Iu,c=Su,h=Tu,u=Au,d=Lu,p=Ru,f=Cu,m=t.indices;t.vertices;const g=this.from,v=this.to,y=this.direction;l.position.copy(i),l.quaternion.copy(e),Mh.vectorToLocalFrame(i,e,y,h),Mh.pointToLocalFrame(i,e,g,u),Mh.pointToLocalFrame(i,e,v,d),d.x*=t.scale.x,d.y*=t.scale.y,d.z*=t.scale.z,u.x*=t.scale.x,u.y*=t.scale.y,u.z*=t.scale.z,d.vsub(u,h),h.normalize();const x=u.distanceSquared(d);t.tree.rayQuery(this,l,o);for(let s=0,l=o.length;!this.result.shouldStop&&s!==l;s++){const l=o[s];t.getNormal(l,a),t.getVertex(m[3*l],fu),fu.vsub(u,c);const d=h.dot(a),g=a.dot(c)/d;if(g<0)continue;h.scale(g,pu),pu.vadd(u,pu),t.getVertex(m[3*l+1],mu),t.getVertex(m[3*l+2],gu);const v=pu.distanceSquared(u);!au.pointInTriangle(pu,mu,fu,gu)&&!au.pointInTriangle(pu,fu,mu,gu)||v>x||(Mh.vectorToWorldFrame(e,a,f),Mh.pointToWorldFrame(i,e,pu,p),this.reportIntersection(f,p,r,n,l))}o.length=0}reportIntersection(t,e,i,n,r){const s=this.from,a=this.to,o=s.distanceTo(e),l=this.result;if(!(this.skipBackfaces&&t.dot(this.direction)>0))switch(l.hitFaceIndex=void 0!==r?r:-1,this.mode){case au.ALL:this.hasHit=!0,l.set(s,a,t,e,i,n,o),l.hasHit=!0,this.callback(l);break;case au.CLOSEST:(o=0&&(h=r*l-s*a)>=0&&c+he.maxForce&&(d=e.maxForce-m),y[t]+=d,p+=d>0?d:-d,e.addToWlambda(d)}if(p*pt;)e.pop();for(;e.length=0&&c.restitution>=0&&(a.restitution=l.restitution*c.restitution),a.si=r||i,a.sj=s||n,a}createFrictionEquationsFromContact(t,e){const i=t.bi,n=t.bj,r=t.si,s=t.sj,a=this.world,o=this.currentContactMaterial;let l=o.friction;const c=r.material||i.material,h=s.material||n.material;if(c&&h&&c.friction>=0&&h.friction>=0&&(l=c.friction*h.friction),l>0){const r=l*a.gravity.length();let s=i.invMass+n.invMass;s>0&&(s=1/s);const c=this.frictionEquationPool,h=c.length?c.pop():new td(i,n,r*s),u=c.length?c.pop():new td(i,n,r*s);return h.bi=u.bi=i,h.bj=u.bj=n,h.minForce=u.minForce=-r*s,h.maxForce=u.maxForce=r*s,h.ri.copy(t.ri),h.rj.copy(t.rj),u.ri.copy(t.ri),u.rj.copy(t.rj),t.ni.tangents(h.t,u.t),h.setSpookParams(o.frictionEquationStiffness,o.frictionEquationRelaxation,a.dt),u.setSpookParams(o.frictionEquationStiffness,o.frictionEquationRelaxation,a.dt),h.enabled=u.enabled=t.enabled,e.push(h,u),!0}return!1}createFrictionFromAverage(t){let e=this.result[this.result.length-1];if(!this.createFrictionEquationsFromContact(e,this.frictionResult)||1===t)return;const i=this.frictionResult[this.frictionResult.length-2],n=this.frictionResult[this.frictionResult.length-1];kd.setZero(),Hd.setZero(),Ud.setZero();const r=e.bi;e.bj;for(let i=0;i!==t;i++)e=this.result[this.result.length-1-i],e.bi!==r?(kd.vadd(e.ni,kd),Hd.vadd(e.ri,Hd),Ud.vadd(e.rj,Ud)):(kd.vsub(e.ni,kd),Hd.vadd(e.rj,Hd),Ud.vadd(e.ri,Ud));const s=1/t;Hd.scale(s,i.ri),Ud.scale(s,i.rj),n.ri.copy(i.ri),n.rj.copy(i.rj),kd.normalize(),kd.tangents(i.t,n.t)}getContacts(t,e,i,n,r,s,a){this.contactPointPool=r,this.frictionEquationPool=a,this.result=n,this.frictionResult=s;const o=Wd,l=jd,c=Vd,h=Gd;for(let n=0,r=t.length;n!==r;n++){const r=t[n],s=e[n];let a=null;r.material&&s.material&&(a=i.getContactMaterial(r.material,s.material)||null);const u=r.type&Nh.KINEMATIC&&s.type&Nh.STATIC||r.type&Nh.STATIC&&s.type&Nh.KINEMATIC||r.type&Nh.KINEMATIC&&s.type&Nh.KINEMATIC;for(let t=0;te.boundingSphereRadius+n.boundingSphereRadius)continue;let d=null;e.material&&n.material&&(d=i.getContactMaterial(e.material,n.material)||null),this.currentContactMaterial=d||a||i.defaultContactMaterial;const p=this[e.type|n.type];if(p){let t=!1;t=e.type0){const r=yp,s=xp;r.copy(d[(t+1)%3]),s.copy(d[(t+2)%3]);const a=r.length(),o=s.length();r.normalize(),s.normalize();const l=gp.dot(r),c=gp.dot(s);if(l-a&&c-o){const t=Math.abs(n-i-p);if((null===_||t<_)&&(_=t,w=l,b=c,y=i,m.copy(e),g.copy(r),v.copy(s),x++,h))return!0}}}if(x){f=!0;const r=this.createContactEquation(a,o,t,e,l,c);m.scale(-p,r.ri),r.ni.copy(m),r.ni.negate(r.ni),m.scale(y,m),g.scale(w,g),m.vadd(g,m),v.scale(b,v),m.vadd(v,r.rj),r.ri.vadd(i,r.ri),r.ri.vsub(a.position,r.ri),r.rj.vadd(n,r.rj),r.rj.vsub(o.position,r.rj),this.result.push(r),this.createFrictionEquationsFromContact(r,this.frictionResult)}let M=u.get();const S=bp;for(let r=0;2!==r&&!f;r++)for(let s=0;2!==s&&!f;s++)for(let u=0;2!==u&&!f;u++)if(M.set(0,0,0),r?M.vadd(d[0],M):M.vsub(d[0],M),s?M.vadd(d[1],M):M.vsub(d[1],M),u?M.vadd(d[2],M):M.vsub(d[2],M),n.vadd(M,S),S.vsub(i,S),S.lengthSquared()t.boundingSphereRadius+e.boundingSphereRadius)&&t.findSeparatingAxis(e,i,r,n,s,p,u,d)){const u=[],d=Hp;t.clipAgainstHull(i,r,e,n,s,p,-100,100,u);let f=0;for(let r=0;r!==u.length;r++){if(h)return!0;const s=this.createContactEquation(a,o,t,e,l,c),m=s.ri,g=s.rj;p.negate(s.ni),u[r].normal.negate(d),d.scale(u[r].depth,d),u[r].point.vadd(d,m),g.copy(u[r].point),m.vsub(i,m),g.vsub(n,g),m.vadd(i,m),m.vsub(a.position,m),g.vadd(n,g),g.vsub(o.position,g),this.result.push(s),f++,this.enableFrictionReduction||this.createFrictionEquationsFromContact(s,this.frictionResult)}this.enableFrictionReduction&&f&&this.createFrictionFromAverage(f)}}sphereConvex(t,e,i,n,r,s,a,o,l,c,h){const u=this.v3pool;i.vsub(n,Ep);const d=e.faceNormals,p=e.faces,f=e.vertices,m=t.radius;let g=!1;for(let r=0;r!==f.length;r++){const u=f[r],d=Cp;s.vmult(u,d),n.vadd(d,d);const p=Lp;if(d.vsub(i,p),p.lengthSquared()0){const r=[];for(let t=0,e=y.length;t!==e;t++){const e=u.get();s.vmult(f[y[t]],e),n.vadd(e,e),r.push(e)}if(mp(r,x,i)){if(h)return!0;g=!0;const s=this.createContactEquation(a,o,t,e,l,c);x.scale(-m,s.ri),x.negate(s.ni);const d=u.get();x.scale(-M,d);const p=u.get();x.scale(-m,p),i.vsub(n,s.rj),s.rj.vadd(p,s.rj),s.rj.vadd(d,s.rj),s.rj.vadd(n,s.rj),s.rj.vsub(o.position,s.rj),s.ri.vadd(i,s.ri),s.ri.vsub(a.position,s.ri),u.release(d),u.release(p),this.result.push(s),this.createFrictionEquationsFromContact(s,this.frictionResult);for(let t=0,e=r.length;t!==e;t++)u.release(r[t]);return}for(let d=0;d!==y.length;d++){const p=u.get(),g=u.get();s.vmult(f[y[(d+1)%y.length]],p),s.vmult(f[y[(d+2)%y.length]],g),n.vadd(p,p),n.vadd(g,g);const v=Tp;g.vsub(p,v);const x=Ap;v.unit(x);const w=u.get(),b=u.get();i.vsub(p,b);const _=b.dot(x);x.scale(_,w),w.vadd(p,w);const M=u.get();if(w.vsub(i,M),_>0&&_*_u.length||y>u[0].length)return;g<0&&(g=0),v<0&&(v=0),y<0&&(y=0),x<0&&(x=0),g>=u.length&&(g=u.length-1),v>=u.length&&(v=u.length-1),x>=u[0].length&&(x=u[0].length-1),y>=u[0].length&&(y=u[0].length-1);const w=[];e.getRectMinMax(g,y,v,x,w);const b=w[0],_=w[1];if(m.z-d>_||m.z+d2)return}}boxHeightfield(t,e,i,n,r,s,a,o,l,c,h){return t.convexPolyhedronRepresentation.material=t.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,this.convexHeightfield(t.convexPolyhedronRepresentation,e,i,n,r,s,a,o,t,e,h)}convexHeightfield(t,e,i,n,r,s,a,o,l,c,h){const u=e.data,d=e.elementSize,p=t.boundingSphereRadius,f=Qp,m=$p,g=Jp;Mh.pointToLocalFrame(n,s,i,g);let v=Math.floor((g.x-p)/d)-1,y=Math.ceil((g.x+p)/d)+1,x=Math.floor((g.y-p)/d)-1,w=Math.ceil((g.y+p)/d)+1;if(y<0||w<0||v>u.length||x>u[0].length)return;v<0&&(v=0),y<0&&(y=0),x<0&&(x=0),w<0&&(w=0),v>=u.length&&(v=u.length-1),y>=u.length&&(y=u.length-1),w>=u[0].length&&(w=u[0].length-1),x>=u[0].length&&(x=u[0].length-1);const b=[];e.getRectMinMax(v,x,y,w,b);const _=b[0],M=b[1];if(!(g.z-p>M||g.z+p<_))for(let l=v;l0&&y<0&&(m.vsub(u,g),f.copy(p),f.normalize(),x=g.dot(f),f.scale(x,g),g.vadd(u,g),g.distanceTo(m)0&&!0===n||h<=0&&!1===n))return!1;null===n&&(n=h>0)}return!0}const gp=new hh,vp=new hh,yp=new hh,xp=new hh,wp=[new hh,new hh,new hh,new hh,new hh,new hh],bp=new hh,_p=new hh,Mp=new hh,Sp=new hh,Ep=new hh,Tp=new hh,Ap=new hh,Lp=new hh,Cp=new hh,Rp=new hh,Pp=new hh,Ip=new hh,Np=new hh,zp=new hh,Dp=new hh,Bp=new hh,Fp=new hh,Op=new hh,kp=new hh,Hp=new hh,Up=new hh,Vp=new hh,Gp=new hh,Wp=new hh,jp=new xh,qp=new hh,Xp=new hh,Yp=new hh,Zp=new hh,Jp=new hh,Qp=new hh,$p=[0],Kp=new hh,tf=new hh;class ef{constructor(){this.current=void 0,this.previous=void 0,this.current=[],this.previous=[]}getKey(t,e){if(en[r];)r++;if(i!==n[r]){for(let t=n.length-1;t>=r;t--)n[t+1]=n[t];n[r]=i}}tick(){const t=this.current;this.current=this.previous,this.previous=t,this.current.length=0}getDiff(t,e){const i=this.current,n=this.previous,r=i.length,s=n.length;let a=0;for(let e=0;en[a];)a++;r=s===n[a],r||nf(t,s)}a=0;for(let t=0;ti[a];)a++;r=i[a]===s,r||nf(e,s)}}}function nf(t,e){t.push((4294901760&e)>>16,65535&e)}class rf{constructor(){this.data={keys:[]}}get(t,e){if(t>e){const i=e;e=t,t=i}return this.data[t+"-"+e]}set(t,e,i){if(t>e){const i=e;e=t,t=i}const n=t+"-"+e;this.get(t,e)||this.data.keys.push(n),this.data[n]=i}reset(){const t=this.data,e=t.keys;for(;e.length>0;)delete t[e.pop()]}}class sf extends yh{constructor(t={}){super(),this.dt=void 0,this.allowSleep=void 0,this.contacts=void 0,this.frictionEquations=void 0,this.quatNormalizeSkip=void 0,this.quatNormalizeFast=void 0,this.time=void 0,this.stepnumber=void 0,this.default_dt=void 0,this.nextId=void 0,this.gravity=void 0,this.broadphase=void 0,this.bodies=void 0,this.hasActiveBodies=void 0,this.solver=void 0,this.constraints=void 0,this.narrowphase=void 0,this.collisionMatrix=void 0,this.collisionMatrixPrevious=void 0,this.bodyOverlapKeeper=void 0,this.shapeOverlapKeeper=void 0,this.materials=void 0,this.contactmaterials=void 0,this.contactMaterialTable=void 0,this.defaultMaterial=void 0,this.defaultContactMaterial=void 0,this.doProfiling=void 0,this.profile=void 0,this.accumulator=void 0,this.subsystems=void 0,this.addBodyEvent=void 0,this.removeBodyEvent=void 0,this.idToBodyMap=void 0,this.dt=-1,this.allowSleep=!!t.allowSleep,this.contacts=[],this.frictionEquations=[],this.quatNormalizeSkip=void 0!==t.quatNormalizeSkip?t.quatNormalizeSkip:0,this.quatNormalizeFast=void 0!==t.quatNormalizeFast&&t.quatNormalizeFast,this.time=0,this.stepnumber=0,this.default_dt=1/60,this.nextId=0,this.gravity=new hh,t.gravity&&this.gravity.copy(t.gravity),this.broadphase=void 0!==t.broadphase?t.broadphase:new Qh,this.bodies=[],this.hasActiveBodies=!1,this.solver=void 0!==t.solver?t.solver:new od,this.constraints=[],this.narrowphase=new Od(this),this.collisionMatrix=new vh,this.collisionMatrixPrevious=new vh,this.bodyOverlapKeeper=new ef,this.shapeOverlapKeeper=new ef,this.materials=[],this.contactmaterials=[],this.contactMaterialTable=new rf,this.defaultMaterial=new rd("default"),this.defaultContactMaterial=new nd(this.defaultMaterial,this.defaultMaterial,{friction:.3,restitution:0}),this.doProfiling=!1,this.profile={solve:0,makeContactConstraints:0,broadphase:0,integrate:0,narrowphase:0},this.accumulator=0,this.subsystems=[],this.addBodyEvent={type:"addBody",body:null},this.removeBodyEvent={type:"removeBody",body:null},this.idToBodyMap={},this.broadphase.setWorld(this)}getContactMaterial(t,e){return this.contactMaterialTable.get(t.id,e.id)}numObjects(){return this.bodies.length}collisionMatrixTick(){const t=this.collisionMatrixPrevious;this.collisionMatrixPrevious=this.collisionMatrix,this.collisionMatrix=t,this.collisionMatrix.reset(),this.bodyOverlapKeeper.tick(),this.shapeOverlapKeeper.tick()}addConstraint(t){this.constraints.push(t)}removeConstraint(t){const e=this.constraints.indexOf(t);-1!==e&&this.constraints.splice(e,1)}rayTest(t,e,i){i instanceof $h?this.raycastClosest(t,e,{skipBackfaces:!0},i):this.raycastAll(t,e,{skipBackfaces:!0},i)}raycastAll(t,e,i={},n){return i.mode=au.ALL,i.from=t,i.to=e,i.callback=n,af.intersectWorld(this,i)}raycastAny(t,e,i={},n){return i.mode=au.ANY,i.from=t,i.to=e,i.result=n,af.intersectWorld(this,i)}raycastClosest(t,e,i={},n){return i.mode=au.CLOSEST,i.from=t,i.to=e,i.result=n,af.intersectWorld(this,i)}addBody(t){this.bodies.includes(t)||(t.index=this.bodies.length,this.bodies.push(t),t.world=this,t.initPosition.copy(t.position),t.initVelocity.copy(t.velocity),t.timeLastSleepy=this.time,t instanceof Nh&&(t.initAngularVelocity.copy(t.angularVelocity),t.initQuaternion.copy(t.quaternion)),this.collisionMatrix.setNumObjects(this.bodies.length),this.addBodyEvent.body=t,this.idToBodyMap[t.id]=t,this.dispatchEvent(this.addBodyEvent))}removeBody(t){t.world=null;const e=this.bodies.length-1,i=this.bodies,n=i.indexOf(t);if(-1!==n){i.splice(n,1);for(let t=0;t!==i.length;t++)i[t].index=t;this.collisionMatrix.setNumObjects(e),this.removeBodyEvent.body=t,delete this.idToBodyMap[t.id],this.dispatchEvent(this.removeBodyEvent)}}getBodyById(t){return this.idToBodyMap[t]}getShapeById(t){const e=this.bodies;for(let i=0;i=t&&r1e3*t)););this.accumulator=this.accumulator%t;const s=this.accumulator/t;for(let t=0;t!==this.bodies.length;t++){const e=this.bodies[t];e.previousPosition.lerp(e.position,s,e.interpolatedPosition),e.previousQuaternion.slerp(e.quaternion,s,e.interpolatedQuaternion),e.previousQuaternion.normalize()}this.time+=e}}internalStep(t){this.dt=t;const e=this.contacts,i=pf,n=ff,r=this.numObjects(),s=this.bodies,a=this.solver,o=this.gravity,l=this.doProfiling,c=this.profile,h=Nh.DYNAMIC;let u=-1/0;const d=this.constraints,p=df;o.length();const f=o.x,m=o.y,g=o.z;let v=0;for(l&&(u=of.now()),v=0;v!==r;v++){const t=s[v];if(t.type===h){const e=t.force,i=t.mass;e.x+=i*f,e.y+=i*m,e.z+=i*g}}for(let t=0,e=this.subsystems.length;t!==e;t++)this.subsystems[t].update();l&&(u=of.now()),i.length=0,n.length=0,this.broadphase.collisionPairs(this,i,n),l&&(c.broadphase=of.now()-u);let y=d.length;for(v=0;v!==y;v++){const t=d[v];if(!t.collideConnected)for(let e=i.length-1;e>=0;e-=1)(t.bodyA===i[e]&&t.bodyB===n[e]||t.bodyB===i[e]&&t.bodyA===n[e])&&(i.splice(e,1),n.splice(e,1))}this.collisionMatrixTick(),l&&(u=of.now());const x=uf,w=e.length;for(v=0;v!==w;v++)x.push(e[v]);e.length=0;const b=this.frictionEquations.length;for(v=0;v!==b;v++)p.push(this.frictionEquations[v]);for(this.frictionEquations.length=0,this.narrowphase.getContacts(i,n,this,e,x,this.frictionEquations,p),l&&(c.narrowphase=of.now()-u),l&&(u=of.now()),v=0;v=0&&r.material.friction>=0&&(n.material.friction,r.material.friction),n.material.restitution>=0&&r.material.restitution>=0&&(i.restitution=n.material.restitution*r.material.restitution)),a.addEquation(i),n.allowSleep&&n.type===Nh.DYNAMIC&&n.sleepState===Nh.SLEEPING&&r.sleepState===Nh.AWAKE&&r.type!==Nh.STATIC&&r.velocity.lengthSquared()+r.angularVelocity.lengthSquared()>=2*r.sleepSpeedLimit**2&&(n.wakeUpAfterNarrowphase=!0),r.allowSleep&&r.type===Nh.DYNAMIC&&r.sleepState===Nh.SLEEPING&&n.sleepState===Nh.AWAKE&&n.type!==Nh.STATIC&&n.velocity.lengthSquared()+n.angularVelocity.lengthSquared()>=2*n.sleepSpeedLimit**2&&(r.wakeUpAfterNarrowphase=!0),this.collisionMatrix.set(n,r,!0),this.collisionMatrixPrevious.get(n,r)||(hf.body=r,hf.contact=i,n.dispatchEvent(hf),hf.body=n,r.dispatchEvent(hf)),this.bodyOverlapKeeper.set(n.id,r.id),this.shapeOverlapKeeper.set(s.id,o.id)}for(this.emitContactEvents(),l&&(c.makeContactConstraints=of.now()-u,u=of.now()),v=0;v!==r;v++){const t=s[v];t.wakeUpAfterNarrowphase&&(t.wakeUp(),t.wakeUpAfterNarrowphase=!1)}for(y=d.length,v=0;v!==y;v++){const t=d[v];t.update();for(let e=0,i=t.equations.length;e!==i;e++){const i=t.equations[e];a.addEquation(i)}}a.solve(t,this),l&&(c.solve=of.now()-u),a.removeAllEquations();const M=Math.pow;for(v=0;v!==r;v++){const e=s[v];if(e.type&h){const i=M(1-e.linearDamping,t),n=e.velocity;n.scale(i,n);const r=e.angularVelocity;if(r){const i=M(1-e.angularDamping,t);r.scale(i,r)}}}for(this.dispatchEvent(cf),v=0;v!==r;v++){const t=s[v];t.preStep&&t.preStep.call(t)}l&&(u=of.now());const S=this.stepnumber%(this.quatNormalizeSkip+1)==0,E=this.quatNormalizeFast;for(v=0;v!==r;v++)s[v].integrate(t,S,E);for(this.clearForces(),this.broadphase.dirty=!0,l&&(c.integrate=of.now()-u),this.stepnumber+=1,this.dispatchEvent(lf),v=0;v!==r;v++){const t=s[v],e=t.postStep;e&&e.call(t)}let T=!0;if(this.allowSleep)for(T=!1,v=0;v!==r;v++){const t=s[v];t.sleepTick(this.time),t.sleepState!==Nh.SLEEPING&&(T=!0)}this.hasActiveBodies=T}emitContactEvents(){const t=this.hasAnyEventListener("beginContact"),e=this.hasAnyEventListener("endContact");if((t||e)&&this.bodyOverlapKeeper.getDiff(mf,gf),t){for(let t=0,e=mf.length;tDate.now()-t}const lf={type:"postStep"},cf={type:"preStep"},hf={type:Nh.COLLIDE_EVENT_NAME,body:null,contact:null},uf=[],df=[],pf=[],ff=[],mf=[],gf=[],vf={type:"beginContact",bodyA:null,bodyB:null},yf={type:"endContact",bodyA:null,bodyB:null},xf={type:"beginShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null},wf={type:"endShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null},bf={specular:1515554,color:15790320,shininess:60,flatShading:!0},_f={diceColor:"#202020",textColor:"#ffffff"};class Mf{constructor(t,e,i={diceColor:"#202020",textColor:"#aaaaaa"}){this.w=t,this.h=e,this.options=i,this.scale=50,this.labels=[" ","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"],this.options=Object.assign(Object.assign({},_f),i)}setColor({diceColor:t,textColor:e}){this.options.diceColor=t,this.options.textColor=e}get radius(){return this.scale*this.scaleFactor}get diceColor(){return this.options.diceColor}get textColor(){return this.options.textColor}get buffer(){return this.geometry.geometry}create(){this.geometry=new ir(this.getGeometry(),this.getMaterials()),this.geometry.receiveShadow=!0,this.geometry.castShadow=!0,this.body.position.set(0+2*this.radius*Math.random(),0+2*this.radius*Math.random(),0+4*this.radius),this.body.velocity.x=500*Math.random()*2-1,this.body.velocity.y=500*Math.random()*2-1,this.body.angularVelocity.x=100*Math.random(),this.body.angularVelocity.y=100*Math.random()}getGeometry(){let t=new Array(this.vertices.length);for(let e=0;e=0&&s=0&&i!==r+1?n.unshift([t,i],[e,s]):n.push([t,i],[e,s]),r=i)}4===n.length&&i.push([i[n[0][0]][n[0][1]],i[n[1][0]][n[1][1]],i[n[3][0]][n[3][1]],i[n[2][0]][n[2][1]],-1])}for(let t=0;t=0&&n<4){-1==--n&&(n=3);let s=i[t][n];if(e.indexOf(s)>=0){r.push(s);break}}}--s}r.push(-1),i.push(r)}return{vectors:e,faces:i}}makeGeometry(t,e){let i=new On;for(let e=0;e6&&("6"==e||"9"==e)&&n.fillText(" .",i.width/2,i.height/2);var a=new Xe(i);return a.needsUpdate=!0,a}clone(){return{body:new Nh({mass:this.mass,shape:this.shape}),geometry:this.geometry.clone()}}}class Sf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.sides=20,this.tab=-.2,this.af=-Math.PI/4/2,this.chamfer=.955,this.vertices=[],this.faces=[[0,11,5,1],[0,5,1,2],[0,1,7,3],[0,7,10,4],[0,10,11,5],[1,5,9,6],[5,11,4,7],[11,10,2,8],[10,7,6,9],[7,1,8,10],[3,9,4,11],[3,4,2,12],[3,2,6,13],[3,6,8,14],[3,8,9,15],[4,9,5,16],[2,4,11,17],[6,2,10,18],[8,6,7,19],[9,8,1,20]],this.scaleFactor=1,this.values=[...Array(20).keys()],this.margin=1,this.mass=400;let n=(1+Math.sqrt(5))/2;this.vertices=[[-1,n,0],[1,n,0],[-1,-n,0],[1,-n,0],[0,-1,n],[0,1,n],[0,-1,-n],[0,1,-n],[n,0,-1],[n,0,1],[-n,0,-1],[-n,0,1]],this.create()}}class Ef extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=350,this.sides=12,this.tab=.2,this.af=-Math.PI/4/2,this.chamfer=.968,this.vertices=[],this.faces=[[2,14,4,12,0,1],[15,9,11,19,3,2],[16,10,17,7,6,3],[6,7,19,11,18,4],[6,18,2,0,16,5],[18,11,9,14,2,6],[1,17,10,8,13,7],[1,13,5,15,3,8],[13,8,12,4,5,9],[5,4,14,9,15,10],[0,12,8,10,16,11],[3,19,7,17,1,12]],this.scaleFactor=.9,this.values=[...Array(12).keys()],this.margin=1;let n=(1+Math.sqrt(5))/2,r=1/n;this.vertices=[[0,r,n],[0,r,-n],[0,-r,n],[0,-r,-n],[n,0,r],[n,0,-r],[-n,0,r],[-n,0,-r],[r,n,0],[r,-n,0],[-r,n,0],[-r,-n,0],[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]],this.create()}}class Tf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=350,this.sides=10,this.tab=0,this.af=6*-Math.PI/5,this.chamfer=.945,this.vertices=[],this.faces=[[5,7,11,0],[4,2,10,1],[1,3,11,2],[0,8,10,3],[7,9,11,4],[8,6,10,5],[9,1,11,6],[2,0,10,7],[3,5,11,8],[6,4,10,9],[1,0,2,-1],[1,2,3,-1],[3,2,4,-1],[3,4,5,-1],[5,4,6,-1],[5,6,7,-1],[7,6,8,-1],[7,8,9,-1],[9,8,0,-1],[9,0,1,-1]],this.scaleFactor=.9,this.values=[...Array(10).keys()],this.margin=1;for(let t=0,e=0;t<10;++t,e+=2*Math.PI/10)this.vertices.push([Math.cos(e),Math.sin(e),.105*(t%2?1:-1)]);this.vertices.push([0,0,-1]),this.vertices.push([0,0,1]),this.create()}}class Af extends Mf{constructor(t,e,i=_f){super(t,e,i),this.labels=["","00","10","20","30","40","50","60","70","80","90"],this.sides=100,this.mass=350,this.tab=0,this.af=6*-Math.PI/5,this.chamfer=.945,this.vertices=[],this.faces=[[5,7,11,0],[4,2,10,1],[1,3,11,2],[0,8,10,3],[7,9,11,4],[8,6,10,5],[9,1,11,6],[2,0,10,7],[3,5,11,8],[6,4,10,9],[1,0,2,-1],[1,2,3,-1],[3,2,4,-1],[3,4,5,-1],[5,4,6,-1],[5,6,7,-1],[7,6,8,-1],[7,8,9,-1],[9,8,0,-1],[9,0,1,-1]],this.scaleFactor=.9,this.values=[...Array(10).keys()],this.margin=1;for(let t=0,e=0;t<10;++t,e+=2*Math.PI/10)this.vertices.push([Math.cos(e),Math.sin(e),.105*(t%2?1:-1)]);this.vertices.push([0,0,-1]),this.vertices.push([0,0,1]),this.create()}}class Lf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=340,this.sides=8,this.tab=0,this.af=-Math.PI/4/2,this.chamfer=.965,this.vertices=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],this.faces=[[0,2,4,1],[0,4,3,2],[0,3,5,3],[0,5,2,4],[1,3,4,5],[1,4,2,6],[1,2,5,7],[1,5,3,8]],this.scaleFactor=1,this.values=[...Array(8).keys()],this.margin=1.2,this.create()}}class Cf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=300,this.tab=.1,this.af=Math.PI/4,this.chamfer=.96,this.vertices=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]],this.faces=[[0,3,2,1,1],[1,2,6,5,2],[0,1,5,4,3],[3,7,6,2,4],[0,4,7,3,5],[4,5,6,7,6]],this.scaleFactor=.9,this.sides=6,this.margin=1,this.values=[...Array(6).keys()],this.create()}}class Rf extends Mf{constructor(t,e,i=_f){super(t,e,i),this.mass=300,this.tab=-.1,this.af=7*Math.PI/6,this.chamfer=.96,this.vertices=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],this.faces=[[1,0,2,1],[0,1,3,2],[0,3,2,3],[1,2,3,4]],this.scaleFactor=1.2,this.sides=4,this.margin=1,this.d4FaceTexts=[[[],[0,0,0],[2,4,3],[1,3,4],[2,1,4],[1,2,3]],[[],[0,0,0],[2,3,4],[3,1,4],[2,4,1],[3,2,1]],[[],[0,0,0],[4,3,2],[3,4,1],[4,2,1],[3,1,2]],[[],[0,0,0],[4,2,3],[1,4,3],[4,1,2],[1,3,2]]],this.faceTexts=this.d4FaceTexts[0],this.values=[...Array(4).keys()],this.create()}getMaterials(){let t=[];for(let e=0;et.geometry))),this.world.add(...this.current)):this.unload()}onload(){this.container.empty(),this.container.style.opacity="1",document.body.appendChild(this.container),this.renderer.shadowMap.enabled=this.shadows,this.renderer.shadowMap.type=2,this.container.appendChild(this.renderer.domElement),this.renderer.setClearColor(0,0),this.scene=new lo,this.initScene(),this.registerDomEvent(window,"resize",(()=>{this.initScene()})),this.initWorld()}start(){return t(this,void 0,void 0,(function*(){return new Promise(((e,i)=>t(this,void 0,void 0,(function*(){this.current.length||i(),this.event.on("throw-finished",(t=>{e(t)})),this.animating=!0,this.render()}))))}))}enableShadows(){this.shadows=!0,this.renderer&&(this.renderer.shadowMap.enabled=this.shadows),this.light&&(this.light.castShadow=this.shadows),this.desk&&(this.desk.receiveShadow=this.shadows)}disableShadows(){this.shadows=!1,this.renderer&&(this.renderer.shadowMap.enabled=this.shadows),this.light&&(this.light.castShadow=this.shadows),this.desk&&(this.desk.receiveShadow=this.shadows)}get mw(){return Math.max(this.WIDTH,this.HEIGHT)}setDimensions(t){this.display.currentWidth=this.container.clientWidth/2,this.display.currentHeight=this.container.clientHeight/2,t?(this.display.containerWidth=t.w,this.display.containerHeight=t.h):(this.display.containerWidth=this.display.currentWidth,this.display.containerHeight=this.display.currentHeight),this.display.aspect=Math.min(this.display.currentWidth/this.display.containerWidth,this.display.currentHeight/this.display.containerHeight),this.display.scale=Math.sqrt(this.display.containerWidth*this.display.containerWidth+this.display.containerHeight*this.display.containerHeight)/13,this.renderer.setSize(2*this.display.currentWidth,2*this.display.currentHeight),this.cameraHeight.max=this.display.currentHeight/this.display.aspect/Math.tan(10*Math.PI/180),this.factory.width=this.display.currentWidth,this.factory.height=this.display.currentHeight,this.cameraHeight.medium=this.cameraHeight.max/1.5,this.cameraHeight.far=this.cameraHeight.max,this.cameraHeight.close=this.cameraHeight.max/2}initCamera(){this.camera&&this.scene.remove(this.camera),this.camera=new hr(20,this.display.currentWidth/this.display.currentHeight,1,1.3*this.cameraHeight.max),this.camera.position.z=this.cameraHeight.far,this.camera.lookAt(new Ke(0,0,0))}initLighting(){const t=Math.max(this.display.containerWidth,this.display.containerHeight);this.light&&this.scene.remove(this.light),this.ambientLight&&this.scene.remove(this.ambientLight),this.light=new Pc(this.colors.spotlight,1),this.light.position.set(-t/2,t/2,3*t),this.light.target.position.set(0,0,0),this.light.distance=5*t,this.light.angle=Math.PI/4,this.light.castShadow=this.shadows,this.light.shadow.camera.near=t/10,this.light.shadow.camera.far=5*t,this.light.shadow.camera.fov=50,this.light.shadow.bias=.001,this.light.shadow.mapSize.width=1024,this.light.shadow.mapSize.height=1024,this.scene.add(this.light),this.ambientLight=new Fc(16777215,.9),this.scene.add(this.ambientLight)}initDesk(){this.desk&&this.scene.remove(this.desk);let t=new Jl;t.opacity=.5,this.desk=new ir(new Sr(6*this.display.containerWidth,6*this.display.containerHeight,1,1),t),this.desk.receiveShadow=this.shadows,this.scene.add(this.desk)}initScene(){this.setDimensions(),this.initCamera(),this.initLighting(),this.initDesk(),this.camera.updateProjectionMatrix(),this.renderer.render(this.scene,this.camera)}initWorld(){this.world=new If(this.WIDTH,this.HEIGHT),this.iterations=0}render(){var t,e,i;if(this.throwFinished()){const n={};let r=null!==(t=this.current.filter((t=>t instanceof Of&&t.isPercentile)))&&void 0!==t?t:[];r.length%2!=0&&(r[r.length-1].isPercentile=!1,r.pop());for(let t=0;tt.geometry)))}this.current=this.current.filter((t=>!(t instanceof Of&&t.isPercentile))),this.current.forEach((t=>{var e;n[t.sides]=[...null!==(e=n[t.sides])&&void 0!==e?e:[],t.getUpsideValue()]}));const s=Object.entries(n).sort(((t,e)=>e[0]-t[0]));return this.event.trigger("throw-finished",s),void this.registerInterval(window.setTimeout((()=>{this.container.style.opacity="0",this.registerInterval(window.setTimeout((()=>{this.animating=!1,this.unload()}),1e3))}),2e3))}this.animation=requestAnimationFrame((()=>this.render())),this.world.step(this.frame_rate),this.iterations++,this.current.forEach((t=>{t.set()})),this.renderer.render(this.scene,this.camera)}dispose(...t){t.forEach((t=>{"dispose"in t&&t.dispose(),t.children&&this.dispose(...t.children)}))}detach(){}onunload(){cancelAnimationFrame(this.animation),this.container.detach(),this.container.empty(),this.renderer.domElement.detach(),this.renderer.dispose(),this.factory.dispose(),this.ambientLight.dispose(),this.light.dispose(),this.scene.children.forEach((t=>this.dispose(t))),this.scene.remove(this.scene,...this.scene.children,...this.current.map((t=>t.geometry))),this.current.forEach((t=>{[...Array.isArray(t.geometry.material)?t.geometry.material:[t.geometry.material]].forEach((t=>t&&t.dispose())),this.world.world.removeBody(t.body)})),this.current=[]}onThrowFinished(){}throwFinished(){let t=!0;if(this.iterations<10/this.frame_rate)for(let e=0;e3){i.stopped=!0;continue}}else i.stopped=this.iterations;t=!1}else i.stopped=void 0,t=!1}return t}}class If{constructor(t,e){this.WIDTH=t,this.HEIGHT=e,this.world=new sf({gravity:new hh(0,0,-3928)}),this.ground=this.getPlane(),this.diceMaterial=new rd,this.deskMaterial=new rd,this.barrierMaterial=new rd,this.world.broadphase=new Qh,this.world.allowSleep=!0,this.ground.position.set(0,0,0),this.world.addBody(this.ground),this.buildWalls()}add(...t){t.forEach((t=>{this.world.addBody(t.body)}))}step(t=1/60){const e=performance.now()/1e3;if(this.lastCallTime){const i=e-this.lastCallTime;this.world.step(t,i)}else this.world.step(t);this.lastCallTime=e}buildWalls(){this.world.addContactMaterial(new nd(this.deskMaterial,this.diceMaterial,{friction:.01,restitution:.5})),this.world.addContactMaterial(new nd(this.barrierMaterial,this.diceMaterial,{friction:0,restitution:1})),this.world.addContactMaterial(new nd(this.diceMaterial,this.diceMaterial,{friction:0,restitution:.5})),this.world.addBody(new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.deskMaterial}));let t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial});t.quaternion.setFromAxisAngle(new hh(1,0,0),Math.PI/2),t.position.set(0,.93*this.HEIGHT,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(1,0,0),-Math.PI/2),t.position.set(0,.93*-this.HEIGHT,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(0,1,0),-Math.PI/2),t.position.set(.93*this.WIDTH,0,0),this.world.addBody(t),t=new Nh({allowSleep:!1,mass:0,shape:new sd,material:this.barrierMaterial}),t.quaternion.setFromAxisAngle(new hh(0,1,0),Math.PI/2),t.position.set(.93*-this.WIDTH,0,0),this.world.addBody(t)}getPlane(){return new Nh({type:Nh.STATIC,shape:new sd})}}const Nf={pos:{x:0+100*Math.random(),y:0+100*Math.random(),z:100},velocity:{x:500*Math.random()*2-1,y:500*Math.random()*2-1,z:0},angular:{x:100*Math.random(),y:100*Math.random(),z:100*Math.random()},axis:{x:Math.random(),y:Math.random(),z:Math.random(),w:Math.random()}};class zf{constructor(t,e,i){this.w=t,this.h=e,this.data=i,this.scale=50,this.stopped=!1,this.iteration=0,this.vector=Object.assign({},Nf),this.geometry=i.geometry,this.body=i.body}generateVector(t){const e=Math.sqrt(t.x*t.x+t.y*t.y),i=(Math.random()+3)*e,n={x:t.x/e,y:t.y/e},r=this.makeRandomVector(n),s={x:this.w*(r.x>0?-1:1)*.9,y:this.h*(r.y>0?-1:1)*.9,z:200*Math.random()+200},a=Math.abs(r.x/r.y);a>1?s.y/=a:s.x*=a;const o=this.makeRandomVector(n);return{pos:s,velocity:{x:o.x*i,y:o.y*i,z:-10},angular:{x:-(Math.random()*r.y*5+this.inertia*r.y),y:Math.random()*r.x*5+this.inertia*r.x,z:0},axis:{x:Math.random(),y:Math.random(),z:Math.random(),w:Math.random()}}}makeRandomVector(t){const e=Math.random()*Math.PI/5-Math.PI/5/2,i={x:t.x*Math.cos(e)-t.y*Math.sin(e),y:t.x*Math.sin(e)+t.y*Math.cos(e)};return 0==i.x&&(i.x=.01),0==i.y&&(i.y=.01),i}get buffer(){return this.geometry.geometry}getUpsideValue(){let t,e=new Ke(0,0,4==this.sides?-1:1),i=2*Math.PI;const n=this.buffer.getAttribute("normal").array;for(let r=0,s=this.buffer.groups.length;rthis.sides;)r-=this.sides;for(;r<1;)r+=this.sides;e.groups[n].materialIndex=r+1}}this.updateMaterialsForValue(t-i),this.geometry.geometry=e}resetBody(){this.body.vlambda=new hh,this.body.position=new hh,this.body.previousPosition=new hh,this.body.initPosition=new hh,this.body.velocity=new hh,this.body.initVelocity=new hh,this.body.force=new hh,this.body.torque=new hh,this.body.quaternion=new xh,this.body.initQuaternion=new xh,this.body.angularVelocity=new hh,this.body.initAngularVelocity=new hh,this.body.interpolatedPosition=new hh,this.body.interpolatedQuaternion=new xh,this.body.inertia=new hh,this.body.invInertia=new hh,this.body.invInertiaWorld=new lh,this.body.invInertiaSolve=new hh,this.body.invInertiaWorldSolve=new lh,this.body.wlambda=new hh,this.body.updateMassProperties()}updateMaterialsForValue(t){}set(){this.geometry.position.set(this.body.position.x,this.body.position.y,this.body.position.z),this.geometry.quaternion.set(this.body.quaternion.x,this.body.quaternion.y,this.body.quaternion.z,this.body.quaternion.w)}create(){this.body.position.set(this.vector.pos.x,this.vector.pos.y,this.vector.pos.z),this.body.quaternion.setFromAxisAngle(new hh(this.vector.axis.x,this.vector.axis.y,this.vector.axis.z),this.vector.axis.w*Math.PI*2),this.body.angularVelocity.set(this.vector.angular.x,this.vector.angular.y,this.vector.angular.z),this.body.velocity.set(this.vector.velocity.x,this.vector.velocity.y,this.vector.velocity.z),this.body.linearDamping=.1,this.body.angularDamping=.1}}class Df extends e.Component{constructor(t,e,i){super(),this.width=t,this.height=e,this.plugin=i,this.d100=new Af(this.width,this.height,this.colors),this.d20=new Sf(this.width,this.height,this.colors),this.d12=new Ef(this.width,this.height,this.colors),this.d10=new Tf(this.width,this.height,this.colors),this.d8=new Lf(this.width,this.height,this.colors),this.d6=new Cf(this.width,this.height,this.colors),this.d4=new Rf(this.width,this.height,this.colors)}get colors(){return{diceColor:this.plugin.data.diceColor,textColor:this.plugin.data.textColor}}updateColors(){this.dispose(),this.d100=new Af(this.width,this.height,this.colors),this.d20=new Sf(this.width,this.height,this.colors),this.d12=new Ef(this.width,this.height,this.colors),this.d10=new Tf(this.width,this.height,this.colors),this.d8=new Lf(this.width,this.height,this.colors),this.d6=new Cf(this.width,this.height,this.colors),this.d4=new Rf(this.width,this.height,this.colors)}onunload(){this.dispose()}disposeChildren(...t){t.forEach((t=>{"dispose"in t&&t.dispose(),t.children&&this.disposeChildren(...t.children)}))}dispose(){this.disposeChildren(this.d100.geometry.children),this.disposeChildren(this.d20.geometry.children),this.disposeChildren(this.d12.geometry.children),this.disposeChildren(this.d10.geometry.children),this.disposeChildren(this.d8.geometry.children),this.disposeChildren(this.d6.geometry.children),this.disposeChildren(this.d4.geometry.children)}getDice(t,e){const i=[];for(const n of t)switch(n.faces.max){case 4:i.push(...new Array(n.rolls).fill(0).map((t=>new Uf(this.width,this.height,this.d4.clone(),e))));break;case 6:i.push(...new Array(n.rolls).fill(0).map((t=>new Hf(this.width,this.height,this.d6.clone(),e))));break;case 8:i.push(...new Array(n.rolls).fill(0).map((t=>new kf(this.width,this.height,this.d8.clone(),e))));break;case 10:i.push(...new Array(n.rolls).fill(0).map((t=>new Of(this.width,this.height,this.d10.clone(),e))));break;case 12:i.push(...new Array(n.rolls).fill(0).map((t=>new Ff(this.width,this.height,this.d12.clone(),e))));break;default:i.push(...new Array(n.rolls).fill(0).map((t=>new Bf(this.width,this.height,this.d20.clone(),e))));break;case 100:i.push(...new Array(n.rolls).fill(0).map((t=>[new Of(this.width,this.height,this.d100.clone(),e,!0),new Of(this.width,this.height,this.d10.clone(),e,!0)])).flat())}return i}}class Bf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=20,this.inertia=6,n&&(this.vector=this.generateVector(n)),this.create()}}class Ff extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=12,this.inertia=8,n&&(this.vector=this.generateVector(n)),this.create()}}class Of extends zf{constructor(t,e,i,n,r=!1){super(t,e,i),this.w=t,this.h=e,this.data=i,this.isPercentile=r,this.sides=10,this.inertia=9,n&&(this.vector=this.generateVector(n)),this.create()}}class kf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=8,this.inertia=10,n&&(this.vector=this.generateVector(n)),this.create()}}class Hf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=6,this.inertia=13,n&&(this.vector=this.generateVector(n)),this.create()}}class Uf extends zf{constructor(t,e,i,n){super(t,e,i),this.w=t,this.h=e,this.data=i,this.sides=4,this.inertia=5,n&&(this.vector=this.generateVector(n)),this.create()}}const Vf="DICE_ROLLER_VIEW";(0,e.addIcon)("d4",''),(0,e.addIcon)("d6",''),(0,e.addIcon)("d8",''),(0,e.addIcon)("d10",''),(0,e.addIcon)("d12",''),(0,e.addIcon)("d20",''),(0,e.addIcon)("d100",''),(0,e.addIcon)("dice-roller-save",''),(0,e.addIcon)("dice-roller-plus",''),(0,e.addIcon)("dice-roller-minus",'');class Gf extends e.ItemView{constructor(t,e){super(e),this.plugin=t,this.leaf=e,this.dice=Gf.DICE(),this.custom="",this.adv=!1,this.dis=!1,this.add=0,this.renderer=new Pf(this.plugin),this.contentEl.addClass("dice-roller-view"),this.registerEvent(this.plugin.app.workspace.on("dice-roller:update-colors",(()=>{this.renderer.factory.updateColors()})))}static DICE(){return{d4:0,d6:0,d8:0,d10:0,d12:0,d20:0,d100:0}}onOpen(){return t(this,void 0,void 0,(function*(){this.display()}))}display(){return t(this,void 0,void 0,(function*(){this.contentEl.empty(),this.gridEl=this.contentEl.createDiv("dice-roller-grid"),this.formulaEl=this.contentEl.createDiv("dice-roller-formula");const t=this.contentEl.createDiv("dice-roller-results-container");t.createEl("h4",{text:"Results"}),this.resultEl=t.createDiv("dice-roller-results"),this.noResultsEl=this.resultEl.createSpan({text:"No results yet! Roll some dice to get started :)"}),this.buildButtons(),this.buildFormula()}))}buildButtons(){this.gridEl.empty();const i=this.gridEl.createDiv("dice-buttons");for(let n in this.dice)new e.ExtraButtonComponent(i.createDiv("dice-button")).setIcon(n).extraSettingsEl.onclick=e=>t(this,void 0,void 0,(function*(){let t=e.getModifierState("Shift")?-1:1;this.dice[n]+=t,this.setFormula();const i=yield this.plugin.getRoller(this.formulaComponent.inputEl.value,"view");i instanceof jt&&(this.stack=i)}));const n=this.gridEl.createDiv("advantage-disadvantage"),r=new e.ButtonComponent(n).setButtonText("ADV").onClick((()=>{this.adv=!this.adv,this.dis=!1,this.adv?(r.setCta(),s.removeCta()):r.removeCta(),this.setFormula()})),s=new e.ButtonComponent(n).setButtonText("DIS").onClick((()=>{this.dis=!this.dis,this.dis?(s.setCta(),r.removeCta()):s.removeCta(),this.adv=!1,this.setFormula()})),a=this.gridEl.createDiv("dice-context").createDiv("add-subtract");new e.ExtraButtonComponent(a).setIcon("dice-roller-minus").onClick((()=>{this.add-=1,o.setValue(`${this.add}`),this.setFormula()}));const o=new e.TextComponent(a).setValue(`${this.add?this.add:""}`).onChange((t=>{isNaN(Number(t))||(this.add=Number(t)),this.setFormula()}));new e.ExtraButtonComponent(a).setIcon("dice-roller-plus").onClick((()=>{this.add+=1,o.setValue(`${this.add}`),this.setFormula()}))}buildFormula(){this.formulaEl.empty(),this.formulaComponent=new e.TextAreaComponent(this.formulaEl).setPlaceholder("Dice Formula"),this.formulaComponent.onChange((0,e.debounce)((e=>t(this,void 0,void 0,(function*(){}))),500,!0));const i=new e.ButtonComponent(this.formulaEl).setIcon(Ft).setCta().setTooltip("Roll").onClick((()=>t(this,void 0,void 0,(function*(){var t,n;if(!this.formulaComponent.inputEl.value)return;i.setDisabled(!0);const r=yield this.plugin.getRoller(this.formulaComponent.inputEl.value,"view");if(!(r instanceof jt))return void new e.Notice("The Dice View only supports dice rolls.");if(yield r.roll(),!r.dice.length)return void new e.Notice("Invalid formula.");let s=r.resultText;if(this.plugin.data.renderer&&r.dice.filter((t=>!t.static)).length){this.addChild(this.renderer);const e=r.dice.filter((t=>t.static));this.renderer.setDice(r.dice.filter((t=>!t.static)));const i=yield this.renderer.start();let a=0;s=r.original;for(let t=0;te!=t?`${e}d`:`${e}`))}]`}else a+=e[1].reduce(((t,e)=>t+e)),n=`[${e[1]}]`;s=s.replace(new RegExp(`\\d+d${e[0]}`),n)}const o=null!==(n=null===(t=null==e?void 0:e.map((t=>t.result)))||void 0===t?void 0:t.reduce(((t,e)=>t+e),0))&&void 0!==n?n:0;r.result=a+o}i.setDisabled(!1),this.addResult({result:r.result,original:r.original,resultText:s}),this.dice=Gf.DICE(),this.add=null,this.adv=!1,this.dis=!1,this.buildButtons(),this.setFormula()}))));i.buttonEl.addClass("dice-roller-roll")}addResult(i){this.noResultsEl&&this.noResultsEl.detach();const n=createDiv("view-result");n.createSpan({text:i.original}),n.createEl("strong",{text:`${i.result}`,attr:{"aria-label":i.resultText}});const r=n.createDiv("result-context");r.createEl("em",{text:(new Date).toLocaleString()}),new e.ExtraButtonComponent(r).setIcon("trash").onClick((()=>{n.detach(),0===this.resultEl.children.length&&this.resultEl.prepend(this.noResultsEl)})),new e.ExtraButtonComponent(r).setIcon(Ot).setTooltip("Copy Result").onClick((()=>t(this,void 0,void 0,(function*(){yield navigator.clipboard.writeText(`${i.result}`)})))).extraSettingsEl.addClass("dice-content-copy"),this.resultEl.prepend(n)}get formulaString(){const t=[],e=Object.entries(this.dice).filter((([t,e])=>0!=e));if(!e.length)return"";e.sort(((t,e)=>Number(e[0].slice(1))-Number(t[0].slice(1))));const i=e.shift();return t.push(`${i[1]}${i[0]}`),this.adv?t.push("kh"):this.dis&&t.push("dh"),e.length&&t.push(...e.map((([t,e])=>`${e>0?"+":"-"}${Math.abs(e)}${t}`))),this.add&&0!=this.add&&(t.push(this.add>0?"+":"-"),t.push(Math.abs(this.add))),t.join("")}setFormula(){this.formulaComponent.setValue(this.formulaString)}getDisplayText(){return"Dice Roller"}getViewType(){return Vf}getIcon(){return Ft}onClose(){const e=Object.create(null,{onClose:{get:()=>super.onClose}});return t(this,void 0,void 0,(function*(){yield e.onClose.call(this),this.renderer.unload()}))}}String.prototype.matchAll=String.prototype.matchAll||function*(t){const e=t.global?t.flags:t.flags+"g",i=new RegExp(t,e);let n;for(;n=i.exec(this);)yield n};const Wf={returnAllTags:!0,rollLinksForTags:!1,copyContentButton:!0,displayResultsInline:!1,formulas:{},persistResults:!1,results:{},defaultRoll:1,defaultFace:100,renderer:!1,diceColor:"#202020",textColor:"#ffffff"};class jf extends e.Plugin{constructor(){super(...arguments),this.persistingFiles=new Set,this.operators={"+":(t,e)=>t+e,"-":(t,e)=>t-e,"*":(t,e)=>t*e,"/":(t,e)=>t/e,"^":(t,e)=>Math.pow(t,e)}}get view(){const t=this.app.workspace.getLeavesOfType(Vf),e=t.length?t[0]:null;if(e&&e.view&&e.view instanceof Gf)return e.view}addDiceView(){return t(this,void 0,void 0,(function*(){this.app.workspace.getLeavesOfType(Vf).length||(yield this.app.workspace.getRightLeaf(!1).setViewState({type:Vf}),this.app.workspace.revealLeaf(this.view.leaf))}))}onload(){return t(this,void 0,void 0,(function*(){console.log("DiceRoller plugin loaded"),this.data=Object.assign(Wf,yield this.loadData()),this.addSettingTab(new $t(this.app,this)),this.registerView(Vf,(t=>new Gf(this,t))),this.app.workspace.onLayoutReady((()=>this.addDiceView())),this.addCommand({id:"open-view",name:"Open Dice View",checkCallback:t=>{if(!this.view)return t||this.addDiceView(),!0}});const i=Lt(a).html[0];(0,e.addIcon)(Ft,i);const n=Lt(o).html[0];(0,e.addIcon)(Ot,n),this.registerMarkdownPostProcessor(((i,n)=>t(this,void 0,void 0,(function*(){var r;let s=i.querySelectorAll("code");if(!s.length)return;const a=n.sourcePath,o=n.getSectionInfo(i),l=null===(r=n.getSectionInfo(i))||void 0===r?void 0:r.lineStart,c=this.app.vault.getAbstractFileByPath(n.sourcePath);if(!(c&&c instanceof e.TFile&&o))return;const h={};for(let i=0;it(this,void 0,void 0,(function*(){var t,e,o,c;if(yield s.roll(),this.data.persistResults&&!/dice\-/.test(r.innerText)||/dice\+/.test(r.innerText)){this.persistingFiles.add(n.sourcePath),h[i]=s;const r=null!==(c=null===(o=null===(e=null===(t=this.data.results)||void 0===t?void 0:t[a])||void 0===e?void 0:e[l])||void 0===o?void 0:o[i])&&void 0!==c?c:null;r&&(yield s.applyResult(r))}r.replaceWith(s.containerEl)}));s.loaded?yield o():s.on("loaded",(()=>t(this,void 0,void 0,(function*(){yield o()}))))}catch(t){console.error(t),new e.Notice(`There was an error parsing the dice string: ${r.innerText}.\n\n${t}`,5e3);continue}}if(a in this.data.results&&(this.data.results[a][l]={}),Object.entries(h).length){const r=this.app.workspace.getActiveViewOfType(e.MarkdownView);if(r){const e=this;let s=function(t,e){const i=Object.keys(e).map((i=>function(t,e,i){const n=t[e],r=t.hasOwnProperty(e);let s=i(n);return n&&Object.setPrototypeOf(s,n),Object.setPrototypeOf(a,s),t[e]=a,o;function a(...i){return s===n&&t[e]===a&&o(),s.apply(this,i)}function o(){t[e]===a&&(r?t[e]=n:delete t[e]),s!==n&&(s=n,Object.setPrototypeOf(a,n||Function))}}(t,i,e[i])));return 1===i.length?i[0]:function(){i.forEach((t=>t()))}}(r,{onUnloadFile:function(r){return function(o){var l,u,d,p;return t(this,void 0,void 0,(function*(){if(o=c){e.persistingFiles.has(a)&&(e.persistingFiles.delete(a),e.data.results[a]={});for(let t in h){const r=h[t],s=null===(l=n.getSectionInfo(i))||void 0===l?void 0:l.lineStart;if(null==s)continue;const o={[s]:Object.assign(Object.assign({},null!==(d=null===(u=e.data.results[a])||void 0===u?void 0:u[s])&&void 0!==d?d:{}),{[t]:r.toResult()})};e.data.results[a]=Object.assign(Object.assign({},null!==(p=e.data.results[a])&&void 0!==p?p:{}),o),yield e.saveSettings()}}return s(),yield r.call(this,o)}))}}});r.register(s),r.register((()=>t(this,void 0,void 0,(function*(){var t,e,r,s;this.persistingFiles.has(a)&&(this.persistingFiles.delete(a),this.data.results[a]={});for(let o in h){const l=h[o],c=null===(t=n.getSectionInfo(i))||void 0===t?void 0:t.lineStart;if(null==c)continue;const u={[c]:Object.assign(Object.assign({},null!==(r=null===(e=this.data.results[a])||void 0===e?void 0:e[c])&&void 0!==r?r:{}),{[o]:l.toResult()})};this.data.results[a]=Object.assign(Object.assign({},null!==(s=this.data.results[a])&&void 0!==s?s:{}),u),yield this.saveSettings()}}))))}}})))),this.lexer=new(s()),this.addLexerRules();var r={precedence:2,associativity:"left"},l={precedence:1,associativity:"left"};this.parser=new Ct({"+":l,"-":l,"*":r,"/":r,"^":{precedence:3,associativity:"right"}})}))}parseDice(e,i){return t(this,void 0,void 0,(function*(){const t=this.getRoller(e,i);return{result:yield t.roll(),roller:t}}))}clearEmpties(t){for(var e in t)t[e]&&"object"==typeof t[e]&&(this.clearEmpties(t[e]),0===Object.keys(t[e]).length&&delete t[e])}saveSettings(){return t(this,void 0,void 0,(function*(){this.clearEmpties(this.data.results),yield this.saveData(this.data)}))}getRoller(t,e){t in this.data.formulas&&(t=this.data.formulas[t]);const i=this.parse(t);switch(this.getTypeFromLexemes(i)){case"dice":return new jt(this,t,i);case"table":return new Zt(this,t,i[0],e);case"section":return new qt(this,t,i[0],e);case"tag":if(!this.app.plugins.plugins.dataview)throw new Error("Tags are only supported with the Dataview plugin installed.");return new Xt(this,t,i[0],e);case"link":return new Yt(this,t,i[0],e)}}getTypeFromLexemes(t){return t.some((({type:t})=>"table"===t))?"table":t.some((({type:t})=>"section"===t))?"section":t.some((({type:t})=>"tag"===t))?"tag":t.some((({type:t})=>"link"===t))?"link":"dice"}addLexerRules(){this.lexer.addRule(/\s+/,(function(){})),this.lexer.addRule(/[{}]+/,(function(){})),this.lexer.addRule(Pt,(function(t){return{type:"table",data:t,original:t,conditionals:null}})),this.lexer.addRule(It,(function(t){return{type:"section",data:t,original:t,conditionals:null}})),this.lexer.addRule(Rt,(t=>{var e;const{groups:i}=t.match(Rt);let n="tag";return("link"===i.types||this.data.rollLinksForTags&&!(null===(e=i.types)||void 0===e?void 0:e.length))&&(n="link"),{type:n,data:t,original:t,conditionals:null}})),this.lexer.addRule(zt,(function(t){const{dice:e,conditional:i}=t.match(zt).groups;let n=[];if(i){let t=i.matchAll(Bt);if(t)for(let e of t){if(!e)continue;const{comparer:t,operator:i}=e.groups;n.push({comparer:Number(t),operator:i})}}return{type:"dice",data:e,original:t,conditionals:n}})),this.lexer.addRule(Dt,(t=>{const{roll:e=this.data.defaultRoll,faces:i=this.data.defaultFace,conditional:n}=t.match(Dt).groups;let r=[];if(n){let t=n.matchAll(Bt);if(t)for(let e of t){if(!e)continue;const{comparer:t,operator:i}=e.groups;r.push({comparer:Number(t),operator:i})}}return{type:"dice",data:`${e}d${i}`,original:t,conditionals:r}})),this.lexer.addRule(Nt,(function(t){return{type:"math",data:t,original:t,conditionals:null}})),this.lexer.addRule(/1[Dd]S/,(function(t){var e;const[,i]=null!==(e=t.match(/1[Dd]S/))&&void 0!==e?e:[,"1"];return{type:"stunt",data:i,original:t,conditionals:[]}})),this.lexer.addRule(/kh?(?!:l)(\d*)/,(function(t){return{type:"kh",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/dl?(?!:h)\d*/,(function(t){return{type:"dl",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/kl\d*/,(function(t){return{type:"kl",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/dh\d*/,(function(t){return{type:"dh",data:t.replace(/^\D+/g,""),original:t,conditionals:null}})),this.lexer.addRule(/!!(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/!!(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?=|=!|>=?|<=?)(-?\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/!!i/.test(t)&&(e="100"),{type:"!!",data:e,original:t,conditionals:i}})),this.lexer.addRule(/!(i|\d+)?(?:(!?=|=!?|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/!(i|\d+)?(?:(!?=|=!?|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?=|=!|>=?|<=?)(\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!?|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/!i/.test(t)&&(e="100"),{type:"!",data:e,original:t,conditionals:i}})),this.lexer.addRule(/r(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/,(function(t){let[,e="1"]=t.match(/r(i|\d+)?(?:(!?=|=!|>=?|<=?)(-?\d+))*/),i=[];if(/(?:(!?={1,2}|>=?|<=?)(-?\d+))+/.test(t))for(const[,e,n]of t.matchAll(/(?:(!?=|=!|>=?|<=?)(-?\d+))/g))i.push({operator:e,comparer:Number(n)});return/ri/.test(t)&&(e="100"),{type:"r",data:e,original:t,conditionals:i}}))}onunload(){console.log("DiceRoller unloaded"),this.app.workspace.getLeavesOfType(Vf).forEach((t=>t.detach())),"__THREE__"in window&&delete window.__THREE__}parse(t){this.lexer.setInput(t);for(var e,i=[];e=this.tryLex();)i.push(e);return this.parser.parse(i)}tryLex(){try{return this.lexer.lex()}catch(t){}}}})();var r=exports;for(var s in n)r[s]=n[s];n.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})(); \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-dice-roller/manifest.json b/.obsidian/plugins/obsidian-dice-roller/manifest.json index 0a8bf53b..62af7aa1 100644 --- a/.obsidian/plugins/obsidian-dice-roller/manifest.json +++ b/.obsidian/plugins/obsidian-dice-roller/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-dice-roller", "name": "Dice Roller", - "version": "7.0.0", + "version": "7.0.1", "minAppVersion": "0.12.0", "description": "Inline dice rolling for Obsidian.md", "author": "Jeremy Valentine", diff --git a/.obsidian/plugins/obsidian-emoji-toolbar/main.js b/.obsidian/plugins/obsidian-emoji-toolbar/main.js deleted file mode 100644 index 87994029..00000000 --- a/.obsidian/plugins/obsidian-emoji-toolbar/main.js +++ /dev/null @@ -1,17354 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var orderedEmoji = [ - "😀", - "😃", - "😄", - "😁", - "😆", - "😅", - "🤣", - "😂", - "🙂", - "🙃", - "😉", - "😊", - "😇", - "🥰", - "😍", - "🤩", - "😘", - "😗", - "☺️", - "😚", - "😙", - "🥲", - "😋", - "😛", - "😜", - "🤪", - "😝", - "🤑", - "🤗", - "🤭", - "🤫", - "🤔", - "🤐", - "🤨", - "😐", - "😑", - "😶", - "😏", - "😒", - "🙄", - "😬", - "🤥", - "😌", - "😔", - "😪", - "🤤", - "😴", - "😷", - "🤒", - "🤕", - "🤢", - "🤮", - "🤧", - "🥵", - "🥶", - "🥴", - "😵", - "🤯", - "🤠", - "🥳", - "🥸", - "😎", - "🤓", - "🧐", - "😕", - "😟", - "🙁", - "☹️", - "😮", - "😯", - "😲", - "😳", - "🥺", - "😦", - "😧", - "😨", - "😰", - "😥", - "😢", - "😭", - "😱", - "😖", - "😣", - "😞", - "😓", - "😩", - "😫", - "🥱", - "😤", - "😡", - "😠", - "🤬", - "😈", - "👿", - "💀", - "☠️", - "💩", - "🤡", - "👹", - "👺", - "👻", - "👽", - "👾", - "🤖", - "😺", - "😸", - "😹", - "😻", - "😼", - "😽", - "🙀", - "😿", - "😾", - "🙈", - "🙉", - "🙊", - "💋", - "💌", - "💘", - "💝", - "💖", - "💗", - "💓", - "💞", - "💕", - "💟", - "❣️", - "💔", - "❤️", - "🧡", - "💛", - "💚", - "💙", - "💜", - "🤎", - "🖤", - "🤍", - "💯", - "💢", - "💥", - "💫", - "💦", - "💨", - "🕳️", - "💣", - "💬", - "👁️‍🗨️", - "🗨️", - "🗯️", - "💭", - "💤", - "👋", - "🤚", - "🖐️", - "✋", - "🖖", - "👌", - "🤌", - "🤏", - "✌️", - "🤞", - "🤟", - "🤘", - "🤙", - "👈", - "👉", - "👆", - "🖕", - "👇", - "☝️", - "👍", - "👎", - "✊", - "👊", - "🤛", - "🤜", - "👏", - "🙌", - "👐", - "🤲", - "🤝", - "🙏", - "✍️", - "💅", - "🤳", - "💪", - "🦾", - "🦿", - "🦵", - "🦶", - "👂", - "🦻", - "👃", - "🧠", - "🫀", - "🫁", - "🦷", - "🦴", - "👀", - "👁️", - "👅", - "👄", - "👶", - "🧒", - "👦", - "👧", - "🧑", - "👱", - "👨", - "🧔", - "👨‍🦰", - "👨‍🦱", - "👨‍🦳", - "👨‍🦲", - "👩", - "👩‍🦰", - "🧑‍🦰", - "👩‍🦱", - "🧑‍🦱", - "👩‍🦳", - "🧑‍🦳", - "👩‍🦲", - "🧑‍🦲", - "👱‍♀️", - "👱‍♂️", - "🧓", - "👴", - "👵", - "🙍", - "🙍‍♂️", - "🙍‍♀️", - "🙎", - "🙎‍♂️", - "🙎‍♀️", - "🙅", - "🙅‍♂️", - "🙅‍♀️", - "🙆", - "🙆‍♂️", - "🙆‍♀️", - "💁", - "💁‍♂️", - "💁‍♀️", - "🙋", - "🙋‍♂️", - "🙋‍♀️", - "🧏", - "🧏‍♂️", - "🧏‍♀️", - "🙇", - "🙇‍♂️", - "🙇‍♀️", - "🤦", - "🤦‍♂️", - "🤦‍♀️", - "🤷", - "🤷‍♂️", - "🤷‍♀️", - "🧑‍⚕️", - "👨‍⚕️", - "👩‍⚕️", - "🧑‍🎓", - "👨‍🎓", - "👩‍🎓", - "🧑‍🏫", - "👨‍🏫", - "👩‍🏫", - "🧑‍⚖️", - "👨‍⚖️", - "👩‍⚖️", - "🧑‍🌾", - "👨‍🌾", - "👩‍🌾", - "🧑‍🍳", - "👨‍🍳", - "👩‍🍳", - "🧑‍🔧", - "👨‍🔧", - "👩‍🔧", - "🧑‍🏭", - "👨‍🏭", - "👩‍🏭", - "🧑‍💼", - "👨‍💼", - "👩‍💼", - "🧑‍🔬", - "👨‍🔬", - "👩‍🔬", - "🧑‍💻", - "👨‍💻", - "👩‍💻", - "🧑‍🎤", - "👨‍🎤", - "👩‍🎤", - "🧑‍🎨", - "👨‍🎨", - "👩‍🎨", - "🧑‍✈️", - "👨‍✈️", - "👩‍✈️", - "🧑‍🚀", - "👨‍🚀", - "👩‍🚀", - "🧑‍🚒", - "👨‍🚒", - "👩‍🚒", - "👮", - "👮‍♂️", - "👮‍♀️", - "🕵️", - "🕵️‍♂️", - "🕵️‍♀️", - "💂", - "💂‍♂️", - "💂‍♀️", - "🥷", - "👷", - "👷‍♂️", - "👷‍♀️", - "🤴", - "👸", - "👳", - "👳‍♂️", - "👳‍♀️", - "👲", - "🧕", - "🤵", - "🤵‍♂️", - "🤵‍♀️", - "👰", - "👰‍♂️", - "👰‍♀️", - "🤰", - "🤱", - "👩‍🍼", - "👨‍🍼", - "🧑‍🍼", - "👼", - "🎅", - "🤶", - "🧑‍🎄", - "🦸", - "🦸‍♂️", - "🦸‍♀️", - "🦹", - "🦹‍♂️", - "🦹‍♀️", - "🧙", - "🧙‍♂️", - "🧙‍♀️", - "🧚", - "🧚‍♂️", - "🧚‍♀️", - "🧛", - "🧛‍♂️", - "🧛‍♀️", - "🧜", - "🧜‍♂️", - "🧜‍♀️", - "🧝", - "🧝‍♂️", - "🧝‍♀️", - "🧞", - "🧞‍♂️", - "🧞‍♀️", - "🧟", - "🧟‍♂️", - "🧟‍♀️", - "💆", - "💆‍♂️", - "💆‍♀️", - "💇", - "💇‍♂️", - "💇‍♀️", - "🚶", - "🚶‍♂️", - "🚶‍♀️", - "🧍", - "🧍‍♂️", - "🧍‍♀️", - "🧎", - "🧎‍♂️", - "🧎‍♀️", - "🧑‍🦯", - "👨‍🦯", - "👩‍🦯", - "🧑‍🦼", - "👨‍🦼", - "👩‍🦼", - "🧑‍🦽", - "👨‍🦽", - "👩‍🦽", - "🏃", - "🏃‍♂️", - "🏃‍♀️", - "💃", - "🕺", - "🕴️", - "👯", - "👯‍♂️", - "👯‍♀️", - "🧖", - "🧖‍♂️", - "🧖‍♀️", - "🧗", - "🧗‍♂️", - "🧗‍♀️", - "🤺", - "🏇", - "⛷️", - "🏂", - "🏌️", - "🏌️‍♂️", - "🏌️‍♀️", - "🏄", - "🏄‍♂️", - "🏄‍♀️", - "🚣", - "🚣‍♂️", - "🚣‍♀️", - "🏊", - "🏊‍♂️", - "🏊‍♀️", - "⛹️", - "⛹️‍♂️", - "⛹️‍♀️", - "🏋️", - "🏋️‍♂️", - "🏋️‍♀️", - "🚴", - "🚴‍♂️", - "🚴‍♀️", - "🚵", - "🚵‍♂️", - "🚵‍♀️", - "🤸", - "🤸‍♂️", - "🤸‍♀️", - "🤼", - "🤼‍♂️", - "🤼‍♀️", - "🤽", - "🤽‍♂️", - "🤽‍♀️", - "🤾", - "🤾‍♂️", - "🤾‍♀️", - "🤹", - "🤹‍♂️", - "🤹‍♀️", - "🧘", - "🧘‍♂️", - "🧘‍♀️", - "🛀", - "🛌", - "🧑‍🤝‍🧑", - "👭", - "👫", - "👬", - "💏", - "👩‍❤️‍💋‍👨", - "👨‍❤️‍💋‍👨", - "👩‍❤️‍💋‍👩", - "💑", - "👩‍❤️‍👨", - "👨‍❤️‍👨", - "👩‍❤️‍👩", - "👪", - "👨‍👩‍👦", - "👨‍👩‍👧", - "👨‍👩‍👧‍👦", - "👨‍👩‍👦‍👦", - "👨‍👩‍👧‍👧", - "👨‍👨‍👦", - "👨‍👨‍👧", - "👨‍👨‍👧‍👦", - "👨‍👨‍👦‍👦", - "👨‍👨‍👧‍👧", - "👩‍👩‍👦", - "👩‍👩‍👧", - "👩‍👩‍👧‍👦", - "👩‍👩‍👦‍👦", - "👩‍👩‍👧‍👧", - "👨‍👦", - "👨‍👦‍👦", - "👨‍👧", - "👨‍👧‍👦", - "👨‍👧‍👧", - "👩‍👦", - "👩‍👦‍👦", - "👩‍👧", - "👩‍👧‍👦", - "👩‍👧‍👧", - "🗣️", - "👤", - "👥", - "🫂", - "👣", - "🐵", - "🐒", - "🦍", - "🦧", - "🐶", - "🐕", - "🦮", - "🐕‍🦺", - "🐩", - "🐺", - "🦊", - "🦝", - "🐱", - "🐈", - "🐈‍⬛", - "🦁", - "🐯", - "🐅", - "🐆", - "🐴", - "🐎", - "🦄", - "🦓", - "🦌", - "🦬", - "🐮", - "🐂", - "🐃", - "🐄", - "🐷", - "🐖", - "🐗", - "🐽", - "🐏", - "🐑", - "🐐", - "🐪", - "🐫", - "🦙", - "🦒", - "🐘", - "🦣", - "🦏", - "🦛", - "🐭", - "🐁", - "🐀", - "🐹", - "🐰", - "🐇", - "🐿️", - "🦫", - "🦔", - "🦇", - "🐻", - "🐻‍❄️", - "🐨", - "🐼", - "🦥", - "🦦", - "🦨", - "🦘", - "🦡", - "🐾", - "🦃", - "🐔", - "🐓", - "🐣", - "🐤", - "🐥", - "🐦", - "🐧", - "🕊️", - "🦅", - "🦆", - "🦢", - "🦉", - "🦤", - "🪶", - "🦩", - "🦚", - "🦜", - "🐸", - "🐊", - "🐢", - "🦎", - "🐍", - "🐲", - "🐉", - "🦕", - "🦖", - "🐳", - "🐋", - "🐬", - "🦭", - "🐟", - "🐠", - "🐡", - "🦈", - "🐙", - "🐚", - "🐌", - "🦋", - "🐛", - "🐜", - "🐝", - "🪲", - "🐞", - "🦗", - "🪳", - "🕷️", - "🕸️", - "🦂", - "🦟", - "🪰", - "🪱", - "🦠", - "💐", - "🌸", - "💮", - "🏵️", - "🌹", - "🥀", - "🌺", - "🌻", - "🌼", - "🌷", - "🌱", - "🪴", - "🌲", - "🌳", - "🌴", - "🌵", - "🌾", - "🌿", - "☘️", - "🍀", - "🍁", - "🍂", - "🍃", - "🍇", - "🍈", - "🍉", - "🍊", - "🍋", - "🍌", - "🍍", - "🥭", - "🍎", - "🍏", - "🍐", - "🍑", - "🍒", - "🍓", - "🫐", - "🥝", - "🍅", - "🫒", - "🥥", - "🥑", - "🍆", - "🥔", - "🥕", - "🌽", - "🌶️", - "🫑", - "🥒", - "🥬", - "🥦", - "🧄", - "🧅", - "🍄", - "🥜", - "🌰", - "🍞", - "🥐", - "🥖", - "🫓", - "🥨", - "🥯", - "🥞", - "🧇", - "🧀", - "🍖", - "🍗", - "🥩", - "🥓", - "🍔", - "🍟", - "🍕", - "🌭", - "🥪", - "🌮", - "🌯", - "🫔", - "🥙", - "🧆", - "🥚", - "🍳", - "🥘", - "🍲", - "🫕", - "🥣", - "🥗", - "🍿", - "🧈", - "🧂", - "🥫", - "🍱", - "🍘", - "🍙", - "🍚", - "🍛", - "🍜", - "🍝", - "🍠", - "🍢", - "🍣", - "🍤", - "🍥", - "🥮", - "🍡", - "🥟", - "🥠", - "🥡", - "🦀", - "🦞", - "🦐", - "🦑", - "🦪", - "🍦", - "🍧", - "🍨", - "🍩", - "🍪", - "🎂", - "🍰", - "🧁", - "🥧", - "🍫", - "🍬", - "🍭", - "🍮", - "🍯", - "🍼", - "🥛", - "☕", - "🫖", - "🍵", - "🍶", - "🍾", - "🍷", - "🍸", - "🍹", - "🍺", - "🍻", - "🥂", - "🥃", - "🥤", - "🧋", - "🧃", - "🧉", - "🧊", - "🥢", - "🍽️", - "🍴", - "🥄", - "🔪", - "🏺", - "🌍", - "🌎", - "🌏", - "🌐", - "🗺️", - "🗾", - "🧭", - "🏔️", - "⛰️", - "🌋", - "🗻", - "🏕️", - "🏖️", - "🏜️", - "🏝️", - "🏞️", - "🏟️", - "🏛️", - "🏗️", - "🧱", - "🪨", - "🪵", - "🛖", - "🏘️", - "🏚️", - "🏠", - "🏡", - "🏢", - "🏣", - "🏤", - "🏥", - "🏦", - "🏨", - "🏩", - "🏪", - "🏫", - "🏬", - "🏭", - "🏯", - "🏰", - "💒", - "🗼", - "🗽", - "⛪", - "🕌", - "🛕", - "🕍", - "⛩️", - "🕋", - "⛲", - "⛺", - "🌁", - "🌃", - "🏙️", - "🌄", - "🌅", - "🌆", - "🌇", - "🌉", - "♨️", - "🎠", - "🎡", - "🎢", - "💈", - "🎪", - "🚂", - "🚃", - "🚄", - "🚅", - "🚆", - "🚇", - "🚈", - "🚉", - "🚊", - "🚝", - "🚞", - "🚋", - "🚌", - "🚍", - "🚎", - "🚐", - "🚑", - "🚒", - "🚓", - "🚔", - "🚕", - "🚖", - "🚗", - "🚘", - "🚙", - "🛻", - "🚚", - "🚛", - "🚜", - "🏎️", - "🏍️", - "🛵", - "🦽", - "🦼", - "🛺", - "🚲", - "🛴", - "🛹", - "🛼", - "🚏", - "🛣️", - "🛤️", - "🛢️", - "⛽", - "🚨", - "🚥", - "🚦", - "🛑", - "🚧", - "⚓", - "⛵", - "🛶", - "🚤", - "🛳️", - "⛴️", - "🛥️", - "🚢", - "✈️", - "🛩️", - "🛫", - "🛬", - "🪂", - "💺", - "🚁", - "🚟", - "🚠", - "🚡", - "🛰️", - "🚀", - "🛸", - "🛎️", - "🧳", - "⌛", - "⏳", - "⌚", - "⏰", - "⏱️", - "⏲️", - "🕰️", - "🕛", - "🕧", - "🕐", - "🕜", - "🕑", - "🕝", - "🕒", - "🕞", - "🕓", - "🕟", - "🕔", - "🕠", - "🕕", - "🕡", - "🕖", - "🕢", - "🕗", - "🕣", - "🕘", - "🕤", - "🕙", - "🕥", - "🕚", - "🕦", - "🌑", - "🌒", - "🌓", - "🌔", - "🌕", - "🌖", - "🌗", - "🌘", - "🌙", - "🌚", - "🌛", - "🌜", - "🌡️", - "☀️", - "🌝", - "🌞", - "🪐", - "⭐", - "🌟", - "🌠", - "🌌", - "☁️", - "⛅", - "⛈️", - "🌤️", - "🌥️", - "🌦️", - "🌧️", - "🌨️", - "🌩️", - "🌪️", - "🌫️", - "🌬️", - "🌀", - "🌈", - "🌂", - "☂️", - "☔", - "⛱️", - "⚡", - "❄️", - "☃️", - "⛄", - "☄️", - "🔥", - "💧", - "🌊", - "🎃", - "🎄", - "🎆", - "🎇", - "🧨", - "✨", - "🎈", - "🎉", - "🎊", - "🎋", - "🎍", - "🎎", - "🎏", - "🎐", - "🎑", - "🧧", - "🎀", - "🎁", - "🎗️", - "🎟️", - "🎫", - "🎖️", - "🏆", - "🏅", - "🥇", - "🥈", - "🥉", - "⚽", - "⚾", - "🥎", - "🏀", - "🏐", - "🏈", - "🏉", - "🎾", - "🥏", - "🎳", - "🏏", - "🏑", - "🏒", - "🥍", - "🏓", - "🏸", - "🥊", - "🥋", - "🥅", - "⛳", - "⛸️", - "🎣", - "🤿", - "🎽", - "🎿", - "🛷", - "🥌", - "🎯", - "🪀", - "🪁", - "🎱", - "🔮", - "🪄", - "🧿", - "🎮", - "🕹️", - "🎰", - "🎲", - "🧩", - "🧸", - "🪅", - "🪆", - "♠️", - "♥️", - "♦️", - "♣️", - "♟️", - "🃏", - "🀄", - "🎴", - "🎭", - "🖼️", - "🎨", - "🧵", - "🪡", - "🧶", - "🪢", - "👓", - "🕶️", - "🥽", - "🥼", - "🦺", - "👔", - "👕", - "👖", - "🧣", - "🧤", - "🧥", - "🧦", - "👗", - "👘", - "🥻", - "🩱", - "🩲", - "🩳", - "👙", - "👚", - "👛", - "👜", - "👝", - "🛍️", - "🎒", - "🩴", - "👞", - "👟", - "🥾", - "🥿", - "👠", - "👡", - "🩰", - "👢", - "👑", - "👒", - "🎩", - "🎓", - "🧢", - "🪖", - "⛑️", - "📿", - "💄", - "💍", - "💎", - "🔇", - "🔈", - "🔉", - "🔊", - "📢", - "📣", - "📯", - "🔔", - "🔕", - "🎼", - "🎵", - "🎶", - "🎙️", - "🎚️", - "🎛️", - "🎤", - "🎧", - "📻", - "🎷", - "🪗", - "🎸", - "🎹", - "🎺", - "🎻", - "🪕", - "🥁", - "🪘", - "📱", - "📲", - "☎️", - "📞", - "📟", - "📠", - "🔋", - "🔌", - "💻", - "🖥️", - "🖨️", - "⌨️", - "🖱️", - "🖲️", - "💽", - "💾", - "💿", - "📀", - "🧮", - "🎥", - "🎞️", - "📽️", - "🎬", - "📺", - "📷", - "📸", - "📹", - "📼", - "🔍", - "🔎", - "🕯️", - "💡", - "🔦", - "🏮", - "🪔", - "📔", - "📕", - "📖", - "📗", - "📘", - "📙", - "📚", - "📓", - "📒", - "📃", - "📜", - "📄", - "📰", - "🗞️", - "📑", - "🔖", - "🏷️", - "💰", - "🪙", - "💴", - "💵", - "💶", - "💷", - "💸", - "💳", - "🧾", - "💹", - "✉️", - "📧", - "📨", - "📩", - "📤", - "📥", - "📦", - "📫", - "📪", - "📬", - "📭", - "📮", - "🗳️", - "✏️", - "✒️", - "🖋️", - "🖊️", - "🖌️", - "🖍️", - "📝", - "💼", - "📁", - "📂", - "🗂️", - "📅", - "📆", - "🗒️", - "🗓️", - "📇", - "📈", - "📉", - "📊", - "📋", - "📌", - "📍", - "📎", - "🖇️", - "📏", - "📐", - "✂️", - "🗃️", - "🗄️", - "🗑️", - "🔒", - "🔓", - "🔏", - "🔐", - "🔑", - "🗝️", - "🔨", - "🪓", - "⛏️", - "⚒️", - "🛠️", - "🗡️", - "⚔️", - "🔫", - "🪃", - "🏹", - "🛡️", - "🪚", - "🔧", - "🪛", - "🔩", - "⚙️", - "🗜️", - "⚖️", - "🦯", - "🔗", - "⛓️", - "🪝", - "🧰", - "🧲", - "🪜", - "⚗️", - "🧪", - "🧫", - "🧬", - "🔬", - "🔭", - "📡", - "💉", - "🩸", - "💊", - "🩹", - "🩺", - "🚪", - "🛗", - "🪞", - "🪟", - "🛏️", - "🛋️", - "🪑", - "🚽", - "🪠", - "🚿", - "🛁", - "🪤", - "🪒", - "🧴", - "🧷", - "🧹", - "🧺", - "🧻", - "🪣", - "🧼", - "🪥", - "🧽", - "🧯", - "🛒", - "🚬", - "⚰️", - "🪦", - "⚱️", - "🗿", - "🪧", - "🏧", - "🚮", - "🚰", - "♿", - "🚹", - "🚺", - "🚻", - "🚼", - "🚾", - "🛂", - "🛃", - "🛄", - "🛅", - "⚠️", - "🚸", - "⛔", - "🚫", - "🚳", - "🚭", - "🚯", - "🚱", - "🚷", - "📵", - "🔞", - "☢️", - "☣️", - "⬆️", - "↗️", - "➡️", - "↘️", - "⬇️", - "↙️", - "⬅️", - "↖️", - "↕️", - "↔️", - "↩️", - "↪️", - "⤴️", - "⤵️", - "🔃", - "🔄", - "🔙", - "🔚", - "🔛", - "🔜", - "🔝", - "🛐", - "⚛️", - "🕉️", - "✡️", - "☸️", - "☯️", - "✝️", - "☦️", - "☪️", - "☮️", - "🕎", - "🔯", - "♈", - "♉", - "♊", - "♋", - "♌", - "♍", - "♎", - "♏", - "♐", - "♑", - "♒", - "♓", - "⛎", - "🔀", - "🔁", - "🔂", - "▶️", - "⏩", - "⏭️", - "⏯️", - "◀️", - "⏪", - "⏮️", - "🔼", - "⏫", - "🔽", - "⏬", - "⏸️", - "⏹️", - "⏺️", - "⏏️", - "🎦", - "🔅", - "🔆", - "📶", - "📳", - "📴", - "♀️", - "♂️", - "⚧️", - "✖️", - "➕", - "➖", - "➗", - "♾️", - "‼️", - "⁉️", - "❓", - "❔", - "❕", - "❗", - "〰️", - "💱", - "💲", - "⚕️", - "♻️", - "⚜️", - "🔱", - "📛", - "🔰", - "⭕", - "✅", - "☑️", - "✔️", - "❌", - "❎", - "➰", - "➿", - "〽️", - "✳️", - "✴️", - "❇️", - "©️", - "®️", - "™️", - "#️⃣", - "*️⃣", - "0️⃣", - "1️⃣", - "2️⃣", - "3️⃣", - "4️⃣", - "5️⃣", - "6️⃣", - "7️⃣", - "8️⃣", - "9️⃣", - "🔟", - "🔠", - "🔡", - "🔢", - "🔣", - "🔤", - "🅰️", - "🆎", - "🅱️", - "🆑", - "🆒", - "🆓", - "ℹ️", - "🆔", - "Ⓜ️", - "🆕", - "🆖", - "🅾️", - "🆗", - "🅿️", - "🆘", - "🆙", - "🆚", - "🈁", - "🈂️", - "🈷️", - "🈶", - "🈯", - "🉐", - "🈹", - "🈚", - "🈲", - "🉑", - "🈸", - "🈴", - "🈳", - "㊗️", - "㊙️", - "🈺", - "🈵", - "🔴", - "🟠", - "🟡", - "🟢", - "🔵", - "🟣", - "🟤", - "⚫", - "⚪", - "🟥", - "🟧", - "🟨", - "🟩", - "🟦", - "🟪", - "🟫", - "⬛", - "⬜", - "◼️", - "◻️", - "◾", - "◽", - "▪️", - "▫️", - "🔶", - "🔷", - "🔸", - "🔹", - "🔺", - "🔻", - "💠", - "🔘", - "🔳", - "🔲", - "🏁", - "🚩", - "🎌", - "🏴", - "🏳️", - "🏳️‍🌈", - "🏳️‍⚧️", - "🏴‍☠️", - "🇦🇨", - "🇦🇩", - "🇦🇪", - "🇦🇫", - "🇦🇬", - "🇦🇮", - "🇦🇱", - "🇦🇲", - "🇦🇴", - "🇦🇶", - "🇦🇷", - "🇦🇸", - "🇦🇹", - "🇦🇺", - "🇦🇼", - "🇦🇽", - "🇦🇿", - "🇧🇦", - "🇧🇧", - "🇧🇩", - "🇧🇪", - "🇧🇫", - "🇧🇬", - "🇧🇭", - "🇧🇮", - "🇧🇯", - "🇧🇱", - "🇧🇲", - "🇧🇳", - "🇧🇴", - "🇧🇶", - "🇧🇷", - "🇧🇸", - "🇧🇹", - "🇧🇻", - "🇧🇼", - "🇧🇾", - "🇧🇿", - "🇨🇦", - "🇨🇨", - "🇨🇩", - "🇨🇫", - "🇨🇬", - "🇨🇭", - "🇨🇮", - "🇨🇰", - "🇨🇱", - "🇨🇲", - "🇨🇳", - "🇨🇴", - "🇨🇵", - "🇨🇷", - "🇨🇺", - "🇨🇻", - "🇨🇼", - "🇨🇽", - "🇨🇾", - "🇨🇿", - "🇩🇪", - "🇩🇬", - "🇩🇯", - "🇩🇰", - "🇩🇲", - "🇩🇴", - "🇩🇿", - "🇪🇦", - "🇪🇨", - "🇪🇪", - "🇪🇬", - "🇪🇭", - "🇪🇷", - "🇪🇸", - "🇪🇹", - "🇪🇺", - "🇫🇮", - "🇫🇯", - "🇫🇰", - "🇫🇲", - "🇫🇴", - "🇫🇷", - "🇬🇦", - "🇬🇧", - "🇬🇩", - "🇬🇪", - "🇬🇫", - "🇬🇬", - "🇬🇭", - "🇬🇮", - "🇬🇱", - "🇬🇲", - "🇬🇳", - "🇬🇵", - "🇬🇶", - "🇬🇷", - "🇬🇸", - "🇬🇹", - "🇬🇺", - "🇬🇼", - "🇬🇾", - "🇭🇰", - "🇭🇲", - "🇭🇳", - "🇭🇷", - "🇭🇹", - "🇭🇺", - "🇮🇨", - "🇮🇩", - "🇮🇪", - "🇮🇱", - "🇮🇲", - "🇮🇳", - "🇮🇴", - "🇮🇶", - "🇮🇷", - "🇮🇸", - "🇮🇹", - "🇯🇪", - "🇯🇲", - "🇯🇴", - "🇯🇵", - "🇰🇪", - "🇰🇬", - "🇰🇭", - "🇰🇮", - "🇰🇲", - "🇰🇳", - "🇰🇵", - "🇰🇷", - "🇰🇼", - "🇰🇾", - "🇰🇿", - "🇱🇦", - "🇱🇧", - "🇱🇨", - "🇱🇮", - "🇱🇰", - "🇱🇷", - "🇱🇸", - "🇱🇹", - "🇱🇺", - "🇱🇻", - "🇱🇾", - "🇲🇦", - "🇲🇨", - "🇲🇩", - "🇲🇪", - "🇲🇫", - "🇲🇬", - "🇲🇭", - "🇲🇰", - "🇲🇱", - "🇲🇲", - "🇲🇳", - "🇲🇴", - "🇲🇵", - "🇲🇶", - "🇲🇷", - "🇲🇸", - "🇲🇹", - "🇲🇺", - "🇲🇻", - "🇲🇼", - "🇲🇽", - "🇲🇾", - "🇲🇿", - "🇳🇦", - "🇳🇨", - "🇳🇪", - "🇳🇫", - "🇳🇬", - "🇳🇮", - "🇳🇱", - "🇳🇴", - "🇳🇵", - "🇳🇷", - "🇳🇺", - "🇳🇿", - "🇴🇲", - "🇵🇦", - "🇵🇪", - "🇵🇫", - "🇵🇬", - "🇵🇭", - "🇵🇰", - "🇵🇱", - "🇵🇲", - "🇵🇳", - "🇵🇷", - "🇵🇸", - "🇵🇹", - "🇵🇼", - "🇵🇾", - "🇶🇦", - "🇷🇪", - "🇷🇴", - "🇷🇸", - "🇷🇺", - "🇷🇼", - "🇸🇦", - "🇸🇧", - "🇸🇨", - "🇸🇩", - "🇸🇪", - "🇸🇬", - "🇸🇭", - "🇸🇮", - "🇸🇯", - "🇸🇰", - "🇸🇱", - "🇸🇲", - "🇸🇳", - "🇸🇴", - "🇸🇷", - "🇸🇸", - "🇸🇹", - "🇸🇻", - "🇸🇽", - "🇸🇾", - "🇸🇿", - "🇹🇦", - "🇹🇨", - "🇹🇩", - "🇹🇫", - "🇹🇬", - "🇹🇭", - "🇹🇯", - "🇹🇰", - "🇹🇱", - "🇹🇲", - "🇹🇳", - "🇹🇴", - "🇹🇷", - "🇹🇹", - "🇹🇻", - "🇹🇼", - "🇹🇿", - "🇺🇦", - "🇺🇬", - "🇺🇲", - "🇺🇳", - "🇺🇸", - "🇺🇾", - "🇺🇿", - "🇻🇦", - "🇻🇨", - "🇻🇪", - "🇻🇬", - "🇻🇮", - "🇻🇳", - "🇻🇺", - "🇼🇫", - "🇼🇸", - "🇽🇰", - "🇾🇪", - "🇾🇹", - "🇿🇦", - "🇿🇲", - "🇿🇼", - "🏴󠁧󠁢󠁥󠁮󠁧󠁿", - "🏴󠁧󠁢󠁳󠁣󠁴󠁿", - "🏴󠁧󠁢󠁷󠁬󠁳󠁿" -]; - -var emojiNames = { - "😀": { - name: "grinning face", - slug: "grinning_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😃": { - name: "grinning face with big eyes", - slug: "grinning_face_with_big_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😄": { - name: "grinning face with smiling eyes", - slug: "grinning_face_with_smiling_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😁": { - name: "beaming face with smiling eyes", - slug: "beaming_face_with_smiling_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😆": { - name: "grinning squinting face", - slug: "grinning_squinting_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😅": { - name: "grinning face with sweat", - slug: "grinning_face_with_sweat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤣": { - name: "rolling on the floor laughing", - slug: "rolling_on_the_floor_laughing", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "😂": { - name: "face with tears of joy", - slug: "face_with_tears_of_joy", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙂": { - name: "slightly smiling face", - slug: "slightly_smiling_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🙃": { - name: "upside-down face", - slug: "upside_down_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😉": { - name: "winking face", - slug: "winking_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😊": { - name: "smiling face with smiling eyes", - slug: "smiling_face_with_smiling_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😇": { - name: "smiling face with halo", - slug: "smiling_face_with_halo", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥰": { - name: "smiling face with hearts", - slug: "smiling_face_with_hearts", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "😍": { - name: "smiling face with heart-eyes", - slug: "smiling_face_with_heart_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤩": { - name: "star-struck", - slug: "star_struck", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "😘": { - name: "face blowing a kiss", - slug: "face_blowing_a_kiss", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😗": { - name: "kissing face", - slug: "kissing_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "☺️": { - name: "smiling face", - slug: "smiling_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😚": { - name: "kissing face with closed eyes", - slug: "kissing_face_with_closed_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😙": { - name: "kissing face with smiling eyes", - slug: "kissing_face_with_smiling_eyes", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥲": { - name: "smiling face with tear", - slug: "smiling_face_with_tear", - group: "Smileys & Emotion", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "😋": { - name: "face savoring food", - slug: "face_savoring_food", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😛": { - name: "face with tongue", - slug: "face_with_tongue", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😜": { - name: "winking face with tongue", - slug: "winking_face_with_tongue", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤪": { - name: "zany face", - slug: "zany_face", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "😝": { - name: "squinting face with tongue", - slug: "squinting_face_with_tongue", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤑": { - name: "money-mouth face", - slug: "money_mouth_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤗": { - name: "hugging face", - slug: "hugging_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤭": { - name: "face with hand over mouth", - slug: "face_with_hand_over_mouth", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🤫": { - name: "shushing face", - slug: "shushing_face", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🤔": { - name: "thinking face", - slug: "thinking_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤐": { - name: "zipper-mouth face", - slug: "zipper_mouth_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤨": { - name: "face with raised eyebrow", - slug: "face_with_raised_eyebrow", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "😐": { - name: "neutral face", - slug: "neutral_face", - group: "Smileys & Emotion", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "😑": { - name: "expressionless face", - slug: "expressionless_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😶": { - name: "face without mouth", - slug: "face_without_mouth", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😏": { - name: "smirking face", - slug: "smirking_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😒": { - name: "unamused face", - slug: "unamused_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙄": { - name: "face with rolling eyes", - slug: "face_with_rolling_eyes", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😬": { - name: "grimacing face", - slug: "grimacing_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤥": { - name: "lying face", - slug: "lying_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "😌": { - name: "relieved face", - slug: "relieved_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😔": { - name: "pensive face", - slug: "pensive_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😪": { - name: "sleepy face", - slug: "sleepy_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤤": { - name: "drooling face", - slug: "drooling_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "😴": { - name: "sleeping face", - slug: "sleeping_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😷": { - name: "face with medical mask", - slug: "face_with_medical_mask", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤒": { - name: "face with thermometer", - slug: "face_with_thermometer", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤕": { - name: "face with head-bandage", - slug: "face_with_head_bandage", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤢": { - name: "nauseated face", - slug: "nauseated_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🤮": { - name: "face vomiting", - slug: "face_vomiting", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🤧": { - name: "sneezing face", - slug: "sneezing_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥵": { - name: "hot face", - slug: "hot_face", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥶": { - name: "cold face", - slug: "cold_face", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥴": { - name: "woozy face", - slug: "woozy_face", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "😵": { - name: "knocked-out face", - slug: "knocked_out_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤯": { - name: "exploding head", - slug: "exploding_head", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🤠": { - name: "cowboy hat face", - slug: "cowboy_hat_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥳": { - name: "partying face", - slug: "partying_face", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥸": { - name: "disguised face", - slug: "disguised_face", - group: "Smileys & Emotion", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "😎": { - name: "smiling face with sunglasses", - slug: "smiling_face_with_sunglasses", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🤓": { - name: "nerd face", - slug: "nerd_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🧐": { - name: "face with monocle", - slug: "face_with_monocle", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "😕": { - name: "confused face", - slug: "confused_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😟": { - name: "worried face", - slug: "worried_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🙁": { - name: "slightly frowning face", - slug: "slightly_frowning_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "☹️": { - name: "frowning face", - slug: "frowning_face", - group: "Smileys & Emotion", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "😮": { - name: "face with open mouth", - slug: "face_with_open_mouth", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😯": { - name: "hushed face", - slug: "hushed_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😲": { - name: "astonished face", - slug: "astonished_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😳": { - name: "flushed face", - slug: "flushed_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥺": { - name: "pleading face", - slug: "pleading_face", - group: "Smileys & Emotion", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "😦": { - name: "frowning face with open mouth", - slug: "frowning_face_with_open_mouth", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😧": { - name: "anguished face", - slug: "anguished_face", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😨": { - name: "fearful face", - slug: "fearful_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😰": { - name: "anxious face with sweat", - slug: "anxious_face_with_sweat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😥": { - name: "sad but relieved face", - slug: "sad_but_relieved_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😢": { - name: "crying face", - slug: "crying_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😭": { - name: "loudly crying face", - slug: "loudly_crying_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😱": { - name: "face screaming in fear", - slug: "face_screaming_in_fear", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😖": { - name: "confounded face", - slug: "confounded_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😣": { - name: "persevering face", - slug: "persevering_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😞": { - name: "disappointed face", - slug: "disappointed_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😓": { - name: "downcast face with sweat", - slug: "downcast_face_with_sweat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😩": { - name: "weary face", - slug: "weary_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😫": { - name: "tired face", - slug: "tired_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥱": { - name: "yawning face", - slug: "yawning_face", - group: "Smileys & Emotion", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "😤": { - name: "face with steam from nose", - slug: "face_with_steam_from_nose", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😡": { - name: "pouting face", - slug: "pouting_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😠": { - name: "angry face", - slug: "angry_face", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤬": { - name: "face with symbols on mouth", - slug: "face_with_symbols_on_mouth", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "😈": { - name: "smiling face with horns", - slug: "smiling_face_with_horns", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "👿": { - name: "angry face with horns", - slug: "angry_face_with_horns", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💀": { - name: "skull", - slug: "skull", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☠️": { - name: "skull and crossbones", - slug: "skull_and_crossbones", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💩": { - name: "pile of poo", - slug: "pile_of_poo", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤡": { - name: "clown face", - slug: "clown_face", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "👹": { - name: "ogre", - slug: "ogre", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👺": { - name: "goblin", - slug: "goblin", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👻": { - name: "ghost", - slug: "ghost", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👽": { - name: "alien", - slug: "alien", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👾": { - name: "alien monster", - slug: "alien_monster", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤖": { - name: "robot", - slug: "robot", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "😺": { - name: "grinning cat", - slug: "grinning_cat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😸": { - name: "grinning cat with smiling eyes", - slug: "grinning_cat_with_smiling_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😹": { - name: "cat with tears of joy", - slug: "cat_with_tears_of_joy", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😻": { - name: "smiling cat with heart-eyes", - slug: "smiling_cat_with_heart_eyes", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😼": { - name: "cat with wry smile", - slug: "cat_with_wry_smile", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😽": { - name: "kissing cat", - slug: "kissing_cat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙀": { - name: "weary cat", - slug: "weary_cat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😿": { - name: "crying cat", - slug: "crying_cat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "😾": { - name: "pouting cat", - slug: "pouting_cat", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙈": { - name: "see-no-evil monkey", - slug: "see_no_evil_monkey", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙉": { - name: "hear-no-evil monkey", - slug: "hear_no_evil_monkey", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🙊": { - name: "speak-no-evil monkey", - slug: "speak_no_evil_monkey", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💋": { - name: "kiss mark", - slug: "kiss_mark", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💌": { - name: "love letter", - slug: "love_letter", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💘": { - name: "heart with arrow", - slug: "heart_with_arrow", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💝": { - name: "heart with ribbon", - slug: "heart_with_ribbon", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💖": { - name: "sparkling heart", - slug: "sparkling_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💗": { - name: "growing heart", - slug: "growing_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💓": { - name: "beating heart", - slug: "beating_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💞": { - name: "revolving hearts", - slug: "revolving_hearts", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💕": { - name: "two hearts", - slug: "two_hearts", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💟": { - name: "heart decoration", - slug: "heart_decoration", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❣️": { - name: "heart exclamation", - slug: "heart_exclamation", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💔": { - name: "broken heart", - slug: "broken_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❤️": { - name: "red heart", - slug: "red_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧡": { - name: "orange heart", - slug: "orange_heart", - group: "Smileys & Emotion", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "💛": { - name: "yellow heart", - slug: "yellow_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💚": { - name: "green heart", - slug: "green_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💙": { - name: "blue heart", - slug: "blue_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💜": { - name: "purple heart", - slug: "purple_heart", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤎": { - name: "brown heart", - slug: "brown_heart", - group: "Smileys & Emotion", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🖤": { - name: "black heart", - slug: "black_heart", - group: "Smileys & Emotion", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🤍": { - name: "white heart", - slug: "white_heart", - group: "Smileys & Emotion", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "💯": { - name: "hundred points", - slug: "hundred_points", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💢": { - name: "anger symbol", - slug: "anger_symbol", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💥": { - name: "collision", - slug: "collision", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💫": { - name: "dizzy", - slug: "dizzy", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💦": { - name: "sweat droplets", - slug: "sweat_droplets", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💨": { - name: "dashing away", - slug: "dashing_away", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕳️": { - name: "hole", - slug: "hole", - group: "Smileys & Emotion", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "💣": { - name: "bomb", - slug: "bomb", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💬": { - name: "speech balloon", - slug: "speech_balloon", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👁️‍🗨️": { - name: "eye in speech bubble", - slug: "eye_in_speech_bubble", - group: "Smileys & Emotion", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🗨️": { - name: "left speech bubble", - slug: "left_speech_bubble", - group: "Smileys & Emotion", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🗯️": { - name: "right anger bubble", - slug: "right_anger_bubble", - group: "Smileys & Emotion", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "💭": { - name: "thought balloon", - slug: "thought_balloon", - group: "Smileys & Emotion", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💤": { - name: "zzz", - slug: "zzz", - group: "Smileys & Emotion", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👋": { - name: "waving hand", - slug: "waving_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤚": { - name: "raised back of hand", - slug: "raised_back_of_hand", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🖐️": { - name: "hand with fingers splayed", - slug: "hand_with_fingers_splayed", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "✋": { - name: "raised hand", - slug: "raised_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🖖": { - name: "vulcan salute", - slug: "vulcan_salute", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👌": { - name: "OK hand", - slug: "ok_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤌": { - name: "pinched fingers", - slug: "pinched_fingers", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "🤏": { - name: "pinching hand", - slug: "pinching_hand", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "✌️": { - name: "victory hand", - slug: "victory_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤞": { - name: "crossed fingers", - slug: "crossed_fingers", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤟": { - name: "love-you gesture", - slug: "love_you_gesture", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🤘": { - name: "sign of the horns", - slug: "sign_of_the_horns", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤙": { - name: "call me hand", - slug: "call_me_hand", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "👈": { - name: "backhand index pointing left", - slug: "backhand_index_pointing_left", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👉": { - name: "backhand index pointing right", - slug: "backhand_index_pointing_right", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👆": { - name: "backhand index pointing up", - slug: "backhand_index_pointing_up", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🖕": { - name: "middle finger", - slug: "middle_finger", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👇": { - name: "backhand index pointing down", - slug: "backhand_index_pointing_down", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "☝️": { - name: "index pointing up", - slug: "index_pointing_up", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👍": { - name: "thumbs up", - slug: "thumbs_up", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👎": { - name: "thumbs down", - slug: "thumbs_down", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "✊": { - name: "raised fist", - slug: "raised_fist", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👊": { - name: "oncoming fist", - slug: "oncoming_fist", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤛": { - name: "left-facing fist", - slug: "left_facing_fist", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤜": { - name: "right-facing fist", - slug: "right_facing_fist", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "👏": { - name: "clapping hands", - slug: "clapping_hands", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙌": { - name: "raising hands", - slug: "raising_hands", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👐": { - name: "open hands", - slug: "open_hands", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤲": { - name: "palms up together", - slug: "palms_up_together", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🤝": { - name: "handshake", - slug: "handshake", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🙏": { - name: "folded hands", - slug: "folded_hands", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "✍️": { - name: "writing hand", - slug: "writing_hand", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "💅": { - name: "nail polish", - slug: "nail_polish", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤳": { - name: "selfie", - slug: "selfie", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "💪": { - name: "flexed biceps", - slug: "flexed_biceps", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🦾": { - name: "mechanical arm", - slug: "mechanical_arm", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦿": { - name: "mechanical leg", - slug: "mechanical_leg", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦵": { - name: "leg", - slug: "leg", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦶": { - name: "foot", - slug: "foot", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "👂": { - name: "ear", - slug: "ear", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🦻": { - name: "ear with hearing aid", - slug: "ear_with_hearing_aid", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👃": { - name: "nose", - slug: "nose", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🧠": { - name: "brain", - slug: "brain", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🫀": { - name: "anatomical heart", - slug: "anatomical_heart", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🫁": { - name: "lungs", - slug: "lungs", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦷": { - name: "tooth", - slug: "tooth", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦴": { - name: "bone", - slug: "bone", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "👀": { - name: "eyes", - slug: "eyes", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👁️": { - name: "eye", - slug: "eye", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "👅": { - name: "tongue", - slug: "tongue", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👄": { - name: "mouth", - slug: "mouth", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👶": { - name: "baby", - slug: "baby", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🧒": { - name: "child", - slug: "child", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "👦": { - name: "boy", - slug: "boy", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👧": { - name: "girl", - slug: "girl", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🧑": { - name: "person", - slug: "person", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "👱": { - name: "person blond hair", - slug: "person_blond_hair", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👨": { - name: "man", - slug: "man", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🧔": { - name: "person beard", - slug: "person_beard", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "👨‍🦰": { - name: "man red hair", - slug: "man_red_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "👨‍🦱": { - name: "man curly hair", - slug: "man_curly_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "👨‍🦳": { - name: "man white hair", - slug: "man_white_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "👨‍🦲": { - name: "man bald", - slug: "man_bald", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "👩": { - name: "woman", - slug: "woman", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👩‍🦰": { - name: "woman red hair", - slug: "woman_red_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🧑‍🦰": { - name: "person red hair", - slug: "person_red_hair", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👩‍🦱": { - name: "woman curly hair", - slug: "woman_curly_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🧑‍🦱": { - name: "person curly hair", - slug: "person_curly_hair", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👩‍🦳": { - name: "woman white hair", - slug: "woman_white_hair", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🧑‍🦳": { - name: "person white hair", - slug: "person_white_hair", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👩‍🦲": { - name: "woman bald", - slug: "woman_bald", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🧑‍🦲": { - name: "person bald", - slug: "person_bald", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👱‍♀️": { - name: "woman blond hair", - slug: "woman_blond_hair", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👱‍♂️": { - name: "man blond hair", - slug: "man_blond_hair", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧓": { - name: "older person", - slug: "older_person", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "👴": { - name: "old man", - slug: "old_man", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👵": { - name: "old woman", - slug: "old_woman", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙍": { - name: "person frowning", - slug: "person_frowning", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙍‍♂️": { - name: "man frowning", - slug: "man_frowning", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙍‍♀️": { - name: "woman frowning", - slug: "woman_frowning", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙎": { - name: "person pouting", - slug: "person_pouting", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙎‍♂️": { - name: "man pouting", - slug: "man_pouting", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙎‍♀️": { - name: "woman pouting", - slug: "woman_pouting", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙅": { - name: "person gesturing NO", - slug: "person_gesturing_no", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙅‍♂️": { - name: "man gesturing NO", - slug: "man_gesturing_no", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙅‍♀️": { - name: "woman gesturing NO", - slug: "woman_gesturing_no", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙆": { - name: "person gesturing OK", - slug: "person_gesturing_ok", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙆‍♂️": { - name: "man gesturing OK", - slug: "man_gesturing_ok", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙆‍♀️": { - name: "woman gesturing OK", - slug: "woman_gesturing_ok", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💁": { - name: "person tipping hand", - slug: "person_tipping_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "💁‍♂️": { - name: "man tipping hand", - slug: "man_tipping_hand", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💁‍♀️": { - name: "woman tipping hand", - slug: "woman_tipping_hand", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙋": { - name: "person raising hand", - slug: "person_raising_hand", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙋‍♂️": { - name: "man raising hand", - slug: "man_raising_hand", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙋‍♀️": { - name: "woman raising hand", - slug: "woman_raising_hand", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧏": { - name: "deaf person", - slug: "deaf_person", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧏‍♂️": { - name: "deaf man", - slug: "deaf_man", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧏‍♀️": { - name: "deaf woman", - slug: "deaf_woman", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🙇": { - name: "person bowing", - slug: "person_bowing", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🙇‍♂️": { - name: "man bowing", - slug: "man_bowing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🙇‍♀️": { - name: "woman bowing", - slug: "woman_bowing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤦": { - name: "person facepalming", - slug: "person_facepalming", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤦‍♂️": { - name: "man facepalming", - slug: "man_facepalming", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤦‍♀️": { - name: "woman facepalming", - slug: "woman_facepalming", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤷": { - name: "person shrugging", - slug: "person_shrugging", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤷‍♂️": { - name: "man shrugging", - slug: "man_shrugging", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤷‍♀️": { - name: "woman shrugging", - slug: "woman_shrugging", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍⚕️": { - name: "health worker", - slug: "health_worker", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍⚕️": { - name: "man health worker", - slug: "man_health_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍⚕️": { - name: "woman health worker", - slug: "woman_health_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🎓": { - name: "student", - slug: "student", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🎓": { - name: "man student", - slug: "man_student", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🎓": { - name: "woman student", - slug: "woman_student", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🏫": { - name: "teacher", - slug: "teacher", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🏫": { - name: "man teacher", - slug: "man_teacher", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🏫": { - name: "woman teacher", - slug: "woman_teacher", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍⚖️": { - name: "judge", - slug: "judge", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍⚖️": { - name: "man judge", - slug: "man_judge", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍⚖️": { - name: "woman judge", - slug: "woman_judge", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🌾": { - name: "farmer", - slug: "farmer", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🌾": { - name: "man farmer", - slug: "man_farmer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🌾": { - name: "woman farmer", - slug: "woman_farmer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🍳": { - name: "cook", - slug: "cook", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🍳": { - name: "man cook", - slug: "man_cook", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🍳": { - name: "woman cook", - slug: "woman_cook", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🔧": { - name: "mechanic", - slug: "mechanic", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🔧": { - name: "man mechanic", - slug: "man_mechanic", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🔧": { - name: "woman mechanic", - slug: "woman_mechanic", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🏭": { - name: "factory worker", - slug: "factory_worker", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🏭": { - name: "man factory worker", - slug: "man_factory_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🏭": { - name: "woman factory worker", - slug: "woman_factory_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍💼": { - name: "office worker", - slug: "office_worker", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍💼": { - name: "man office worker", - slug: "man_office_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍💼": { - name: "woman office worker", - slug: "woman_office_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🔬": { - name: "scientist", - slug: "scientist", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🔬": { - name: "man scientist", - slug: "man_scientist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🔬": { - name: "woman scientist", - slug: "woman_scientist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍💻": { - name: "technologist", - slug: "technologist", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍💻": { - name: "man technologist", - slug: "man_technologist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍💻": { - name: "woman technologist", - slug: "woman_technologist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🎤": { - name: "singer", - slug: "singer", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🎤": { - name: "man singer", - slug: "man_singer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🎤": { - name: "woman singer", - slug: "woman_singer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🎨": { - name: "artist", - slug: "artist", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🎨": { - name: "man artist", - slug: "man_artist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🎨": { - name: "woman artist", - slug: "woman_artist", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍✈️": { - name: "pilot", - slug: "pilot", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍✈️": { - name: "man pilot", - slug: "man_pilot", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍✈️": { - name: "woman pilot", - slug: "woman_pilot", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🚀": { - name: "astronaut", - slug: "astronaut", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🚀": { - name: "man astronaut", - slug: "man_astronaut", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🚀": { - name: "woman astronaut", - slug: "woman_astronaut", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🚒": { - name: "firefighter", - slug: "firefighter", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🚒": { - name: "man firefighter", - slug: "man_firefighter", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👩‍🚒": { - name: "woman firefighter", - slug: "woman_firefighter", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👮": { - name: "police officer", - slug: "police_officer", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👮‍♂️": { - name: "man police officer", - slug: "man_police_officer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👮‍♀️": { - name: "woman police officer", - slug: "woman_police_officer", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🕵️": { - name: "detective", - slug: "detective", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "2.0" -}, - "🕵️‍♂️": { - name: "man detective", - slug: "man_detective", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🕵️‍♀️": { - name: "woman detective", - slug: "woman_detective", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💂": { - name: "guard", - slug: "guard", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "💂‍♂️": { - name: "man guard", - slug: "man_guard", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💂‍♀️": { - name: "woman guard", - slug: "woman_guard", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🥷": { - name: "ninja", - slug: "ninja", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "👷": { - name: "construction worker", - slug: "construction_worker", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👷‍♂️": { - name: "man construction worker", - slug: "man_construction_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👷‍♀️": { - name: "woman construction worker", - slug: "woman_construction_worker", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤴": { - name: "prince", - slug: "prince", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "👸": { - name: "princess", - slug: "princess", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👳": { - name: "person wearing turban", - slug: "person_wearing_turban", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👳‍♂️": { - name: "man wearing turban", - slug: "man_wearing_turban", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👳‍♀️": { - name: "woman wearing turban", - slug: "woman_wearing_turban", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👲": { - name: "person with skullcap", - slug: "person_with_skullcap", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🧕": { - name: "woman with headscarf", - slug: "woman_with_headscarf", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🤵": { - name: "person in tuxedo", - slug: "person_in_tuxedo", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤵‍♂️": { - name: "man in tuxedo", - slug: "man_in_tuxedo", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "🤵‍♀️": { - name: "woman in tuxedo", - slug: "woman_in_tuxedo", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "👰": { - name: "person with veil", - slug: "person_with_veil", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "👰‍♂️": { - name: "man with veil", - slug: "man_with_veil", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "👰‍♀️": { - name: "woman with veil", - slug: "woman_with_veil", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "🤰": { - name: "pregnant woman", - slug: "pregnant_woman", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤱": { - name: "breast-feeding", - slug: "breast_feeding", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "👩‍🍼": { - name: "woman feeding baby", - slug: "woman_feeding_baby", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "👨‍🍼": { - name: "man feeding baby", - slug: "man_feeding_baby", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "🧑‍🍼": { - name: "person feeding baby", - slug: "person_feeding_baby", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "👼": { - name: "baby angel", - slug: "baby_angel", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🎅": { - name: "Santa Claus", - slug: "santa_claus", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🤶": { - name: "Mrs. Claus", - slug: "mrs_claus", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🧑‍🎄": { - name: "mx claus", - slug: "mx_claus", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "13.0" -}, - "🦸": { - name: "superhero", - slug: "superhero", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦸‍♂️": { - name: "man superhero", - slug: "man_superhero", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦸‍♀️": { - name: "woman superhero", - slug: "woman_superhero", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦹": { - name: "supervillain", - slug: "supervillain", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦹‍♂️": { - name: "man supervillain", - slug: "man_supervillain", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🦹‍♀️": { - name: "woman supervillain", - slug: "woman_supervillain", - group: "People & Body", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "11.0" -}, - "🧙": { - name: "mage", - slug: "mage", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧙‍♂️": { - name: "man mage", - slug: "man_mage", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧙‍♀️": { - name: "woman mage", - slug: "woman_mage", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧚": { - name: "fairy", - slug: "fairy", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧚‍♂️": { - name: "man fairy", - slug: "man_fairy", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧚‍♀️": { - name: "woman fairy", - slug: "woman_fairy", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧛": { - name: "vampire", - slug: "vampire", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧛‍♂️": { - name: "man vampire", - slug: "man_vampire", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧛‍♀️": { - name: "woman vampire", - slug: "woman_vampire", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧜": { - name: "merperson", - slug: "merperson", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧜‍♂️": { - name: "merman", - slug: "merman", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧜‍♀️": { - name: "mermaid", - slug: "mermaid", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧝": { - name: "elf", - slug: "elf", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧝‍♂️": { - name: "man elf", - slug: "man_elf", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧝‍♀️": { - name: "woman elf", - slug: "woman_elf", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧞": { - name: "genie", - slug: "genie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧞‍♂️": { - name: "man genie", - slug: "man_genie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧞‍♀️": { - name: "woman genie", - slug: "woman_genie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧟": { - name: "zombie", - slug: "zombie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧟‍♂️": { - name: "man zombie", - slug: "man_zombie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧟‍♀️": { - name: "woman zombie", - slug: "woman_zombie", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "💆": { - name: "person getting massage", - slug: "person_getting_massage", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "💆‍♂️": { - name: "man getting massage", - slug: "man_getting_massage", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💆‍♀️": { - name: "woman getting massage", - slug: "woman_getting_massage", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💇": { - name: "person getting haircut", - slug: "person_getting_haircut", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "💇‍♂️": { - name: "man getting haircut", - slug: "man_getting_haircut", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💇‍♀️": { - name: "woman getting haircut", - slug: "woman_getting_haircut", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚶": { - name: "person walking", - slug: "person_walking", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🚶‍♂️": { - name: "man walking", - slug: "man_walking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚶‍♀️": { - name: "woman walking", - slug: "woman_walking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧍": { - name: "person standing", - slug: "person_standing", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧍‍♂️": { - name: "man standing", - slug: "man_standing", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧍‍♀️": { - name: "woman standing", - slug: "woman_standing", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧎": { - name: "person kneeling", - slug: "person_kneeling", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧎‍♂️": { - name: "man kneeling", - slug: "man_kneeling", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧎‍♀️": { - name: "woman kneeling", - slug: "woman_kneeling", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧑‍🦯": { - name: "person with white cane", - slug: "person_with_white_cane", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🦯": { - name: "man with white cane", - slug: "man_with_white_cane", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👩‍🦯": { - name: "woman with white cane", - slug: "woman_with_white_cane", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧑‍🦼": { - name: "person in motorized wheelchair", - slug: "person_in_motorized_wheelchair", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🦼": { - name: "man in motorized wheelchair", - slug: "man_in_motorized_wheelchair", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👩‍🦼": { - name: "woman in motorized wheelchair", - slug: "woman_in_motorized_wheelchair", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🧑‍🦽": { - name: "person in manual wheelchair", - slug: "person_in_manual_wheelchair", - group: "People & Body", - emoji_version: "12.1", - unicode_version: "12.1", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.1" -}, - "👨‍🦽": { - name: "man in manual wheelchair", - slug: "man_in_manual_wheelchair", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👩‍🦽": { - name: "woman in manual wheelchair", - slug: "woman_in_manual_wheelchair", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "🏃": { - name: "person running", - slug: "person_running", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🏃‍♂️": { - name: "man running", - slug: "man_running", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏃‍♀️": { - name: "woman running", - slug: "woman_running", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "💃": { - name: "woman dancing", - slug: "woman_dancing", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🕺": { - name: "man dancing", - slug: "man_dancing", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🕴️": { - name: "person in suit levitating", - slug: "person_in_suit_levitating", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "👯": { - name: "people with bunny ears", - slug: "people_with_bunny_ears", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👯‍♂️": { - name: "men with bunny ears", - slug: "men_with_bunny_ears", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👯‍♀️": { - name: "women with bunny ears", - slug: "women_with_bunny_ears", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🧖": { - name: "person in steamy room", - slug: "person_in_steamy_room", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧖‍♂️": { - name: "man in steamy room", - slug: "man_in_steamy_room", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧖‍♀️": { - name: "woman in steamy room", - slug: "woman_in_steamy_room", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧗": { - name: "person climbing", - slug: "person_climbing", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧗‍♂️": { - name: "man climbing", - slug: "man_climbing", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧗‍♀️": { - name: "woman climbing", - slug: "woman_climbing", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🤺": { - name: "person fencing", - slug: "person_fencing", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🏇": { - name: "horse racing", - slug: "horse_racing", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "⛷️": { - name: "skier", - slug: "skier", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏂": { - name: "snowboarder", - slug: "snowboarder", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🏌️": { - name: "person golfing", - slug: "person_golfing", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏌️‍♂️": { - name: "man golfing", - slug: "man_golfing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏌️‍♀️": { - name: "woman golfing", - slug: "woman_golfing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏄": { - name: "person surfing", - slug: "person_surfing", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🏄‍♂️": { - name: "man surfing", - slug: "man_surfing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏄‍♀️": { - name: "woman surfing", - slug: "woman_surfing", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚣": { - name: "person rowing boat", - slug: "person_rowing_boat", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🚣‍♂️": { - name: "man rowing boat", - slug: "man_rowing_boat", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚣‍♀️": { - name: "woman rowing boat", - slug: "woman_rowing_boat", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏊": { - name: "person swimming", - slug: "person_swimming", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🏊‍♂️": { - name: "man swimming", - slug: "man_swimming", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏊‍♀️": { - name: "woman swimming", - slug: "woman_swimming", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "⛹️": { - name: "person bouncing ball", - slug: "person_bouncing_ball", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "2.0" -}, - "⛹️‍♂️": { - name: "man bouncing ball", - slug: "man_bouncing_ball", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "⛹️‍♀️": { - name: "woman bouncing ball", - slug: "woman_bouncing_ball", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏋️": { - name: "person lifting weights", - slug: "person_lifting_weights", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: true, - skin_tone_support_unicode_version: "2.0" -}, - "🏋️‍♂️": { - name: "man lifting weights", - slug: "man_lifting_weights", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🏋️‍♀️": { - name: "woman lifting weights", - slug: "woman_lifting_weights", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚴": { - name: "person biking", - slug: "person_biking", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🚴‍♂️": { - name: "man biking", - slug: "man_biking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚴‍♀️": { - name: "woman biking", - slug: "woman_biking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚵": { - name: "person mountain biking", - slug: "person_mountain_biking", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🚵‍♂️": { - name: "man mountain biking", - slug: "man_mountain_biking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🚵‍♀️": { - name: "woman mountain biking", - slug: "woman_mountain_biking", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤸": { - name: "person cartwheeling", - slug: "person_cartwheeling", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤸‍♂️": { - name: "man cartwheeling", - slug: "man_cartwheeling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤸‍♀️": { - name: "woman cartwheeling", - slug: "woman_cartwheeling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤼": { - name: "people wrestling", - slug: "people_wrestling", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🤼‍♂️": { - name: "men wrestling", - slug: "men_wrestling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🤼‍♀️": { - name: "women wrestling", - slug: "women_wrestling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🤽": { - name: "person playing water polo", - slug: "person_playing_water_polo", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤽‍♂️": { - name: "man playing water polo", - slug: "man_playing_water_polo", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤽‍♀️": { - name: "woman playing water polo", - slug: "woman_playing_water_polo", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤾": { - name: "person playing handball", - slug: "person_playing_handball", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤾‍♂️": { - name: "man playing handball", - slug: "man_playing_handball", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤾‍♀️": { - name: "woman playing handball", - slug: "woman_playing_handball", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤹": { - name: "person juggling", - slug: "person_juggling", - group: "People & Body", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "3.0" -}, - "🤹‍♂️": { - name: "man juggling", - slug: "man_juggling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🤹‍♀️": { - name: "woman juggling", - slug: "woman_juggling", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧘": { - name: "person in lotus position", - slug: "person_in_lotus_position", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧘‍♂️": { - name: "man in lotus position", - slug: "man_in_lotus_position", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🧘‍♀️": { - name: "woman in lotus position", - slug: "woman_in_lotus_position", - group: "People & Body", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "5.0" -}, - "🛀": { - name: "person taking bath", - slug: "person_taking_bath", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "1.0" -}, - "🛌": { - name: "person in bed", - slug: "person_in_bed", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "4.0" -}, - "🧑‍🤝‍🧑": { - name: "people holding hands", - slug: "people_holding_hands", - group: "People & Body", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👭": { - name: "women holding hands", - slug: "women_holding_hands", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👫": { - name: "woman and man holding hands", - slug: "woman_and_man_holding_hands", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "👬": { - name: "men holding hands", - slug: "men_holding_hands", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: true, - skin_tone_support_unicode_version: "12.0" -}, - "💏": { - name: "kiss", - slug: "kiss", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👩‍❤️‍💋‍👨": { - name: "kiss woman, man", - slug: "kiss_woman_man", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍❤️‍💋‍👨": { - name: "kiss man, man", - slug: "kiss_man_man", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍❤️‍💋‍👩": { - name: "kiss woman, woman", - slug: "kiss_woman_woman", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "💑": { - name: "couple with heart", - slug: "couple_with_heart", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👩‍❤️‍👨": { - name: "couple with heart woman, man", - slug: "couple_with_heart_woman_man", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍❤️‍👨": { - name: "couple with heart man, man", - slug: "couple_with_heart_man_man", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍❤️‍👩": { - name: "couple with heart woman, woman", - slug: "couple_with_heart_woman_woman", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👪": { - name: "family", - slug: "family", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👨‍👩‍👦": { - name: "family man, woman, boy", - slug: "family_man_woman_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👩‍👧": { - name: "family man, woman, girl", - slug: "family_man_woman_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👩‍👧‍👦": { - name: "family man, woman, girl, boy", - slug: "family_man_woman_girl_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👩‍👦‍👦": { - name: "family man, woman, boy, boy", - slug: "family_man_woman_boy_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👩‍👧‍👧": { - name: "family man, woman, girl, girl", - slug: "family_man_woman_girl_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👨‍👦": { - name: "family man, man, boy", - slug: "family_man_man_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👨‍👧": { - name: "family man, man, girl", - slug: "family_man_man_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👨‍👧‍👦": { - name: "family man, man, girl, boy", - slug: "family_man_man_girl_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👨‍👦‍👦": { - name: "family man, man, boy, boy", - slug: "family_man_man_boy_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👨‍👧‍👧": { - name: "family man, man, girl, girl", - slug: "family_man_man_girl_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍👩‍👦": { - name: "family woman, woman, boy", - slug: "family_woman_woman_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍👩‍👧": { - name: "family woman, woman, girl", - slug: "family_woman_woman_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍👩‍👧‍👦": { - name: "family woman, woman, girl, boy", - slug: "family_woman_woman_girl_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍👩‍👦‍👦": { - name: "family woman, woman, boy, boy", - slug: "family_woman_woman_boy_boy", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👩‍👩‍👧‍👧": { - name: "family woman, woman, girl, girl", - slug: "family_woman_woman_girl_girl", - group: "People & Body", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "👨‍👦": { - name: "family man, boy", - slug: "family_man_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👨‍👦‍👦": { - name: "family man, boy, boy", - slug: "family_man_boy_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👨‍👧": { - name: "family man, girl", - slug: "family_man_girl", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👨‍👧‍👦": { - name: "family man, girl, boy", - slug: "family_man_girl_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👨‍👧‍👧": { - name: "family man, girl, girl", - slug: "family_man_girl_girl", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👩‍👦": { - name: "family woman, boy", - slug: "family_woman_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👩‍👦‍👦": { - name: "family woman, boy, boy", - slug: "family_woman_boy_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👩‍👧": { - name: "family woman, girl", - slug: "family_woman_girl", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👩‍👧‍👦": { - name: "family woman, girl, boy", - slug: "family_woman_girl_boy", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "👩‍👧‍👧": { - name: "family woman, girl, girl", - slug: "family_woman_girl_girl", - group: "People & Body", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🗣️": { - name: "speaking head", - slug: "speaking_head", - group: "People & Body", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "👤": { - name: "bust in silhouette", - slug: "bust_in_silhouette", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👥": { - name: "busts in silhouette", - slug: "busts_in_silhouette", - group: "People & Body", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🫂": { - name: "people hugging", - slug: "people_hugging", - group: "People & Body", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "👣": { - name: "footprints", - slug: "footprints", - group: "People & Body", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐵": { - name: "monkey face", - slug: "monkey_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐒": { - name: "monkey", - slug: "monkey", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦍": { - name: "gorilla", - slug: "gorilla", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦧": { - name: "orangutan", - slug: "orangutan", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🐶": { - name: "dog face", - slug: "dog_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐕": { - name: "dog", - slug: "dog", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🦮": { - name: "guide dog", - slug: "guide_dog", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🐕‍🦺": { - name: "service dog", - slug: "service_dog", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🐩": { - name: "poodle", - slug: "poodle", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐺": { - name: "wolf", - slug: "wolf", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦊": { - name: "fox", - slug: "fox", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦝": { - name: "raccoon", - slug: "raccoon", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🐱": { - name: "cat face", - slug: "cat_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐈": { - name: "cat", - slug: "cat", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🐈‍⬛": { - name: "black cat", - slug: "black_cat", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦁": { - name: "lion", - slug: "lion", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐯": { - name: "tiger face", - slug: "tiger_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐅": { - name: "tiger", - slug: "tiger", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐆": { - name: "leopard", - slug: "leopard", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐴": { - name: "horse face", - slug: "horse_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐎": { - name: "horse", - slug: "horse", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦄": { - name: "unicorn", - slug: "unicorn", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🦓": { - name: "zebra", - slug: "zebra", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🦌": { - name: "deer", - slug: "deer", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦬": { - name: "bison", - slug: "bison", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🐮": { - name: "cow face", - slug: "cow_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐂": { - name: "ox", - slug: "ox", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐃": { - name: "water buffalo", - slug: "water_buffalo", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐄": { - name: "cow", - slug: "cow", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐷": { - name: "pig face", - slug: "pig_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐖": { - name: "pig", - slug: "pig", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐗": { - name: "boar", - slug: "boar", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐽": { - name: "pig nose", - slug: "pig_nose", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐏": { - name: "ram", - slug: "ram", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐑": { - name: "ewe", - slug: "ewe", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐐": { - name: "goat", - slug: "goat", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐪": { - name: "camel", - slug: "camel", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐫": { - name: "two-hump camel", - slug: "two_hump_camel", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦙": { - name: "llama", - slug: "llama", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦒": { - name: "giraffe", - slug: "giraffe", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🐘": { - name: "elephant", - slug: "elephant", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦣": { - name: "mammoth", - slug: "mammoth", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦏": { - name: "rhinoceros", - slug: "rhinoceros", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦛": { - name: "hippopotamus", - slug: "hippopotamus", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🐭": { - name: "mouse face", - slug: "mouse_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐁": { - name: "mouse", - slug: "mouse", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐀": { - name: "rat", - slug: "rat", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐹": { - name: "hamster", - slug: "hamster", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐰": { - name: "rabbit face", - slug: "rabbit_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐇": { - name: "rabbit", - slug: "rabbit", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐿️": { - name: "chipmunk", - slug: "chipmunk", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🦫": { - name: "beaver", - slug: "beaver", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦔": { - name: "hedgehog", - slug: "hedgehog", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🦇": { - name: "bat", - slug: "bat", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🐻": { - name: "bear", - slug: "bear", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐻‍❄️": { - name: "polar bear", - slug: "polar_bear", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🐨": { - name: "koala", - slug: "koala", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐼": { - name: "panda", - slug: "panda", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦥": { - name: "sloth", - slug: "sloth", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦦": { - name: "otter", - slug: "otter", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦨": { - name: "skunk", - slug: "skunk", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦘": { - name: "kangaroo", - slug: "kangaroo", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦡": { - name: "badger", - slug: "badger", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🐾": { - name: "paw prints", - slug: "paw_prints", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦃": { - name: "turkey", - slug: "turkey", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐔": { - name: "chicken", - slug: "chicken", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐓": { - name: "rooster", - slug: "rooster", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐣": { - name: "hatching chick", - slug: "hatching_chick", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐤": { - name: "baby chick", - slug: "baby_chick", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐥": { - name: "front-facing baby chick", - slug: "front_facing_baby_chick", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐦": { - name: "bird", - slug: "bird", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐧": { - name: "penguin", - slug: "penguin", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕊️": { - name: "dove", - slug: "dove", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🦅": { - name: "eagle", - slug: "eagle", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦆": { - name: "duck", - slug: "duck", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦢": { - name: "swan", - slug: "swan", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦉": { - name: "owl", - slug: "owl", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦤": { - name: "dodo", - slug: "dodo", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪶": { - name: "feather", - slug: "feather", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦩": { - name: "flamingo", - slug: "flamingo", - group: "Animals & Nature", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦚": { - name: "peacock", - slug: "peacock", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦜": { - name: "parrot", - slug: "parrot", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🐸": { - name: "frog", - slug: "frog", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐊": { - name: "crocodile", - slug: "crocodile", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐢": { - name: "turtle", - slug: "turtle", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦎": { - name: "lizard", - slug: "lizard", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🐍": { - name: "snake", - slug: "snake", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐲": { - name: "dragon face", - slug: "dragon_face", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐉": { - name: "dragon", - slug: "dragon", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🦕": { - name: "sauropod", - slug: "sauropod", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🦖": { - name: "T-Rex", - slug: "t_rex", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🐳": { - name: "spouting whale", - slug: "spouting_whale", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐋": { - name: "whale", - slug: "whale", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🐬": { - name: "dolphin", - slug: "dolphin", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦭": { - name: "seal", - slug: "seal", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🐟": { - name: "fish", - slug: "fish", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐠": { - name: "tropical fish", - slug: "tropical_fish", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐡": { - name: "blowfish", - slug: "blowfish", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦈": { - name: "shark", - slug: "shark", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🐙": { - name: "octopus", - slug: "octopus", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐚": { - name: "spiral shell", - slug: "spiral_shell", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐌": { - name: "snail", - slug: "snail", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦋": { - name: "butterfly", - slug: "butterfly", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🐛": { - name: "bug", - slug: "bug", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐜": { - name: "ant", - slug: "ant", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🐝": { - name: "honeybee", - slug: "honeybee", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪲": { - name: "beetle", - slug: "beetle", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🐞": { - name: "lady beetle", - slug: "lady_beetle", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🦗": { - name: "cricket", - slug: "cricket", - group: "Animals & Nature", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🪳": { - name: "cockroach", - slug: "cockroach", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🕷️": { - name: "spider", - slug: "spider", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕸️": { - name: "spider web", - slug: "spider_web", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🦂": { - name: "scorpion", - slug: "scorpion", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🦟": { - name: "mosquito", - slug: "mosquito", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪰": { - name: "fly", - slug: "fly", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪱": { - name: "worm", - slug: "worm", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🦠": { - name: "microbe", - slug: "microbe", - group: "Animals & Nature", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "💐": { - name: "bouquet", - slug: "bouquet", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌸": { - name: "cherry blossom", - slug: "cherry_blossom", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💮": { - name: "white flower", - slug: "white_flower", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏵️": { - name: "rosette", - slug: "rosette", - group: "Animals & Nature", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌹": { - name: "rose", - slug: "rose", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥀": { - name: "wilted flower", - slug: "wilted_flower", - group: "Animals & Nature", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🌺": { - name: "hibiscus", - slug: "hibiscus", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌻": { - name: "sunflower", - slug: "sunflower", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌼": { - name: "blossom", - slug: "blossom", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌷": { - name: "tulip", - slug: "tulip", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌱": { - name: "seedling", - slug: "seedling", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪴": { - name: "potted plant", - slug: "potted_plant", - group: "Animals & Nature", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🌲": { - name: "evergreen tree", - slug: "evergreen_tree", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌳": { - name: "deciduous tree", - slug: "deciduous_tree", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌴": { - name: "palm tree", - slug: "palm_tree", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌵": { - name: "cactus", - slug: "cactus", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌾": { - name: "sheaf of rice", - slug: "sheaf_of_rice", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌿": { - name: "herb", - slug: "herb", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☘️": { - name: "shamrock", - slug: "shamrock", - group: "Animals & Nature", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🍀": { - name: "four leaf clover", - slug: "four_leaf_clover", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍁": { - name: "maple leaf", - slug: "maple_leaf", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍂": { - name: "fallen leaf", - slug: "fallen_leaf", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍃": { - name: "leaf fluttering in wind", - slug: "leaf_fluttering_in_wind", - group: "Animals & Nature", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍇": { - name: "grapes", - slug: "grapes", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍈": { - name: "melon", - slug: "melon", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍉": { - name: "watermelon", - slug: "watermelon", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍊": { - name: "tangerine", - slug: "tangerine", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍋": { - name: "lemon", - slug: "lemon", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🍌": { - name: "banana", - slug: "banana", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍍": { - name: "pineapple", - slug: "pineapple", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥭": { - name: "mango", - slug: "mango", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🍎": { - name: "red apple", - slug: "red_apple", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍏": { - name: "green apple", - slug: "green_apple", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍐": { - name: "pear", - slug: "pear", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🍑": { - name: "peach", - slug: "peach", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍒": { - name: "cherries", - slug: "cherries", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍓": { - name: "strawberry", - slug: "strawberry", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🫐": { - name: "blueberries", - slug: "blueberries", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥝": { - name: "kiwi fruit", - slug: "kiwi_fruit", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍅": { - name: "tomato", - slug: "tomato", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🫒": { - name: "olive", - slug: "olive", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥥": { - name: "coconut", - slug: "coconut", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥑": { - name: "avocado", - slug: "avocado", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍆": { - name: "eggplant", - slug: "eggplant", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥔": { - name: "potato", - slug: "potato", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥕": { - name: "carrot", - slug: "carrot", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🌽": { - name: "ear of corn", - slug: "ear_of_corn", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌶️": { - name: "hot pepper", - slug: "hot_pepper", - group: "Food & Drink", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🫑": { - name: "bell pepper", - slug: "bell_pepper", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥒": { - name: "cucumber", - slug: "cucumber", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥬": { - name: "leafy green", - slug: "leafy_green", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥦": { - name: "broccoli", - slug: "broccoli", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧄": { - name: "garlic", - slug: "garlic", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧅": { - name: "onion", - slug: "onion", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🍄": { - name: "mushroom", - slug: "mushroom", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥜": { - name: "peanuts", - slug: "peanuts", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🌰": { - name: "chestnut", - slug: "chestnut", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍞": { - name: "bread", - slug: "bread", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥐": { - name: "croissant", - slug: "croissant", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥖": { - name: "baguette bread", - slug: "baguette_bread", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🫓": { - name: "flatbread", - slug: "flatbread", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥨": { - name: "pretzel", - slug: "pretzel", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥯": { - name: "bagel", - slug: "bagel", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥞": { - name: "pancakes", - slug: "pancakes", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🧇": { - name: "waffle", - slug: "waffle", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧀": { - name: "cheese wedge", - slug: "cheese_wedge", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🍖": { - name: "meat on bone", - slug: "meat_on_bone", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍗": { - name: "poultry leg", - slug: "poultry_leg", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥩": { - name: "cut of meat", - slug: "cut_of_meat", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥓": { - name: "bacon", - slug: "bacon", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍔": { - name: "hamburger", - slug: "hamburger", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍟": { - name: "french fries", - slug: "french_fries", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍕": { - name: "pizza", - slug: "pizza", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌭": { - name: "hot dog", - slug: "hot_dog", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥪": { - name: "sandwich", - slug: "sandwich", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🌮": { - name: "taco", - slug: "taco", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌯": { - name: "burrito", - slug: "burrito", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🫔": { - name: "tamale", - slug: "tamale", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥙": { - name: "stuffed flatbread", - slug: "stuffed_flatbread", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🧆": { - name: "falafel", - slug: "falafel", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🥚": { - name: "egg", - slug: "egg", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍳": { - name: "cooking", - slug: "cooking", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥘": { - name: "shallow pan of food", - slug: "shallow_pan_of_food", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍲": { - name: "pot of food", - slug: "pot_of_food", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🫕": { - name: "fondue", - slug: "fondue", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🥣": { - name: "bowl with spoon", - slug: "bowl_with_spoon", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥗": { - name: "green salad", - slug: "green_salad", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🍿": { - name: "popcorn", - slug: "popcorn", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🧈": { - name: "butter", - slug: "butter", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧂": { - name: "salt", - slug: "salt", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥫": { - name: "canned food", - slug: "canned_food", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🍱": { - name: "bento box", - slug: "bento_box", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍘": { - name: "rice cracker", - slug: "rice_cracker", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍙": { - name: "rice ball", - slug: "rice_ball", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍚": { - name: "cooked rice", - slug: "cooked_rice", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍛": { - name: "curry rice", - slug: "curry_rice", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍜": { - name: "steaming bowl", - slug: "steaming_bowl", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍝": { - name: "spaghetti", - slug: "spaghetti", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍠": { - name: "roasted sweet potato", - slug: "roasted_sweet_potato", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍢": { - name: "oden", - slug: "oden", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍣": { - name: "sushi", - slug: "sushi", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍤": { - name: "fried shrimp", - slug: "fried_shrimp", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍥": { - name: "fish cake with swirl", - slug: "fish_cake_with_swirl", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥮": { - name: "moon cake", - slug: "moon_cake", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🍡": { - name: "dango", - slug: "dango", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥟": { - name: "dumpling", - slug: "dumpling", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥠": { - name: "fortune cookie", - slug: "fortune_cookie", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥡": { - name: "takeout box", - slug: "takeout_box", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🦀": { - name: "crab", - slug: "crab", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🦞": { - name: "lobster", - slug: "lobster", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦐": { - name: "shrimp", - slug: "shrimp", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦑": { - name: "squid", - slug: "squid", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦪": { - name: "oyster", - slug: "oyster", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🍦": { - name: "soft ice cream", - slug: "soft_ice_cream", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍧": { - name: "shaved ice", - slug: "shaved_ice", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍨": { - name: "ice cream", - slug: "ice_cream", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍩": { - name: "doughnut", - slug: "doughnut", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍪": { - name: "cookie", - slug: "cookie", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎂": { - name: "birthday cake", - slug: "birthday_cake", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍰": { - name: "shortcake", - slug: "shortcake", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧁": { - name: "cupcake", - slug: "cupcake", - group: "Food & Drink", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥧": { - name: "pie", - slug: "pie", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🍫": { - name: "chocolate bar", - slug: "chocolate_bar", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍬": { - name: "candy", - slug: "candy", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍭": { - name: "lollipop", - slug: "lollipop", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍮": { - name: "custard", - slug: "custard", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍯": { - name: "honey pot", - slug: "honey_pot", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍼": { - name: "baby bottle", - slug: "baby_bottle", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥛": { - name: "glass of milk", - slug: "glass_of_milk", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "☕": { - name: "hot beverage", - slug: "hot_beverage", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🫖": { - name: "teapot", - slug: "teapot", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🍵": { - name: "teacup without handle", - slug: "teacup_without_handle", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍶": { - name: "sake", - slug: "sake", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍾": { - name: "bottle with popping cork", - slug: "bottle_with_popping_cork", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🍷": { - name: "wine glass", - slug: "wine_glass", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍸": { - name: "cocktail glass", - slug: "cocktail_glass", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍹": { - name: "tropical drink", - slug: "tropical_drink", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍺": { - name: "beer mug", - slug: "beer_mug", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🍻": { - name: "clinking beer mugs", - slug: "clinking_beer_mugs", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥂": { - name: "clinking glasses", - slug: "clinking_glasses", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥃": { - name: "tumbler glass", - slug: "tumbler_glass", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥤": { - name: "cup with straw", - slug: "cup_with_straw", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧋": { - name: "bubble tea", - slug: "bubble_tea", - group: "Food & Drink", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧃": { - name: "beverage box", - slug: "beverage_box", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧉": { - name: "mate", - slug: "mate", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧊": { - name: "ice", - slug: "ice", - group: "Food & Drink", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🥢": { - name: "chopsticks", - slug: "chopsticks", - group: "Food & Drink", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🍽️": { - name: "fork and knife with plate", - slug: "fork_and_knife_with_plate", - group: "Food & Drink", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🍴": { - name: "fork and knife", - slug: "fork_and_knife", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥄": { - name: "spoon", - slug: "spoon", - group: "Food & Drink", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🔪": { - name: "kitchen knife", - slug: "kitchen_knife", - group: "Food & Drink", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏺": { - name: "amphora", - slug: "amphora", - group: "Food & Drink", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌍": { - name: "globe showing Europe-Africa", - slug: "globe_showing_europe_africa", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌎": { - name: "globe showing Americas", - slug: "globe_showing_americas", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌏": { - name: "globe showing Asia-Australia", - slug: "globe_showing_asia_australia", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌐": { - name: "globe with meridians", - slug: "globe_with_meridians", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🗺️": { - name: "world map", - slug: "world_map", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🗾": { - name: "map of Japan", - slug: "map_of_japan", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧭": { - name: "compass", - slug: "compass", - group: "Travel & Places", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🏔️": { - name: "snow-capped mountain", - slug: "snow_capped_mountain", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⛰️": { - name: "mountain", - slug: "mountain", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌋": { - name: "volcano", - slug: "volcano", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗻": { - name: "mount fuji", - slug: "mount_fuji", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏕️": { - name: "camping", - slug: "camping", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏖️": { - name: "beach with umbrella", - slug: "beach_with_umbrella", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏜️": { - name: "desert", - slug: "desert", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏝️": { - name: "desert island", - slug: "desert_island", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏞️": { - name: "national park", - slug: "national_park", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏟️": { - name: "stadium", - slug: "stadium", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏛️": { - name: "classical building", - slug: "classical_building", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏗️": { - name: "building construction", - slug: "building_construction", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🧱": { - name: "brick", - slug: "brick", - group: "Travel & Places", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪨": { - name: "rock", - slug: "rock", - group: "Travel & Places", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪵": { - name: "wood", - slug: "wood", - group: "Travel & Places", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🛖": { - name: "hut", - slug: "hut", - group: "Travel & Places", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🏘️": { - name: "houses", - slug: "houses", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏚️": { - name: "derelict house", - slug: "derelict_house", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏠": { - name: "house", - slug: "house", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏡": { - name: "house with garden", - slug: "house_with_garden", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏢": { - name: "office building", - slug: "office_building", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏣": { - name: "Japanese post office", - slug: "japanese_post_office", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏤": { - name: "post office", - slug: "post_office", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏥": { - name: "hospital", - slug: "hospital", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏦": { - name: "bank", - slug: "bank", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏨": { - name: "hotel", - slug: "hotel", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏩": { - name: "love hotel", - slug: "love_hotel", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏪": { - name: "convenience store", - slug: "convenience_store", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏫": { - name: "school", - slug: "school", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏬": { - name: "department store", - slug: "department_store", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏭": { - name: "factory", - slug: "factory", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏯": { - name: "Japanese castle", - slug: "japanese_castle", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏰": { - name: "castle", - slug: "castle", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💒": { - name: "wedding", - slug: "wedding", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗼": { - name: "Tokyo tower", - slug: "tokyo_tower", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗽": { - name: "Statue of Liberty", - slug: "statue_of_liberty", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛪": { - name: "church", - slug: "church", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕌": { - name: "mosque", - slug: "mosque", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛕": { - name: "hindu temple", - slug: "hindu_temple", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🕍": { - name: "synagogue", - slug: "synagogue", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⛩️": { - name: "shinto shrine", - slug: "shinto_shrine", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕋": { - name: "kaaba", - slug: "kaaba", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⛲": { - name: "fountain", - slug: "fountain", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛺": { - name: "tent", - slug: "tent", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌁": { - name: "foggy", - slug: "foggy", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌃": { - name: "night with stars", - slug: "night_with_stars", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏙️": { - name: "cityscape", - slug: "cityscape", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌄": { - name: "sunrise over mountains", - slug: "sunrise_over_mountains", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌅": { - name: "sunrise", - slug: "sunrise", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌆": { - name: "cityscape at dusk", - slug: "cityscape_at_dusk", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌇": { - name: "sunset", - slug: "sunset", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌉": { - name: "bridge at night", - slug: "bridge_at_night", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♨️": { - name: "hot springs", - slug: "hot_springs", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎠": { - name: "carousel horse", - slug: "carousel_horse", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎡": { - name: "ferris wheel", - slug: "ferris_wheel", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎢": { - name: "roller coaster", - slug: "roller_coaster", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💈": { - name: "barber pole", - slug: "barber_pole", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎪": { - name: "circus tent", - slug: "circus_tent", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚂": { - name: "locomotive", - slug: "locomotive", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚃": { - name: "railway car", - slug: "railway_car", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚄": { - name: "high-speed train", - slug: "high_speed_train", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚅": { - name: "bullet train", - slug: "bullet_train", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚆": { - name: "train", - slug: "train", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚇": { - name: "metro", - slug: "metro", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚈": { - name: "light rail", - slug: "light_rail", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚉": { - name: "station", - slug: "station", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚊": { - name: "tram", - slug: "tram", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚝": { - name: "monorail", - slug: "monorail", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚞": { - name: "mountain railway", - slug: "mountain_railway", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚋": { - name: "tram car", - slug: "tram_car", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚌": { - name: "bus", - slug: "bus", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚍": { - name: "oncoming bus", - slug: "oncoming_bus", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🚎": { - name: "trolleybus", - slug: "trolleybus", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚐": { - name: "minibus", - slug: "minibus", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚑": { - name: "ambulance", - slug: "ambulance", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚒": { - name: "fire engine", - slug: "fire_engine", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚓": { - name: "police car", - slug: "police_car", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚔": { - name: "oncoming police car", - slug: "oncoming_police_car", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🚕": { - name: "taxi", - slug: "taxi", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚖": { - name: "oncoming taxi", - slug: "oncoming_taxi", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚗": { - name: "automobile", - slug: "automobile", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚘": { - name: "oncoming automobile", - slug: "oncoming_automobile", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🚙": { - name: "sport utility vehicle", - slug: "sport_utility_vehicle", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛻": { - name: "pickup truck", - slug: "pickup_truck", - group: "Travel & Places", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🚚": { - name: "delivery truck", - slug: "delivery_truck", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚛": { - name: "articulated lorry", - slug: "articulated_lorry", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚜": { - name: "tractor", - slug: "tractor", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏎️": { - name: "racing car", - slug: "racing_car", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏍️": { - name: "motorcycle", - slug: "motorcycle", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛵": { - name: "motor scooter", - slug: "motor_scooter", - group: "Travel & Places", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🦽": { - name: "manual wheelchair", - slug: "manual_wheelchair", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🦼": { - name: "motorized wheelchair", - slug: "motorized_wheelchair", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🛺": { - name: "auto rickshaw", - slug: "auto_rickshaw", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🚲": { - name: "bicycle", - slug: "bicycle", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛴": { - name: "kick scooter", - slug: "kick_scooter", - group: "Travel & Places", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🛹": { - name: "skateboard", - slug: "skateboard", - group: "Travel & Places", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🛼": { - name: "roller skate", - slug: "roller_skate", - group: "Travel & Places", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🚏": { - name: "bus stop", - slug: "bus_stop", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛣️": { - name: "motorway", - slug: "motorway", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛤️": { - name: "railway track", - slug: "railway_track", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛢️": { - name: "oil drum", - slug: "oil_drum", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⛽": { - name: "fuel pump", - slug: "fuel_pump", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚨": { - name: "police car light", - slug: "police_car_light", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚥": { - name: "horizontal traffic light", - slug: "horizontal_traffic_light", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚦": { - name: "vertical traffic light", - slug: "vertical_traffic_light", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛑": { - name: "stop sign", - slug: "stop_sign", - group: "Travel & Places", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🚧": { - name: "construction", - slug: "construction", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚓": { - name: "anchor", - slug: "anchor", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛵": { - name: "sailboat", - slug: "sailboat", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛶": { - name: "canoe", - slug: "canoe", - group: "Travel & Places", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🚤": { - name: "speedboat", - slug: "speedboat", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛳️": { - name: "passenger ship", - slug: "passenger_ship", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⛴️": { - name: "ferry", - slug: "ferry", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛥️": { - name: "motor boat", - slug: "motor_boat", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🚢": { - name: "ship", - slug: "ship", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✈️": { - name: "airplane", - slug: "airplane", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛩️": { - name: "small airplane", - slug: "small_airplane", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛫": { - name: "airplane departure", - slug: "airplane_departure", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛬": { - name: "airplane arrival", - slug: "airplane_arrival", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🪂": { - name: "parachute", - slug: "parachute", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "💺": { - name: "seat", - slug: "seat", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚁": { - name: "helicopter", - slug: "helicopter", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚟": { - name: "suspension railway", - slug: "suspension_railway", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚠": { - name: "mountain cableway", - slug: "mountain_cableway", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚡": { - name: "aerial tramway", - slug: "aerial_tramway", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛰️": { - name: "satellite", - slug: "satellite", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🚀": { - name: "rocket", - slug: "rocket", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛸": { - name: "flying saucer", - slug: "flying_saucer", - group: "Travel & Places", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🛎️": { - name: "bellhop bell", - slug: "bellhop_bell", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🧳": { - name: "luggage", - slug: "luggage", - group: "Travel & Places", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "⌛": { - name: "hourglass done", - slug: "hourglass_done", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏳": { - name: "hourglass not done", - slug: "hourglass_not_done", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⌚": { - name: "watch", - slug: "watch", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏰": { - name: "alarm clock", - slug: "alarm_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏱️": { - name: "stopwatch", - slug: "stopwatch", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⏲️": { - name: "timer clock", - slug: "timer_clock", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🕰️": { - name: "mantelpiece clock", - slug: "mantelpiece_clock", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕛": { - name: "twelve o’clock", - slug: "twelve_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕧": { - name: "twelve-thirty", - slug: "twelve_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕐": { - name: "one o’clock", - slug: "one_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕜": { - name: "one-thirty", - slug: "one_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕑": { - name: "two o’clock", - slug: "two_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕝": { - name: "two-thirty", - slug: "two_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕒": { - name: "three o’clock", - slug: "three_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕞": { - name: "three-thirty", - slug: "three_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕓": { - name: "four o’clock", - slug: "four_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕟": { - name: "four-thirty", - slug: "four_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕔": { - name: "five o’clock", - slug: "five_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕠": { - name: "five-thirty", - slug: "five_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕕": { - name: "six o’clock", - slug: "six_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕡": { - name: "six-thirty", - slug: "six_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕖": { - name: "seven o’clock", - slug: "seven_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕢": { - name: "seven-thirty", - slug: "seven_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕗": { - name: "eight o’clock", - slug: "eight_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕣": { - name: "eight-thirty", - slug: "eight_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕘": { - name: "nine o’clock", - slug: "nine_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕤": { - name: "nine-thirty", - slug: "nine_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕙": { - name: "ten o’clock", - slug: "ten_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕥": { - name: "ten-thirty", - slug: "ten_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🕚": { - name: "eleven o’clock", - slug: "eleven_o_clock", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕦": { - name: "eleven-thirty", - slug: "eleven_thirty", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌑": { - name: "new moon", - slug: "new_moon", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌒": { - name: "waxing crescent moon", - slug: "waxing_crescent_moon", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌓": { - name: "first quarter moon", - slug: "first_quarter_moon", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌔": { - name: "waxing gibbous moon", - slug: "waxing_gibbous_moon", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌕": { - name: "full moon", - slug: "full_moon", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌖": { - name: "waning gibbous moon", - slug: "waning_gibbous_moon", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌗": { - name: "last quarter moon", - slug: "last_quarter_moon", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌘": { - name: "waning crescent moon", - slug: "waning_crescent_moon", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌙": { - name: "crescent moon", - slug: "crescent_moon", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌚": { - name: "new moon face", - slug: "new_moon_face", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌛": { - name: "first quarter moon face", - slug: "first_quarter_moon_face", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌜": { - name: "last quarter moon face", - slug: "last_quarter_moon_face", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌡️": { - name: "thermometer", - slug: "thermometer", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☀️": { - name: "sun", - slug: "sun", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌝": { - name: "full moon face", - slug: "full_moon_face", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🌞": { - name: "sun with face", - slug: "sun_with_face", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🪐": { - name: "ringed planet", - slug: "ringed_planet", - group: "Travel & Places", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "⭐": { - name: "star", - slug: "star", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌟": { - name: "glowing star", - slug: "glowing_star", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌠": { - name: "shooting star", - slug: "shooting_star", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌌": { - name: "milky way", - slug: "milky_way", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☁️": { - name: "cloud", - slug: "cloud", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛅": { - name: "sun behind cloud", - slug: "sun_behind_cloud", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛈️": { - name: "cloud with lightning and rain", - slug: "cloud_with_lightning_and_rain", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌤️": { - name: "sun behind small cloud", - slug: "sun_behind_small_cloud", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌥️": { - name: "sun behind large cloud", - slug: "sun_behind_large_cloud", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌦️": { - name: "sun behind rain cloud", - slug: "sun_behind_rain_cloud", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌧️": { - name: "cloud with rain", - slug: "cloud_with_rain", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌨️": { - name: "cloud with snow", - slug: "cloud_with_snow", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌩️": { - name: "cloud with lightning", - slug: "cloud_with_lightning", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌪️": { - name: "tornado", - slug: "tornado", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌫️": { - name: "fog", - slug: "fog", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌬️": { - name: "wind face", - slug: "wind_face", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🌀": { - name: "cyclone", - slug: "cyclone", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌈": { - name: "rainbow", - slug: "rainbow", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌂": { - name: "closed umbrella", - slug: "closed_umbrella", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☂️": { - name: "umbrella", - slug: "umbrella", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☔": { - name: "umbrella with rain drops", - slug: "umbrella_with_rain_drops", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛱️": { - name: "umbrella on ground", - slug: "umbrella_on_ground", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⚡": { - name: "high voltage", - slug: "high_voltage", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❄️": { - name: "snowflake", - slug: "snowflake", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☃️": { - name: "snowman", - slug: "snowman", - group: "Travel & Places", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⛄": { - name: "snowman without snow", - slug: "snowman_without_snow", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☄️": { - name: "comet", - slug: "comet", - group: "Travel & Places", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔥": { - name: "fire", - slug: "fire", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💧": { - name: "droplet", - slug: "droplet", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🌊": { - name: "water wave", - slug: "water_wave", - group: "Travel & Places", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎃": { - name: "jack-o-lantern", - slug: "jack_o_lantern", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎄": { - name: "Christmas tree", - slug: "christmas_tree", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎆": { - name: "fireworks", - slug: "fireworks", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎇": { - name: "sparkler", - slug: "sparkler", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧨": { - name: "firecracker", - slug: "firecracker", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "✨": { - name: "sparkles", - slug: "sparkles", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎈": { - name: "balloon", - slug: "balloon", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎉": { - name: "party popper", - slug: "party_popper", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎊": { - name: "confetti ball", - slug: "confetti_ball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎋": { - name: "tanabata tree", - slug: "tanabata_tree", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎍": { - name: "pine decoration", - slug: "pine_decoration", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎎": { - name: "Japanese dolls", - slug: "japanese_dolls", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎏": { - name: "carp streamer", - slug: "carp_streamer", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎐": { - name: "wind chime", - slug: "wind_chime", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎑": { - name: "moon viewing ceremony", - slug: "moon_viewing_ceremony", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧧": { - name: "red envelope", - slug: "red_envelope", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🎀": { - name: "ribbon", - slug: "ribbon", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎁": { - name: "wrapped gift", - slug: "wrapped_gift", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎗️": { - name: "reminder ribbon", - slug: "reminder_ribbon", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎟️": { - name: "admission tickets", - slug: "admission_tickets", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎫": { - name: "ticket", - slug: "ticket", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎖️": { - name: "military medal", - slug: "military_medal", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏆": { - name: "trophy", - slug: "trophy", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏅": { - name: "sports medal", - slug: "sports_medal", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥇": { - name: "1st place medal", - slug: "1st_place_medal", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥈": { - name: "2nd place medal", - slug: "2nd_place_medal", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥉": { - name: "3rd place medal", - slug: "3rd_place_medal", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "⚽": { - name: "soccer ball", - slug: "soccer_ball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚾": { - name: "baseball", - slug: "baseball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥎": { - name: "softball", - slug: "softball", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🏀": { - name: "basketball", - slug: "basketball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏐": { - name: "volleyball", - slug: "volleyball", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏈": { - name: "american football", - slug: "american_football", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏉": { - name: "rugby football", - slug: "rugby_football", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🎾": { - name: "tennis", - slug: "tennis", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥏": { - name: "flying disc", - slug: "flying_disc", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🎳": { - name: "bowling", - slug: "bowling", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏏": { - name: "cricket game", - slug: "cricket_game", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏑": { - name: "field hockey", - slug: "field_hockey", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏒": { - name: "ice hockey", - slug: "ice_hockey", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥍": { - name: "lacrosse", - slug: "lacrosse", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🏓": { - name: "ping pong", - slug: "ping_pong", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏸": { - name: "badminton", - slug: "badminton", - group: "Activities", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🥊": { - name: "boxing glove", - slug: "boxing_glove", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥋": { - name: "martial arts uniform", - slug: "martial_arts_uniform", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🥅": { - name: "goal net", - slug: "goal_net", - group: "Activities", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "⛳": { - name: "flag in hole", - slug: "flag_in_hole", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛸️": { - name: "ice skate", - slug: "ice_skate", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎣": { - name: "fishing pole", - slug: "fishing_pole", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🤿": { - name: "diving mask", - slug: "diving_mask", - group: "Activities", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🎽": { - name: "running shirt", - slug: "running_shirt", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎿": { - name: "skis", - slug: "skis", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛷": { - name: "sled", - slug: "sled", - group: "Activities", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🥌": { - name: "curling stone", - slug: "curling_stone", - group: "Activities", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🎯": { - name: "direct hit", - slug: "direct_hit", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪀": { - name: "yo-yo", - slug: "yo_yo", - group: "Activities", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🪁": { - name: "kite", - slug: "kite", - group: "Activities", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🎱": { - name: "pool 8 ball", - slug: "pool_8_ball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔮": { - name: "crystal ball", - slug: "crystal_ball", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪄": { - name: "magic wand", - slug: "magic_wand", - group: "Activities", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧿": { - name: "nazar amulet", - slug: "nazar_amulet", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🎮": { - name: "video game", - slug: "video_game", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕹️": { - name: "joystick", - slug: "joystick", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎰": { - name: "slot machine", - slug: "slot_machine", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎲": { - name: "game die", - slug: "game_die", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧩": { - name: "puzzle piece", - slug: "puzzle_piece", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧸": { - name: "teddy bear", - slug: "teddy_bear", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪅": { - name: "piñata", - slug: "pinata", - group: "Activities", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪆": { - name: "nesting dolls", - slug: "nesting_dolls", - group: "Activities", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "♠️": { - name: "spade suit", - slug: "spade_suit", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♥️": { - name: "heart suit", - slug: "heart_suit", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♦️": { - name: "diamond suit", - slug: "diamond_suit", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♣️": { - name: "club suit", - slug: "club_suit", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♟️": { - name: "chess pawn", - slug: "chess_pawn", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🃏": { - name: "joker", - slug: "joker", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🀄": { - name: "mahjong red dragon", - slug: "mahjong_red_dragon", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎴": { - name: "flower playing cards", - slug: "flower_playing_cards", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎭": { - name: "performing arts", - slug: "performing_arts", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🖼️": { - name: "framed picture", - slug: "framed_picture", - group: "Activities", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎨": { - name: "artist palette", - slug: "artist_palette", - group: "Activities", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧵": { - name: "thread", - slug: "thread", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪡": { - name: "sewing needle", - slug: "sewing_needle", - group: "Activities", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧶": { - name: "yarn", - slug: "yarn", - group: "Activities", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪢": { - name: "knot", - slug: "knot", - group: "Activities", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "👓": { - name: "glasses", - slug: "glasses", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕶️": { - name: "sunglasses", - slug: "sunglasses", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🥽": { - name: "goggles", - slug: "goggles", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥼": { - name: "lab coat", - slug: "lab_coat", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🦺": { - name: "safety vest", - slug: "safety_vest", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "👔": { - name: "necktie", - slug: "necktie", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👕": { - name: "t-shirt", - slug: "t_shirt", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👖": { - name: "jeans", - slug: "jeans", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧣": { - name: "scarf", - slug: "scarf", - group: "Objects", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧤": { - name: "gloves", - slug: "gloves", - group: "Objects", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧥": { - name: "coat", - slug: "coat", - group: "Objects", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🧦": { - name: "socks", - slug: "socks", - group: "Objects", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "👗": { - name: "dress", - slug: "dress", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👘": { - name: "kimono", - slug: "kimono", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥻": { - name: "sari", - slug: "sari", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🩱": { - name: "one-piece swimsuit", - slug: "one_piece_swimsuit", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🩲": { - name: "briefs", - slug: "briefs", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🩳": { - name: "shorts", - slug: "shorts", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "👙": { - name: "bikini", - slug: "bikini", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👚": { - name: "woman’s clothes", - slug: "woman_s_clothes", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👛": { - name: "purse", - slug: "purse", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👜": { - name: "handbag", - slug: "handbag", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👝": { - name: "clutch bag", - slug: "clutch_bag", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛍️": { - name: "shopping bags", - slug: "shopping_bags", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎒": { - name: "backpack", - slug: "backpack", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🩴": { - name: "thong sandal", - slug: "thong_sandal", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "👞": { - name: "man’s shoe", - slug: "man_s_shoe", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👟": { - name: "running shoe", - slug: "running_shoe", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🥾": { - name: "hiking boot", - slug: "hiking_boot", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🥿": { - name: "flat shoe", - slug: "flat_shoe", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "👠": { - name: "high-heeled shoe", - slug: "high_heeled_shoe", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👡": { - name: "woman’s sandal", - slug: "woman_s_sandal", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🩰": { - name: "ballet shoes", - slug: "ballet_shoes", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "👢": { - name: "woman’s boot", - slug: "woman_s_boot", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👑": { - name: "crown", - slug: "crown", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "👒": { - name: "woman’s hat", - slug: "woman_s_hat", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎩": { - name: "top hat", - slug: "top_hat", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎓": { - name: "graduation cap", - slug: "graduation_cap", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧢": { - name: "billed cap", - slug: "billed_cap", - group: "Objects", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🪖": { - name: "military helmet", - slug: "military_helmet", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "⛑️": { - name: "rescue worker’s helmet", - slug: "rescue_worker_s_helmet", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📿": { - name: "prayer beads", - slug: "prayer_beads", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💄": { - name: "lipstick", - slug: "lipstick", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💍": { - name: "ring", - slug: "ring", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💎": { - name: "gem stone", - slug: "gem_stone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔇": { - name: "muted speaker", - slug: "muted_speaker", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔈": { - name: "speaker low volume", - slug: "speaker_low_volume", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🔉": { - name: "speaker medium volume", - slug: "speaker_medium_volume", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔊": { - name: "speaker high volume", - slug: "speaker_high_volume", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📢": { - name: "loudspeaker", - slug: "loudspeaker", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📣": { - name: "megaphone", - slug: "megaphone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📯": { - name: "postal horn", - slug: "postal_horn", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔔": { - name: "bell", - slug: "bell", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔕": { - name: "bell with slash", - slug: "bell_with_slash", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🎼": { - name: "musical score", - slug: "musical_score", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎵": { - name: "musical note", - slug: "musical_note", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎶": { - name: "musical notes", - slug: "musical_notes", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎙️": { - name: "studio microphone", - slug: "studio_microphone", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎚️": { - name: "level slider", - slug: "level_slider", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎛️": { - name: "control knobs", - slug: "control_knobs", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎤": { - name: "microphone", - slug: "microphone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎧": { - name: "headphone", - slug: "headphone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📻": { - name: "radio", - slug: "radio", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎷": { - name: "saxophone", - slug: "saxophone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪗": { - name: "accordion", - slug: "accordion", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🎸": { - name: "guitar", - slug: "guitar", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎹": { - name: "musical keyboard", - slug: "musical_keyboard", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎺": { - name: "trumpet", - slug: "trumpet", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎻": { - name: "violin", - slug: "violin", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪕": { - name: "banjo", - slug: "banjo", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🥁": { - name: "drum", - slug: "drum", - group: "Objects", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🪘": { - name: "long drum", - slug: "long_drum", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "📱": { - name: "mobile phone", - slug: "mobile_phone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📲": { - name: "mobile phone with arrow", - slug: "mobile_phone_with_arrow", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☎️": { - name: "telephone", - slug: "telephone", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📞": { - name: "telephone receiver", - slug: "telephone_receiver", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📟": { - name: "pager", - slug: "pager", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📠": { - name: "fax machine", - slug: "fax_machine", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔋": { - name: "battery", - slug: "battery", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔌": { - name: "electric plug", - slug: "electric_plug", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💻": { - name: "laptop", - slug: "laptop", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🖥️": { - name: "desktop computer", - slug: "desktop_computer", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🖨️": { - name: "printer", - slug: "printer", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⌨️": { - name: "keyboard", - slug: "keyboard", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🖱️": { - name: "computer mouse", - slug: "computer_mouse", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🖲️": { - name: "trackball", - slug: "trackball", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "💽": { - name: "computer disk", - slug: "computer_disk", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💾": { - name: "floppy disk", - slug: "floppy_disk", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💿": { - name: "optical disk", - slug: "optical_disk", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📀": { - name: "dvd", - slug: "dvd", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧮": { - name: "abacus", - slug: "abacus", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🎥": { - name: "movie camera", - slug: "movie_camera", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎞️": { - name: "film frames", - slug: "film_frames", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📽️": { - name: "film projector", - slug: "film_projector", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🎬": { - name: "clapper board", - slug: "clapper_board", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📺": { - name: "television", - slug: "television", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📷": { - name: "camera", - slug: "camera", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📸": { - name: "camera with flash", - slug: "camera_with_flash", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "📹": { - name: "video camera", - slug: "video_camera", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📼": { - name: "videocassette", - slug: "videocassette", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔍": { - name: "magnifying glass tilted left", - slug: "magnifying_glass_tilted_left", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔎": { - name: "magnifying glass tilted right", - slug: "magnifying_glass_tilted_right", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🕯️": { - name: "candle", - slug: "candle", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "💡": { - name: "light bulb", - slug: "light_bulb", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔦": { - name: "flashlight", - slug: "flashlight", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏮": { - name: "red paper lantern", - slug: "red_paper_lantern", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪔": { - name: "diya lamp", - slug: "diya_lamp", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "📔": { - name: "notebook with decorative cover", - slug: "notebook_with_decorative_cover", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📕": { - name: "closed book", - slug: "closed_book", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📖": { - name: "open book", - slug: "open_book", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📗": { - name: "green book", - slug: "green_book", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📘": { - name: "blue book", - slug: "blue_book", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📙": { - name: "orange book", - slug: "orange_book", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📚": { - name: "books", - slug: "books", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📓": { - name: "notebook", - slug: "notebook", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📒": { - name: "ledger", - slug: "ledger", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📃": { - name: "page with curl", - slug: "page_with_curl", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📜": { - name: "scroll", - slug: "scroll", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📄": { - name: "page facing up", - slug: "page_facing_up", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📰": { - name: "newspaper", - slug: "newspaper", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗞️": { - name: "rolled-up newspaper", - slug: "rolled_up_newspaper", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📑": { - name: "bookmark tabs", - slug: "bookmark_tabs", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔖": { - name: "bookmark", - slug: "bookmark", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏷️": { - name: "label", - slug: "label", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "💰": { - name: "money bag", - slug: "money_bag", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪙": { - name: "coin", - slug: "coin", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "💴": { - name: "yen banknote", - slug: "yen_banknote", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💵": { - name: "dollar banknote", - slug: "dollar_banknote", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💶": { - name: "euro banknote", - slug: "euro_banknote", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💷": { - name: "pound banknote", - slug: "pound_banknote", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "💸": { - name: "money with wings", - slug: "money_with_wings", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💳": { - name: "credit card", - slug: "credit_card", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🧾": { - name: "receipt", - slug: "receipt", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "💹": { - name: "chart increasing with yen", - slug: "chart_increasing_with_yen", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✉️": { - name: "envelope", - slug: "envelope", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📧": { - name: "e-mail", - slug: "e_mail", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📨": { - name: "incoming envelope", - slug: "incoming_envelope", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📩": { - name: "envelope with arrow", - slug: "envelope_with_arrow", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📤": { - name: "outbox tray", - slug: "outbox_tray", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📥": { - name: "inbox tray", - slug: "inbox_tray", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📦": { - name: "package", - slug: "package", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📫": { - name: "closed mailbox with raised flag", - slug: "closed_mailbox_with_raised_flag", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📪": { - name: "closed mailbox with lowered flag", - slug: "closed_mailbox_with_lowered_flag", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📬": { - name: "open mailbox with raised flag", - slug: "open_mailbox_with_raised_flag", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📭": { - name: "open mailbox with lowered flag", - slug: "open_mailbox_with_lowered_flag", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📮": { - name: "postbox", - slug: "postbox", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗳️": { - name: "ballot box with ballot", - slug: "ballot_box_with_ballot", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "✏️": { - name: "pencil", - slug: "pencil", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✒️": { - name: "black nib", - slug: "black_nib", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🖋️": { - name: "fountain pen", - slug: "fountain_pen", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🖊️": { - name: "pen", - slug: "pen", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🖌️": { - name: "paintbrush", - slug: "paintbrush", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🖍️": { - name: "crayon", - slug: "crayon", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📝": { - name: "memo", - slug: "memo", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💼": { - name: "briefcase", - slug: "briefcase", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📁": { - name: "file folder", - slug: "file_folder", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📂": { - name: "open file folder", - slug: "open_file_folder", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗂️": { - name: "card index dividers", - slug: "card_index_dividers", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📅": { - name: "calendar", - slug: "calendar", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📆": { - name: "tear-off calendar", - slug: "tear_off_calendar", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗒️": { - name: "spiral notepad", - slug: "spiral_notepad", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🗓️": { - name: "spiral calendar", - slug: "spiral_calendar", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📇": { - name: "card index", - slug: "card_index", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📈": { - name: "chart increasing", - slug: "chart_increasing", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📉": { - name: "chart decreasing", - slug: "chart_decreasing", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📊": { - name: "bar chart", - slug: "bar_chart", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📋": { - name: "clipboard", - slug: "clipboard", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📌": { - name: "pushpin", - slug: "pushpin", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📍": { - name: "round pushpin", - slug: "round_pushpin", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📎": { - name: "paperclip", - slug: "paperclip", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🖇️": { - name: "linked paperclips", - slug: "linked_paperclips", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "📏": { - name: "straight ruler", - slug: "straight_ruler", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📐": { - name: "triangular ruler", - slug: "triangular_ruler", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✂️": { - name: "scissors", - slug: "scissors", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗃️": { - name: "card file box", - slug: "card_file_box", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🗄️": { - name: "file cabinet", - slug: "file_cabinet", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🗑️": { - name: "wastebasket", - slug: "wastebasket", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🔒": { - name: "locked", - slug: "locked", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔓": { - name: "unlocked", - slug: "unlocked", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔏": { - name: "locked with pen", - slug: "locked_with_pen", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔐": { - name: "locked with key", - slug: "locked_with_key", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔑": { - name: "key", - slug: "key", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🗝️": { - name: "old key", - slug: "old_key", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🔨": { - name: "hammer", - slug: "hammer", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪓": { - name: "axe", - slug: "axe", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "⛏️": { - name: "pick", - slug: "pick", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⚒️": { - name: "hammer and pick", - slug: "hammer_and_pick", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛠️": { - name: "hammer and wrench", - slug: "hammer_and_wrench", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🗡️": { - name: "dagger", - slug: "dagger", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⚔️": { - name: "crossed swords", - slug: "crossed_swords", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔫": { - name: "water pistol", - slug: "water_pistol", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪃": { - name: "boomerang", - slug: "boomerang", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🏹": { - name: "bow and arrow", - slug: "bow_and_arrow", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛡️": { - name: "shield", - slug: "shield", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🪚": { - name: "carpentry saw", - slug: "carpentry_saw", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🔧": { - name: "wrench", - slug: "wrench", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪛": { - name: "screwdriver", - slug: "screwdriver", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🔩": { - name: "nut and bolt", - slug: "nut_and_bolt", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚙️": { - name: "gear", - slug: "gear", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🗜️": { - name: "clamp", - slug: "clamp", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⚖️": { - name: "balance scale", - slug: "balance_scale", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🦯": { - name: "white cane", - slug: "white_cane", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🔗": { - name: "link", - slug: "link", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛓️": { - name: "chains", - slug: "chains", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🪝": { - name: "hook", - slug: "hook", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧰": { - name: "toolbox", - slug: "toolbox", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧲": { - name: "magnet", - slug: "magnet", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪜": { - name: "ladder", - slug: "ladder", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "⚗️": { - name: "alembic", - slug: "alembic", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🧪": { - name: "test tube", - slug: "test_tube", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧫": { - name: "petri dish", - slug: "petri_dish", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧬": { - name: "dna", - slug: "dna", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🔬": { - name: "microscope", - slug: "microscope", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔭": { - name: "telescope", - slug: "telescope", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "📡": { - name: "satellite antenna", - slug: "satellite_antenna", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💉": { - name: "syringe", - slug: "syringe", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🩸": { - name: "drop of blood", - slug: "drop_of_blood", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "💊": { - name: "pill", - slug: "pill", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🩹": { - name: "adhesive bandage", - slug: "adhesive_bandage", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🩺": { - name: "stethoscope", - slug: "stethoscope", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🚪": { - name: "door", - slug: "door", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛗": { - name: "elevator", - slug: "elevator", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪞": { - name: "mirror", - slug: "mirror", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪟": { - name: "window", - slug: "window", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🛏️": { - name: "bed", - slug: "bed", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🛋️": { - name: "couch and lamp", - slug: "couch_and_lamp", - group: "Objects", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🪑": { - name: "chair", - slug: "chair", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🚽": { - name: "toilet", - slug: "toilet", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪠": { - name: "plunger", - slug: "plunger", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🚿": { - name: "shower", - slug: "shower", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛁": { - name: "bathtub", - slug: "bathtub", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🪤": { - name: "mouse trap", - slug: "mouse_trap", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🪒": { - name: "razor", - slug: "razor", - group: "Objects", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🧴": { - name: "lotion bottle", - slug: "lotion_bottle", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧷": { - name: "safety pin", - slug: "safety_pin", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧹": { - name: "broom", - slug: "broom", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧺": { - name: "basket", - slug: "basket", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧻": { - name: "roll of paper", - slug: "roll_of_paper", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪣": { - name: "bucket", - slug: "bucket", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧼": { - name: "soap", - slug: "soap", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🪥": { - name: "toothbrush", - slug: "toothbrush", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🧽": { - name: "sponge", - slug: "sponge", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🧯": { - name: "fire extinguisher", - slug: "fire_extinguisher", - group: "Objects", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🛒": { - name: "shopping cart", - slug: "shopping_cart", - group: "Objects", - emoji_version: "3.0", - unicode_version: "3.0", - skin_tone_support: false -}, - "🚬": { - name: "cigarette", - slug: "cigarette", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚰️": { - name: "coffin", - slug: "coffin", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🪦": { - name: "headstone", - slug: "headstone", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "⚱️": { - name: "funeral urn", - slug: "funeral_urn", - group: "Objects", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🗿": { - name: "moai", - slug: "moai", - group: "Objects", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🪧": { - name: "placard", - slug: "placard", - group: "Objects", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🏧": { - name: "ATM sign", - slug: "atm_sign", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚮": { - name: "litter in bin sign", - slug: "litter_in_bin_sign", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚰": { - name: "potable water", - slug: "potable_water", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "♿": { - name: "wheelchair symbol", - slug: "wheelchair_symbol", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚹": { - name: "men’s room", - slug: "men_s_room", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚺": { - name: "women’s room", - slug: "women_s_room", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚻": { - name: "restroom", - slug: "restroom", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚼": { - name: "baby symbol", - slug: "baby_symbol", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚾": { - name: "water closet", - slug: "water_closet", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛂": { - name: "passport control", - slug: "passport_control", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛃": { - name: "customs", - slug: "customs", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛄": { - name: "baggage claim", - slug: "baggage_claim", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🛅": { - name: "left luggage", - slug: "left_luggage", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⚠️": { - name: "warning", - slug: "warning", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚸": { - name: "children crossing", - slug: "children_crossing", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⛔": { - name: "no entry", - slug: "no_entry", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚫": { - name: "prohibited", - slug: "prohibited", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚳": { - name: "no bicycles", - slug: "no_bicycles", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚭": { - name: "no smoking", - slug: "no_smoking", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚯": { - name: "no littering", - slug: "no_littering", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚱": { - name: "non-potable water", - slug: "non_potable_water", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🚷": { - name: "no pedestrians", - slug: "no_pedestrians", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "📵": { - name: "no mobile phones", - slug: "no_mobile_phones", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔞": { - name: "no one under eighteen", - slug: "no_one_under_eighteen", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☢️": { - name: "radioactive", - slug: "radioactive", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "☣️": { - name: "biohazard", - slug: "biohazard", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⬆️": { - name: "up arrow", - slug: "up_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↗️": { - name: "up-right arrow", - slug: "up_right_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➡️": { - name: "right arrow", - slug: "right_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↘️": { - name: "down-right arrow", - slug: "down_right_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⬇️": { - name: "down arrow", - slug: "down_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↙️": { - name: "down-left arrow", - slug: "down_left_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⬅️": { - name: "left arrow", - slug: "left_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↖️": { - name: "up-left arrow", - slug: "up_left_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↕️": { - name: "up-down arrow", - slug: "up_down_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↔️": { - name: "left-right arrow", - slug: "left_right_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↩️": { - name: "right arrow curving left", - slug: "right_arrow_curving_left", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "↪️": { - name: "left arrow curving right", - slug: "left_arrow_curving_right", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⤴️": { - name: "right arrow curving up", - slug: "right_arrow_curving_up", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⤵️": { - name: "right arrow curving down", - slug: "right_arrow_curving_down", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔃": { - name: "clockwise vertical arrows", - slug: "clockwise_vertical_arrows", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔄": { - name: "counterclockwise arrows button", - slug: "counterclockwise_arrows_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔙": { - name: "BACK arrow", - slug: "back_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔚": { - name: "END arrow", - slug: "end_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔛": { - name: "ON! arrow", - slug: "on_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔜": { - name: "SOON arrow", - slug: "soon_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔝": { - name: "TOP arrow", - slug: "top_arrow", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🛐": { - name: "place of worship", - slug: "place_of_worship", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "⚛️": { - name: "atom symbol", - slug: "atom_symbol", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🕉️": { - name: "om", - slug: "om", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "✡️": { - name: "star of David", - slug: "star_of_david", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☸️": { - name: "wheel of dharma", - slug: "wheel_of_dharma", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☯️": { - name: "yin yang", - slug: "yin_yang", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "✝️": { - name: "latin cross", - slug: "latin_cross", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☦️": { - name: "orthodox cross", - slug: "orthodox_cross", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "☪️": { - name: "star and crescent", - slug: "star_and_crescent", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "☮️": { - name: "peace symbol", - slug: "peace_symbol", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🕎": { - name: "menorah", - slug: "menorah", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔯": { - name: "dotted six-pointed star", - slug: "dotted_six_pointed_star", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♈": { - name: "Aries", - slug: "aries", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♉": { - name: "Taurus", - slug: "taurus", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♊": { - name: "Gemini", - slug: "gemini", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♋": { - name: "Cancer", - slug: "cancer", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♌": { - name: "Leo", - slug: "leo", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♍": { - name: "Virgo", - slug: "virgo", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♎": { - name: "Libra", - slug: "libra", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♏": { - name: "Scorpio", - slug: "scorpio", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♐": { - name: "Sagittarius", - slug: "sagittarius", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♑": { - name: "Capricorn", - slug: "capricorn", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♒": { - name: "Aquarius", - slug: "aquarius", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♓": { - name: "Pisces", - slug: "pisces", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⛎": { - name: "Ophiuchus", - slug: "ophiuchus", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔀": { - name: "shuffle tracks button", - slug: "shuffle_tracks_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔁": { - name: "repeat button", - slug: "repeat_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔂": { - name: "repeat single button", - slug: "repeat_single_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "▶️": { - name: "play button", - slug: "play_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏩": { - name: "fast-forward button", - slug: "fast_forward_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏭️": { - name: "next track button", - slug: "next_track_button", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⏯️": { - name: "play or pause button", - slug: "play_or_pause_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "◀️": { - name: "reverse button", - slug: "reverse_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏪": { - name: "fast reverse button", - slug: "fast_reverse_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏮️": { - name: "last track button", - slug: "last_track_button", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🔼": { - name: "upwards button", - slug: "upwards_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏫": { - name: "fast up button", - slug: "fast_up_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔽": { - name: "downwards button", - slug: "downwards_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏬": { - name: "fast down button", - slug: "fast_down_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⏸️": { - name: "pause button", - slug: "pause_button", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⏹️": { - name: "stop button", - slug: "stop_button", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⏺️": { - name: "record button", - slug: "record_button", - group: "Symbols", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "⏏️": { - name: "eject button", - slug: "eject_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🎦": { - name: "cinema", - slug: "cinema", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔅": { - name: "dim button", - slug: "dim_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔆": { - name: "bright button", - slug: "bright_button", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "📶": { - name: "antenna bars", - slug: "antenna_bars", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📳": { - name: "vibration mode", - slug: "vibration_mode", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📴": { - name: "mobile phone off", - slug: "mobile_phone_off", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♀️": { - name: "female sign", - slug: "female_sign", - group: "Symbols", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "♂️": { - name: "male sign", - slug: "male_sign", - group: "Symbols", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "⚧️": { - name: "transgender symbol", - slug: "transgender_symbol", - group: "Symbols", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "✖️": { - name: "multiply", - slug: "multiply", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➕": { - name: "plus", - slug: "plus", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➖": { - name: "minus", - slug: "minus", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➗": { - name: "divide", - slug: "divide", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "♾️": { - name: "infinity", - slug: "infinity", - group: "Symbols", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "‼️": { - name: "double exclamation mark", - slug: "double_exclamation_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⁉️": { - name: "exclamation question mark", - slug: "exclamation_question_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❓": { - name: "red question mark", - slug: "red_question_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❔": { - name: "white question mark", - slug: "white_question_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❕": { - name: "white exclamation mark", - slug: "white_exclamation_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❗": { - name: "red exclamation mark", - slug: "red_exclamation_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "〰️": { - name: "wavy dash", - slug: "wavy_dash", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💱": { - name: "currency exchange", - slug: "currency_exchange", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💲": { - name: "heavy dollar sign", - slug: "heavy_dollar_sign", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚕️": { - name: "medical symbol", - slug: "medical_symbol", - group: "Symbols", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "♻️": { - name: "recycling symbol", - slug: "recycling_symbol", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚜️": { - name: "fleur-de-lis", - slug: "fleur_de_lis", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🔱": { - name: "trident emblem", - slug: "trident_emblem", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "📛": { - name: "name badge", - slug: "name_badge", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔰": { - name: "Japanese symbol for beginner", - slug: "japanese_symbol_for_beginner", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⭕": { - name: "hollow red circle", - slug: "hollow_red_circle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✅": { - name: "check mark button", - slug: "check_mark_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "☑️": { - name: "check box with check", - slug: "check_box_with_check", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✔️": { - name: "check mark", - slug: "check_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❌": { - name: "cross mark", - slug: "cross_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❎": { - name: "cross mark button", - slug: "cross_mark_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➰": { - name: "curly loop", - slug: "curly_loop", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "➿": { - name: "double curly loop", - slug: "double_curly_loop", - group: "Symbols", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "〽️": { - name: "part alternation mark", - slug: "part_alternation_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✳️": { - name: "eight-spoked asterisk", - slug: "eight_spoked_asterisk", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "✴️": { - name: "eight-pointed star", - slug: "eight_pointed_star", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "❇️": { - name: "sparkle", - slug: "sparkle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "©️": { - name: "copyright", - slug: "copyright", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "®️": { - name: "registered", - slug: "registered", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "™️": { - name: "trade mark", - slug: "trade_mark", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "#️⃣": { - name: "keycap #", - slug: "keycap_", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "*️⃣": { - name: "keycap *", - slug: "keycap_", - group: "Symbols", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "0️⃣": { - name: "keycap 0", - slug: "keycap_0", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "1️⃣": { - name: "keycap 1", - slug: "keycap_1", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "2️⃣": { - name: "keycap 2", - slug: "keycap_2", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "3️⃣": { - name: "keycap 3", - slug: "keycap_3", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "4️⃣": { - name: "keycap 4", - slug: "keycap_4", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "5️⃣": { - name: "keycap 5", - slug: "keycap_5", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "6️⃣": { - name: "keycap 6", - slug: "keycap_6", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "7️⃣": { - name: "keycap 7", - slug: "keycap_7", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "8️⃣": { - name: "keycap 8", - slug: "keycap_8", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "9️⃣": { - name: "keycap 9", - slug: "keycap_9", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔟": { - name: "keycap 10", - slug: "keycap_10", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔠": { - name: "input latin uppercase", - slug: "input_latin_uppercase", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔡": { - name: "input latin lowercase", - slug: "input_latin_lowercase", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔢": { - name: "input numbers", - slug: "input_numbers", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔣": { - name: "input symbols", - slug: "input_symbols", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔤": { - name: "input latin letters", - slug: "input_latin_letters", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🅰️": { - name: "A button (blood type)", - slug: "a_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆎": { - name: "AB button (blood type)", - slug: "ab_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🅱️": { - name: "B button (blood type)", - slug: "b_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆑": { - name: "CL button", - slug: "cl_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆒": { - name: "COOL button", - slug: "cool_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆓": { - name: "FREE button", - slug: "free_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "ℹ️": { - name: "information", - slug: "information", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆔": { - name: "ID button", - slug: "id_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "Ⓜ️": { - name: "circled M", - slug: "circled_m", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆕": { - name: "NEW button", - slug: "new_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆖": { - name: "NG button", - slug: "ng_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🅾️": { - name: "O button (blood type)", - slug: "o_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆗": { - name: "OK button", - slug: "ok_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🅿️": { - name: "P button", - slug: "p_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆘": { - name: "SOS button", - slug: "sos_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆙": { - name: "UP! button", - slug: "up_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🆚": { - name: "VS button", - slug: "vs_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈁": { - name: "Japanese “here” button", - slug: "japanese_here_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈂️": { - name: "Japanese “service charge” button", - slug: "japanese_service_charge_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈷️": { - name: "Japanese “monthly amount” button", - slug: "japanese_monthly_amount_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈶": { - name: "Japanese “not free of charge” button", - slug: "japanese_not_free_of_charge_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈯": { - name: "Japanese “reserved” button", - slug: "japanese_reserved_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🉐": { - name: "Japanese “bargain” button", - slug: "japanese_bargain_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈹": { - name: "Japanese “discount” button", - slug: "japanese_discount_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈚": { - name: "Japanese “free of charge” button", - slug: "japanese_free_of_charge_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈲": { - name: "Japanese “prohibited” button", - slug: "japanese_prohibited_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🉑": { - name: "Japanese “acceptable” button", - slug: "japanese_acceptable_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈸": { - name: "Japanese “application” button", - slug: "japanese_application_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈴": { - name: "Japanese “passing grade” button", - slug: "japanese_passing_grade_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈳": { - name: "Japanese “vacancy” button", - slug: "japanese_vacancy_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "㊗️": { - name: "Japanese “congratulations” button", - slug: "japanese_congratulations_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "㊙️": { - name: "Japanese “secret” button", - slug: "japanese_secret_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈺": { - name: "Japanese “open for business” button", - slug: "japanese_open_for_business_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🈵": { - name: "Japanese “no vacancy” button", - slug: "japanese_no_vacancy_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔴": { - name: "red circle", - slug: "red_circle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🟠": { - name: "orange circle", - slug: "orange_circle", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟡": { - name: "yellow circle", - slug: "yellow_circle", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟢": { - name: "green circle", - slug: "green_circle", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🔵": { - name: "blue circle", - slug: "blue_circle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🟣": { - name: "purple circle", - slug: "purple_circle", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟤": { - name: "brown circle", - slug: "brown_circle", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "⚫": { - name: "black circle", - slug: "black_circle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⚪": { - name: "white circle", - slug: "white_circle", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🟥": { - name: "red square", - slug: "red_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟧": { - name: "orange square", - slug: "orange_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟨": { - name: "yellow square", - slug: "yellow_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟩": { - name: "green square", - slug: "green_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟦": { - name: "blue square", - slug: "blue_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟪": { - name: "purple square", - slug: "purple_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "🟫": { - name: "brown square", - slug: "brown_square", - group: "Symbols", - emoji_version: "12.0", - unicode_version: "12.0", - skin_tone_support: false -}, - "⬛": { - name: "black large square", - slug: "black_large_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "⬜": { - name: "white large square", - slug: "white_large_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "◼️": { - name: "black medium square", - slug: "black_medium_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "◻️": { - name: "white medium square", - slug: "white_medium_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "◾": { - name: "black medium-small square", - slug: "black_medium_small_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "◽": { - name: "white medium-small square", - slug: "white_medium_small_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "▪️": { - name: "black small square", - slug: "black_small_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "▫️": { - name: "white small square", - slug: "white_small_square", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔶": { - name: "large orange diamond", - slug: "large_orange_diamond", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔷": { - name: "large blue diamond", - slug: "large_blue_diamond", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔸": { - name: "small orange diamond", - slug: "small_orange_diamond", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔹": { - name: "small blue diamond", - slug: "small_blue_diamond", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔺": { - name: "red triangle pointed up", - slug: "red_triangle_pointed_up", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔻": { - name: "red triangle pointed down", - slug: "red_triangle_pointed_down", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "💠": { - name: "diamond with a dot", - slug: "diamond_with_a_dot", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔘": { - name: "radio button", - slug: "radio_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔳": { - name: "white square button", - slug: "white_square_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🔲": { - name: "black square button", - slug: "black_square_button", - group: "Symbols", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏁": { - name: "chequered flag", - slug: "chequered_flag", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🚩": { - name: "triangular flag", - slug: "triangular_flag", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🎌": { - name: "crossed flags", - slug: "crossed_flags", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🏴": { - name: "black flag", - slug: "black_flag", - group: "Flags", - emoji_version: "1.0", - unicode_version: "1.0", - skin_tone_support: false -}, - "🏳️": { - name: "white flag", - slug: "white_flag", - group: "Flags", - emoji_version: "0.7", - unicode_version: "0.7", - skin_tone_support: false -}, - "🏳️‍🌈": { - name: "rainbow flag", - slug: "rainbow_flag", - group: "Flags", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🏳️‍⚧️": { - name: "transgender flag", - slug: "transgender_flag", - group: "Flags", - emoji_version: "13.0", - unicode_version: "13.0", - skin_tone_support: false -}, - "🏴‍☠️": { - name: "pirate flag", - slug: "pirate_flag", - group: "Flags", - emoji_version: "11.0", - unicode_version: "11.0", - skin_tone_support: false -}, - "🇦🇨": { - name: "flag Ascension Island", - slug: "flag_ascension_island", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇩": { - name: "flag Andorra", - slug: "flag_andorra", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇪": { - name: "flag United Arab Emirates", - slug: "flag_united_arab_emirates", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇫": { - name: "flag Afghanistan", - slug: "flag_afghanistan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇬": { - name: "flag Antigua & Barbuda", - slug: "flag_antigua_barbuda", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇮": { - name: "flag Anguilla", - slug: "flag_anguilla", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇱": { - name: "flag Albania", - slug: "flag_albania", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇲": { - name: "flag Armenia", - slug: "flag_armenia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇴": { - name: "flag Angola", - slug: "flag_angola", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇶": { - name: "flag Antarctica", - slug: "flag_antarctica", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇷": { - name: "flag Argentina", - slug: "flag_argentina", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇸": { - name: "flag American Samoa", - slug: "flag_american_samoa", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇹": { - name: "flag Austria", - slug: "flag_austria", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇺": { - name: "flag Australia", - slug: "flag_australia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇼": { - name: "flag Aruba", - slug: "flag_aruba", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇽": { - name: "flag Åland Islands", - slug: "flag_aland_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇦🇿": { - name: "flag Azerbaijan", - slug: "flag_azerbaijan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇦": { - name: "flag Bosnia & Herzegovina", - slug: "flag_bosnia_herzegovina", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇧": { - name: "flag Barbados", - slug: "flag_barbados", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇩": { - name: "flag Bangladesh", - slug: "flag_bangladesh", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇪": { - name: "flag Belgium", - slug: "flag_belgium", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇫": { - name: "flag Burkina Faso", - slug: "flag_burkina_faso", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇬": { - name: "flag Bulgaria", - slug: "flag_bulgaria", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇭": { - name: "flag Bahrain", - slug: "flag_bahrain", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇮": { - name: "flag Burundi", - slug: "flag_burundi", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇯": { - name: "flag Benin", - slug: "flag_benin", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇱": { - name: "flag St. Barthélemy", - slug: "flag_st_barthelemy", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇲": { - name: "flag Bermuda", - slug: "flag_bermuda", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇳": { - name: "flag Brunei", - slug: "flag_brunei", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇴": { - name: "flag Bolivia", - slug: "flag_bolivia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇶": { - name: "flag Caribbean Netherlands", - slug: "flag_caribbean_netherlands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇷": { - name: "flag Brazil", - slug: "flag_brazil", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇸": { - name: "flag Bahamas", - slug: "flag_bahamas", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇹": { - name: "flag Bhutan", - slug: "flag_bhutan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇻": { - name: "flag Bouvet Island", - slug: "flag_bouvet_island", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇼": { - name: "flag Botswana", - slug: "flag_botswana", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇾": { - name: "flag Belarus", - slug: "flag_belarus", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇧🇿": { - name: "flag Belize", - slug: "flag_belize", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇦": { - name: "flag Canada", - slug: "flag_canada", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇨": { - name: "flag Cocos (Keeling) Islands", - slug: "flag_cocos_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇩": { - name: "flag Congo - Kinshasa", - slug: "flag_congo_kinshasa", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇫": { - name: "flag Central African Republic", - slug: "flag_central_african_republic", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇬": { - name: "flag Congo - Brazzaville", - slug: "flag_congo_brazzaville", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇭": { - name: "flag Switzerland", - slug: "flag_switzerland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇮": { - name: "flag Côte d’Ivoire", - slug: "flag_cote_d_ivoire", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇰": { - name: "flag Cook Islands", - slug: "flag_cook_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇱": { - name: "flag Chile", - slug: "flag_chile", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇲": { - name: "flag Cameroon", - slug: "flag_cameroon", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇳": { - name: "flag China", - slug: "flag_china", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇨🇴": { - name: "flag Colombia", - slug: "flag_colombia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇵": { - name: "flag Clipperton Island", - slug: "flag_clipperton_island", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇷": { - name: "flag Costa Rica", - slug: "flag_costa_rica", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇺": { - name: "flag Cuba", - slug: "flag_cuba", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇻": { - name: "flag Cape Verde", - slug: "flag_cape_verde", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇼": { - name: "flag Curaçao", - slug: "flag_curacao", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇽": { - name: "flag Christmas Island", - slug: "flag_christmas_island", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇾": { - name: "flag Cyprus", - slug: "flag_cyprus", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇨🇿": { - name: "flag Czechia", - slug: "flag_czechia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇪": { - name: "flag Germany", - slug: "flag_germany", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇩🇬": { - name: "flag Diego Garcia", - slug: "flag_diego_garcia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇯": { - name: "flag Djibouti", - slug: "flag_djibouti", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇰": { - name: "flag Denmark", - slug: "flag_denmark", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇲": { - name: "flag Dominica", - slug: "flag_dominica", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇴": { - name: "flag Dominican Republic", - slug: "flag_dominican_republic", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇩🇿": { - name: "flag Algeria", - slug: "flag_algeria", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇦": { - name: "flag Ceuta & Melilla", - slug: "flag_ceuta_melilla", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇨": { - name: "flag Ecuador", - slug: "flag_ecuador", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇪": { - name: "flag Estonia", - slug: "flag_estonia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇬": { - name: "flag Egypt", - slug: "flag_egypt", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇭": { - name: "flag Western Sahara", - slug: "flag_western_sahara", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇷": { - name: "flag Eritrea", - slug: "flag_eritrea", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇸": { - name: "flag Spain", - slug: "flag_spain", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇪🇹": { - name: "flag Ethiopia", - slug: "flag_ethiopia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇪🇺": { - name: "flag European Union", - slug: "flag_european_union", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇮": { - name: "flag Finland", - slug: "flag_finland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇯": { - name: "flag Fiji", - slug: "flag_fiji", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇰": { - name: "flag Falkland Islands", - slug: "flag_falkland_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇲": { - name: "flag Micronesia", - slug: "flag_micronesia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇴": { - name: "flag Faroe Islands", - slug: "flag_faroe_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇫🇷": { - name: "flag France", - slug: "flag_france", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇬🇦": { - name: "flag Gabon", - slug: "flag_gabon", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇧": { - name: "flag United Kingdom", - slug: "flag_united_kingdom", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇬🇩": { - name: "flag Grenada", - slug: "flag_grenada", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇪": { - name: "flag Georgia", - slug: "flag_georgia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇫": { - name: "flag French Guiana", - slug: "flag_french_guiana", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇬": { - name: "flag Guernsey", - slug: "flag_guernsey", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇭": { - name: "flag Ghana", - slug: "flag_ghana", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇮": { - name: "flag Gibraltar", - slug: "flag_gibraltar", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇱": { - name: "flag Greenland", - slug: "flag_greenland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇲": { - name: "flag Gambia", - slug: "flag_gambia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇳": { - name: "flag Guinea", - slug: "flag_guinea", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇵": { - name: "flag Guadeloupe", - slug: "flag_guadeloupe", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇶": { - name: "flag Equatorial Guinea", - slug: "flag_equatorial_guinea", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇷": { - name: "flag Greece", - slug: "flag_greece", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇸": { - name: "flag South Georgia & South Sandwich Islands", - slug: "flag_south_georgia_south_sandwich_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇹": { - name: "flag Guatemala", - slug: "flag_guatemala", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇺": { - name: "flag Guam", - slug: "flag_guam", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇼": { - name: "flag Guinea-Bissau", - slug: "flag_guinea_bissau", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇬🇾": { - name: "flag Guyana", - slug: "flag_guyana", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇰": { - name: "flag Hong Kong SAR China", - slug: "flag_hong_kong_sar_china", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇲": { - name: "flag Heard & McDonald Islands", - slug: "flag_heard_mcdonald_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇳": { - name: "flag Honduras", - slug: "flag_honduras", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇷": { - name: "flag Croatia", - slug: "flag_croatia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇹": { - name: "flag Haiti", - slug: "flag_haiti", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇭🇺": { - name: "flag Hungary", - slug: "flag_hungary", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇨": { - name: "flag Canary Islands", - slug: "flag_canary_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇩": { - name: "flag Indonesia", - slug: "flag_indonesia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇪": { - name: "flag Ireland", - slug: "flag_ireland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇱": { - name: "flag Israel", - slug: "flag_israel", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇲": { - name: "flag Isle of Man", - slug: "flag_isle_of_man", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇳": { - name: "flag India", - slug: "flag_india", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇴": { - name: "flag British Indian Ocean Territory", - slug: "flag_british_indian_ocean_territory", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇶": { - name: "flag Iraq", - slug: "flag_iraq", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇷": { - name: "flag Iran", - slug: "flag_iran", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇸": { - name: "flag Iceland", - slug: "flag_iceland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇮🇹": { - name: "flag Italy", - slug: "flag_italy", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇯🇪": { - name: "flag Jersey", - slug: "flag_jersey", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇯🇲": { - name: "flag Jamaica", - slug: "flag_jamaica", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇯🇴": { - name: "flag Jordan", - slug: "flag_jordan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇯🇵": { - name: "flag Japan", - slug: "flag_japan", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇰🇪": { - name: "flag Kenya", - slug: "flag_kenya", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇬": { - name: "flag Kyrgyzstan", - slug: "flag_kyrgyzstan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇭": { - name: "flag Cambodia", - slug: "flag_cambodia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇮": { - name: "flag Kiribati", - slug: "flag_kiribati", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇲": { - name: "flag Comoros", - slug: "flag_comoros", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇳": { - name: "flag St. Kitts & Nevis", - slug: "flag_st_kitts_nevis", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇵": { - name: "flag North Korea", - slug: "flag_north_korea", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇷": { - name: "flag South Korea", - slug: "flag_south_korea", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇰🇼": { - name: "flag Kuwait", - slug: "flag_kuwait", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇾": { - name: "flag Cayman Islands", - slug: "flag_cayman_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇰🇿": { - name: "flag Kazakhstan", - slug: "flag_kazakhstan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇦": { - name: "flag Laos", - slug: "flag_laos", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇧": { - name: "flag Lebanon", - slug: "flag_lebanon", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇨": { - name: "flag St. Lucia", - slug: "flag_st_lucia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇮": { - name: "flag Liechtenstein", - slug: "flag_liechtenstein", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇰": { - name: "flag Sri Lanka", - slug: "flag_sri_lanka", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇷": { - name: "flag Liberia", - slug: "flag_liberia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇸": { - name: "flag Lesotho", - slug: "flag_lesotho", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇹": { - name: "flag Lithuania", - slug: "flag_lithuania", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇺": { - name: "flag Luxembourg", - slug: "flag_luxembourg", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇻": { - name: "flag Latvia", - slug: "flag_latvia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇱🇾": { - name: "flag Libya", - slug: "flag_libya", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇦": { - name: "flag Morocco", - slug: "flag_morocco", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇨": { - name: "flag Monaco", - slug: "flag_monaco", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇩": { - name: "flag Moldova", - slug: "flag_moldova", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇪": { - name: "flag Montenegro", - slug: "flag_montenegro", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇫": { - name: "flag St. Martin", - slug: "flag_st_martin", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇬": { - name: "flag Madagascar", - slug: "flag_madagascar", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇭": { - name: "flag Marshall Islands", - slug: "flag_marshall_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇰": { - name: "flag North Macedonia", - slug: "flag_north_macedonia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇱": { - name: "flag Mali", - slug: "flag_mali", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇲": { - name: "flag Myanmar (Burma)", - slug: "flag_myanmar", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇳": { - name: "flag Mongolia", - slug: "flag_mongolia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇴": { - name: "flag Macao SAR China", - slug: "flag_macao_sar_china", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇵": { - name: "flag Northern Mariana Islands", - slug: "flag_northern_mariana_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇶": { - name: "flag Martinique", - slug: "flag_martinique", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇷": { - name: "flag Mauritania", - slug: "flag_mauritania", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇸": { - name: "flag Montserrat", - slug: "flag_montserrat", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇹": { - name: "flag Malta", - slug: "flag_malta", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇺": { - name: "flag Mauritius", - slug: "flag_mauritius", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇻": { - name: "flag Maldives", - slug: "flag_maldives", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇼": { - name: "flag Malawi", - slug: "flag_malawi", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇽": { - name: "flag Mexico", - slug: "flag_mexico", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇾": { - name: "flag Malaysia", - slug: "flag_malaysia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇲🇿": { - name: "flag Mozambique", - slug: "flag_mozambique", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇦": { - name: "flag Namibia", - slug: "flag_namibia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇨": { - name: "flag New Caledonia", - slug: "flag_new_caledonia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇪": { - name: "flag Niger", - slug: "flag_niger", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇫": { - name: "flag Norfolk Island", - slug: "flag_norfolk_island", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇬": { - name: "flag Nigeria", - slug: "flag_nigeria", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇮": { - name: "flag Nicaragua", - slug: "flag_nicaragua", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇱": { - name: "flag Netherlands", - slug: "flag_netherlands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇴": { - name: "flag Norway", - slug: "flag_norway", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇵": { - name: "flag Nepal", - slug: "flag_nepal", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇷": { - name: "flag Nauru", - slug: "flag_nauru", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇺": { - name: "flag Niue", - slug: "flag_niue", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇳🇿": { - name: "flag New Zealand", - slug: "flag_new_zealand", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇴🇲": { - name: "flag Oman", - slug: "flag_oman", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇦": { - name: "flag Panama", - slug: "flag_panama", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇪": { - name: "flag Peru", - slug: "flag_peru", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇫": { - name: "flag French Polynesia", - slug: "flag_french_polynesia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇬": { - name: "flag Papua New Guinea", - slug: "flag_papua_new_guinea", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇭": { - name: "flag Philippines", - slug: "flag_philippines", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇰": { - name: "flag Pakistan", - slug: "flag_pakistan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇱": { - name: "flag Poland", - slug: "flag_poland", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇲": { - name: "flag St. Pierre & Miquelon", - slug: "flag_st_pierre_miquelon", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇳": { - name: "flag Pitcairn Islands", - slug: "flag_pitcairn_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇷": { - name: "flag Puerto Rico", - slug: "flag_puerto_rico", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇸": { - name: "flag Palestinian Territories", - slug: "flag_palestinian_territories", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇹": { - name: "flag Portugal", - slug: "flag_portugal", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇼": { - name: "flag Palau", - slug: "flag_palau", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇵🇾": { - name: "flag Paraguay", - slug: "flag_paraguay", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇶🇦": { - name: "flag Qatar", - slug: "flag_qatar", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇷🇪": { - name: "flag Réunion", - slug: "flag_reunion", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇷🇴": { - name: "flag Romania", - slug: "flag_romania", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇷🇸": { - name: "flag Serbia", - slug: "flag_serbia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇷🇺": { - name: "flag Russia", - slug: "flag_russia", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇷🇼": { - name: "flag Rwanda", - slug: "flag_rwanda", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇦": { - name: "flag Saudi Arabia", - slug: "flag_saudi_arabia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇧": { - name: "flag Solomon Islands", - slug: "flag_solomon_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇨": { - name: "flag Seychelles", - slug: "flag_seychelles", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇩": { - name: "flag Sudan", - slug: "flag_sudan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇪": { - name: "flag Sweden", - slug: "flag_sweden", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇬": { - name: "flag Singapore", - slug: "flag_singapore", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇭": { - name: "flag St. Helena", - slug: "flag_st_helena", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇮": { - name: "flag Slovenia", - slug: "flag_slovenia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇯": { - name: "flag Svalbard & Jan Mayen", - slug: "flag_svalbard_jan_mayen", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇰": { - name: "flag Slovakia", - slug: "flag_slovakia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇱": { - name: "flag Sierra Leone", - slug: "flag_sierra_leone", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇲": { - name: "flag San Marino", - slug: "flag_san_marino", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇳": { - name: "flag Senegal", - slug: "flag_senegal", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇴": { - name: "flag Somalia", - slug: "flag_somalia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇷": { - name: "flag Suriname", - slug: "flag_suriname", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇸": { - name: "flag South Sudan", - slug: "flag_south_sudan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇹": { - name: "flag São Tomé & Príncipe", - slug: "flag_sao_tome_principe", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇻": { - name: "flag El Salvador", - slug: "flag_el_salvador", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇽": { - name: "flag Sint Maarten", - slug: "flag_sint_maarten", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇾": { - name: "flag Syria", - slug: "flag_syria", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇸🇿": { - name: "flag Eswatini", - slug: "flag_eswatini", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇦": { - name: "flag Tristan da Cunha", - slug: "flag_tristan_da_cunha", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇨": { - name: "flag Turks & Caicos Islands", - slug: "flag_turks_caicos_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇩": { - name: "flag Chad", - slug: "flag_chad", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇫": { - name: "flag French Southern Territories", - slug: "flag_french_southern_territories", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇬": { - name: "flag Togo", - slug: "flag_togo", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇭": { - name: "flag Thailand", - slug: "flag_thailand", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇯": { - name: "flag Tajikistan", - slug: "flag_tajikistan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇰": { - name: "flag Tokelau", - slug: "flag_tokelau", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇱": { - name: "flag Timor-Leste", - slug: "flag_timor_leste", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇲": { - name: "flag Turkmenistan", - slug: "flag_turkmenistan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇳": { - name: "flag Tunisia", - slug: "flag_tunisia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇴": { - name: "flag Tonga", - slug: "flag_tonga", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇷": { - name: "flag Turkey", - slug: "flag_turkey", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇹": { - name: "flag Trinidad & Tobago", - slug: "flag_trinidad_tobago", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇻": { - name: "flag Tuvalu", - slug: "flag_tuvalu", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇼": { - name: "flag Taiwan", - slug: "flag_taiwan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇹🇿": { - name: "flag Tanzania", - slug: "flag_tanzania", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇺🇦": { - name: "flag Ukraine", - slug: "flag_ukraine", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇺🇬": { - name: "flag Uganda", - slug: "flag_uganda", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇺🇲": { - name: "flag U.S. Outlying Islands", - slug: "flag_u_s_outlying_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇺🇳": { - name: "flag United Nations", - slug: "flag_united_nations", - group: "Flags", - emoji_version: "4.0", - unicode_version: "4.0", - skin_tone_support: false -}, - "🇺🇸": { - name: "flag United States", - slug: "flag_united_states", - group: "Flags", - emoji_version: "0.6", - unicode_version: "0.6", - skin_tone_support: false -}, - "🇺🇾": { - name: "flag Uruguay", - slug: "flag_uruguay", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇺🇿": { - name: "flag Uzbekistan", - slug: "flag_uzbekistan", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇦": { - name: "flag Vatican City", - slug: "flag_vatican_city", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇨": { - name: "flag St. Vincent & Grenadines", - slug: "flag_st_vincent_grenadines", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇪": { - name: "flag Venezuela", - slug: "flag_venezuela", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇬": { - name: "flag British Virgin Islands", - slug: "flag_british_virgin_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇮": { - name: "flag U.S. Virgin Islands", - slug: "flag_u_s_virgin_islands", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇳": { - name: "flag Vietnam", - slug: "flag_vietnam", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇻🇺": { - name: "flag Vanuatu", - slug: "flag_vanuatu", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇼🇫": { - name: "flag Wallis & Futuna", - slug: "flag_wallis_futuna", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇼🇸": { - name: "flag Samoa", - slug: "flag_samoa", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇽🇰": { - name: "flag Kosovo", - slug: "flag_kosovo", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇾🇪": { - name: "flag Yemen", - slug: "flag_yemen", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇾🇹": { - name: "flag Mayotte", - slug: "flag_mayotte", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇿🇦": { - name: "flag South Africa", - slug: "flag_south_africa", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇿🇲": { - name: "flag Zambia", - slug: "flag_zambia", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🇿🇼": { - name: "flag Zimbabwe", - slug: "flag_zimbabwe", - group: "Flags", - emoji_version: "2.0", - unicode_version: "2.0", - skin_tone_support: false -}, - "🏴󠁧󠁢󠁥󠁮󠁧󠁿": { - name: "flag England", - slug: "flag_england", - group: "Flags", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🏴󠁧󠁢󠁳󠁣󠁴󠁿": { - name: "flag Scotland", - slug: "flag_scotland", - group: "Flags", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -}, - "🏴󠁧󠁢󠁷󠁬󠁳󠁿": { - name: "flag Wales", - slug: "flag_wales", - group: "Flags", - emoji_version: "5.0", - unicode_version: "5.0", - skin_tone_support: false -} -}; - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -var location = commonjsGlobal.location || {}; -/*jslint indent: 2, browser: true, bitwise: true, plusplus: true */ -var twemoji = (function ( - /*! Copyright Twitter Inc. and other contributors. Licensed under MIT *//* - https://github.com/twitter/twemoji/blob/gh-pages/LICENSE - */ - - // WARNING: this file is generated automatically via - // `node scripts/build.js` - // please update its `createTwemoji` function - // at the bottom of the same file instead. - -) { - - /*jshint maxparams:4 */ - - var - // the exported module object - twemoji = { - - - ///////////////////////// - // properties // - ///////////////////////// - - // default assets url, by default will be Twitter Inc. CDN - base: 'https://twemoji.maxcdn.com/v/13.0.1/', - - // default assets file extensions, by default '.png' - ext: '.png', - - // default assets/folder size, by default "72x72" - // available via Twitter CDN: 72 - size: '72x72', - - // default class name, by default 'emoji' - className: 'emoji', - - // basic utilities / helpers to convert code points - // to JavaScript surrogates and vice versa - convert: { - - /** - * Given an HEX codepoint, returns UTF16 surrogate pairs. - * - * @param string generic codepoint, i.e. '1F4A9' - * @return string codepoint transformed into utf16 surrogates pair, - * i.e. \uD83D\uDCA9 - * - * @example - * twemoji.convert.fromCodePoint('1f1e8'); - * // "\ud83c\udde8" - * - * '1f1e8-1f1f3'.split('-').map(twemoji.convert.fromCodePoint).join('') - * // "\ud83c\udde8\ud83c\uddf3" - */ - fromCodePoint: fromCodePoint, - - /** - * Given UTF16 surrogate pairs, returns the equivalent HEX codepoint. - * - * @param string generic utf16 surrogates pair, i.e. \uD83D\uDCA9 - * @param string optional separator for double code points, default='-' - * @return string utf16 transformed into codepoint, i.e. '1F4A9' - * - * @example - * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3'); - * // "1f1e8-1f1f3" - * - * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3', '~'); - * // "1f1e8~1f1f3" - */ - toCodePoint: toCodePoint - }, - - - ///////////////////////// - // methods // - ///////////////////////// - - /** - * User first: used to remove missing images - * preserving the original text intent when - * a fallback for network problems is desired. - * Automatically added to Image nodes via DOM - * It could be recycled for string operations via: - * $('img.emoji').on('error', twemoji.onerror) - */ - onerror: function onerror() { - if (this.parentNode) { - this.parentNode.replaceChild(createText(this.alt, false), this); - } - }, - - /** - * Main method/logic to generate either tags or HTMLImage nodes. - * "emojify" a generic text or DOM Element. - * - * @overloads - * - * String replacement for `innerHTML` or server side operations - * twemoji.parse(string); - * twemoji.parse(string, Function); - * twemoji.parse(string, Object); - * - * HTMLElement tree parsing for safer operations over existing DOM - * twemoji.parse(HTMLElement); - * twemoji.parse(HTMLElement, Function); - * twemoji.parse(HTMLElement, Object); - * - * @param string|HTMLElement the source to parse and enrich with emoji. - * - * string replace emoji matches with tags. - * Mainly used to inject emoji via `innerHTML` - * It does **not** parse the string or validate it, - * it simply replaces found emoji with a tag. - * NOTE: be sure this won't affect security. - * - * HTMLElement walk through the DOM tree and find emoji - * that are inside **text node only** (nodeType === 3) - * Mainly used to put emoji in already generated DOM - * without compromising surrounding nodes and - * **avoiding** the usage of `innerHTML`. - * NOTE: Using DOM elements instead of strings should - * improve security without compromising too much - * performance compared with a less safe `innerHTML`. - * - * @param Function|Object [optional] - * either the callback that will be invoked or an object - * with all properties to use per each found emoji. - * - * Function if specified, this will be invoked per each emoji - * that has been found through the RegExp except - * those follwed by the invariant \uFE0E ("as text"). - * Once invoked, parameters will be: - * - * iconId:string the lower case HEX code point - * i.e. "1f4a9" - * - * options:Object all info for this parsing operation - * - * variant:char the optional \uFE0F ("as image") - * variant, in case this info - * is anyhow meaningful. - * By default this is ignored. - * - * If such callback will return a falsy value instead - * of a valid `src` to use for the image, nothing will - * actually change for that specific emoji. - * - * - * Object if specified, an object containing the following properties - * - * callback Function the callback to invoke per each found emoji. - * base string the base url, by default twemoji.base - * ext string the image extension, by default twemoji.ext - * size string the assets size, by default twemoji.size - * - * @example - * - * twemoji.parse("I \u2764\uFE0F emoji!"); - * // I ❤️ emoji! - * - * - * twemoji.parse("I \u2764\uFE0F emoji!", function(iconId, options) { - * return '/assets/' + iconId + '.gif'; - * }); - * // I ❤️ emoji! - * - * - * twemoji.parse("I \u2764\uFE0F emoji!", { - * size: 72, - * callback: function(iconId, options) { - * return '/assets/' + options.size + '/' + iconId + options.ext; - * } - * }); - * // I ❤️ emoji! - * - */ - parse: parse, - - /** - * Given a string, invokes the callback argument - * per each emoji found in such string. - * This is the most raw version used by - * the .parse(string) method itself. - * - * @param string generic string to parse - * @param Function a generic callback that will be - * invoked to replace the content. - * This calback wil receive standard - * String.prototype.replace(str, callback) - * arguments such: - * callback( - * rawText, // the emoji match - * ); - * - * and others commonly received via replace. - */ - replace: replace, - - /** - * Simplify string tests against emoji. - * - * @param string some text that might contain emoji - * @return boolean true if any emoji was found, false otherwise. - * - * @example - * - * if (twemoji.test(someContent)) { - * console.log("emoji All The Things!"); - * } - */ - test: test - }, - - // used to escape HTML special chars in attributes - escaper = { - '&': '&', - '<': '<', - '>': '>', - "'": ''', - '"': '"' - }, - - // RegExp based on emoji's official Unicode standards - // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt - re = /(?:\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g, - - // avoid runtime RegExp creation for not so smart, - // not JIT based, and old browsers / engines - UFE0Fg = /\uFE0F/g, - - // avoid using a string literal like '\u200D' here because minifiers expand it inline - U200D = String.fromCharCode(0x200D), - - // used to find HTML special chars in attributes - rescaper = /[&<>'"]/g, - - // nodes with type 1 which should **not** be parsed - shouldntBeParsed = /^(?:iframe|noframes|noscript|script|select|style|textarea)$/, - - // just a private shortcut - fromCharCode = String.fromCharCode; - - return twemoji; - - - ///////////////////////// - // private functions // - // declaration // - ///////////////////////// - - /** - * Shortcut to create text nodes - * @param string text used to create DOM text node - * @return Node a DOM node with that text - */ - function createText(text, clean) { - return document.createTextNode(clean ? text.replace(UFE0Fg, '') : text); - } - - /** - * Utility function to escape html attribute text - * @param string text use in HTML attribute - * @return string text encoded to use in HTML attribute - */ - function escapeHTML(s) { - return s.replace(rescaper, replacer); - } - - /** - * Default callback used to generate emoji src - * based on Twitter CDN - * @param string the emoji codepoint string - * @param string the default size to use, i.e. "36x36" - * @return string the image source to use - */ - function defaultImageSrcGenerator(icon, options) { - return ''.concat(options.base, options.size, '/', icon, options.ext); - } - - /** - * Given a generic DOM nodeType 1, walk through all children - * and store every nodeType 3 (#text) found in the tree. - * @param Element a DOM Element with probably some text in it - * @param Array the list of previously discovered text nodes - * @return Array same list with new discovered nodes, if any - */ - function grabAllTextNodes(node, allText) { - var - childNodes = node.childNodes, - length = childNodes.length, - subnode, - nodeType; - while (length--) { - subnode = childNodes[length]; - nodeType = subnode.nodeType; - // parse emoji only in text nodes - if (nodeType === 3) { - // collect them to process emoji later - allText.push(subnode); - } - // ignore all nodes that are not type 1, that are svg, or that - // should not be parsed as script, style, and others - else if (nodeType === 1 && !('ownerSVGElement' in subnode) && - !shouldntBeParsed.test(subnode.nodeName.toLowerCase())) { - grabAllTextNodes(subnode, allText); - } - } - return allText; - } - - /** - * Used to both remove the possible variant - * and to convert utf16 into code points. - * If there is a zero-width-joiner (U+200D), leave the variants in. - * @param string the raw text of the emoji match - * @return string the code point - */ - function grabTheRightIcon(rawText) { - // if variant is present as \uFE0F - return toCodePoint(rawText.indexOf(U200D) < 0 ? - rawText.replace(UFE0Fg, '') : - rawText - ); - } - - /** - * DOM version of the same logic / parser: - * emojify all found sub-text nodes placing images node instead. - * @param Element generic DOM node with some text in some child node - * @param Object options containing info about how to parse - * - * .callback Function the callback to invoke per each found emoji. - * .base string the base url, by default twemoji.base - * .ext string the image extension, by default twemoji.ext - * .size string the assets size, by default twemoji.size - * - * @return Element same generic node with emoji in place, if any. - */ - function parseNode(node, options) { - var - allText = grabAllTextNodes(node, []), - length = allText.length, - attrib, - attrname, - modified, - fragment, - subnode, - text, - match, - i, - index, - img, - rawText, - iconId, - src; - while (length--) { - modified = false; - fragment = document.createDocumentFragment(); - subnode = allText[length]; - text = subnode.nodeValue; - i = 0; - while ((match = re.exec(text))) { - index = match.index; - if (index !== i) { - fragment.appendChild( - createText(text.slice(i, index), true) - ); - } - rawText = match[0]; - iconId = grabTheRightIcon(rawText); - i = index + rawText.length; - src = options.callback(iconId, options); - if (iconId && src) { - img = new Image(); - img.onerror = options.onerror; - img.setAttribute('draggable', 'false'); - attrib = options.attributes(rawText, iconId); - for (attrname in attrib) { - if ( - attrib.hasOwnProperty(attrname) && - // don't allow any handlers to be set + don't allow overrides - attrname.indexOf('on') !== 0 && - !img.hasAttribute(attrname) - ) { - img.setAttribute(attrname, attrib[attrname]); - } - } - img.className = options.className; - img.alt = rawText; - img.src = src; - modified = true; - fragment.appendChild(img); - } - if (!img) fragment.appendChild(createText(rawText, false)); - img = null; - } - // is there actually anything to replace in here ? - if (modified) { - // any text left to be added ? - if (i < text.length) { - fragment.appendChild( - createText(text.slice(i), true) - ); - } - // replace the text node only, leave intact - // anything else surrounding such text - subnode.parentNode.replaceChild(fragment, subnode); - } - } - return node; - } - - /** - * String/HTML version of the same logic / parser: - * emojify a generic text placing images tags instead of surrogates pair. - * @param string generic string with possibly some emoji in it - * @param Object options containing info about how to parse - * - * .callback Function the callback to invoke per each found emoji. - * .base string the base url, by default twemoji.base - * .ext string the image extension, by default twemoji.ext - * .size string the assets size, by default twemoji.size - * - * @return the string with replacing all found and parsed emoji - */ - function parseString(str, options) { - return replace(str, function (rawText) { - var - ret = rawText, - iconId = grabTheRightIcon(rawText), - src = options.callback(iconId, options), - attrib, - attrname; - if (iconId && src) { - // recycle the match string replacing the emoji - // with its image counter part - ret = ''); - } - return ret; - }); - } - - /** - * Function used to actually replace HTML special chars - * @param string HTML special char - * @return string encoded HTML special char - */ - function replacer(m) { - return escaper[m]; - } - - /** - * Default options.attribute callback - * @return null - */ - function returnNull() { - return null; - } - - /** - * Given a generic value, creates its squared counterpart if it's a number. - * As example, number 36 will return '36x36'. - * @param any a generic value. - * @return any a string representing asset size, i.e. "36x36" - * only in case the value was a number. - * Returns initial value otherwise. - */ - function toSizeSquaredAsset(value) { - return typeof value === 'number' ? - value + 'x' + value : - value; - } - - - ///////////////////////// - // exported functions // - // declaration // - ///////////////////////// - - function fromCodePoint(codepoint) { - var code = typeof codepoint === 'string' ? - parseInt(codepoint, 16) : codepoint; - if (code < 0x10000) { - return fromCharCode(code); - } - code -= 0x10000; - return fromCharCode( - 0xD800 + (code >> 10), - 0xDC00 + (code & 0x3FF) - ); - } - - function parse(what, how) { - if (!how || typeof how === 'function') { - how = {callback: how}; - } - // if first argument is string, inject html tags - // otherwise use the DOM tree and parse text nodes only - return (typeof what === 'string' ? parseString : parseNode)(what, { - callback: how.callback || defaultImageSrcGenerator, - attributes: typeof how.attributes === 'function' ? how.attributes : returnNull, - base: typeof how.base === 'string' ? how.base : twemoji.base, - ext: how.ext || twemoji.ext, - size: how.folder || toSizeSquaredAsset(how.size || twemoji.size), - className: how.className || twemoji.className, - onerror: how.onerror || twemoji.onerror - }); - } - - function replace(text, callback) { - return String(text).replace(re, callback); - } - - function test(text) { - // IE6 needs a reset before too - re.lastIndex = 0; - var result = re.test(text); - re.lastIndex = 0; - return result; - } - - function toCodePoint(unicodeSurrogates, sep) { - var - r = [], - c = 0, - p = 0, - i = 0; - while (i < unicodeSurrogates.length) { - c = unicodeSurrogates.charCodeAt(i++); - if (p) { - r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16)); - p = 0; - } else if (0xD800 <= c && c <= 0xDBFF) { - p = c; - } else { - r.push(c.toString(16)); - } - } - return r.join(sep || '-'); - } - -}()); -if (!location.protocol) { - twemoji.base = twemoji.base.replace(/^http:/, ""); -} -var twemoji_npm = twemoji; - -var indicatorStyle = 'color: var(--text-accent); width: 2.5em; text-align: center; float:left; font-weight:800;'; -var DEFAULT_SETTINGS = { - twemojiActive: true -}; -var MyPlugin = /** @class */ (function (_super) { - __extends(MyPlugin, _super); - function MyPlugin() { - return _super !== null && _super.apply(this, arguments) || this; - } - MyPlugin.prototype.loadEmojis = function () { - function titleCase(string) { - var sentence = string.toLowerCase().split('_'); - for (var i = 0; i < sentence.length; i++) { - sentence[i] = sentence[i][0].toUpperCase() + sentence[i].slice(1); - } - return sentence.join(' '); - } - var items = orderedEmoji.map(function (name) { - return { - name: titleCase(emojiNames[name]["name"]), - char: name, - imgHtml: twemoji_npm.parse(name) - }; - }); - return items; - }; - MyPlugin.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.emojis = this.loadEmojis(); - return [4 /*yield*/, this.loadSettings()]; - case 1: - _a.sent(); - this.addSettingTab(new SettingsTab(this.app, this)); - if (this.settings.twemojiActive) { - obsidian.MarkdownPreviewRenderer.registerPostProcessor(MyPlugin.postprocessor); - } - this.addCommand({ - id: 'emoji-picker:open-picker', - name: 'Open emoji picker', - hotkeys: [], - checkCallback: function (checking) { - var leaf = _this.app.workspace.activeLeaf; - if (leaf) { - if (!checking) { - new EmojiFuzzySuggestModal(_this.app, _this.emojis, _this.settings).open(); - } - return true; - } - return false; - } - }); - return [2 /*return*/]; - } - }); - }); - }; - MyPlugin.prototype.onunload = function () { - }; - MyPlugin.prototype.loadSettings = function () { - return __awaiter(this, void 0, void 0, function () { - var _a, _b, _c, _d; - return __generator(this, function (_e) { - switch (_e.label) { - case 0: - _a = this; - _c = (_b = Object).assign; - _d = [{}, DEFAULT_SETTINGS]; - return [4 /*yield*/, this.loadData()]; - case 1: - _a.settings = _c.apply(_b, _d.concat([_e.sent()])); - return [2 /*return*/]; - } - }); - }); - }; - MyPlugin.prototype.saveSettings = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.saveData(this.settings)]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }; - MyPlugin.postprocessor = function (el, ctx) { - twemoji_npm.parse(el); - }; - return MyPlugin; -}(obsidian.Plugin)); -var EmojiFuzzySuggestModal = /** @class */ (function (_super) { - __extends(EmojiFuzzySuggestModal, _super); - function EmojiFuzzySuggestModal(app, emojis, settings) { - var _this = _super.call(this, app) || this; - _this.app = app; - _this.emojis = emojis; - _this.settings = settings; - return _this; - } - EmojiFuzzySuggestModal.prototype.getItems = function () { - return this.emojis; - }; - EmojiFuzzySuggestModal.prototype.getItemText = function (item) { - return item.name; - }; - EmojiFuzzySuggestModal.prototype.renderSuggestion = function (item, el) { - _super.prototype.renderSuggestion.call(this, item, el); - this.updateSuggestionElForMode(item, el); - }; - EmojiFuzzySuggestModal.prototype.updateSuggestionElForMode = function (item, el) { - var indicatorEl = createEl('div', { - attr: { style: indicatorStyle }, - }); - if (this.settings.twemojiActive) { - indicatorEl.innerHTML = item.item.imgHtml; - } - else { - indicatorEl.textContent = item.item.char; - } - el.insertAdjacentElement('afterbegin', indicatorEl); - }; - EmojiFuzzySuggestModal.prototype.onChooseItem = function (item, evt) { - document.execCommand('insertText', false, item.char); - }; - return EmojiFuzzySuggestModal; -}(obsidian.FuzzySuggestModal)); -var SettingsTab = /** @class */ (function (_super) { - __extends(SettingsTab, _super); - function SettingsTab(app, plugin) { - var _this = _super.call(this, app, plugin) || this; - _this.plugin = plugin; - return _this; - } - SettingsTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; - containerEl.empty(); - containerEl.createEl('h1', { text: 'Emoji Toolbar' }); - containerEl.createEl('a', { text: 'Created by oliveryh', href: 'https://github.com/oliveryh/' }); - containerEl.createEl('h2', { text: 'Settings' }); - new obsidian.Setting(containerEl) - .setName('Twitter Emoji') - .setDesc('Improved emoji support. Note: this applies to emoji search and preview only.') - .addToggle(function (toggle) { return toggle - .setValue(_this.plugin.settings.twemojiActive) - .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.plugin.settings.twemojiActive = value; - return [4 /*yield*/, this.plugin.saveSettings()]; - case 1: - _a.sent(); - if (value) { - obsidian.MarkdownPreviewRenderer.registerPostProcessor(MyPlugin.postprocessor); - } - else { - obsidian.MarkdownPreviewRenderer.unregisterPostProcessor(MyPlugin.postprocessor); - } - return [2 /*return*/]; - } - }); - }); }); }); - }; - return SettingsTab; -}(obsidian.PluginSettingTab)); - -module.exports = MyPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy90d2Vtb2ppL2Rpc3QvdHdlbW9qaS5ucG0uanMiLCJtYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbiIsInZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbiB8fCB7fTtcbi8qanNsaW50IGluZGVudDogMiwgYnJvd3NlcjogdHJ1ZSwgYml0d2lzZTogdHJ1ZSwgcGx1c3BsdXM6IHRydWUgKi9cbnZhciB0d2Vtb2ppID0gKGZ1bmN0aW9uIChcbiAgLyohIENvcHlyaWdodCBUd2l0dGVyIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4gTGljZW5zZWQgdW5kZXIgTUlUICovLypcbiAgICBodHRwczovL2dpdGh1Yi5jb20vdHdpdHRlci90d2Vtb2ppL2Jsb2IvZ2gtcGFnZXMvTElDRU5TRVxuICAqL1xuXG4gIC8vIFdBUk5JTkc6ICAgdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHZpYVxuICAvLyAgICAgICAgICAgIGBub2RlIHNjcmlwdHMvYnVpbGQuanNgXG4gIC8vICAgICAgICAgICAgcGxlYXNlIHVwZGF0ZSBpdHMgYGNyZWF0ZVR3ZW1vamlgIGZ1bmN0aW9uXG4gIC8vICAgICAgICAgICAgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2FtZSBmaWxlIGluc3RlYWQuXG5cbikge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLypqc2hpbnQgbWF4cGFyYW1zOjQgKi9cblxuICB2YXJcbiAgICAvLyB0aGUgZXhwb3J0ZWQgbW9kdWxlIG9iamVjdFxuICAgIHR3ZW1vamkgPSB7XG5cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyAgICAgIHByb3BlcnRpZXMgICAgIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAvLyBkZWZhdWx0IGFzc2V0cyB1cmwsIGJ5IGRlZmF1bHQgd2lsbCBiZSBUd2l0dGVyIEluYy4gQ0ROXG4gICAgICBiYXNlOiAnaHR0cHM6Ly90d2Vtb2ppLm1heGNkbi5jb20vdi8xMy4wLjEvJyxcblxuICAgICAgLy8gZGVmYXVsdCBhc3NldHMgZmlsZSBleHRlbnNpb25zLCBieSBkZWZhdWx0ICcucG5nJ1xuICAgICAgZXh0OiAnLnBuZycsXG5cbiAgICAgIC8vIGRlZmF1bHQgYXNzZXRzL2ZvbGRlciBzaXplLCBieSBkZWZhdWx0IFwiNzJ4NzJcIlxuICAgICAgLy8gYXZhaWxhYmxlIHZpYSBUd2l0dGVyIENETjogNzJcbiAgICAgIHNpemU6ICc3Mng3MicsXG5cbiAgICAgIC8vIGRlZmF1bHQgY2xhc3MgbmFtZSwgYnkgZGVmYXVsdCAnZW1vamknXG4gICAgICBjbGFzc05hbWU6ICdlbW9qaScsXG5cbiAgICAgIC8vIGJhc2ljIHV0aWxpdGllcyAvIGhlbHBlcnMgdG8gY29udmVydCBjb2RlIHBvaW50c1xuICAgICAgLy8gdG8gSmF2YVNjcmlwdCBzdXJyb2dhdGVzIGFuZCB2aWNlIHZlcnNhXG4gICAgICBjb252ZXJ0OiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdpdmVuIGFuIEhFWCBjb2RlcG9pbnQsIHJldHVybnMgVVRGMTYgc3Vycm9nYXRlIHBhaXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gICBzdHJpbmcgIGdlbmVyaWMgY29kZXBvaW50LCBpLmUuICcxRjRBOSdcbiAgICAgICAgICogQHJldHVybiAgc3RyaW5nICBjb2RlcG9pbnQgdHJhbnNmb3JtZWQgaW50byB1dGYxNiBzdXJyb2dhdGVzIHBhaXIsXG4gICAgICAgICAqICAgICAgICAgIGkuZS4gXFx1RDgzRFxcdURDQTlcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogIHR3ZW1vamkuY29udmVydC5mcm9tQ29kZVBvaW50KCcxZjFlOCcpO1xuICAgICAgICAgKiAgLy8gXCJcXHVkODNjXFx1ZGRlOFwiXG4gICAgICAgICAqXG4gICAgICAgICAqICAnMWYxZTgtMWYxZjMnLnNwbGl0KCctJykubWFwKHR3ZW1vamkuY29udmVydC5mcm9tQ29kZVBvaW50KS5qb2luKCcnKVxuICAgICAgICAgKiAgLy8gXCJcXHVkODNjXFx1ZGRlOFxcdWQ4M2NcXHVkZGYzXCJcbiAgICAgICAgICovXG4gICAgICAgIGZyb21Db2RlUG9pbnQ6IGZyb21Db2RlUG9pbnQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdpdmVuIFVURjE2IHN1cnJvZ2F0ZSBwYWlycywgcmV0dXJucyB0aGUgZXF1aXZhbGVudCBIRVggY29kZXBvaW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gICBzdHJpbmcgIGdlbmVyaWMgdXRmMTYgc3Vycm9nYXRlcyBwYWlyLCBpLmUuIFxcdUQ4M0RcXHVEQ0E5XG4gICAgICAgICAqIEBwYXJhbSAgIHN0cmluZyAgb3B0aW9uYWwgc2VwYXJhdG9yIGZvciBkb3VibGUgY29kZSBwb2ludHMsIGRlZmF1bHQ9Jy0nXG4gICAgICAgICAqIEByZXR1cm4gIHN0cmluZyAgdXRmMTYgdHJhbnNmb3JtZWQgaW50byBjb2RlcG9pbnQsIGkuZS4gJzFGNEE5J1xuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgdHdlbW9qaS5jb252ZXJ0LnRvQ29kZVBvaW50KCdcXHVkODNjXFx1ZGRlOFxcdWQ4M2NcXHVkZGYzJyk7XG4gICAgICAgICAqICAvLyBcIjFmMWU4LTFmMWYzXCJcbiAgICAgICAgICpcbiAgICAgICAgICogIHR3ZW1vamkuY29udmVydC50b0NvZGVQb2ludCgnXFx1ZDgzY1xcdWRkZThcXHVkODNjXFx1ZGRmMycsICd+Jyk7XG4gICAgICAgICAqICAvLyBcIjFmMWU4fjFmMWYzXCJcbiAgICAgICAgICovXG4gICAgICAgIHRvQ29kZVBvaW50OiB0b0NvZGVQb2ludFxuICAgICAgfSxcblxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vICAgICAgIG1ldGhvZHMgICAgICAgLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlciBmaXJzdDogdXNlZCB0byByZW1vdmUgbWlzc2luZyBpbWFnZXNcbiAgICAgICAqIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIHRleHQgaW50ZW50IHdoZW5cbiAgICAgICAqIGEgZmFsbGJhY2sgZm9yIG5ldHdvcmsgcHJvYmxlbXMgaXMgZGVzaXJlZC5cbiAgICAgICAqIEF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gSW1hZ2Ugbm9kZXMgdmlhIERPTVxuICAgICAgICogSXQgY291bGQgYmUgcmVjeWNsZWQgZm9yIHN0cmluZyBvcGVyYXRpb25zIHZpYTpcbiAgICAgICAqICAkKCdpbWcuZW1vamknKS5vbignZXJyb3InLCB0d2Vtb2ppLm9uZXJyb3IpXG4gICAgICAgKi9cbiAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uIG9uZXJyb3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNyZWF0ZVRleHQodGhpcy5hbHQsIGZhbHNlKSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogTWFpbiBtZXRob2QvbG9naWMgdG8gZ2VuZXJhdGUgZWl0aGVyIDxpbWc+IHRhZ3Mgb3IgSFRNTEltYWdlIG5vZGVzLlxuICAgICAgICogIFwiZW1vamlmeVwiIGEgZ2VuZXJpYyB0ZXh0IG9yIERPTSBFbGVtZW50LlxuICAgICAgICpcbiAgICAgICAqIEBvdmVybG9hZHNcbiAgICAgICAqXG4gICAgICAgKiBTdHJpbmcgcmVwbGFjZW1lbnQgZm9yIGBpbm5lckhUTUxgIG9yIHNlcnZlciBzaWRlIG9wZXJhdGlvbnNcbiAgICAgICAqICB0d2Vtb2ppLnBhcnNlKHN0cmluZyk7XG4gICAgICAgKiAgdHdlbW9qaS5wYXJzZShzdHJpbmcsIEZ1bmN0aW9uKTtcbiAgICAgICAqICB0d2Vtb2ppLnBhcnNlKHN0cmluZywgT2JqZWN0KTtcbiAgICAgICAqXG4gICAgICAgKiBIVE1MRWxlbWVudCB0cmVlIHBhcnNpbmcgZm9yIHNhZmVyIG9wZXJhdGlvbnMgb3ZlciBleGlzdGluZyBET01cbiAgICAgICAqICB0d2Vtb2ppLnBhcnNlKEhUTUxFbGVtZW50KTtcbiAgICAgICAqICB0d2Vtb2ppLnBhcnNlKEhUTUxFbGVtZW50LCBGdW5jdGlvbik7XG4gICAgICAgKiAgdHdlbW9qaS5wYXJzZShIVE1MRWxlbWVudCwgT2JqZWN0KTtcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gICBzdHJpbmd8SFRNTEVsZW1lbnQgIHRoZSBzb3VyY2UgdG8gcGFyc2UgYW5kIGVucmljaCB3aXRoIGVtb2ppLlxuICAgICAgICpcbiAgICAgICAqICAgICAgICAgIHN0cmluZyAgICAgICAgICAgICAgcmVwbGFjZSBlbW9qaSBtYXRjaGVzIHdpdGggPGltZz4gdGFncy5cbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbmx5IHVzZWQgdG8gaW5qZWN0IGVtb2ppIHZpYSBgaW5uZXJIVE1MYFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBkb2VzICoqbm90KiogcGFyc2UgdGhlIHN0cmluZyBvciB2YWxpZGF0ZSBpdCxcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgc2ltcGx5IHJlcGxhY2VzIGZvdW5kIGVtb2ppIHdpdGggYSB0YWcuXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IGJlIHN1cmUgdGhpcyB3b24ndCBhZmZlY3Qgc2VjdXJpdHkuXG4gICAgICAgKlxuICAgICAgICogICAgICAgICAgSFRNTEVsZW1lbnQgICAgICAgICB3YWxrIHRocm91Z2ggdGhlIERPTSB0cmVlIGFuZCBmaW5kIGVtb2ppXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIGluc2lkZSAqKnRleHQgbm9kZSBvbmx5KiogKG5vZGVUeXBlID09PSAzKVxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWlubHkgdXNlZCB0byBwdXQgZW1vamkgaW4gYWxyZWFkeSBnZW5lcmF0ZWQgRE9NXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgY29tcHJvbWlzaW5nIHN1cnJvdW5kaW5nIG5vZGVzIGFuZFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmF2b2lkaW5nKiogdGhlIHVzYWdlIG9mIGBpbm5lckhUTUxgLlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBVc2luZyBET00gZWxlbWVudHMgaW5zdGVhZCBvZiBzdHJpbmdzIHNob3VsZFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHNlY3VyaXR5IHdpdGhvdXQgY29tcHJvbWlzaW5nIHRvbyBtdWNoXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHdpdGggYSBsZXNzIHNhZmUgYGlubmVySFRNTGAuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtICAgRnVuY3Rpb258T2JqZWN0ICBbb3B0aW9uYWxdXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb3IgYW4gb2JqZWN0XG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYWxsIHByb3BlcnRpZXMgdG8gdXNlIHBlciBlYWNoIGZvdW5kIGVtb2ppLlxuICAgICAgICpcbiAgICAgICAqICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgaWYgc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgaW52b2tlZCBwZXIgZWFjaCBlbW9qaVxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGhhcyBiZWVuIGZvdW5kIHRocm91Z2ggdGhlIFJlZ0V4cCBleGNlcHRcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhvc2UgZm9sbHdlZCBieSB0aGUgaW52YXJpYW50IFxcdUZFMEUgKFwiYXMgdGV4dFwiKS5cbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25jZSBpbnZva2VkLCBwYXJhbWV0ZXJzIHdpbGwgYmU6XG4gICAgICAgKlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25JZDpzdHJpbmcgICAgIHRoZSBsb3dlciBjYXNlIEhFWCBjb2RlIHBvaW50XG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiBcIjFmNGE5XCJcbiAgICAgICAqXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczpPYmplY3QgICAgYWxsIGluZm8gZm9yIHRoaXMgcGFyc2luZyBvcGVyYXRpb25cbiAgICAgICAqXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudDpjaGFyICAgICAgdGhlIG9wdGlvbmFsIFxcdUZFMEYgKFwiYXMgaW1hZ2VcIilcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LCBpbiBjYXNlIHRoaXMgaW5mb1xuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFueWhvdyBtZWFuaW5nZnVsLlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyBpZ25vcmVkLlxuICAgICAgICpcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3VjaCBjYWxsYmFjayB3aWxsIHJldHVybiBhIGZhbHN5IHZhbHVlIGluc3RlYWRcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSB2YWxpZCBgc3JjYCB0byB1c2UgZm9yIHRoZSBpbWFnZSwgbm90aGluZyB3aWxsXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IGNoYW5nZSBmb3IgdGhhdCBzcGVjaWZpYyBlbW9qaS5cbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICBpZiBzcGVjaWZpZWQsIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllc1xuICAgICAgICpcbiAgICAgICAqICAgICAgICAgICAgY2FsbGJhY2sgICBGdW5jdGlvbiAgdGhlIGNhbGxiYWNrIHRvIGludm9rZSBwZXIgZWFjaCBmb3VuZCBlbW9qaS5cbiAgICAgICAqICAgICAgICAgICAgYmFzZSAgICAgICBzdHJpbmcgICAgdGhlIGJhc2UgdXJsLCBieSBkZWZhdWx0IHR3ZW1vamkuYmFzZVxuICAgICAgICogICAgICAgICAgICBleHQgICAgICAgIHN0cmluZyAgICB0aGUgaW1hZ2UgZXh0ZW5zaW9uLCBieSBkZWZhdWx0IHR3ZW1vamkuZXh0XG4gICAgICAgKiAgICAgICAgICAgIHNpemUgICAgICAgc3RyaW5nICAgIHRoZSBhc3NldHMgc2l6ZSwgYnkgZGVmYXVsdCB0d2Vtb2ppLnNpemVcbiAgICAgICAqXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqICB0d2Vtb2ppLnBhcnNlKFwiSSBcXHUyNzY0XFx1RkUwRiBlbW9qaSFcIik7XG4gICAgICAgKiAgLy8gSSA8aW1nIGNsYXNzPVwiZW1vamlcIiBkcmFnZ2FibGU9XCJmYWxzZVwiIGFsdD1cIuKdpO+4j1wiIHNyYz1cIi9hc3NldHMvMjc2NC5naWZcIi8+IGVtb2ppIVxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiAgdHdlbW9qaS5wYXJzZShcIkkgXFx1Mjc2NFxcdUZFMEYgZW1vamkhXCIsIGZ1bmN0aW9uKGljb25JZCwgb3B0aW9ucykge1xuICAgICAgICogICAgcmV0dXJuICcvYXNzZXRzLycgKyBpY29uSWQgKyAnLmdpZic7XG4gICAgICAgKiAgfSk7XG4gICAgICAgKiAgLy8gSSA8aW1nIGNsYXNzPVwiZW1vamlcIiBkcmFnZ2FibGU9XCJmYWxzZVwiIGFsdD1cIuKdpO+4j1wiIHNyYz1cIi9hc3NldHMvMjc2NC5naWZcIi8+IGVtb2ppIVxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiB0d2Vtb2ppLnBhcnNlKFwiSSBcXHUyNzY0XFx1RkUwRiBlbW9qaSFcIiwge1xuICAgICAgICogICBzaXplOiA3MixcbiAgICAgICAqICAgY2FsbGJhY2s6IGZ1bmN0aW9uKGljb25JZCwgb3B0aW9ucykge1xuICAgICAgICogICAgIHJldHVybiAnL2Fzc2V0cy8nICsgb3B0aW9ucy5zaXplICsgJy8nICsgaWNvbklkICsgb3B0aW9ucy5leHQ7XG4gICAgICAgKiAgIH1cbiAgICAgICAqIH0pO1xuICAgICAgICogIC8vIEkgPGltZyBjbGFzcz1cImVtb2ppXCIgZHJhZ2dhYmxlPVwiZmFsc2VcIiBhbHQ9XCLinaTvuI9cIiBzcmM9XCIvYXNzZXRzLzcyeDcyLzI3NjQucG5nXCIvPiBlbW9qaSFcbiAgICAgICAqXG4gICAgICAgKi9cbiAgICAgIHBhcnNlOiBwYXJzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHaXZlbiBhIHN0cmluZywgaW52b2tlcyB0aGUgY2FsbGJhY2sgYXJndW1lbnRcbiAgICAgICAqICBwZXIgZWFjaCBlbW9qaSBmb3VuZCBpbiBzdWNoIHN0cmluZy5cbiAgICAgICAqIFRoaXMgaXMgdGhlIG1vc3QgcmF3IHZlcnNpb24gdXNlZCBieVxuICAgICAgICogIHRoZSAucGFyc2Uoc3RyaW5nKSBtZXRob2QgaXRzZWxmLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSAgIHN0cmluZyAgICBnZW5lcmljIHN0cmluZyB0byBwYXJzZVxuICAgICAgICogQHBhcmFtICAgRnVuY3Rpb24gIGEgZ2VuZXJpYyBjYWxsYmFjayB0aGF0IHdpbGwgYmVcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICBpbnZva2VkIHRvIHJlcGxhY2UgdGhlIGNvbnRlbnQuXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBjYWxiYWNrIHdpbCByZWNlaXZlIHN0YW5kYXJkXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHN0ciwgY2FsbGJhY2spXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIHN1Y2g6XG4gICAgICAgKiAgY2FsbGJhY2soXG4gICAgICAgKiAgICByYXdUZXh0LCAgLy8gdGhlIGVtb2ppIG1hdGNoXG4gICAgICAgKiAgKTtcbiAgICAgICAqXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgYW5kIG90aGVycyBjb21tb25seSByZWNlaXZlZCB2aWEgcmVwbGFjZS5cbiAgICAgICAqL1xuICAgICAgcmVwbGFjZTogcmVwbGFjZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTaW1wbGlmeSBzdHJpbmcgdGVzdHMgYWdhaW5zdCBlbW9qaS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gICBzdHJpbmcgIHNvbWUgdGV4dCB0aGF0IG1pZ2h0IGNvbnRhaW4gZW1vamlcbiAgICAgICAqIEByZXR1cm4gIGJvb2xlYW4gdHJ1ZSBpZiBhbnkgZW1vamkgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgKlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiAgaWYgKHR3ZW1vamkudGVzdChzb21lQ29udGVudCkpIHtcbiAgICAgICAqICAgIGNvbnNvbGUubG9nKFwiZW1vamkgQWxsIFRoZSBUaGluZ3MhXCIpO1xuICAgICAgICogIH1cbiAgICAgICAqL1xuICAgICAgdGVzdDogdGVzdFxuICAgIH0sXG5cbiAgICAvLyB1c2VkIHRvIGVzY2FwZSBIVE1MIHNwZWNpYWwgY2hhcnMgaW4gYXR0cmlidXRlc1xuICAgIGVzY2FwZXIgPSB7XG4gICAgICAnJic6ICcmYW1wOycsXG4gICAgICAnPCc6ICcmbHQ7JyxcbiAgICAgICc+JzogJyZndDsnLFxuICAgICAgXCInXCI6ICcmIzM5OycsXG4gICAgICAnXCInOiAnJnF1b3Q7J1xuICAgIH0sXG5cbiAgICAvLyBSZWdFeHAgYmFzZWQgb24gZW1vamkncyBvZmZpY2lhbCBVbmljb2RlIHN0YW5kYXJkc1xuICAgIC8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvRW1vamlTb3VyY2VzLnR4dFxuICAgIHJlID0gLyg/OlxcdWQ4M2RcXHVkYzY4XFx1ZDgzY1xcdWRmZmJcXHUyMDBkXFx1ZDgzZVxcdWRkMWRcXHUyMDBkXFx1ZDgzZFxcdWRjNjhcXHVkODNjW1xcdWRmZmMtXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjhcXHVkODNjXFx1ZGZmY1xcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmQtXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjhcXHVkODNjXFx1ZGZmZFxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmNcXHVkZmZlXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjhcXHVkODNjXFx1ZGZmZVxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZkXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjhcXHVkODNjXFx1ZGZmZlxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZlXXxcXHVkODNkXFx1ZGM2OVxcdWQ4M2NcXHVkZmZiXFx1MjAwZFxcdWQ4M2VcXHVkZDFkXFx1MjAwZFxcdWQ4M2RcXHVkYzY4XFx1ZDgzY1tcXHVkZmZjLVxcdWRmZmZdfFxcdWQ4M2RcXHVkYzY5XFx1ZDgzY1xcdWRmZmJcXHUyMDBkXFx1ZDgzZVxcdWRkMWRcXHUyMDBkXFx1ZDgzZFxcdWRjNjlcXHVkODNjW1xcdWRmZmMtXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmY1xcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmQtXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmY1xcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OVxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmQtXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmZFxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmNcXHVkZmZlXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmZFxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OVxcdWQ4M2NbXFx1ZGZmYlxcdWRmZmNcXHVkZmZlXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmZVxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZkXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmZVxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OVxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZkXFx1ZGZmZl18XFx1ZDgzZFxcdWRjNjlcXHVkODNjXFx1ZGZmZlxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNkXFx1ZGM2OFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZlXXxcXHVkODNkXFx1ZGM2OVxcdWQ4M2NcXHVkZmZmXFx1MjAwZFxcdWQ4M2VcXHVkZDFkXFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmVdfFxcdWQ4M2VcXHVkZGQxXFx1ZDgzY1xcdWRmZmJcXHUyMDBkXFx1ZDgzZVxcdWRkMWRcXHUyMDBkXFx1ZDgzZVxcdWRkZDFcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl18XFx1ZDgzZVxcdWRkZDFcXHVkODNjXFx1ZGZmY1xcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNlXFx1ZGRkMVxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVkODNlXFx1ZGRkMVxcdWQ4M2NcXHVkZmZkXFx1MjAwZFxcdWQ4M2VcXHVkZDFkXFx1MjAwZFxcdWQ4M2VcXHVkZGQxXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdfFxcdWQ4M2VcXHVkZGQxXFx1ZDgzY1xcdWRmZmVcXHUyMDBkXFx1ZDgzZVxcdWRkMWRcXHUyMDBkXFx1ZDgzZVxcdWRkZDFcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl18XFx1ZDgzZVxcdWRkZDFcXHVkODNjXFx1ZGZmZlxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNlXFx1ZGRkMVxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVkODNlXFx1ZGRkMVxcdTIwMGRcXHVkODNlXFx1ZGQxZFxcdTIwMGRcXHVkODNlXFx1ZGRkMXxcXHVkODNkXFx1ZGM2YlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVkODNkXFx1ZGM2Y1xcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVkODNkXFx1ZGM2ZFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVkODNkW1xcdWRjNmItXFx1ZGM2ZF0pfCg/OlxcdWQ4M2RbXFx1ZGM2OFxcdWRjNjldfFxcdWQ4M2VcXHVkZGQxKSg/OlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSk/XFx1MjAwZCg/OlxcdTI2OTVcXHVmZTBmfFxcdTI2OTZcXHVmZTBmfFxcdTI3MDhcXHVmZTBmfFxcdWQ4M2NbXFx1ZGYzZVxcdWRmNzNcXHVkZjdjXFx1ZGY4NFxcdWRmOTNcXHVkZmE0XFx1ZGZhOFxcdWRmZWJcXHVkZmVkXXxcXHVkODNkW1xcdWRjYmJcXHVkY2JjXFx1ZGQyN1xcdWRkMmNcXHVkZTgwXFx1ZGU5Ml18XFx1ZDgzZVtcXHVkZGFmLVxcdWRkYjNcXHVkZGJjXFx1ZGRiZF0pfCg/OlxcdWQ4M2NbXFx1ZGZjYlxcdWRmY2NdfFxcdWQ4M2RbXFx1ZGQ3NFxcdWRkNzVdfFxcdTI2ZjkpKCg/OlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXXxcXHVmZTBmKVxcdTIwMGRbXFx1MjY0MFxcdTI2NDJdXFx1ZmUwZil8KD86XFx1ZDgzY1tcXHVkZmMzXFx1ZGZjNFxcdWRmY2FdfFxcdWQ4M2RbXFx1ZGM2ZVxcdWRjNzBcXHVkYzcxXFx1ZGM3M1xcdWRjNzdcXHVkYzgxXFx1ZGM4MlxcdWRjODZcXHVkYzg3XFx1ZGU0NS1cXHVkZTQ3XFx1ZGU0YlxcdWRlNGRcXHVkZTRlXFx1ZGVhM1xcdWRlYjQtXFx1ZGViNl18XFx1ZDgzZVtcXHVkZDI2XFx1ZGQzNVxcdWRkMzctXFx1ZGQzOVxcdWRkM2RcXHVkZDNlXFx1ZGRiOFxcdWRkYjlcXHVkZGNkLVxcdWRkY2ZcXHVkZGQ2LVxcdWRkZGRdKSg/OlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSk/XFx1MjAwZFtcXHUyNjQwXFx1MjY0Ml1cXHVmZTBmfCg/OlxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdTI3NjRcXHVmZTBmXFx1MjAwZFxcdWQ4M2RcXHVkYzhiXFx1MjAwZFxcdWQ4M2RcXHVkYzY4fFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY2XFx1MjAwZFxcdWQ4M2RcXHVkYzY2fFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY3XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY2XFx1MjAwZFxcdWQ4M2RcXHVkYzY2fFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY3XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdTI3NjRcXHVmZTBmXFx1MjAwZFxcdWQ4M2RcXHVkYzhiXFx1MjAwZFxcdWQ4M2RbXFx1ZGM2OFxcdWRjNjldfFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY2XFx1MjAwZFxcdWQ4M2RcXHVkYzY2fFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY3XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdTI3NjRcXHVmZTBmXFx1MjAwZFxcdWQ4M2RcXHVkYzY4fFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY2XFx1MjAwZFxcdWQ4M2RcXHVkYzY2fFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY3XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY4XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdTI3NjRcXHVmZTBmXFx1MjAwZFxcdWQ4M2RbXFx1ZGM2OFxcdWRjNjldfFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY2XFx1MjAwZFxcdWQ4M2RcXHVkYzY2fFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY3XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RcXHVkYzY5XFx1MjAwZFxcdWQ4M2RbXFx1ZGM2NlxcdWRjNjddfFxcdWQ4M2NcXHVkZmYzXFx1ZmUwZlxcdTIwMGRcXHUyNmE3XFx1ZmUwZnxcXHVkODNjXFx1ZGZmM1xcdWZlMGZcXHUyMDBkXFx1ZDgzY1xcdWRmMDh8XFx1ZDgzY1xcdWRmZjRcXHUyMDBkXFx1MjYyMFxcdWZlMGZ8XFx1ZDgzZFxcdWRjMTVcXHUyMDBkXFx1ZDgzZVxcdWRkYmF8XFx1ZDgzZFxcdWRjM2JcXHUyMDBkXFx1Mjc0NFxcdWZlMGZ8XFx1ZDgzZFxcdWRjNDFcXHUyMDBkXFx1ZDgzZFxcdWRkZTh8XFx1ZDgzZFxcdWRjNjhcXHUyMDBkXFx1ZDgzZFtcXHVkYzY2XFx1ZGM2N118XFx1ZDgzZFxcdWRjNjlcXHUyMDBkXFx1ZDgzZFtcXHVkYzY2XFx1ZGM2N118XFx1ZDgzZFxcdWRjNmZcXHUyMDBkXFx1MjY0MFxcdWZlMGZ8XFx1ZDgzZFxcdWRjNmZcXHUyMDBkXFx1MjY0MlxcdWZlMGZ8XFx1ZDgzZVxcdWRkM2NcXHUyMDBkXFx1MjY0MFxcdWZlMGZ8XFx1ZDgzZVxcdWRkM2NcXHUyMDBkXFx1MjY0MlxcdWZlMGZ8XFx1ZDgzZVxcdWRkZGVcXHUyMDBkXFx1MjY0MFxcdWZlMGZ8XFx1ZDgzZVxcdWRkZGVcXHUyMDBkXFx1MjY0MlxcdWZlMGZ8XFx1ZDgzZVxcdWRkZGZcXHUyMDBkXFx1MjY0MFxcdWZlMGZ8XFx1ZDgzZVxcdWRkZGZcXHUyMDBkXFx1MjY0MlxcdWZlMGZ8XFx1ZDgzZFxcdWRjMDhcXHUyMDBkXFx1MmIxYil8WyMqMC05XVxcdWZlMGY/XFx1MjBlM3woPzpbwqnCrlxcdTIxMjJcXHUyNjVmXVxcdWZlMGYpfCg/OlxcdWQ4M2NbXFx1ZGMwNFxcdWRkNzBcXHVkZDcxXFx1ZGQ3ZVxcdWRkN2ZcXHVkZTAyXFx1ZGUxYVxcdWRlMmZcXHVkZTM3XFx1ZGYyMVxcdWRmMjQtXFx1ZGYyY1xcdWRmMzZcXHVkZjdkXFx1ZGY5NlxcdWRmOTdcXHVkZjk5LVxcdWRmOWJcXHVkZjllXFx1ZGY5ZlxcdWRmY2RcXHVkZmNlXFx1ZGZkNC1cXHVkZmRmXFx1ZGZmM1xcdWRmZjVcXHVkZmY3XXxcXHVkODNkW1xcdWRjM2ZcXHVkYzQxXFx1ZGNmZFxcdWRkNDlcXHVkZDRhXFx1ZGQ2ZlxcdWRkNzBcXHVkZDczXFx1ZGQ3Ni1cXHVkZDc5XFx1ZGQ4N1xcdWRkOGEtXFx1ZGQ4ZFxcdWRkYTVcXHVkZGE4XFx1ZGRiMVxcdWRkYjJcXHVkZGJjXFx1ZGRjMi1cXHVkZGM0XFx1ZGRkMS1cXHVkZGQzXFx1ZGRkYy1cXHVkZGRlXFx1ZGRlMVxcdWRkZTNcXHVkZGU4XFx1ZGRlZlxcdWRkZjNcXHVkZGZhXFx1ZGVjYlxcdWRlY2QtXFx1ZGVjZlxcdWRlZTAtXFx1ZGVlNVxcdWRlZTlcXHVkZWYwXFx1ZGVmM118W1xcdTIwM2NcXHUyMDQ5XFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxYTlcXHUyMWFhXFx1MjMxYVxcdTIzMWJcXHUyMzI4XFx1MjNjZlxcdTIzZWQtXFx1MjNlZlxcdTIzZjFcXHUyM2YyXFx1MjNmOC1cXHUyM2ZhXFx1MjRjMlxcdTI1YWFcXHUyNWFiXFx1MjViNlxcdTI1YzBcXHUyNWZiLVxcdTI1ZmVcXHUyNjAwLVxcdTI2MDRcXHUyNjBlXFx1MjYxMVxcdTI2MTRcXHUyNjE1XFx1MjYxOFxcdTI2MjBcXHUyNjIyXFx1MjYyM1xcdTI2MjZcXHUyNjJhXFx1MjYyZVxcdTI2MmZcXHUyNjM4LVxcdTI2M2FcXHUyNjQwXFx1MjY0MlxcdTI2NDgtXFx1MjY1M1xcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3YlxcdTI2N2ZcXHUyNjkyLVxcdTI2OTdcXHUyNjk5XFx1MjY5YlxcdTI2OWNcXHUyNmEwXFx1MjZhMVxcdTI2YTdcXHUyNmFhXFx1MjZhYlxcdTI2YjBcXHUyNmIxXFx1MjZiZFxcdTI2YmVcXHUyNmM0XFx1MjZjNVxcdTI2YzhcXHUyNmNmXFx1MjZkMVxcdTI2ZDNcXHUyNmQ0XFx1MjZlOVxcdTI2ZWFcXHUyNmYwLVxcdTI2ZjVcXHUyNmY4XFx1MjZmYVxcdTI2ZmRcXHUyNzAyXFx1MjcwOFxcdTI3MDlcXHUyNzBmXFx1MjcxMlxcdTI3MTRcXHUyNzE2XFx1MjcxZFxcdTI3MjFcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc1N1xcdTI3NjNcXHUyNzY0XFx1MjdhMVxcdTI5MzRcXHUyOTM1XFx1MmIwNS1cXHUyYjA3XFx1MmIxYlxcdTJiMWNcXHUyYjUwXFx1MmI1NVxcdTMwMzBcXHUzMDNkXFx1MzI5N1xcdTMyOTldKSg/OlxcdWZlMGZ8KD8hXFx1ZmUwZSkpfCg/Oig/OlxcdWQ4M2NbXFx1ZGZjYlxcdWRmY2NdfFxcdWQ4M2RbXFx1ZGQ3NFxcdWRkNzVcXHVkZDkwXXxbXFx1MjYxZFxcdTI2ZjdcXHUyNmY5XFx1MjcwY1xcdTI3MGRdKSg/OlxcdWZlMGZ8KD8hXFx1ZmUwZSkpfCg/OlxcdWQ4M2NbXFx1ZGY4NVxcdWRmYzItXFx1ZGZjNFxcdWRmYzdcXHVkZmNhXXxcXHVkODNkW1xcdWRjNDJcXHVkYzQzXFx1ZGM0Ni1cXHVkYzUwXFx1ZGM2Ni1cXHVkYzY5XFx1ZGM2ZVxcdWRjNzAtXFx1ZGM3OFxcdWRjN2NcXHVkYzgxLVxcdWRjODNcXHVkYzg1LVxcdWRjODdcXHVkY2FhXFx1ZGQ3YVxcdWRkOTVcXHVkZDk2XFx1ZGU0NS1cXHVkZTQ3XFx1ZGU0Yi1cXHVkZTRmXFx1ZGVhM1xcdWRlYjQtXFx1ZGViNlxcdWRlYzBcXHVkZWNjXXxcXHVkODNlW1xcdWRkMGNcXHVkZDBmXFx1ZGQxOC1cXHVkZDFjXFx1ZGQxZVxcdWRkMWZcXHVkZDI2XFx1ZGQzMC1cXHVkZDM5XFx1ZGQzZFxcdWRkM2VcXHVkZDc3XFx1ZGRiNVxcdWRkYjZcXHVkZGI4XFx1ZGRiOVxcdWRkYmJcXHVkZGNkLVxcdWRkY2ZcXHVkZGQxLVxcdWRkZGRdfFtcXHUyNzBhXFx1MjcwYl0pKSg/OlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSk/fCg/OlxcdWQ4M2NcXHVkZmY0XFx1ZGI0MFxcdWRjNjdcXHVkYjQwXFx1ZGM2MlxcdWRiNDBcXHVkYzY1XFx1ZGI0MFxcdWRjNmVcXHVkYjQwXFx1ZGM2N1xcdWRiNDBcXHVkYzdmfFxcdWQ4M2NcXHVkZmY0XFx1ZGI0MFxcdWRjNjdcXHVkYjQwXFx1ZGM2MlxcdWRiNDBcXHVkYzczXFx1ZGI0MFxcdWRjNjNcXHVkYjQwXFx1ZGM3NFxcdWRiNDBcXHVkYzdmfFxcdWQ4M2NcXHVkZmY0XFx1ZGI0MFxcdWRjNjdcXHVkYjQwXFx1ZGM2MlxcdWRiNDBcXHVkYzc3XFx1ZGI0MFxcdWRjNmNcXHVkYjQwXFx1ZGM3M1xcdWRiNDBcXHVkYzdmfFxcdWQ4M2NcXHVkZGU2XFx1ZDgzY1tcXHVkZGU4LVxcdWRkZWNcXHVkZGVlXFx1ZGRmMVxcdWRkZjJcXHVkZGY0XFx1ZGRmNi1cXHVkZGZhXFx1ZGRmY1xcdWRkZmRcXHVkZGZmXXxcXHVkODNjXFx1ZGRlN1xcdWQ4M2NbXFx1ZGRlNlxcdWRkZTdcXHVkZGU5LVxcdWRkZWZcXHVkZGYxLVxcdWRkZjRcXHVkZGY2LVxcdWRkZjlcXHVkZGZiXFx1ZGRmY1xcdWRkZmVcXHVkZGZmXXxcXHVkODNjXFx1ZGRlOFxcdWQ4M2NbXFx1ZGRlNlxcdWRkZThcXHVkZGU5XFx1ZGRlYi1cXHVkZGVlXFx1ZGRmMC1cXHVkZGY1XFx1ZGRmN1xcdWRkZmEtXFx1ZGRmZl18XFx1ZDgzY1xcdWRkZTlcXHVkODNjW1xcdWRkZWFcXHVkZGVjXFx1ZGRlZlxcdWRkZjBcXHVkZGYyXFx1ZGRmNFxcdWRkZmZdfFxcdWQ4M2NcXHVkZGVhXFx1ZDgzY1tcXHVkZGU2XFx1ZGRlOFxcdWRkZWFcXHVkZGVjXFx1ZGRlZFxcdWRkZjctXFx1ZGRmYV18XFx1ZDgzY1xcdWRkZWJcXHVkODNjW1xcdWRkZWUtXFx1ZGRmMFxcdWRkZjJcXHVkZGY0XFx1ZGRmN118XFx1ZDgzY1xcdWRkZWNcXHVkODNjW1xcdWRkZTZcXHVkZGU3XFx1ZGRlOS1cXHVkZGVlXFx1ZGRmMS1cXHVkZGYzXFx1ZGRmNS1cXHVkZGZhXFx1ZGRmY1xcdWRkZmVdfFxcdWQ4M2NcXHVkZGVkXFx1ZDgzY1tcXHVkZGYwXFx1ZGRmMlxcdWRkZjNcXHVkZGY3XFx1ZGRmOVxcdWRkZmFdfFxcdWQ4M2NcXHVkZGVlXFx1ZDgzY1tcXHVkZGU4LVxcdWRkZWFcXHVkZGYxLVxcdWRkZjRcXHVkZGY2LVxcdWRkZjldfFxcdWQ4M2NcXHVkZGVmXFx1ZDgzY1tcXHVkZGVhXFx1ZGRmMlxcdWRkZjRcXHVkZGY1XXxcXHVkODNjXFx1ZGRmMFxcdWQ4M2NbXFx1ZGRlYVxcdWRkZWMtXFx1ZGRlZVxcdWRkZjJcXHVkZGYzXFx1ZGRmNVxcdWRkZjdcXHVkZGZjXFx1ZGRmZVxcdWRkZmZdfFxcdWQ4M2NcXHVkZGYxXFx1ZDgzY1tcXHVkZGU2LVxcdWRkZThcXHVkZGVlXFx1ZGRmMFxcdWRkZjctXFx1ZGRmYlxcdWRkZmVdfFxcdWQ4M2NcXHVkZGYyXFx1ZDgzY1tcXHVkZGU2XFx1ZGRlOC1cXHVkZGVkXFx1ZGRmMC1cXHVkZGZmXXxcXHVkODNjXFx1ZGRmM1xcdWQ4M2NbXFx1ZGRlNlxcdWRkZThcXHVkZGVhLVxcdWRkZWNcXHVkZGVlXFx1ZGRmMVxcdWRkZjRcXHVkZGY1XFx1ZGRmN1xcdWRkZmFcXHVkZGZmXXxcXHVkODNjXFx1ZGRmNFxcdWQ4M2NcXHVkZGYyfFxcdWQ4M2NcXHVkZGY1XFx1ZDgzY1tcXHVkZGU2XFx1ZGRlYS1cXHVkZGVkXFx1ZGRmMC1cXHVkZGYzXFx1ZGRmNy1cXHVkZGY5XFx1ZGRmY1xcdWRkZmVdfFxcdWQ4M2NcXHVkZGY2XFx1ZDgzY1xcdWRkZTZ8XFx1ZDgzY1xcdWRkZjdcXHVkODNjW1xcdWRkZWFcXHVkZGY0XFx1ZGRmOFxcdWRkZmFcXHVkZGZjXXxcXHVkODNjXFx1ZGRmOFxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGVhXFx1ZGRlYy1cXHVkZGY0XFx1ZGRmNy1cXHVkZGY5XFx1ZGRmYlxcdWRkZmQtXFx1ZGRmZl18XFx1ZDgzY1xcdWRkZjlcXHVkODNjW1xcdWRkZTZcXHVkZGU4XFx1ZGRlOVxcdWRkZWItXFx1ZGRlZFxcdWRkZWYtXFx1ZGRmNFxcdWRkZjdcXHVkZGY5XFx1ZGRmYlxcdWRkZmNcXHVkZGZmXXxcXHVkODNjXFx1ZGRmYVxcdWQ4M2NbXFx1ZGRlNlxcdWRkZWNcXHVkZGYyXFx1ZGRmM1xcdWRkZjhcXHVkZGZlXFx1ZGRmZl18XFx1ZDgzY1xcdWRkZmJcXHVkODNjW1xcdWRkZTZcXHVkZGU4XFx1ZGRlYVxcdWRkZWNcXHVkZGVlXFx1ZGRmM1xcdWRkZmFdfFxcdWQ4M2NcXHVkZGZjXFx1ZDgzY1tcXHVkZGViXFx1ZGRmOF18XFx1ZDgzY1xcdWRkZmRcXHVkODNjXFx1ZGRmMHxcXHVkODNjXFx1ZGRmZVxcdWQ4M2NbXFx1ZGRlYVxcdWRkZjldfFxcdWQ4M2NcXHVkZGZmXFx1ZDgzY1tcXHVkZGU2XFx1ZGRmMlxcdWRkZmNdfFxcdWQ4M2NbXFx1ZGNjZlxcdWRkOGVcXHVkZDkxLVxcdWRkOWFcXHVkZGU2LVxcdWRkZmZcXHVkZTAxXFx1ZGUzMi1cXHVkZTM2XFx1ZGUzOC1cXHVkZTNhXFx1ZGU1MFxcdWRlNTFcXHVkZjAwLVxcdWRmMjBcXHVkZjJkLVxcdWRmMzVcXHVkZjM3LVxcdWRmN2NcXHVkZjdlLVxcdWRmODRcXHVkZjg2LVxcdWRmOTNcXHVkZmEwLVxcdWRmYzFcXHVkZmM1XFx1ZGZjNlxcdWRmYzhcXHVkZmM5XFx1ZGZjZi1cXHVkZmQzXFx1ZGZlMC1cXHVkZmYwXFx1ZGZmNFxcdWRmZjgtXFx1ZGZmZl18XFx1ZDgzZFtcXHVkYzAwLVxcdWRjM2VcXHVkYzQwXFx1ZGM0NFxcdWRjNDVcXHVkYzUxLVxcdWRjNjVcXHVkYzZhXFx1ZGM2ZlxcdWRjNzktXFx1ZGM3YlxcdWRjN2QtXFx1ZGM4MFxcdWRjODRcXHVkYzg4LVxcdWRjYTlcXHVkY2FiLVxcdWRjZmNcXHVkY2ZmLVxcdWRkM2RcXHVkZDRiLVxcdWRkNGVcXHVkZDUwLVxcdWRkNjdcXHVkZGE0XFx1ZGRmYi1cXHVkZTQ0XFx1ZGU0OC1cXHVkZTRhXFx1ZGU4MC1cXHVkZWEyXFx1ZGVhNC1cXHVkZWIzXFx1ZGViNy1cXHVkZWJmXFx1ZGVjMS1cXHVkZWM1XFx1ZGVkMC1cXHVkZWQyXFx1ZGVkNS1cXHVkZWQ3XFx1ZGVlYlxcdWRlZWNcXHVkZWY0LVxcdWRlZmNcXHVkZmUwLVxcdWRmZWJdfFxcdWQ4M2VbXFx1ZGQwZFxcdWRkMGVcXHVkZDEwLVxcdWRkMTdcXHVkZDFkXFx1ZGQyMC1cXHVkZDI1XFx1ZGQyNy1cXHVkZDJmXFx1ZGQzYVxcdWRkM2NcXHVkZDNmLVxcdWRkNDVcXHVkZDQ3LVxcdWRkNzZcXHVkZDc4XFx1ZGQ3YS1cXHVkZGI0XFx1ZGRiN1xcdWRkYmFcXHVkZGJjLVxcdWRkY2JcXHVkZGQwXFx1ZGRkZS1cXHVkZGZmXFx1ZGU3MC1cXHVkZTc0XFx1ZGU3OC1cXHVkZTdhXFx1ZGU4MC1cXHVkZTg2XFx1ZGU5MC1cXHVkZWE4XFx1ZGViMC1cXHVkZWI2XFx1ZGVjMC1cXHVkZWMyXFx1ZGVkMC1cXHVkZWQ2XXxbXFx1MjNlOS1cXHUyM2VjXFx1MjNmMFxcdTIzZjNcXHUyNjdlXFx1MjZjZVxcdTI3MDVcXHUyNzI4XFx1Mjc0Y1xcdTI3NGVcXHUyNzUzLVxcdTI3NTVcXHUyNzk1LVxcdTI3OTdcXHUyN2IwXFx1MjdiZlxcdWU1MGFdKXxcXHVmZTBmL2csXG5cbiAgICAvLyBhdm9pZCBydW50aW1lIFJlZ0V4cCBjcmVhdGlvbiBmb3Igbm90IHNvIHNtYXJ0LFxuICAgIC8vIG5vdCBKSVQgYmFzZWQsIGFuZCBvbGQgYnJvd3NlcnMgLyBlbmdpbmVzXG4gICAgVUZFMEZnID0gL1xcdUZFMEYvZyxcblxuICAgIC8vIGF2b2lkIHVzaW5nIGEgc3RyaW5nIGxpdGVyYWwgbGlrZSAnXFx1MjAwRCcgaGVyZSBiZWNhdXNlIG1pbmlmaWVycyBleHBhbmQgaXQgaW5saW5lXG4gICAgVTIwMEQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MjAwRCksXG5cbiAgICAvLyB1c2VkIHRvIGZpbmQgSFRNTCBzcGVjaWFsIGNoYXJzIGluIGF0dHJpYnV0ZXNcbiAgICByZXNjYXBlciA9IC9bJjw+J1wiXS9nLFxuXG4gICAgLy8gbm9kZXMgd2l0aCB0eXBlIDEgd2hpY2ggc2hvdWxkICoqbm90KiogYmUgcGFyc2VkXG4gICAgc2hvdWxkbnRCZVBhcnNlZCA9IC9eKD86aWZyYW1lfG5vZnJhbWVzfG5vc2NyaXB0fHNjcmlwdHxzZWxlY3R8c3R5bGV8dGV4dGFyZWEpJC8sXG5cbiAgICAvLyBqdXN0IGEgcHJpdmF0ZSBzaG9ydGN1dFxuICAgIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbiAgcmV0dXJuIHR3ZW1vamk7XG5cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vICBwcml2YXRlIGZ1bmN0aW9ucyAgLy9cbiAgLy8gICAgIGRlY2xhcmF0aW9uICAgICAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFNob3J0Y3V0IHRvIGNyZWF0ZSB0ZXh0IG5vZGVzXG4gICAqIEBwYXJhbSAgIHN0cmluZyAgdGV4dCB1c2VkIHRvIGNyZWF0ZSBET00gdGV4dCBub2RlXG4gICAqIEByZXR1cm4gIE5vZGUgIGEgRE9NIG5vZGUgd2l0aCB0aGF0IHRleHRcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVRleHQodGV4dCwgY2xlYW4pIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2xlYW4gPyB0ZXh0LnJlcGxhY2UoVUZFMEZnLCAnJykgOiB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVzY2FwZSBodG1sIGF0dHJpYnV0ZSB0ZXh0XG4gICAqIEBwYXJhbSAgIHN0cmluZyAgdGV4dCB1c2UgaW4gSFRNTCBhdHRyaWJ1dGVcbiAgICogQHJldHVybiAgc3RyaW5nICB0ZXh0IGVuY29kZWQgdG8gdXNlIGluIEhUTUwgYXR0cmlidXRlXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKHJlc2NhcGVyLCByZXBsYWNlcik7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBjYWxsYmFjayB1c2VkIHRvIGdlbmVyYXRlIGVtb2ppIHNyY1xuICAgKiAgYmFzZWQgb24gVHdpdHRlciBDRE5cbiAgICogQHBhcmFtICAgc3RyaW5nICAgIHRoZSBlbW9qaSBjb2RlcG9pbnQgc3RyaW5nXG4gICAqIEBwYXJhbSAgIHN0cmluZyAgICB0aGUgZGVmYXVsdCBzaXplIHRvIHVzZSwgaS5lLiBcIjM2eDM2XCJcbiAgICogQHJldHVybiAgc3RyaW5nICAgIHRoZSBpbWFnZSBzb3VyY2UgdG8gdXNlXG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0SW1hZ2VTcmNHZW5lcmF0b3IoaWNvbiwgb3B0aW9ucykge1xuICAgIHJldHVybiAnJy5jb25jYXQob3B0aW9ucy5iYXNlLCBvcHRpb25zLnNpemUsICcvJywgaWNvbiwgb3B0aW9ucy5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZ2VuZXJpYyBET00gbm9kZVR5cGUgMSwgd2FsayB0aHJvdWdoIGFsbCBjaGlsZHJlblxuICAgKiBhbmQgc3RvcmUgZXZlcnkgbm9kZVR5cGUgMyAoI3RleHQpIGZvdW5kIGluIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gICBFbGVtZW50IGEgRE9NIEVsZW1lbnQgd2l0aCBwcm9iYWJseSBzb21lIHRleHQgaW4gaXRcbiAgICogQHBhcmFtICAgQXJyYXkgdGhlIGxpc3Qgb2YgcHJldmlvdXNseSBkaXNjb3ZlcmVkIHRleHQgbm9kZXNcbiAgICogQHJldHVybiAgQXJyYXkgc2FtZSBsaXN0IHdpdGggbmV3IGRpc2NvdmVyZWQgbm9kZXMsIGlmIGFueVxuICAgKi9cbiAgZnVuY3Rpb24gZ3JhYkFsbFRleHROb2Rlcyhub2RlLCBhbGxUZXh0KSB7XG4gICAgdmFyXG4gICAgICBjaGlsZE5vZGVzID0gbm9kZS5jaGlsZE5vZGVzLFxuICAgICAgbGVuZ3RoID0gY2hpbGROb2Rlcy5sZW5ndGgsXG4gICAgICBzdWJub2RlLFxuICAgICAgbm9kZVR5cGU7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBzdWJub2RlID0gY2hpbGROb2Rlc1tsZW5ndGhdO1xuICAgICAgbm9kZVR5cGUgPSBzdWJub2RlLm5vZGVUeXBlO1xuICAgICAgLy8gcGFyc2UgZW1vamkgb25seSBpbiB0ZXh0IG5vZGVzXG4gICAgICBpZiAobm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgLy8gY29sbGVjdCB0aGVtIHRvIHByb2Nlc3MgZW1vamkgbGF0ZXJcbiAgICAgICAgYWxsVGV4dC5wdXNoKHN1Ym5vZGUpO1xuICAgICAgfVxuICAgICAgLy8gaWdub3JlIGFsbCBub2RlcyB0aGF0IGFyZSBub3QgdHlwZSAxLCB0aGF0IGFyZSBzdmcsIG9yIHRoYXRcbiAgICAgIC8vIHNob3VsZCBub3QgYmUgcGFyc2VkIGFzIHNjcmlwdCwgc3R5bGUsIGFuZCBvdGhlcnNcbiAgICAgIGVsc2UgaWYgKG5vZGVUeXBlID09PSAxICYmICEoJ293bmVyU1ZHRWxlbWVudCcgaW4gc3Vibm9kZSkgJiZcbiAgICAgICAgICAhc2hvdWxkbnRCZVBhcnNlZC50ZXN0KHN1Ym5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgZ3JhYkFsbFRleHROb2RlcyhzdWJub2RlLCBhbGxUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbFRleHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBib3RoIHJlbW92ZSB0aGUgcG9zc2libGUgdmFyaWFudFxuICAgKiAgYW5kIHRvIGNvbnZlcnQgdXRmMTYgaW50byBjb2RlIHBvaW50cy5cbiAgICogIElmIHRoZXJlIGlzIGEgemVyby13aWR0aC1qb2luZXIgKFUrMjAwRCksIGxlYXZlIHRoZSB2YXJpYW50cyBpbi5cbiAgICogQHBhcmFtICAgc3RyaW5nICAgIHRoZSByYXcgdGV4dCBvZiB0aGUgZW1vamkgbWF0Y2hcbiAgICogQHJldHVybiAgc3RyaW5nICAgIHRoZSBjb2RlIHBvaW50XG4gICAqL1xuICBmdW5jdGlvbiBncmFiVGhlUmlnaHRJY29uKHJhd1RleHQpIHtcbiAgICAvLyBpZiB2YXJpYW50IGlzIHByZXNlbnQgYXMgXFx1RkUwRlxuICAgIHJldHVybiB0b0NvZGVQb2ludChyYXdUZXh0LmluZGV4T2YoVTIwMEQpIDwgMCA/XG4gICAgICByYXdUZXh0LnJlcGxhY2UoVUZFMEZnLCAnJykgOlxuICAgICAgcmF3VGV4dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRE9NIHZlcnNpb24gb2YgdGhlIHNhbWUgbG9naWMgLyBwYXJzZXI6XG4gICAqICBlbW9qaWZ5IGFsbCBmb3VuZCBzdWItdGV4dCBub2RlcyBwbGFjaW5nIGltYWdlcyBub2RlIGluc3RlYWQuXG4gICAqIEBwYXJhbSAgIEVsZW1lbnQgICBnZW5lcmljIERPTSBub2RlIHdpdGggc29tZSB0ZXh0IGluIHNvbWUgY2hpbGQgbm9kZVxuICAgKiBAcGFyYW0gICBPYmplY3QgICAgb3B0aW9ucyAgY29udGFpbmluZyBpbmZvIGFib3V0IGhvdyB0byBwYXJzZVxuICAgICpcbiAgICAqICAgICAgICAgICAgLmNhbGxiYWNrICAgRnVuY3Rpb24gIHRoZSBjYWxsYmFjayB0byBpbnZva2UgcGVyIGVhY2ggZm91bmQgZW1vamkuXG4gICAgKiAgICAgICAgICAgIC5iYXNlICAgICAgIHN0cmluZyAgICB0aGUgYmFzZSB1cmwsIGJ5IGRlZmF1bHQgdHdlbW9qaS5iYXNlXG4gICAgKiAgICAgICAgICAgIC5leHQgICAgICAgIHN0cmluZyAgICB0aGUgaW1hZ2UgZXh0ZW5zaW9uLCBieSBkZWZhdWx0IHR3ZW1vamkuZXh0XG4gICAgKiAgICAgICAgICAgIC5zaXplICAgICAgIHN0cmluZyAgICB0aGUgYXNzZXRzIHNpemUsIGJ5IGRlZmF1bHQgdHdlbW9qaS5zaXplXG4gICAgKlxuICAgKiBAcmV0dXJuICBFbGVtZW50IHNhbWUgZ2VuZXJpYyBub2RlIHdpdGggZW1vamkgaW4gcGxhY2UsIGlmIGFueS5cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlTm9kZShub2RlLCBvcHRpb25zKSB7XG4gICAgdmFyXG4gICAgICBhbGxUZXh0ID0gZ3JhYkFsbFRleHROb2Rlcyhub2RlLCBbXSksXG4gICAgICBsZW5ndGggPSBhbGxUZXh0Lmxlbmd0aCxcbiAgICAgIGF0dHJpYixcbiAgICAgIGF0dHJuYW1lLFxuICAgICAgbW9kaWZpZWQsXG4gICAgICBmcmFnbWVudCxcbiAgICAgIHN1Ym5vZGUsXG4gICAgICB0ZXh0LFxuICAgICAgbWF0Y2gsXG4gICAgICBpLFxuICAgICAgaW5kZXgsXG4gICAgICBpbWcsXG4gICAgICByYXdUZXh0LFxuICAgICAgaWNvbklkLFxuICAgICAgc3JjO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgbW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgc3Vibm9kZSA9IGFsbFRleHRbbGVuZ3RoXTtcbiAgICAgIHRleHQgPSBzdWJub2RlLm5vZGVWYWx1ZTtcbiAgICAgIGkgPSAwO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IHJlLmV4ZWModGV4dCkpKSB7XG4gICAgICAgIGluZGV4ID0gbWF0Y2guaW5kZXg7XG4gICAgICAgIGlmIChpbmRleCAhPT0gaSkge1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgY3JlYXRlVGV4dCh0ZXh0LnNsaWNlKGksIGluZGV4KSwgdHJ1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJhd1RleHQgPSBtYXRjaFswXTtcbiAgICAgICAgaWNvbklkID0gZ3JhYlRoZVJpZ2h0SWNvbihyYXdUZXh0KTtcbiAgICAgICAgaSA9IGluZGV4ICsgcmF3VGV4dC5sZW5ndGg7XG4gICAgICAgIHNyYyA9IG9wdGlvbnMuY2FsbGJhY2soaWNvbklkLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKGljb25JZCAmJiBzcmMpIHtcbiAgICAgICAgICBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICBpbWcub25lcnJvciA9IG9wdGlvbnMub25lcnJvcjtcbiAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAnZmFsc2UnKTtcbiAgICAgICAgICBhdHRyaWIgPSBvcHRpb25zLmF0dHJpYnV0ZXMocmF3VGV4dCwgaWNvbklkKTtcbiAgICAgICAgICBmb3IgKGF0dHJuYW1lIGluIGF0dHJpYikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBhdHRyaWIuaGFzT3duUHJvcGVydHkoYXR0cm5hbWUpICYmXG4gICAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGFueSBoYW5kbGVycyB0byBiZSBzZXQgKyBkb24ndCBhbGxvdyBvdmVycmlkZXNcbiAgICAgICAgICAgICAgYXR0cm5hbWUuaW5kZXhPZignb24nKSAhPT0gMCAmJlxuICAgICAgICAgICAgICAhaW1nLmhhc0F0dHJpYnV0ZShhdHRybmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKGF0dHJuYW1lLCBhdHRyaWJbYXR0cm5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaW1nLmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lO1xuICAgICAgICAgIGltZy5hbHQgPSByYXdUZXh0O1xuICAgICAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGltZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbWcpIGZyYWdtZW50LmFwcGVuZENoaWxkKGNyZWF0ZVRleHQocmF3VGV4dCwgZmFsc2UpKTtcbiAgICAgICAgaW1nID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIGlzIHRoZXJlIGFjdHVhbGx5IGFueXRoaW5nIHRvIHJlcGxhY2UgaW4gaGVyZSA/XG4gICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgLy8gYW55IHRleHQgbGVmdCB0byBiZSBhZGRlZCA/XG4gICAgICAgIGlmIChpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGNyZWF0ZVRleHQodGV4dC5zbGljZShpKSwgdHJ1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSBvbmx5LCBsZWF2ZSBpbnRhY3RcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSBzdXJyb3VuZGluZyBzdWNoIHRleHRcbiAgICAgICAgc3Vibm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmcmFnbWVudCwgc3Vibm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmluZy9IVE1MIHZlcnNpb24gb2YgdGhlIHNhbWUgbG9naWMgLyBwYXJzZXI6XG4gICAqICBlbW9qaWZ5IGEgZ2VuZXJpYyB0ZXh0IHBsYWNpbmcgaW1hZ2VzIHRhZ3MgaW5zdGVhZCBvZiBzdXJyb2dhdGVzIHBhaXIuXG4gICAqIEBwYXJhbSAgIHN0cmluZyAgICBnZW5lcmljIHN0cmluZyB3aXRoIHBvc3NpYmx5IHNvbWUgZW1vamkgaW4gaXRcbiAgICogQHBhcmFtICAgT2JqZWN0ICAgIG9wdGlvbnMgIGNvbnRhaW5pbmcgaW5mbyBhYm91dCBob3cgdG8gcGFyc2VcbiAgICpcbiAgICogICAgICAgICAgICAuY2FsbGJhY2sgICBGdW5jdGlvbiAgdGhlIGNhbGxiYWNrIHRvIGludm9rZSBwZXIgZWFjaCBmb3VuZCBlbW9qaS5cbiAgICogICAgICAgICAgICAuYmFzZSAgICAgICBzdHJpbmcgICAgdGhlIGJhc2UgdXJsLCBieSBkZWZhdWx0IHR3ZW1vamkuYmFzZVxuICAgKiAgICAgICAgICAgIC5leHQgICAgICAgIHN0cmluZyAgICB0aGUgaW1hZ2UgZXh0ZW5zaW9uLCBieSBkZWZhdWx0IHR3ZW1vamkuZXh0XG4gICAqICAgICAgICAgICAgLnNpemUgICAgICAgc3RyaW5nICAgIHRoZSBhc3NldHMgc2l6ZSwgYnkgZGVmYXVsdCB0d2Vtb2ppLnNpemVcbiAgICpcbiAgICogQHJldHVybiAgdGhlIHN0cmluZyB3aXRoIDxpbWcgdGFncz4gcmVwbGFjaW5nIGFsbCBmb3VuZCBhbmQgcGFyc2VkIGVtb2ppXG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcmVwbGFjZShzdHIsIGZ1bmN0aW9uIChyYXdUZXh0KSB7XG4gICAgICB2YXJcbiAgICAgICAgcmV0ID0gcmF3VGV4dCxcbiAgICAgICAgaWNvbklkID0gZ3JhYlRoZVJpZ2h0SWNvbihyYXdUZXh0KSxcbiAgICAgICAgc3JjID0gb3B0aW9ucy5jYWxsYmFjayhpY29uSWQsIG9wdGlvbnMpLFxuICAgICAgICBhdHRyaWIsXG4gICAgICAgIGF0dHJuYW1lO1xuICAgICAgaWYgKGljb25JZCAmJiBzcmMpIHtcbiAgICAgICAgLy8gcmVjeWNsZSB0aGUgbWF0Y2ggc3RyaW5nIHJlcGxhY2luZyB0aGUgZW1vamlcbiAgICAgICAgLy8gd2l0aCBpdHMgaW1hZ2UgY291bnRlciBwYXJ0XG4gICAgICAgIHJldCA9ICc8aW1nICcuY29uY2F0KFxuICAgICAgICAgICdjbGFzcz1cIicsIG9wdGlvbnMuY2xhc3NOYW1lLCAnXCIgJyxcbiAgICAgICAgICAnZHJhZ2dhYmxlPVwiZmFsc2VcIiAnLFxuICAgICAgICAgIC8vIG5lZWRzIHRvIHByZXNlcnZlIHVzZXIgb3JpZ2luYWwgaW50ZW50XG4gICAgICAgICAgLy8gd2hlbiB2YXJpYW50cyBzaG91bGQgYmUgY29waWVkIGFuZCBwYXN0ZWQgdG9vXG4gICAgICAgICAgJ2FsdD1cIicsXG4gICAgICAgICAgcmF3VGV4dCxcbiAgICAgICAgICAnXCInLFxuICAgICAgICAgICcgc3JjPVwiJyxcbiAgICAgICAgICBzcmMsXG4gICAgICAgICAgJ1wiJ1xuICAgICAgICApO1xuICAgICAgICBhdHRyaWIgPSBvcHRpb25zLmF0dHJpYnV0ZXMocmF3VGV4dCwgaWNvbklkKTtcbiAgICAgICAgZm9yIChhdHRybmFtZSBpbiBhdHRyaWIpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRyaWIuaGFzT3duUHJvcGVydHkoYXR0cm5hbWUpICYmXG4gICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBhbnkgaGFuZGxlcnMgdG8gYmUgc2V0ICsgZG9uJ3QgYWxsb3cgb3ZlcnJpZGVzXG4gICAgICAgICAgICBhdHRybmFtZS5pbmRleE9mKCdvbicpICE9PSAwICYmXG4gICAgICAgICAgICByZXQuaW5kZXhPZignICcgKyBhdHRybmFtZSArICc9JykgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXQgPSByZXQuY29uY2F0KCcgJywgYXR0cm5hbWUsICc9XCInLCBlc2NhcGVIVE1MKGF0dHJpYlthdHRybmFtZV0pLCAnXCInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0ID0gcmV0LmNvbmNhdCgnLz4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBhY3R1YWxseSByZXBsYWNlIEhUTUwgc3BlY2lhbCBjaGFyc1xuICAgKiBAcGFyYW0gICBzdHJpbmcgIEhUTUwgc3BlY2lhbCBjaGFyXG4gICAqIEByZXR1cm4gIHN0cmluZyAgZW5jb2RlZCBIVE1MIHNwZWNpYWwgY2hhclxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZXIobSkge1xuICAgIHJldHVybiBlc2NhcGVyW21dO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucy5hdHRyaWJ1dGUgY2FsbGJhY2tcbiAgICogQHJldHVybiAgbnVsbFxuICAgKi9cbiAgZnVuY3Rpb24gcmV0dXJuTnVsbCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGdlbmVyaWMgdmFsdWUsIGNyZWF0ZXMgaXRzIHNxdWFyZWQgY291bnRlcnBhcnQgaWYgaXQncyBhIG51bWJlci5cbiAgICogIEFzIGV4YW1wbGUsIG51bWJlciAzNiB3aWxsIHJldHVybiAnMzZ4MzYnLlxuICAgKiBAcGFyYW0gICBhbnkgICAgIGEgZ2VuZXJpYyB2YWx1ZS5cbiAgICogQHJldHVybiAgYW55ICAgICBhIHN0cmluZyByZXByZXNlbnRpbmcgYXNzZXQgc2l6ZSwgaS5lLiBcIjM2eDM2XCJcbiAgICogICAgICAgICAgICAgICAgICBvbmx5IGluIGNhc2UgdGhlIHZhbHVlIHdhcyBhIG51bWJlci5cbiAgICogICAgICAgICAgICAgICAgICBSZXR1cm5zIGluaXRpYWwgdmFsdWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZnVuY3Rpb24gdG9TaXplU3F1YXJlZEFzc2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgP1xuICAgICAgdmFsdWUgKyAneCcgKyB2YWx1ZSA6XG4gICAgICB2YWx1ZTtcbiAgfVxuXG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyAgZXhwb3J0ZWQgZnVuY3Rpb25zIC8vXG4gIC8vICAgICBkZWNsYXJhdGlvbiAgICAgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY29kZXBvaW50KSB7XG4gICAgdmFyIGNvZGUgPSB0eXBlb2YgY29kZXBvaW50ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgcGFyc2VJbnQoY29kZXBvaW50LCAxNikgOiBjb2RlcG9pbnQ7XG4gICAgaWYgKGNvZGUgPCAweDEwMDAwKSB7XG4gICAgICByZXR1cm4gZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgIH1cbiAgICBjb2RlIC09IDB4MTAwMDA7XG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgIDB4RDgwMCArIChjb2RlID4+IDEwKSxcbiAgICAgIDB4REMwMCArIChjb2RlICYgMHgzRkYpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlKHdoYXQsIGhvdykge1xuICAgIGlmICghaG93IHx8IHR5cGVvZiBob3cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhvdyA9IHtjYWxsYmFjazogaG93fTtcbiAgICB9XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgc3RyaW5nLCBpbmplY3QgaHRtbCA8aW1nPiB0YWdzXG4gICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgRE9NIHRyZWUgYW5kIHBhcnNlIHRleHQgbm9kZXMgb25seVxuICAgIHJldHVybiAodHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnID8gcGFyc2VTdHJpbmcgOiBwYXJzZU5vZGUpKHdoYXQsIHtcbiAgICAgIGNhbGxiYWNrOiAgIGhvdy5jYWxsYmFjayB8fCBkZWZhdWx0SW1hZ2VTcmNHZW5lcmF0b3IsXG4gICAgICBhdHRyaWJ1dGVzOiB0eXBlb2YgaG93LmF0dHJpYnV0ZXMgPT09ICdmdW5jdGlvbicgPyBob3cuYXR0cmlidXRlcyA6IHJldHVybk51bGwsXG4gICAgICBiYXNlOiAgICAgICB0eXBlb2YgaG93LmJhc2UgPT09ICdzdHJpbmcnID8gaG93LmJhc2UgOiB0d2Vtb2ppLmJhc2UsXG4gICAgICBleHQ6ICAgICAgICBob3cuZXh0IHx8IHR3ZW1vamkuZXh0LFxuICAgICAgc2l6ZTogICAgICAgaG93LmZvbGRlciB8fCB0b1NpemVTcXVhcmVkQXNzZXQoaG93LnNpemUgfHwgdHdlbW9qaS5zaXplKSxcbiAgICAgIGNsYXNzTmFtZTogIGhvdy5jbGFzc05hbWUgfHwgdHdlbW9qaS5jbGFzc05hbWUsXG4gICAgICBvbmVycm9yOiAgICBob3cub25lcnJvciB8fCB0d2Vtb2ppLm9uZXJyb3JcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2UodGV4dCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gU3RyaW5nKHRleHQpLnJlcGxhY2UocmUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRlc3QodGV4dCkge1xuICAgIC8vIElFNiBuZWVkcyBhIHJlc2V0IGJlZm9yZSB0b29cbiAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSByZS50ZXN0KHRleHQpO1xuICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvQ29kZVBvaW50KHVuaWNvZGVTdXJyb2dhdGVzLCBzZXApIHtcbiAgICB2YXJcbiAgICAgIHIgPSBbXSxcbiAgICAgIGMgPSAwLFxuICAgICAgcCA9IDAsXG4gICAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHVuaWNvZGVTdXJyb2dhdGVzLmxlbmd0aCkge1xuICAgICAgYyA9IHVuaWNvZGVTdXJyb2dhdGVzLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgIGlmIChwKSB7XG4gICAgICAgIHIucHVzaCgoMHgxMDAwMCArICgocCAtIDB4RDgwMCkgPDwgMTApICsgKGMgLSAweERDMDApKS50b1N0cmluZygxNikpO1xuICAgICAgICBwID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoMHhEODAwIDw9IGMgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgcCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByLnB1c2goYy50b1N0cmluZygxNikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gci5qb2luKHNlcCB8fCAnLScpO1xuICB9XG5cbn0oKSk7XG5pZiAoIWxvY2F0aW9uLnByb3RvY29sKSB7XG4gIHR3ZW1vamkuYmFzZSA9IHR3ZW1vamkuYmFzZS5yZXBsYWNlKC9eaHR0cDovLCBcIlwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gdHdlbW9qaTsiLCJpbXBvcnQgeyBBcHAsIEZ1enp5U3VnZ2VzdE1vZGFsLCBQbHVnaW4sIEZ1enp5TWF0Y2gsIE1hcmtkb3duUG9zdFByb2Nlc3NvciwgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgb3JkZXJlZEVtb2ppIGZyb20gJ3VuaWNvZGUtZW1vamktanNvbi9kYXRhLW9yZGVyZWQtZW1vamknXG5pbXBvcnQgZW1vamlOYW1lcyBmcm9tICd1bmljb2RlLWVtb2ppLWpzb24vZGF0YS1ieS1lbW9qaSdcbmltcG9ydCB0d2Vtb2ppIGZyb20gJ3R3ZW1vamknXG5cbmNvbnN0IGluZGljYXRvclN0eWxlOiBzdHJpbmcgPVxuICAnY29sb3I6IHZhcigtLXRleHQtYWNjZW50KTsgd2lkdGg6IDIuNWVtOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZsb2F0OmxlZnQ7IGZvbnQtd2VpZ2h0OjgwMDsnO1xuXG5pbnRlcmZhY2UgTXlQbHVnaW5TZXR0aW5ncyB7XG4gIHR3ZW1vamlBY3RpdmU6IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IE15UGx1Z2luU2V0dGluZ3MgPSB7XG5cdHR3ZW1vamlBY3RpdmU6IHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBlbW9qaXM6IEVtb2ppSXRlbVtdXG4gIHNldHRpbmdzOiBNeVBsdWdpblNldHRpbmdzO1xuXG4gIHB1YmxpYyBzdGF0aWMgcG9zdHByb2Nlc3NvcjogTWFya2Rvd25Qb3N0UHJvY2Vzc29yID0gKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHRcbiAgKSA9PiB7XG4gICAgdHdlbW9qaS5wYXJzZShlbClcbiAgfVxuXG4gIGxvYWRFbW9qaXMoKTogRW1vamlJdGVtW10ge1xuICAgIGZ1bmN0aW9uIHRpdGxlQ2FzZShzdHJpbmc6IHN0cmluZykge1xuICAgICAgbGV0IHNlbnRlbmNlID0gc3RyaW5nLnRvTG93ZXJDYXNlKCkuc3BsaXQoJ18nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VudGVuY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VudGVuY2VbaV0gPSBzZW50ZW5jZVtpXVswXS50b1VwcGVyQ2FzZSgpICsgc2VudGVuY2VbaV0uc2xpY2UoMSk7XG4gICAgICB9XG4gIFxuICAgICAgcmV0dXJuIHNlbnRlbmNlLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBsZXQgaXRlbXMgPSBvcmRlcmVkRW1vamkubWFwKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRpdGxlQ2FzZShlbW9qaU5hbWVzW25hbWVdW1wibmFtZVwiXSksXG4gICAgICAgIGNoYXI6IG5hbWUsXG4gICAgICAgIGltZ0h0bWw6IHR3ZW1vamkucGFyc2UobmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICBcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cbiAgICB0aGlzLmVtb2ppcyA9IHRoaXMubG9hZEVtb2ppcygpO1xuXG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKVxuXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHdlbW9qaUFjdGl2ZSkge1xuICAgICAgTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIucmVnaXN0ZXJQb3N0UHJvY2Vzc29yKE15UGx1Z2luLnBvc3Rwcm9jZXNzb3IpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnZW1vamktcGlja2VyOm9wZW4tcGlja2VyJyxcbiAgICAgIG5hbWU6ICdPcGVuIGVtb2ppIHBpY2tlcicsXG4gICAgICBob3RrZXlzOiBbXSxcblx0XHRcdGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRsZXQgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuXHRcdFx0XHRpZiAobGVhZikge1xuXHRcdFx0XHRcdGlmICghY2hlY2tpbmcpIHtcblx0XHRcdFx0XHRcdG5ldyBFbW9qaUZ1enp5U3VnZ2VzdE1vZGFsKHRoaXMuYXBwLCB0aGlzLmVtb2ppcywgdGhpcy5zZXR0aW5ncykub3BlbigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0fVxuXG5cdG9udW5sb2FkKCkge1xuICB9XG4gIFxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufVxuXG5pbnRlcmZhY2UgRW1vamlJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjaGFyOiBzdHJpbmc7XG4gIGltZ0h0bWw6IHN0cmluZztcbn1cblxuXG5jbGFzcyBFbW9qaUZ1enp5U3VnZ2VzdE1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8RW1vamlJdGVtPiB7XG4gIGFwcDogQXBwO1xuICBlbW9qaXM6IEVtb2ppSXRlbVtdO1xuICBzZXR0aW5nczogTXlQbHVnaW5TZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZW1vamlzOiBFbW9qaUl0ZW1bXSwgc2V0dGluZ3M6IE15UGx1Z2luU2V0dGluZ3MpIHtcbiAgICAgIHN1cGVyKGFwcCk7XG4gICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgIHRoaXMuZW1vamlzID0gZW1vamlzO1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICB9XG5cbiAgZ2V0SXRlbXMoKTogRW1vamlJdGVtW10ge1xuICAgICAgcmV0dXJuIHRoaXMuZW1vamlzO1xuICB9XG5cbiAgZ2V0SXRlbVRleHQoaXRlbTogRW1vamlJdGVtKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICByZW5kZXJTdWdnZXN0aW9uKGl0ZW06IEZ1enp5TWF0Y2g8RW1vamlJdGVtPiwgZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgc3VwZXIucmVuZGVyU3VnZ2VzdGlvbihpdGVtLCBlbCk7XG4gICAgdGhpcy51cGRhdGVTdWdnZXN0aW9uRWxGb3JNb2RlKGl0ZW0sIGVsKTtcbiAgfVxuXG4gIHVwZGF0ZVN1Z2dlc3Rpb25FbEZvck1vZGUoaXRlbTogRnV6enlNYXRjaDxFbW9qaUl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpIHtcblxuICAgIHZhciBpbmRpY2F0b3JFbCA9IGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBhdHRyOiB7IHN0eWxlOiBpbmRpY2F0b3JTdHlsZSB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHdlbW9qaUFjdGl2ZSkge1xuICAgICAgaW5kaWNhdG9yRWwuaW5uZXJIVE1MID0gaXRlbS5pdGVtLmltZ0h0bWxcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNhdG9yRWwudGV4dENvbnRlbnQgPSBpdGVtLml0ZW0uY2hhclxuICAgIH1cbiAgICBcbiAgICBlbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBpbmRpY2F0b3JFbCk7XG4gIH1cblxuICBvbkNob29zZUl0ZW0oaXRlbTogRW1vamlJdGVtLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydFRleHQnLCBmYWxzZSwgaXRlbS5jaGFyKVxuICB9XG59XG5cbmNsYXNzIFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogTXlQbHVnaW47XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogTXlQbHVnaW4pIHtcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdH1cblxuXHRkaXNwbGF5KCk6IHZvaWQge1xuXHRcdGxldCB7Y29udGFpbmVyRWx9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogJ0Vtb2ppIFRvb2xiYXInfSk7XG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2EnLCB7IHRleHQ6ICdDcmVhdGVkIGJ5IG9saXZlcnloJywgaHJlZjogJ2h0dHBzOi8vZ2l0aHViLmNvbS9vbGl2ZXJ5aC8nfSkpO1xuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyd9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1R3aXR0ZXIgRW1vamknKVxuICAgICAgLnNldERlc2MoJ0ltcHJvdmVkIGVtb2ppIHN1cHBvcnQuIE5vdGU6IHRoaXMgYXBwbGllcyB0byBlbW9qaSBzZWFyY2ggYW5kIHByZXZpZXcgb25seS4nKVxuXHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50d2Vtb2ppQWN0aXZlKVxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudHdlbW9qaUFjdGl2ZSA9IHZhbHVlO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIucmVnaXN0ZXJQb3N0UHJvY2Vzc29yKE15UGx1Z2luLnBvc3Rwcm9jZXNzb3IpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLnVucmVnaXN0ZXJQb3N0UHJvY2Vzc29yKE15UGx1Z2luLnBvc3Rwcm9jZXNzb3IpXG4gICAgICAgICAgfVxuXHRcdFx0XHR9KSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJnbG9iYWwiLCJ0d2Vtb2ppIiwiTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIiLCJQbHVnaW4iLCJGdXp6eVN1Z2dlc3RNb2RhbCIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxF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U0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDbEUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pGLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZHQSxJQUFJLFFBQVEsR0FBR0EsY0FBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDckM7QUFDQSxJQUFJLE9BQU8sSUFBSTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFJLEVBQUUsc0NBQXNDO0FBQ2xEO0FBQ0E7QUFDQSxNQUFNLEdBQUcsRUFBRSxNQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLE1BQU0s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 diff --git a/.obsidian/plugins/obsidian-emoji-toolbar/manifest.json b/.obsidian/plugins/obsidian-emoji-toolbar/manifest.json deleted file mode 100644 index 1e417b06..00000000 --- a/.obsidian/plugins/obsidian-emoji-toolbar/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "obsidian-emoji-toolbar", - "name": "Emoji Toolbar", - "version": "0.2.2", - "description": "Quickly search for and insert emojis into your notes.", - "author": "oliveryh", - "authorUrl": "https://github.com/oliveryh/obsidian-emoji-toolbar", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/obsidian-emoji-toolbar/styles.css b/.obsidian/plugins/obsidian-emoji-toolbar/styles.css deleted file mode 100644 index 057b1812..00000000 --- a/.obsidian/plugins/obsidian-emoji-toolbar/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -img.emoji { - height: 1em; - width: 1em; - margin: 0 0.05em 0 0.1em; - vertical-align: -0.1em; - display: inline-block; -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/.gitignore b/.obsidian/plugins/obsidian-icon-folder-1.0.0/.gitignore deleted file mode 100644 index 3e9125e6..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Intellij -*.iml -.idea - -# npm -node_modules - -# build -main.js -*.js.map - -# obsidian -data.json diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/README.md b/.obsidian/plugins/obsidian-icon-folder-1.0.0/README.md deleted file mode 100644 index 78536e20..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Obsidian Icon Folder - -This obsidian plugin allows you to add icons to your folder. - -Right now, the current iconsets are available: -* [Remixicon](https://remixicon.com/) - -## Screenshots - -Here is one way to - -## How to use - -It is pretty simple to add a icon to your folder: - -1. Right click on the folder where you want to add an icon -2. Select the `Change Icon` menu item (prefixed with a `#` icon) -3. Select the icon you want and profit! - -To delete an icon, you just need to click on the `Delete Icon` (prefixed with a `trash` icon) menu item. \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/manifest.json b/.obsidian/plugins/obsidian-icon-folder-1.0.0/manifest.json deleted file mode 100644 index 9321efba..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-icon-folder", - "name": "Icon Folder", - "version": "1.0.0", - "minAppVersion": "0.9.12", - "description": "This plugin allows to add an emoji in front of a folder.", - "author": "Florian Woelki", - "authorUrl": "https://florianwoelki.com/", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/package.json b/.obsidian/plugins/obsidian-icon-folder-1.0.0/package.json deleted file mode 100644 index e0049537..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "obsidian-icon-folder", - "version": "1.0.0", - "description": "This is an obsidian plugin that allows us to use an icon in the prefix of a folder name.", - "main": "main.js", - "scripts": { - "dev": "rollup --config rollup.config.js -w", - "build": "rollup --config rollup.config.js --environment BUILD:production" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@rollup/plugin-commonjs": "^18.0.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-typescript": "^8.2.1", - "@types/node": "^14.14.37", - "obsidian": "^0.12.0", - "rollup": "^2.32.1", - "tslib": "^2.2.0", - "typescript": "^4.2.4" - }, - "dependencies": { - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-icons": "^4.2.0" - } -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/rollup.config.js b/.obsidian/plugins/obsidian-icon-folder-1.0.0/rollup.config.js deleted file mode 100644 index 317497c6..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/rollup.config.js +++ /dev/null @@ -1,30 +0,0 @@ -import typescript from '@rollup/plugin-typescript'; -import {nodeResolve} from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; - -const isProd = (process.env.BUILD === 'production'); - -const banner = -`/* -THIS IS A GENERATED/BUNDLED FILE BY ROLLUP -if you want to view the source visit the plugins github repository -*/ -`; - -export default { - input: './src/main.ts', - output: { - dir: '.', - sourcemap: 'inline', - sourcemapExcludeSources: isProd, - format: 'cjs', - exports: 'default', - banner, - }, - external: ['obsidian'], - plugins: [ - typescript(), - nodeResolve({browser: true}), - commonjs(), - ] -}; \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/iconsPickerModal.ts b/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/iconsPickerModal.ts deleted file mode 100644 index a625772b..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/iconsPickerModal.ts +++ /dev/null @@ -1,70 +0,0 @@ -import * as remixicons from 'react-icons/ri/index'; -import { App, FuzzyMatch, FuzzySuggestModal } from 'obsidian'; -// @ts-ignore -import { renderToString } from 'react-dom/server'; -import IconFolderPlugin from './main'; -import { addToDOM } from './util'; - -export interface Icon { - id: string; - name: string; -} - -export default class IconsPickerModal extends FuzzySuggestModal { - private plugin: IconFolderPlugin; - private path: string; - - constructor(app: App, plugin: IconFolderPlugin, path: string) { - super(app); - this.plugin = plugin; - this.path = path; - } - - onOpen() { - super.onOpen(); - } - - onClose() { - let { contentEl } = this; - contentEl.empty(); - } - - getItemText(item: Icon): string { - return item.name; - } - - getItems(): Icon[] { - const iconKeys: Icon[] = []; - for (let icon in remixicons) { - iconKeys.push({ - id: icon, - name: icon.substring(2), - }); - } - - return iconKeys; - } - - onChooseItem(item: Icon): void { - addToDOM(this.plugin, this.path, item.id); - this.plugin.addFolderIcon(this.path, item.id); - } - - renderSuggestion(item: FuzzyMatch, el: HTMLElement): void { - super.renderSuggestion(item, el); - - if (item.item.id !== 'default') { - const iconPreviewNode = el.createDiv('div'); - iconPreviewNode.innerHTML = renderToString( - // @ts-ignore - remixicons[item.item.id]({ - size: '16px', - }), - ); - iconPreviewNode.style.position = 'absolute'; - iconPreviewNode.style.top = '0'; - iconPreviewNode.style.left = '0'; - iconPreviewNode.style.marginTop = '7px'; - } - } -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/main.ts b/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/main.ts deleted file mode 100644 index 8aea98c3..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/main.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Plugin, MenuItem } from 'obsidian'; -import IconsPickerModal from './iconsPickerModal'; -import { addToDOMWithElement, removeFromDOM, waitForNode } from './util'; - -export default class IconFolderPlugin extends Plugin { - private folderIconData: Record; - - async onload() { - console.log('loading plugin obsidian-icon-folder'); - - await this.loadIconFolderData(); - - Object.entries(this.folderIconData).forEach(([key, value]) => { - waitForNode(`[data-path="${key}"]`).then((node) => { - addToDOMWithElement(this, key, value, node); - }); - }); - - this.registerEvent( - this.app.workspace.on('file-menu', (menu, file) => { - const addIconMenuItem = (item: MenuItem) => { - item.setTitle('Change icon'); - item.setIcon('hashtag'); - item.onClick(() => { - menu.hide(); - const modal = new IconsPickerModal(this.app, this, file.path); - modal.open(); - }); - }; - - const removeIconMenuItem = (item: MenuItem) => { - item.setTitle('Remove icon'); - item.setIcon('trash'); - item.onClick(() => { - menu.hide(); - this.removeFolderIcon(file.path); - removeFromDOM(file.path); - }); - }; - - menu.addItem(addIconMenuItem); - menu.addItem(removeIconMenuItem); - }), - ); - } - - onunload() { - console.log('unloading plugin obsidian-icon-folder'); - } - - removeFolderIcon(path: string): void { - delete this.folderIconData[path]; - this.saveIconFolderData(); - } - - addFolderIcon(path: string, iconId: string): void { - if (this.folderIconData[path]) { - removeFromDOM(path); - } - - this.folderIconData[path] = iconId; - this.saveIconFolderData(); - } - - async loadIconFolderData(): Promise { - this.folderIconData = Object.assign({}, {}, await this.loadData()); - } - - async saveIconFolderData(): Promise { - await this.saveData(this.folderIconData); - } -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/styles.css b/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/styles.css deleted file mode 100644 index 2cb37956..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/styles.css +++ /dev/null @@ -1,6 +0,0 @@ -.obsidian-icon-folder-icon { - border: 1px solid transparent; - padding: 2px 2px 2px 2px; - display: flex; - margin: auto 0; -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/util.ts b/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/util.ts deleted file mode 100644 index 94f66334..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/src/util.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as remixicons from 'react-icons/ri/index'; -// @ts-ignore -import { renderToString } from 'react-dom/server'; -import IconFolderPlugin from './main'; - -export const waitForNode = (selector: string): Promise => { - return new Promise((resolve) => { - if (document.querySelector(selector)) { - return resolve(document.querySelector(selector)); - } - - const observer = new MutationObserver(() => { - if (document.querySelector(selector)) { - resolve(document.querySelector(selector)); - observer.disconnect(); - } - }); - - observer.observe(document.body, { - childList: true, - subtree: true, - }); - }); -}; - -export const removeFromDOM = (path: string) => { - const node = document.querySelector(`[data-path="${path}"]`); - if (!node) { - console.error('element with data path not found', path); - return; - } - - const iconNode = node.querySelector('.obsidian-icon-folder-icon'); - if (!iconNode) { - console.error('icon element does not exist', path); - return; - } - - iconNode.remove(); -}; - -export const addToDOMWithElement = ( - plugin: IconFolderPlugin, - path: string, - iconId: string, - node: Element, -): void => { - const titleNode = node.querySelector('.nav-folder-title-content'); - if (!titleNode) { - console.error('element with title not found'); - return; - } - - const iconNode = document.createElement('div'); - iconNode.classList.add('obsidian-icon-folder-icon'); - iconNode.innerHTML = renderToString( - // @ts-ignore - remixicons[iconId]({ - size: '16px', - }), - ); - - node.insertBefore(iconNode, titleNode); -}; - -export const addToDOM = ( - plugin: IconFolderPlugin, - path: string, - iconId: string, -): void => { - const node = document.querySelector(`[data-path="${path}"]`); - if (!node) { - console.error('element with data path not found', path); - return; - } - - addToDOMWithElement(plugin, path, iconId, node); -}; diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/tsconfig.json b/.obsidian/plugins/obsidian-icon-folder-1.0.0/tsconfig.json deleted file mode 100644 index 09cf7ecd..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "ESNext", - "target": "es6", - "allowJs": true, - "noImplicitAny": true, - "moduleResolution": "node", - "importHelpers": true, - "lib": [ - "dom", - "es5", - "scripthost", - "es2015" - ] - }, - "include": [ - "**/*.ts" - ] -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/versions.json b/.obsidian/plugins/obsidian-icon-folder-1.0.0/versions.json deleted file mode 100644 index a6ce7634..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/versions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "1.0.0": "0.9.12" -} diff --git a/.obsidian/plugins/obsidian-icon-folder-1.0.0/yarn.lock b/.obsidian/plugins/obsidian-icon-folder-1.0.0/yarn.lock deleted file mode 100644 index c89c76fd..00000000 --- a/.obsidian/plugins/obsidian-icon-folder-1.0.0/yarn.lock +++ /dev/null @@ -1,326 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@rollup/plugin-commonjs@^18.0.0": - version "18.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-18.1.0.tgz#5a760d757af168a50727c0ae080251fbfcc5eb02" - integrity sha512-h3e6T9rUxVMAQswpDIobfUHn/doMzM9sgkMrsMWCFLmB84PSoC8mV8tOloAJjSRwdqhXBqstlX2BwBpHJvbhxg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/plugin-typescript@^8.2.1": - version "8.2.5" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz#e0319761b2b5105615e5a0c371ae05bc2984b7de" - integrity sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ== - dependencies: - "@rollup/pluginutils" "^3.1.0" - resolve "^1.17.0" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@types/codemirror@0.0.108": - version "0.0.108" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde" - integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw== - dependencies: - "@types/tern" "*" - -"@types/estree@*": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/node@*": - version "16.7.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.2.tgz#0465a39b5456b61a04d98bd5545f8b34be340cb7" - integrity sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw== - -"@types/node@^14.14.37": - version "14.17.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.12.tgz#7a31f720b85a617e54e42d24c4ace136601656c7" - integrity sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/tern@*": - version "0.23.4" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" - integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== - dependencies: - "@types/estree" "*" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -glob@^7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-core-module@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== - dependencies: - has "^1.0.3" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-reference@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -magic-string@^0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -moment@2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -obsidian@^0.12.0: - version "0.12.11" - resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-0.12.11.tgz#c92fbbb29fc2d4732e156b41a66d4ba8d42baaab" - integrity sha512-Kv4m1n4nfd17FzpqHZfqFS2YZAyY+cxAUM7/5jqh1bmbPlmKoNd1XJZC7o9KvkXfTCxALiXfGRdrjHB+GUFAEA== - dependencies: - "@types/codemirror" "0.0.108" - moment "2.29.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picomatch@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-icons@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.2.0.tgz#6dda80c8a8f338ff96a1851424d63083282630d0" - integrity sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ== - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -resolve@^1.17.0, resolve@^1.19.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -rollup@^2.32.1: - version "2.56.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.3.tgz#b63edadd9851b0d618a6d0e6af8201955a77aeff" - integrity sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg== - optionalDependencies: - fsevents "~2.3.2" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -sourcemap-codec@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -tslib@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -typescript@^4.2.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" - integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= diff --git a/.obsidian/plugins/obsidian-icons-plugin/main.js b/.obsidian/plugins/obsidian-icons-plugin/main.js deleted file mode 100644 index f1fff0ad..00000000 --- a/.obsidian/plugins/obsidian-icons-plugin/main.js +++ /dev/null @@ -1,26325 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function getAugmentedNamespace(n) { - if (n.__esModule) return n; - var a = Object.defineProperty({}, '__esModule', {value: true}); - Object.keys(n).forEach(function (k) { - var d = Object.getOwnPropertyDescriptor(n, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function () { - return n[k]; - } - }); - }); - return a; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - -var react_production_min = createCommonjsModule(function (module, exports) { -var n=60103,p=60106;exports.Fragment=60107;exports.StrictMode=60108;exports.Profiler=60114;var q=60109,r=60110,t=60112;exports.Suspense=60113;var u=60115,v=60116; -if("function"===typeof Symbol&&Symbol.for){var w=Symbol.for;n=w("react.element");p=w("react.portal");exports.Fragment=w("react.fragment");exports.StrictMode=w("react.strict_mode");exports.Profiler=w("react.profiler");q=w("react.provider");r=w("react.context");t=w("react.forward_ref");exports.Suspense=w("react.suspense");u=w("react.memo");v=w("react.lazy");}var x="function"===typeof Symbol&&Symbol.iterator; -function y(a){if(null===a||"object"!==typeof a)return null;a=x&&a[x]||a["@@iterator"];return "function"===typeof a?a:null}function z(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - printWarning('warn', format, args); - } -} -function error(format) { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } -} - -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } - - var argsWithFormat = args.map(function (item) { - return '' + item; - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} - -var didWarnStateUpdateForUnmountedComponent = {}; - -function warnNoop(publicInstance, callerName) { - { - var _constructor = publicInstance.constructor; - var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; - var warningKey = componentName + "." + callerName; - - if (didWarnStateUpdateForUnmountedComponent[warningKey]) { - return; - } - - error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); - - didWarnStateUpdateForUnmountedComponent[warningKey] = true; - } -} -/** - * This is the abstract API for an update queue. - */ - - -var ReactNoopUpdateQueue = { - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function (publicInstance) { - return false; - }, - - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueForceUpdate: function (publicInstance, callback, callerName) { - warnNoop(publicInstance, 'forceUpdate'); - }, - - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} completeState Next state. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { - warnNoop(publicInstance, 'replaceState'); - }, - - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} partialState Next partial state to be merged with state. - * @param {?function} callback Called after component is updated. - * @param {?string} Name of the calling function in the public API. - * @internal - */ - enqueueSetState: function (publicInstance, partialState, callback, callerName) { - warnNoop(publicInstance, 'setState'); - } -}; - -var emptyObject = {}; - -{ - Object.freeze(emptyObject); -} -/** - * Base class helpers for the updating state of a component. - */ - - -function Component(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. - - this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the - // renderer. - - this.updater = updater || ReactNoopUpdateQueue; -} - -Component.prototype.isReactComponent = {}; -/** - * Sets a subset of the state. Always use this to mutate - * state. You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * There is no guarantee that calls to `setState` will run synchronously, - * as they may eventually be batched together. You can provide an optional - * callback that will be executed when the call to setState is actually - * completed. - * - * When a function is provided to setState, it will be called at some point in - * the future (not synchronously). It will be called with the up to date - * component arguments (state, props, context). These values can be different - * from this.* because your function may be called after receiveProps but before - * shouldComponentUpdate, and this new state, props, and context will not yet be - * assigned to this. - * - * @param {object|function} partialState Next partial state or function to - * produce next partial state to be merged with current state. - * @param {?function} callback Called after state is updated. - * @final - * @protected - */ - -Component.prototype.setState = function (partialState, callback) { - if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { - { - throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); - } - } - - this.updater.enqueueSetState(this, partialState, callback, 'setState'); -}; -/** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {?function} callback Called after update is complete. - * @final - * @protected - */ - - -Component.prototype.forceUpdate = function (callback) { - this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); -}; -/** - * Deprecated APIs. These APIs used to exist on classic React classes but since - * we would like to deprecate them, we're not going to move them over to this - * modern base class. Instead, we define a getter that warns if it's accessed. - */ - - -{ - var deprecatedAPIs = { - isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], - replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] - }; - - var defineDeprecationWarning = function (methodName, info) { - Object.defineProperty(Component.prototype, methodName, { - get: function () { - warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); - - return undefined; - } - }); - }; - - for (var fnName in deprecatedAPIs) { - if (deprecatedAPIs.hasOwnProperty(fnName)) { - defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); - } - } -} - -function ComponentDummy() {} - -ComponentDummy.prototype = Component.prototype; -/** - * Convenience component with default shallow equality check for sCU. - */ - -function PureComponent(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. - - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; -} - -var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); -pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. - -_assign(pureComponentPrototype, Component.prototype); - -pureComponentPrototype.isPureReactComponent = true; - -// an immutable object with a single mutable value -function createRef() { - var refObject = { - current: null - }; - - { - Object.seal(refObject); - } - - return refObject; -} - -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} - -function getContextName(type) { - return type.displayName || 'Context'; -} - -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case exports.Fragment: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case exports.Profiler: - return 'Profiler'; - - case exports.StrictMode: - return 'StrictMode'; - - case exports.Suspense: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - return getComponentName(type.type); - - case REACT_BLOCK_TYPE: - return getComponentName(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentName(init(payload)); - } catch (x) { - return null; - } - } - } - } - - return null; -} - -var hasOwnProperty = Object.prototype.hasOwnProperty; -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; -var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; - -{ - didWarnAboutStringRefs = {}; -} - -function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.ref !== undefined; -} - -function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.key !== undefined; -} - -function defineKeyPropWarningGetter(props, displayName) { - var warnAboutAccessingKey = function () { - { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - } - }; - - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); -} - -function defineRefPropWarningGetter(props, displayName) { - var warnAboutAccessingRef = function () { - { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - } - }; - - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); -} - -function warnIfStringRefCannotBeAutoConverted(config) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { - var componentName = getComponentName(ReactCurrentOwner.current.type); - - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); - - didWarnAboutStringRefs[componentName] = true; - } - } - } -} -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ - - -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; -}; -/** - * Create and return a new ReactElement of the given type. - * See https://reactjs.org/docs/react-api.html#createelement - */ - -function createElement(type, config, children) { - var propName; // Reserved names are extracted - - var props = {}; - var key = null; - var ref = null; - var self = null; - var source = null; - - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - - { - warnIfStringRefCannotBeAutoConverted(config); - } - } - - if (hasValidKey(config)) { - key = '' + config.key; - } - - self = config.__self === undefined ? null : config.__self; - source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - - - var childrenLength = arguments.length - 2; - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - - { - if (Object.freeze) { - Object.freeze(childArray); - } - } - - props.children = childArray; - } // Resolve default props - - - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - - { - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); -} -function cloneAndReplaceKey(oldElement, newKey) { - var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); - return newElement; -} -/** - * Clone and return a new ReactElement using element as the starting point. - * See https://reactjs.org/docs/react-api.html#cloneelement - */ - -function cloneElement(element, config, children) { - if (!!(element === null || element === undefined)) { - { - throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); - } - } - - var propName; // Original props are copied - - var props = _assign({}, element.props); // Reserved names are extracted - - - var key = element.key; - var ref = element.ref; // Self is preserved since the owner is preserved. - - var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a - // transpiler, and the original source is probably a better indicator of the - // true owner. - - var source = element._source; // Owner will be preserved, unless ref is overridden - - var owner = element._owner; - - if (config != null) { - if (hasValidRef(config)) { - // Silently steal the ref from the parent. - ref = config.ref; - owner = ReactCurrentOwner.current; - } - - if (hasValidKey(config)) { - key = '' + config.key; - } // Remaining properties override existing props - - - var defaultProps; - - if (element.type && element.type.defaultProps) { - defaultProps = element.type.defaultProps; - } - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - if (config[propName] === undefined && defaultProps !== undefined) { - // Resolve default props - props[propName] = defaultProps[propName]; - } else { - props[propName] = config[propName]; - } - } - } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - - - var childrenLength = arguments.length - 2; - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - - props.children = childArray; - } - - return ReactElement(element.type, key, ref, self, source, owner, props); -} -/** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - -function isValidElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; -} - -var SEPARATOR = '.'; -var SUBSEPARATOR = ':'; -/** - * Escape and wrap key so it is safe to use as a reactid - * - * @param {string} key to be escaped. - * @return {string} the escaped key. - */ - -function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - '=': '=0', - ':': '=2' - }; - var escapedString = key.replace(escapeRegex, function (match) { - return escaperLookup[match]; - }); - return '$' + escapedString; -} -/** - * TODO: Test that a single child and an array with one item have the same key - * pattern. - */ - - -var didWarnAboutMaps = false; -var userProvidedKeyEscapeRegex = /\/+/g; - -function escapeUserProvidedKey(text) { - return text.replace(userProvidedKeyEscapeRegex, '$&/'); -} -/** - * Generate a key string that identifies a element within a set. - * - * @param {*} element A element that could contain a manual key. - * @param {number} index Index that is used if a manual key is not provided. - * @return {string} - */ - - -function getElementKey(element, index) { - // Do some typechecking here since we call this blindly. We want to ensure - // that we don't block potential future ES APIs. - if (typeof element === 'object' && element !== null && element.key != null) { - // Explicit key - return escape('' + element.key); - } // Implicit key determined by the index in the set - - - return index.toString(36); -} - -function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { - var type = typeof children; - - if (type === 'undefined' || type === 'boolean') { - // All of the above are perceived as null. - children = null; - } - - var invokeCallback = false; - - if (children === null) { - invokeCallback = true; - } else { - switch (type) { - case 'string': - case 'number': - invokeCallback = true; - break; - - case 'object': - switch (children.$$typeof) { - case REACT_ELEMENT_TYPE: - case REACT_PORTAL_TYPE: - invokeCallback = true; - } - - } - } - - if (invokeCallback) { - var _child = children; - var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array - // so that it's consistent if the number of children grows: - - var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; - - if (Array.isArray(mappedChild)) { - var escapedChildKey = ''; - - if (childKey != null) { - escapedChildKey = escapeUserProvidedKey(childKey) + '/'; - } - - mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { - return c; - }); - } else if (mappedChild != null) { - if (isValidElement(mappedChild)) { - mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as - // traverseAllChildren used to do for objects as children - escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key - mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number - escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); - } - - array.push(mappedChild); - } - - return 1; - } - - var child; - var nextName; - var subtreeCount = 0; // Count of children found in the current subtree. - - var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getElementKey(child, i); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else { - var iteratorFn = getIteratorFn(children); - - if (typeof iteratorFn === 'function') { - var iterableChildren = children; - - { - // Warn about using Maps as children - if (iteratorFn === iterableChildren.entries) { - if (!didWarnAboutMaps) { - warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); - } - - didWarnAboutMaps = true; - } - } - - var iterator = iteratorFn.call(iterableChildren); - var step; - var ii = 0; - - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getElementKey(child, ii++); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else if (type === 'object') { - var childrenString = '' + children; - - { - { - throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." ); - } - } - } - } - - return subtreeCount; -} - -/** - * Maps children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenmap - * - * The provided mapFunction(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} func The map function. - * @param {*} context Context for mapFunction. - * @return {object} Object containing the ordered map of results. - */ -function mapChildren(children, func, context) { - if (children == null) { - return children; - } - - var result = []; - var count = 0; - mapIntoArray(children, result, '', '', function (child) { - return func.call(context, child, count++); - }); - return result; -} -/** - * Count the number of children that are typically specified as - * `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrencount - * - * @param {?*} children Children tree container. - * @return {number} The number of children. - */ - - -function countChildren(children) { - var n = 0; - mapChildren(children, function () { - n++; // Don't return anything - }); - return n; -} - -/** - * Iterates through children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenforeach - * - * The provided forEachFunc(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} forEachFunc - * @param {*} forEachContext Context for forEachContext. - */ -function forEachChildren(children, forEachFunc, forEachContext) { - mapChildren(children, function () { - forEachFunc.apply(this, arguments); // Don't return anything. - }, forEachContext); -} -/** - * Flatten a children object (typically specified as `props.children`) and - * return an array with appropriately re-keyed children. - * - * See https://reactjs.org/docs/react-api.html#reactchildrentoarray - */ - - -function toArray(children) { - return mapChildren(children, function (child) { - return child; - }) || []; -} -/** - * Returns the first child in a collection of children and verifies that there - * is only one child in the collection. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenonly - * - * The current implementation of this function assumes that a single child gets - * passed without a wrapper, but the purpose of this helper function is to - * abstract away the particular structure of children. - * - * @param {?object} children Child collection structure. - * @return {ReactElement} The first and only `ReactElement` contained in the - * structure. - */ - - -function onlyChild(children) { - if (!isValidElement(children)) { - { - throw Error( "React.Children.only expected to receive a single React element child." ); - } - } - - return children; -} - -function createContext(defaultValue, calculateChangedBits) { - if (calculateChangedBits === undefined) { - calculateChangedBits = null; - } else { - { - if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { - error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); - } - } - } - - var context = { - $$typeof: REACT_CONTEXT_TYPE, - _calculateChangedBits: calculateChangedBits, - // As a workaround to support multiple concurrent renderers, we categorize - // some renderers as primary and others as secondary. We only expect - // there to be two concurrent renderers at most: React Native (primary) and - // Fabric (secondary); React DOM (primary) and React ART (secondary). - // Secondary renderers store their context values on separate fields. - _currentValue: defaultValue, - _currentValue2: defaultValue, - // Used to track how many concurrent renderers this context currently - // supports within in a single renderer. Such as parallel server rendering. - _threadCount: 0, - // These are circular - Provider: null, - Consumer: null - }; - context.Provider = { - $$typeof: REACT_PROVIDER_TYPE, - _context: context - }; - var hasWarnedAboutUsingNestedContextConsumers = false; - var hasWarnedAboutUsingConsumerProvider = false; - var hasWarnedAboutDisplayNameOnConsumer = false; - - { - // A separate object, but proxies back to the original context object for - // backwards compatibility. It has a different $$typeof, so we can properly - // warn for the incorrect usage of Context as a Consumer. - var Consumer = { - $$typeof: REACT_CONTEXT_TYPE, - _context: context, - _calculateChangedBits: context._calculateChangedBits - }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here - - Object.defineProperties(Consumer, { - Provider: { - get: function () { - if (!hasWarnedAboutUsingConsumerProvider) { - hasWarnedAboutUsingConsumerProvider = true; - - error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); - } - - return context.Provider; - }, - set: function (_Provider) { - context.Provider = _Provider; - } - }, - _currentValue: { - get: function () { - return context._currentValue; - }, - set: function (_currentValue) { - context._currentValue = _currentValue; - } - }, - _currentValue2: { - get: function () { - return context._currentValue2; - }, - set: function (_currentValue2) { - context._currentValue2 = _currentValue2; - } - }, - _threadCount: { - get: function () { - return context._threadCount; - }, - set: function (_threadCount) { - context._threadCount = _threadCount; - } - }, - Consumer: { - get: function () { - if (!hasWarnedAboutUsingNestedContextConsumers) { - hasWarnedAboutUsingNestedContextConsumers = true; - - error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); - } - - return context.Consumer; - } - }, - displayName: { - get: function () { - return context.displayName; - }, - set: function (displayName) { - if (!hasWarnedAboutDisplayNameOnConsumer) { - warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); - - hasWarnedAboutDisplayNameOnConsumer = true; - } - } - } - }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty - - context.Consumer = Consumer; - } - - { - context._currentRenderer = null; - context._currentRenderer2 = null; - } - - return context; -} - -var Uninitialized = -1; -var Pending = 0; -var Resolved = 1; -var Rejected = 2; - -function lazyInitializer(payload) { - if (payload._status === Uninitialized) { - var ctor = payload._result; - var thenable = ctor(); // Transition to the next state. - - var pending = payload; - pending._status = Pending; - pending._result = thenable; - thenable.then(function (moduleObject) { - if (payload._status === Pending) { - var defaultExport = moduleObject.default; - - { - if (defaultExport === undefined) { - error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. - 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); - } - } // Transition to the next state. - - - var resolved = payload; - resolved._status = Resolved; - resolved._result = defaultExport; - } - }, function (error) { - if (payload._status === Pending) { - // Transition to the next state. - var rejected = payload; - rejected._status = Rejected; - rejected._result = error; - } - }); - } - - if (payload._status === Resolved) { - return payload._result; - } else { - throw payload._result; - } -} - -function lazy(ctor) { - var payload = { - // We use these fields to store the result. - _status: -1, - _result: ctor - }; - var lazyType = { - $$typeof: REACT_LAZY_TYPE, - _payload: payload, - _init: lazyInitializer - }; - - { - // In production, this would just set it on the object. - var defaultProps; - var propTypes; // $FlowFixMe - - Object.defineProperties(lazyType, { - defaultProps: { - configurable: true, - get: function () { - return defaultProps; - }, - set: function (newDefaultProps) { - error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - - defaultProps = newDefaultProps; // Match production behavior more closely: - // $FlowFixMe - - Object.defineProperty(lazyType, 'defaultProps', { - enumerable: true - }); - } - }, - propTypes: { - configurable: true, - get: function () { - return propTypes; - }, - set: function (newPropTypes) { - error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - - propTypes = newPropTypes; // Match production behavior more closely: - // $FlowFixMe - - Object.defineProperty(lazyType, 'propTypes', { - enumerable: true - }); - } - } - }); - } - - return lazyType; -} - -function forwardRef(render) { - { - if (render != null && render.$$typeof === REACT_MEMO_TYPE) { - error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); - } else if (typeof render !== 'function') { - error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); - } else { - if (render.length !== 0 && render.length !== 2) { - error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); - } - } - - if (render != null) { - if (render.defaultProps != null || render.propTypes != null) { - error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); - } - } - } - - var elementType = { - $$typeof: REACT_FORWARD_REF_TYPE, - render: render - }; - - { - var ownName; - Object.defineProperty(elementType, 'displayName', { - enumerable: false, - configurable: true, - get: function () { - return ownName; - }, - set: function (name) { - ownName = name; - - if (render.displayName == null) { - render.displayName = name; - } - } - }); - } - - return elementType; -} - -// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. - -var enableScopeAPI = false; // Experimental Create Event Handle API. - -function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). - - - if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { - return true; - } - - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { - return true; - } - } - - return false; -} - -function memo(type, compare) { - { - if (!isValidElementType(type)) { - error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); - } - } - - var elementType = { - $$typeof: REACT_MEMO_TYPE, - type: type, - compare: compare === undefined ? null : compare - }; - - { - var ownName; - Object.defineProperty(elementType, 'displayName', { - enumerable: false, - configurable: true, - get: function () { - return ownName; - }, - set: function (name) { - ownName = name; - - if (type.displayName == null) { - type.displayName = name; - } - } - }); - } - - return elementType; -} - -function resolveDispatcher() { - var dispatcher = ReactCurrentDispatcher.current; - - if (!(dispatcher !== null)) { - { - throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); - } - } - - return dispatcher; -} - -function useContext(Context, unstable_observedBits) { - var dispatcher = resolveDispatcher(); - - { - if (unstable_observedBits !== undefined) { - error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : ''); - } // TODO: add a more generic warning for invalid values. - - - if (Context._context !== undefined) { - var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs - // and nobody should be using this in existing code. - - if (realContext.Consumer === Context) { - error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); - } else if (realContext.Provider === Context) { - error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); - } - } - } - - return dispatcher.useContext(Context, unstable_observedBits); -} -function useState(initialState) { - var dispatcher = resolveDispatcher(); - return dispatcher.useState(initialState); -} -function useReducer(reducer, initialArg, init) { - var dispatcher = resolveDispatcher(); - return dispatcher.useReducer(reducer, initialArg, init); -} -function useRef(initialValue) { - var dispatcher = resolveDispatcher(); - return dispatcher.useRef(initialValue); -} -function useEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useEffect(create, deps); -} -function useLayoutEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useLayoutEffect(create, deps); -} -function useCallback(callback, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useCallback(callback, deps); -} -function useMemo(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useMemo(create, deps); -} -function useImperativeHandle(ref, create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useImperativeHandle(ref, create, deps); -} -function useDebugValue(value, formatterFn) { - { - var dispatcher = resolveDispatcher(); - return dispatcher.useDebugValue(value, formatterFn); - } -} - -// Helpers to patch console.logs to avoid logging during side-effect free -// replaying on render function. This currently only patches the object -// lazily which won't cover if the log function was extracted eagerly. -// We could also eagerly patch the method. -var disabledDepth = 0; -var prevLog; -var prevInfo; -var prevWarn; -var prevError; -var prevGroup; -var prevGroupCollapsed; -var prevGroupEnd; - -function disabledLog() {} - -disabledLog.__reactDisabledLog = true; -function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } -} -function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: _assign({}, props, { - value: prevLog - }), - info: _assign({}, props, { - value: prevInfo - }), - warn: _assign({}, props, { - value: prevWarn - }), - error: _assign({}, props, { - value: prevError - }), - group: _assign({}, props, { - value: prevGroup - }), - groupCollapsed: _assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: _assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } -} - -var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; -var prefix; -function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } -} -var reentry = false; -var componentFrameCache; - -{ - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); -} - -function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher$1.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher$1.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; -} -function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } -} - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case exports.Suspense: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_BLOCK_TYPE: - return describeFunctionComponentFrame(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; -} - -var loggedTypeFailures = {}; -var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } -} - -function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(Object.prototype.hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } -} - -function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - setExtraStackFrame(stack); - } else { - setExtraStackFrame(null); - } - } -} - -var propTypesMisspellWarningShown; - -{ - propTypesMisspellWarningShown = false; -} - -function getDeclarationErrorAddendum() { - if (ReactCurrentOwner.current) { - var name = getComponentName(ReactCurrentOwner.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - - return ''; -} - -function getSourceInfoErrorAddendum(source) { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - - return ''; -} - -function getSourceInfoErrorAddendumForProps(elementProps) { - if (elementProps !== null && elementProps !== undefined) { - return getSourceInfoErrorAddendum(elementProps.__source); - } - - return ''; -} -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - - return info; -} -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ - - -function validateExplicitKey(element, parentType) { - if (!element._store || element._store.validated || element.key != null) { - return; - } - - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - - var childOwner = ''; - - if (element && element._owner && element._owner !== ReactCurrentOwner.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; - } - - { - setCurrentlyValidatingElement$1(element); - - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - - setCurrentlyValidatingElement$1(null); - } -} -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ - - -function validateChildKeys(node, parentType) { - if (typeof node !== 'object') { - return; - } - - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } -} -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - - -function validatePropTypes(element) { - { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; - } - - var propTypes; - - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentName(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: - - var _name = getComponentName(type); - - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } - } -} -/** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - -function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - - setCurrentlyValidatingElement$1(null); - break; - } - } - - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - - setCurrentlyValidatingElement$1(null); - } - } -} -function createElementWithValidation(type, props, children) { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - - var sourceInfo = getSourceInfoErrorAddendumForProps(props); - - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - var typeString; - - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - - { - error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - } - - var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - - - if (validType) { - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], type); - } - } - - if (type === exports.Fragment) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; -} -var didWarnAboutDeprecatedCreateFactory = false; -function createFactoryWithValidation(type) { - var validatedFactory = createElementWithValidation.bind(null, type); - validatedFactory.type = type; - - { - if (!didWarnAboutDeprecatedCreateFactory) { - didWarnAboutDeprecatedCreateFactory = true; - - warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); - } // Legacy hook: remove it - - - Object.defineProperty(validatedFactory, 'type', { - enumerable: false, - get: function () { - warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); - - Object.defineProperty(this, 'type', { - value: type - }); - return type; - } - }); - } - - return validatedFactory; -} -function cloneElementWithValidation(element, props, children) { - var newElement = cloneElement.apply(this, arguments); - - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], newElement.type); - } - - validatePropTypes(newElement); - return newElement; -} - -{ - - try { - var frozenObject = Object.freeze({}); - /* eslint-disable no-new */ - - new Map([[frozenObject, null]]); - new Set([frozenObject]); - /* eslint-enable no-new */ - } catch (e) { - } -} - -var createElement$1 = createElementWithValidation ; -var cloneElement$1 = cloneElementWithValidation ; -var createFactory = createFactoryWithValidation ; -var Children = { - map: mapChildren, - forEach: forEachChildren, - count: countChildren, - toArray: toArray, - only: onlyChild -}; - -exports.Children = Children; -exports.Component = Component; -exports.PureComponent = PureComponent; -exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; -exports.cloneElement = cloneElement$1; -exports.createContext = createContext; -exports.createElement = createElement$1; -exports.createFactory = createFactory; -exports.createRef = createRef; -exports.forwardRef = forwardRef; -exports.isValidElement = isValidElement; -exports.lazy = lazy; -exports.memo = memo; -exports.useCallback = useCallback; -exports.useContext = useContext; -exports.useDebugValue = useDebugValue; -exports.useEffect = useEffect; -exports.useImperativeHandle = useImperativeHandle; -exports.useLayoutEffect = useLayoutEffect; -exports.useMemo = useMemo; -exports.useReducer = useReducer; -exports.useRef = useRef; -exports.useState = useState; -exports.version = ReactVersion; - })(); -} -}); - -var react = createCommonjsModule(function (module) { - -if (process.env.NODE_ENV === 'production') { - module.exports = react_production_min; -} else { - module.exports = react_development; -} -}); - -function p(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cK;K++)J[K]=K+1;J[15]=0;var oa=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pa=Object.prototype.hasOwnProperty,qa={},ra={}; -function sa(a){if(pa.call(ra,a))return !0;if(pa.call(qa,a))return !1;if(oa.test(a))return ra[a]=!0;qa[a]=!0;return !1}function ta(a,b,c,d){if(null!==c&&0===c.type)return !1;switch(typeof b){case "function":case "symbol":return !0;case "boolean":if(d)return !1;if(null!==c)return !c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return "data-"!==a&&"aria-"!==a;default:return !1}} -function ua(a,b,c,d){if(null===b||"undefined"===typeof b||ta(a,b,c,d))return !0;if(d)return !1;if(null!==c)switch(c.type){case 3:return !b;case 4:return !1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return !1}function M(a,b,c,d,f,h,t){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=f;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=h;this.removeEmptyString=t;}var N={}; -"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){N[a]=new M(a,0,!1,a,null,!1,!1);});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];N[b]=new M(b,1,!1,a[1],null,!1,!1);});["contentEditable","draggable","spellCheck","value"].forEach(function(a){N[a]=new M(a,2,!1,a.toLowerCase(),null,!1,!1);}); -["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){N[a]=new M(a,2,!1,a,null,!1,!1);});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){N[a]=new M(a,3,!1,a.toLowerCase(),null,!1,!1);}); -["checked","multiple","muted","selected"].forEach(function(a){N[a]=new M(a,3,!0,a,null,!1,!1);});["capture","download"].forEach(function(a){N[a]=new M(a,4,!1,a,null,!1,!1);});["cols","rows","size","span"].forEach(function(a){N[a]=new M(a,6,!1,a,null,!1,!1);});["rowSpan","start"].forEach(function(a){N[a]=new M(a,5,!1,a.toLowerCase(),null,!1,!1);});var va=/[\-:]([a-z])/g;function wa(a){return a[1].toUpperCase()} -"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(va, -wa);N[b]=new M(b,1,!1,a,null,!1,!1);});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1);});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1);});["tabIndex","crossOrigin"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!1,!1);}); -N.xlinkHref=new M("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!0,!0);});var xa=/["'&<>]/; -function O(a){if("boolean"===typeof a||"number"===typeof a)return ""+a;a=""+a;var b=xa.exec(a);if(b){var c="",d,f=0;for(d=b.index;dV))throw Error(p(301));if(a===P)if(T=!0,a={action:c,next:null},null===U&&(U=new Map),c=U.get(b),void 0===c)U.set(b,a);else {for(b=c;null!==b.next;)b=b.next;b.next=a;}}function Ja(){} -var X=null,Ka={readContext:function(a){var b=X.threadID;I(a,b);return a[b]},useContext:function(a){W();var b=X.threadID;I(a,b);return a[b]},useMemo:Ia,useReducer:Ga,useRef:function(a){P=W();R=Ca();var b=R.memoizedState;return null===b?(a={current:a},R.memoizedState=a):b},useState:function(a){return Ga(Fa,a)},useLayoutEffect:function(){},useCallback:function(a,b){return Ia(function(){return a},b)},useImperativeHandle:Ja,useEffect:Ja,useDebugValue:Ja,useDeferredValue:function(a){W();return a},useTransition:function(){W(); -return [function(a){a();},!1]},useOpaqueIdentifier:function(){return (X.identifierPrefix||"")+"R:"+(X.uniqueID++).toString(36)},useMutableSource:function(a,b){W();return b(a._source)}},La={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function Ma(a){switch(a){case "svg":return "http://www.w3.org/2000/svg";case "math":return "http://www.w3.org/1998/Math/MathML";default:return "http://www.w3.org/1999/xhtml"}} -var Na={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},Oa=objectAssign({menuitem:!0},Na),Y={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0, -gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pa=["Webkit","ms","Moz","O"];Object.keys(Y).forEach(function(a){Pa.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Y[b]=Y[a];});}); -var Qa=/([A-Z])/g,Ra=/^ms-/,Z=react.Children.toArray,Sa=la.ReactCurrentDispatcher,Ta={listing:!0,pre:!0,textarea:!0},Ua=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,Va={},Wa={};function Xa(a){if(void 0===a||null===a)return a;var b="";react.Children.forEach(a,function(a){null!=a&&(b+=a);});return b}var Ya=Object.prototype.hasOwnProperty,Za={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null,suppressHydrationWarning:null};function $a(a,b){if(void 0===a)throw Error(p(152,F(b)||"Component"));} -function ab(a,b,c){function d(d,h){var e=h.prototype&&h.prototype.isReactComponent,f=na(h,b,c,e),t=[],g=!1,n={isMounted:function(){return !1},enqueueForceUpdate:function(){if(null===t)return null},enqueueReplaceState:function(a,c){g=!0;t=[c];},enqueueSetState:function(a,c){if(null===t)return null;t.push(c);}};if(e){if(e=new h(d.props,f,n),"function"===typeof h.getDerivedStateFromProps){var k=h.getDerivedStateFromProps.call(null,d.props,e.state);null!=k&&(e.state=objectAssign({},e.state,k));}}else if(P={},e=h(d.props, -f,n),e=Da(h,d.props,e,f),null==e||null==e.render){a=e;$a(a,h);return}e.props=d.props;e.context=f;e.updater=n;n=e.state;void 0===n&&(e.state=n=null);if("function"===typeof e.UNSAFE_componentWillMount||"function"===typeof e.componentWillMount)if("function"===typeof e.componentWillMount&&"function"!==typeof h.getDerivedStateFromProps&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&"function"!==typeof h.getDerivedStateFromProps&&e.UNSAFE_componentWillMount(),t.length){n=t;var v= -g;t=null;g=!1;if(v&&1===n.length)e.state=n[0];else {k=v?n[0]:e.state;var H=!0;for(v=v?1:0;v=g))throw Error(p(304));var e=new Uint16Array(g);e.set(d);J=e;J[0]=c+1;for(d=c;d=e.children.length){var L=e.footer;""!==L&&(this.previousWasTextNode=!1);this.stack.pop();if("select"===e.type)this.currentSelectValue=null;else if(null!=e.type&&null!=e.type.type&&e.type.type.$$typeof===B)this.popProvider(e.type);else if(e.type===D){this.suspenseDepth--;var G=h.pop();if(t){t=!1;var C=e.fallbackFrame;if(!C)throw Error(p(303));this.stack.push(C);h[this.suspenseDepth]+="\x3c!--$!--\x3e";continue}else h[this.suspenseDepth]+= -G;}h[this.suspenseDepth]+=L;}else {var n=e.children[e.childIndex++],k="";try{k+=this.render(n,e.context,e.domNamespace);}catch(v){if(null!=v&&"function"===typeof v.then)throw Error(p(294));throw v;}finally{}h.length<=this.suspenseDepth&&h.push("");h[this.suspenseDepth]+=k;}}return h[0]}finally{Sa.current=c,X=b,Ea();}};b.render=function(a,b,f){if("string"===typeof a||"number"===typeof a){f=""+a;if(""===f)return "";if(this.makeStaticMarkup)return O(f);if(this.previousWasTextNode)return "\x3c!-- --\x3e"+O(f); -this.previousWasTextNode=!0;return O(f)}b=ab(a,b,this.threadID);a=b.child;b=b.context;if(null===a||!1===a)return "";if(!react.isValidElement(a)){if(null!=a&&null!=a.$$typeof){f=a.$$typeof;if(f===q)throw Error(p(257));throw Error(p(258,f.toString()));}a=Z(a);this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:""});return ""}var c=a.type;if("string"===typeof c)return this.renderDOM(a,b,f);switch(c){case ka:case ja:case u:case z:case ca:case r:return a=Z(a.props.children),this.stack.push({type:null, -domNamespace:f,children:a,childIndex:0,context:b,footer:""}),"";case D:throw Error(p(294));case ia:throw Error(p(343));}if("object"===typeof c&&null!==c)switch(c.$$typeof){case ba:P={};var d=c.render(a.props,a.ref);d=Da(c.render,a.props,d,a.ref);d=Z(d);this.stack.push({type:null,domNamespace:f,children:d,childIndex:0,context:b,footer:""});return "";case da:return a=[react.createElement(c.type,objectAssign({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:""}), -"";case B:return c=Z(a.props.children),f={type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:""},this.pushProvider(a),this.stack.push(f),"";case aa:c=a.type;d=a.props;var g=this.threadID;I(c,g);c=Z(d.children(c[g]));this.stack.push({type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:""});return "";case ha:throw Error(p(338));case ea:return c=a.type,d=c._init,c=d(c._payload),a=[react.createElement(c,objectAssign({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0, -context:b,footer:""}),""}throw Error(p(130,null==c?c:typeof c,""));};b.renderDOM=function(a,b,f){var c=a.type.toLowerCase();if(!Va.hasOwnProperty(c)){if(!Ua.test(c))throw Error(p(65,c));Va[c]=!0;}var d=a.props;if("input"===c)d=objectAssign({type:void 0},d,{defaultChecked:void 0,defaultValue:void 0,value:null!=d.value?d.value:d.defaultValue,checked:null!=d.checked?d.checked:d.defaultChecked});else if("textarea"===c){var g=d.value;if(null==g){g=d.defaultValue;var e=d.children;if(null!=e){if(null!= -g)throw Error(p(92));if(Array.isArray(e)){if(!(1>=e.length))throw Error(p(93));e=e[0];}g=""+e;}null==g&&(g="");}d=objectAssign({},d,{value:void 0,children:""+g});}else if("select"===c)this.currentSelectValue=null!=d.value?d.value:d.defaultValue,d=objectAssign({},d,{value:void 0});else if("option"===c){e=this.currentSelectValue;var L=Xa(d.children);if(null!=e){var G=null!=d.value?d.value+"":L;g=!1;if(Array.isArray(e))for(var C=0;C":(w+=">",g="");a:{e=d.dangerouslySetInnerHTML;if(null!=e){if(null!=e.__html){e=e.__html;break a}}else if(e=d.children,"string"===typeof e||"number"===typeof e){e=O(e);break a}e=null;}null!=e?(d=[],Ta.hasOwnProperty(c)&&"\n"===e.charAt(0)&&(w+="\n"),w+=e):d=Z(d.children);a=a.type;f=null==f||"http://www.w3.org/1999/xhtml"===f?Ma(a):"http://www.w3.org/2000/svg"=== -f&&"foreignObject"===a?"http://www.w3.org/1999/xhtml":f;this.stack.push({domNamespace:f,type:c,children:d,childIndex:0,context:b,footer:g});this.previousWasTextNode=!1;return w};return a}();var renderToNodeStream=function(){throw Error(p(207));};var renderToStaticMarkup=function(a,b){a=new bb(a,!0,b);try{return a.read(Infinity)}finally{a.destroy();}};var renderToStaticNodeStream=function(){throw Error(p(208));};var renderToString=function(a,b){a=new bb(a,!1,b);try{return a.read(Infinity)}finally{a.destroy();}}; -var version="17.0.1"; - -var reactDomServer_browser_production_min = { - renderToNodeStream: renderToNodeStream, - renderToStaticMarkup: renderToStaticMarkup, - renderToStaticNodeStream: renderToStaticNodeStream, - renderToString: renderToString, - version: version -}; - -var reactDomServer_browser_development = createCommonjsModule(function (module, exports) { - -if (process.env.NODE_ENV !== "production") { - (function() { - -var React = react; -var _assign = objectAssign; - -// Do not require this module directly! Use normal `invariant` calls with -// template literal strings. The messages will be replaced with error codes -// during build. -function formatProdErrorMessage(code) { - var url = 'https://reactjs.org/docs/error-decoder.html?invariant=' + code; - - for (var i = 1; i < arguments.length; i++) { - url += '&args[]=' + encodeURIComponent(arguments[i]); - } - - return "Minified React error #" + code + "; visit " + url + " for the full message or " + 'use the non-minified dev environment for full errors and additional ' + 'helpful warnings.'; -} - -// TODO: this is special because it gets imported during build. -var ReactVersion = '17.0.1'; - -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; - -// by calls to these methods by a Babel plugin. -// -// In PROD (or in packages without access to React internals), -// they are left as they are instead. - -function warn(format) { - { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - printWarning('warn', format, args); - } -} -function error(format) { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } -} - -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } - - var argsWithFormat = args.map(function (item) { - return '' + item; - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} -var REACT_PORTAL_TYPE = 0xeaca; -var REACT_FRAGMENT_TYPE = 0xeacb; -var REACT_STRICT_MODE_TYPE = 0xeacc; -var REACT_PROFILER_TYPE = 0xead2; -var REACT_PROVIDER_TYPE = 0xeacd; -var REACT_CONTEXT_TYPE = 0xeace; -var REACT_FORWARD_REF_TYPE = 0xead0; -var REACT_SUSPENSE_TYPE = 0xead1; -var REACT_SUSPENSE_LIST_TYPE = 0xead8; -var REACT_MEMO_TYPE = 0xead3; -var REACT_LAZY_TYPE = 0xead4; -var REACT_BLOCK_TYPE = 0xead9; -var REACT_FUNDAMENTAL_TYPE = 0xead5; -var REACT_SCOPE_TYPE = 0xead7; -var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; -var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; - -if (typeof Symbol === 'function' && Symbol.for) { - var symbolFor = Symbol.for; - symbolFor('react.element'); - REACT_PORTAL_TYPE = symbolFor('react.portal'); - REACT_FRAGMENT_TYPE = symbolFor('react.fragment'); - REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); - REACT_PROFILER_TYPE = symbolFor('react.profiler'); - REACT_PROVIDER_TYPE = symbolFor('react.provider'); - REACT_CONTEXT_TYPE = symbolFor('react.context'); - REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); - REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); - REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); - REACT_MEMO_TYPE = symbolFor('react.memo'); - REACT_LAZY_TYPE = symbolFor('react.lazy'); - REACT_BLOCK_TYPE = symbolFor('react.block'); - symbolFor('react.server.block'); - REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); - REACT_SCOPE_TYPE = symbolFor('react.scope'); - symbolFor('react.opaque.id'); - REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); - symbolFor('react.offscreen'); - REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); -} - -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} - -function getContextName(type) { - return type.displayName || 'Context'; -} - -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case REACT_FRAGMENT_TYPE: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case REACT_PROFILER_TYPE: - return 'Profiler'; - - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - return getComponentName(type.type); - - case REACT_BLOCK_TYPE: - return getComponentName(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentName(init(payload)); - } catch (x) { - return null; - } - } - } - } - - return null; -} - -// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. - -var enableSuspenseServerRenderer = false; - -// Helpers to patch console.logs to avoid logging during side-effect free -// replaying on render function. This currently only patches the object -// lazily which won't cover if the log function was extracted eagerly. -// We could also eagerly patch the method. -var disabledDepth = 0; -var prevLog; -var prevInfo; -var prevWarn; -var prevError; -var prevGroup; -var prevGroupCollapsed; -var prevGroupEnd; - -function disabledLog() {} - -disabledLog.__reactDisabledLog = true; -function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } -} -function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: _assign({}, props, { - value: prevLog - }), - info: _assign({}, props, { - value: prevInfo - }), - warn: _assign({}, props, { - value: prevWarn - }), - error: _assign({}, props, { - value: prevError - }), - group: _assign({}, props, { - value: prevGroup - }), - groupCollapsed: _assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: _assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } -} - -var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; -var prefix; -function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } -} -var reentry = false; -var componentFrameCache; - -{ - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); -} - -function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; -} -function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } -} - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_BLOCK_TYPE: - return describeFunctionComponentFrame(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; -} - -var loggedTypeFailures = {}; -var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame.setExtraStackFrame(null); - } - } -} - -function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(Object.prototype.hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } -} - -var didWarnAboutInvalidateContextType; - -{ - didWarnAboutInvalidateContextType = new Set(); -} - -var emptyObject = {}; - -{ - Object.freeze(emptyObject); -} - -function maskContext(type, context) { - var contextTypes = type.contextTypes; - - if (!contextTypes) { - return emptyObject; - } - - var maskedContext = {}; - - for (var contextName in contextTypes) { - maskedContext[contextName] = context[contextName]; - } - - return maskedContext; -} - -function checkContextTypes(typeSpecs, values, location) { - { - checkPropTypes(typeSpecs, values, location, 'Component'); - } -} - -function validateContextBounds(context, threadID) { - // If we don't have enough slots in this context to store this threadID, - // fill it in without leaving any holes to ensure that the VM optimizes - // this as non-holey index properties. - // (Note: If `react` package is < 16.6, _threadCount is undefined.) - for (var i = context._threadCount | 0; i <= threadID; i++) { - // We assume that this is the same as the defaultValue which might not be - // true if we're rendering inside a secondary renderer but they are - // secondary because these use cases are very rare. - context[i] = context._currentValue2; - context._threadCount = i + 1; - } -} -function processContext(type, context, threadID, isClass) { - if (isClass) { - var contextType = type.contextType; - - { - if ('contextType' in type) { - var isValid = // Allow null for conditional declaration - contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a - - if (!isValid && !didWarnAboutInvalidateContextType.has(type)) { - didWarnAboutInvalidateContextType.add(type); - var addendum = ''; - - if (contextType === undefined) { - addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; - } else if (typeof contextType !== 'object') { - addendum = ' However, it is set to a ' + typeof contextType + '.'; - } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { - addendum = ' Did you accidentally pass the Context.Provider instead?'; - } else if (contextType._context !== undefined) { - // - addendum = ' Did you accidentally pass the Context.Consumer instead?'; - } else { - addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; - } - - error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(type) || 'Component', addendum); - } - } - } - - if (typeof contextType === 'object' && contextType !== null) { - validateContextBounds(contextType, threadID); - return contextType[threadID]; - } - - { - var maskedContext = maskContext(type, context); - - { - if (type.contextTypes) { - checkContextTypes(type.contextTypes, maskedContext, 'context'); - } - } - - return maskedContext; - } - } else { - { - var _maskedContext = maskContext(type, context); - - { - if (type.contextTypes) { - checkContextTypes(type.contextTypes, _maskedContext, 'context'); - } - } - - return _maskedContext; - } - } -} - -var nextAvailableThreadIDs = new Uint16Array(16); - -for (var i = 0; i < 15; i++) { - nextAvailableThreadIDs[i] = i + 1; -} - -nextAvailableThreadIDs[15] = 0; - -function growThreadCountAndReturnNextAvailable() { - var oldArray = nextAvailableThreadIDs; - var oldSize = oldArray.length; - var newSize = oldSize * 2; - - if (!(newSize <= 0x10000)) { - { - throw Error( "Maximum number of concurrent React renderers exceeded. This can happen if you are not properly destroying the Readable provided by React. Ensure that you call .destroy() on it if you no longer want to read from it, and did not read to the end. If you use .pipe() this should be automatic." ); - } - } - - var newArray = new Uint16Array(newSize); - newArray.set(oldArray); - nextAvailableThreadIDs = newArray; - nextAvailableThreadIDs[0] = oldSize + 1; - - for (var _i = oldSize; _i < newSize - 1; _i++) { - nextAvailableThreadIDs[_i] = _i + 1; - } - - nextAvailableThreadIDs[newSize - 1] = 0; - return oldSize; -} - -function allocThreadID() { - var nextID = nextAvailableThreadIDs[0]; - - if (nextID === 0) { - return growThreadCountAndReturnNextAvailable(); - } - - nextAvailableThreadIDs[0] = nextAvailableThreadIDs[nextID]; - return nextID; -} -function freeThreadID(id) { - nextAvailableThreadIDs[id] = nextAvailableThreadIDs[0]; - nextAvailableThreadIDs[0] = id; -} - -// A reserved attribute. -// It is handled by React separately and shouldn't be written to the DOM. -var RESERVED = 0; // A simple string attribute. -// Attributes that aren't in the filter are presumed to have this type. - -var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called -// "enumerated" attributes with "true" and "false" as possible values. -// When true, it should be set to a "true" string. -// When false, it should be set to a "false" string. - -var BOOLEANISH_STRING = 2; // A real boolean attribute. -// When true, it should be present (set either to an empty string or its name). -// When false, it should be omitted. - -var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. -// When true, it should be present (set either to an empty string or its name). -// When false, it should be omitted. -// For any other value, should be present with that value. - -var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. -// When falsy, it should be removed. - -var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. -// When falsy, it should be removed. - -var POSITIVE_NUMERIC = 6; - -/* eslint-disable max-len */ -var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; -/* eslint-enable max-len */ - -var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; -var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; -var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); -var hasOwnProperty = Object.prototype.hasOwnProperty; -var illegalAttributeNameCache = {}; -var validatedAttributeNameCache = {}; -function isAttributeNameSafe(attributeName) { - if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { - return true; - } - - if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { - return false; - } - - if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { - validatedAttributeNameCache[attributeName] = true; - return true; - } - - illegalAttributeNameCache[attributeName] = true; - - { - error('Invalid attribute name: `%s`', attributeName); - } - - return false; -} -function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { - if (propertyInfo !== null) { - return propertyInfo.type === RESERVED; - } - - if (isCustomComponentTag) { - return false; - } - - if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) { - return true; - } - - return false; -} -function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { - if (propertyInfo !== null && propertyInfo.type === RESERVED) { - return false; - } - - switch (typeof value) { - case 'function': // $FlowIssue symbol is perfectly valid here - - case 'symbol': - // eslint-disable-line - return true; - - case 'boolean': - { - if (isCustomComponentTag) { - return false; - } - - if (propertyInfo !== null) { - return !propertyInfo.acceptsBooleans; - } else { - var prefix = name.toLowerCase().slice(0, 5); - return prefix !== 'data-' && prefix !== 'aria-'; - } - } - - default: - return false; - } -} -function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { - if (value === null || typeof value === 'undefined') { - return true; - } - - if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { - return true; - } - - if (isCustomComponentTag) { - return false; - } - - if (propertyInfo !== null) { - - switch (propertyInfo.type) { - case BOOLEAN: - return !value; - - case OVERLOADED_BOOLEAN: - return value === false; - - case NUMERIC: - return isNaN(value); - - case POSITIVE_NUMERIC: - return isNaN(value) || value < 1; - } - } - - return false; -} -function getPropertyInfo(name) { - return properties.hasOwnProperty(name) ? properties[name] : null; -} - -function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) { - this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; - this.attributeName = attributeName; - this.attributeNamespace = attributeNamespace; - this.mustUseProperty = mustUseProperty; - this.propertyName = name; - this.type = type; - this.sanitizeURL = sanitizeURL; - this.removeEmptyString = removeEmptyString; -} // When adding attributes to this list, be sure to also add them to -// the `possibleStandardNames` module to ensure casing and incorrect -// name warnings. - - -var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. - -var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular -// elements (not just inputs). Now that ReactDOMInput assigns to the -// defaultValue property -- do we need this? -'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; -reservedProps.forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // A few React string attributes have a different name. -// This is a mapping from React prop names to the attribute names. - -[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { - var name = _ref[0], - attributeName = _ref[1]; - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are "enumerated" HTML attributes that accept "true" and "false". -// In React, we let users pass `true` and `false` even though technically -// these aren't boolean attributes (they are coerced to strings). - -['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are "enumerated" SVG attributes that accept "true" and "false". -// In React, we let users pass `true` and `false` even though technically -// these aren't boolean attributes (they are coerced to strings). -// Since these are SVG attributes, their attribute names are case-sensitive. - -['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are HTML boolean attributes. - -['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM -// on the client side because the browsers are inconsistent. Instead we call focus(). -'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata -'itemScope'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are the few React props that we set as DOM properties -// rather than attributes. These are all booleans. - -['checked', // Note: `option.selected` is not updated if `select.multiple` is -// disabled with `removeAttribute`. We have special logic for handling this. -'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are HTML attributes that are "overloaded booleans": they behave like -// booleans, but can also accept a string value. - -['capture', 'download' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are HTML attributes that must be positive numbers. - -['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty - name, // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These are HTML attributes that must be numbers. - -['rowSpan', 'start'].forEach(function (name) { - properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty - name.toLowerCase(), // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); -var CAMELIZE = /[\-\:]([a-z])/g; - -var capitalize = function (token) { - return token[1].toUpperCase(); -}; // This is a list of all SVG attributes that need special casing, namespacing, -// or boolean value assignment. Regular attributes that just accept strings -// and have the same names are omitted, just like in the HTML attribute filter. -// Some of these attributes can be hard to find. This list was created by -// scraping the MDN documentation. - - -['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, null, // attributeNamespace - false, // sanitizeURL - false); -}); // String SVG attributes with the xlink namespace. - -['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL - false); -}); // String SVG attributes with the xml namespace. - -['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, -// you'll need to set attributeName to name.toLowerCase() -// instead in the assignment below. -].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); - properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty - attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL - false); -}); // These attribute exists both in HTML and SVG. -// The attribute name is case-sensitive in SVG so we can't just use -// the React name like we do for attributes that exist only in HTML. - -['tabIndex', 'crossOrigin'].forEach(function (attributeName) { - properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty - attributeName.toLowerCase(), // attributeName - null, // attributeNamespace - false, // sanitizeURL - false); -}); // These attributes accept URLs. These must not allow javascript: URLS. -// These will also need to accept Trusted Types object in the future. - -var xlinkHref = 'xlinkHref'; -properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty -'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL -false); -['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { - properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty - attributeName.toLowerCase(), // attributeName - null, // attributeNamespace - true, // sanitizeURL - true); -}); - -// and any newline or tab are filtered out as if they're not part of the URL. -// https://url.spec.whatwg.org/#url-parsing -// Tab or newline are defined as \r\n\t: -// https://infra.spec.whatwg.org/#ascii-tab-or-newline -// A C0 control is a code point in the range \u0000 NULL to \u001F -// INFORMATION SEPARATOR ONE, inclusive: -// https://infra.spec.whatwg.org/#c0-control-or-space - -/* eslint-disable max-len */ - -var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; -var didWarn = false; - -function sanitizeURL(url) { - { - if (!didWarn && isJavaScriptProtocol.test(url)) { - didWarn = true; - - error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); - } - } -} - -// code copied and modified from escape-html - -/** - * Module variables. - * @private - */ -var matchHtmlRegExp = /["'&<>]/; -/** - * Escapes special characters and HTML entities in a given html string. - * - * @param {string} string HTML string to escape for later insertion - * @return {string} - * @public - */ - -function escapeHtml(string) { - var str = '' + string; - var match = matchHtmlRegExp.exec(str); - - if (!match) { - return str; - } - - var escape; - var html = ''; - var index; - var lastIndex = 0; - - for (index = match.index; index < str.length; index++) { - switch (str.charCodeAt(index)) { - case 34: - // " - escape = '"'; - break; - - case 38: - // & - escape = '&'; - break; - - case 39: - // ' - escape = '''; // modified from escape-html; used to be ''' - - break; - - case 60: - // < - escape = '<'; - break; - - case 62: - // > - escape = '>'; - break; - - default: - continue; - } - - if (lastIndex !== index) { - html += str.substring(lastIndex, index); - } - - lastIndex = index + 1; - html += escape; - } - - return lastIndex !== index ? html + str.substring(lastIndex, index) : html; -} // end code copied and modified from escape-html - -/** - * Escapes text to prevent scripting attacks. - * - * @param {*} text Text value to escape. - * @return {string} An escaped string. - */ - - -function escapeTextForBrowser(text) { - if (typeof text === 'boolean' || typeof text === 'number') { - // this shortcircuit helps perf for types that we know will never have - // special characters, especially given that this function is used often - // for numeric dom ids. - return '' + text; - } - - return escapeHtml(text); -} - -/** - * Escapes attribute value to prevent scripting attacks. - * - * @param {*} value Value to escape. - * @return {string} An escaped string. - */ - -function quoteAttributeValueForBrowser(value) { - return '"' + escapeTextForBrowser(value) + '"'; -} - -function createMarkupForRoot() { - return ROOT_ATTRIBUTE_NAME + '=""'; -} -/** - * Creates markup for a property. - * - * @param {string} name - * @param {*} value - * @return {?string} Markup string, or null if the property was invalid. - */ - -function createMarkupForProperty(name, value) { - var propertyInfo = getPropertyInfo(name); - - if (name !== 'style' && shouldIgnoreAttribute(name, propertyInfo, false)) { - return ''; - } - - if (shouldRemoveAttribute(name, value, propertyInfo, false)) { - return ''; - } - - if (propertyInfo !== null) { - var attributeName = propertyInfo.attributeName; - var type = propertyInfo.type; - - if (type === BOOLEAN || type === OVERLOADED_BOOLEAN && value === true) { - return attributeName + '=""'; - } else { - if (propertyInfo.sanitizeURL) { - value = '' + value; - sanitizeURL(value); - } - - return attributeName + '=' + quoteAttributeValueForBrowser(value); - } - } else if (isAttributeNameSafe(name)) { - return name + '=' + quoteAttributeValueForBrowser(value); - } - - return ''; -} -/** - * Creates markup for a custom property. - * - * @param {string} name - * @param {*} value - * @return {string} Markup string, or empty string if the property was invalid. - */ - -function createMarkupForCustomAttribute(name, value) { - if (!isAttributeNameSafe(name) || value == null) { - return ''; - } - - return name + '=' + quoteAttributeValueForBrowser(value); -} - -/** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ -function is(x, y) { - return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare - ; -} - -var objectIs = typeof Object.is === 'function' ? Object.is : is; - -var currentlyRenderingComponent = null; -var firstWorkInProgressHook = null; -var workInProgressHook = null; // Whether the work-in-progress hook is a re-rendered hook - -var isReRender = false; // Whether an update was scheduled during the currently executing render pass. - -var didScheduleRenderPhaseUpdate = false; // Lazily created map of render-phase updates - -var renderPhaseUpdates = null; // Counter to prevent infinite loops. - -var numberOfReRenders = 0; -var RE_RENDER_LIMIT = 25; -var isInHookUserCodeInDev = false; // In DEV, this is the name of the currently executing primitive hook - -var currentHookNameInDev; - -function resolveCurrentlyRenderingComponent() { - if (!(currentlyRenderingComponent !== null)) { - { - throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); - } - } - - { - if (isInHookUserCodeInDev) { - error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks'); - } - } - - return currentlyRenderingComponent; -} - -function areHookInputsEqual(nextDeps, prevDeps) { - if (prevDeps === null) { - { - error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); - } - - return false; - } - - { - // Don't bother comparing lengths in prod because these arrays should be - // passed inline. - if (nextDeps.length !== prevDeps.length) { - error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + nextDeps.join(', ') + "]", "[" + prevDeps.join(', ') + "]"); - } - } - - for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { - if (objectIs(nextDeps[i], prevDeps[i])) { - continue; - } - - return false; - } - - return true; -} - -function createHook() { - if (numberOfReRenders > 0) { - { - { - throw Error( "Rendered more hooks than during the previous render" ); - } - } - } - - return { - memoizedState: null, - queue: null, - next: null - }; -} - -function createWorkInProgressHook() { - if (workInProgressHook === null) { - // This is the first hook in the list - if (firstWorkInProgressHook === null) { - isReRender = false; - firstWorkInProgressHook = workInProgressHook = createHook(); - } else { - // There's already a work-in-progress. Reuse it. - isReRender = true; - workInProgressHook = firstWorkInProgressHook; - } - } else { - if (workInProgressHook.next === null) { - isReRender = false; // Append to the end of the list - - workInProgressHook = workInProgressHook.next = createHook(); - } else { - // There's already a work-in-progress. Reuse it. - isReRender = true; - workInProgressHook = workInProgressHook.next; - } - } - - return workInProgressHook; -} - -function prepareToUseHooks(componentIdentity) { - currentlyRenderingComponent = componentIdentity; - - { - isInHookUserCodeInDev = false; - } // The following should have already been reset - // didScheduleRenderPhaseUpdate = false; - // firstWorkInProgressHook = null; - // numberOfReRenders = 0; - // renderPhaseUpdates = null; - // workInProgressHook = null; - -} -function finishHooks(Component, props, children, refOrContext) { - // This must be called after every function component to prevent hooks from - // being used in classes. - while (didScheduleRenderPhaseUpdate) { - // Updates were scheduled during the render phase. They are stored in - // the `renderPhaseUpdates` map. Call the component again, reusing the - // work-in-progress hooks and applying the additional updates on top. Keep - // restarting until no more updates are scheduled. - didScheduleRenderPhaseUpdate = false; - numberOfReRenders += 1; // Start over from the beginning of the list - - workInProgressHook = null; - children = Component(props, refOrContext); - } - - resetHooksState(); - return children; -} // Reset the internal hooks state if an error occurs while rendering a component - -function resetHooksState() { - { - isInHookUserCodeInDev = false; - } - - currentlyRenderingComponent = null; - didScheduleRenderPhaseUpdate = false; - firstWorkInProgressHook = null; - numberOfReRenders = 0; - renderPhaseUpdates = null; - workInProgressHook = null; -} - -function readContext(context, observedBits) { - var threadID = currentPartialRenderer.threadID; - validateContextBounds(context, threadID); - - { - if (isInHookUserCodeInDev) { - error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); - } - } - - return context[threadID]; -} - -function useContext(context, observedBits) { - { - currentHookNameInDev = 'useContext'; - } - - resolveCurrentlyRenderingComponent(); - var threadID = currentPartialRenderer.threadID; - validateContextBounds(context, threadID); - return context[threadID]; -} - -function basicStateReducer(state, action) { - // $FlowFixMe: Flow doesn't like mixed types - return typeof action === 'function' ? action(state) : action; -} - -function useState(initialState) { - { - currentHookNameInDev = 'useState'; - } - - return useReducer(basicStateReducer, // useReducer has a special case to support lazy useState initializers - initialState); -} -function useReducer(reducer, initialArg, init) { - { - if (reducer !== basicStateReducer) { - currentHookNameInDev = 'useReducer'; - } - } - - currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); - workInProgressHook = createWorkInProgressHook(); - - if (isReRender) { - // This is a re-render. Apply the new render phase updates to the previous - // current hook. - var queue = workInProgressHook.queue; - var dispatch = queue.dispatch; - - if (renderPhaseUpdates !== null) { - // Render phase updates are stored in a map of queue -> linked list - var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); - - if (firstRenderPhaseUpdate !== undefined) { - renderPhaseUpdates.delete(queue); - var newState = workInProgressHook.memoizedState; - var update = firstRenderPhaseUpdate; - - do { - // Process this render phase update. We don't have to check the - // priority because it will always be the same as the current - // render's. - var action = update.action; - - { - isInHookUserCodeInDev = true; - } - - newState = reducer(newState, action); - - { - isInHookUserCodeInDev = false; - } - - update = update.next; - } while (update !== null); - - workInProgressHook.memoizedState = newState; - return [newState, dispatch]; - } - } - - return [workInProgressHook.memoizedState, dispatch]; - } else { - { - isInHookUserCodeInDev = true; - } - - var initialState; - - if (reducer === basicStateReducer) { - // Special case for `useState`. - initialState = typeof initialArg === 'function' ? initialArg() : initialArg; - } else { - initialState = init !== undefined ? init(initialArg) : initialArg; - } - - { - isInHookUserCodeInDev = false; - } - - workInProgressHook.memoizedState = initialState; - - var _queue = workInProgressHook.queue = { - last: null, - dispatch: null - }; - - var _dispatch = _queue.dispatch = dispatchAction.bind(null, currentlyRenderingComponent, _queue); - - return [workInProgressHook.memoizedState, _dispatch]; - } -} - -function useMemo(nextCreate, deps) { - currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); - workInProgressHook = createWorkInProgressHook(); - var nextDeps = deps === undefined ? null : deps; - - if (workInProgressHook !== null) { - var prevState = workInProgressHook.memoizedState; - - if (prevState !== null) { - if (nextDeps !== null) { - var prevDeps = prevState[1]; - - if (areHookInputsEqual(nextDeps, prevDeps)) { - return prevState[0]; - } - } - } - } - - { - isInHookUserCodeInDev = true; - } - - var nextValue = nextCreate(); - - { - isInHookUserCodeInDev = false; - } - - workInProgressHook.memoizedState = [nextValue, nextDeps]; - return nextValue; -} - -function useRef(initialValue) { - currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); - workInProgressHook = createWorkInProgressHook(); - var previousRef = workInProgressHook.memoizedState; - - if (previousRef === null) { - var ref = { - current: initialValue - }; - - { - Object.seal(ref); - } - - workInProgressHook.memoizedState = ref; - return ref; - } else { - return previousRef; - } -} - -function useLayoutEffect(create, inputs) { - { - currentHookNameInDev = 'useLayoutEffect'; - - error('useLayoutEffect does nothing on the server, because its effect cannot ' + "be encoded into the server renderer's output format. This will lead " + 'to a mismatch between the initial, non-hydrated UI and the intended ' + 'UI. To avoid this, useLayoutEffect should only be used in ' + 'components that render exclusively on the client. ' + 'See https://reactjs.org/link/uselayouteffect-ssr for common fixes.'); - } -} - -function dispatchAction(componentIdentity, queue, action) { - if (!(numberOfReRenders < RE_RENDER_LIMIT)) { - { - throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." ); - } - } - - if (componentIdentity === currentlyRenderingComponent) { - // This is a render phase update. Stash it in a lazily-created map of - // queue -> linked list of updates. After this render pass, we'll restart - // and apply the stashed updates on top of the work-in-progress hook. - didScheduleRenderPhaseUpdate = true; - var update = { - action: action, - next: null - }; - - if (renderPhaseUpdates === null) { - renderPhaseUpdates = new Map(); - } - - var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); - - if (firstRenderPhaseUpdate === undefined) { - renderPhaseUpdates.set(queue, update); - } else { - // Append the update to the end of the list. - var lastRenderPhaseUpdate = firstRenderPhaseUpdate; - - while (lastRenderPhaseUpdate.next !== null) { - lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; - } - - lastRenderPhaseUpdate.next = update; - } - } -} - -function useCallback(callback, deps) { - return useMemo(function () { - return callback; - }, deps); -} // TODO Decide on how to implement this hook for server rendering. -// If a mutation occurs during render, consider triggering a Suspense boundary -// and falling back to client rendering. - -function useMutableSource(source, getSnapshot, subscribe) { - resolveCurrentlyRenderingComponent(); - return getSnapshot(source._source); -} - -function useDeferredValue(value) { - resolveCurrentlyRenderingComponent(); - return value; -} - -function useTransition() { - resolveCurrentlyRenderingComponent(); - - var startTransition = function (callback) { - callback(); - }; - - return [startTransition, false]; -} - -function useOpaqueIdentifier() { - return (currentPartialRenderer.identifierPrefix || '') + 'R:' + (currentPartialRenderer.uniqueID++).toString(36); -} - -function noop() {} - -var currentPartialRenderer = null; -function setCurrentPartialRenderer(renderer) { - currentPartialRenderer = renderer; -} -var Dispatcher = { - readContext: readContext, - useContext: useContext, - useMemo: useMemo, - useReducer: useReducer, - useRef: useRef, - useState: useState, - useLayoutEffect: useLayoutEffect, - useCallback: useCallback, - // useImperativeHandle is not run in the server environment - useImperativeHandle: noop, - // Effects are not run in the server environment. - useEffect: noop, - // Debugging effect - useDebugValue: noop, - useDeferredValue: useDeferredValue, - useTransition: useTransition, - useOpaqueIdentifier: useOpaqueIdentifier, - // Subscriptions are not setup in a server environment. - useMutableSource: useMutableSource -}; - -var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; -var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; -var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; -var Namespaces = { - html: HTML_NAMESPACE, - mathml: MATH_NAMESPACE, - svg: SVG_NAMESPACE -}; // Assumes there is no parent namespace. - -function getIntrinsicNamespace(type) { - switch (type) { - case 'svg': - return SVG_NAMESPACE; - - case 'math': - return MATH_NAMESPACE; - - default: - return HTML_NAMESPACE; - } -} -function getChildNamespace(parentNamespace, type) { - if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) { - // No (or default) parent namespace: potential entry point. - return getIntrinsicNamespace(type); - } - - if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') { - // We're leaving SVG. - return HTML_NAMESPACE; - } // By default, pass namespace below. - - - return parentNamespace; -} - -var hasReadOnlyValue = { - button: true, - checkbox: true, - image: true, - hidden: true, - radio: true, - reset: true, - submit: true -}; -function checkControlledValueProps(tagName, props) { - { - if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { - error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); - } - - if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { - error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); - } - } -} - -// For HTML, certain tags should omit their close tag. We keep a list for -// those special-case tags. -var omittedCloseTags = { - area: true, - base: true, - br: true, - col: true, - embed: true, - hr: true, - img: true, - input: true, - keygen: true, - link: true, - meta: true, - param: true, - source: true, - track: true, - wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems. - -}; - -// `omittedCloseTags` except that `menuitem` should still have its closing tag. - -var voidElementTags = _assign({ - menuitem: true -}, omittedCloseTags); - -var HTML = '__html'; - -function assertValidProps(tag, props) { - if (!props) { - return; - } // Note the use of `==` which checks for null or undefined. - - - if (voidElementTags[tag]) { - if (!(props.children == null && props.dangerouslySetInnerHTML == null)) { - { - throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." ); - } - } - } - - if (props.dangerouslySetInnerHTML != null) { - if (!(props.children == null)) { - { - throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." ); - } - } - - if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) { - { - throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://reactjs.org/link/dangerously-set-inner-html for more information." ); - } - } - } - - { - if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) { - error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.'); - } - } - - if (!(props.style == null || typeof props.style === 'object')) { - { - throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." ); - } - } -} - -/** - * CSS properties which accept numbers but are not in units of "px". - */ -var isUnitlessNumber = { - animationIterationCount: true, - borderImageOutset: true, - borderImageSlice: true, - borderImageWidth: true, - boxFlex: true, - boxFlexGroup: true, - boxOrdinalGroup: true, - columnCount: true, - columns: true, - flex: true, - flexGrow: true, - flexPositive: true, - flexShrink: true, - flexNegative: true, - flexOrder: true, - gridArea: true, - gridRow: true, - gridRowEnd: true, - gridRowSpan: true, - gridRowStart: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnSpan: true, - gridColumnStart: true, - fontWeight: true, - lineClamp: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - tabSize: true, - widows: true, - zIndex: true, - zoom: true, - // SVG-related properties - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeDasharray: true, - strokeDashoffset: true, - strokeMiterlimit: true, - strokeOpacity: true, - strokeWidth: true -}; -/** - * @param {string} prefix vendor-specific prefix, eg: Webkit - * @param {string} key style name, eg: transitionDuration - * @return {string} style name prefixed with `prefix`, properly camelCased, eg: - * WebkitTransitionDuration - */ - -function prefixKey(prefix, key) { - return prefix + key.charAt(0).toUpperCase() + key.substring(1); -} -/** - * Support style names that may come passed in prefixed by adding permutations - * of vendor prefixes. - */ - - -var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an -// infinite loop, because it iterates over the newly added props too. - -Object.keys(isUnitlessNumber).forEach(function (prop) { - prefixes.forEach(function (prefix) { - isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; - }); -}); - -/** - * Convert a value into the proper css writable value. The style name `name` - * should be logical (no hyphens), as specified - * in `CSSProperty.isUnitlessNumber`. - * - * @param {string} name CSS property name such as `topMargin`. - * @param {*} value CSS property value such as `10px`. - * @return {string} Normalized style value with dimensions applied. - */ - -function dangerousStyleValue(name, value, isCustomProperty) { - // Note that we've removed escapeTextForBrowser() calls here since the - // whole string will be escaped when the attribute is injected into - // the markup. If you provide unsafe user data here they can inject - // arbitrary CSS which may be problematic (I couldn't repro this): - // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ - // This is not an XSS hole but instead a potential CSS injection issue - // which has lead to a greater discussion about how we're going to - // trust URLs moving forward. See #2115901 - var isEmpty = value == null || typeof value === 'boolean' || value === ''; - - if (isEmpty) { - return ''; - } - - if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) { - return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers - } - - return ('' + value).trim(); -} - -var uppercasePattern = /([A-Z])/g; -var msPattern = /^ms-/; -/** - * Hyphenates a camelcased CSS property name, for example: - * - * > hyphenateStyleName('backgroundColor') - * < "background-color" - * > hyphenateStyleName('MozTransition') - * < "-moz-transition" - * > hyphenateStyleName('msTransition') - * < "-ms-transition" - * - * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix - * is converted to `-ms-`. - */ - -function hyphenateStyleName(name) { - return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); -} - -function isCustomComponent(tagName, props) { - if (tagName.indexOf('-') === -1) { - return typeof props.is === 'string'; - } - - switch (tagName) { - // These are reserved SVG and MathML elements. - // We don't mind this list too much because we expect it to never grow. - // The alternative is to track the namespace in a few places which is convoluted. - // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts - case 'annotation-xml': - case 'color-profile': - case 'font-face': - case 'font-face-src': - case 'font-face-uri': - case 'font-face-format': - case 'font-face-name': - case 'missing-glyph': - return false; - - default: - return true; - } -} - -var warnValidStyle = function () {}; - -{ - // 'msTransform' is correct, but the other prefixes should be capitalized - var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; - var msPattern$1 = /^-ms-/; - var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon - - var badStyleValueWithSemicolonPattern = /;\s*$/; - var warnedStyleNames = {}; - var warnedStyleValues = {}; - var warnedForNaNValue = false; - var warnedForInfinityValue = false; - - var camelize = function (string) { - return string.replace(hyphenPattern, function (_, character) { - return character.toUpperCase(); - }); - }; - - var warnHyphenatedStyleName = function (name) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; - } - - warnedStyleNames[name] = true; - - error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests - // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix - // is converted to lowercase `ms`. - camelize(name.replace(msPattern$1, 'ms-'))); - }; - - var warnBadVendoredStyleName = function (name) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; - } - - warnedStyleNames[name] = true; - - error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); - }; - - var warnStyleValueWithSemicolon = function (name, value) { - if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { - return; - } - - warnedStyleValues[value] = true; - - error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); - }; - - var warnStyleValueIsNaN = function (name, value) { - if (warnedForNaNValue) { - return; - } - - warnedForNaNValue = true; - - error('`NaN` is an invalid value for the `%s` css style property.', name); - }; - - var warnStyleValueIsInfinity = function (name, value) { - if (warnedForInfinityValue) { - return; - } - - warnedForInfinityValue = true; - - error('`Infinity` is an invalid value for the `%s` css style property.', name); - }; - - warnValidStyle = function (name, value) { - if (name.indexOf('-') > -1) { - warnHyphenatedStyleName(name); - } else if (badVendoredStyleNamePattern.test(name)) { - warnBadVendoredStyleName(name); - } else if (badStyleValueWithSemicolonPattern.test(value)) { - warnStyleValueWithSemicolon(name, value); - } - - if (typeof value === 'number') { - if (isNaN(value)) { - warnStyleValueIsNaN(name, value); - } else if (!isFinite(value)) { - warnStyleValueIsInfinity(name, value); - } - } - }; -} - -var warnValidStyle$1 = warnValidStyle; - -var ariaProperties = { - 'aria-current': 0, - // state - 'aria-details': 0, - 'aria-disabled': 0, - // state - 'aria-hidden': 0, - // state - 'aria-invalid': 0, - // state - 'aria-keyshortcuts': 0, - 'aria-label': 0, - 'aria-roledescription': 0, - // Widget Attributes - 'aria-autocomplete': 0, - 'aria-checked': 0, - 'aria-expanded': 0, - 'aria-haspopup': 0, - 'aria-level': 0, - 'aria-modal': 0, - 'aria-multiline': 0, - 'aria-multiselectable': 0, - 'aria-orientation': 0, - 'aria-placeholder': 0, - 'aria-pressed': 0, - 'aria-readonly': 0, - 'aria-required': 0, - 'aria-selected': 0, - 'aria-sort': 0, - 'aria-valuemax': 0, - 'aria-valuemin': 0, - 'aria-valuenow': 0, - 'aria-valuetext': 0, - // Live Region Attributes - 'aria-atomic': 0, - 'aria-busy': 0, - 'aria-live': 0, - 'aria-relevant': 0, - // Drag-and-Drop Attributes - 'aria-dropeffect': 0, - 'aria-grabbed': 0, - // Relationship Attributes - 'aria-activedescendant': 0, - 'aria-colcount': 0, - 'aria-colindex': 0, - 'aria-colspan': 0, - 'aria-controls': 0, - 'aria-describedby': 0, - 'aria-errormessage': 0, - 'aria-flowto': 0, - 'aria-labelledby': 0, - 'aria-owns': 0, - 'aria-posinset': 0, - 'aria-rowcount': 0, - 'aria-rowindex': 0, - 'aria-rowspan': 0, - 'aria-setsize': 0 -}; - -var warnedProperties = {}; -var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); -var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); -var hasOwnProperty$1 = Object.prototype.hasOwnProperty; - -function validateProperty(tagName, name) { - { - if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) { - return true; - } - - if (rARIACamel.test(name)) { - var ariaName = 'aria-' + name.slice(4).toLowerCase(); - var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM - // DOM properties, then it is an invalid aria-* attribute. - - if (correctName == null) { - error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); - - warnedProperties[name] = true; - return true; - } // aria-* attributes should be lowercase; suggest the lowercase version. - - - if (name !== correctName) { - error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); - - warnedProperties[name] = true; - return true; - } - } - - if (rARIA.test(name)) { - var lowerCasedName = name.toLowerCase(); - var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM - // DOM properties, then it is an invalid aria-* attribute. - - if (standardName == null) { - warnedProperties[name] = true; - return false; - } // aria-* attributes should be lowercase; suggest the lowercase version. - - - if (name !== standardName) { - error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); - - warnedProperties[name] = true; - return true; - } - } - } - - return true; -} - -function warnInvalidARIAProps(type, props) { - { - var invalidProps = []; - - for (var key in props) { - var isValid = validateProperty(type, key); - - if (!isValid) { - invalidProps.push(key); - } - } - - var unknownPropString = invalidProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); - - if (invalidProps.length === 1) { - error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); - } else if (invalidProps.length > 1) { - error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); - } - } -} - -function validateProperties(type, props) { - if (isCustomComponent(type, props)) { - return; - } - - warnInvalidARIAProps(type, props); -} - -var didWarnValueNull = false; -function validateProperties$1(type, props) { - { - if (type !== 'input' && type !== 'textarea' && type !== 'select') { - return; - } - - if (props != null && props.value === null && !didWarnValueNull) { - didWarnValueNull = true; - - if (type === 'select' && props.multiple) { - error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); - } else { - error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); - } - } - } -} - -// When adding attributes to the HTML or SVG allowed attribute list, be sure to -// also add them to this module to ensure casing and incorrect name -// warnings. -var possibleStandardNames = { - // HTML - accept: 'accept', - acceptcharset: 'acceptCharset', - 'accept-charset': 'acceptCharset', - accesskey: 'accessKey', - action: 'action', - allowfullscreen: 'allowFullScreen', - alt: 'alt', - as: 'as', - async: 'async', - autocapitalize: 'autoCapitalize', - autocomplete: 'autoComplete', - autocorrect: 'autoCorrect', - autofocus: 'autoFocus', - autoplay: 'autoPlay', - autosave: 'autoSave', - capture: 'capture', - cellpadding: 'cellPadding', - cellspacing: 'cellSpacing', - challenge: 'challenge', - charset: 'charSet', - checked: 'checked', - children: 'children', - cite: 'cite', - class: 'className', - classid: 'classID', - classname: 'className', - cols: 'cols', - colspan: 'colSpan', - content: 'content', - contenteditable: 'contentEditable', - contextmenu: 'contextMenu', - controls: 'controls', - controlslist: 'controlsList', - coords: 'coords', - crossorigin: 'crossOrigin', - dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', - data: 'data', - datetime: 'dateTime', - default: 'default', - defaultchecked: 'defaultChecked', - defaultvalue: 'defaultValue', - defer: 'defer', - dir: 'dir', - disabled: 'disabled', - disablepictureinpicture: 'disablePictureInPicture', - disableremoteplayback: 'disableRemotePlayback', - download: 'download', - draggable: 'draggable', - enctype: 'encType', - enterkeyhint: 'enterKeyHint', - for: 'htmlFor', - form: 'form', - formmethod: 'formMethod', - formaction: 'formAction', - formenctype: 'formEncType', - formnovalidate: 'formNoValidate', - formtarget: 'formTarget', - frameborder: 'frameBorder', - headers: 'headers', - height: 'height', - hidden: 'hidden', - high: 'high', - href: 'href', - hreflang: 'hrefLang', - htmlfor: 'htmlFor', - httpequiv: 'httpEquiv', - 'http-equiv': 'httpEquiv', - icon: 'icon', - id: 'id', - innerhtml: 'innerHTML', - inputmode: 'inputMode', - integrity: 'integrity', - is: 'is', - itemid: 'itemID', - itemprop: 'itemProp', - itemref: 'itemRef', - itemscope: 'itemScope', - itemtype: 'itemType', - keyparams: 'keyParams', - keytype: 'keyType', - kind: 'kind', - label: 'label', - lang: 'lang', - list: 'list', - loop: 'loop', - low: 'low', - manifest: 'manifest', - marginwidth: 'marginWidth', - marginheight: 'marginHeight', - max: 'max', - maxlength: 'maxLength', - media: 'media', - mediagroup: 'mediaGroup', - method: 'method', - min: 'min', - minlength: 'minLength', - multiple: 'multiple', - muted: 'muted', - name: 'name', - nomodule: 'noModule', - nonce: 'nonce', - novalidate: 'noValidate', - open: 'open', - optimum: 'optimum', - pattern: 'pattern', - placeholder: 'placeholder', - playsinline: 'playsInline', - poster: 'poster', - preload: 'preload', - profile: 'profile', - radiogroup: 'radioGroup', - readonly: 'readOnly', - referrerpolicy: 'referrerPolicy', - rel: 'rel', - required: 'required', - reversed: 'reversed', - role: 'role', - rows: 'rows', - rowspan: 'rowSpan', - sandbox: 'sandbox', - scope: 'scope', - scoped: 'scoped', - scrolling: 'scrolling', - seamless: 'seamless', - selected: 'selected', - shape: 'shape', - size: 'size', - sizes: 'sizes', - span: 'span', - spellcheck: 'spellCheck', - src: 'src', - srcdoc: 'srcDoc', - srclang: 'srcLang', - srcset: 'srcSet', - start: 'start', - step: 'step', - style: 'style', - summary: 'summary', - tabindex: 'tabIndex', - target: 'target', - title: 'title', - type: 'type', - usemap: 'useMap', - value: 'value', - width: 'width', - wmode: 'wmode', - wrap: 'wrap', - // SVG - about: 'about', - accentheight: 'accentHeight', - 'accent-height': 'accentHeight', - accumulate: 'accumulate', - additive: 'additive', - alignmentbaseline: 'alignmentBaseline', - 'alignment-baseline': 'alignmentBaseline', - allowreorder: 'allowReorder', - alphabetic: 'alphabetic', - amplitude: 'amplitude', - arabicform: 'arabicForm', - 'arabic-form': 'arabicForm', - ascent: 'ascent', - attributename: 'attributeName', - attributetype: 'attributeType', - autoreverse: 'autoReverse', - azimuth: 'azimuth', - basefrequency: 'baseFrequency', - baselineshift: 'baselineShift', - 'baseline-shift': 'baselineShift', - baseprofile: 'baseProfile', - bbox: 'bbox', - begin: 'begin', - bias: 'bias', - by: 'by', - calcmode: 'calcMode', - capheight: 'capHeight', - 'cap-height': 'capHeight', - clip: 'clip', - clippath: 'clipPath', - 'clip-path': 'clipPath', - clippathunits: 'clipPathUnits', - cliprule: 'clipRule', - 'clip-rule': 'clipRule', - color: 'color', - colorinterpolation: 'colorInterpolation', - 'color-interpolation': 'colorInterpolation', - colorinterpolationfilters: 'colorInterpolationFilters', - 'color-interpolation-filters': 'colorInterpolationFilters', - colorprofile: 'colorProfile', - 'color-profile': 'colorProfile', - colorrendering: 'colorRendering', - 'color-rendering': 'colorRendering', - contentscripttype: 'contentScriptType', - contentstyletype: 'contentStyleType', - cursor: 'cursor', - cx: 'cx', - cy: 'cy', - d: 'd', - datatype: 'datatype', - decelerate: 'decelerate', - descent: 'descent', - diffuseconstant: 'diffuseConstant', - direction: 'direction', - display: 'display', - divisor: 'divisor', - dominantbaseline: 'dominantBaseline', - 'dominant-baseline': 'dominantBaseline', - dur: 'dur', - dx: 'dx', - dy: 'dy', - edgemode: 'edgeMode', - elevation: 'elevation', - enablebackground: 'enableBackground', - 'enable-background': 'enableBackground', - end: 'end', - exponent: 'exponent', - externalresourcesrequired: 'externalResourcesRequired', - fill: 'fill', - fillopacity: 'fillOpacity', - 'fill-opacity': 'fillOpacity', - fillrule: 'fillRule', - 'fill-rule': 'fillRule', - filter: 'filter', - filterres: 'filterRes', - filterunits: 'filterUnits', - floodopacity: 'floodOpacity', - 'flood-opacity': 'floodOpacity', - floodcolor: 'floodColor', - 'flood-color': 'floodColor', - focusable: 'focusable', - fontfamily: 'fontFamily', - 'font-family': 'fontFamily', - fontsize: 'fontSize', - 'font-size': 'fontSize', - fontsizeadjust: 'fontSizeAdjust', - 'font-size-adjust': 'fontSizeAdjust', - fontstretch: 'fontStretch', - 'font-stretch': 'fontStretch', - fontstyle: 'fontStyle', - 'font-style': 'fontStyle', - fontvariant: 'fontVariant', - 'font-variant': 'fontVariant', - fontweight: 'fontWeight', - 'font-weight': 'fontWeight', - format: 'format', - from: 'from', - fx: 'fx', - fy: 'fy', - g1: 'g1', - g2: 'g2', - glyphname: 'glyphName', - 'glyph-name': 'glyphName', - glyphorientationhorizontal: 'glyphOrientationHorizontal', - 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', - glyphorientationvertical: 'glyphOrientationVertical', - 'glyph-orientation-vertical': 'glyphOrientationVertical', - glyphref: 'glyphRef', - gradienttransform: 'gradientTransform', - gradientunits: 'gradientUnits', - hanging: 'hanging', - horizadvx: 'horizAdvX', - 'horiz-adv-x': 'horizAdvX', - horizoriginx: 'horizOriginX', - 'horiz-origin-x': 'horizOriginX', - ideographic: 'ideographic', - imagerendering: 'imageRendering', - 'image-rendering': 'imageRendering', - in2: 'in2', - in: 'in', - inlist: 'inlist', - intercept: 'intercept', - k1: 'k1', - k2: 'k2', - k3: 'k3', - k4: 'k4', - k: 'k', - kernelmatrix: 'kernelMatrix', - kernelunitlength: 'kernelUnitLength', - kerning: 'kerning', - keypoints: 'keyPoints', - keysplines: 'keySplines', - keytimes: 'keyTimes', - lengthadjust: 'lengthAdjust', - letterspacing: 'letterSpacing', - 'letter-spacing': 'letterSpacing', - lightingcolor: 'lightingColor', - 'lighting-color': 'lightingColor', - limitingconeangle: 'limitingConeAngle', - local: 'local', - markerend: 'markerEnd', - 'marker-end': 'markerEnd', - markerheight: 'markerHeight', - markermid: 'markerMid', - 'marker-mid': 'markerMid', - markerstart: 'markerStart', - 'marker-start': 'markerStart', - markerunits: 'markerUnits', - markerwidth: 'markerWidth', - mask: 'mask', - maskcontentunits: 'maskContentUnits', - maskunits: 'maskUnits', - mathematical: 'mathematical', - mode: 'mode', - numoctaves: 'numOctaves', - offset: 'offset', - opacity: 'opacity', - operator: 'operator', - order: 'order', - orient: 'orient', - orientation: 'orientation', - origin: 'origin', - overflow: 'overflow', - overlineposition: 'overlinePosition', - 'overline-position': 'overlinePosition', - overlinethickness: 'overlineThickness', - 'overline-thickness': 'overlineThickness', - paintorder: 'paintOrder', - 'paint-order': 'paintOrder', - panose1: 'panose1', - 'panose-1': 'panose1', - pathlength: 'pathLength', - patterncontentunits: 'patternContentUnits', - patterntransform: 'patternTransform', - patternunits: 'patternUnits', - pointerevents: 'pointerEvents', - 'pointer-events': 'pointerEvents', - points: 'points', - pointsatx: 'pointsAtX', - pointsaty: 'pointsAtY', - pointsatz: 'pointsAtZ', - prefix: 'prefix', - preservealpha: 'preserveAlpha', - preserveaspectratio: 'preserveAspectRatio', - primitiveunits: 'primitiveUnits', - property: 'property', - r: 'r', - radius: 'radius', - refx: 'refX', - refy: 'refY', - renderingintent: 'renderingIntent', - 'rendering-intent': 'renderingIntent', - repeatcount: 'repeatCount', - repeatdur: 'repeatDur', - requiredextensions: 'requiredExtensions', - requiredfeatures: 'requiredFeatures', - resource: 'resource', - restart: 'restart', - result: 'result', - results: 'results', - rotate: 'rotate', - rx: 'rx', - ry: 'ry', - scale: 'scale', - security: 'security', - seed: 'seed', - shaperendering: 'shapeRendering', - 'shape-rendering': 'shapeRendering', - slope: 'slope', - spacing: 'spacing', - specularconstant: 'specularConstant', - specularexponent: 'specularExponent', - speed: 'speed', - spreadmethod: 'spreadMethod', - startoffset: 'startOffset', - stddeviation: 'stdDeviation', - stemh: 'stemh', - stemv: 'stemv', - stitchtiles: 'stitchTiles', - stopcolor: 'stopColor', - 'stop-color': 'stopColor', - stopopacity: 'stopOpacity', - 'stop-opacity': 'stopOpacity', - strikethroughposition: 'strikethroughPosition', - 'strikethrough-position': 'strikethroughPosition', - strikethroughthickness: 'strikethroughThickness', - 'strikethrough-thickness': 'strikethroughThickness', - string: 'string', - stroke: 'stroke', - strokedasharray: 'strokeDasharray', - 'stroke-dasharray': 'strokeDasharray', - strokedashoffset: 'strokeDashoffset', - 'stroke-dashoffset': 'strokeDashoffset', - strokelinecap: 'strokeLinecap', - 'stroke-linecap': 'strokeLinecap', - strokelinejoin: 'strokeLinejoin', - 'stroke-linejoin': 'strokeLinejoin', - strokemiterlimit: 'strokeMiterlimit', - 'stroke-miterlimit': 'strokeMiterlimit', - strokewidth: 'strokeWidth', - 'stroke-width': 'strokeWidth', - strokeopacity: 'strokeOpacity', - 'stroke-opacity': 'strokeOpacity', - suppresscontenteditablewarning: 'suppressContentEditableWarning', - suppresshydrationwarning: 'suppressHydrationWarning', - surfacescale: 'surfaceScale', - systemlanguage: 'systemLanguage', - tablevalues: 'tableValues', - targetx: 'targetX', - targety: 'targetY', - textanchor: 'textAnchor', - 'text-anchor': 'textAnchor', - textdecoration: 'textDecoration', - 'text-decoration': 'textDecoration', - textlength: 'textLength', - textrendering: 'textRendering', - 'text-rendering': 'textRendering', - to: 'to', - transform: 'transform', - typeof: 'typeof', - u1: 'u1', - u2: 'u2', - underlineposition: 'underlinePosition', - 'underline-position': 'underlinePosition', - underlinethickness: 'underlineThickness', - 'underline-thickness': 'underlineThickness', - unicode: 'unicode', - unicodebidi: 'unicodeBidi', - 'unicode-bidi': 'unicodeBidi', - unicoderange: 'unicodeRange', - 'unicode-range': 'unicodeRange', - unitsperem: 'unitsPerEm', - 'units-per-em': 'unitsPerEm', - unselectable: 'unselectable', - valphabetic: 'vAlphabetic', - 'v-alphabetic': 'vAlphabetic', - values: 'values', - vectoreffect: 'vectorEffect', - 'vector-effect': 'vectorEffect', - version: 'version', - vertadvy: 'vertAdvY', - 'vert-adv-y': 'vertAdvY', - vertoriginx: 'vertOriginX', - 'vert-origin-x': 'vertOriginX', - vertoriginy: 'vertOriginY', - 'vert-origin-y': 'vertOriginY', - vhanging: 'vHanging', - 'v-hanging': 'vHanging', - videographic: 'vIdeographic', - 'v-ideographic': 'vIdeographic', - viewbox: 'viewBox', - viewtarget: 'viewTarget', - visibility: 'visibility', - vmathematical: 'vMathematical', - 'v-mathematical': 'vMathematical', - vocab: 'vocab', - widths: 'widths', - wordspacing: 'wordSpacing', - 'word-spacing': 'wordSpacing', - writingmode: 'writingMode', - 'writing-mode': 'writingMode', - x1: 'x1', - x2: 'x2', - x: 'x', - xchannelselector: 'xChannelSelector', - xheight: 'xHeight', - 'x-height': 'xHeight', - xlinkactuate: 'xlinkActuate', - 'xlink:actuate': 'xlinkActuate', - xlinkarcrole: 'xlinkArcrole', - 'xlink:arcrole': 'xlinkArcrole', - xlinkhref: 'xlinkHref', - 'xlink:href': 'xlinkHref', - xlinkrole: 'xlinkRole', - 'xlink:role': 'xlinkRole', - xlinkshow: 'xlinkShow', - 'xlink:show': 'xlinkShow', - xlinktitle: 'xlinkTitle', - 'xlink:title': 'xlinkTitle', - xlinktype: 'xlinkType', - 'xlink:type': 'xlinkType', - xmlbase: 'xmlBase', - 'xml:base': 'xmlBase', - xmllang: 'xmlLang', - 'xml:lang': 'xmlLang', - xmlns: 'xmlns', - 'xml:space': 'xmlSpace', - xmlnsxlink: 'xmlnsXlink', - 'xmlns:xlink': 'xmlnsXlink', - xmlspace: 'xmlSpace', - y1: 'y1', - y2: 'y2', - y: 'y', - ychannelselector: 'yChannelSelector', - z: 'z', - zoomandpan: 'zoomAndPan' -}; - -var validateProperty$1 = function () {}; - -{ - var warnedProperties$1 = {}; - var _hasOwnProperty = Object.prototype.hasOwnProperty; - var EVENT_NAME_REGEX = /^on./; - var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; - var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); - var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); - - validateProperty$1 = function (tagName, name, value, eventRegistry) { - if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { - return true; - } - - var lowerCasedName = name.toLowerCase(); - - if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { - error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); - - warnedProperties$1[name] = true; - return true; - } // We can't rely on the event system being injected on the server. - - - if (eventRegistry != null) { - var registrationNameDependencies = eventRegistry.registrationNameDependencies, - possibleRegistrationNames = eventRegistry.possibleRegistrationNames; - - if (registrationNameDependencies.hasOwnProperty(name)) { - return true; - } - - var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; - - if (registrationName != null) { - error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); - - warnedProperties$1[name] = true; - return true; - } - - if (EVENT_NAME_REGEX.test(name)) { - error('Unknown event handler property `%s`. It will be ignored.', name); - - warnedProperties$1[name] = true; - return true; - } - } else if (EVENT_NAME_REGEX.test(name)) { - // If no event plugins have been injected, we are in a server environment. - // So we can't tell if the event name is correct for sure, but we can filter - // out known bad ones like `onclick`. We can't suggest a specific replacement though. - if (INVALID_EVENT_NAME_REGEX.test(name)) { - error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); - } - - warnedProperties$1[name] = true; - return true; - } // Let the ARIA attribute hook validate ARIA attributes - - - if (rARIA$1.test(name) || rARIACamel$1.test(name)) { - return true; - } - - if (lowerCasedName === 'innerhtml') { - error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); - - warnedProperties$1[name] = true; - return true; - } - - if (lowerCasedName === 'aria') { - error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); - - warnedProperties$1[name] = true; - return true; - } - - if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { - error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); - - warnedProperties$1[name] = true; - return true; - } - - if (typeof value === 'number' && isNaN(value)) { - error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); - - warnedProperties$1[name] = true; - return true; - } - - var propertyInfo = getPropertyInfo(name); - var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. - - if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { - var standardName = possibleStandardNames[lowerCasedName]; - - if (standardName !== name) { - error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); - - warnedProperties$1[name] = true; - return true; - } - } else if (!isReserved && name !== lowerCasedName) { - // Unknown attributes should have lowercase casing since that's how they - // will be cased anyway with server rendering. - error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); - - warnedProperties$1[name] = true; - return true; - } - - if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { - if (value) { - error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); - } else { - error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); - } - - warnedProperties$1[name] = true; - return true; - } // Now that we've validated casing, do not validate - // data types for reserved props - - - if (isReserved) { - return true; - } // Warn when a known attribute is a bad type - - - if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { - warnedProperties$1[name] = true; - return false; - } // Warn when passing the strings 'false' or 'true' into a boolean prop - - - if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { - error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); - - warnedProperties$1[name] = true; - return true; - } - - return true; - }; -} - -var warnUnknownProperties = function (type, props, eventRegistry) { - { - var unknownProps = []; - - for (var key in props) { - var isValid = validateProperty$1(type, key, props[key], eventRegistry); - - if (!isValid) { - unknownProps.push(key); - } - } - - var unknownPropString = unknownProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); - - if (unknownProps.length === 1) { - error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); - } else if (unknownProps.length > 1) { - error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); - } - } -}; - -function validateProperties$2(type, props, eventRegistry) { - if (isCustomComponent(type, props)) { - return; - } - - warnUnknownProperties(type, props, eventRegistry); -} - -var toArray = React.Children.toArray; // This is only used in DEV. -// Each entry is `this.stack` from a currently executing renderer instance. -// (There may be more than one because ReactDOMServer is reentrant). -// Each stack is an array of frames which may contain nested stacks of elements. - -var currentDebugStacks = []; -var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; -var ReactDebugCurrentFrame$1; -var prevGetCurrentStackImpl = null; - -var getCurrentServerStackImpl = function () { - return ''; -}; - -var describeStackFrame = function (element) { - return ''; -}; - -var validatePropertiesInDevelopment = function (type, props) {}; - -var pushCurrentDebugStack = function (stack) {}; - -var pushElementToDebugStack = function (element) {}; - -var popCurrentDebugStack = function () {}; - -var hasWarnedAboutUsingContextAsConsumer = false; - -{ - ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - - validatePropertiesInDevelopment = function (type, props) { - validateProperties(type, props); - validateProperties$1(type, props); - validateProperties$2(type, props, null); - }; - - describeStackFrame = function (element) { - return describeUnknownElementTypeFrameInDEV(element.type, element._source, null); - }; - - pushCurrentDebugStack = function (stack) { - currentDebugStacks.push(stack); - - if (currentDebugStacks.length === 1) { - // We are entering a server renderer. - // Remember the previous (e.g. client) global stack implementation. - prevGetCurrentStackImpl = ReactDebugCurrentFrame$1.getCurrentStack; - ReactDebugCurrentFrame$1.getCurrentStack = getCurrentServerStackImpl; - } - }; - - pushElementToDebugStack = function (element) { - // For the innermost executing ReactDOMServer call, - var stack = currentDebugStacks[currentDebugStacks.length - 1]; // Take the innermost executing frame (e.g. ), - - var frame = stack[stack.length - 1]; // and record that it has one more element associated with it. - - frame.debugElementStack.push(element); // We only need this because we tail-optimize single-element - // children and directly handle them in an inner loop instead of - // creating separate frames for them. - }; - - popCurrentDebugStack = function () { - currentDebugStacks.pop(); - - if (currentDebugStacks.length === 0) { - // We are exiting the server renderer. - // Restore the previous (e.g. client) global stack implementation. - ReactDebugCurrentFrame$1.getCurrentStack = prevGetCurrentStackImpl; - prevGetCurrentStackImpl = null; - } - }; - - getCurrentServerStackImpl = function () { - if (currentDebugStacks.length === 0) { - // Nothing is currently rendering. - return ''; - } // ReactDOMServer is reentrant so there may be multiple calls at the same time. - // Take the frames from the innermost call which is the last in the array. - - - var frames = currentDebugStacks[currentDebugStacks.length - 1]; - var stack = ''; // Go through every frame in the stack from the innermost one. - - for (var i = frames.length - 1; i >= 0; i--) { - var frame = frames[i]; // Every frame might have more than one debug element stack entry associated with it. - // This is because single-child nesting doesn't create materialized frames. - // Instead it would push them through `pushElementToDebugStack()`. - - var debugElementStack = frame.debugElementStack; - - for (var ii = debugElementStack.length - 1; ii >= 0; ii--) { - stack += describeStackFrame(debugElementStack[ii]); - } - } - - return stack; - }; -} - -var didWarnDefaultInputValue = false; -var didWarnDefaultChecked = false; -var didWarnDefaultSelectValue = false; -var didWarnDefaultTextareaValue = false; -var didWarnInvalidOptionChildren = false; -var didWarnAboutNoopUpdateForComponent = {}; -var didWarnAboutBadClass = {}; -var didWarnAboutModulePatternComponent = {}; -var didWarnAboutDeprecatedWillMount = {}; -var didWarnAboutUndefinedDerivedState = {}; -var didWarnAboutUninitializedState = {}; -var valuePropNames = ['value', 'defaultValue']; -var newlineEatingTags = { - listing: true, - pre: true, - textarea: true -}; // We accept any tag to be rendered but since this gets injected into arbitrary -// HTML, we want to make sure that it's a safe tag. -// http://www.w3.org/TR/REC-xml/#NT-Name - -var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset - -var validatedTagCache = {}; - -function validateDangerousTag(tag) { - if (!validatedTagCache.hasOwnProperty(tag)) { - if (!VALID_TAG_REGEX.test(tag)) { - { - throw Error( "Invalid tag: " + tag ); - } - } - - validatedTagCache[tag] = true; - } -} - -var styleNameCache = {}; - -var processStyleName = function (styleName) { - if (styleNameCache.hasOwnProperty(styleName)) { - return styleNameCache[styleName]; - } - - var result = hyphenateStyleName(styleName); - styleNameCache[styleName] = result; - return result; -}; - -function createMarkupForStyles(styles) { - var serialized = ''; - var delimiter = ''; - - for (var styleName in styles) { - if (!styles.hasOwnProperty(styleName)) { - continue; - } - - var isCustomProperty = styleName.indexOf('--') === 0; - var styleValue = styles[styleName]; - - { - if (!isCustomProperty) { - warnValidStyle$1(styleName, styleValue); - } - } - - if (styleValue != null) { - serialized += delimiter + (isCustomProperty ? styleName : processStyleName(styleName)) + ':'; - serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty); - delimiter = ';'; - } - } - - return serialized || null; -} - -function warnNoop(publicInstance, callerName) { - { - var _constructor = publicInstance.constructor; - var componentName = _constructor && getComponentName(_constructor) || 'ReactClass'; - var warningKey = componentName + '.' + callerName; - - if (didWarnAboutNoopUpdateForComponent[warningKey]) { - return; - } - - error('%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the %s component.', callerName, callerName, componentName); - - didWarnAboutNoopUpdateForComponent[warningKey] = true; - } -} - -function shouldConstruct$1(Component) { - return Component.prototype && Component.prototype.isReactComponent; -} - -function getNonChildrenInnerMarkup(props) { - var innerHTML = props.dangerouslySetInnerHTML; - - if (innerHTML != null) { - if (innerHTML.__html != null) { - return innerHTML.__html; - } - } else { - var content = props.children; - - if (typeof content === 'string' || typeof content === 'number') { - return escapeTextForBrowser(content); - } - } - - return null; -} - -function flattenTopLevelChildren(children) { - if (!React.isValidElement(children)) { - return toArray(children); - } - - var element = children; - - if (element.type !== REACT_FRAGMENT_TYPE) { - return [element]; - } - - var fragmentChildren = element.props.children; - - if (!React.isValidElement(fragmentChildren)) { - return toArray(fragmentChildren); - } - - var fragmentChildElement = fragmentChildren; - return [fragmentChildElement]; -} - -function flattenOptionChildren(children) { - if (children === undefined || children === null) { - return children; - } - - var content = ''; // Flatten children and warn if they aren't strings or numbers; - // invalid types are ignored. - - React.Children.forEach(children, function (child) { - if (child == null) { - return; - } - - content += child; - - { - if (!didWarnInvalidOptionChildren && typeof child !== 'string' && typeof child !== 'number') { - didWarnInvalidOptionChildren = true; - - error('Only strings and numbers are supported as