diff --git a/notes/.obsidian/community-plugins.json b/notes/.obsidian/community-plugins.json index d22e74b..a895f9f 100644 --- a/notes/.obsidian/community-plugins.json +++ b/notes/.obsidian/community-plugins.json @@ -28,5 +28,16 @@ "folder-note-plugin", "obsidian-icons-plugin", "obsidian-emoji-toolbar", - "open-note-to-window-title" + "open-note-to-window-title", + "nldates-obsidian", + "breadcrumbs", + "obsidian-checklist-plugin", + "tag-wrangler", + "better-word-count", + "obsidian-icon-folder", + "obsidian-linter", + "obsidian-spaced-repetition", + "highlightr-plugin", + "obsidian-reading-time", + "obsidian-banners" ] \ No newline at end of file diff --git a/notes/.obsidian/plugins/better-word-count/main.js b/notes/.obsidian/plugins/better-word-count/main.js new file mode 100644 index 0000000..22efd4e --- /dev/null +++ b/notes/.obsidian/plugins/better-word-count/main.js @@ -0,0 +1,160 @@ +'use strict'; + +var obsidian = require('obsidian'); +var state = require('@codemirror/state'); +var view = require('@codemirror/view'); + +class StatusBar { + constructor(statusBarEl) { + this.statusBarEl = statusBarEl; + } + displayText(text) { + this.statusBarEl.setText(text); + } +} + +class BetterWordCount extends obsidian.Plugin { + // public currentFile: TFile; + // public settings: BetterWordCountSettings; + // public view: StatsView; + // public dataManager: DataManager; + // public barManager: BarManager; + // onunload(): void { + // this.app.workspace + // .getLeavesOfType(VIEW_TYPE_STATS) + // .forEach((leaf) => leaf.detach()); + // } + onload() { + let statusBarEl = this.addStatusBarItem(); + BetterWordCount.statusBar = new StatusBar(statusBarEl); + this.createCMExtension(); + // this.settings = Object.assign(DEFAULT_SETTINGS, await this.loadData()); + // this.addSettingTab(new BetterWordCountSettingsTab(this.app, this)); + // let statusBarElTest = this.addStatusBarItem(); + // statusBarElTest.setText("§l§aTest§r"); + // let statusBarEl = this.addStatusBarItem(); + // this.statusBar = new StatusBar(statusBarEl); + // this.statusBar.displayText("Awesome"); + // this.barManager = new BarManager( + // this.statusBar, + // this.settings, + // this.app.vault, + // this.app.metadataCache + // ); + // if (this.settings.collectStats) { + // this.dataManager = new DataManager( + // this.app.vault, + // this.app.metadataCache + // ); + // } + // this.registerEvent( + // this.app.workspace.on("active-leaf-change", this.activeLeafChange, this) + // ); + // this.registerCodeMirror((cm: CodeMirror.Editor) => { + // cm.on("cursorActivity", (cm: CodeMirror.Editor) => + // this.barManager.cursorActivity(cm) + // ); + // }); + // if (this.settings.collectStats) { + // this.registerEvent( + // this.app.workspace.on( + // "quick-preview", + // this.dataManager.debounceChange, + // this.dataManager + // ) + // ); + // this.registerInterval( + // window.setInterval(() => { + // this.dataManager.setTotalStats(); + // }, 1000 * 60) + // ); + // } + // addIcon(STATS_ICON_NAME, STATS_ICON); + // this.addCommand({ + // id: "show-vault-stats-view", + // name: "Open Statistics", + // checkCallback: (checking: boolean) => { + // if (checking) { + // return this.app.workspace.getLeavesOfType("vault-stats").length === 0; + // } + // this.initLeaf(); + // }, + // }); + // this.registerView( + // VIEW_TYPE_STATS, + // (leaf: WorkspaceLeaf) => (this.view = new StatsView(leaf)) + // ); + // if (this.app.workspace.layoutReady) { + // this.initLeaf(); + // } else { + // this.app.workspace.onLayoutReady(() => this.initLeaf()); + // } + } + // activeLeafChange(leaf: WorkspaceLeaf) { + // if (!(leaf.view.getViewType() === "markdown")) { + // this.barManager.updateAltStatusBar(); + // } + // } + // async saveSettings(): Promise { + // await this.saveData(this.settings); + // } + // initLeaf(): void { + // if (this.app.workspace.getLeavesOfType(VIEW_TYPE_STATS).length) { + // return; + // } + // this.app.workspace.getRightLeaf(false).setViewState({ + // type: VIEW_TYPE_STATS, + // }); + // } + createCMExtension() { + const cmStateField = state.StateField.define({ + create(state) { + return view.Decoration.none; + }, + update(effects, tr) { + let text = ""; + const selection = tr.newSelection.main; + if (selection.empty) { + const textIter = tr.newDoc.iter(); + while (!textIter.done) { + text = text + textIter.next().value; + } + } + else { + const textIter = tr.newDoc.iterRange(selection.from, selection.to); + while (!textIter.done) { + text = text + textIter.next().value; + } + } + BetterWordCount.updateStatusBar(text); + return effects; + }, + provide: (f) => view.EditorView.decorations.from(f), + }); + this.registerEditorExtension(cmStateField); + } + static updateStatusBar(text) { + const words = this.getWordCount(text); + const chars = this.getCharacterCount(text); + this.statusBar.displayText(`${words} words ${chars} characters`); + } + static getWordCount(text) { + const spaceDelimitedChars = /A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/ + .source; + const nonSpaceDelimitedWords = /\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u4E00-\u9FD5/.source; + const nonSpaceDelimitedWordsOther = /[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u4E00-\u9FD5]{1}/ + .source; + const pattern = new RegExp([ + `(?:[0-9]+(?:(?:,|\\.)[0-9]+)*|[\\-${spaceDelimitedChars}])+`, + nonSpaceDelimitedWords, + nonSpaceDelimitedWordsOther, + ].join("|"), "g"); + return (text.match(pattern) || []).length; + } + static getCharacterCount(text) { + return text.length; + } +} + +module.exports = BetterWordCount; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXR1cy9iYXIudHMiLCIuLi9zcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU3RhdHVzQmFyIHtcbiAgcHJpdmF0ZSBzdGF0dXNCYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzQmFyRWw6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5zdGF0dXNCYXJFbCA9IHN0YXR1c0JhckVsO1xuICB9XG5cbiAgZGlzcGxheVRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KHRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4sIFRGaWxlLCBhZGRJY29uLCBXb3Jrc3BhY2VMZWFmLCBNYXJrZG93bkVkaXRWaWV3LCBNYXJrZG93blZpZXcsIE1hcmtkb3duU291cmNlVmlldywgZWRpdG9yVmlld0ZpZWxkLCBlZGl0b3JFZGl0b3JGaWVsZCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbi8vIGltcG9ydCB7IEJldHRlcldvcmRDb3VudFNldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3Mvc2V0dGluZ3MtdGFiXCI7XHJcbi8vIGltcG9ydCB7IEJldHRlcldvcmRDb3VudFNldHRpbmdzLCBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSBcIi4vc2V0dGluZ3Mvc2V0dGluZ3NcIjtcclxuLy8gaW1wb3J0IHsgU3RhdHVzQmFyIH0gZnJvbSBcIi4vc3RhdHVzL2JhclwiO1xyXG4vLyBpbXBvcnQgeyBTVEFUU19JQ09OLCBTVEFUU19JQ09OX05BTUUsIFZJRVdfVFlQRV9TVEFUUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG4vLyBpbXBvcnQgU3RhdHNWaWV3IGZyb20gXCIuL3ZpZXcvdmlld1wiO1xyXG4vLyBpbXBvcnQgeyBEYXRhTWFuYWdlciB9IGZyb20gXCIuL2RhdGEvbWFuYWdlclwiO1xyXG4vLyBpbXBvcnQgeyBCYXJNYW5hZ2VyIH0gZnJvbSBcIi4vc3RhdHVzL21hbmFnZXJcIjtcclxuXHJcbi8vIGltcG9ydCB7fSBmcm9tIFwiQGNvZGVtaXJyb3IvdGV4dFwiO1xyXG5pbXBvcnQge0VkaXRvclN0YXRlLCBTdGF0ZUVmZmVjdCwgU3RhdGVGaWVsZCwgVHJhbnNhY3Rpb259IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xyXG5cclxuLy8gaW1wb3J0IHR5cGUgQ29kZU1pcnJvciBmcm9tIFwiY29kZW1pcnJvclwiO1xyXG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3IH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcclxuaW1wb3J0IHsgU3RhdHVzQmFyIH0gZnJvbSBcIi4vc3RhdHVzL2JhclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmV0dGVyV29yZENvdW50IGV4dGVuZHMgUGx1Z2luIHtcclxuICBwdWJsaWMgc3RhdGljIHN0YXR1c0JhcjogU3RhdHVzQmFyO1xyXG4gIC8vIHB1YmxpYyBjdXJyZW50RmlsZTogVEZpbGU7XHJcbiAgLy8gcHVibGljIHNldHRpbmdzOiBCZXR0ZXJXb3JkQ291bnRTZXR0aW5ncztcclxuICAvLyBwdWJsaWMgdmlldzogU3RhdHNWaWV3O1xyXG4gIC8vIHB1YmxpYyBkYXRhTWFuYWdlcjogRGF0YU1hbmFnZXI7XHJcbiAgLy8gcHVibGljIGJhck1hbmFnZXI6IEJhck1hbmFnZXI7XHJcblxyXG4gIC8vIG9udW5sb2FkKCk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5hcHAud29ya3NwYWNlXHJcbiAgLy8gICAgIC5nZXRMZWF2ZXNPZlR5cGUoVklFV19UWVBFX1NUQVRTKVxyXG4gIC8vICAgICAuZm9yRWFjaCgobGVhZikgPT4gbGVhZi5kZXRhY2goKSk7XHJcbiAgLy8gfVxyXG5cclxuICBvbmxvYWQoKSB7XHJcbiAgICBsZXQgc3RhdHVzQmFyRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcclxuICAgIEJldHRlcldvcmRDb3VudC5zdGF0dXNCYXIgPSBuZXcgU3RhdHVzQmFyKHN0YXR1c0JhckVsKTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZUNNRXh0ZW5zaW9uKCk7XHJcblxyXG4gICAgLy8gdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICAgIC8vIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgQmV0dGVyV29yZENvdW50U2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcbiAgICAvLyBsZXQgc3RhdHVzQmFyRWxUZXN0ID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XHJcbiAgICAvLyBzdGF0dXNCYXJFbFRlc3Quc2V0VGV4dChcIsKnbMKnYVRlc3TCp3JcIik7XHJcbiAgICAvLyBsZXQgc3RhdHVzQmFyRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcclxuICAgIC8vIHRoaXMuc3RhdHVzQmFyID0gbmV3IFN0YXR1c0JhcihzdGF0dXNCYXJFbCk7XHJcbiAgICAvLyB0aGlzLnN0YXR1c0Jhci5kaXNwbGF5VGV4dChcIkF3ZXNvbWVcIik7XHJcbiAgICAvLyB0aGlzLmJhck1hbmFnZXIgPSBuZXcgQmFyTWFuYWdlcihcclxuICAgIC8vICAgdGhpcy5zdGF0dXNCYXIsXHJcbiAgICAvLyAgIHRoaXMuc2V0dGluZ3MsXHJcbiAgICAvLyAgIHRoaXMuYXBwLnZhdWx0LFxyXG4gICAgLy8gICB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlXHJcbiAgICAvLyApO1xyXG5cclxuICAgIC8vIGlmICh0aGlzLnNldHRpbmdzLmNvbGxlY3RTdGF0cykge1xyXG4gICAgLy8gICB0aGlzLmRhdGFNYW5hZ2VyID0gbmV3IERhdGFNYW5hZ2VyKFxyXG4gICAgLy8gICAgIHRoaXMuYXBwLnZhdWx0LFxyXG4gICAgLy8gICAgIHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgIC8vICAgKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyB0aGlzLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICAvLyAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImFjdGl2ZS1sZWFmLWNoYW5nZVwiLCB0aGlzLmFjdGl2ZUxlYWZDaGFuZ2UsIHRoaXMpXHJcbiAgICAvLyApO1xyXG5cclxuICAgIC8vIHRoaXMucmVnaXN0ZXJDb2RlTWlycm9yKChjbTogQ29kZU1pcnJvci5FZGl0b3IpID0+IHtcclxuICAgIC8vICAgY20ub24oXCJjdXJzb3JBY3Rpdml0eVwiLCAoY206IENvZGVNaXJyb3IuRWRpdG9yKSA9PlxyXG4gICAgLy8gICAgIHRoaXMuYmFyTWFuYWdlci5jdXJzb3JBY3Rpdml0eShjbSlcclxuICAgIC8vICAgKTtcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIFxyXG4gICAgXHJcblxyXG4gICAgLy8gaWYgKHRoaXMuc2V0dGluZ3MuY29sbGVjdFN0YXRzKSB7XHJcbiAgICAvLyAgIHRoaXMucmVnaXN0ZXJFdmVudChcclxuICAgIC8vICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXHJcbiAgICAvLyAgICAgICBcInF1aWNrLXByZXZpZXdcIixcclxuICAgIC8vICAgICAgIHRoaXMuZGF0YU1hbmFnZXIuZGVib3VuY2VDaGFuZ2UsXHJcbiAgICAvLyAgICAgICB0aGlzLmRhdGFNYW5hZ2VyXHJcbiAgICAvLyAgICAgKVxyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgdGhpcy5yZWdpc3RlckludGVydmFsKFxyXG4gICAgLy8gICAgIHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAvLyAgICAgICB0aGlzLmRhdGFNYW5hZ2VyLnNldFRvdGFsU3RhdHMoKTtcclxuICAgIC8vICAgICB9LCAxMDAwICogNjApXHJcbiAgICAvLyAgICk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gYWRkSWNvbihTVEFUU19JQ09OX05BTUUsIFNUQVRTX0lDT04pO1xyXG5cclxuICAgIC8vIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAvLyAgIGlkOiBcInNob3ctdmF1bHQtc3RhdHMtdmlld1wiLFxyXG4gICAgLy8gICBuYW1lOiBcIk9wZW4gU3RhdGlzdGljc1wiLFxyXG4gICAgLy8gICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcclxuICAgIC8vICAgICBpZiAoY2hlY2tpbmcpIHtcclxuICAgIC8vICAgICAgIHJldHVybiB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwidmF1bHQtc3RhdHNcIikubGVuZ3RoID09PSAwO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLmluaXRMZWFmKCk7XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICAvLyB0aGlzLnJlZ2lzdGVyVmlldyhcclxuICAgIC8vICAgVklFV19UWVBFX1NUQVRTLFxyXG4gICAgLy8gICAobGVhZjogV29ya3NwYWNlTGVhZikgPT4gKHRoaXMudmlldyA9IG5ldyBTdGF0c1ZpZXcobGVhZikpXHJcbiAgICAvLyApO1xyXG5cclxuICAgIC8vIGlmICh0aGlzLmFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcclxuICAgIC8vICAgdGhpcy5pbml0TGVhZigpO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4gdGhpcy5pbml0TGVhZigpKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8vIGFjdGl2ZUxlYWZDaGFuZ2UobGVhZjogV29ya3NwYWNlTGVhZikge1xyXG4gIC8vICAgaWYgKCEobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFwibWFya2Rvd25cIikpIHtcclxuICAvLyAgICAgdGhpcy5iYXJNYW5hZ2VyLnVwZGF0ZUFsdFN0YXR1c0JhcigpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gYXN5bmMgc2F2ZVNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gIC8vICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGluaXRMZWFmKCk6IHZvaWQge1xyXG4gIC8vICAgaWYgKHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVklFV19UWVBFX1NUQVRTKS5sZW5ndGgpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5hcHAud29ya3NwYWNlLmdldFJpZ2h0TGVhZihmYWxzZSkuc2V0Vmlld1N0YXRlKHtcclxuICAvLyAgICAgdHlwZTogVklFV19UWVBFX1NUQVRTLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgY3JlYXRlQ01FeHRlbnNpb24oKSB7XHJcblxyXG4gICAgY29uc3QgY21TdGF0ZUZpZWxkID0gU3RhdGVGaWVsZC5kZWZpbmU8RGVjb3JhdGlvblNldD4oe1xyXG4gICAgICBjcmVhdGUoc3RhdGU6IEVkaXRvclN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuICBEZWNvcmF0aW9uLm5vbmU7XHJcbiAgICAgIH0sXHJcbiAgICAgIHVwZGF0ZShlZmZlY3RzOiBEZWNvcmF0aW9uU2V0LCB0cjogVHJhbnNhY3Rpb24pIHtcclxuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdHIubmV3U2VsZWN0aW9uLm1haW47XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5lbXB0eSkge1xyXG4gICAgICAgICAgY29uc3QgdGV4dEl0ZXIgPSB0ci5uZXdEb2MuaXRlcigpO1xyXG4gICAgICAgICAgd2hpbGUgKCF0ZXh0SXRlci5kb25lKSB7XHJcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgdGV4dEl0ZXIubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB0ZXh0SXRlciA9IHRyLm5ld0RvYy5pdGVyUmFuZ2Uoc2VsZWN0aW9uLmZyb20sIHNlbGVjdGlvbi50byk7XHJcbiAgICAgICAgICB3aGlsZSAoIXRleHRJdGVyLmRvbmUpIHtcclxuICAgICAgICAgICAgdGV4dCA9IHRleHQgKyB0ZXh0SXRlci5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBCZXR0ZXJXb3JkQ291bnQudXBkYXRlU3RhdHVzQmFyKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBlZmZlY3RzO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgcHJvdmlkZTogKGY6IGFueSkgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLFxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oY21TdGF0ZUZpZWxkKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB1cGRhdGVTdGF0dXNCYXIodGV4dDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JkcyA9IHRoaXMuZ2V0V29yZENvdW50KHRleHQpO1xyXG4gICAgY29uc3QgY2hhcnMgPSB0aGlzLmdldENoYXJhY3RlckNvdW50KHRleHQpO1xyXG5cclxuICAgIHRoaXMuc3RhdHVzQmFyLmRpc3BsYXlUZXh0KGAke3dvcmRzfSB3b3JkcyAke2NoYXJzfSBjaGFyYWN0ZXJzYCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0V29yZENvdW50KHRleHQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBzcGFjZURlbGltaXRlZENoYXJzID1cclxuICAgICAgL0EtWmEtelxcdTAwQUFcXHUwMEI1XFx1MDBCQVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZGMS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE4M1xcdTIxODRcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1XFx1MzAwNlxcdTMwMzEtXFx1MzAzNVxcdTMwM0JcXHUzMDNDXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RTVcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGREMvXHJcbiAgICAgICAgLnNvdXJjZTtcclxuICAgIGNvbnN0IG5vblNwYWNlRGVsaW1pdGVkV29yZHMgPVxyXG4gICAgICAvXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1NEUwMC1cXHU5RkQ1Ly5zb3VyY2U7XHJcbiAgXHJcbiAgICBjb25zdCBub25TcGFjZURlbGltaXRlZFdvcmRzT3RoZXIgPVxyXG4gICAgICAvW1xcdTMwNDEtXFx1MzA5NlxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTRFMDAtXFx1OUZENV17MX0vXHJcbiAgICAgICAgLnNvdXJjZTtcclxuICBcclxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFxyXG4gICAgICBbXHJcbiAgICAgICAgYCg/OlswLTldKyg/Oig/Oix8XFxcXC4pWzAtOV0rKSp8W1xcXFwtJHtzcGFjZURlbGltaXRlZENoYXJzfV0pK2AsXHJcbiAgICAgICAgbm9uU3BhY2VEZWxpbWl0ZWRXb3JkcyxcclxuICAgICAgICBub25TcGFjZURlbGltaXRlZFdvcmRzT3RoZXIsXHJcbiAgICAgIF0uam9pbihcInxcIiksXHJcbiAgICAgIFwiZ1wiXHJcbiAgICApO1xyXG4gICAgcmV0dXJuICh0ZXh0Lm1hdGNoKHBhdHRlcm4pIHx8IFtdKS5sZW5ndGg7XHJcbiAgfVxyXG4gIFxyXG4gIHN0YXRpYyBnZXRDaGFyYWN0ZXJDb3VudCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRleHQubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgXHJcbn1cclxuXHJcbiJdLCJuYW1lcyI6WyJQbHVnaW4iLCJTdGF0ZUZpZWxkIiwiRGVjb3JhdGlvbiIsIkVkaXRvclZpZXciXSwibWFwcGluZ3MiOiI7Ozs7OztNQUFhLFNBQVM7SUFHcEIsWUFBWSxXQUF3QjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztLQUNoQztJQUVELFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2hDOzs7TUNPa0IsZUFBZ0IsU0FBUUEsZUFBTTs7Ozs7Ozs7Ozs7SUFjakQsTUFBTTtRQUNKLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNEUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFzQkQsaUJBQWlCO1FBRWYsTUFBTSxZQUFZLEdBQUdDLGdCQUFVLENBQUMsTUFBTSxDQUFnQjtZQUNwRCxNQUFNLENBQUMsS0FBa0I7Z0JBQ3ZCLE9BQVFDLGVBQVUsQ0FBQyxJQUFJLENBQUM7YUFDekI7WUFDRCxNQUFNLENBQUMsT0FBc0IsRUFBRSxFQUFlO2dCQUM1QyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtvQkFDbkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7d0JBQ3JCLElBQUksR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztxQkFDckM7aUJBQ0Y7cUJBQU07b0JBQ0wsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25FLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO3dCQUNyQixJQUFJLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7cUJBQ3JDO2lCQUNGO2dCQUVELGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXRDLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBRUQsT0FBTyxFQUFFLENBQUMsQ0FBTSxLQUFLQyxlQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQzVDO0lBRUQsT0FBTyxlQUFlLENBQUMsSUFBWTtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVSxLQUFLLGFBQWEsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsT0FBTyxZQUFZLENBQUMsSUFBWTtRQUM5QixNQUFNLG1CQUFtQixHQUN2QixnbUlBQWdtSTthQUM3bEksTUFBTSxDQUFDO1FBQ1osTUFBTSxzQkFBc0IsR0FDMUIsbUVBQW1FLENBQUMsTUFBTSxDQUFDO1FBRTdFLE1BQU0sMkJBQTJCLEdBQy9CLHdFQUF3RTthQUNyRSxNQUFNLENBQUM7UUFFWixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FDeEI7WUFDRSxxQ0FBcUMsbUJBQW1CLEtBQUs7WUFDN0Qsc0JBQXNCO1lBQ3RCLDJCQUEyQjtTQUM1QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDWCxHQUFHLENBQ0osQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUM7S0FDM0M7SUFFRCxPQUFPLGlCQUFpQixDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ3BCOzs7OzsifQ== diff --git a/notes/.obsidian/plugins/better-word-count/manifest.json b/notes/.obsidian/plugins/better-word-count/manifest.json new file mode 100644 index 0000000..3ecc00a --- /dev/null +++ b/notes/.obsidian/plugins/better-word-count/manifest.json @@ -0,0 +1,9 @@ +{ + "id": "better-word-count", + "name": "Better Word Count", + "version": "0.8.1", + "description": "Counts the words of selected text in the editor.", + "author": "Luke Leppan", + "authorUrl": "https://lukeleppan.com", + "isDesktopOnly": false +} diff --git a/notes/.obsidian/plugins/breadcrumbs/main.js b/notes/.obsidian/plugins/breadcrumbs/main.js new file mode 100644 index 0000000..2d0cae6 --- /dev/null +++ b/notes/.obsidian/plugins/breadcrumbs/main.js @@ -0,0 +1,31596 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// node_modules/feather-icons/dist/feather.js +var require_feather = __commonJS({ + "node_modules/feather-icons/dist/feather.js"(exports, module2) { + (function webpackUniversalModuleDefinition(root2, factory) { + if (typeof exports === "object" && typeof module2 === "object") + module2.exports = factory(); + else if (typeof define === "function" && define.amd) + define([], factory); + else if (typeof exports === "object") + exports["feather"] = factory(); + else + root2["feather"] = factory(); + })(typeof self !== "undefined" ? self : exports, function() { + return function(modules) { + var installedModules = {}; + function __webpack_require__(moduleId) { + if (installedModules[moduleId]) { + return installedModules[moduleId].exports; + } + var module3 = installedModules[moduleId] = { + i: moduleId, + l: false, + exports: {} + }; + modules[moduleId].call(module3.exports, module3, module3.exports, __webpack_require__); + module3.l = true; + return module3.exports; + } + __webpack_require__.m = modules; + __webpack_require__.c = installedModules; + __webpack_require__.d = function(exports2, name, getter) { + if (!__webpack_require__.o(exports2, name)) { + Object.defineProperty(exports2, name, { + configurable: false, + enumerable: true, + get: getter + }); + } + }; + __webpack_require__.r = function(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + }; + __webpack_require__.n = function(module3) { + var getter = module3 && module3.__esModule ? function getDefault() { + return module3["default"]; + } : function getModuleExports() { + return module3; + }; + __webpack_require__.d(getter, "a", getter); + return getter; + }; + __webpack_require__.o = function(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }; + __webpack_require__.p = ""; + return __webpack_require__(__webpack_require__.s = 0); + }({ + "./dist/icons.json": function(module3) { + module3.exports = { "activity": '', "airplay": '', "alert-circle": '', "alert-octagon": '', "alert-triangle": '', "align-center": '', "align-justify": '', "align-left": '', "align-right": '', "anchor": '', "aperture": '', "archive": '', "arrow-down-circle": '', "arrow-down-left": '', "arrow-down-right": '', "arrow-down": '', "arrow-left-circle": '', "arrow-left": '', "arrow-right-circle": '', "arrow-right": '', "arrow-up-circle": '', "arrow-up-left": '', "arrow-up-right": '', "arrow-up": '', "at-sign": '', "award": '', "bar-chart-2": '', "bar-chart": '', "battery-charging": '', "battery": '', "bell-off": '', "bell": '', "bluetooth": '', "bold": '', "book-open": '', "book": '', "bookmark": '', "box": '', "briefcase": '', "calendar": '', "camera-off": '', "camera": '', "cast": '', "check-circle": '', "check-square": '', "check": '', "chevron-down": '', "chevron-left": '', "chevron-right": '', "chevron-up": '', "chevrons-down": '', "chevrons-left": '', "chevrons-right": '', "chevrons-up": '', "chrome": '', "circle": '', "clipboard": '', "clock": '', "cloud-drizzle": '', "cloud-lightning": '', "cloud-off": '', "cloud-rain": '', "cloud-snow": '', "cloud": '', "code": '', "codepen": '', "codesandbox": '', "coffee": '', "columns": '', "command": '', "compass": '', "copy": '', "corner-down-left": '', "corner-down-right": '', "corner-left-down": '', "corner-left-up": '', "corner-right-down": '', "corner-right-up": '', "corner-up-left": '', "corner-up-right": '', "cpu": '', "credit-card": '', "crop": '', "crosshair": '', "database": '', "delete": '', "disc": '', "divide-circle": '', "divide-square": '', "divide": '', "dollar-sign": '', "download-cloud": '', "download": '', "dribbble": '', "droplet": '', "edit-2": '', "edit-3": '', "edit": '', "external-link": '', "eye-off": '', "eye": '', "facebook": '', "fast-forward": '', "feather": '', "figma": '', "file-minus": '', "file-plus": '', "file-text": '', "file": '', "film": '', "filter": '', "flag": '', "folder-minus": '', "folder-plus": '', "folder": '', "framer": '', "frown": '', "gift": '', "git-branch": '', "git-commit": '', "git-merge": '', "git-pull-request": '', "github": '', "gitlab": '', "globe": '', "grid": '', "hard-drive": '', "hash": '', "headphones": '', "heart": '', "help-circle": '', "hexagon": '', "home": '', "image": '', "inbox": '', "info": '', "instagram": '', "italic": '', "key": '', "layers": '', "layout": '', "life-buoy": '', "link-2": '', "link": '', "linkedin": '', "list": '', "loader": '', "lock": '', "log-in": '', "log-out": '', "mail": '', "map-pin": '', "map": '', "maximize-2": '', "maximize": '', "meh": '', "menu": '', "message-circle": '', "message-square": '', "mic-off": '', "mic": '', "minimize-2": '', "minimize": '', "minus-circle": '', "minus-square": '', "minus": '', "monitor": '', "moon": '', "more-horizontal": '', "more-vertical": '', "mouse-pointer": '', "move": '', "music": '', "navigation-2": '', "navigation": '', "octagon": '', "package": '', "paperclip": '', "pause-circle": '', "pause": '', "pen-tool": '', "percent": '', "phone-call": '', "phone-forwarded": '', "phone-incoming": '', "phone-missed": '', "phone-off": '', "phone-outgoing": '', "phone": '', "pie-chart": '', "play-circle": '', "play": '', "plus-circle": '', "plus-square": '', "plus": '', "pocket": '', "power": '', "printer": '', "radio": '', "refresh-ccw": '', "refresh-cw": '', "repeat": '', "rewind": '', "rotate-ccw": '', "rotate-cw": '', "rss": '', "save": '', "scissors": '', "search": '', "send": '', "server": '', "settings": '', "share-2": '', "share": '', "shield-off": '', "shield": '', "shopping-bag": '', "shopping-cart": '', "shuffle": '', "sidebar": '', "skip-back": '', "skip-forward": '', "slack": '', "slash": '', "sliders": '', "smartphone": '', "smile": '', "speaker": '', "square": '', "star": '', "stop-circle": '', "sun": '', "sunrise": '', "sunset": '', "tablet": '', "tag": '', "target": '', "terminal": '', "thermometer": '', "thumbs-down": '', "thumbs-up": '', "toggle-left": '', "toggle-right": '', "tool": '', "trash-2": '', "trash": '', "trello": '', "trending-down": '', "trending-up": '', "triangle": '', "truck": '', "tv": '', "twitch": '', "twitter": '', "type": '', "umbrella": '', "underline": '', "unlock": '', "upload-cloud": '', "upload": '', "user-check": '', "user-minus": '', "user-plus": '', "user-x": '', "user": '', "users": '', "video-off": '', "video": '', "voicemail": '', "volume-1": '', "volume-2": '', "volume-x": '', "volume": '', "watch": '', "wifi-off": '', "wifi": '', "wind": '', "x-circle": '', "x-octagon": '', "x-square": '', "x": '', "youtube": '', "zap-off": '', "zap": '', "zoom-in": '', "zoom-out": '' }; + }, + "./node_modules/classnames/dedupe.js": function(module3, exports2, __webpack_require__) { + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + (function() { + "use strict"; + var classNames = function() { + function StorageObject() { + } + StorageObject.prototype = /* @__PURE__ */ Object.create(null); + function _parseArray(resultSet, array) { + var length = array.length; + for (var i = 0; i < length; ++i) { + _parse(resultSet, array[i]); + } + } + var hasOwn = {}.hasOwnProperty; + function _parseNumber(resultSet, num) { + resultSet[num] = true; + } + function _parseObject(resultSet, object) { + for (var k in object) { + if (hasOwn.call(object, k)) { + resultSet[k] = !!object[k]; + } + } + } + var SPACE = /\s+/; + function _parseString(resultSet, str) { + var array = str.split(SPACE); + var length = array.length; + for (var i = 0; i < length; ++i) { + resultSet[array[i]] = true; + } + } + function _parse(resultSet, arg) { + if (!arg) + return; + var argType = typeof arg; + if (argType === "string") { + _parseString(resultSet, arg); + } else if (Array.isArray(arg)) { + _parseArray(resultSet, arg); + } else if (argType === "object") { + _parseObject(resultSet, arg); + } else if (argType === "number") { + _parseNumber(resultSet, arg); + } + } + function _classNames() { + var len = arguments.length; + var args = Array(len); + for (var i = 0; i < len; i++) { + args[i] = arguments[i]; + } + var classSet = new StorageObject(); + _parseArray(classSet, args); + var list = []; + for (var k in classSet) { + if (classSet[k]) { + list.push(k); + } + } + return list.join(" "); + } + return _classNames; + }(); + if (typeof module3 !== "undefined" && module3.exports) { + module3.exports = classNames; + } else if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { + return classNames; + }.apply(exports2, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module3.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { + } + })(); + }, + "./node_modules/core-js/es/array/from.js": function(module3, exports2, __webpack_require__) { + __webpack_require__("./node_modules/core-js/modules/es.string.iterator.js"); + __webpack_require__("./node_modules/core-js/modules/es.array.from.js"); + var path2 = __webpack_require__("./node_modules/core-js/internals/path.js"); + module3.exports = path2.Array.from; + }, + "./node_modules/core-js/internals/a-function.js": function(module3, exports2) { + module3.exports = function(it) { + if (typeof it != "function") { + throw TypeError(String(it) + " is not a function"); + } + return it; + }; + }, + "./node_modules/core-js/internals/an-object.js": function(module3, exports2, __webpack_require__) { + var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js"); + module3.exports = function(it) { + if (!isObject(it)) { + throw TypeError(String(it) + " is not an object"); + } + return it; + }; + }, + "./node_modules/core-js/internals/array-from.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var bind = __webpack_require__("./node_modules/core-js/internals/bind-context.js"); + var toObject = __webpack_require__("./node_modules/core-js/internals/to-object.js"); + var callWithSafeIterationClosing = __webpack_require__("./node_modules/core-js/internals/call-with-safe-iteration-closing.js"); + var isArrayIteratorMethod = __webpack_require__("./node_modules/core-js/internals/is-array-iterator-method.js"); + var toLength = __webpack_require__("./node_modules/core-js/internals/to-length.js"); + var createProperty = __webpack_require__("./node_modules/core-js/internals/create-property.js"); + var getIteratorMethod = __webpack_require__("./node_modules/core-js/internals/get-iterator-method.js"); + module3.exports = function from(arrayLike) { + var O = toObject(arrayLike); + var C2 = typeof this == "function" ? this : Array; + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : void 0; + var mapping = mapfn !== void 0; + var index2 = 0; + var iteratorMethod = getIteratorMethod(O); + var length, result, step, iterator; + if (mapping) + mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : void 0, 2); + if (iteratorMethod != void 0 && !(C2 == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = iteratorMethod.call(O); + result = new C2(); + for (; !(step = iterator.next()).done; index2++) { + createProperty(result, index2, mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index2], true) : step.value); + } + } else { + length = toLength(O.length); + result = new C2(length); + for (; length > index2; index2++) { + createProperty(result, index2, mapping ? mapfn(O[index2], index2) : O[index2]); + } + } + result.length = index2; + return result; + }; + }, + "./node_modules/core-js/internals/array-includes.js": function(module3, exports2, __webpack_require__) { + var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js"); + var toLength = __webpack_require__("./node_modules/core-js/internals/to-length.js"); + var toAbsoluteIndex = __webpack_require__("./node_modules/core-js/internals/to-absolute-index.js"); + module3.exports = function(IS_INCLUDES) { + return function($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = toLength(O.length); + var index2 = toAbsoluteIndex(fromIndex, length); + var value; + if (IS_INCLUDES && el != el) + while (length > index2) { + value = O[index2++]; + if (value != value) + return true; + } + else + for (; length > index2; index2++) + if (IS_INCLUDES || index2 in O) { + if (O[index2] === el) + return IS_INCLUDES || index2 || 0; + } + return !IS_INCLUDES && -1; + }; + }; + }, + "./node_modules/core-js/internals/bind-context.js": function(module3, exports2, __webpack_require__) { + var aFunction = __webpack_require__("./node_modules/core-js/internals/a-function.js"); + module3.exports = function(fn, that, length) { + aFunction(fn); + if (that === void 0) + return fn; + switch (length) { + case 0: + return function() { + return fn.call(that); + }; + case 1: + return function(a2) { + return fn.call(that, a2); + }; + case 2: + return function(a2, b) { + return fn.call(that, a2, b); + }; + case 3: + return function(a2, b, c3) { + return fn.call(that, a2, b, c3); + }; + } + return function() { + return fn.apply(that, arguments); + }; + }; + }, + "./node_modules/core-js/internals/call-with-safe-iteration-closing.js": function(module3, exports2, __webpack_require__) { + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + module3.exports = function(iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error6) { + var returnMethod = iterator["return"]; + if (returnMethod !== void 0) + anObject(returnMethod.call(iterator)); + throw error6; + } + }; + }, + "./node_modules/core-js/internals/check-correctness-of-iteration.js": function(module3, exports2, __webpack_require__) { + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var ITERATOR = wellKnownSymbol("iterator"); + var SAFE_CLOSING = false; + try { + var called = 0; + var iteratorWithReturn = { + next: function() { + return { done: !!called++ }; + }, + "return": function() { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function() { + return this; + }; + Array.from(iteratorWithReturn, function() { + throw 2; + }); + } catch (error6) { + } + module3.exports = function(exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) + return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function() { + return { + next: function() { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error6) { + } + return ITERATION_SUPPORT; + }; + }, + "./node_modules/core-js/internals/classof-raw.js": function(module3, exports2) { + var toString = {}.toString; + module3.exports = function(it) { + return toString.call(it).slice(8, -1); + }; + }, + "./node_modules/core-js/internals/classof.js": function(module3, exports2, __webpack_require__) { + var classofRaw = __webpack_require__("./node_modules/core-js/internals/classof-raw.js"); + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var TO_STRING_TAG = wellKnownSymbol("toStringTag"); + var CORRECT_ARGUMENTS = classofRaw(function() { + return arguments; + }()) == "Arguments"; + var tryGet = function(it, key) { + try { + return it[key]; + } catch (error6) { + } + }; + module3.exports = function(it) { + var O, tag, result; + return it === void 0 ? "Undefined" : it === null ? "Null" : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == "string" ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : (result = classofRaw(O)) == "Object" && typeof O.callee == "function" ? "Arguments" : result; + }; + }, + "./node_modules/core-js/internals/copy-constructor-properties.js": function(module3, exports2, __webpack_require__) { + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var ownKeys = __webpack_require__("./node_modules/core-js/internals/own-keys.js"); + var getOwnPropertyDescriptorModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-descriptor.js"); + var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js"); + module3.exports = function(target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!has(target, key)) + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + }; + }, + "./node_modules/core-js/internals/correct-prototype-getter.js": function(module3, exports2, __webpack_require__) { + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + module3.exports = !fails(function() { + function F() { + } + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; + }); + }, + "./node_modules/core-js/internals/create-iterator-constructor.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var IteratorPrototype = __webpack_require__("./node_modules/core-js/internals/iterators-core.js").IteratorPrototype; + var create2 = __webpack_require__("./node_modules/core-js/internals/object-create.js"); + var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js"); + var setToStringTag = __webpack_require__("./node_modules/core-js/internals/set-to-string-tag.js"); + var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js"); + var returnThis = function() { + return this; + }; + module3.exports = function(IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + " Iterator"; + IteratorConstructor.prototype = create2(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; + }; + }, + "./node_modules/core-js/internals/create-property-descriptor.js": function(module3, exports2) { + module3.exports = function(bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value + }; + }; + }, + "./node_modules/core-js/internals/create-property.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js"); + var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js"); + var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js"); + module3.exports = function(object, key, value) { + var propertyKey = toPrimitive(key); + if (propertyKey in object) + definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else + object[propertyKey] = value; + }; + }, + "./node_modules/core-js/internals/define-iterator.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var $ = __webpack_require__("./node_modules/core-js/internals/export.js"); + var createIteratorConstructor = __webpack_require__("./node_modules/core-js/internals/create-iterator-constructor.js"); + var getPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-get-prototype-of.js"); + var setPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-set-prototype-of.js"); + var setToStringTag = __webpack_require__("./node_modules/core-js/internals/set-to-string-tag.js"); + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + var redefine = __webpack_require__("./node_modules/core-js/internals/redefine.js"); + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js"); + var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js"); + var IteratorsCore = __webpack_require__("./node_modules/core-js/internals/iterators-core.js"); + var IteratorPrototype = IteratorsCore.IteratorPrototype; + var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; + var ITERATOR = wellKnownSymbol("iterator"); + var KEYS = "keys"; + var VALUES = "values"; + var ENTRIES = "entries"; + var returnThis = function() { + return this; + }; + module3.exports = function(Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + var getIterationMethod = function(KIND) { + if (KIND === DEFAULT && defaultIterator) + return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) + return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: + return function keys() { + return new IteratorConstructor(this, KIND); + }; + case VALUES: + return function values() { + return new IteratorConstructor(this, KIND); + }; + case ENTRIES: + return function entries() { + return new IteratorConstructor(this, KIND); + }; + } + return function() { + return new IteratorConstructor(this); + }; + }; + var TO_STRING_TAG = NAME + " Iterator"; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype["@@iterator"] || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == "Array" ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (typeof CurrentIteratorPrototype[ITERATOR] != "function") { + hide(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) + Iterators[TO_STRING_TAG] = returnThis; + } + } + if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { + return nativeIterator.call(this); + }; + } + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + hide(IterablePrototype, ITERATOR, defaultIterator); + } + Iterators[NAME] = defaultIterator; + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) + for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } + else + $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + return methods; + }; + }, + "./node_modules/core-js/internals/descriptors.js": function(module3, exports2, __webpack_require__) { + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + module3.exports = !fails(function() { + return Object.defineProperty({}, "a", { get: function() { + return 7; + } }).a != 7; + }); + }, + "./node_modules/core-js/internals/document-create-element.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js"); + var document2 = global2.document; + var exist = isObject(document2) && isObject(document2.createElement); + module3.exports = function(it) { + return exist ? document2.createElement(it) : {}; + }; + }, + "./node_modules/core-js/internals/enum-bug-keys.js": function(module3, exports2) { + module3.exports = [ + "constructor", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "toLocaleString", + "toString", + "valueOf" + ]; + }, + "./node_modules/core-js/internals/export.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var getOwnPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-descriptor.js").f; + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + var redefine = __webpack_require__("./node_modules/core-js/internals/redefine.js"); + var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js"); + var copyConstructorProperties = __webpack_require__("./node_modules/core-js/internals/copy-constructor-properties.js"); + var isForced = __webpack_require__("./node_modules/core-js/internals/is-forced.js"); + module3.exports = function(options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global2; + } else if (STATIC) { + target = global2[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global2[TARGET] || {}).prototype; + } + if (target) + for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else + targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced); + if (!FORCED && targetProperty !== void 0) { + if (typeof sourceProperty === typeof targetProperty) + continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + if (options.sham || targetProperty && targetProperty.sham) { + hide(sourceProperty, "sham", true); + } + redefine(target, key, sourceProperty, options); + } + }; + }, + "./node_modules/core-js/internals/fails.js": function(module3, exports2) { + module3.exports = function(exec) { + try { + return !!exec(); + } catch (error6) { + return true; + } + }; + }, + "./node_modules/core-js/internals/function-to-string.js": function(module3, exports2, __webpack_require__) { + var shared = __webpack_require__("./node_modules/core-js/internals/shared.js"); + module3.exports = shared("native-function-to-string", Function.toString); + }, + "./node_modules/core-js/internals/get-iterator-method.js": function(module3, exports2, __webpack_require__) { + var classof = __webpack_require__("./node_modules/core-js/internals/classof.js"); + var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js"); + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var ITERATOR = wellKnownSymbol("iterator"); + module3.exports = function(it) { + if (it != void 0) + return it[ITERATOR] || it["@@iterator"] || Iterators[classof(it)]; + }; + }, + "./node_modules/core-js/internals/global.js": function(module3, exports2, __webpack_require__) { + (function(global2) { + var O = "object"; + var check = function(it) { + return it && it.Math == Math && it; + }; + module3.exports = check(typeof globalThis == O && globalThis) || check(typeof window == O && window) || check(typeof self == O && self) || check(typeof global2 == O && global2) || Function("return this")(); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/global.js")); + }, + "./node_modules/core-js/internals/has.js": function(module3, exports2) { + var hasOwnProperty = {}.hasOwnProperty; + module3.exports = function(it, key) { + return hasOwnProperty.call(it, key); + }; + }, + "./node_modules/core-js/internals/hidden-keys.js": function(module3, exports2) { + module3.exports = {}; + }, + "./node_modules/core-js/internals/hide.js": function(module3, exports2, __webpack_require__) { + var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js"); + var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js"); + var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js"); + module3.exports = DESCRIPTORS ? function(object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); + } : function(object, key, value) { + object[key] = value; + return object; + }; + }, + "./node_modules/core-js/internals/html.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var document2 = global2.document; + module3.exports = document2 && document2.documentElement; + }, + "./node_modules/core-js/internals/ie8-dom-define.js": function(module3, exports2, __webpack_require__) { + var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js"); + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + var createElement = __webpack_require__("./node_modules/core-js/internals/document-create-element.js"); + module3.exports = !DESCRIPTORS && !fails(function() { + return Object.defineProperty(createElement("div"), "a", { + get: function() { + return 7; + } + }).a != 7; + }); + }, + "./node_modules/core-js/internals/indexed-object.js": function(module3, exports2, __webpack_require__) { + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + var classof = __webpack_require__("./node_modules/core-js/internals/classof-raw.js"); + var split = "".split; + module3.exports = fails(function() { + return !Object("z").propertyIsEnumerable(0); + }) ? function(it) { + return classof(it) == "String" ? split.call(it, "") : Object(it); + } : Object; + }, + "./node_modules/core-js/internals/internal-state.js": function(module3, exports2, __webpack_require__) { + var NATIVE_WEAK_MAP = __webpack_require__("./node_modules/core-js/internals/native-weak-map.js"); + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js"); + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + var objectHas = __webpack_require__("./node_modules/core-js/internals/has.js"); + var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js"); + var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js"); + var WeakMap = global2.WeakMap; + var set3, get3, has; + var enforce = function(it) { + return has(it) ? get3(it) : set3(it, {}); + }; + var getterFor = function(TYPE) { + return function(it) { + var state; + if (!isObject(it) || (state = get3(it)).type !== TYPE) { + throw TypeError("Incompatible receiver, " + TYPE + " required"); + } + return state; + }; + }; + if (NATIVE_WEAK_MAP) { + var store = new WeakMap(); + var wmget = store.get; + var wmhas = store.has; + var wmset = store.set; + set3 = function(it, metadata) { + wmset.call(store, it, metadata); + return metadata; + }; + get3 = function(it) { + return wmget.call(store, it) || {}; + }; + has = function(it) { + return wmhas.call(store, it); + }; + } else { + var STATE = sharedKey("state"); + hiddenKeys[STATE] = true; + set3 = function(it, metadata) { + hide(it, STATE, metadata); + return metadata; + }; + get3 = function(it) { + return objectHas(it, STATE) ? it[STATE] : {}; + }; + has = function(it) { + return objectHas(it, STATE); + }; + } + module3.exports = { + set: set3, + get: get3, + has, + enforce, + getterFor + }; + }, + "./node_modules/core-js/internals/is-array-iterator-method.js": function(module3, exports2, __webpack_require__) { + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js"); + var ITERATOR = wellKnownSymbol("iterator"); + var ArrayPrototype = Array.prototype; + module3.exports = function(it) { + return it !== void 0 && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); + }; + }, + "./node_modules/core-js/internals/is-forced.js": function(module3, exports2, __webpack_require__) { + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + var replacement = /#|\.prototype\./; + var isForced = function(feature, detection) { + var value = data[normalize2(feature)]; + return value == POLYFILL ? true : value == NATIVE ? false : typeof detection == "function" ? fails(detection) : !!detection; + }; + var normalize2 = isForced.normalize = function(string) { + return String(string).replace(replacement, ".").toLowerCase(); + }; + var data = isForced.data = {}; + var NATIVE = isForced.NATIVE = "N"; + var POLYFILL = isForced.POLYFILL = "P"; + module3.exports = isForced; + }, + "./node_modules/core-js/internals/is-object.js": function(module3, exports2) { + module3.exports = function(it) { + return typeof it === "object" ? it !== null : typeof it === "function"; + }; + }, + "./node_modules/core-js/internals/is-pure.js": function(module3, exports2) { + module3.exports = false; + }, + "./node_modules/core-js/internals/iterators-core.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var getPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-get-prototype-of.js"); + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js"); + var ITERATOR = wellKnownSymbol("iterator"); + var BUGGY_SAFARI_ITERATORS = false; + var returnThis = function() { + return this; + }; + var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + if ([].keys) { + arrayIterator = [].keys(); + if (!("next" in arrayIterator)) + BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) + IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } + } + if (IteratorPrototype == void 0) + IteratorPrototype = {}; + if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) + hide(IteratorPrototype, ITERATOR, returnThis); + module3.exports = { + IteratorPrototype, + BUGGY_SAFARI_ITERATORS + }; + }, + "./node_modules/core-js/internals/iterators.js": function(module3, exports2) { + module3.exports = {}; + }, + "./node_modules/core-js/internals/native-symbol.js": function(module3, exports2, __webpack_require__) { + var fails = __webpack_require__("./node_modules/core-js/internals/fails.js"); + module3.exports = !!Object.getOwnPropertySymbols && !fails(function() { + return !String(Symbol()); + }); + }, + "./node_modules/core-js/internals/native-weak-map.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var nativeFunctionToString = __webpack_require__("./node_modules/core-js/internals/function-to-string.js"); + var WeakMap = global2.WeakMap; + module3.exports = typeof WeakMap === "function" && /native code/.test(nativeFunctionToString.call(WeakMap)); + }, + "./node_modules/core-js/internals/object-create.js": function(module3, exports2, __webpack_require__) { + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + var defineProperties = __webpack_require__("./node_modules/core-js/internals/object-define-properties.js"); + var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js"); + var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js"); + var html = __webpack_require__("./node_modules/core-js/internals/html.js"); + var documentCreateElement = __webpack_require__("./node_modules/core-js/internals/document-create-element.js"); + var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js"); + var IE_PROTO = sharedKey("IE_PROTO"); + var PROTOTYPE = "prototype"; + var Empty = function() { + }; + var createDict = function() { + var iframe = documentCreateElement("iframe"); + var length = enumBugKeys.length; + var lt = "<"; + var script = "script"; + var gt = ">"; + var js = "java" + script + ":"; + var iframeDocument; + iframe.style.display = "none"; + html.appendChild(iframe); + iframe.src = String(js); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + script + gt + "document.F=Object" + lt + "/" + script + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (length--) + delete createDict[PROTOTYPE][enumBugKeys[length]]; + return createDict(); + }; + module3.exports = Object.create || function create2(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + result[IE_PROTO] = O; + } else + result = createDict(); + return Properties === void 0 ? result : defineProperties(result, Properties); + }; + hiddenKeys[IE_PROTO] = true; + }, + "./node_modules/core-js/internals/object-define-properties.js": function(module3, exports2, __webpack_require__) { + var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js"); + var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js"); + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + var objectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys.js"); + module3.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = objectKeys(Properties); + var length = keys.length; + var i = 0; + var key; + while (length > i) + definePropertyModule.f(O, key = keys[i++], Properties[key]); + return O; + }; + }, + "./node_modules/core-js/internals/object-define-property.js": function(module3, exports2, __webpack_require__) { + var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js"); + var IE8_DOM_DEFINE = __webpack_require__("./node_modules/core-js/internals/ie8-dom-define.js"); + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js"); + var nativeDefineProperty = Object.defineProperty; + exports2.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) + try { + return nativeDefineProperty(O, P, Attributes); + } catch (error6) { + } + if ("get" in Attributes || "set" in Attributes) + throw TypeError("Accessors not supported"); + if ("value" in Attributes) + O[P] = Attributes.value; + return O; + }; + }, + "./node_modules/core-js/internals/object-get-own-property-descriptor.js": function(module3, exports2, __webpack_require__) { + var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js"); + var propertyIsEnumerableModule = __webpack_require__("./node_modules/core-js/internals/object-property-is-enumerable.js"); + var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js"); + var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js"); + var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js"); + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var IE8_DOM_DEFINE = __webpack_require__("./node_modules/core-js/internals/ie8-dom-define.js"); + var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + exports2.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) + try { + return nativeGetOwnPropertyDescriptor(O, P); + } catch (error6) { + } + if (has(O, P)) + return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); + }; + }, + "./node_modules/core-js/internals/object-get-own-property-names.js": function(module3, exports2, __webpack_require__) { + var internalObjectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys-internal.js"); + var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js"); + var hiddenKeys = enumBugKeys.concat("length", "prototype"); + exports2.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); + }; + }, + "./node_modules/core-js/internals/object-get-own-property-symbols.js": function(module3, exports2) { + exports2.f = Object.getOwnPropertySymbols; + }, + "./node_modules/core-js/internals/object-get-prototype-of.js": function(module3, exports2, __webpack_require__) { + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var toObject = __webpack_require__("./node_modules/core-js/internals/to-object.js"); + var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js"); + var CORRECT_PROTOTYPE_GETTER = __webpack_require__("./node_modules/core-js/internals/correct-prototype-getter.js"); + var IE_PROTO = sharedKey("IE_PROTO"); + var ObjectPrototype = Object.prototype; + module3.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function(O) { + O = toObject(O); + if (has(O, IE_PROTO)) + return O[IE_PROTO]; + if (typeof O.constructor == "function" && O instanceof O.constructor) { + return O.constructor.prototype; + } + return O instanceof Object ? ObjectPrototype : null; + }; + }, + "./node_modules/core-js/internals/object-keys-internal.js": function(module3, exports2, __webpack_require__) { + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js"); + var arrayIncludes = __webpack_require__("./node_modules/core-js/internals/array-includes.js"); + var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js"); + var arrayIndexOf = arrayIncludes(false); + module3.exports = function(object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) + !has(hiddenKeys, key) && has(O, key) && result.push(key); + while (names.length > i) + if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + }, + "./node_modules/core-js/internals/object-keys.js": function(module3, exports2, __webpack_require__) { + var internalObjectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys-internal.js"); + var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js"); + module3.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); + }; + }, + "./node_modules/core-js/internals/object-property-is-enumerable.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var nativePropertyIsEnumerable = {}.propertyIsEnumerable; + var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); + exports2.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; + } : nativePropertyIsEnumerable; + }, + "./node_modules/core-js/internals/object-set-prototype-of.js": function(module3, exports2, __webpack_require__) { + var validateSetPrototypeOfArguments = __webpack_require__("./node_modules/core-js/internals/validate-set-prototype-of-arguments.js"); + module3.exports = Object.setPrototypeOf || ("__proto__" in {} ? function() { + var correctSetter = false; + var test = {}; + var setter; + try { + setter = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set; + setter.call(test, []); + correctSetter = test instanceof Array; + } catch (error6) { + } + return function setPrototypeOf(O, proto) { + validateSetPrototypeOfArguments(O, proto); + if (correctSetter) + setter.call(O, proto); + else + O.__proto__ = proto; + return O; + }; + }() : void 0); + }, + "./node_modules/core-js/internals/own-keys.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var getOwnPropertyNamesModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-names.js"); + var getOwnPropertySymbolsModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-symbols.js"); + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + var Reflect2 = global2.Reflect; + module3.exports = Reflect2 && Reflect2.ownKeys || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; + }; + }, + "./node_modules/core-js/internals/path.js": function(module3, exports2, __webpack_require__) { + module3.exports = __webpack_require__("./node_modules/core-js/internals/global.js"); + }, + "./node_modules/core-js/internals/redefine.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var shared = __webpack_require__("./node_modules/core-js/internals/shared.js"); + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js"); + var nativeFunctionToString = __webpack_require__("./node_modules/core-js/internals/function-to-string.js"); + var InternalStateModule = __webpack_require__("./node_modules/core-js/internals/internal-state.js"); + var getInternalState = InternalStateModule.get; + var enforceInternalState = InternalStateModule.enforce; + var TEMPLATE = String(nativeFunctionToString).split("toString"); + shared("inspectSource", function(it) { + return nativeFunctionToString.call(it); + }); + (module3.exports = function(O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + if (typeof value == "function") { + if (typeof key == "string" && !has(value, "name")) + hide(value, "name", key); + enforceInternalState(value).source = TEMPLATE.join(typeof key == "string" ? key : ""); + } + if (O === global2) { + if (simple) + O[key] = value; + else + setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) + O[key] = value; + else + hide(O, key, value); + })(Function.prototype, "toString", function toString() { + return typeof this == "function" && getInternalState(this).source || nativeFunctionToString.call(this); + }); + }, + "./node_modules/core-js/internals/require-object-coercible.js": function(module3, exports2) { + module3.exports = function(it) { + if (it == void 0) + throw TypeError("Can't call method on " + it); + return it; + }; + }, + "./node_modules/core-js/internals/set-global.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var hide = __webpack_require__("./node_modules/core-js/internals/hide.js"); + module3.exports = function(key, value) { + try { + hide(global2, key, value); + } catch (error6) { + global2[key] = value; + } + return value; + }; + }, + "./node_modules/core-js/internals/set-to-string-tag.js": function(module3, exports2, __webpack_require__) { + var defineProperty = __webpack_require__("./node_modules/core-js/internals/object-define-property.js").f; + var has = __webpack_require__("./node_modules/core-js/internals/has.js"); + var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js"); + var TO_STRING_TAG = wellKnownSymbol("toStringTag"); + module3.exports = function(it, TAG, STATIC) { + if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } + }; + }, + "./node_modules/core-js/internals/shared-key.js": function(module3, exports2, __webpack_require__) { + var shared = __webpack_require__("./node_modules/core-js/internals/shared.js"); + var uid = __webpack_require__("./node_modules/core-js/internals/uid.js"); + var keys = shared("keys"); + module3.exports = function(key) { + return keys[key] || (keys[key] = uid(key)); + }; + }, + "./node_modules/core-js/internals/shared.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js"); + var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js"); + var SHARED = "__core-js_shared__"; + var store = global2[SHARED] || setGlobal(SHARED, {}); + (module3.exports = function(key, value) { + return store[key] || (store[key] = value !== void 0 ? value : {}); + })("versions", []).push({ + version: "3.1.3", + mode: IS_PURE ? "pure" : "global", + copyright: "\xA9 2019 Denis Pushkarev (zloirock.ru)" + }); + }, + "./node_modules/core-js/internals/string-at.js": function(module3, exports2, __webpack_require__) { + var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js"); + var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js"); + module3.exports = function(that, pos, CONVERT_TO_STRING) { + var S = String(requireObjectCoercible(that)); + var position = toInteger(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) + return CONVERT_TO_STRING ? "" : void 0; + first = S.charCodeAt(position); + return first < 55296 || first > 56319 || position + 1 === size || (second = S.charCodeAt(position + 1)) < 56320 || second > 57343 ? CONVERT_TO_STRING ? S.charAt(position) : first : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 55296 << 10) + (second - 56320) + 65536; + }; + }, + "./node_modules/core-js/internals/to-absolute-index.js": function(module3, exports2, __webpack_require__) { + var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js"); + var max4 = Math.max; + var min3 = Math.min; + module3.exports = function(index2, length) { + var integer = toInteger(index2); + return integer < 0 ? max4(integer + length, 0) : min3(integer, length); + }; + }, + "./node_modules/core-js/internals/to-indexed-object.js": function(module3, exports2, __webpack_require__) { + var IndexedObject = __webpack_require__("./node_modules/core-js/internals/indexed-object.js"); + var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js"); + module3.exports = function(it) { + return IndexedObject(requireObjectCoercible(it)); + }; + }, + "./node_modules/core-js/internals/to-integer.js": function(module3, exports2) { + var ceil = Math.ceil; + var floor = Math.floor; + module3.exports = function(argument) { + return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); + }; + }, + "./node_modules/core-js/internals/to-length.js": function(module3, exports2, __webpack_require__) { + var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js"); + var min3 = Math.min; + module3.exports = function(argument) { + return argument > 0 ? min3(toInteger(argument), 9007199254740991) : 0; + }; + }, + "./node_modules/core-js/internals/to-object.js": function(module3, exports2, __webpack_require__) { + var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js"); + module3.exports = function(argument) { + return Object(requireObjectCoercible(argument)); + }; + }, + "./node_modules/core-js/internals/to-primitive.js": function(module3, exports2, __webpack_require__) { + var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js"); + module3.exports = function(it, S) { + if (!isObject(it)) + return it; + var fn, val; + if (S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + if (typeof (fn = it.valueOf) == "function" && !isObject(val = fn.call(it))) + return val; + if (!S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + throw TypeError("Can't convert object to primitive value"); + }; + }, + "./node_modules/core-js/internals/uid.js": function(module3, exports2) { + var id2 = 0; + var postfix = Math.random(); + module3.exports = function(key) { + return "Symbol(".concat(key === void 0 ? "" : key, ")_", (++id2 + postfix).toString(36)); + }; + }, + "./node_modules/core-js/internals/validate-set-prototype-of-arguments.js": function(module3, exports2, __webpack_require__) { + var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js"); + var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js"); + module3.exports = function(O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) { + throw TypeError("Can't set " + String(proto) + " as a prototype"); + } + }; + }, + "./node_modules/core-js/internals/well-known-symbol.js": function(module3, exports2, __webpack_require__) { + var global2 = __webpack_require__("./node_modules/core-js/internals/global.js"); + var shared = __webpack_require__("./node_modules/core-js/internals/shared.js"); + var uid = __webpack_require__("./node_modules/core-js/internals/uid.js"); + var NATIVE_SYMBOL = __webpack_require__("./node_modules/core-js/internals/native-symbol.js"); + var Symbol2 = global2.Symbol; + var store = shared("wks"); + module3.exports = function(name) { + return store[name] || (store[name] = NATIVE_SYMBOL && Symbol2[name] || (NATIVE_SYMBOL ? Symbol2 : uid)("Symbol." + name)); + }; + }, + "./node_modules/core-js/modules/es.array.from.js": function(module3, exports2, __webpack_require__) { + var $ = __webpack_require__("./node_modules/core-js/internals/export.js"); + var from = __webpack_require__("./node_modules/core-js/internals/array-from.js"); + var checkCorrectnessOfIteration = __webpack_require__("./node_modules/core-js/internals/check-correctness-of-iteration.js"); + var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function(iterable) { + Array.from(iterable); + }); + $({ target: "Array", stat: true, forced: INCORRECT_ITERATION }, { + from + }); + }, + "./node_modules/core-js/modules/es.string.iterator.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var codePointAt = __webpack_require__("./node_modules/core-js/internals/string-at.js"); + var InternalStateModule = __webpack_require__("./node_modules/core-js/internals/internal-state.js"); + var defineIterator = __webpack_require__("./node_modules/core-js/internals/define-iterator.js"); + var STRING_ITERATOR = "String Iterator"; + var setInternalState = InternalStateModule.set; + var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + defineIterator(String, "String", function(iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: String(iterated), + index: 0 + }); + }, function next() { + var state = getInternalState(this); + var string = state.string; + var index2 = state.index; + var point3; + if (index2 >= string.length) + return { value: void 0, done: true }; + point3 = codePointAt(string, index2, true); + state.index += point3.length; + return { value: point3, done: false }; + }); + }, + "./node_modules/webpack/buildin/global.js": function(module3, exports2) { + var g; + g = function() { + return this; + }(); + try { + g = g || Function("return this")() || (1, eval)("this"); + } catch (e) { + if (typeof window === "object") + g = window; + } + module3.exports = g; + }, + "./src/default-attrs.json": function(module3) { + module3.exports = { "xmlns": "http://www.w3.org/2000/svg", "width": 24, "height": 24, "viewBox": "0 0 24 24", "fill": "none", "stroke": "currentColor", "stroke-width": 2, "stroke-linecap": "round", "stroke-linejoin": "round" }; + }, + "./src/icon.js": function(module3, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + var _createClass = function() { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function(Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + var _dedupe = __webpack_require__("./node_modules/classnames/dedupe.js"); + var _dedupe2 = _interopRequireDefault(_dedupe); + var _defaultAttrs = __webpack_require__("./src/default-attrs.json"); + var _defaultAttrs2 = _interopRequireDefault(_defaultAttrs); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + function _classCallCheck(instance24, Constructor) { + if (!(instance24 instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + var Icon = function() { + function Icon2(name, contents) { + var tags = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; + _classCallCheck(this, Icon2); + this.name = name; + this.contents = contents; + this.tags = tags; + this.attrs = _extends({}, _defaultAttrs2.default, { class: "feather feather-" + name }); + } + _createClass(Icon2, [{ + key: "toSvg", + value: function toSvg() { + var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + var combinedAttrs = _extends({}, this.attrs, attrs, { class: (0, _dedupe2.default)(this.attrs.class, attrs.class) }); + return "" + this.contents + ""; + } + }, { + key: "toString", + value: function toString() { + return this.contents; + } + }]); + return Icon2; + }(); + function attrsToString(attrs) { + return Object.keys(attrs).map(function(key) { + return key + '="' + attrs[key] + '"'; + }).join(" "); + } + exports2.default = Icon; + }, + "./src/icons.js": function(module3, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _icon = __webpack_require__("./src/icon.js"); + var _icon2 = _interopRequireDefault(_icon); + var _icons = __webpack_require__("./dist/icons.json"); + var _icons2 = _interopRequireDefault(_icons); + var _tags = __webpack_require__("./src/tags.json"); + var _tags2 = _interopRequireDefault(_tags); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + exports2.default = Object.keys(_icons2.default).map(function(key) { + return new _icon2.default(key, _icons2.default[key], _tags2.default[key]); + }).reduce(function(object, icon) { + object[icon.name] = icon; + return object; + }, {}); + }, + "./src/index.js": function(module3, exports2, __webpack_require__) { + "use strict"; + var _icons = __webpack_require__("./src/icons.js"); + var _icons2 = _interopRequireDefault(_icons); + var _toSvg = __webpack_require__("./src/to-svg.js"); + var _toSvg2 = _interopRequireDefault(_toSvg); + var _replace = __webpack_require__("./src/replace.js"); + var _replace2 = _interopRequireDefault(_replace); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + module3.exports = { icons: _icons2.default, toSvg: _toSvg2.default, replace: _replace2.default }; + }, + "./src/replace.js": function(module3, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + var _dedupe = __webpack_require__("./node_modules/classnames/dedupe.js"); + var _dedupe2 = _interopRequireDefault(_dedupe); + var _icons = __webpack_require__("./src/icons.js"); + var _icons2 = _interopRequireDefault(_icons); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + function replace() { + var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + if (typeof document === "undefined") { + throw new Error("`feather.replace()` only works in a browser environment."); + } + var elementsToReplace = document.querySelectorAll("[data-feather]"); + Array.from(elementsToReplace).forEach(function(element2) { + return replaceElement(element2, attrs); + }); + } + function replaceElement(element2) { + var attrs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var elementAttrs = getAttrs(element2); + var name = elementAttrs["data-feather"]; + delete elementAttrs["data-feather"]; + var svgString = _icons2.default[name].toSvg(_extends({}, attrs, elementAttrs, { class: (0, _dedupe2.default)(attrs.class, elementAttrs.class) })); + var svgDocument = new DOMParser().parseFromString(svgString, "image/svg+xml"); + var svgElement = svgDocument.querySelector("svg"); + element2.parentNode.replaceChild(svgElement, element2); + } + function getAttrs(element2) { + return Array.from(element2.attributes).reduce(function(attrs, attr2) { + attrs[attr2.name] = attr2.value; + return attrs; + }, {}); + } + exports2.default = replace; + }, + "./src/tags.json": function(module3) { + module3.exports = { "activity": ["pulse", "health", "action", "motion"], "airplay": ["stream", "cast", "mirroring"], "alert-circle": ["warning", "alert", "danger"], "alert-octagon": ["warning", "alert", "danger"], "alert-triangle": ["warning", "alert", "danger"], "align-center": ["text alignment", "center"], "align-justify": ["text alignment", "justified"], "align-left": ["text alignment", "left"], "align-right": ["text alignment", "right"], "anchor": [], "archive": ["index", "box"], "at-sign": ["mention", "at", "email", "message"], "award": ["achievement", "badge"], "aperture": ["camera", "photo"], "bar-chart": ["statistics", "diagram", "graph"], "bar-chart-2": ["statistics", "diagram", "graph"], "battery": ["power", "electricity"], "battery-charging": ["power", "electricity"], "bell": ["alarm", "notification", "sound"], "bell-off": ["alarm", "notification", "silent"], "bluetooth": ["wireless"], "book-open": ["read", "library"], "book": ["read", "dictionary", "booklet", "magazine", "library"], "bookmark": ["read", "clip", "marker", "tag"], "box": ["cube"], "briefcase": ["work", "bag", "baggage", "folder"], "calendar": ["date"], "camera": ["photo"], "cast": ["chromecast", "airplay"], "circle": ["off", "zero", "record"], "clipboard": ["copy"], "clock": ["time", "watch", "alarm"], "cloud-drizzle": ["weather", "shower"], "cloud-lightning": ["weather", "bolt"], "cloud-rain": ["weather"], "cloud-snow": ["weather", "blizzard"], "cloud": ["weather"], "codepen": ["logo"], "codesandbox": ["logo"], "code": ["source", "programming"], "coffee": ["drink", "cup", "mug", "tea", "cafe", "hot", "beverage"], "columns": ["layout"], "command": ["keyboard", "cmd", "terminal", "prompt"], "compass": ["navigation", "safari", "travel", "direction"], "copy": ["clone", "duplicate"], "corner-down-left": ["arrow", "return"], "corner-down-right": ["arrow"], "corner-left-down": ["arrow"], "corner-left-up": ["arrow"], "corner-right-down": ["arrow"], "corner-right-up": ["arrow"], "corner-up-left": ["arrow"], "corner-up-right": ["arrow"], "cpu": ["processor", "technology"], "credit-card": ["purchase", "payment", "cc"], "crop": ["photo", "image"], "crosshair": ["aim", "target"], "database": ["storage", "memory"], "delete": ["remove"], "disc": ["album", "cd", "dvd", "music"], "dollar-sign": ["currency", "money", "payment"], "droplet": ["water"], "edit": ["pencil", "change"], "edit-2": ["pencil", "change"], "edit-3": ["pencil", "change"], "eye": ["view", "watch"], "eye-off": ["view", "watch", "hide", "hidden"], "external-link": ["outbound"], "facebook": ["logo", "social"], "fast-forward": ["music"], "figma": ["logo", "design", "tool"], "file-minus": ["delete", "remove", "erase"], "file-plus": ["add", "create", "new"], "file-text": ["data", "txt", "pdf"], "film": ["movie", "video"], "filter": ["funnel", "hopper"], "flag": ["report"], "folder-minus": ["directory"], "folder-plus": ["directory"], "folder": ["directory"], "framer": ["logo", "design", "tool"], "frown": ["emoji", "face", "bad", "sad", "emotion"], "gift": ["present", "box", "birthday", "party"], "git-branch": ["code", "version control"], "git-commit": ["code", "version control"], "git-merge": ["code", "version control"], "git-pull-request": ["code", "version control"], "github": ["logo", "version control"], "gitlab": ["logo", "version control"], "globe": ["world", "browser", "language", "translate"], "hard-drive": ["computer", "server", "memory", "data"], "hash": ["hashtag", "number", "pound"], "headphones": ["music", "audio", "sound"], "heart": ["like", "love", "emotion"], "help-circle": ["question mark"], "hexagon": ["shape", "node.js", "logo"], "home": ["house", "living"], "image": ["picture"], "inbox": ["email"], "instagram": ["logo", "camera"], "key": ["password", "login", "authentication", "secure"], "layers": ["stack"], "layout": ["window", "webpage"], "life-bouy": ["help", "life ring", "support"], "link": ["chain", "url"], "link-2": ["chain", "url"], "linkedin": ["logo", "social media"], "list": ["options"], "lock": ["security", "password", "secure"], "log-in": ["sign in", "arrow", "enter"], "log-out": ["sign out", "arrow", "exit"], "mail": ["email", "message"], "map-pin": ["location", "navigation", "travel", "marker"], "map": ["location", "navigation", "travel"], "maximize": ["fullscreen"], "maximize-2": ["fullscreen", "arrows", "expand"], "meh": ["emoji", "face", "neutral", "emotion"], "menu": ["bars", "navigation", "hamburger"], "message-circle": ["comment", "chat"], "message-square": ["comment", "chat"], "mic-off": ["record", "sound", "mute"], "mic": ["record", "sound", "listen"], "minimize": ["exit fullscreen", "close"], "minimize-2": ["exit fullscreen", "arrows", "close"], "minus": ["subtract"], "monitor": ["tv", "screen", "display"], "moon": ["dark", "night"], "more-horizontal": ["ellipsis"], "more-vertical": ["ellipsis"], "mouse-pointer": ["arrow", "cursor"], "move": ["arrows"], "music": ["note"], "navigation": ["location", "travel"], "navigation-2": ["location", "travel"], "octagon": ["stop"], "package": ["box", "container"], "paperclip": ["attachment"], "pause": ["music", "stop"], "pause-circle": ["music", "audio", "stop"], "pen-tool": ["vector", "drawing"], "percent": ["discount"], "phone-call": ["ring"], "phone-forwarded": ["call"], "phone-incoming": ["call"], "phone-missed": ["call"], "phone-off": ["call", "mute"], "phone-outgoing": ["call"], "phone": ["call"], "play": ["music", "start"], "pie-chart": ["statistics", "diagram"], "play-circle": ["music", "start"], "plus": ["add", "new"], "plus-circle": ["add", "new"], "plus-square": ["add", "new"], "pocket": ["logo", "save"], "power": ["on", "off"], "printer": ["fax", "office", "device"], "radio": ["signal"], "refresh-cw": ["synchronise", "arrows"], "refresh-ccw": ["arrows"], "repeat": ["loop", "arrows"], "rewind": ["music"], "rotate-ccw": ["arrow"], "rotate-cw": ["arrow"], "rss": ["feed", "subscribe"], "save": ["floppy disk"], "scissors": ["cut"], "search": ["find", "magnifier", "magnifying glass"], "send": ["message", "mail", "email", "paper airplane", "paper aeroplane"], "settings": ["cog", "edit", "gear", "preferences"], "share-2": ["network", "connections"], "shield": ["security", "secure"], "shield-off": ["security", "insecure"], "shopping-bag": ["ecommerce", "cart", "purchase", "store"], "shopping-cart": ["ecommerce", "cart", "purchase", "store"], "shuffle": ["music"], "skip-back": ["music"], "skip-forward": ["music"], "slack": ["logo"], "slash": ["ban", "no"], "sliders": ["settings", "controls"], "smartphone": ["cellphone", "device"], "smile": ["emoji", "face", "happy", "good", "emotion"], "speaker": ["audio", "music"], "star": ["bookmark", "favorite", "like"], "stop-circle": ["media", "music"], "sun": ["brightness", "weather", "light"], "sunrise": ["weather", "time", "morning", "day"], "sunset": ["weather", "time", "evening", "night"], "tablet": ["device"], "tag": ["label"], "target": ["logo", "bullseye"], "terminal": ["code", "command line", "prompt"], "thermometer": ["temperature", "celsius", "fahrenheit", "weather"], "thumbs-down": ["dislike", "bad", "emotion"], "thumbs-up": ["like", "good", "emotion"], "toggle-left": ["on", "off", "switch"], "toggle-right": ["on", "off", "switch"], "tool": ["settings", "spanner"], "trash": ["garbage", "delete", "remove", "bin"], "trash-2": ["garbage", "delete", "remove", "bin"], "triangle": ["delta"], "truck": ["delivery", "van", "shipping", "transport", "lorry"], "tv": ["television", "stream"], "twitch": ["logo"], "twitter": ["logo", "social"], "type": ["text"], "umbrella": ["rain", "weather"], "unlock": ["security"], "user-check": ["followed", "subscribed"], "user-minus": ["delete", "remove", "unfollow", "unsubscribe"], "user-plus": ["new", "add", "create", "follow", "subscribe"], "user-x": ["delete", "remove", "unfollow", "unsubscribe", "unavailable"], "user": ["person", "account"], "users": ["group"], "video-off": ["camera", "movie", "film"], "video": ["camera", "movie", "film"], "voicemail": ["phone"], "volume": ["music", "sound", "mute"], "volume-1": ["music", "sound"], "volume-2": ["music", "sound"], "volume-x": ["music", "sound", "mute"], "watch": ["clock", "time"], "wifi-off": ["disabled"], "wifi": ["connection", "signal", "wireless"], "wind": ["weather", "air"], "x-circle": ["cancel", "close", "delete", "remove", "times", "clear"], "x-octagon": ["delete", "stop", "alert", "warning", "times", "clear"], "x-square": ["cancel", "close", "delete", "remove", "times", "clear"], "x": ["cancel", "close", "delete", "remove", "times", "clear"], "youtube": ["logo", "video", "play"], "zap-off": ["flash", "camera", "lightning"], "zap": ["flash", "camera", "lightning"], "zoom-in": ["magnifying glass"], "zoom-out": ["magnifying glass"] }; + }, + "./src/to-svg.js": function(module3, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _icons = __webpack_require__("./src/icons.js"); + var _icons2 = _interopRequireDefault(_icons); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + function toSvg(name) { + var attrs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead."); + if (!name) { + throw new Error("The required `key` (icon name) parameter is missing."); + } + if (!_icons2.default[name]) { + throw new Error("No icon matching '" + name + "'. See the complete list of icons at https://feathericons.com"); + } + return _icons2.default[name].toSvg(attrs); + } + exports2.default = toSvg; + }, + 0: function(module3, exports2, __webpack_require__) { + __webpack_require__("./node_modules/core-js/es/array/from.js"); + module3.exports = __webpack_require__("./src/index.js"); + } + }); + }); + } +}); + +// node_modules/loglevel/lib/loglevel.js +var require_loglevel = __commonJS({ + "node_modules/loglevel/lib/loglevel.js"(exports, module2) { + (function(root2, definition) { + "use strict"; + if (typeof define === "function" && define.amd) { + define(definition); + } else if (typeof module2 === "object" && module2.exports) { + module2.exports = definition(); + } else { + root2.log = definition(); + } + })(exports, function() { + "use strict"; + var noop3 = function() { + }; + var undefinedType = "undefined"; + var isIE = typeof window !== undefinedType && typeof window.navigator !== undefinedType && /Trident\/|MSIE /.test(window.navigator.userAgent); + var logMethods = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + function bindMethod(obj, methodName) { + var method = obj[methodName]; + if (typeof method.bind === "function") { + return method.bind(obj); + } else { + try { + return Function.prototype.bind.call(method, obj); + } catch (e) { + return function() { + return Function.prototype.apply.apply(method, [obj, arguments]); + }; + } + } + } + function traceForIE() { + if (console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + Function.prototype.apply.apply(console.log, [console, arguments]); + } + } + if (console.trace) + console.trace(); + } + function realMethod(methodName) { + if (methodName === "debug") { + methodName = "log"; + } + if (typeof console === undefinedType) { + return false; + } else if (methodName === "trace" && isIE) { + return traceForIE; + } else if (console[methodName] !== void 0) { + return bindMethod(console, methodName); + } else if (console.log !== void 0) { + return bindMethod(console, "log"); + } else { + return noop3; + } + } + function replaceLoggingMethods(level, loggerName) { + for (var i = 0; i < logMethods.length; i++) { + var methodName = logMethods[i]; + this[methodName] = i < level ? noop3 : this.methodFactory(methodName, level, loggerName); + } + this.log = this.debug; + } + function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { + return function() { + if (typeof console !== undefinedType) { + replaceLoggingMethods.call(this, level, loggerName); + this[methodName].apply(this, arguments); + } + }; + } + function defaultMethodFactory(methodName, level, loggerName) { + return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments); + } + function Logger(name, defaultLevel, factory) { + var self2 = this; + var currentLevel; + defaultLevel = defaultLevel == null ? "WARN" : defaultLevel; + var storageKey = "loglevel"; + if (typeof name === "string") { + storageKey += ":" + name; + } else if (typeof name === "symbol") { + storageKey = void 0; + } + function persistLevelIfPossible(levelNum) { + var levelName = (logMethods[levelNum] || "silent").toUpperCase(); + if (typeof window === undefinedType || !storageKey) + return; + try { + window.localStorage[storageKey] = levelName; + return; + } catch (ignore) { + } + try { + window.document.cookie = encodeURIComponent(storageKey) + "=" + levelName + ";"; + } catch (ignore) { + } + } + function getPersistedLevel() { + var storedLevel; + if (typeof window === undefinedType || !storageKey) + return; + try { + storedLevel = window.localStorage[storageKey]; + } catch (ignore) { + } + if (typeof storedLevel === undefinedType) { + try { + var cookie = window.document.cookie; + var location = cookie.indexOf(encodeURIComponent(storageKey) + "="); + if (location !== -1) { + storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; + } + } catch (ignore) { + } + } + if (self2.levels[storedLevel] === void 0) { + storedLevel = void 0; + } + return storedLevel; + } + function clearPersistedLevel() { + if (typeof window === undefinedType || !storageKey) + return; + try { + window.localStorage.removeItem(storageKey); + return; + } catch (ignore) { + } + try { + window.document.cookie = encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } catch (ignore) { + } + } + self2.name = name; + self2.levels = { + "TRACE": 0, + "DEBUG": 1, + "INFO": 2, + "WARN": 3, + "ERROR": 4, + "SILENT": 5 + }; + self2.methodFactory = factory || defaultMethodFactory; + self2.getLevel = function() { + return currentLevel; + }; + self2.setLevel = function(level, persist) { + if (typeof level === "string" && self2.levels[level.toUpperCase()] !== void 0) { + level = self2.levels[level.toUpperCase()]; + } + if (typeof level === "number" && level >= 0 && level <= self2.levels.SILENT) { + currentLevel = level; + if (persist !== false) { + persistLevelIfPossible(level); + } + replaceLoggingMethods.call(self2, level, name); + if (typeof console === undefinedType && level < self2.levels.SILENT) { + return "No console available for logging"; + } + } else { + throw "log.setLevel() called with invalid level: " + level; + } + }; + self2.setDefaultLevel = function(level) { + defaultLevel = level; + if (!getPersistedLevel()) { + self2.setLevel(level, false); + } + }; + self2.resetLevel = function() { + self2.setLevel(defaultLevel, false); + clearPersistedLevel(); + }; + self2.enableAll = function(persist) { + self2.setLevel(self2.levels.TRACE, persist); + }; + self2.disableAll = function(persist) { + self2.setLevel(self2.levels.SILENT, persist); + }; + var initialLevel = getPersistedLevel(); + if (initialLevel == null) { + initialLevel = defaultLevel; + } + self2.setLevel(initialLevel, false); + } + var defaultLogger = new Logger(); + var _loggersByName = {}; + defaultLogger.getLogger = function getLogger(name) { + if (typeof name !== "symbol" && typeof name !== "string" || name === "") { + throw new TypeError("You must supply a name when creating a logger."); + } + var logger = _loggersByName[name]; + if (!logger) { + logger = _loggersByName[name] = new Logger(name, defaultLogger.getLevel(), defaultLogger.methodFactory); + } + return logger; + }; + var _log = typeof window !== undefinedType ? window.log : void 0; + defaultLogger.noConflict = function() { + if (typeof window !== undefinedType && window.log === defaultLogger) { + window.log = _log; + } + return defaultLogger; + }; + defaultLogger.getLoggers = function getLoggers() { + return _loggersByName; + }; + defaultLogger["default"] = defaultLogger; + return defaultLogger; + }); + } +}); + +// node_modules/graphology/dist/graphology.umd.min.js +var require_graphology_umd_min = __commonJS({ + "node_modules/graphology/dist/graphology.umd.min.js"(exports, module2) { + !function(t, e) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis != "undefined" ? globalThis : t || self).graphology = e(); + }(exports, function() { + "use strict"; + function t(e3) { + return t = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t2) { + return typeof t2; + } : function(t2) { + return t2 && typeof Symbol == "function" && t2.constructor === Symbol && t2 !== Symbol.prototype ? "symbol" : typeof t2; + }, t(e3); + } + function e(t2, e3) { + t2.prototype = Object.create(e3.prototype), t2.prototype.constructor = t2, r(t2, e3); + } + function n(t2) { + return n = Object.setPrototypeOf ? Object.getPrototypeOf : function(t3) { + return t3.__proto__ || Object.getPrototypeOf(t3); + }, n(t2); + } + function r(t2, e3) { + return r = Object.setPrototypeOf || function(t3, e4) { + return t3.__proto__ = e4, t3; + }, r(t2, e3); + } + function i() { + if (typeof Reflect == "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) + return false; + if (typeof Proxy == "function") + return true; + try { + return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { + })), true; + } catch (t2) { + return false; + } + } + function o(t2, e3, n2) { + return o = i() ? Reflect.construct : function(t3, e4, n3) { + var i2 = [null]; + i2.push.apply(i2, e4); + var o2 = new (Function.bind.apply(t3, i2))(); + return n3 && r(o2, n3.prototype), o2; + }, o.apply(null, arguments); + } + function a2(t2) { + var e3 = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0; + return a2 = function(t3) { + if (t3 === null || (i2 = t3, Function.toString.call(i2).indexOf("[native code]") === -1)) + return t3; + var i2; + if (typeof t3 != "function") + throw new TypeError("Super expression must either be null or a function"); + if (e3 !== void 0) { + if (e3.has(t3)) + return e3.get(t3); + e3.set(t3, a3); + } + function a3() { + return o(t3, arguments, n(this).constructor); + } + return a3.prototype = Object.create(t3.prototype, { constructor: { value: a3, enumerable: false, writable: true, configurable: true } }), r(a3, t3); + }, a2(t2); + } + function u(t2) { + if (t2 === void 0) + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return t2; + } + var c3 = function() { + for (var t2 = arguments[0], e3 = 1, n2 = arguments.length; e3 < n2; e3++) + if (arguments[e3]) + for (var r2 in arguments[e3]) + t2[r2] = arguments[e3][r2]; + return t2; + }; + function d(t2, e3, n2, r2) { + var i2 = t2._nodes.get(e3), o2 = null; + return i2 ? o2 = r2 === "mixed" ? i2.out && i2.out[n2] || i2.undirected && i2.undirected[n2] : r2 === "directed" ? i2.out && i2.out[n2] : i2.undirected && i2.undirected[n2] : o2; + } + function s(e3) { + return e3 !== null && t(e3) === "object" && typeof e3.addUndirectedEdgeWithKey == "function" && typeof e3.dropNode == "function"; + } + function h(e3) { + return t(e3) === "object" && e3 !== null && e3.constructor === Object; + } + function f(t2) { + var e3; + for (e3 in t2) + return false; + return true; + } + function p(t2, e3, n2) { + Object.defineProperty(t2, e3, { enumerable: false, configurable: false, writable: true, value: n2 }); + } + function l(t2, e3, n2) { + var r2 = { enumerable: true, configurable: true }; + typeof n2 == "function" ? r2.get = n2 : (r2.value = n2, r2.writable = false), Object.defineProperty(t2, e3, r2); + } + function g(t2) { + return !!h(t2) && !(t2.attributes && !Array.isArray(t2.attributes)); + } + typeof Object.assign == "function" && (c3 = Object.assign); + var y4, v = { exports: {} }, b = typeof Reflect == "object" ? Reflect : null, w = b && typeof b.apply == "function" ? b.apply : function(t2, e3, n2) { + return Function.prototype.apply.call(t2, e3, n2); + }; + y4 = b && typeof b.ownKeys == "function" ? b.ownKeys : Object.getOwnPropertySymbols ? function(t2) { + return Object.getOwnPropertyNames(t2).concat(Object.getOwnPropertySymbols(t2)); + } : function(t2) { + return Object.getOwnPropertyNames(t2); + }; + var m2 = Number.isNaN || function(t2) { + return t2 != t2; + }; + function _() { + _.init.call(this); + } + v.exports = _, v.exports.once = function(t2, e3) { + return new Promise(function(n2, r2) { + function i2(n3) { + t2.removeListener(e3, o2), r2(n3); + } + function o2() { + typeof t2.removeListener == "function" && t2.removeListener("error", i2), n2([].slice.call(arguments)); + } + U(t2, e3, o2, { once: true }), e3 !== "error" && function(t3, e4, n3) { + typeof t3.on == "function" && U(t3, "error", e4, n3); + }(t2, i2, { once: true }); + }); + }, _.EventEmitter = _, _.prototype._events = void 0, _.prototype._eventsCount = 0, _.prototype._maxListeners = void 0; + var k = 10; + function G(t2) { + if (typeof t2 != "function") + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof t2); + } + function x4(t2) { + return t2._maxListeners === void 0 ? _.defaultMaxListeners : t2._maxListeners; + } + function E2(t2, e3, n2, r2) { + var i2, o2, a3, u2; + if (G(n2), (o2 = t2._events) === void 0 ? (o2 = t2._events = /* @__PURE__ */ Object.create(null), t2._eventsCount = 0) : (o2.newListener !== void 0 && (t2.emit("newListener", e3, n2.listener ? n2.listener : n2), o2 = t2._events), a3 = o2[e3]), a3 === void 0) + a3 = o2[e3] = n2, ++t2._eventsCount; + else if (typeof a3 == "function" ? a3 = o2[e3] = r2 ? [n2, a3] : [a3, n2] : r2 ? a3.unshift(n2) : a3.push(n2), (i2 = x4(t2)) > 0 && a3.length > i2 && !a3.warned) { + a3.warned = true; + var c4 = new Error("Possible EventEmitter memory leak detected. " + a3.length + " " + String(e3) + " listeners added. Use emitter.setMaxListeners() to increase limit"); + c4.name = "MaxListenersExceededWarning", c4.emitter = t2, c4.type = e3, c4.count = a3.length, u2 = c4, console && console.warn && console.warn(u2); + } + return t2; + } + function S() { + if (!this.fired) + return this.target.removeListener(this.type, this.wrapFn), this.fired = true, arguments.length === 0 ? this.listener.call(this.target) : this.listener.apply(this.target, arguments); + } + function A2(t2, e3, n2) { + var r2 = { fired: false, wrapFn: void 0, target: t2, type: e3, listener: n2 }, i2 = S.bind(r2); + return i2.listener = n2, r2.wrapFn = i2, i2; + } + function L(t2, e3, n2) { + var r2 = t2._events; + if (r2 === void 0) + return []; + var i2 = r2[e3]; + return i2 === void 0 ? [] : typeof i2 == "function" ? n2 ? [i2.listener || i2] : [i2] : n2 ? function(t3) { + for (var e4 = new Array(t3.length), n3 = 0; n3 < e4.length; ++n3) + e4[n3] = t3[n3].listener || t3[n3]; + return e4; + }(i2) : N(i2, i2.length); + } + function D2(t2) { + var e3 = this._events; + if (e3 !== void 0) { + var n2 = e3[t2]; + if (typeof n2 == "function") + return 1; + if (n2 !== void 0) + return n2.length; + } + return 0; + } + function N(t2, e3) { + for (var n2 = new Array(e3), r2 = 0; r2 < e3; ++r2) + n2[r2] = t2[r2]; + return n2; + } + function U(t2, e3, n2, r2) { + if (typeof t2.on == "function") + r2.once ? t2.once(e3, n2) : t2.on(e3, n2); + else { + if (typeof t2.addEventListener != "function") + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof t2); + t2.addEventListener(e3, function i2(o2) { + r2.once && t2.removeEventListener(e3, i2), n2(o2); + }); + } + } + function j(t2) { + if (typeof t2 != "function") + throw new Error("obliterator/iterator: expecting a function!"); + this.next = t2; + } + Object.defineProperty(_, "defaultMaxListeners", { enumerable: true, get: function() { + return k; + }, set: function(t2) { + if (typeof t2 != "number" || t2 < 0 || m2(t2)) + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + t2 + "."); + k = t2; + } }), _.init = function() { + this._events !== void 0 && this._events !== Object.getPrototypeOf(this)._events || (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0; + }, _.prototype.setMaxListeners = function(t2) { + if (typeof t2 != "number" || t2 < 0 || m2(t2)) + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + t2 + "."); + return this._maxListeners = t2, this; + }, _.prototype.getMaxListeners = function() { + return x4(this); + }, _.prototype.emit = function(t2) { + for (var e3 = [], n2 = 1; n2 < arguments.length; n2++) + e3.push(arguments[n2]); + var r2 = t2 === "error", i2 = this._events; + if (i2 !== void 0) + r2 = r2 && i2.error === void 0; + else if (!r2) + return false; + if (r2) { + var o2; + if (e3.length > 0 && (o2 = e3[0]), o2 instanceof Error) + throw o2; + var a3 = new Error("Unhandled error." + (o2 ? " (" + o2.message + ")" : "")); + throw a3.context = o2, a3; + } + var u2 = i2[t2]; + if (u2 === void 0) + return false; + if (typeof u2 == "function") + w(u2, this, e3); + else { + var c4 = u2.length, d2 = N(u2, c4); + for (n2 = 0; n2 < c4; ++n2) + w(d2[n2], this, e3); + } + return true; + }, _.prototype.addListener = function(t2, e3) { + return E2(this, t2, e3, false); + }, _.prototype.on = _.prototype.addListener, _.prototype.prependListener = function(t2, e3) { + return E2(this, t2, e3, true); + }, _.prototype.once = function(t2, e3) { + return G(e3), this.on(t2, A2(this, t2, e3)), this; + }, _.prototype.prependOnceListener = function(t2, e3) { + return G(e3), this.prependListener(t2, A2(this, t2, e3)), this; + }, _.prototype.removeListener = function(t2, e3) { + var n2, r2, i2, o2, a3; + if (G(e3), (r2 = this._events) === void 0) + return this; + if ((n2 = r2[t2]) === void 0) + return this; + if (n2 === e3 || n2.listener === e3) + --this._eventsCount == 0 ? this._events = /* @__PURE__ */ Object.create(null) : (delete r2[t2], r2.removeListener && this.emit("removeListener", t2, n2.listener || e3)); + else if (typeof n2 != "function") { + for (i2 = -1, o2 = n2.length - 1; o2 >= 0; o2--) + if (n2[o2] === e3 || n2[o2].listener === e3) { + a3 = n2[o2].listener, i2 = o2; + break; + } + if (i2 < 0) + return this; + i2 === 0 ? n2.shift() : function(t3, e4) { + for (; e4 + 1 < t3.length; e4++) + t3[e4] = t3[e4 + 1]; + t3.pop(); + }(n2, i2), n2.length === 1 && (r2[t2] = n2[0]), r2.removeListener !== void 0 && this.emit("removeListener", t2, a3 || e3); + } + return this; + }, _.prototype.off = _.prototype.removeListener, _.prototype.removeAllListeners = function(t2) { + var e3, n2, r2; + if ((n2 = this._events) === void 0) + return this; + if (n2.removeListener === void 0) + return arguments.length === 0 ? (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0) : n2[t2] !== void 0 && (--this._eventsCount == 0 ? this._events = /* @__PURE__ */ Object.create(null) : delete n2[t2]), this; + if (arguments.length === 0) { + var i2, o2 = Object.keys(n2); + for (r2 = 0; r2 < o2.length; ++r2) + (i2 = o2[r2]) !== "removeListener" && this.removeAllListeners(i2); + return this.removeAllListeners("removeListener"), this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0, this; + } + if (typeof (e3 = n2[t2]) == "function") + this.removeListener(t2, e3); + else if (e3 !== void 0) + for (r2 = e3.length - 1; r2 >= 0; r2--) + this.removeListener(t2, e3[r2]); + return this; + }, _.prototype.listeners = function(t2) { + return L(this, t2, true); + }, _.prototype.rawListeners = function(t2) { + return L(this, t2, false); + }, _.listenerCount = function(t2, e3) { + return typeof t2.listenerCount == "function" ? t2.listenerCount(e3) : D2.call(t2, e3); + }, _.prototype.listenerCount = D2, _.prototype.eventNames = function() { + return this._eventsCount > 0 ? y4(this._events) : []; + }, typeof Symbol != "undefined" && (j.prototype[Symbol.iterator] = function() { + return this; + }), j.of = function() { + var t2 = arguments, e3 = t2.length, n2 = 0; + return new j(function() { + return n2 >= e3 ? { done: true } : { done: false, value: t2[n2++] }; + }); + }, j.empty = function() { + return new j(function() { + return { done: true }; + }); + }, j.fromSequence = function(t2) { + var e3 = 0, n2 = t2.length; + return new j(function() { + return e3 >= n2 ? { done: true } : { done: false, value: t2[e3++] }; + }); + }, j.is = function(t2) { + return t2 instanceof j || typeof t2 == "object" && t2 !== null && typeof t2.next == "function"; + }; + var O = j, C2 = {}; + C2.ARRAY_BUFFER_SUPPORT = typeof ArrayBuffer != "undefined", C2.SYMBOL_SUPPORT = typeof Symbol != "undefined"; + var z = O, M = C2, P = M.ARRAY_BUFFER_SUPPORT, T = M.SYMBOL_SUPPORT; + var R = function(t2) { + var e3 = function(t3) { + return typeof t3 == "string" || Array.isArray(t3) || P && ArrayBuffer.isView(t3) ? z.fromSequence(t3) : typeof t3 != "object" || t3 === null ? null : T && typeof t3[Symbol.iterator] == "function" ? t3[Symbol.iterator]() : typeof t3.next == "function" ? t3 : null; + }(t2); + if (!e3) + throw new Error("obliterator: target is not iterable nor a valid iterator."); + return e3; + }, W = R, K = function(t2, e3) { + for (var n2, r2 = arguments.length > 1 ? e3 : 1 / 0, i2 = r2 !== 1 / 0 ? new Array(r2) : [], o2 = 0, a3 = W(t2); ; ) { + if (o2 === r2) + return i2; + if ((n2 = a3.next()).done) + return o2 !== e3 && (i2.length = o2), i2; + i2[o2++] = n2.value; + } + }, I = function(t2) { + function n2(e3) { + var n3; + return (n3 = t2.call(this) || this).name = "GraphError", n3.message = e3, n3; + } + return e(n2, t2), n2; + }(a2(Error)), F = function(t2) { + function n2(e3) { + var r2; + return (r2 = t2.call(this, e3) || this).name = "InvalidArgumentsGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2; + } + return e(n2, t2), n2; + }(I), Y2 = function(t2) { + function n2(e3) { + var r2; + return (r2 = t2.call(this, e3) || this).name = "NotFoundGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2; + } + return e(n2, t2), n2; + }(I), B2 = function(t2) { + function n2(e3) { + var r2; + return (r2 = t2.call(this, e3) || this).name = "UsageGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2; + } + return e(n2, t2), n2; + }(I); + function q(t2, e3) { + this.key = t2, this.attributes = e3, this.clear(); + } + function J(t2, e3) { + this.key = t2, this.attributes = e3, this.clear(); + } + function V(t2, e3) { + this.key = t2, this.attributes = e3, this.clear(); + } + function H(t2, e3, n2, r2, i2) { + this.key = e3, this.attributes = i2, this.undirected = t2, this.source = n2, this.target = r2; + } + function Q(t2, e3, n2, r2, i2, o2, a3) { + var u2, c4, d2 = "out", s2 = "in"; + if (e3 && (d2 = s2 = "undirected"), t2.multi) { + if ((c4 = (u2 = o2[d2])[i2]) === void 0 && (c4 = /* @__PURE__ */ new Set(), u2[i2] = c4), c4.add(n2), r2 === i2 && e3) + return; + (u2 = a3[s2])[r2] === void 0 && (u2[r2] = c4); + } else { + if (o2[d2][i2] = n2, r2 === i2 && e3) + return; + a3[s2][r2] = n2; + } + } + function X2(t2, e3, n2) { + var r2 = t2.multi, i2 = n2.source, o2 = n2.target, a3 = i2.key, u2 = o2.key, c4 = i2[e3 ? "undirected" : "out"], d2 = e3 ? "undirected" : "in"; + if (u2 in c4) + if (r2) { + var s2 = c4[u2]; + s2.size === 1 ? (delete c4[u2], delete o2[d2][a3]) : s2.delete(n2); + } else + delete c4[u2]; + r2 || delete o2[d2][a3]; + } + q.prototype.clear = function() { + this.inDegree = 0, this.outDegree = 0, this.undirectedDegree = 0, this.directedSelfLoops = 0, this.undirectedSelfLoops = 0, this.in = {}, this.out = {}, this.undirected = {}; + }, J.prototype.clear = function() { + this.inDegree = 0, this.outDegree = 0, this.directedSelfLoops = 0, this.in = {}, this.out = {}; + }, J.prototype.upgradeToMixed = function() { + this.undirectedDegree = 0, this.undirectedSelfLoops = 0, this.undirected = {}; + }, V.prototype.clear = function() { + this.undirectedDegree = 0, this.undirectedSelfLoops = 0, this.undirected = {}; + }, V.prototype.upgradeToMixed = function() { + this.inDegree = 0, this.outDegree = 0, this.directedSelfLoops = 0, this.in = {}, this.out = {}; + }; + function Z(t2, e3, n2, r2, i2, o2, a3) { + var u2, c4, d2, s2; + if (r2 = "" + r2, n2 === 0) { + if (!(u2 = t2._nodes.get(r2))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(r2, '" node in the graph.')); + d2 = i2, s2 = o2; + } else if (n2 === 3) { + if (i2 = "" + i2, !(c4 = t2._edges.get(i2))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(i2, '" edge in the graph.')); + var h2 = c4.source.key, f2 = c4.target.key; + if (r2 === h2) + u2 = c4.target; + else { + if (r2 !== f2) + throw new Y2("Graph.".concat(e3, ': the "').concat(r2, '" node is not attached to the "').concat(i2, '" edge (').concat(h2, ", ").concat(f2, ").")); + u2 = c4.source; + } + d2 = o2, s2 = a3; + } else { + if (!(c4 = t2._edges.get(r2))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(r2, '" edge in the graph.')); + u2 = n2 === 1 ? c4.source : c4.target, d2 = i2, s2 = o2; + } + return [u2, d2, s2]; + } + var $ = [{ name: function(t2) { + return "get".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + return a3.attributes[u2]; + }; + } }, { name: function(t2) { + return "get".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + return Z(this, e3, n2, t3, r2)[0].attributes; + }; + } }, { name: function(t2) { + return "has".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + return a3.attributes.hasOwnProperty(u2); + }; + } }, { name: function(t2) { + return "set".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2, o2) { + var a3 = Z(this, e3, n2, t3, r2, i2, o2), u2 = a3[0], c4 = a3[1], d2 = a3[2]; + return u2.attributes[c4] = d2, this.emit("nodeAttributesUpdated", { key: u2.key, type: "set", attributes: u2.attributes, name: c4 }), this; + }; + } }, { name: function(t2) { + return "update".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2, o2) { + var a3 = Z(this, e3, n2, t3, r2, i2, o2), u2 = a3[0], c4 = a3[1], d2 = a3[2]; + if (typeof d2 != "function") + throw new F("Graph.".concat(e3, ": updater should be a function.")); + var s2 = u2.attributes, h2 = d2(s2[c4]); + return s2[c4] = h2, this.emit("nodeAttributesUpdated", { key: u2.key, type: "set", attributes: u2.attributes, name: c4 }), this; + }; + } }, { name: function(t2) { + return "remove".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + return delete a3.attributes[u2], this.emit("nodeAttributesUpdated", { key: a3.key, type: "remove", attributes: a3.attributes, name: u2 }), this; + }; + } }, { name: function(t2) { + return "replace".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + if (!h(u2)) + throw new F("Graph.".concat(e3, ": provided attributes are not a plain object.")); + return a3.attributes = u2, this.emit("nodeAttributesUpdated", { key: a3.key, type: "replace", attributes: a3.attributes }), this; + }; + } }, { name: function(t2) { + return "merge".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + if (!h(u2)) + throw new F("Graph.".concat(e3, ": provided attributes are not a plain object.")); + return c3(a3.attributes, u2), this.emit("nodeAttributesUpdated", { key: a3.key, type: "merge", attributes: a3.attributes, data: u2 }), this; + }; + } }, { name: function(t2) { + return "update".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1]; + if (typeof u2 != "function") + throw new F("Graph.".concat(e3, ": provided updater is not a function.")); + return a3.attributes = u2(a3.attributes), this.emit("nodeAttributesUpdated", { key: a3.key, type: "update", attributes: a3.attributes }), this; + }; + } }]; + var tt = [{ name: function(t2) { + return "get".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return i2.attributes[r2]; + }; + } }, { name: function(t2) { + return "get".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3) { + var r2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 1) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var i2 = "" + t3, o2 = "" + arguments[1]; + if (!(r2 = d(this, i2, o2, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(i2, '" - "').concat(o2, '").')); + } else if (t3 = "" + t3, !(r2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (n2 !== "mixed" && r2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return r2.attributes; + }; + } }, { name: function(t2) { + return "has".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return i2.attributes.hasOwnProperty(r2); + }; + } }, { name: function(t2) { + return "set".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 3) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var a3 = "" + t3, u2 = "" + r2; + if (r2 = arguments[2], i2 = arguments[3], !(o2 = d(this, a3, u2, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(a3, '" - "').concat(u2, '").')); + } else if (t3 = "" + t3, !(o2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (n2 !== "mixed" && o2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return o2.attributes[r2] = i2, this.emit("edgeAttributesUpdated", { key: o2.key, type: "set", attributes: o2.attributes, name: r2 }), this; + }; + } }, { name: function(t2) { + return "update".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2, i2) { + var o2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 3) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var a3 = "" + t3, u2 = "" + r2; + if (r2 = arguments[2], i2 = arguments[3], !(o2 = d(this, a3, u2, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(a3, '" - "').concat(u2, '").')); + } else if (t3 = "" + t3, !(o2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (typeof i2 != "function") + throw new F("Graph.".concat(e3, ": updater should be a function.")); + if (n2 !== "mixed" && o2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return o2.attributes[r2] = i2(o2.attributes[r2]), this.emit("edgeAttributesUpdated", { key: o2.key, type: "set", attributes: o2.attributes, name: r2 }), this; + }; + } }, { name: function(t2) { + return "remove".concat(t2, "Attribute"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return delete i2.attributes[r2], this.emit("edgeAttributesUpdated", { key: i2.key, type: "remove", attributes: i2.attributes, name: r2 }), this; + }; + } }, { name: function(t2) { + return "replace".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (!h(r2)) + throw new F("Graph.".concat(e3, ": provided attributes are not a plain object.")); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return i2.attributes = r2, this.emit("edgeAttributesUpdated", { key: i2.key, type: "replace", attributes: i2.attributes }), this; + }; + } }, { name: function(t2) { + return "merge".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (!h(r2)) + throw new F("Graph.".concat(e3, ": provided attributes are not a plain object.")); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return c3(i2.attributes, r2), this.emit("edgeAttributesUpdated", { key: i2.key, type: "merge", attributes: i2.attributes, data: r2 }), this; + }; + } }, { name: function(t2) { + return "update".concat(t2, "Attributes"); + }, attacher: function(t2, e3, n2) { + t2.prototype[e3] = function(t3, r2) { + var i2; + if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type) + throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph.")); + if (arguments.length > 2) { + if (this.multi) + throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.")); + var o2 = "" + t3, a3 = "" + r2; + if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2))) + throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").')); + } else if (t3 = "" + t3, !(i2 = this._edges.get(t3))) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.')); + if (typeof r2 != "function") + throw new F("Graph.".concat(e3, ": provided updater is not a function.")); + if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected")) + throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph.")); + return i2.attributes = r2(i2.attributes), this.emit("edgeAttributesUpdated", { key: i2.key, type: "update", attributes: i2.attributes }), this; + }; + } }]; + var et = O, nt = R, rt = function() { + var t2, e3 = arguments, n2 = -1; + return new et(function r2() { + if (!t2) { + if (++n2 >= e3.length) + return { done: true }; + t2 = nt(e3[n2]); + } + var i2 = t2.next(); + return i2.done ? (t2 = null, r2()) : i2; + }); + }, it = [{ name: "edges", type: "mixed" }, { name: "inEdges", type: "directed", direction: "in" }, { name: "outEdges", type: "directed", direction: "out" }, { name: "inboundEdges", type: "mixed", direction: "in" }, { name: "outboundEdges", type: "mixed", direction: "out" }, { name: "directedEdges", type: "directed" }, { name: "undirectedEdges", type: "undirected" }]; + function ot(t2, e3) { + for (var n2 in e3) + t2.push(e3[n2].key); + } + function at(t2, e3) { + for (var n2 in e3) + e3[n2].forEach(function(e4) { + return t2.push(e4.key); + }); + } + function ut(t2, e3, n2) { + for (var r2 in t2) + if (r2 !== n2) { + var i2 = t2[r2]; + e3(i2.key, i2.attributes, i2.source.key, i2.target.key, i2.source.attributes, i2.target.attributes, i2.undirected); + } + } + function ct(t2, e3, n2) { + for (var r2 in t2) + r2 !== n2 && t2[r2].forEach(function(t3) { + return e3(t3.key, t3.attributes, t3.source.key, t3.target.key, t3.source.attributes, t3.target.attributes, t3.undirected); + }); + } + function dt(t2, e3, n2) { + for (var r2 in t2) + if (r2 !== n2) { + var i2 = t2[r2]; + if (e3(i2.key, i2.attributes, i2.source.key, i2.target.key, i2.source.attributes, i2.target.attributes, i2.undirected)) + return i2.key; + } + } + function st(t2, e3, n2) { + var r2, i2, o2, a3, u2; + for (var c4 in t2) + if (c4 !== n2) { + for (r2 = t2[c4].values(); (i2 = r2.next()).done !== true; ) + if (a3 = (o2 = i2.value).source, u2 = o2.target, e3(o2.key, o2.attributes, a3.key, u2.key, a3.attributes, u2.attributes, o2.undirected)) + return o2.key; + } + } + function ht(t2, e3) { + var n2 = Object.keys(t2), r2 = n2.length, i2 = null, o2 = 0; + return new O(function a3() { + var u2; + if (i2) { + var c4 = i2.next(); + if (c4.done) + return i2 = null, o2++, a3(); + u2 = c4.value; + } else { + if (o2 >= r2) + return { done: true }; + var d2 = n2[o2]; + if (d2 === e3) + return o2++, a3(); + if ((u2 = t2[d2]) instanceof Set) + return i2 = u2.values(), a3(); + o2++; + } + return { done: false, value: { edge: u2.key, attributes: u2.attributes, source: u2.source.key, target: u2.target.key, sourceAttributes: u2.source.attributes, targetAttributes: u2.target.attributes, undirected: u2.undirected } }; + }); + } + function ft(t2, e3, n2) { + var r2 = e3[n2]; + r2 && t2.push(r2.key); + } + function pt(t2, e3, n2) { + var r2 = e3[n2]; + r2 && r2.forEach(function(e4) { + return t2.push(e4.key); + }); + } + function lt(t2, e3, n2) { + var r2 = t2[e3]; + if (r2) { + var i2 = r2.source, o2 = r2.target; + n2(r2.key, r2.attributes, i2.key, o2.key, i2.attributes, o2.attributes, r2.undirected); + } + } + function gt(t2, e3, n2) { + var r2 = t2[e3]; + r2 && r2.forEach(function(t3) { + return n2(t3.key, t3.attributes, t3.source.key, t3.target.key, t3.source.attributes, t3.target.attributes, t3.undirected); + }); + } + function yt(t2, e3, n2) { + var r2 = t2[e3]; + if (r2) { + var i2 = r2.source, o2 = r2.target; + return n2(r2.key, r2.attributes, i2.key, o2.key, i2.attributes, o2.attributes, r2.undirected) ? r2.key : void 0; + } + } + function vt(t2, e3, n2) { + var r2 = t2[e3]; + if (r2) { + for (var i2, o2, a3 = r2.values(); (i2 = a3.next()).done !== true; ) + if (n2((o2 = i2.value).key, o2.attributes, o2.source.key, o2.target.key, o2.source.attributes, o2.target.attributes, o2.undirected)) + return o2.key; + } + } + function bt(t2, e3) { + var n2 = t2[e3]; + if (n2 instanceof Set) { + var r2 = n2.values(); + return new O(function() { + var t3 = r2.next(); + if (t3.done) + return t3; + var e4 = t3.value; + return { done: false, value: { edge: e4.key, attributes: e4.attributes, source: e4.source.key, target: e4.target.key, sourceAttributes: e4.source.attributes, targetAttributes: e4.target.attributes, undirected: e4.undirected } }; + }); + } + return O.of([n2.key, n2.attributes, n2.source.key, n2.target.key, n2.source.attributes, n2.target.attributes]); + } + function wt(t2, e3) { + if (t2.size === 0) + return []; + if (e3 === "mixed" || e3 === t2.type) + return typeof Array.from == "function" ? Array.from(t2._edges.keys()) : K(t2._edges.keys(), t2._edges.size); + for (var n2, r2, i2 = e3 === "undirected" ? t2.undirectedSize : t2.directedSize, o2 = new Array(i2), a3 = e3 === "undirected", u2 = t2._edges.values(), c4 = 0; (n2 = u2.next()).done !== true; ) + (r2 = n2.value).undirected === a3 && (o2[c4++] = r2.key); + return o2; + } + function mt(t2, e3, n2) { + if (t2.size !== 0) { + for (var r2, i2, o2 = e3 !== "mixed" && e3 !== t2.type, a3 = e3 === "undirected", u2 = t2._edges.values(); (r2 = u2.next()).done !== true; ) + if (i2 = r2.value, !o2 || i2.undirected === a3) { + var c4 = i2, d2 = c4.key, s2 = c4.attributes, h2 = c4.source, f2 = c4.target; + n2(d2, s2, h2.key, f2.key, h2.attributes, f2.attributes, i2.undirected); + } + } + } + function _t(t2, e3, n2) { + if (t2.size !== 0) { + for (var r2, i2, o2 = e3 !== "mixed" && e3 !== t2.type, a3 = e3 === "undirected", u2 = t2._edges.values(); (r2 = u2.next()).done !== true; ) + if (i2 = r2.value, !o2 || i2.undirected === a3) { + var c4 = i2, d2 = c4.key, s2 = c4.attributes, h2 = c4.source, f2 = c4.target; + if (n2(d2, s2, h2.key, f2.key, h2.attributes, f2.attributes, i2.undirected)) + return d2; + } + } + } + function kt(t2, e3) { + if (t2.size === 0) + return O.empty(); + var n2 = e3 !== "mixed" && e3 !== t2.type, r2 = e3 === "undirected", i2 = t2._edges.values(); + return new O(function() { + for (var t3, e4; ; ) { + if ((t3 = i2.next()).done) + return t3; + if (e4 = t3.value, !n2 || e4.undirected === r2) + break; + } + return { value: { edge: e4.key, attributes: e4.attributes, source: e4.source.key, target: e4.target.key, sourceAttributes: e4.source.attributes, targetAttributes: e4.target.attributes, undirected: e4.undirected }, done: false }; + }); + } + function Gt(t2, e3, n2, r2) { + var i2 = [], o2 = t2 ? at : ot; + return e3 !== "undirected" && (n2 !== "out" && o2(i2, r2.in), n2 !== "in" && o2(i2, r2.out), !n2 && r2.directedSelfLoops > 0 && i2.splice(i2.lastIndexOf(r2.key), 1)), e3 !== "directed" && o2(i2, r2.undirected), i2; + } + function xt(t2, e3, n2, r2, i2) { + var o2 = t2 ? ct : ut; + e3 !== "undirected" && (n2 !== "out" && o2(r2.in, i2), n2 !== "in" && o2(r2.out, i2, n2 ? null : r2.key)), e3 !== "directed" && o2(r2.undirected, i2); + } + function Et(t2, e3, n2, r2, i2) { + var o2, a3 = t2 ? st : dt; + if (e3 !== "undirected") { + if (n2 !== "out" && (o2 = a3(r2.in, i2))) + return o2; + if (n2 !== "in" && (o2 = a3(r2.out, i2, n2 ? null : r2.key))) + return o2; + } + if (e3 !== "directed" && (o2 = a3(r2.undirected, i2))) + return o2; + } + function St(t2, e3, n2) { + var r2 = O.empty(); + return t2 !== "undirected" && (e3 !== "out" && n2.in !== void 0 && (r2 = rt(r2, ht(n2.in))), e3 !== "in" && n2.out !== void 0 && (r2 = rt(r2, ht(n2.out, e3 ? null : n2.key)))), t2 !== "directed" && n2.undirected !== void 0 && (r2 = rt(r2, ht(n2.undirected))), r2; + } + function At(t2, e3, n2, r2, i2) { + var o2 = e3 ? pt : ft, a3 = []; + return t2 !== "undirected" && (r2.in !== void 0 && n2 !== "out" && o2(a3, r2.in, i2), r2.out !== void 0 && n2 !== "in" && o2(a3, r2.out, i2), !n2 && r2.directedSelfLoops > 0 && a3.splice(a3.lastIndexOf(r2.key), 1)), t2 !== "directed" && r2.undirected !== void 0 && o2(a3, r2.undirected, i2), a3; + } + function Lt(t2, e3, n2, r2, i2, o2) { + var a3 = e3 ? gt : lt; + t2 !== "undirected" && (r2.in !== void 0 && n2 !== "out" && a3(r2.in, i2, o2), r2.key !== i2 && r2.out !== void 0 && n2 !== "in" && a3(r2.out, i2, o2)), t2 !== "directed" && r2.undirected !== void 0 && a3(r2.undirected, i2, o2); + } + function Dt(t2, e3, n2, r2, i2, o2) { + var a3, u2 = e3 ? vt : yt; + if (t2 !== "undirected") { + if (r2.in !== void 0 && n2 !== "out" && (a3 = u2(r2.in, i2, o2))) + return a3; + if (r2.key !== i2 && r2.out !== void 0 && n2 !== "in" && (a3 = u2(r2.out, i2, o2, n2 ? null : r2.key))) + return a3; + } + if (t2 !== "directed" && r2.undirected !== void 0 && (a3 = u2(r2.undirected, i2, o2))) + return a3; + } + function Nt(t2, e3, n2, r2) { + var i2 = O.empty(); + return t2 !== "undirected" && (n2.in !== void 0 && e3 !== "out" && r2 in n2.in && (i2 = rt(i2, bt(n2.in, r2))), n2.out !== void 0 && e3 !== "in" && r2 in n2.out && (i2 = rt(i2, bt(n2.out, r2)))), t2 !== "directed" && n2.undirected !== void 0 && r2 in n2.undirected && (i2 = rt(i2, bt(n2.undirected, r2))), i2; + } + var Ut = [{ name: "neighbors", type: "mixed" }, { name: "inNeighbors", type: "directed", direction: "in" }, { name: "outNeighbors", type: "directed", direction: "out" }, { name: "inboundNeighbors", type: "mixed", direction: "in" }, { name: "outboundNeighbors", type: "mixed", direction: "out" }, { name: "directedNeighbors", type: "directed" }, { name: "undirectedNeighbors", type: "undirected" }]; + function jt(t2, e3) { + if (e3 !== void 0) + for (var n2 in e3) + t2.add(n2); + } + function Ot(t2, e3, n2) { + for (var r2 in e3) { + var i2 = e3[r2]; + i2 instanceof Set && (i2 = i2.values().next().value); + var o2 = i2.source, a3 = i2.target, u2 = o2 === t2 ? a3 : o2; + n2(u2.key, u2.attributes); + } + } + function Ct(t2, e3, n2, r2) { + for (var i2 in n2) { + var o2 = n2[i2]; + o2 instanceof Set && (o2 = o2.values().next().value); + var a3 = o2.source, u2 = o2.target, c4 = a3 === e3 ? u2 : a3; + t2.has(c4.key) || (t2.add(c4.key), r2(c4.key, c4.attributes)); + } + } + function zt(t2, e3, n2) { + for (var r2 in e3) { + var i2 = e3[r2]; + i2 instanceof Set && (i2 = i2.values().next().value); + var o2 = i2.source, a3 = i2.target, u2 = o2 === t2 ? a3 : o2; + if (n2(u2.key, u2.attributes)) + return u2.key; + } + } + function Mt(t2, e3, n2, r2) { + for (var i2 in n2) { + var o2 = n2[i2]; + o2 instanceof Set && (o2 = o2.values().next().value); + var a3 = o2.source, u2 = o2.target, c4 = a3 === e3 ? u2 : a3; + if (!t2.has(c4.key)) { + if (t2.add(c4.key), r2(c4.key, c4.attributes)) + return c4.key; + } + } + } + function Pt(t2, e3) { + var n2 = Object.keys(e3), r2 = n2.length, i2 = 0; + return new O(function() { + if (i2 >= r2) + return { done: true }; + var o2 = e3[n2[i2++]]; + o2 instanceof Set && (o2 = o2.values().next().value); + var a3 = o2.source, u2 = o2.target, c4 = a3 === t2 ? u2 : a3; + return { done: false, value: { neighbor: c4.key, attributes: c4.attributes } }; + }); + } + function Tt(t2, e3, n2) { + var r2 = Object.keys(n2), i2 = r2.length, o2 = 0; + return new O(function a3() { + if (o2 >= i2) + return { done: true }; + var u2 = n2[r2[o2++]]; + u2 instanceof Set && (u2 = u2.values().next().value); + var c4 = u2.source, d2 = u2.target, s2 = c4 === e3 ? d2 : c4; + return t2.has(s2.key) ? a3() : (t2.add(s2.key), { done: false, value: { neighbor: s2.key, attributes: s2.attributes } }); + }); + } + function Rt(t2, e3) { + var n2 = e3.name, r2 = e3.type, i2 = e3.direction; + t2.prototype[n2] = function(t3) { + if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type) + return []; + t3 = "" + t3; + var e4 = this._nodes.get(t3); + if (e4 === void 0) + throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t3, '" node in the graph.')); + return function(t4, e6, n3) { + if (t4 !== "mixed") { + if (t4 === "undirected") + return Object.keys(n3.undirected); + if (typeof e6 == "string") + return Object.keys(n3[e6]); + } + var r3 = /* @__PURE__ */ new Set(); + return t4 !== "undirected" && (e6 !== "out" && jt(r3, n3.in), e6 !== "in" && jt(r3, n3.out)), t4 !== "directed" && jt(r3, n3.undirected), K(r3.values(), r3.size); + }(r2 === "mixed" ? this.type : r2, i2, e4); + }; + } + function Wt(t2, e3) { + var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = "forEach" + n2[0].toUpperCase() + n2.slice(1, -1); + t2.prototype[o2] = function(t3, e4) { + if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) { + t3 = "" + t3; + var n3 = this._nodes.get(t3); + if (n3 === void 0) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t3, '" node in the graph.')); + !function(t4, e6, n4, r3) { + if (t4 !== "mixed") { + if (t4 === "undirected") + return Ot(n4, n4.undirected, r3); + if (typeof e6 == "string") + return Ot(n4, n4[e6], r3); + } + var i3 = /* @__PURE__ */ new Set(); + t4 !== "undirected" && (e6 !== "out" && Ct(i3, n4, n4.in, r3), e6 !== "in" && Ct(i3, n4, n4.out, r3)), t4 !== "directed" && Ct(i3, n4, n4.undirected, r3); + }(r2 === "mixed" ? this.type : r2, i2, n3, e4); + } + }; + var a3 = "map" + n2[0].toUpperCase() + n2.slice(1); + t2.prototype[a3] = function(t3, e4) { + var n3 = []; + return this[o2](t3, function(t4, r3) { + n3.push(e4(t4, r3)); + }), n3; + }; + var u2 = "filter" + n2[0].toUpperCase() + n2.slice(1); + t2.prototype[u2] = function(t3, e4) { + var n3 = []; + return this[o2](t3, function(t4, r3) { + e4(t4, r3) && n3.push(t4); + }), n3; + }; + var c4 = "reduce" + n2[0].toUpperCase() + n2.slice(1); + t2.prototype[c4] = function(t3, e4, n3) { + if (arguments.length < 3) + throw new F("Graph.".concat(c4, ": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.")); + var r3 = n3; + return this[o2](t3, function(t4, n4) { + r3 = e4(r3, t4, n4); + }), r3; + }; + } + function Kt(t2, e3) { + var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = n2[0].toUpperCase() + n2.slice(1, -1), a3 = "find" + o2; + t2.prototype[a3] = function(t3, e4) { + if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) { + t3 = "" + t3; + var n3 = this._nodes.get(t3); + if (n3 === void 0) + throw new Y2("Graph.".concat(a3, ': could not find the "').concat(t3, '" node in the graph.')); + return function(t4, e6, n4, r3) { + if (t4 !== "mixed") { + if (t4 === "undirected") + return zt(n4, n4.undirected, r3); + if (typeof e6 == "string") + return zt(n4, n4[e6], r3); + } + var i3, o3 = /* @__PURE__ */ new Set(); + if (t4 !== "undirected") { + if (e6 !== "out" && (i3 = Mt(o3, n4, n4.in, r3))) + return i3; + if (e6 !== "in" && (i3 = Mt(o3, n4, n4.out, r3))) + return i3; + } + if (t4 !== "directed" && (i3 = Mt(o3, n4, n4.undirected, r3))) + return i3; + }(r2 === "mixed" ? this.type : r2, i2, n3, e4); + } + }; + var u2 = "some" + o2; + t2.prototype[u2] = function(t3, e4) { + return !!this[a3](t3, e4); + }; + var c4 = "every" + o2; + t2.prototype[c4] = function(t3, e4) { + return !this[a3](t3, function(t4, n3) { + return !e4(t4, n3); + }); + }; + } + function It(t2, e3) { + var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = n2.slice(0, -1) + "Entries"; + t2.prototype[o2] = function(t3) { + if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type) + return O.empty(); + t3 = "" + t3; + var e4 = this._nodes.get(t3); + if (e4 === void 0) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t3, '" node in the graph.')); + return function(t4, e6, n3) { + if (t4 !== "mixed") { + if (t4 === "undirected") + return Pt(n3, n3.undirected); + if (typeof e6 == "string") + return Pt(n3, n3[e6]); + } + var r3 = O.empty(), i3 = /* @__PURE__ */ new Set(); + return t4 !== "undirected" && (e6 !== "out" && (r3 = rt(r3, Tt(i3, n3, n3.in))), e6 !== "in" && (r3 = rt(r3, Tt(i3, n3, n3.out)))), t4 !== "directed" && (r3 = rt(r3, Tt(i3, n3, n3.undirected))), r3; + }(r2 === "mixed" ? this.type : r2, i2, e4); + }; + } + function Ft(t2, e3, n2, r2, i2) { + for (var o2, a3, u2, c4, d2, s2, h2, f2 = r2._nodes.values(), p2 = r2.type; (o2 = f2.next()).done !== true; ) { + var l2 = false; + if (a3 = o2.value, p2 !== "undirected") { + for (u2 in c4 = a3.out) + if (s2 = (d2 = c4[u2]).target, l2 = true, h2 = i2(a3.key, s2.key, a3.attributes, s2.attributes, d2.key, d2.attributes, d2.undirected), t2 && h2) + return d2; + } + if (p2 !== "directed") { + for (u2 in c4 = a3.undirected) + if (!(e3 && a3.key > u2) && ((s2 = (d2 = c4[u2]).target).key !== u2 && (s2 = d2.source), l2 = true, h2 = i2(a3.key, s2.key, a3.attributes, s2.attributes, d2.key, d2.attributes, d2.undirected), t2 && h2)) + return d2; + } + if (n2 && !l2 && (h2 = i2(a3.key, null, a3.attributes, null, null, null, null), t2 && h2)) + return null; + } + } + function Yt(t2, e3, n2, r2, i2) { + for (var o2, a3, u2, c4, d2, s2, h2, f2, p2, l2 = r2._nodes.values(), g2 = r2.type; (o2 = l2.next()).done !== true; ) { + var y5 = false; + if (a3 = o2.value, g2 !== "undirected") { + for (u2 in s2 = a3.out) + for (c4 = s2[u2].values(); (d2 = c4.next()).done !== true; ) + if (f2 = (h2 = d2.value).target, y5 = true, p2 = i2(a3.key, f2.key, a3.attributes, f2.attributes, h2.key, h2.attributes, h2.undirected), t2 && p2) + return h2; + } + if (g2 !== "directed") { + for (u2 in s2 = a3.undirected) + if (!(e3 && a3.key > u2)) { + for (c4 = s2[u2].values(); (d2 = c4.next()).done !== true; ) + if ((f2 = (h2 = d2.value).target).key !== u2 && (f2 = h2.source), y5 = true, p2 = i2(a3.key, f2.key, a3.attributes, f2.attributes, h2.key, h2.attributes, h2.undirected), t2 && p2) + return h2; + } + } + if (n2 && !y5 && (p2 = i2(a3.key, null, a3.attributes, null, null, null, null), t2 && p2)) + return null; + } + } + function Bt(t2, e3) { + var n2 = { key: t2 }; + return f(e3.attributes) || (n2.attributes = c3({}, e3.attributes)), n2; + } + function qt(t2, e3) { + var n2 = { key: t2, source: e3.source.key, target: e3.target.key }; + return f(e3.attributes) || (n2.attributes = c3({}, e3.attributes)), e3.undirected && (n2.undirected = true), n2; + } + function Jt(t2) { + return h(t2) ? "key" in t2 ? !("attributes" in t2) || h(t2.attributes) && t2.attributes !== null ? null : "invalid-attributes" : "no-key" : "not-object"; + } + function Vt(t2) { + return h(t2) ? "source" in t2 ? "target" in t2 ? !("attributes" in t2) || h(t2.attributes) && t2.attributes !== null ? "undirected" in t2 && typeof t2.undirected != "boolean" ? "invalid-undirected" : null : "invalid-attributes" : "no-target" : "no-source" : "not-object"; + } + var Ht, Qt = (Ht = 255 & Math.floor(256 * Math.random()), function() { + return Ht++; + }), Xt = /* @__PURE__ */ new Set(["directed", "undirected", "mixed"]), Zt = /* @__PURE__ */ new Set(["domain", "_events", "_eventsCount", "_maxListeners"]), $t = { allowSelfLoops: true, multi: false, type: "mixed" }; + function te(t2, e3, n2) { + var r2 = new t2.NodeDataClass(e3, n2); + return t2._nodes.set(e3, r2), t2.emit("nodeAdded", { key: e3, attributes: n2 }), r2; + } + function ee(t2, e3, n2, r2, i2, o2, a3, u2) { + if (!r2 && t2.type === "undirected") + throw new B2("Graph.".concat(e3, ": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.")); + if (r2 && t2.type === "directed") + throw new B2("Graph.".concat(e3, ": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.")); + if (u2 && !h(u2)) + throw new F("Graph.".concat(e3, ': invalid attributes. Expecting an object but got "').concat(u2, '"')); + if (o2 = "" + o2, a3 = "" + a3, u2 = u2 || {}, !t2.allowSelfLoops && o2 === a3) + throw new B2("Graph.".concat(e3, ': source & target are the same ("').concat(o2, `"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`)); + var c4 = t2._nodes.get(o2), d2 = t2._nodes.get(a3); + if (!c4) + throw new Y2("Graph.".concat(e3, ': source node "').concat(o2, '" not found.')); + if (!d2) + throw new Y2("Graph.".concat(e3, ': target node "').concat(a3, '" not found.')); + var s2 = { key: null, undirected: r2, source: o2, target: a3, attributes: u2 }; + if (n2) + i2 = t2._edgeKeyGenerator(); + else if (i2 = "" + i2, t2._edges.has(i2)) + throw new B2("Graph.".concat(e3, ': the "').concat(i2, '" edge already exists in the graph.')); + if (!t2.multi && (r2 ? c4.undirected[a3] !== void 0 : c4.out[a3] !== void 0)) + throw new B2("Graph.".concat(e3, ': an edge linking "').concat(o2, '" to "').concat(a3, `" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`)); + var f2 = new H(r2, i2, c4, d2, u2); + return t2._edges.set(i2, f2), o2 === a3 ? r2 ? (c4.undirectedSelfLoops++, t2._undirectedSelfLoopCount++) : (c4.directedSelfLoops++, t2._directedSelfLoopCount++) : r2 ? (c4.undirectedDegree++, d2.undirectedDegree++) : (c4.outDegree++, d2.inDegree++), Q(t2, r2, f2, o2, a3, c4, d2), r2 ? t2._undirectedSize++ : t2._directedSize++, s2.key = i2, t2.emit("edgeAdded", s2), i2; + } + function ne(t2, e3, n2, r2, i2, o2, a3, u2, d2) { + if (!r2 && t2.type === "undirected") + throw new B2("Graph.".concat(e3, ": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.")); + if (r2 && t2.type === "directed") + throw new B2("Graph.".concat(e3, ": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.")); + if (u2) { + if (d2) { + if (typeof u2 != "function") + throw new F("Graph.".concat(e3, ': invalid updater function. Expecting a function but got "').concat(u2, '"')); + } else if (!h(u2)) + throw new F("Graph.".concat(e3, ': invalid attributes. Expecting an object but got "').concat(u2, '"')); + } + var s2; + if (o2 = "" + o2, a3 = "" + a3, d2 && (s2 = u2, u2 = void 0), !t2.allowSelfLoops && o2 === a3) + throw new B2("Graph.".concat(e3, ': source & target are the same ("').concat(o2, `"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`)); + var f2, p2, l2 = t2._nodes.get(o2), g2 = t2._nodes.get(a3); + if (!n2 && (f2 = t2._edges.get(i2))) { + if (f2.source.key !== o2 || f2.target.key !== a3 || r2 && (f2.source.key !== a3 || f2.target.key !== o2)) + throw new B2("Graph.".concat(e3, ': inconsistency detected when attempting to merge the "').concat(i2, '" edge with "').concat(o2, '" source & "').concat(a3, '" target vs. ("').concat(f2.source.key, '", "').concat(f2.target.key, '").')); + p2 = f2; + } + if (p2 || t2.multi || !l2 || (p2 = r2 ? l2.undirected[a3] : l2.out[a3]), p2) { + var y5 = [p2.key, false, false, false]; + if (d2 ? !s2 : !u2) + return y5; + if (d2) { + var v2 = p2.attributes; + p2.attributes = s2(v2), t2.emit("edgeAttributesUpdated", { type: "replace", key: p2.key, attributes: p2.attributes }); + } else + c3(p2.attributes, u2), t2.emit("edgeAttributesUpdated", { type: "merge", key: p2.key, attributes: p2.attributes, data: u2 }); + return y5; + } + u2 = u2 || {}, d2 && s2 && (u2 = s2(u2)); + var b2 = { key: null, undirected: r2, source: o2, target: a3, attributes: u2 }; + if (n2) + i2 = t2._edgeKeyGenerator(); + else if (i2 = "" + i2, t2._edges.has(i2)) + throw new B2("Graph.".concat(e3, ': the "').concat(i2, '" edge already exists in the graph.')); + var w2 = false, m3 = false; + return l2 || (l2 = te(t2, o2, {}), w2 = true, o2 === a3 && (g2 = l2, m3 = true)), g2 || (g2 = te(t2, a3, {}), m3 = true), f2 = new H(r2, i2, l2, g2, u2), t2._edges.set(i2, f2), o2 === a3 ? r2 ? (l2.undirectedSelfLoops++, t2._undirectedSelfLoopCount++) : (l2.directedSelfLoops++, t2._directedSelfLoopCount++) : r2 ? (l2.undirectedDegree++, g2.undirectedDegree++) : (l2.outDegree++, g2.inDegree++), Q(t2, r2, f2, o2, a3, l2, g2), r2 ? t2._undirectedSize++ : t2._directedSize++, b2.key = i2, t2.emit("edgeAdded", b2), [i2, true, w2, m3]; + } + var re2 = function(n2) { + function r2(t2) { + var e3; + if (e3 = n2.call(this) || this, typeof (t2 = c3({}, $t, t2)).multi != "boolean") + throw new F(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "`.concat(t2.multi, '".')); + if (!Xt.has(t2.type)) + throw new F(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "`.concat(t2.type, '".')); + if (typeof t2.allowSelfLoops != "boolean") + throw new F(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "`.concat(t2.allowSelfLoops, '".')); + var r3 = t2.type === "mixed" ? q : t2.type === "directed" ? J : V; + p(u(e3), "NodeDataClass", r3); + var i3 = Qt(), o2 = 0; + return p(u(e3), "_attributes", {}), p(u(e3), "_nodes", /* @__PURE__ */ new Map()), p(u(e3), "_edges", /* @__PURE__ */ new Map()), p(u(e3), "_directedSize", 0), p(u(e3), "_undirectedSize", 0), p(u(e3), "_directedSelfLoopCount", 0), p(u(e3), "_undirectedSelfLoopCount", 0), p(u(e3), "_edgeKeyGenerator", function() { + var t3; + do { + t3 = "geid_" + i3 + "_" + o2++; + } while (e3._edges.has(t3)); + return t3; + }), p(u(e3), "_options", t2), Zt.forEach(function(t3) { + return p(u(e3), t3, e3[t3]); + }), l(u(e3), "order", function() { + return e3._nodes.size; + }), l(u(e3), "size", function() { + return e3._edges.size; + }), l(u(e3), "directedSize", function() { + return e3._directedSize; + }), l(u(e3), "undirectedSize", function() { + return e3._undirectedSize; + }), l(u(e3), "selfLoopCount", function() { + return e3._directedSelfLoopCount + e3._undirectedSelfLoopCount; + }), l(u(e3), "directedSelfLoopCount", function() { + return e3._directedSelfLoopCount; + }), l(u(e3), "undirectedSelfLoopCount", function() { + return e3._undirectedSelfLoopCount; + }), l(u(e3), "multi", e3._options.multi), l(u(e3), "type", e3._options.type), l(u(e3), "allowSelfLoops", e3._options.allowSelfLoops), l(u(e3), "implementation", function() { + return "graphology"; + }), e3; + } + e(r2, n2); + var i2 = r2.prototype; + return i2._resetInstanceCounters = function() { + this._directedSize = 0, this._undirectedSize = 0, this._directedSelfLoopCount = 0, this._undirectedSelfLoopCount = 0; + }, i2.hasNode = function(t2) { + return this._nodes.has("" + t2); + }, i2.hasDirectedEdge = function(t2, e3) { + if (this.type === "undirected") + return false; + if (arguments.length === 1) { + var n3 = "" + t2, r3 = this._edges.get(n3); + return !!r3 && !r3.undirected; + } + if (arguments.length === 2) { + t2 = "" + t2, e3 = "" + e3; + var i3 = this._nodes.get(t2); + if (!i3) + return false; + var o2 = i3.out[e3]; + return !!o2 && (!this.multi || !!o2.size); + } + throw new F("Graph.hasDirectedEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.")); + }, i2.hasUndirectedEdge = function(t2, e3) { + if (this.type === "directed") + return false; + if (arguments.length === 1) { + var n3 = "" + t2, r3 = this._edges.get(n3); + return !!r3 && r3.undirected; + } + if (arguments.length === 2) { + t2 = "" + t2, e3 = "" + e3; + var i3 = this._nodes.get(t2); + if (!i3) + return false; + var o2 = i3.undirected[e3]; + return !!o2 && (!this.multi || !!o2.size); + } + throw new F("Graph.hasDirectedEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.")); + }, i2.hasEdge = function(t2, e3) { + if (arguments.length === 1) { + var n3 = "" + t2; + return this._edges.has(n3); + } + if (arguments.length === 2) { + t2 = "" + t2, e3 = "" + e3; + var r3 = this._nodes.get(t2); + if (!r3) + return false; + var i3 = r3.out !== void 0 && r3.out[e3]; + return i3 || (i3 = r3.undirected !== void 0 && r3.undirected[e3]), !!i3 && (!this.multi || !!i3.size); + } + throw new F("Graph.hasEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.")); + }, i2.directedEdge = function(t2, e3) { + if (this.type !== "undirected") { + if (t2 = "" + t2, e3 = "" + e3, this.multi) + throw new B2("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead."); + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.directedEdge: could not find the "'.concat(t2, '" source node in the graph.')); + if (!this._nodes.has(e3)) + throw new Y2('Graph.directedEdge: could not find the "'.concat(e3, '" target node in the graph.')); + var r3 = n3.out && n3.out[e3] || void 0; + return r3 ? r3.key : void 0; + } + }, i2.undirectedEdge = function(t2, e3) { + if (this.type !== "directed") { + if (t2 = "" + t2, e3 = "" + e3, this.multi) + throw new B2("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead."); + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.undirectedEdge: could not find the "'.concat(t2, '" source node in the graph.')); + if (!this._nodes.has(e3)) + throw new Y2('Graph.undirectedEdge: could not find the "'.concat(e3, '" target node in the graph.')); + var r3 = n3.undirected && n3.undirected[e3] || void 0; + return r3 ? r3.key : void 0; + } + }, i2.edge = function(t2, e3) { + if (this.multi) + throw new B2("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead."); + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.edge: could not find the "'.concat(t2, '" source node in the graph.')); + if (!this._nodes.has(e3)) + throw new Y2('Graph.edge: could not find the "'.concat(e3, '" target node in the graph.')); + var r3 = n3.out && n3.out[e3] || n3.undirected && n3.undirected[e3] || void 0; + if (r3) + return r3.key; + }, i2.areDirectedNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areDirectedNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && (e3 in n3.in || e3 in n3.out); + }, i2.areOutNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areOutNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && e3 in n3.out; + }, i2.areInNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areInNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && e3 in n3.in; + }, i2.areUndirectedNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areUndirectedNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "directed" && e3 in n3.undirected; + }, i2.areNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && (e3 in n3.in || e3 in n3.out) || this.type !== "directed" && e3 in n3.undirected; + }, i2.areInboundNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areInboundNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && e3 in n3.in || this.type !== "directed" && e3 in n3.undirected; + }, i2.areOutboundNeighbors = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.areOutboundNeighbors: could not find the "'.concat(t2, '" node in the graph.')); + return this.type !== "undirected" && e3 in n3.out || this.type !== "directed" && e3 in n3.undirected; + }, i2.inDegree = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.inDegree: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "undirected" ? 0 : e3.inDegree + e3.directedSelfLoops; + }, i2.outDegree = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.outDegree: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "undirected" ? 0 : e3.outDegree + e3.directedSelfLoops; + }, i2.directedDegree = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.directedDegree: could not find the "'.concat(t2, '" node in the graph.')); + if (this.type === "undirected") + return 0; + var n3 = e3.directedSelfLoops; + return e3.inDegree + n3 + (e3.outDegree + n3); + }, i2.undirectedDegree = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.undirectedDegree: could not find the "'.concat(t2, '" node in the graph.')); + if (this.type === "directed") + return 0; + var n3 = e3.undirectedSelfLoops; + return e3.undirectedDegree + 2 * n3; + }, i2.degree = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.degree: could not find the "'.concat(t2, '" node in the graph.')); + var n3 = 0; + return this.type !== "directed" && (n3 += e3.undirectedDegree + 2 * e3.undirectedSelfLoops), this.type !== "undirected" && (n3 += e3.inDegree + e3.outDegree + 2 * e3.directedSelfLoops), n3; + }, i2.inDegreeWithoutSelfLoops = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.inDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "undirected" ? 0 : e3.inDegree; + }, i2.outDegreeWithoutSelfLoops = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.outDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "undirected" ? 0 : e3.outDegree; + }, i2.directedDegreeWithoutSelfLoops = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.directedDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "undirected" ? 0 : e3.inDegree + e3.outDegree; + }, i2.undirectedDegreeWithoutSelfLoops = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.undirectedDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.')); + return this.type === "directed" ? 0 : e3.undirectedDegree; + }, i2.degreeWithoutSelfLoops = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.degreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.')); + var n3 = 0; + return this.type !== "directed" && (n3 += e3.undirectedDegree), this.type !== "undirected" && (n3 += e3.inDegree + e3.outDegree), n3; + }, i2.source = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.source: could not find the "'.concat(t2, '" edge in the graph.')); + return e3.source.key; + }, i2.target = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.target: could not find the "'.concat(t2, '" edge in the graph.')); + return e3.target.key; + }, i2.extremities = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.extremities: could not find the "'.concat(t2, '" edge in the graph.')); + return [e3.source.key, e3.target.key]; + }, i2.opposite = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._edges.get(e3); + if (!n3) + throw new Y2('Graph.opposite: could not find the "'.concat(e3, '" edge in the graph.')); + var r3 = n3.source.key, i3 = n3.target.key; + if (t2 === r3) + return i3; + if (t2 === i3) + return r3; + throw new Y2('Graph.opposite: the "'.concat(t2, '" node is not attached to the "').concat(e3, '" edge (').concat(r3, ", ").concat(i3, ").")); + }, i2.hasExtremity = function(t2, e3) { + t2 = "" + t2, e3 = "" + e3; + var n3 = this._edges.get(t2); + if (!n3) + throw new Y2('Graph.hasExtremity: could not find the "'.concat(t2, '" edge in the graph.')); + return n3.source.key === e3 || n3.target.key === e3; + }, i2.isUndirected = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.isUndirected: could not find the "'.concat(t2, '" edge in the graph.')); + return e3.undirected; + }, i2.isDirected = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.isDirected: could not find the "'.concat(t2, '" edge in the graph.')); + return !e3.undirected; + }, i2.isSelfLoop = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.isSelfLoop: could not find the "'.concat(t2, '" edge in the graph.')); + return e3.source === e3.target; + }, i2.addNode = function(t2, e3) { + var n3 = function(t3, e4, n4) { + if (n4 && !h(n4)) + throw new F('Graph.addNode: invalid attributes. Expecting an object but got "'.concat(n4, '"')); + if (e4 = "" + e4, n4 = n4 || {}, t3._nodes.has(e4)) + throw new B2('Graph.addNode: the "'.concat(e4, '" node already exist in the graph.')); + var r3 = new t3.NodeDataClass(e4, n4); + return t3._nodes.set(e4, r3), t3.emit("nodeAdded", { key: e4, attributes: n4 }), r3; + }(this, t2, e3); + return n3.key; + }, i2.mergeNode = function(t2, e3) { + if (e3 && !h(e3)) + throw new F('Graph.mergeNode: invalid attributes. Expecting an object but got "'.concat(e3, '"')); + t2 = "" + t2, e3 = e3 || {}; + var n3 = this._nodes.get(t2); + return n3 ? (e3 && (c3(n3.attributes, e3), this.emit("nodeAttributesUpdated", { type: "merge", key: t2, attributes: n3.attributes, data: e3 })), [t2, false]) : (n3 = new this.NodeDataClass(t2, e3), this._nodes.set(t2, n3), this.emit("nodeAdded", { key: t2, attributes: e3 }), [t2, true]); + }, i2.updateNode = function(t2, e3) { + if (e3 && typeof e3 != "function") + throw new F('Graph.updateNode: invalid updater function. Expecting a function but got "'.concat(e3, '"')); + t2 = "" + t2; + var n3 = this._nodes.get(t2); + if (n3) { + if (e3) { + var r3 = n3.attributes; + n3.attributes = e3(r3), this.emit("nodeAttributesUpdated", { type: "replace", key: t2, attributes: n3.attributes }); + } + return [t2, false]; + } + var i3 = e3 ? e3({}) : {}; + return n3 = new this.NodeDataClass(t2, i3), this._nodes.set(t2, n3), this.emit("nodeAdded", { key: t2, attributes: i3 }), [t2, true]; + }, i2.dropNode = function(t2) { + var e3 = this; + t2 = "" + t2; + var n3 = this._nodes.get(t2); + if (!n3) + throw new Y2('Graph.dropNode: could not find the "'.concat(t2, '" node in the graph.')); + this.forEachEdge(t2, function(t3) { + e3.dropEdge(t3); + }), this._nodes.delete(t2), this.emit("nodeDropped", { key: t2, attributes: n3.attributes }); + }, i2.dropEdge = function(t2) { + var e3; + if (arguments.length > 1) { + var n3 = "" + arguments[0], r3 = "" + arguments[1]; + if (!(e3 = d(this, n3, r3, this.type))) + throw new Y2('Graph.dropEdge: could not find the "'.concat(n3, '" -> "').concat(r3, '" edge in the graph.')); + } else if (t2 = "" + t2, !(e3 = this._edges.get(t2))) + throw new Y2('Graph.dropEdge: could not find the "'.concat(t2, '" edge in the graph.')); + this._edges.delete(e3.key); + var i3 = e3, o2 = i3.source, a3 = i3.target, u2 = i3.attributes, c4 = e3.undirected; + return o2 === a3 ? c4 ? (o2.undirectedSelfLoops--, this._undirectedSelfLoopCount--) : (o2.directedSelfLoops--, this._directedSelfLoopCount--) : c4 ? (o2.undirectedDegree--, a3.undirectedDegree--) : (o2.outDegree--, a3.inDegree--), X2(this, c4, e3), c4 ? this._undirectedSize-- : this._directedSize--, this.emit("edgeDropped", { key: t2, attributes: u2, source: o2.key, target: a3.key, undirected: c4 }), this; + }, i2.clear = function() { + this._edges.clear(), this._nodes.clear(), this._resetInstanceCounters(), this.emit("cleared"); + }, i2.clearEdges = function() { + !function(t2) { + for (var e3, n3 = t2._nodes.values(); (e3 = n3.next()).done !== true; ) + e3.value.clear(); + }(this), this._edges.clear(), this._resetInstanceCounters(), this.emit("edgesCleared"); + }, i2.getAttribute = function(t2) { + return this._attributes[t2]; + }, i2.getAttributes = function() { + return this._attributes; + }, i2.hasAttribute = function(t2) { + return this._attributes.hasOwnProperty(t2); + }, i2.setAttribute = function(t2, e3) { + return this._attributes[t2] = e3, this.emit("attributesUpdated", { type: "set", attributes: this._attributes, name: t2 }), this; + }, i2.updateAttribute = function(t2, e3) { + if (typeof e3 != "function") + throw new F("Graph.updateAttribute: updater should be a function."); + var n3 = this._attributes[t2]; + return this._attributes[t2] = e3(n3), this.emit("attributesUpdated", { type: "set", attributes: this._attributes, name: t2 }), this; + }, i2.removeAttribute = function(t2) { + return delete this._attributes[t2], this.emit("attributesUpdated", { type: "remove", attributes: this._attributes, name: t2 }), this; + }, i2.replaceAttributes = function(t2) { + if (!h(t2)) + throw new F("Graph.replaceAttributes: provided attributes are not a plain object."); + return this._attributes = t2, this.emit("attributesUpdated", { type: "replace", attributes: this._attributes }), this; + }, i2.mergeAttributes = function(t2) { + if (!h(t2)) + throw new F("Graph.mergeAttributes: provided attributes are not a plain object."); + return c3(this._attributes, t2), this.emit("attributesUpdated", { type: "merge", attributes: this._attributes, data: t2 }), this; + }, i2.updateAttributes = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.updateAttributes: provided updater is not a function."); + return this._attributes = t2(this._attributes), this.emit("attributesUpdated", { type: "update", attributes: this._attributes }), this; + }, i2.updateEachNodeAttributes = function(t2, e3) { + if (typeof t2 != "function") + throw new F("Graph.updateEachNodeAttributes: expecting an updater function."); + if (e3 && !g(e3)) + throw new F("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}"); + for (var n3, r3, i3 = this._nodes.values(); (n3 = i3.next()).done !== true; ) + (r3 = n3.value).attributes = t2(r3.key, r3.attributes); + this.emit("eachNodeAttributesUpdated", { hints: e3 || null }); + }, i2.updateEachEdgeAttributes = function(t2, e3) { + if (typeof t2 != "function") + throw new F("Graph.updateEachEdgeAttributes: expecting an updater function."); + if (e3 && !g(e3)) + throw new F("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}"); + for (var n3, r3, i3, o2, a3 = this._edges.values(); (n3 = a3.next()).done !== true; ) + i3 = (r3 = n3.value).source, o2 = r3.target, r3.attributes = t2(r3.key, r3.attributes, i3.key, o2.key, i3.attributes, o2.attributes, r3.undirected); + this.emit("eachEdgeAttributesUpdated", { hints: e3 || null }); + }, i2.forEachAdjacencyEntry = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.forEachAdjacencyEntry: expecting a callback."); + this.multi ? Yt(false, false, false, this, t2) : Ft(false, false, false, this, t2); + }, i2.forEachAdjacencyEntryWithOrphans = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback."); + this.multi ? Yt(false, false, true, this, t2) : Ft(false, false, true, this, t2); + }, i2.forEachAssymetricAdjacencyEntry = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.forEachAssymetricAdjacencyEntry: expecting a callback."); + this.multi ? Yt(false, true, false, this, t2) : Ft(false, true, false, this, t2); + }, i2.forEachAssymetricAdjacencyEntryWithOrphans = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback."); + this.multi ? Yt(false, true, true, this, t2) : Ft(false, true, true, this, t2); + }, i2.nodes = function() { + return typeof Array.from == "function" ? Array.from(this._nodes.keys()) : K(this._nodes.keys(), this._nodes.size); + }, i2.forEachNode = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.forEachNode: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; ) + t2((n3 = e3.value).key, n3.attributes); + }, i2.findNode = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.findNode: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; ) + if (t2((n3 = e3.value).key, n3.attributes)) + return n3.key; + }, i2.mapNodes = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.mapNode: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(), i3 = new Array(this.order), o2 = 0; (e3 = r3.next()).done !== true; ) + n3 = e3.value, i3[o2++] = t2(n3.key, n3.attributes); + return i3; + }, i2.someNode = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.someNode: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; ) + if (t2((n3 = e3.value).key, n3.attributes)) + return true; + return false; + }, i2.everyNode = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.everyNode: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; ) + if (!t2((n3 = e3.value).key, n3.attributes)) + return false; + return true; + }, i2.filterNodes = function(t2) { + if (typeof t2 != "function") + throw new F("Graph.filterNodes: expecting a callback."); + for (var e3, n3, r3 = this._nodes.values(), i3 = []; (e3 = r3.next()).done !== true; ) + t2((n3 = e3.value).key, n3.attributes) && i3.push(n3.key); + return i3; + }, i2.reduceNodes = function(t2, e3) { + if (typeof t2 != "function") + throw new F("Graph.reduceNodes: expecting a callback."); + if (arguments.length < 2) + throw new F("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array."); + for (var n3, r3, i3 = e3, o2 = this._nodes.values(); (n3 = o2.next()).done !== true; ) + i3 = t2(i3, (r3 = n3.value).key, r3.attributes); + return i3; + }, i2.nodeEntries = function() { + var t2 = this._nodes.values(); + return new O(function() { + var e3 = t2.next(); + if (e3.done) + return e3; + var n3 = e3.value; + return { value: { node: n3.key, attributes: n3.attributes }, done: false }; + }); + }, i2.exportNode = function(t2) { + t2 = "" + t2; + var e3 = this._nodes.get(t2); + if (!e3) + throw new Y2('Graph.exportNode: could not find the "'.concat(t2, '" node in the graph.')); + return Bt(t2, e3); + }, i2.exportEdge = function(t2) { + t2 = "" + t2; + var e3 = this._edges.get(t2); + if (!e3) + throw new Y2('Graph.exportEdge: could not find the "'.concat(t2, '" edge in the graph.')); + return qt(t2, e3); + }, i2.export = function() { + var t2 = new Array(this._nodes.size), e3 = 0; + this._nodes.forEach(function(n4, r3) { + t2[e3++] = Bt(r3, n4); + }); + var n3 = new Array(this._edges.size); + return e3 = 0, this._edges.forEach(function(t3, r3) { + n3[e3++] = qt(r3, t3); + }), { attributes: this.getAttributes(), nodes: t2, edges: n3, options: { type: this.type, multi: this.multi, allowSelfLoops: this.allowSelfLoops } }; + }, i2.importNode = function(t2) { + var e3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], n3 = Jt(t2); + if (n3) { + if (n3 === "not-object") + throw new F('Graph.importNode: invalid serialized node. A serialized node should be a plain object with at least a "key" property.'); + if (n3 === "no-key") + throw new F("Graph.importNode: no key provided."); + if (n3 === "invalid-attributes") + throw new F("Graph.importNode: invalid attributes. Attributes should be a plain object, null or omitted."); + } + var r3 = t2.key, i3 = t2.attributes, o2 = i3 === void 0 ? {} : i3; + return e3 ? this.mergeNode(r3, o2) : this.addNode(r3, o2), this; + }, i2.importEdge = function(t2) { + var e3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], n3 = Vt(t2); + if (n3) { + if (n3 === "not-object") + throw new F('Graph.importEdge: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.'); + if (n3 === "no-source") + throw new F("Graph.importEdge: missing souce."); + if (n3 === "no-target") + throw new F("Graph.importEdge: missing target."); + if (n3 === "invalid-attributes") + throw new F("Graph.importEdge: invalid attributes. Attributes should be a plain object, null or omitted."); + if (n3 === "invalid-undirected") + throw new F("Graph.importEdge: invalid undirected. Undirected should be boolean or omitted."); + } + var r3 = t2.source, i3 = t2.target, o2 = t2.attributes, a3 = o2 === void 0 ? {} : o2, u2 = t2.undirected, c4 = u2 !== void 0 && u2; + return "key" in t2 ? (e3 ? c4 ? this.mergeUndirectedEdgeWithKey : this.mergeDirectedEdgeWithKey : c4 ? this.addUndirectedEdgeWithKey : this.addDirectedEdgeWithKey).call(this, t2.key, r3, i3, a3) : (e3 ? c4 ? this.mergeUndirectedEdge : this.mergeDirectedEdge : c4 ? this.addUndirectedEdge : this.addDirectedEdge).call(this, r3, i3, a3), this; + }, i2.import = function(t2) { + var e3, n3, r3, i3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1]; + if (s(t2)) + return this.import(t2.export(), i3), this; + if (!h(t2)) + throw new F("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance."); + if (t2.attributes) { + if (!h(t2.attributes)) + throw new F("Graph.import: invalid attributes. Expecting a plain object."); + i3 ? this.mergeAttributes(t2.attributes) : this.replaceAttributes(t2.attributes); + } + if (t2.nodes) { + if (r3 = t2.nodes, !Array.isArray(r3)) + throw new F("Graph.import: invalid nodes. Expecting an array."); + for (e3 = 0, n3 = r3.length; e3 < n3; e3++) + this.importNode(r3[e3], i3); + } + if (t2.edges) { + if (r3 = t2.edges, !Array.isArray(r3)) + throw new F("Graph.import: invalid edges. Expecting an array."); + for (e3 = 0, n3 = r3.length; e3 < n3; e3++) + this.importEdge(r3[e3], i3); + } + return this; + }, i2.nullCopy = function(t2) { + var e3 = new r2(c3({}, this._options, t2)); + return e3.replaceAttributes(c3({}, this.getAttributes())), e3; + }, i2.emptyCopy = function(t2) { + var e3 = this.nullCopy(t2); + return this._nodes.forEach(function(t3, n3) { + var r3 = c3({}, t3.attributes); + t3 = new e3.NodeDataClass(n3, r3), e3._nodes.set(n3, t3); + }), e3; + }, i2.copy = function() { + for (var t2, e3, n3 = this.emptyCopy(), r3 = this._edges.values(); (t2 = r3.next()).done !== true; ) + ee(n3, "copy", false, (e3 = t2.value).undirected, e3.key, e3.source.key, e3.target.key, c3({}, e3.attributes)); + return n3; + }, i2.upgradeToMixed = function() { + return this.type === "mixed" || (this._nodes.forEach(function(t2) { + return t2.upgradeToMixed(); + }), this._options.type = "mixed", l(this, "type", this._options.type), p(this, "NodeDataClass", q)), this; + }, i2.upgradeToMulti = function() { + return this.multi || (this._options.multi = true, l(this, "multi", true), (t2 = this)._nodes.forEach(function(e3, n3) { + if (e3.out) + for (var r3 in e3.out) { + var i3 = /* @__PURE__ */ new Set(); + i3.add(e3.out[r3]), e3.out[r3] = i3, t2._nodes.get(r3).in[n3] = i3; + } + if (e3.undirected) { + for (var o2 in e3.undirected) + if (!(o2 > n3)) { + var a3 = /* @__PURE__ */ new Set(); + a3.add(e3.undirected[o2]), e3.undirected[o2] = a3, t2._nodes.get(o2).undirected[n3] = a3; + } + } + })), this; + var t2; + }, i2.toJSON = function() { + return this.export(); + }, i2.toString = function() { + return "[object Graph]"; + }, i2.inspect = function() { + var e3 = this, n3 = {}; + this._nodes.forEach(function(t2, e4) { + n3[e4] = t2.attributes; + }); + var r3 = {}, i3 = {}; + this._edges.forEach(function(t2, n4) { + var o3, a4 = t2.undirected ? "--" : "->", u2 = "", c4 = t2.source.key, d2 = t2.target.key; + t2.undirected && c4 > d2 && (o3 = c4, c4 = d2, d2 = o3); + var s2 = "(".concat(c4, ")").concat(a4, "(").concat(d2, ")"); + n4.startsWith("geid_") ? e3.multi && (i3[s2] === void 0 ? i3[s2] = 0 : i3[s2]++, u2 += "".concat(i3[s2], ". ")) : u2 += "[".concat(n4, "]: "), r3[u2 += s2] = t2.attributes; + }); + var o2 = {}; + for (var a3 in this) + this.hasOwnProperty(a3) && !Zt.has(a3) && typeof this[a3] != "function" && t(a3) !== "symbol" && (o2[a3] = this[a3]); + return o2.attributes = this._attributes, o2.nodes = n3, o2.edges = r3, p(o2, "constructor", this.constructor), o2; + }, r2; + }(v.exports.EventEmitter); + typeof Symbol != "undefined" && (re2.prototype[Symbol.for("nodejs.util.inspect.custom")] = re2.prototype.inspect), [{ name: function(t2) { + return "".concat(t2, "Edge"); + }, generateKey: true }, { name: function(t2) { + return "".concat(t2, "DirectedEdge"); + }, generateKey: true, type: "directed" }, { name: function(t2) { + return "".concat(t2, "UndirectedEdge"); + }, generateKey: true, type: "undirected" }, { name: function(t2) { + return "".concat(t2, "EdgeWithKey"); + } }, { name: function(t2) { + return "".concat(t2, "DirectedEdgeWithKey"); + }, type: "directed" }, { name: function(t2) { + return "".concat(t2, "UndirectedEdgeWithKey"); + }, type: "undirected" }].forEach(function(t2) { + ["add", "merge", "update"].forEach(function(e3) { + var n2 = t2.name(e3), r2 = e3 === "add" ? ee : ne; + t2.generateKey ? re2.prototype[n2] = function(i2, o2, a3) { + return r2(this, n2, true, (t2.type || this.type) === "undirected", null, i2, o2, a3, e3 === "update"); + } : re2.prototype[n2] = function(i2, o2, a3, u2) { + return r2(this, n2, false, (t2.type || this.type) === "undirected", i2, o2, a3, u2, e3 === "update"); + }; + }); + }), function(t2) { + $.forEach(function(e3) { + var n2 = e3.name, r2 = e3.attacher; + r2(t2, n2("Node"), 0), r2(t2, n2("Source"), 1), r2(t2, n2("Target"), 2), r2(t2, n2("Opposite"), 3); + }); + }(re2), function(t2) { + tt.forEach(function(e3) { + var n2 = e3.name, r2 = e3.attacher; + r2(t2, n2("Edge"), "mixed"), r2(t2, n2("DirectedEdge"), "directed"), r2(t2, n2("UndirectedEdge"), "undirected"); + }); + }(re2), function(t2) { + it.forEach(function(e3) { + !function(t3, e4) { + var n2 = e4.name, r2 = e4.type, i2 = e4.direction; + t3.prototype[n2] = function(t4, e6) { + if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type) + return []; + if (!arguments.length) + return wt(this, r2); + if (arguments.length === 1) { + t4 = "" + t4; + var o2 = this._nodes.get(t4); + if (o2 === void 0) + throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t4, '" node in the graph.')); + return Gt(this.multi, r2 === "mixed" ? this.type : r2, i2, o2); + } + if (arguments.length === 2) { + t4 = "" + t4, e6 = "" + e6; + var a3 = this._nodes.get(t4); + if (!a3) + throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t4, '" source node in the graph.')); + if (!this._nodes.has(e6)) + throw new Y2("Graph.".concat(n2, ': could not find the "').concat(e6, '" target node in the graph.')); + return At(r2, this.multi, i2, a3, e6); + } + throw new F("Graph.".concat(n2, ": too many arguments (expecting 0, 1 or 2 and got ").concat(arguments.length, ").")); + }; + }(t2, e3), function(t3, e4) { + var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = "forEach" + n2[0].toUpperCase() + n2.slice(1, -1); + t3.prototype[o2] = function(t4, e6, n3) { + if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) { + if (arguments.length === 1) + return mt(this, r2, n3 = t4); + if (arguments.length === 2) { + t4 = "" + t4, n3 = e6; + var a4 = this._nodes.get(t4); + if (a4 === void 0) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.')); + return xt(this.multi, r2 === "mixed" ? this.type : r2, i2, a4, n3); + } + if (arguments.length === 3) { + t4 = "" + t4, e6 = "" + e6; + var u3 = this._nodes.get(t4); + if (!u3) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.')); + if (!this._nodes.has(e6)) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.')); + return Lt(r2, this.multi, i2, u3, e6, n3); + } + throw new F("Graph.".concat(o2, ": too many arguments (expecting 1, 2 or 3 and got ").concat(arguments.length, ").")); + } + }; + var a3 = "map" + n2[0].toUpperCase() + n2.slice(1); + t3.prototype[a3] = function() { + var t4, e6 = Array.prototype.slice.call(arguments), n3 = e6.pop(); + if (e6.length === 0) { + var i3 = 0; + r2 !== "directed" && (i3 += this.undirectedSize), r2 !== "undirected" && (i3 += this.directedSize), t4 = new Array(i3); + var a4 = 0; + e6.push(function(e7, r3, i4, o3, u3, c5, d2) { + t4[a4++] = n3(e7, r3, i4, o3, u3, c5, d2); + }); + } else + t4 = [], e6.push(function(e7, r3, i4, o3, a5, u3, c5) { + t4.push(n3(e7, r3, i4, o3, a5, u3, c5)); + }); + return this[o2].apply(this, e6), t4; + }; + var u2 = "filter" + n2[0].toUpperCase() + n2.slice(1); + t3.prototype[u2] = function() { + var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop(), n3 = []; + return t4.push(function(t5, r3, i3, o3, a4, u3, c5) { + e6(t5, r3, i3, o3, a4, u3, c5) && n3.push(t5); + }), this[o2].apply(this, t4), n3; + }; + var c4 = "reduce" + n2[0].toUpperCase() + n2.slice(1); + t3.prototype[c4] = function() { + var t4, e6, n3 = Array.prototype.slice.call(arguments); + if (n3.length < 2 || n3.length > 4) + throw new F("Graph.".concat(c4, ": invalid number of arguments (expecting 2, 3 or 4 and got ").concat(n3.length, ").")); + if (typeof n3[n3.length - 1] == "function" && typeof n3[n3.length - 2] != "function") + throw new F("Graph.".concat(c4, ": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.")); + n3.length === 2 ? (t4 = n3[0], e6 = n3[1], n3 = []) : n3.length === 3 ? (t4 = n3[1], e6 = n3[2], n3 = [n3[0]]) : n3.length === 4 && (t4 = n3[2], e6 = n3[3], n3 = [n3[0], n3[1]]); + var r3 = e6; + return n3.push(function(e7, n4, i3, o3, a4, u3, c5) { + r3 = t4(r3, e7, n4, i3, o3, a4, u3, c5); + }), this[o2].apply(this, n3), r3; + }; + }(t2, e3), function(t3, e4) { + var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = "find" + n2[0].toUpperCase() + n2.slice(1, -1); + t3.prototype[o2] = function(t4, e6, n3) { + if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type) + return false; + if (arguments.length === 1) + return _t(this, r2, n3 = t4); + if (arguments.length === 2) { + t4 = "" + t4, n3 = e6; + var a4 = this._nodes.get(t4); + if (a4 === void 0) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.')); + return Et(this.multi, r2 === "mixed" ? this.type : r2, i2, a4, n3); + } + if (arguments.length === 3) { + t4 = "" + t4, e6 = "" + e6; + var u3 = this._nodes.get(t4); + if (!u3) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.')); + if (!this._nodes.has(e6)) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.')); + return Dt(r2, this.multi, i2, u3, e6, n3); + } + throw new F("Graph.".concat(o2, ": too many arguments (expecting 1, 2 or 3 and got ").concat(arguments.length, ").")); + }; + var a3 = "some" + n2[0].toUpperCase() + n2.slice(1, -1); + t3.prototype[a3] = function() { + var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop(); + return t4.push(function(t5, n3, r3, i3, o3, a4, u3) { + return e6(t5, n3, r3, i3, o3, a4, u3); + }), !!this[o2].apply(this, t4); + }; + var u2 = "every" + n2[0].toUpperCase() + n2.slice(1, -1); + t3.prototype[u2] = function() { + var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop(); + return t4.push(function(t5, n3, r3, i3, o3, a4, u3) { + return !e6(t5, n3, r3, i3, o3, a4, u3); + }), !this[o2].apply(this, t4); + }; + }(t2, e3), function(t3, e4) { + var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = n2.slice(0, -1) + "Entries"; + t3.prototype[o2] = function(t4, e6) { + if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type) + return O.empty(); + if (!arguments.length) + return kt(this, r2); + if (arguments.length === 1) { + t4 = "" + t4; + var n3 = this._nodes.get(t4); + if (!n3) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.')); + return St(r2, i2, n3); + } + if (arguments.length === 2) { + t4 = "" + t4, e6 = "" + e6; + var a3 = this._nodes.get(t4); + if (!a3) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.')); + if (!this._nodes.has(e6)) + throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.')); + return Nt(r2, i2, a3, e6); + } + throw new F("Graph.".concat(o2, ": too many arguments (expecting 0, 1 or 2 and got ").concat(arguments.length, ").")); + }; + }(t2, e3); + }); + }(re2), function(t2) { + Ut.forEach(function(e3) { + Rt(t2, e3), Wt(t2, e3), Kt(t2, e3), It(t2, e3); + }); + }(re2); + var ie = function(t2) { + function n2(e3) { + var n3 = c3({ type: "directed" }, e3); + if ("multi" in n3 && n3.multi !== false) + throw new F("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!"); + if (n3.type !== "directed") + throw new F('DirectedGraph.from: inconsistent "' + n3.type + '" type in given options!'); + return t2.call(this, n3) || this; + } + return e(n2, t2), n2; + }(re2), oe = function(t2) { + function n2(e3) { + var n3 = c3({ type: "undirected" }, e3); + if ("multi" in n3 && n3.multi !== false) + throw new F("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!"); + if (n3.type !== "undirected") + throw new F('UndirectedGraph.from: inconsistent "' + n3.type + '" type in given options!'); + return t2.call(this, n3) || this; + } + return e(n2, t2), n2; + }(re2), ae = function(t2) { + function n2(e3) { + var n3 = c3({ multi: true }, e3); + if ("multi" in n3 && n3.multi !== true) + throw new F("MultiGraph.from: inconsistent indication that the graph should be simple in given options!"); + return t2.call(this, n3) || this; + } + return e(n2, t2), n2; + }(re2), ue = function(t2) { + function n2(e3) { + var n3 = c3({ type: "directed", multi: true }, e3); + if ("multi" in n3 && n3.multi !== true) + throw new F("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!"); + if (n3.type !== "directed") + throw new F('MultiDirectedGraph.from: inconsistent "' + n3.type + '" type in given options!'); + return t2.call(this, n3) || this; + } + return e(n2, t2), n2; + }(re2), ce = function(t2) { + function n2(e3) { + var n3 = c3({ type: "undirected", multi: true }, e3); + if ("multi" in n3 && n3.multi !== true) + throw new F("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!"); + if (n3.type !== "undirected") + throw new F('MultiUndirectedGraph.from: inconsistent "' + n3.type + '" type in given options!'); + return t2.call(this, n3) || this; + } + return e(n2, t2), n2; + }(re2); + function de(t2) { + t2.from = function(e3, n2) { + var r2 = c3({}, e3.options, n2), i2 = new t2(r2); + return i2.import(e3), i2; + }; + } + return de(re2), de(ie), de(oe), de(ae), de(ue), de(ce), re2.Graph = re2, re2.DirectedGraph = ie, re2.UndirectedGraph = oe, re2.MultiGraph = ae, re2.MultiDirectedGraph = ue, re2.MultiUndirectedGraph = ce, re2.InvalidArgumentsGraphError = F, re2.NotFoundGraphError = Y2, re2.UsageGraphError = B2, re2; + }); + } +}); + +// node_modules/graphology-utils/is-graph.js +var require_is_graph = __commonJS({ + "node_modules/graphology-utils/is-graph.js"(exports, module2) { + module2.exports = function isGraph(value) { + return value !== null && typeof value === "object" && typeof value.addUndirectedEdgeWithKey === "function" && typeof value.dropNode === "function" && typeof value.multi === "boolean"; + }; + } +}); + +// node_modules/obliterator/support.js +var require_support = __commonJS({ + "node_modules/obliterator/support.js"(exports) { + exports.ARRAY_BUFFER_SUPPORT = typeof ArrayBuffer !== "undefined"; + exports.SYMBOL_SUPPORT = typeof Symbol !== "undefined"; + } +}); + +// node_modules/obliterator/foreach.js +var require_foreach = __commonJS({ + "node_modules/obliterator/foreach.js"(exports, module2) { + var support = require_support(); + var ARRAY_BUFFER_SUPPORT = support.ARRAY_BUFFER_SUPPORT; + var SYMBOL_SUPPORT = support.SYMBOL_SUPPORT; + module2.exports = function forEach(iterable, callback) { + var iterator, k, i, l, s; + if (!iterable) + throw new Error("obliterator/forEach: invalid iterable."); + if (typeof callback !== "function") + throw new Error("obliterator/forEach: expecting a callback."); + if (Array.isArray(iterable) || ARRAY_BUFFER_SUPPORT && ArrayBuffer.isView(iterable) || typeof iterable === "string" || iterable.toString() === "[object Arguments]") { + for (i = 0, l = iterable.length; i < l; i++) + callback(iterable[i], i); + return; + } + if (typeof iterable.forEach === "function") { + iterable.forEach(callback); + return; + } + if (SYMBOL_SUPPORT && Symbol.iterator in iterable && typeof iterable.next !== "function") { + iterable = iterable[Symbol.iterator](); + } + if (typeof iterable.next === "function") { + iterator = iterable; + i = 0; + while (s = iterator.next(), s.done !== true) { + callback(s.value, i); + i++; + } + return; + } + for (k in iterable) { + if (iterable.hasOwnProperty(k)) { + callback(iterable[k], k); + } + } + return; + }; + } +}); + +// node_modules/mnemonist/utils/typed-arrays.js +var require_typed_arrays = __commonJS({ + "node_modules/mnemonist/utils/typed-arrays.js"(exports) { + var MAX_8BIT_INTEGER = Math.pow(2, 8) - 1; + var MAX_16BIT_INTEGER = Math.pow(2, 16) - 1; + var MAX_32BIT_INTEGER = Math.pow(2, 32) - 1; + var MAX_SIGNED_8BIT_INTEGER = Math.pow(2, 7) - 1; + var MAX_SIGNED_16BIT_INTEGER = Math.pow(2, 15) - 1; + var MAX_SIGNED_32BIT_INTEGER = Math.pow(2, 31) - 1; + exports.getPointerArray = function(size) { + var maxIndex = size - 1; + if (maxIndex <= MAX_8BIT_INTEGER) + return Uint8Array; + if (maxIndex <= MAX_16BIT_INTEGER) + return Uint16Array; + if (maxIndex <= MAX_32BIT_INTEGER) + return Uint32Array; + throw new Error("mnemonist: Pointer Array of size > 4294967295 is not supported."); + }; + exports.getSignedPointerArray = function(size) { + var maxIndex = size - 1; + if (maxIndex <= MAX_SIGNED_8BIT_INTEGER) + return Int8Array; + if (maxIndex <= MAX_SIGNED_16BIT_INTEGER) + return Int16Array; + if (maxIndex <= MAX_SIGNED_32BIT_INTEGER) + return Int32Array; + return Float64Array; + }; + exports.getNumberType = function(value) { + if (value === (value | 0)) { + if (Math.sign(value) === -1) { + if (value <= 127 && value >= -128) + return Int8Array; + if (value <= 32767 && value >= -32768) + return Int16Array; + return Int32Array; + } else { + if (value <= 255) + return Uint8Array; + if (value <= 65535) + return Uint16Array; + return Uint32Array; + } + } + return Float64Array; + }; + var TYPE_PRIORITY = { + Uint8Array: 1, + Int8Array: 2, + Uint16Array: 3, + Int16Array: 4, + Uint32Array: 5, + Int32Array: 6, + Float32Array: 7, + Float64Array: 8 + }; + exports.getMinimalRepresentation = function(array, getter) { + var maxType = null, maxPriority = 0, p, t, v, i, l; + for (i = 0, l = array.length; i < l; i++) { + v = getter ? getter(array[i]) : array[i]; + t = exports.getNumberType(v); + p = TYPE_PRIORITY[t.name]; + if (p > maxPriority) { + maxPriority = p; + maxType = t; + } + } + return maxType; + }; + exports.isTypedArray = function(value) { + return typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value); + }; + exports.concat = function() { + var length = 0, i, o, l; + for (i = 0, l = arguments.length; i < l; i++) + length += arguments[i].length; + var array = new arguments[0].constructor(length); + for (i = 0, o = 0; i < l; i++) { + array.set(arguments[i], o); + o += arguments[i].length; + } + return array; + }; + exports.indices = function(length) { + var PointerArray = exports.getPointerArray(length); + var array = new PointerArray(length); + for (var i = 0; i < length; i++) + array[i] = i; + return array; + }; + } +}); + +// node_modules/mnemonist/utils/iterables.js +var require_iterables = __commonJS({ + "node_modules/mnemonist/utils/iterables.js"(exports) { + var forEach = require_foreach(); + var typed = require_typed_arrays(); + function isArrayLike(target) { + return Array.isArray(target) || typed.isTypedArray(target); + } + function guessLength(target) { + if (typeof target.length === "number") + return target.length; + if (typeof target.size === "number") + return target.size; + return; + } + function toArray(target) { + var l = guessLength(target); + var array = typeof l === "number" ? new Array(l) : []; + var i = 0; + forEach(target, function(value) { + array[i++] = value; + }); + return array; + } + function toArrayWithIndices(target) { + var l = guessLength(target); + var IndexArray = typeof l === "number" ? typed.getPointerArray(l) : Array; + var array = typeof l === "number" ? new Array(l) : []; + var indices = typeof l === "number" ? new IndexArray(l) : []; + var i = 0; + forEach(target, function(value) { + array[i] = value; + indices[i] = i++; + }); + return [array, indices]; + } + exports.isArrayLike = isArrayLike; + exports.guessLength = guessLength; + exports.toArray = toArray; + exports.toArrayWithIndices = toArrayWithIndices; + } +}); + +// node_modules/obliterator/iterator.js +var require_iterator = __commonJS({ + "node_modules/obliterator/iterator.js"(exports, module2) { + function Iterator(next) { + if (typeof next !== "function") + throw new Error("obliterator/iterator: expecting a function!"); + this.next = next; + } + if (typeof Symbol !== "undefined") + Iterator.prototype[Symbol.iterator] = function() { + return this; + }; + Iterator.of = function() { + var args = arguments, l = args.length, i = 0; + return new Iterator(function() { + if (i >= l) + return { done: true }; + return { done: false, value: args[i++] }; + }); + }; + Iterator.empty = function() { + var iterator = new Iterator(function() { + return { done: true }; + }); + return iterator; + }; + Iterator.fromSequence = function(sequence) { + var i = 0, l = sequence.length; + return new Iterator(function() { + if (i >= l) + return { done: true }; + return { done: false, value: sequence[i++] }; + }); + }; + Iterator.is = function(value) { + if (value instanceof Iterator) + return true; + return typeof value === "object" && value !== null && typeof value.next === "function"; + }; + module2.exports = Iterator; + } +}); + +// node_modules/mnemonist/fixed-deque.js +var require_fixed_deque = __commonJS({ + "node_modules/mnemonist/fixed-deque.js"(exports, module2) { + var iterables = require_iterables(); + var Iterator = require_iterator(); + function FixedDeque(ArrayClass, capacity) { + if (arguments.length < 2) + throw new Error("mnemonist/fixed-deque: expecting an Array class and a capacity."); + if (typeof capacity !== "number" || capacity <= 0) + throw new Error("mnemonist/fixed-deque: `capacity` should be a positive number."); + this.ArrayClass = ArrayClass; + this.capacity = capacity; + this.items = new ArrayClass(this.capacity); + this.clear(); + } + FixedDeque.prototype.clear = function() { + this.start = 0; + this.size = 0; + }; + FixedDeque.prototype.push = function(item) { + if (this.size === this.capacity) + throw new Error("mnemonist/fixed-deque.push: deque capacity (" + this.capacity + ") exceeded!"); + var index2 = (this.start + this.size) % this.capacity; + this.items[index2] = item; + return ++this.size; + }; + FixedDeque.prototype.unshift = function(item) { + if (this.size === this.capacity) + throw new Error("mnemonist/fixed-deque.unshift: deque capacity (" + this.capacity + ") exceeded!"); + var index2 = this.start - 1; + if (this.start === 0) + index2 = this.capacity - 1; + this.items[index2] = item; + this.start = index2; + return ++this.size; + }; + FixedDeque.prototype.pop = function() { + if (this.size === 0) + return; + const index2 = (this.start + this.size - 1) % this.capacity; + this.size--; + return this.items[index2]; + }; + FixedDeque.prototype.shift = function() { + if (this.size === 0) + return; + var index2 = this.start; + this.size--; + this.start++; + if (this.start === this.capacity) + this.start = 0; + return this.items[index2]; + }; + FixedDeque.prototype.peekFirst = function() { + if (this.size === 0) + return; + return this.items[this.start]; + }; + FixedDeque.prototype.peekLast = function() { + if (this.size === 0) + return; + var index2 = this.start + this.size - 1; + if (index2 > this.capacity) + index2 -= this.capacity; + return this.items[index2]; + }; + FixedDeque.prototype.get = function(index2) { + if (this.size === 0) + return; + index2 = this.start + index2; + if (index2 > this.capacity) + index2 -= this.capacity; + return this.items[index2]; + }; + FixedDeque.prototype.forEach = function(callback, scope) { + scope = arguments.length > 1 ? scope : this; + var c3 = this.capacity, l = this.size, i = this.start, j = 0; + while (j < l) { + callback.call(scope, this.items[i], j, this); + i++; + j++; + if (i === c3) + i = 0; + } + }; + FixedDeque.prototype.toArray = function() { + var offset = this.start + this.size; + if (offset < this.capacity) + return this.items.slice(this.start, offset); + var array = new this.ArrayClass(this.size), c3 = this.capacity, l = this.size, i = this.start, j = 0; + while (j < l) { + array[j] = this.items[i]; + i++; + j++; + if (i === c3) + i = 0; + } + return array; + }; + FixedDeque.prototype.values = function() { + var items = this.items, c3 = this.capacity, l = this.size, i = this.start, j = 0; + return new Iterator(function() { + if (j >= l) + return { + done: true + }; + var value = items[i]; + i++; + j++; + if (i === c3) + i = 0; + return { + value, + done: false + }; + }); + }; + FixedDeque.prototype.entries = function() { + var items = this.items, c3 = this.capacity, l = this.size, i = this.start, j = 0; + return new Iterator(function() { + if (j >= l) + return { + done: true + }; + var value = items[i]; + i++; + if (i === c3) + i = 0; + return { + value: [j++, value], + done: false + }; + }); + }; + if (typeof Symbol !== "undefined") + FixedDeque.prototype[Symbol.iterator] = FixedDeque.prototype.values; + FixedDeque.prototype.inspect = function() { + var array = this.toArray(); + array.type = this.ArrayClass.name; + array.capacity = this.capacity; + Object.defineProperty(array, "constructor", { + value: FixedDeque, + enumerable: false + }); + return array; + }; + if (typeof Symbol !== "undefined") + FixedDeque.prototype[Symbol.for("nodejs.util.inspect.custom")] = FixedDeque.prototype.inspect; + FixedDeque.from = function(iterable, ArrayClass, capacity) { + if (arguments.length < 3) { + capacity = iterables.guessLength(iterable); + if (typeof capacity !== "number") + throw new Error("mnemonist/fixed-deque.from: could not guess iterable length. Please provide desired capacity as last argument."); + } + var deque = new FixedDeque(ArrayClass, capacity); + if (iterables.isArrayLike(iterable)) { + var i, l; + for (i = 0, l = iterable.length; i < l; i++) + deque.items[i] = iterable[i]; + deque.size = l; + return deque; + } + iterables.forEach(iterable, function(value) { + deque.push(value); + }); + return deque; + }; + module2.exports = FixedDeque; + } +}); + +// node_modules/graphology-traversal/utils.js +var require_utils = __commonJS({ + "node_modules/graphology-traversal/utils.js"(exports) { + function TraversalRecord(node, attr2, depth) { + this.node = node; + this.attributes = attr2; + this.depth = depth; + } + exports.TraversalRecord = TraversalRecord; + } +}); + +// node_modules/graphology-traversal/bfs.js +var require_bfs = __commonJS({ + "node_modules/graphology-traversal/bfs.js"(exports) { + var isGraph = require_is_graph(); + var FixedDeque = require_fixed_deque(); + var TraversalRecord = require_utils().TraversalRecord; + function bfs(graph, callback) { + if (!isGraph(graph)) + throw new Error("graphology-traversal/bfs: expecting a graphology instance."); + if (typeof callback !== "function") + throw new Error("graphology-traversal/bfs: given callback is not a function."); + if (graph.order === 0) + return; + var seen = /* @__PURE__ */ new Set(); + var queue = new FixedDeque(Array, graph.order); + var record, depth; + function neighborCallback(neighbor, attr2) { + if (seen.has(neighbor)) + return; + seen.add(neighbor); + queue.push(new TraversalRecord(neighbor, attr2, depth + 1)); + } + graph.forEachNode(function(node, attr2) { + if (seen.has(node)) + return; + seen.add(node); + queue.push(new TraversalRecord(node, attr2, 0)); + while (queue.size !== 0) { + record = queue.shift(); + depth = record.depth; + callback(record.node, record.attributes, depth); + graph.forEachOutboundNeighbor(record.node, neighborCallback); + } + }); + } + function bfsFromNode(graph, node, callback) { + if (!isGraph(graph)) + throw new Error("graphology-traversal/dfs: expecting a graphology instance."); + if (typeof callback !== "function") + throw new Error("graphology-traversal/dfs: given callback is not a function."); + if (graph.order === 0) + return; + node = "" + node; + var seen = /* @__PURE__ */ new Set(); + var queue = new FixedDeque(Array, graph.order); + var depth, record; + function neighborCallback(neighbor, attr2) { + if (seen.has(neighbor)) + return; + seen.add(neighbor); + queue.push(new TraversalRecord(neighbor, attr2, depth + 1)); + } + seen.add(node); + queue.push(new TraversalRecord(node, graph.getNodeAttributes(node), 0)); + while (queue.size !== 0) { + record = queue.shift(); + depth = record.depth; + callback(record.node, record.attributes, depth); + graph.forEachOutboundNeighbor(record.node, neighborCallback); + } + } + exports.bfs = bfs; + exports.bfsFromNode = bfsFromNode; + } +}); + +// node_modules/graphology-traversal/dfs.js +var require_dfs = __commonJS({ + "node_modules/graphology-traversal/dfs.js"(exports) { + var isGraph = require_is_graph(); + var TraversalRecord = require_utils().TraversalRecord; + function dfs(graph, callback) { + if (!isGraph(graph)) + throw new Error("graphology-traversal/dfs: expecting a graphology instance."); + if (typeof callback !== "function") + throw new Error("graphology-traversal/dfs: given callback is not a function."); + if (graph.order === 0) + return; + var seen = /* @__PURE__ */ new Set(); + var stack = []; + var depth, record; + function neighborCallback(neighbor, attr2) { + if (seen.has(neighbor)) + return; + seen.add(neighbor); + stack.push(new TraversalRecord(neighbor, attr2, depth + 1)); + } + graph.forEachNode(function(node, attr2) { + if (seen.has(node)) + return; + seen.add(node); + stack.push(new TraversalRecord(node, attr2, 0)); + while (stack.length !== 0) { + record = stack.pop(); + depth = record.depth; + callback(record.node, record.attributes, depth); + graph.forEachOutboundNeighbor(record.node, neighborCallback); + } + }); + } + function dfsFromNode2(graph, node, callback) { + if (!isGraph(graph)) + throw new Error("graphology-traversal/dfs: expecting a graphology instance."); + if (typeof callback !== "function") + throw new Error("graphology-traversal/dfs: given callback is not a function."); + if (graph.order === 0) + return; + node = "" + node; + var seen = /* @__PURE__ */ new Set(); + var stack = []; + var depth, record; + function neighborCallback(neighbor, attr2) { + if (seen.has(neighbor)) + return; + seen.add(neighbor); + stack.push(new TraversalRecord(neighbor, attr2, depth + 1)); + } + seen.add(node); + stack.push(new TraversalRecord(node, graph.getNodeAttributes(node), 0)); + while (stack.length !== 0) { + record = stack.pop(); + depth = record.depth; + callback(record.node, record.attributes, depth); + graph.forEachOutboundNeighbor(record.node, neighborCallback); + } + } + exports.dfs = dfs; + exports.dfsFromNode = dfsFromNode2; + } +}); + +// node_modules/graphology-traversal/index.js +var require_graphology_traversal = __commonJS({ + "node_modules/graphology-traversal/index.js"(exports) { + var bfsModule = require_bfs(); + var dfsModule = require_dfs(); + var k; + for (k in bfsModule) + exports[k] = bfsModule[k]; + for (k in dfsModule) + exports[k] = dfsModule[k]; + } +}); + +// node_modules/luxon/build/cjs-browser/luxon.js +var require_luxon = __commonJS({ + "node_modules/luxon/build/cjs-browser/luxon.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; + } + function _extends() { + _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) + return false; + if (typeof Proxy === "function") + return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { + })); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct2(Parent2, args2, Class2) { + var a2 = [null]; + a2.push.apply(a2, args2); + var Constructor = Function.bind.apply(Parent2, a2); + var instance24 = new Constructor(); + if (Class2) + _setPrototypeOf(instance24, Class2.prototype); + return instance24; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0; + _wrapNativeSuper = function _wrapNativeSuper2(Class2) { + if (Class2 === null || !_isNativeFunction(Class2)) + return Class2; + if (typeof Class2 !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class2)) + return _cache.get(Class2); + _cache.set(Class2, Wrapper); + } + function Wrapper() { + return _construct(Class2, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class2.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class2); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) + return; + if (typeof o === "string") + return _arrayLikeToArray(o, minLen); + var n2 = Object.prototype.toString.call(o).slice(8, -1); + if (n2 === "Object" && o.constructor) + n2 = o.constructor.name; + if (n2 === "Map" || n2 === "Set") + return Array.from(o); + if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2)) + return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) + len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) + arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) + return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) + o = it; + var i = 0; + return function() { + if (i >= o.length) + return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var LuxonError = /* @__PURE__ */ function(_Error) { + _inheritsLoose(LuxonError2, _Error); + function LuxonError2() { + return _Error.apply(this, arguments) || this; + } + return LuxonError2; + }(/* @__PURE__ */ _wrapNativeSuper(Error)); + var InvalidDateTimeError = /* @__PURE__ */ function(_LuxonError) { + _inheritsLoose(InvalidDateTimeError2, _LuxonError); + function InvalidDateTimeError2(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError2; + }(LuxonError); + var InvalidIntervalError = /* @__PURE__ */ function(_LuxonError2) { + _inheritsLoose(InvalidIntervalError2, _LuxonError2); + function InvalidIntervalError2(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError2; + }(LuxonError); + var InvalidDurationError = /* @__PURE__ */ function(_LuxonError3) { + _inheritsLoose(InvalidDurationError2, _LuxonError3); + function InvalidDurationError2(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError2; + }(LuxonError); + var ConflictingSpecificationError = /* @__PURE__ */ function(_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError2, _LuxonError4); + function ConflictingSpecificationError2() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError2; + }(LuxonError); + var InvalidUnitError = /* @__PURE__ */ function(_LuxonError5) { + _inheritsLoose(InvalidUnitError2, _LuxonError5); + function InvalidUnitError2(unit2) { + return _LuxonError5.call(this, "Invalid unit " + unit2) || this; + } + return InvalidUnitError2; + }(LuxonError); + var InvalidArgumentError = /* @__PURE__ */ function(_LuxonError6) { + _inheritsLoose(InvalidArgumentError2, _LuxonError6); + function InvalidArgumentError2() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError2; + }(LuxonError); + var ZoneIsAbstractError = /* @__PURE__ */ function(_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError2, _LuxonError7); + function ZoneIsAbstractError2() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError2; + }(LuxonError); + var n = "numeric"; + var s = "short"; + var l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return void 0; + } + return arr.reduce(function(best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function(a2, k) { + a2[k] = obj[k]; + return a2; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + function floorMod(x4, n2) { + return x4 - n2 * Math.floor(x4 / n2); + } + function padStart(input, n2) { + if (n2 === void 0) { + n2 = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n2, "0"); + } else { + padded = ("" + input).padStart(n2, "0"); + } + return padded; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return void 0; + } else { + return parseInt(string, 10); + } + } + function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return void 0; + } else { + return parseFloat(string); + } + } + function parseMillis(fraction) { + if (isUndefined(fraction) || fraction === null || fraction === "") { + return void 0; + } else { + var f = parseFloat("0." + fraction) * 1e3; + return Math.floor(f); + } + } + function roundTo(number3, digits, towardZero) { + if (towardZero === void 0) { + towardZero = false; + } + var factor = Math.pow(10, digits), rounder = towardZero ? Math.trunc : Math.round; + return rounder(number3 * factor) / factor; + } + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + return +d; + } + function weeksInWeekYear(weekYear) { + var p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, last = weekYear - 1, p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7; + return p1 === 4 || p2 === 3 ? 53 : 52; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else + return year > 60 ? 1900 + year : 2e3 + year; + } + function parseZoneInfo(ts, offsetFormat, locale2, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale2, modified).formatToParts(date).find(function(m2) { + return m2.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) + throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === void 0 || v === null) + continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + function formatOffset(offset2, format2) { + var hours = Math.trunc(Math.abs(offset2 / 60)), minutes = Math.trunc(Math.abs(offset2 % 60)), sign = offset2 >= 0 ? "+" : "-"; + switch (format2) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format2 + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + var ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z0-9_+-]{1,256}(\/[A-Za-z0-9_+-]{1,256})?)?/; + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit2, count2, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit2) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit2 === "days"; + switch (count2) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit2][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit2][0]; + case 0: + return isDay ? "today" : "this " + units[unit2][0]; + } + } + var isInPast = Object.is(count2, -0) || count2 < 0, fmtValue = Math.abs(count2), singular = fmtValue === 1, lilUnits = units[unit2], fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit2][0] : unit2; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + function stringifyTokens(splits, tokenToString) { + var s2 = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done; ) { + var token = _step.value; + if (token.literal) { + s2 += token.val; + } else { + s2 += tokenToString(token.val); + } + } + return s2; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + var Formatter = /* @__PURE__ */ function() { + Formatter2.create = function create2(locale2, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter2(locale2, opts); + }; + Formatter2.parseFormat = function parseFormat(fmt) { + var current = null, currentFull = "", bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c3 = fmt.charAt(i); + if (c3 === "'") { + if (currentFull.length > 0) { + splits.push({ + literal: bracketed, + val: currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c3; + } else if (c3 === current) { + currentFull += c3; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: false, + val: currentFull + }); + } + currentFull = c3; + current = c3; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed, + val: currentFull + }); + } + return splits; + }; + Formatter2.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter2(locale2, formatOpts) { + this.opts = formatOpts; + this.loc = locale2; + this.systemLoc = null; + } + var _proto = Formatter2.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.formatToParts(); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + if (opts === void 0) { + opts = {}; + } + var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.resolvedOptions(); + }; + _proto.num = function num(n2, p) { + if (p === void 0) { + p = 0; + } + if (this.opts.forceSimple) { + return padStart(n2, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + return this.loc.numberFormatter(opts).format(n2); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", string = function string2(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, formatOffset2 = function formatOffset3(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, meridiem = function meridiem2() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, month = function month2(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, weekday = function weekday2(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, maybeMacro = function maybeMacro2(token) { + var formatOpts = Formatter2.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, era = function era2(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, tokenToString = function tokenToString2(token) { + switch (token) { + case "S": + return _this.num(dt.millisecond); + case "u": + case "SSS": + return _this.num(dt.millisecond, 3); + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + case "Z": + return formatOffset2({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + return formatOffset2({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + return formatOffset2({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + case "z": + return dt.zoneName; + case "a": + return meridiem(); + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + case "c": + return _this.num(dt.weekday); + case "ccc": + return weekday("short", true); + case "cccc": + return weekday("long", true); + case "ccccc": + return weekday("narrow", true); + case "E": + return _this.num(dt.weekday); + case "EEE": + return weekday("short", false); + case "EEEE": + return weekday("long", false); + case "EEEEE": + return weekday("narrow", false); + case "L": + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + return month("short", true); + case "LLLL": + return month("long", true); + case "LLLLL": + return month("narrow", true); + case "M": + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + return month("short", false); + case "MMMM": + return month("long", false); + case "MMMMM": + return month("narrow", false); + case "y": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + case "G": + return era("short"); + case "GG": + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + return _this.num(dt.quarter); + case "qq": + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1e3)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter2.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var tokenToField = function tokenToField2(token) { + switch (token[0]) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + return "hour"; + case "d": + return "day"; + case "M": + return "month"; + case "y": + return "year"; + default: + return null; + } + }, tokenToString = function tokenToString2(lildur) { + return function(token) { + var mapped = tokenToField(token); + if (mapped) { + return _this2.num(lildur.get(mapped), token.length); + } else { + return token; + } + }; + }, tokens = Formatter2.parseFormat(fmt), realTokens = tokens.reduce(function(found, _ref) { + var literal = _ref.literal, val = _ref.val; + return literal ? found : found.concat(val); + }, []), collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function(t) { + return t; + })); + return stringifyTokens(tokens, tokenToString(collapsed)); + }; + return Formatter2; + }(); + var Invalid = /* @__PURE__ */ function() { + function Invalid2(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid2.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid2; + }(); + var Zone = /* @__PURE__ */ function() { + function Zone2() { + } + var _proto = Zone2.prototype; + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + }; + _proto.formatOffset = function formatOffset2(ts, format2) { + throw new ZoneIsAbstractError(); + }; + _proto.offset = function offset2(ts) { + throw new ZoneIsAbstractError(); + }; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + }; + _createClass(Zone2, [{ + key: "type", + get: function get3() { + throw new ZoneIsAbstractError(); + } + }, { + key: "name", + get: function get3() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isUniversal", + get: function get3() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get3() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone2; + }(); + var singleton$1 = null; + var SystemZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(SystemZone2, _Zone); + function SystemZone2() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone2.prototype; + _proto.offsetName = function offsetName(ts, _ref) { + var format2 = _ref.format, locale2 = _ref.locale; + return parseZoneInfo(ts, format2, locale2); + }; + _proto.formatOffset = function formatOffset$1(ts, format2) { + return formatOffset(this.offset(ts), format2); + }; + _proto.offset = function offset2(ts) { + return -new Date(ts).getTimezoneOffset(); + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + }; + _createClass(SystemZone2, [{ + key: "type", + get: function get3() { + return "system"; + } + }, { + key: "name", + get: function get3() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + }, { + key: "isUniversal", + get: function get3() { + return false; + } + }, { + key: "isValid", + get: function get3() { + return true; + } + }], [{ + key: "instance", + get: function get3() { + if (singleton$1 === null) { + singleton$1 = new SystemZone2(); + } + return singleton$1; + } + }]); + return SystemZone2; + }(Zone); + var matchingRegex = RegExp("^" + ianaRegex.source + "$"); + var dtfCache = {}; + function makeDTF(zone) { + if (!dtfCache[zone]) { + dtfCache[zone] = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zone, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit" + }); + } + return dtfCache[zone]; + } + var typeToPos = { + year: 0, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), fMonth = parsed[1], fDay = parsed[2], fYear = parsed[3], fHour = parsed[4], fMinute = parsed[5], fSecond = parsed[6]; + return [fYear, fMonth, fDay, fHour, fMinute, fSecond]; + } + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date), filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], type2 = _formatted$i.type, value = _formatted$i.value, pos = typeToPos[type2]; + if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = {}; + var IANAZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(IANAZone2, _Zone); + IANAZone2.create = function create2(name) { + if (!ianaZoneCache[name]) { + ianaZoneCache[name] = new IANAZone2(name); + } + return ianaZoneCache[name]; + }; + IANAZone2.resetCache = function resetCache() { + ianaZoneCache = {}; + dtfCache = {}; + }; + IANAZone2.isValidSpecifier = function isValidSpecifier(s2) { + return !!(s2 && s2.match(matchingRegex)); + }; + IANAZone2.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone2(name) { + var _this; + _this = _Zone.call(this) || this; + _this.zoneName = name; + _this.valid = IANAZone2.isValidZone(name); + return _this; + } + var _proto = IANAZone2.prototype; + _proto.offsetName = function offsetName(ts, _ref) { + var format2 = _ref.format, locale2 = _ref.locale; + return parseZoneInfo(ts, format2, locale2, this.name); + }; + _proto.formatOffset = function formatOffset$1(ts, format2) { + return formatOffset(this.offset(ts), format2); + }; + _proto.offset = function offset2(ts) { + var date = new Date(ts); + if (isNaN(date)) + return NaN; + var dtf = makeDTF(this.name), _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), year = _ref2[0], month = _ref2[1], day = _ref2[2], hour = _ref2[3], minute = _ref2[4], second = _ref2[5]; + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1e3; + asTS -= over >= 0 ? over : 1e3 + over; + return (asUTC - asTS) / (60 * 1e3); + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + }; + _createClass(IANAZone2, [{ + key: "type", + get: function get3() { + return "iana"; + } + }, { + key: "name", + get: function get3() { + return this.zoneName; + } + }, { + key: "isUniversal", + get: function get3() { + return false; + } + }, { + key: "isValid", + get: function get3() { + return this.valid; + } + }]); + return IANAZone2; + }(Zone); + var singleton = null; + var FixedOffsetZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(FixedOffsetZone2, _Zone); + FixedOffsetZone2.instance = function instance24(offset2) { + return offset2 === 0 ? FixedOffsetZone2.utcInstance : new FixedOffsetZone2(offset2); + }; + FixedOffsetZone2.parseSpecifier = function parseSpecifier(s2) { + if (s2) { + var r = s2.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone2(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone2(offset2) { + var _this; + _this = _Zone.call(this) || this; + _this.fixed = offset2; + return _this; + } + var _proto = FixedOffsetZone2.prototype; + _proto.offsetName = function offsetName() { + return this.name; + }; + _proto.formatOffset = function formatOffset$1(ts, format2) { + return formatOffset(this.fixed, format2); + }; + _proto.offset = function offset2() { + return this.fixed; + }; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + }; + _createClass(FixedOffsetZone2, [{ + key: "type", + get: function get3() { + return "fixed"; + } + }, { + key: "name", + get: function get3() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + }, { + key: "isUniversal", + get: function get3() { + return true; + } + }, { + key: "isValid", + get: function get3() { + return true; + } + }], [{ + key: "utcInstance", + get: function get3() { + if (singleton === null) { + singleton = new FixedOffsetZone2(0); + } + return singleton; + } + }]); + return FixedOffsetZone2; + }(Zone); + var InvalidZone = /* @__PURE__ */ function(_Zone) { + _inheritsLoose(InvalidZone2, _Zone); + function InvalidZone2(zoneName) { + var _this; + _this = _Zone.call(this) || this; + _this.zoneName = zoneName; + return _this; + } + var _proto = InvalidZone2.prototype; + _proto.offsetName = function offsetName() { + return null; + }; + _proto.formatOffset = function formatOffset2() { + return ""; + }; + _proto.offset = function offset2() { + return NaN; + }; + _proto.equals = function equals() { + return false; + }; + _createClass(InvalidZone2, [{ + key: "type", + get: function get3() { + return "invalid"; + } + }, { + key: "name", + get: function get3() { + return this.zoneName; + } + }, { + key: "isUniversal", + get: function get3() { + return false; + } + }, { + key: "isValid", + get: function get3() { + return false; + } + }]); + return InvalidZone2; + }(Zone); + function normalizeZone(input, defaultZone2) { + if (isUndefined(input) || input === null) { + return defaultZone2; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "local" || lowered === "system") + return defaultZone2; + else if (lowered === "utc" || lowered === "gmt") + return FixedOffsetZone.utcInstance; + else if (IANAZone.isValidSpecifier(lowered)) + return IANAZone.create(input); + else + return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && input.offset && typeof input.offset === "number") { + return input; + } else { + return new InvalidZone(input); + } + } + var now2 = function now3() { + return Date.now(); + }; + var defaultZone = "system"; + var defaultLocale2 = null; + var defaultNumberingSystem = null; + var defaultOutputCalendar = null; + var throwOnInvalid; + var Settings = /* @__PURE__ */ function() { + function Settings2() { + } + Settings2.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + }; + _createClass(Settings2, null, [{ + key: "now", + get: function get3() { + return now2; + }, + set: function set3(n2) { + now2 = n2; + } + }, { + key: "defaultZone", + get: function get3() { + return normalizeZone(defaultZone, SystemZone.instance); + }, + set: function set3(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get3() { + return defaultLocale2; + }, + set: function set3(locale2) { + defaultLocale2 = locale2; + } + }, { + key: "defaultNumberingSystem", + get: function get3() { + return defaultNumberingSystem; + }, + set: function set3(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + }, { + key: "defaultOutputCalendar", + get: function get3() { + return defaultOutputCalendar; + }, + set: function set3(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + }, { + key: "throwOnInvalid", + get: function get3() { + return throwOnInvalid; + }, + set: function set3(t) { + throwOnInvalid = t; + } + }]); + return Settings2; + }(); + var _excluded = ["base"]; + var _excluded2 = ["padTo", "floor"]; + var intlLFCache = {}; + function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; + } + var intlDTCache = {}; + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache[key]; + if (!dtf) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache[key] = dtf; + } + return dtf; + } + var intlNumCache = {}; + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache[key]; + if (!inf) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache[key] = inf; + } + return inf; + } + var intlRelCache = {}; + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache[key]; + if (!inf) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache[key] = inf; + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } + } + function parseLocaleString(localeStr) { + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var smaller = localeStr.substring(0, uIndex); + try { + options = getCachedDTF(localeStr).resolvedOptions(); + } catch (e) { + options = getCachedDTF(smaller).resolvedOptions(); + } + var _options = options, numberingSystem = _options.numberingSystem, calendar = _options.calendar; + return [smaller, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + localeStr += "-u"; + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime2.utc(2016, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime2.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, defaultOK, englishFn, intlFn) { + var mode = loc.listingMode(defaultOK); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn"; + } + } + var PolyNumberFormatter = /* @__PURE__ */ function() { + function PolyNumberFormatter2(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) + intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter2.prototype; + _proto.format = function format2(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter2; + }(); + var PolyDateFormatter = /* @__PURE__ */ function() { + function PolyDateFormatter2(dt, intl, opts) { + this.opts = opts; + var z; + if (dt.zone.isUniversal) { + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + z = "UTC"; + if (opts.timeZoneName) { + this.dt = dt; + } else { + this.dt = dt.offset === 0 ? dt : DateTime2.fromMillis(dt.ts + dt.offset * 60 * 1e3); + } + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else { + this.dt = dt; + z = dt.zone.name; + } + var intlOpts = _extends({}, this.opts); + if (z) { + intlOpts.timeZone = z; + } + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter2.prototype; + _proto2.format = function format2() { + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + return this.dtf.formatToParts(this.dt.toJSDate()); + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter2; + }(); + var PolyRelFormatter = /* @__PURE__ */ function() { + function PolyRelFormatter2(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter2.prototype; + _proto3.format = function format2(count2, unit2) { + if (this.rtf) { + return this.rtf.format(count2, unit2); + } else { + return formatRelativeTime(unit2, count2, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count2, unit2) { + if (this.rtf) { + return this.rtf.formatToParts(count2, unit2); + } else { + return []; + } + }; + return PolyRelFormatter2; + }(); + var Locale = /* @__PURE__ */ function() { + Locale2.fromOpts = function fromOpts(opts) { + return Locale2.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN); + }; + Locale2.create = function create2(locale2, numberingSystem, outputCalendar, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale2 || Settings.defaultLocale; + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + return new Locale2(localeR, numberingSystemR, outputCalendarR, specifiedLocale); + }; + Locale2.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache = {}; + intlNumCache = {}; + intlRelCache = {}; + }; + Locale2.fromObject = function fromObject(_temp) { + var _ref = _temp === void 0 ? {} : _temp, locale2 = _ref.locale, numberingSystem = _ref.numberingSystem, outputCalendar = _ref.outputCalendar; + return Locale2.create(locale2, numberingSystem, outputCalendar); + }; + function Locale2(locale2, numbering, outputCalendar, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale2), parsedLocale = _parseLocaleString[0], parsedNumberingSystem = _parseLocaleString[1], parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale2.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone2(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale2.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format2, defaultOK) { + var _this = this; + if (format2 === void 0) { + format2 = false; + } + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, months, function() { + var intl = format2 ? { + month: length, + day: "numeric" + } : { + month: length + }, formatStr = format2 ? "format" : "standalone"; + if (!_this.monthsCache[formatStr][length]) { + _this.monthsCache[formatStr][length] = mapMonths(function(dt) { + return _this.extract(dt, intl, "month"); + }); + } + return _this.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format2, defaultOK) { + var _this2 = this; + if (format2 === void 0) { + format2 = false; + } + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, weekdays, function() { + var intl = format2 ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, formatStr = format2 ? "format" : "standalone"; + if (!_this2.weekdaysCache[formatStr][length]) { + _this2.weekdaysCache[formatStr][length] = mapWeekdays(function(dt) { + return _this2.extract(dt, intl, "weekday"); + }); + } + return _this2.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1(defaultOK) { + var _this3 = this; + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, void 0, defaultOK, function() { + return meridiems; + }, function() { + if (!_this3.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this3.meridiemCache = [DateTime2.utc(2016, 11, 13, 9), DateTime2.utc(2016, 11, 13, 19)].map(function(dt) { + return _this3.extract(dt, intl, "dayperiod"); + }); + } + return _this3.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length, defaultOK) { + var _this4 = this; + if (defaultOK === void 0) { + defaultOK = true; + } + return listStuff(this, length, defaultOK, eras, function() { + var intl = { + era: length + }; + if (!_this4.eraCache[length]) { + _this4.eraCache[length] = [DateTime2.utc(-40, 1, 1), DateTime2.utc(2017, 1, 1)].map(function(dt) { + return _this4.extract(dt, intl, "era"); + }); + } + return _this4.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), results = df.formatToParts(), matching = results.find(function(m2) { + return m2.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us"); + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _createClass(Locale2, [{ + key: "fastNumbers", + get: function get3() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale2; + }(); + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function(f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function(m2) { + return extractors.reduce(function(_ref, ex) { + var mergedVals = _ref[0], mergedZone = _ref[1], cursor = _ref[2]; + var _ex = ex(m2, cursor), val = _ex[0], zone = _ex[1], next = _ex[2]; + return [_extends({}, mergedVals, val), mergedZone || zone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + function parse(s2) { + if (s2 == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], regex = _patterns$_i[0], extractor = _patterns$_i[1]; + var m2 = regex.exec(s2); + if (m2) { + return extractor(m2); + } + } + return [null, null]; + } + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function(match2, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match2[cursor + i]); + } + return [ret, null, cursor + i]; + }; + } + var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + offsetRegex.source + "?"); + var isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match2, pos, fallback) { + var m2 = match2[pos]; + return isUndefined(m2) ? fallback : parseInteger(m2); + } + function extractISOYmd(match2, cursor) { + var item = { + year: int(match2, cursor), + month: int(match2, cursor + 1, 1), + day: int(match2, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match2, cursor) { + var item = { + hours: int(match2, cursor, 0), + minutes: int(match2, cursor + 1, 0), + seconds: int(match2, cursor + 2, 0), + milliseconds: parseMillis(match2[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match2, cursor) { + var local = !match2[cursor] && !match2[cursor + 1], fullOffset = signedOffset(match2[cursor + 1], match2[cursor + 2]), zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match2, cursor) { + var zone = match2[cursor] ? IANAZone.create(match2[cursor]) : null; + return [{}, zone, cursor + 1]; + } + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + var isoDuration = /^-?P(?:(?:(-?\d{1,9}(?:\.\d{1,9})?)Y)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,9}(?:\.\d{1,9})?)W)?(?:(-?\d{1,9}(?:\.\d{1,9})?)D)?(?:T(?:(-?\d{1,9}(?:\.\d{1,9})?)H)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/; + function extractISODuration(match2) { + var s2 = match2[0], yearStr = match2[1], monthStr = match2[2], weekStr = match2[3], dayStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], millisecondsStr = match2[8]; + var hasNegativePrefix = s2[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate2(num, force) { + if (force === void 0) { + force = false; + } + return num !== void 0 && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; + } + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) + result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; + } + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match2) { + var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], obsOffset = match2[8], milOffset = match2[9], offHourStr = match2[10], offMinuteStr = match2[11], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset2; + if (obsOffset) { + offset2 = obsOffsets[obsOffset]; + } else if (milOffset) { + offset2 = 0; + } else { + offset2 = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset2)]; + } + function preprocessRFC2822(s2) { + return s2.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/; + var rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/; + var ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match2) { + var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match2) { + var weekdayStr = match2[1], monthStr = match2[2], dayStr = match2[3], hourStr = match2[4], minuteStr = match2[5], secondStr = match2[6], yearStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset); + function parseISODate(s2) { + return parse(s2, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s2) { + return parse(preprocessRFC2822(s2), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s2) { + return parse(s2, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s2) { + return parse(s2, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s2) { + return parse(s2, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s2) { + return parse(s2, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + var INVALID$2 = "Invalid Duration"; + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1e3 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1e3 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1e3 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1e3 + }, + seconds: { + milliseconds: 1e3 + } + }; + var casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1e3 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1e3 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1e3 + } + }, lowOrderMatrix); + var daysInYearAccurate = 146097 / 400; + var daysInMonthAccurate = 146097 / 4800; + var accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1e3 + } + }, lowOrderMatrix); + var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits$1.slice(0).reverse(); + function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy + }; + return new Duration(conf); + } + function antiTrunc(n2) { + return n2 < 0 ? Math.floor(n2) : Math.ceil(n2); + } + function convert(matrix, fromMap, fromUnit, toMap, toUnit) { + var conv = matrix[toUnit][fromUnit], raw = fromMap[fromUnit] / conv, sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw); + toMap[toUnit] += added; + fromMap[fromUnit] -= added * conv; + } + function normalizeValues(matrix, vals) { + reverseUnits.reduce(function(previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + convert(matrix, vals, previous, vals, current); + } + return current; + } else { + return previous; + } + }, null); + } + var Duration = /* @__PURE__ */ function() { + function Duration2(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + this.values = config.values; + this.loc = config.loc || Locale.create(); + this.conversionAccuracy = accurate ? "longterm" : "casual"; + this.invalid = config.invalid || null; + this.matrix = accurate ? accurateMatrix : casualMatrix; + this.isLuxonDuration = true; + } + Duration2.fromMillis = function fromMillis(count2, opts) { + return Duration2.fromObject({ + milliseconds: count2 + }, opts); + }; + Duration2.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration2({ + values: normalizeObject(obj, Duration2.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy + }); + }; + Duration2.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration2.fromMillis(durationLike); + } else if (Duration2.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration2.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + }; + Duration2.fromISO = function fromISO(text2, opts) { + var _parseISODuration = parseISODuration(text2), parsed = _parseISODuration[0]; + if (parsed) { + return Duration2.fromObject(parsed, opts); + } else { + return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + } + }; + Duration2.fromISOTime = function fromISOTime(text2, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text2), parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration2.fromObject(parsed, opts); + } else { + return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + } + }; + Duration2.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid2); + } else { + return new Duration2({ + invalid: invalid2 + }); + } + }; + Duration2.normalizeUnit = function normalizeUnit2(unit2) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit2 ? unit2.toLowerCase() : unit2]; + if (!normalized) + throw new InvalidUnitError(unit2); + return normalized; + }; + Duration2.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + }; + var _proto = Duration2.prototype; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + }; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + var l2 = orderedUnits$1.map(function(unit2) { + var val = _this.values[unit2]; + if (isUndefined(val)) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit2.slice(0, -1) + })).format(val); + }).filter(function(n2) { + return n2; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l2); + }; + _proto.toObject = function toObject() { + if (!this.isValid) + return {}; + return _extends({}, this.values); + }; + _proto.toISO = function toISO() { + if (!this.isValid) + return null; + var s2 = "P"; + if (this.years !== 0) + s2 += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) + s2 += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) + s2 += this.weeks + "W"; + if (this.days !== 0) + s2 += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) + s2 += "T"; + if (this.hours !== 0) + s2 += this.hours + "H"; + if (this.minutes !== 0) + s2 += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + s2 += roundTo(this.seconds + this.milliseconds / 1e3, 3) + "S"; + if (s2 === "P") + s2 += "T0S"; + return s2; + }; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) + return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 864e5) + return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts); + var value = this.shiftTo("hours", "minutes", "seconds", "milliseconds"); + var fmt = opts.format === "basic" ? "hhmm" : "hh:mm"; + if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) { + fmt += opts.format === "basic" ? "ss" : ":ss"; + if (!opts.suppressMilliseconds || value.milliseconds !== 0) { + fmt += ".SSS"; + } + } + var str = value.toFormat(fmt); + if (opts.includePrefix) { + str = "T" + str; + } + return str; + }; + _proto.toJSON = function toJSON() { + return this.toISO(); + }; + _proto.toString = function toString() { + return this.toISO(); + }; + _proto.toMillis = function toMillis() { + return this.as("milliseconds"); + }; + _proto.valueOf = function valueOf() { + return this.toMillis(); + }; + _proto.plus = function plus(duration) { + if (!this.isValid) + return this; + var dur = Duration2.fromDurationLike(duration), result = {}; + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits$1), _step; !(_step = _iterator()).done; ) { + var k = _step.value; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + }; + _proto.minus = function minus(duration) { + if (!this.isValid) + return this; + var dur = Duration2.fromDurationLike(duration); + return this.plus(dur.negate()); + }; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) + return this; + var result = {}; + for (var _i = 0, _Object$keys = Object.keys(this.values); _i < _Object$keys.length; _i++) { + var k = _Object$keys[_i]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + }; + _proto.get = function get3(unit2) { + return this[Duration2.normalizeUnit(unit2)]; + }; + _proto.set = function set3(values) { + if (!this.isValid) + return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration2.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + }; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, locale2 = _ref.locale, numberingSystem = _ref.numberingSystem, conversionAccuracy = _ref.conversionAccuracy; + var loc = this.loc.clone({ + locale: locale2, + numberingSystem + }), opts = { + loc + }; + if (conversionAccuracy) { + opts.conversionAccuracy = conversionAccuracy; + } + return clone$1(this, opts); + }; + _proto.as = function as(unit2) { + return this.isValid ? this.shiftTo(unit2).get(unit2) : NaN; + }; + _proto.normalize = function normalize2() { + if (!this.isValid) + return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + }; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) + return this; + if (units.length === 0) { + return this; + } + units = units.map(function(u) { + return Duration2.normalizeUnit(u); + }); + var built = {}, accumulated = {}, vals = this.toObject(); + var lastUnit; + for (var _iterator2 = _createForOfIteratorHelperLoose(orderedUnits$1), _step2; !(_step2 = _iterator2()).done; ) { + var k = _step2.value; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + if (isNumber(vals[k])) { + own += vals[k]; + } + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1e3 - i * 1e3) / 1e3; + for (var down in vals) { + if (orderedUnits$1.indexOf(down) > orderedUnits$1.indexOf(k)) { + convert(this.matrix, vals, down, built, k); + } + } + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + return clone$1(this, { + values: built + }, true).normalize(); + }; + _proto.negate = function negate() { + if (!this.isValid) + return this; + var negated = {}; + for (var _i2 = 0, _Object$keys2 = Object.keys(this.values); _i2 < _Object$keys2.length; _i2++) { + var k = _Object$keys2[_i2]; + negated[k] = -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + }; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + if (v1 === void 0 || v1 === 0) + return v2 === void 0 || v2 === 0; + return v1 === v2; + } + for (var _iterator3 = _createForOfIteratorHelperLoose(orderedUnits$1), _step3; !(_step3 = _iterator3()).done; ) { + var u = _step3.value; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration2, [{ + key: "locale", + get: function get3() { + return this.isValid ? this.loc.locale : null; + } + }, { + key: "numberingSystem", + get: function get3() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get3() { + return this.isValid ? this.values.years || 0 : NaN; + } + }, { + key: "quarters", + get: function get3() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + }, { + key: "months", + get: function get3() { + return this.isValid ? this.values.months || 0 : NaN; + } + }, { + key: "weeks", + get: function get3() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + }, { + key: "days", + get: function get3() { + return this.isValid ? this.values.days || 0 : NaN; + } + }, { + key: "hours", + get: function get3() { + return this.isValid ? this.values.hours || 0 : NaN; + } + }, { + key: "minutes", + get: function get3() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + }, { + key: "seconds", + get: function get3() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + }, { + key: "milliseconds", + get: function get3() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + }, { + key: "isValid", + get: function get3() { + return this.invalid === null; + } + }, { + key: "invalidReason", + get: function get3() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get3() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration2; + }(); + var INVALID$1 = "Invalid Interval"; + function validateStartEnd(start2, end) { + if (!start2 || !start2.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start2) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start2.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + var Interval = /* @__PURE__ */ function() { + function Interval2(config) { + this.s = config.start; + this.e = config.end; + this.invalid = config.invalid || null; + this.isLuxonInterval = true; + } + Interval2.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid2); + } else { + return new Interval2({ + invalid: invalid2 + }); + } + }; + Interval2.fromDateTimes = function fromDateTimes(start2, end) { + var builtStart = friendlyDateTime(start2), builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval2({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + }; + Interval2.after = function after(start2, duration) { + var dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(start2); + return Interval2.fromDateTimes(dt, dt.plus(dur)); + }; + Interval2.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(end); + return Interval2.fromDateTimes(dt.minus(dur), dt); + }; + Interval2.fromISO = function fromISO(text2, opts) { + var _split = (text2 || "").split("/", 2), s2 = _split[0], e = _split[1]; + if (s2 && e) { + var start2, startIsValid; + try { + start2 = DateTime2.fromISO(s2, opts); + startIsValid = start2.isValid; + } catch (e3) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime2.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e3) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval2.fromDateTimes(start2, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval2.after(start2, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s2, opts); + if (_dur.isValid) { + return Interval2.before(end, _dur); + } + } + } + return Interval2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`); + }; + Interval2.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + }; + var _proto = Interval2.prototype; + _proto.length = function length(unit2) { + if (unit2 === void 0) { + unit2 = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit2]).get(unit2) : NaN; + }; + _proto.count = function count2(unit2) { + if (unit2 === void 0) { + unit2 = "milliseconds"; + } + if (!this.isValid) + return NaN; + var start2 = this.start.startOf(unit2), end = this.end.startOf(unit2); + return Math.floor(end.diff(start2, unit2).get(unit2)) + 1; + }; + _proto.hasSame = function hasSame(unit2) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit2) : false; + }; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + }; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) + return false; + return this.s > dateTime; + }; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) + return false; + return this.e <= dateTime; + }; + _proto.contains = function contains(dateTime) { + if (!this.isValid) + return false; + return this.s <= dateTime && this.e > dateTime; + }; + _proto.set = function set3(_temp) { + var _ref = _temp === void 0 ? {} : _temp, start2 = _ref.start, end = _ref.end; + if (!this.isValid) + return this; + return Interval2.fromDateTimes(start2 || this.s, end || this.e); + }; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) + return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function(d) { + return _this.contains(d); + }).sort(), results = []; + var s2 = this.s, i = 0; + while (s2 < this.e) { + var added = sorted[i] || this.e, next = +added > +this.e ? this.e : added; + results.push(Interval2.fromDateTimes(s2, next)); + s2 = next; + i += 1; + } + return results; + }; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s2 = this.s, idx = 1, next; + var results = []; + while (s2 < this.e) { + var added = this.start.plus(dur.mapUnits(function(x4) { + return x4 * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval2.fromDateTimes(s2, next)); + s2 = next; + idx += 1; + } + return results; + }; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) + return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + }; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + }; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) + return false; + return +this.e === +other.s; + }; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) + return false; + return +other.e === +this.s; + }; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) + return false; + return this.s <= other.s && this.e >= other.e; + }; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + }; + _proto.intersection = function intersection(other) { + if (!this.isValid) + return this; + var s2 = this.s > other.s ? this.s : other.s, e = this.e < other.e ? this.e : other.e; + if (s2 >= e) { + return null; + } else { + return Interval2.fromDateTimes(s2, e); + } + }; + _proto.union = function union(other) { + if (!this.isValid) + return this; + var s2 = this.s < other.s ? this.s : other.s, e = this.e > other.e ? this.e : other.e; + return Interval2.fromDateTimes(s2, e); + }; + Interval2.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function(a2, b) { + return a2.s - b.s; + }).reduce(function(_ref2, item) { + var sofar = _ref2[0], current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), found = _intervals$sort$reduc[0], final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + }; + Interval2.xor = function xor(intervals) { + var _Array$prototype; + var start2 = null, currentCount = 0; + var results = [], ends = intervals.map(function(i2) { + return [{ + time: i2.s, + type: "s" + }, { + time: i2.e, + type: "e" + }]; + }), flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), arr = flattened.sort(function(a2, b) { + return a2.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done; ) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start2 = i.time; + } else { + if (start2 && +start2 !== +i.time) { + results.push(Interval2.fromDateTimes(start2, i.time)); + } + start2 = null; + } + } + return Interval2.merge(results); + }; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval2.xor([this].concat(intervals)).map(function(i) { + return _this2.intersection(i); + }).filter(function(i) { + return i && !i.isEmpty(); + }); + }; + _proto.toString = function toString() { + if (!this.isValid) + return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + }; + _proto.toISO = function toISO(opts) { + if (!this.isValid) + return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + }; + _proto.toISODate = function toISODate() { + if (!this.isValid) + return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + }; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) + return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + }; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, _ref3$separator = _ref3.separator, separator = _ref3$separator === void 0 ? " \u2013 " : _ref3$separator; + if (!this.isValid) + return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + }; + _proto.toDuration = function toDuration(unit2, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit2, opts); + }; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval2.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval2, [{ + key: "start", + get: function get3() { + return this.isValid ? this.s : null; + } + }, { + key: "end", + get: function get3() { + return this.isValid ? this.e : null; + } + }, { + key: "isValid", + get: function get3() { + return this.invalidReason === null; + } + }, { + key: "invalidReason", + get: function get3() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get3() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval2; + }(); + var Info = /* @__PURE__ */ function() { + function Info2() { + } + Info2.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime2.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + }; + Info2.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone); + }; + Info2.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + }; + Info2.months = function months2(length, _temp) { + if (length === void 0) { + length = "long"; + } + var _ref = _temp === void 0 ? {} : _temp, _ref$locale = _ref.locale, locale2 = _ref$locale === void 0 ? null : _ref$locale, _ref$numberingSystem = _ref.numberingSystem, numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem, _ref$locObj = _ref.locObj, locObj = _ref$locObj === void 0 ? null : _ref$locObj, _ref$outputCalendar = _ref.outputCalendar, outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar; + return (locObj || Locale.create(locale2, numberingSystem, outputCalendar)).months(length); + }; + Info2.monthsFormat = function monthsFormat(length, _temp2) { + if (length === void 0) { + length = "long"; + } + var _ref2 = _temp2 === void 0 ? {} : _temp2, _ref2$locale = _ref2.locale, locale2 = _ref2$locale === void 0 ? null : _ref2$locale, _ref2$numberingSystem = _ref2.numberingSystem, numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem, _ref2$locObj = _ref2.locObj, locObj = _ref2$locObj === void 0 ? null : _ref2$locObj, _ref2$outputCalendar = _ref2.outputCalendar, outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar; + return (locObj || Locale.create(locale2, numberingSystem, outputCalendar)).months(length, true); + }; + Info2.weekdays = function weekdays2(length, _temp3) { + if (length === void 0) { + length = "long"; + } + var _ref3 = _temp3 === void 0 ? {} : _temp3, _ref3$locale = _ref3.locale, locale2 = _ref3$locale === void 0 ? null : _ref3$locale, _ref3$numberingSystem = _ref3.numberingSystem, numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem, _ref3$locObj = _ref3.locObj, locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + return (locObj || Locale.create(locale2, numberingSystem, null)).weekdays(length); + }; + Info2.weekdaysFormat = function weekdaysFormat(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, _ref4$locale = _ref4.locale, locale2 = _ref4$locale === void 0 ? null : _ref4$locale, _ref4$numberingSystem = _ref4.numberingSystem, numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, _ref4$locObj = _ref4.locObj, locObj = _ref4$locObj === void 0 ? null : _ref4$locObj; + return (locObj || Locale.create(locale2, numberingSystem, null)).weekdays(length, true); + }; + Info2.meridiems = function meridiems2(_temp5) { + var _ref5 = _temp5 === void 0 ? {} : _temp5, _ref5$locale = _ref5.locale, locale2 = _ref5$locale === void 0 ? null : _ref5$locale; + return Locale.create(locale2).meridiems(); + }; + Info2.eras = function eras2(length, _temp6) { + if (length === void 0) { + length = "short"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, _ref6$locale = _ref6.locale, locale2 = _ref6$locale === void 0 ? null : _ref6$locale; + return Locale.create(locale2, null, "gregory").eras(length); + }; + Info2.features = function features() { + return { + relative: hasRelative() + }; + }; + return Info2; + }(); + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart2(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function(a2, b) { + return b.year - a2.year; + }], ["quarters", function(a2, b) { + return b.quarter - a2.quarter; + }], ["months", function(a2, b) { + return b.month - a2.month + (b.year - a2.year) * 12; + }], ["weeks", function(a2, b) { + var days = dayDiff(a2, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var lowestOrder, highWater; + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], unit2 = _differs$_i[0], differ = _differs$_i[1]; + if (units.indexOf(unit2) >= 0) { + var _cursor$plus; + lowestOrder = unit2; + var delta = differ(cursor, later); + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[unit2] = delta, _cursor$plus)); + if (highWater > later) { + var _cursor$plus2; + cursor = cursor.plus((_cursor$plus2 = {}, _cursor$plus2[unit2] = delta - 1, _cursor$plus2)); + delta -= 1; + } else { + cursor = highWater; + } + results[unit2] = delta; + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff(earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), cursor = _highOrderDiffs[0], results = _highOrderDiffs[1], highWater = _highOrderDiffs[2], lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function(u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus3; + highWater = cursor.plus((_cursor$plus3 = {}, _cursor$plus3[lowestOrder] = 1, _cursor$plus3)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], min3 = _numberingSystemsUTF[0], max4 = _numberingSystemsUTF[1]; + if (code >= min3 && code <= max4) { + value += code - min3; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } + } + function digitRegex(_ref, append2) { + var numberingSystem = _ref.numberingSystem; + if (append2 === void 0) { + append2 = ""; + } + return new RegExp("" + numberingSystems[numberingSystem || "latn"] + append2); + } + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post2(i) { + return i; + }; + } + return { + regex, + deser: function deser(_ref) { + var s2 = _ref[0]; + return post(parseDigits(s2)); + } + }; + } + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "( |" + NBSP + ")"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s2) { + return s2.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); + } + function stripInsensitivities(s2) { + return s2.replace(/\./g, "").replace(spaceOrNBSPRegExp, " ").toLowerCase(); + } + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s2 = _ref2[0]; + return strings.findIndex(function(i) { + return stripInsensitivities(s2) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + function offset(regex, groups) { + return { + regex, + deser: function deser(_ref3) { + var h = _ref3[1], m2 = _ref3[2]; + return signedOffset(h, m2); + }, + groups + }; + } + function simple(regex) { + return { + regex, + deser: function deser(_ref4) { + var s2 = _ref4[0]; + return s2; + } + }; + } + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + function unitForToken(token, loc) { + var one2 = digitRegex(loc), two = digitRegex(loc, "{2}"), three = digitRegex(loc, "{3}"), four = digitRegex(loc, "{4}"), six = digitRegex(loc, "{6}"), oneOrTwo = digitRegex(loc, "{1,2}"), oneToThree = digitRegex(loc, "{1,3}"), oneToSix = digitRegex(loc, "{1,6}"), oneToNine = digitRegex(loc, "{1,9}"), twoToFour = digitRegex(loc, "{2,4}"), fourToSix = digitRegex(loc, "{4,6}"), literal = function literal2(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s2 = _ref5[0]; + return s2; + }, + literal: true + }; + }, unitate = function unitate2(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + case "G": + return oneOf(loc.eras("short", false), 0); + case "GG": + return oneOf(loc.eras("long", false), 0); + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true, false), 1); + case "MMMM": + return oneOf(loc.months("long", true, false), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false, false), 1); + case "LLLL": + return oneOf(loc.months("long", false, false), 1); + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one2); + case "a": + return oneOf(loc.meridiems(), 0); + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + case "E": + case "c": + return intUnit(one2); + case "EEE": + return oneOf(loc.weekdays("short", false, false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false, false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true, false), 1); + case "cccc": + return oneOf(loc.weekdays("long", true, false), 1); + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + default: + return literal(t); + } + }; + var unit2 = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit2.token = token; + return unit2; + } + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour: { + numeric: "h", + "2-digit": "hh" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + } + }; + function tokenForPart(part, locale2, formatOpts) { + var type2 = part.type, value = part.value; + if (type2 === "literal") { + return { + literal: true, + val: value + }; + } + var style = formatOpts[type2]; + var val = partTypeStyleToTokenVal[type2]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val + }; + } + return void 0; + } + function buildRegex(units) { + var re2 = units.map(function(u) { + return u.regex; + }).reduce(function(f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re2 + "$", units]; + } + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } + } + function dateTimeFromMatches(matches) { + var toField = function toField2(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function(r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; + } + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime2.fromMillis(1555555555555); + } + return dummyDateTimeCache; + } + function maybeExpandMacroToken(token, locale2) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + if (!formatOpts) { + return token; + } + var formatter = Formatter.create(locale2, formatOpts); + var parts = formatter.formatDateTimeParts(getDummyDateTime()); + var tokens = parts.map(function(p) { + return tokenForPart(p, locale2, formatOpts); + }); + if (tokens.includes(void 0)) { + return token; + } + return tokens; + } + function expandMacroTokens(tokens, locale2) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function(t) { + return maybeExpandMacroToken(t, locale2); + })); + } + function explainFromTokens(locale2, input, format2) { + var tokens = expandMacroTokens(Formatter.parseFormat(format2), locale2), units = tokens.map(function(t) { + return unitForToken(t, locale2); + }), disqualifyingUnit = units.find(function(t) { + return t.invalidReason; + }); + if (disqualifyingUnit) { + return { + input, + tokens, + invalidReason: disqualifyingUnit.invalidReason + }; + } else { + var _buildRegex = buildRegex(units), regexString = _buildRegex[0], handlers = _buildRegex[1], regex = RegExp(regexString, "i"), _match = match(input, regex, handlers), rawMatches = _match[0], matches = _match[1], _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, void 0], result = _ref6[0], zone = _ref6[1], specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input, + tokens, + regex, + rawMatches, + matches, + result, + zone, + specificOffset + }; + } + } + function parseFromTokens(locale2, input, format2) { + var _explainFromTokens = explainFromTokens(locale2, input, format2), result = _explainFromTokens.result, zone = _explainFromTokens.zone, specificOffset = _explainFromTokens.specificOffset, invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; + } + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + var leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit2, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit2 + ", which is invalid"); + } + function dayOfWeek(year, month, day) { + var js = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); + return js === 0 ? 7 : js; + } + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + function uncomputeOrdinal(year, ordinal2) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, month0 = table.findIndex(function(i) { + return i < ordinal2; + }), day = ordinal2 - table[month0]; + return { + month: month0 + 1, + day + }; + } + function gregorianToWeek(gregObj) { + var year = gregObj.year, month = gregObj.month, day = gregObj.day, ordinal2 = computeOrdinal(year, month, day), weekday = dayOfWeek(year, month, day); + var weekNumber = Math.floor((ordinal2 - weekday + 10) / 7), weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear); + } else if (weekNumber > weeksInWeekYear(year)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear, + weekNumber, + weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData) { + var weekYear = weekData.weekYear, weekNumber = weekData.weekNumber, weekday = weekData.weekday, weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), yearInDays = daysInYear(weekYear); + var ordinal2 = weekNumber * 7 + weekday - weekdayOfJan4 - 3, year; + if (ordinal2 < 1) { + year = weekYear - 1; + ordinal2 += daysInYear(year); + } else if (ordinal2 > yearInDays) { + year = weekYear + 1; + ordinal2 -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal2), month = _uncomputeOrdinal.month, day = _uncomputeOrdinal.day; + return _extends({ + year, + month, + day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, month = gregData.month, day = gregData.day; + var ordinal2 = computeOrdinal(year, month, day); + return _extends({ + year, + ordinal: ordinal2 + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, ordinal2 = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal2), month = _uncomputeOrdinal2.month, day = _uncomputeOrdinal2.day; + return _extends({ + year, + month, + day + }, timeObject(ordinalData)); + } + function hasInvalidWeekData(obj) { + var validYear = isInteger(obj.weekYear), validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.week); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else + return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else + return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), validMonth = integerBetween(obj.month, 1, 12), validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else + return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, minute = obj.minute, second = obj.second, millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, validMinute = integerBetween(minute, 0, 59), validSecond = integerBetween(second, 0, 59), validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else + return false; + } + var INVALID = "Invalid DateTime"; + var MAX_DATE = 864e13; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", 'the zone "' + zone.name + '" is not supported'); + } + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime2(_extends({}, current, alts, { + old: current + })); + } + function fixOffset(localTS, o, tz) { + var utcGuess = localTS - o * 60 * 1e3; + var o2 = tz.offset(utcGuess); + if (o === o2) { + return [utcGuess, o]; + } + utcGuess -= (o2 - o) * 60 * 1e3; + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + return [localTS - Math.min(o2, o3) * 60 * 1e3, Math.max(o2, o3)]; + } + function tsToObj(ts, offset2) { + ts += offset2 * 60 * 1e3; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + function objToTS(obj, offset2, zone) { + return fixOffset(objToLocalTS(obj), offset2, zone); + } + function adjustTime(inst, dur) { + var oPre = inst.o, year = inst.c.year + Math.trunc(dur.years), month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, c3 = _extends({}, inst.c, { + year, + month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), localTS = objToLocalTS(c3); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), ts = _fixOffset[0], o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + o = inst.zone.offset(ts); + } + return { + ts, + o + }; + } + function parseDataToDateTime(parsed, parsedZone, opts, format2, text2, specificOffset) { + var setZone = opts.setZone, zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0) { + var interpretationZone = parsedZone || zone, inst = DateTime2.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime2.invalid(new Invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ` + format2)); + } + } + function toTechFormat(dt, format2, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format2) : null; + } + function _toISODate(o, extended) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c3 = ""; + if (longFormat && o.c.year >= 0) + c3 += "+"; + c3 += padStart(o.c.year, longFormat ? 6 : 4); + if (extended) { + c3 += "-"; + c3 += padStart(o.c.month); + c3 += "-"; + c3 += padStart(o.c.day); + } else { + c3 += padStart(o.c.month); + c3 += padStart(o.c.day); + } + return c3; + } + function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset) { + var c3 = padStart(o.c.hour); + if (extended) { + c3 += ":"; + c3 += padStart(o.c.minute); + if (o.c.second !== 0 || !suppressSeconds) { + c3 += ":"; + } + } else { + c3 += padStart(o.c.minute); + } + if (o.c.second !== 0 || !suppressSeconds) { + c3 += padStart(o.c.second); + if (o.c.millisecond !== 0 || !suppressMilliseconds) { + c3 += "."; + c3 += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0) { + c3 += "Z"; + } else if (o.o < 0) { + c3 += "-"; + c3 += padStart(Math.trunc(-o.o / 60)); + c3 += ":"; + c3 += padStart(Math.trunc(-o.o % 60)); + } else { + c3 += "+"; + c3 += padStart(Math.trunc(o.o / 60)); + c3 += ":"; + c3 += padStart(Math.trunc(o.o % 60)); + } + } + return c3; + } + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"]; + var orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"]; + var orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + function normalizeUnit(unit2) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit2.toLowerCase()]; + if (!normalized) + throw new InvalidUnitError(unit2); + return normalized; + } + function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone), loc = Locale.fromObject(opts), tsNow = Settings.now(); + var ts, o; + if (!isUndefined(obj.year)) { + for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits), _step; !(_step = _iterator()).done; ) { + var u = _step.value; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime2.invalid(invalid); + } + var offsetProvis = zone.offset(tsNow); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = tsNow; + } + return new DateTime2({ + ts, + zone, + loc, + o + }); + } + function diffRelative(start2, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, format2 = function format3(c3, unit3) { + c3 = roundTo(c3, round || opts.calendary ? 0 : 2, true); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c3, unit3); + }, differ = function differ2(unit3) { + if (opts.calendary) { + if (!end.hasSame(start2, unit3)) { + return end.startOf(unit3).diff(start2.startOf(unit3), unit3).get(unit3); + } else + return 0; + } else { + return end.diff(start2, unit3).get(unit3); + } + }; + if (opts.unit) { + return format2(differ(opts.unit), opts.unit); + } + for (var _iterator2 = _createForOfIteratorHelperLoose(opts.units), _step2; !(_step2 = _iterator2()).done; ) { + var unit2 = _step2.value; + var count2 = differ(unit2); + if (Math.abs(count2) >= 1) { + return format2(count2, unit2); + } + } + return format2(start2 > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + function lastOpts(argList) { + var opts = {}, args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; + } + var DateTime2 = /* @__PURE__ */ function() { + function DateTime3(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c3 = null, o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c3 = _ref[0]; + o = _ref[1]; + } else { + var ot = zone.offset(this.ts); + c3 = tsToObj(this.ts, ot); + invalid = Number.isNaN(c3.year) ? new Invalid("invalid input") : null; + c3 = invalid ? null : c3; + o = invalid ? null : ot; + } + } + this._zone = zone; + this.loc = config.loc || Locale.create(); + this.invalid = invalid; + this.weekData = null; + this.c = c3; + this.o = o; + this.isLuxonDateTime = true; + } + DateTime3.now = function now3() { + return new DateTime3({}); + }; + DateTime3.local = function local() { + var _lastOpts = lastOpts(arguments), opts = _lastOpts[0], args = _lastOpts[1], year = args[0], month = args[1], day = args[2], hour = args[3], minute = args[4], second = args[5], millisecond = args[6]; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + }; + DateTime3.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), opts = _lastOpts2[0], args = _lastOpts2[1], year = args[0], month = args[1], day = args[2], hour = args[3], minute = args[4], second = args[5], millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + }; + DateTime3.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime3.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime3.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime3({ + ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + }; + DateTime3.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + return DateTime3.invalid("Timestamp out of range"); + } else { + return new DateTime3({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + }; + DateTime3.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime3({ + ts: seconds * 1e3, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + }; + DateTime3.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime3.invalid(unsupportedZone(zoneToUse)); + } + var tsNow = Settings.now(), offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), normalized = normalizeObject(obj, normalizeUnit), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber, loc = Locale.fromObject(opts); + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + var units, defaultValues, objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + var foundFirst = false; + for (var _iterator3 = _createForOfIteratorHelperLoose(units), _step3; !(_step3 = _iterator3()).done; ) { + var u = _step3.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime3.invalid(invalid); + } + var gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), tsFinal = _objToTS2[0], offsetFinal = _objToTS2[1], inst = new DateTime3({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc + }); + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime3.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + return inst; + }; + DateTime3.fromISO = function fromISO(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text2), vals = _parseISODate[0], parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text2); + }; + DateTime3.fromRFC2822 = function fromRFC2822(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text2), vals = _parseRFC2822Date[0], parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text2); + }; + DateTime3.fromHTTP = function fromHTTP(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text2), vals = _parseHTTPDate[0], parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + }; + DateTime3.fromFormat = function fromFormat(text2, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text2) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, _opts$locale = _opts.locale, locale2 = _opts$locale === void 0 ? null : _opts$locale, _opts$numberingSystem = _opts.numberingSystem, numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, localeToUse = Locale.fromOpts({ + locale: locale2, + numberingSystem, + defaultToEN: true + }), _parseFromTokens = parseFromTokens(localeToUse, text2, fmt), vals = _parseFromTokens[0], parsedZone = _parseFromTokens[1], specificOffset = _parseFromTokens[2], invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime3.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text2, specificOffset); + } + }; + DateTime3.fromString = function fromString(text2, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime3.fromFormat(text2, fmt, opts); + }; + DateTime3.fromSQL = function fromSQL(text2, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text2), vals = _parseSQL[0], parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text2); + }; + DateTime3.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid2); + } else { + return new DateTime3({ + invalid: invalid2 + }); + } + }; + DateTime3.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + }; + var _proto = DateTime3.prototype; + _proto.get = function get3(unit2) { + return this[unit2]; + }; + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), locale2 = _Formatter$create$res.locale, numberingSystem = _Formatter$create$res.numberingSystem, calendar = _Formatter$create$res.calendar; + return { + locale: locale2, + numberingSystem, + outputCalendar: calendar + }; + }; + _proto.toUTC = function toUTC(offset2, opts) { + if (offset2 === void 0) { + offset2 = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset2), opts); + }; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + }; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, _ref2$keepLocalTime = _ref2.keepLocalTime, keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, _ref2$keepCalendarTim = _ref2.keepCalendarTime, keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime3.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone + }); + } + }; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, locale2 = _ref3.locale, numberingSystem = _ref3.numberingSystem, outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale2, + numberingSystem, + outputCalendar + }); + return clone(this, { + loc + }); + }; + _proto.setLocale = function setLocale(locale2) { + return this.reconfigure({ + locale: locale2 + }); + }; + _proto.set = function set3(values) { + if (!this.isValid) + return this; + var normalized = normalizeObject(values, normalizeUnit), settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c), normalized)); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), ts = _objToTS4[0], o = _objToTS4[1]; + return clone(this, { + ts, + o + }); + }; + _proto.plus = function plus(duration) { + if (!this.isValid) + return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + }; + _proto.minus = function minus(duration) { + if (!this.isValid) + return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + }; + _proto.startOf = function startOf(unit2) { + if (!this.isValid) + return this; + var o = {}, normalizedUnit = Duration.normalizeUnit(unit2); + switch (normalizedUnit) { + case "years": + o.month = 1; + case "quarters": + case "months": + o.day = 1; + case "weeks": + case "days": + o.hour = 0; + case "hours": + o.minute = 0; + case "minutes": + o.second = 0; + case "seconds": + o.millisecond = 0; + break; + } + if (normalizedUnit === "weeks") { + o.weekday = 1; + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + }; + _proto.endOf = function endOf(unit2) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit2] = 1, _this$plus)).startOf(unit2).minus(1) : this; + }; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + }; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + }; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + }; + _proto.toISO = function toISO(_temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, _ref4$format = _ref4.format, format2 = _ref4$format === void 0 ? "extended" : _ref4$format, _ref4$suppressSeconds = _ref4.suppressSeconds, suppressSeconds = _ref4$suppressSeconds === void 0 ? false : _ref4$suppressSeconds, _ref4$suppressMillise = _ref4.suppressMilliseconds, suppressMilliseconds = _ref4$suppressMillise === void 0 ? false : _ref4$suppressMillise, _ref4$includeOffset = _ref4.includeOffset, includeOffset = _ref4$includeOffset === void 0 ? true : _ref4$includeOffset; + if (!this.isValid) { + return null; + } + var ext = format2 === "extended"; + var c3 = _toISODate(this, ext); + c3 += "T"; + c3 += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset); + return c3; + }; + _proto.toISODate = function toISODate(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, _ref5$format = _ref5.format, format2 = _ref5$format === void 0 ? "extended" : _ref5$format; + if (!this.isValid) { + return null; + } + return _toISODate(this, format2 === "extended"); + }; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + }; + _proto.toISOTime = function toISOTime(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, _ref6$suppressMillise = _ref6.suppressMilliseconds, suppressMilliseconds = _ref6$suppressMillise === void 0 ? false : _ref6$suppressMillise, _ref6$suppressSeconds = _ref6.suppressSeconds, suppressSeconds = _ref6$suppressSeconds === void 0 ? false : _ref6$suppressSeconds, _ref6$includeOffset = _ref6.includeOffset, includeOffset = _ref6$includeOffset === void 0 ? true : _ref6$includeOffset, _ref6$includePrefix = _ref6.includePrefix, includePrefix = _ref6$includePrefix === void 0 ? false : _ref6$includePrefix, _ref6$format = _ref6.format, format2 = _ref6$format === void 0 ? "extended" : _ref6$format; + if (!this.isValid) { + return null; + } + var c3 = includePrefix ? "T" : ""; + return c3 + _toISOTime(this, format2 === "extended", suppressSeconds, suppressMilliseconds, includeOffset); + }; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + }; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + }; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + }; + _proto.toSQLTime = function toSQLTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, _ref7$includeOffset = _ref7.includeOffset, includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, _ref7$includeZone = _ref7.includeZone, includeZone = _ref7$includeZone === void 0 ? false : _ref7$includeZone; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + fmt += " "; + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + }; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + }; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + }; + _proto.valueOf = function valueOf() { + return this.toMillis(); + }; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + }; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1e3 : NaN; + }; + _proto.toJSON = function toJSON() { + return this.toISO(); + }; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + }; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) + return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + }; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + }; + _proto.diff = function diff(otherDateTime, unit2, opts) { + if (unit2 === void 0) { + unit2 = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit2).map(Duration.normalizeUnit), otherIsLater = otherDateTime.valueOf() > this.valueOf(), earlier = otherIsLater ? this : otherDateTime, later = otherIsLater ? otherDateTime : this, diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + }; + _proto.diffNow = function diffNow(unit2, opts) { + if (unit2 === void 0) { + unit2 = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime3.now(), unit2, opts); + }; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + }; + _proto.hasSame = function hasSame(otherDateTime, unit2) { + if (!this.isValid) + return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit2) <= inputMs && inputMs <= adjustedToZone.endOf(unit2); + }; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + }; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) + return null; + var base = options.base || DateTime3.fromObject({}, { + zone: this.zone + }), padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit2 = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit2 = void 0; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units, + unit: unit2 + })); + }; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) + return null; + return diffRelative(options.base || DateTime3.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + }; + DateTime3.min = function min3() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime3.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function(i) { + return i.valueOf(); + }, Math.min); + }; + DateTime3.max = function max4() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime3.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function(i) { + return i.valueOf(); + }, Math.max); + }; + DateTime3.fromFormatExplain = function fromFormatExplain(text2, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$locale = _options.locale, locale2 = _options$locale === void 0 ? null : _options$locale, _options$numberingSys = _options.numberingSystem, numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, localeToUse = Locale.fromOpts({ + locale: locale2, + numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text2, fmt); + }; + DateTime3.fromStringExplain = function fromStringExplain(text2, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime3.fromFormatExplain(text2, fmt, options); + }; + _createClass(DateTime3, [{ + key: "isValid", + get: function get3() { + return this.invalid === null; + } + }, { + key: "invalidReason", + get: function get3() { + return this.invalid ? this.invalid.reason : null; + } + }, { + key: "invalidExplanation", + get: function get3() { + return this.invalid ? this.invalid.explanation : null; + } + }, { + key: "locale", + get: function get3() { + return this.isValid ? this.loc.locale : null; + } + }, { + key: "numberingSystem", + get: function get3() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "outputCalendar", + get: function get3() { + return this.isValid ? this.loc.outputCalendar : null; + } + }, { + key: "zone", + get: function get3() { + return this._zone; + } + }, { + key: "zoneName", + get: function get3() { + return this.isValid ? this.zone.name : null; + } + }, { + key: "year", + get: function get3() { + return this.isValid ? this.c.year : NaN; + } + }, { + key: "quarter", + get: function get3() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + }, { + key: "month", + get: function get3() { + return this.isValid ? this.c.month : NaN; + } + }, { + key: "day", + get: function get3() { + return this.isValid ? this.c.day : NaN; + } + }, { + key: "hour", + get: function get3() { + return this.isValid ? this.c.hour : NaN; + } + }, { + key: "minute", + get: function get3() { + return this.isValid ? this.c.minute : NaN; + } + }, { + key: "second", + get: function get3() { + return this.isValid ? this.c.second : NaN; + } + }, { + key: "millisecond", + get: function get3() { + return this.isValid ? this.c.millisecond : NaN; + } + }, { + key: "weekYear", + get: function get3() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + }, { + key: "weekNumber", + get: function get3() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + }, { + key: "weekday", + get: function get3() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + }, { + key: "ordinal", + get: function get3() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + }, { + key: "monthShort", + get: function get3() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + }, { + key: "monthLong", + get: function get3() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + }, { + key: "weekdayShort", + get: function get3() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + }, { + key: "weekdayLong", + get: function get3() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + }, { + key: "offset", + get: function get3() { + return this.isValid ? +this.o : NaN; + } + }, { + key: "offsetNameShort", + get: function get3() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + }, { + key: "offsetNameLong", + get: function get3() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + }, { + key: "isOffsetFixed", + get: function get3() { + return this.isValid ? this.zone.isUniversal : null; + } + }, { + key: "isInDST", + get: function get3() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get3() { + return isLeapYear(this.year); + } + }, { + key: "daysInMonth", + get: function get3() { + return daysInMonth(this.year, this.month); + } + }, { + key: "daysInYear", + get: function get3() { + return this.isValid ? daysInYear(this.year) : NaN; + } + }, { + key: "weeksInWeekYear", + get: function get3() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get3() { + return DATE_SHORT; + } + }, { + key: "DATE_MED", + get: function get3() { + return DATE_MED; + } + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get3() { + return DATE_MED_WITH_WEEKDAY; + } + }, { + key: "DATE_FULL", + get: function get3() { + return DATE_FULL; + } + }, { + key: "DATE_HUGE", + get: function get3() { + return DATE_HUGE; + } + }, { + key: "TIME_SIMPLE", + get: function get3() { + return TIME_SIMPLE; + } + }, { + key: "TIME_WITH_SECONDS", + get: function get3() { + return TIME_WITH_SECONDS; + } + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get3() { + return TIME_WITH_SHORT_OFFSET; + } + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get3() { + return TIME_WITH_LONG_OFFSET; + } + }, { + key: "TIME_24_SIMPLE", + get: function get3() { + return TIME_24_SIMPLE; + } + }, { + key: "TIME_24_WITH_SECONDS", + get: function get3() { + return TIME_24_WITH_SECONDS; + } + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get3() { + return TIME_24_WITH_SHORT_OFFSET; + } + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get3() { + return TIME_24_WITH_LONG_OFFSET; + } + }, { + key: "DATETIME_SHORT", + get: function get3() { + return DATETIME_SHORT; + } + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get3() { + return DATETIME_SHORT_WITH_SECONDS; + } + }, { + key: "DATETIME_MED", + get: function get3() { + return DATETIME_MED; + } + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get3() { + return DATETIME_MED_WITH_SECONDS; + } + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get3() { + return DATETIME_MED_WITH_WEEKDAY; + } + }, { + key: "DATETIME_FULL", + get: function get3() { + return DATETIME_FULL; + } + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get3() { + return DATETIME_FULL_WITH_SECONDS; + } + }, { + key: "DATETIME_HUGE", + get: function get3() { + return DATETIME_HUGE; + } + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get3() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime3; + }(); + function friendlyDateTime(dateTimeish) { + if (DateTime2.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime2.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime2.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + var VERSION = "2.3.0"; + exports.DateTime = DateTime2; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.Settings = Settings; + exports.SystemZone = SystemZone; + exports.VERSION = VERSION; + exports.Zone = Zone; + } +}); + +// node_modules/lodash/lodash.js +var require_lodash = __commonJS({ + "node_modules/lodash/lodash.js"(exports, module2) { + (function() { + var undefined2; + var VERSION = "4.17.21"; + var LARGE_ARRAY_SIZE = 200; + var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`"; + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var MAX_MEMOIZE_SIZE = 500; + var PLACEHOLDER = "__lodash_placeholder__"; + var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; + var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; + var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; + var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "..."; + var HOT_COUNT = 800, HOT_SPAN = 16; + var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; + var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0; + var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + var wrapFlags = [ + ["ary", WRAP_ARY_FLAG], + ["bind", WRAP_BIND_FLAG], + ["bindKey", WRAP_BIND_KEY_FLAG], + ["curry", WRAP_CURRY_FLAG], + ["curryRight", WRAP_CURRY_RIGHT_FLAG], + ["flip", WRAP_FLIP_FLAG], + ["partial", WRAP_PARTIAL_FLAG], + ["partialRight", WRAP_PARTIAL_RIGHT_FLAG], + ["rearg", WRAP_REARG_FLAG] + ]; + var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]"; + var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; + var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); + var reTrimStart = /^\s+/; + var reWhitespace = /\s/; + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + var reEscapeChar = /\\(\\)?/g; + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + var reFlags = /\w*$/; + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + var reIsBinary = /^0b[01]+$/i; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + var reIsOctal = /^0o[0-7]+$/i; + var reIsUint = /^(?:0|[1-9]\d*)$/; + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + var reNoMatch = /($^)/; + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d"; + var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; + var reApos = RegExp(rsApos, "g"); + var reComboMark = RegExp(rsCombo, "g"); + var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); + var reUnicodeWord = RegExp([ + rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", + rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")", + rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower, + rsUpper + "+" + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join("|"), "g"); + var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]"); + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + var contextProps = [ + "Array", + "Buffer", + "DataView", + "Date", + "Error", + "Float32Array", + "Float64Array", + "Function", + "Int8Array", + "Int16Array", + "Int32Array", + "Map", + "Math", + "Object", + "Promise", + "RegExp", + "Set", + "String", + "Symbol", + "TypeError", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "WeakMap", + "_", + "clearTimeout", + "isFinite", + "parseInt", + "setTimeout" + ]; + var templateCounter = -1; + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; + var deburredLetters = { + "\xC0": "A", + "\xC1": "A", + "\xC2": "A", + "\xC3": "A", + "\xC4": "A", + "\xC5": "A", + "\xE0": "a", + "\xE1": "a", + "\xE2": "a", + "\xE3": "a", + "\xE4": "a", + "\xE5": "a", + "\xC7": "C", + "\xE7": "c", + "\xD0": "D", + "\xF0": "d", + "\xC8": "E", + "\xC9": "E", + "\xCA": "E", + "\xCB": "E", + "\xE8": "e", + "\xE9": "e", + "\xEA": "e", + "\xEB": "e", + "\xCC": "I", + "\xCD": "I", + "\xCE": "I", + "\xCF": "I", + "\xEC": "i", + "\xED": "i", + "\xEE": "i", + "\xEF": "i", + "\xD1": "N", + "\xF1": "n", + "\xD2": "O", + "\xD3": "O", + "\xD4": "O", + "\xD5": "O", + "\xD6": "O", + "\xD8": "O", + "\xF2": "o", + "\xF3": "o", + "\xF4": "o", + "\xF5": "o", + "\xF6": "o", + "\xF8": "o", + "\xD9": "U", + "\xDA": "U", + "\xDB": "U", + "\xDC": "U", + "\xF9": "u", + "\xFA": "u", + "\xFB": "u", + "\xFC": "u", + "\xDD": "Y", + "\xFD": "y", + "\xFF": "y", + "\xC6": "Ae", + "\xE6": "ae", + "\xDE": "Th", + "\xFE": "th", + "\xDF": "ss", + "\u0100": "A", + "\u0102": "A", + "\u0104": "A", + "\u0101": "a", + "\u0103": "a", + "\u0105": "a", + "\u0106": "C", + "\u0108": "C", + "\u010A": "C", + "\u010C": "C", + "\u0107": "c", + "\u0109": "c", + "\u010B": "c", + "\u010D": "c", + "\u010E": "D", + "\u0110": "D", + "\u010F": "d", + "\u0111": "d", + "\u0112": "E", + "\u0114": "E", + "\u0116": "E", + "\u0118": "E", + "\u011A": "E", + "\u0113": "e", + "\u0115": "e", + "\u0117": "e", + "\u0119": "e", + "\u011B": "e", + "\u011C": "G", + "\u011E": "G", + "\u0120": "G", + "\u0122": "G", + "\u011D": "g", + "\u011F": "g", + "\u0121": "g", + "\u0123": "g", + "\u0124": "H", + "\u0126": "H", + "\u0125": "h", + "\u0127": "h", + "\u0128": "I", + "\u012A": "I", + "\u012C": "I", + "\u012E": "I", + "\u0130": "I", + "\u0129": "i", + "\u012B": "i", + "\u012D": "i", + "\u012F": "i", + "\u0131": "i", + "\u0134": "J", + "\u0135": "j", + "\u0136": "K", + "\u0137": "k", + "\u0138": "k", + "\u0139": "L", + "\u013B": "L", + "\u013D": "L", + "\u013F": "L", + "\u0141": "L", + "\u013A": "l", + "\u013C": "l", + "\u013E": "l", + "\u0140": "l", + "\u0142": "l", + "\u0143": "N", + "\u0145": "N", + "\u0147": "N", + "\u014A": "N", + "\u0144": "n", + "\u0146": "n", + "\u0148": "n", + "\u014B": "n", + "\u014C": "O", + "\u014E": "O", + "\u0150": "O", + "\u014D": "o", + "\u014F": "o", + "\u0151": "o", + "\u0154": "R", + "\u0156": "R", + "\u0158": "R", + "\u0155": "r", + "\u0157": "r", + "\u0159": "r", + "\u015A": "S", + "\u015C": "S", + "\u015E": "S", + "\u0160": "S", + "\u015B": "s", + "\u015D": "s", + "\u015F": "s", + "\u0161": "s", + "\u0162": "T", + "\u0164": "T", + "\u0166": "T", + "\u0163": "t", + "\u0165": "t", + "\u0167": "t", + "\u0168": "U", + "\u016A": "U", + "\u016C": "U", + "\u016E": "U", + "\u0170": "U", + "\u0172": "U", + "\u0169": "u", + "\u016B": "u", + "\u016D": "u", + "\u016F": "u", + "\u0171": "u", + "\u0173": "u", + "\u0174": "W", + "\u0175": "w", + "\u0176": "Y", + "\u0177": "y", + "\u0178": "Y", + "\u0179": "Z", + "\u017B": "Z", + "\u017D": "Z", + "\u017A": "z", + "\u017C": "z", + "\u017E": "z", + "\u0132": "IJ", + "\u0133": "ij", + "\u0152": "Oe", + "\u0153": "oe", + "\u0149": "'n", + "\u017F": "s" + }; + var htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + var htmlUnescapes = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'" + }; + var stringEscapes = { + "\\": "\\", + "'": "'", + "\n": "n", + "\r": "r", + "\u2028": "u2028", + "\u2029": "u2029" + }; + var freeParseFloat = parseFloat, freeParseInt = parseInt; + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root2 = freeGlobal || freeSelf || Function("return this")(); + var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2; + var moduleExports = freeModule && freeModule.exports === freeExports; + var freeProcess = moduleExports && freeGlobal.process; + var nodeUtil = function() { + try { + var types = freeModule && freeModule.require && freeModule.require("util").types; + if (types) { + return types; + } + return freeProcess && freeProcess.binding && freeProcess.binding("util"); + } catch (e) { + } + }(); + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + function apply(func, thisArg, args) { + switch (args.length) { + case 0: + return func.call(thisArg); + case 1: + return func.call(thisArg, args[0]); + case 2: + return func.call(thisArg, args[0], args[1]); + case 3: + return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + function arrayAggregator(array, setter, iteratee, accumulator) { + var index2 = -1, length = array == null ? 0 : array.length; + while (++index2 < length) { + var value = array[index2]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + function arrayEach(array, iteratee) { + var index2 = -1, length = array == null ? 0 : array.length; + while (++index2 < length) { + if (iteratee(array[index2], index2, array) === false) { + break; + } + } + return array; + } + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + function arrayEvery(array, predicate) { + var index2 = -1, length = array == null ? 0 : array.length; + while (++index2 < length) { + if (!predicate(array[index2], index2, array)) { + return false; + } + } + return true; + } + function arrayFilter(array, predicate) { + var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; + while (++index2 < length) { + var value = array[index2]; + if (predicate(value, index2, array)) { + result[resIndex++] = value; + } + } + return result; + } + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + function arrayIncludesWith(array, value, comparator) { + var index2 = -1, length = array == null ? 0 : array.length; + while (++index2 < length) { + if (comparator(value, array[index2])) { + return true; + } + } + return false; + } + function arrayMap(array, iteratee) { + var index2 = -1, length = array == null ? 0 : array.length, result = Array(length); + while (++index2 < length) { + result[index2] = iteratee(array[index2], index2, array); + } + return result; + } + function arrayPush(array, values) { + var index2 = -1, length = values.length, offset = array.length; + while (++index2 < length) { + array[offset + index2] = values[index2]; + } + return array; + } + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index2 = -1, length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[++index2]; + } + while (++index2 < length) { + accumulator = iteratee(accumulator, array[index2], index2, array); + } + return accumulator; + } + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + function arraySome(array, predicate) { + var index2 = -1, length = array == null ? 0 : array.length; + while (++index2 < length) { + if (predicate(array[index2], index2, array)) { + return true; + } + } + return false; + } + var asciiSize = baseProperty("length"); + function asciiToArray(string) { + return string.split(""); + } + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection2) { + if (predicate(value, key, collection2)) { + result = key; + return false; + } + }); + return result; + } + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1); + while (fromRight ? index2-- : ++index2 < length) { + if (predicate(array[index2], index2, array)) { + return index2; + } + } + return -1; + } + function baseIndexOf(array, value, fromIndex) { + return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); + } + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index2 = fromIndex - 1, length = array.length; + while (++index2 < length) { + if (comparator(array[index2], value)) { + return index2; + } + } + return -1; + } + function baseIsNaN(value) { + return value !== value; + } + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? baseSum(array, iteratee) / length : NAN; + } + function baseProperty(key) { + return function(object) { + return object == null ? undefined2 : object[key]; + }; + } + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined2 : object[key]; + }; + } + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index2, collection2) { + accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index2, collection2); + }); + return accumulator; + } + function baseSortBy(array, comparer) { + var length = array.length; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + function baseSum(array, iteratee) { + var result, index2 = -1, length = array.length; + while (++index2 < length) { + var current = iteratee(array[index2]); + if (current !== undefined2) { + result = result === undefined2 ? current : result + current; + } + } + return result; + } + function baseTimes(n, iteratee) { + var index2 = -1, result = Array(n); + while (++index2 < n) { + result[index2] = iteratee(index2); + } + return result; + } + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; + } + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + function cacheHas(cache, key) { + return cache.has(key); + } + function charsStartIndex(strSymbols, chrSymbols) { + var index2 = -1, length = strSymbols.length; + while (++index2 < length && baseIndexOf(chrSymbols, strSymbols[index2], 0) > -1) { + } + return index2; + } + function charsEndIndex(strSymbols, chrSymbols) { + var index2 = strSymbols.length; + while (index2-- && baseIndexOf(chrSymbols, strSymbols[index2], 0) > -1) { + } + return index2; + } + function countHolders(array, placeholder) { + var length = array.length, result = 0; + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + var deburrLetter = basePropertyOf(deburredLetters); + var escapeHtmlChar = basePropertyOf(htmlEscapes); + function escapeStringChar(chr) { + return "\\" + stringEscapes[chr]; + } + function getValue(object, key) { + return object == null ? undefined2 : object[key]; + } + function hasUnicode(string) { + return reHasUnicode.test(string); + } + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + function iteratorToArray(iterator) { + var data, result = []; + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + function mapToArray(map2) { + var index2 = -1, result = Array(map2.size); + map2.forEach(function(value, key) { + result[++index2] = [key, value]; + }); + return result; + } + function overArg(func, transform2) { + return function(arg) { + return func(transform2(arg)); + }; + } + function replaceHolders(array, placeholder) { + var index2 = -1, length = array.length, resIndex = 0, result = []; + while (++index2 < length) { + var value = array[index2]; + if (value === placeholder || value === PLACEHOLDER) { + array[index2] = PLACEHOLDER; + result[resIndex++] = index2; + } + } + return result; + } + function setToArray(set3) { + var index2 = -1, result = Array(set3.size); + set3.forEach(function(value) { + result[++index2] = value; + }); + return result; + } + function setToPairs(set3) { + var index2 = -1, result = Array(set3.size); + set3.forEach(function(value) { + result[++index2] = [value, value]; + }); + return result; + } + function strictIndexOf(array, value, fromIndex) { + var index2 = fromIndex - 1, length = array.length; + while (++index2 < length) { + if (array[index2] === value) { + return index2; + } + } + return -1; + } + function strictLastIndexOf(array, value, fromIndex) { + var index2 = fromIndex + 1; + while (index2--) { + if (array[index2] === value) { + return index2; + } + } + return index2; + } + function stringSize(string) { + return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); + } + function stringToArray(string) { + return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); + } + function trimmedEndIndex(string) { + var index2 = string.length; + while (index2-- && reWhitespace.test(string.charAt(index2))) { + } + return index2; + } + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + var runInContext = function runInContext2(context) { + context = context == null ? root2 : _.defaults(root2.Object(), context, _.pick(root2, contextProps)); + var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError; + var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype; + var coreJsData = context["__core-js_shared__"]; + var funcToString = funcProto.toString; + var hasOwnProperty = objectProto.hasOwnProperty; + var idCounter = 0; + var maskSrcKey = function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); + return uid ? "Symbol(src)_1." + uid : ""; + }(); + var nativeObjectToString = objectProto.toString; + var objectCtorString = funcToString.call(Object2); + var oldDash = root2._; + var reIsNative = RegExp2("^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"); + var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2; + var defineProperty = function() { + try { + var func = getNative(Object2, "defineProperty"); + func({}, "", {}); + return func; + } catch (e) { + } + }(); + var ctxClearTimeout = context.clearTimeout !== root2.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root2.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root2.setTimeout && context.setTimeout; + var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse; + var DataView2 = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create"); + var metaMap = WeakMap && new WeakMap(); + var realNames = {}; + var dataViewCtorString = toSource(DataView2), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap); + var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2; + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, "__wrapped__")) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + var baseCreate = function() { + function object() { + } + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result2 = new object(); + object.prototype = undefined2; + return result2; + }; + }(); + function baseLodash() { + } + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined2; + } + lodash.templateSettings = { + "escape": reEscape, + "evaluate": reEvaluate, + "interpolate": reInterpolate, + "variable": "", + "imports": { + "_": lodash + } + }; + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + function lazyClone() { + var result2 = new LazyWrapper(this.__wrapped__); + result2.__actions__ = copyArray(this.__actions__); + result2.__dir__ = this.__dir__; + result2.__filtered__ = this.__filtered__; + result2.__iteratees__ = copyArray(this.__iteratees__); + result2.__takeCount__ = this.__takeCount__; + result2.__views__ = copyArray(this.__views__); + return result2; + } + function lazyReverse() { + if (this.__filtered__) { + var result2 = new LazyWrapper(this); + result2.__dir__ = -1; + result2.__filtered__ = true; + } else { + result2 = this.clone(); + result2.__dir__ *= -1; + } + return result2; + } + function lazyValue() { + var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end = view.end, length = end - start2, index2 = isRight ? end : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__); + if (!isArr || !isRight && arrLength == length && takeCount == length) { + return baseWrapperValue(array, this.__actions__); + } + var result2 = []; + outer: + while (length-- && resIndex < takeCount) { + index2 += dir; + var iterIndex = -1, value = array[index2]; + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], iteratee2 = data.iteratee, type2 = data.type, computed = iteratee2(value); + if (type2 == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type2 == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result2[resIndex++] = value; + } + return result2; + } + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + function Hash(entries) { + var index2 = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index2 < length) { + var entry = entries[index2]; + this.set(entry[0], entry[1]); + } + } + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + function hashDelete(key) { + var result2 = this.has(key) && delete this.__data__[key]; + this.size -= result2 ? 1 : 0; + return result2; + } + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result2 = data[key]; + return result2 === HASH_UNDEFINED ? undefined2 : result2; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined2; + } + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined2 : hasOwnProperty.call(data, key); + } + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value; + return this; + } + Hash.prototype.clear = hashClear; + Hash.prototype["delete"] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + function ListCache(entries) { + var index2 = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index2 < length) { + var entry = entries[index2]; + this.set(entry[0], entry[1]); + } + } + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + function listCacheDelete(key) { + var data = this.__data__, index2 = assocIndexOf(data, key); + if (index2 < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index2 == lastIndex) { + data.pop(); + } else { + splice.call(data, index2, 1); + } + --this.size; + return true; + } + function listCacheGet(key) { + var data = this.__data__, index2 = assocIndexOf(data, key); + return index2 < 0 ? undefined2 : data[index2][1]; + } + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + function listCacheSet(key, value) { + var data = this.__data__, index2 = assocIndexOf(data, key); + if (index2 < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index2][1] = value; + } + return this; + } + ListCache.prototype.clear = listCacheClear; + ListCache.prototype["delete"] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + function MapCache(entries) { + var index2 = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index2 < length) { + var entry = entries[index2]; + this.set(entry[0], entry[1]); + } + } + function mapCacheClear() { + this.size = 0; + this.__data__ = { + "hash": new Hash(), + "map": new (Map2 || ListCache)(), + "string": new Hash() + }; + } + function mapCacheDelete(key) { + var result2 = getMapData(this, key)["delete"](key); + this.size -= result2 ? 1 : 0; + return result2; + } + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + function mapCacheSet(key, value) { + var data = getMapData(this, key), size2 = data.size; + data.set(key, value); + this.size += data.size == size2 ? 0 : 1; + return this; + } + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype["delete"] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + function SetCache(values2) { + var index2 = -1, length = values2 == null ? 0 : values2.length; + this.__data__ = new MapCache(); + while (++index2 < length) { + this.add(values2[index2]); + } + } + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + function setCacheHas(value) { + return this.__data__.has(value); + } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + function stackClear() { + this.__data__ = new ListCache(); + this.size = 0; + } + function stackDelete(key) { + var data = this.__data__, result2 = data["delete"](key); + this.size = data.size; + return result2; + } + function stackGet(key) { + return this.__data__.get(key); + } + function stackHas(key) { + return this.__data__.has(key); + } + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + Stack.prototype.clear = stackClear; + Stack.prototype["delete"] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length; + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) { + result2.push(key); + } + } + return result2; + } + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined2; + } + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + function assignMergeValue(object, key, value) { + if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + function baseAggregator(collection, setter, iteratee2, accumulator) { + baseEach(collection, function(value, key, collection2) { + setter(accumulator, value, iteratee2(value), collection2); + }); + return accumulator; + } + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + function baseAssignValue(object, key, value) { + if (key == "__proto__" && defineProperty) { + defineProperty(object, key, { + "configurable": true, + "enumerable": true, + "value": value, + "writable": true + }); + } else { + object[key] = value; + } + } + function baseAt(object, paths) { + var index2 = -1, length = paths.length, result2 = Array2(length), skip = object == null; + while (++index2 < length) { + result2[index2] = skip ? undefined2 : get3(object, paths[index2]); + } + return result2; + } + function baseClamp(number3, lower2, upper) { + if (number3 === number3) { + if (upper !== undefined2) { + number3 = number3 <= upper ? number3 : upper; + } + if (lower2 !== undefined2) { + number3 = number3 >= lower2 ? number3 : lower2; + } + } + return number3; + } + function baseClone(value, bitmask, customizer, key, object, stack) { + var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; + if (customizer) { + result2 = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result2 !== undefined2) { + return result2; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result2 = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result2); + } + } else { + var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || isFunc && !object) { + result2 = isFlat || isFunc ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result2 = initCloneByTag(value, tag, isDeep); + } + } + stack || (stack = new Stack()); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result2); + if (isSet(value)) { + value.forEach(function(subValue) { + result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key2) { + result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + } + var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys; + var props = isArr ? undefined2 : keysFunc(value); + arrayEach(props || value, function(subValue, key2) { + if (props) { + key2 = subValue; + subValue = value[key2]; + } + assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + return result2; + } + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object2(object); + while (length--) { + var key = props[length], predicate = source[key], value = object[key]; + if (value === undefined2 && !(key in object) || !predicate(value)) { + return false; + } + } + return true; + } + function baseDelay(func, wait2, args) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return setTimeout2(function() { + func.apply(undefined2, args); + }, wait2); + } + function baseDifference(array, values2, iteratee2, comparator) { + var index2 = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length; + if (!length) { + return result2; + } + if (iteratee2) { + values2 = arrayMap(values2, baseUnary(iteratee2)); + } + if (comparator) { + includes2 = arrayIncludesWith; + isCommon = false; + } else if (values2.length >= LARGE_ARRAY_SIZE) { + includes2 = cacheHas; + isCommon = false; + values2 = new SetCache(values2); + } + outer: + while (++index2 < length) { + var value = array[index2], computed = iteratee2 == null ? value : iteratee2(value); + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values2[valuesIndex] === computed) { + continue outer; + } + } + result2.push(value); + } else if (!includes2(values2, computed, comparator)) { + result2.push(value); + } + } + return result2; + } + var baseEach = createBaseEach(baseForOwn); + var baseEachRight = createBaseEach(baseForOwnRight, true); + function baseEvery(collection, predicate) { + var result2 = true; + baseEach(collection, function(value, index2, collection2) { + result2 = !!predicate(value, index2, collection2); + return result2; + }); + return result2; + } + function baseExtremum(array, iteratee2, comparator) { + var index2 = -1, length = array.length; + while (++index2 < length) { + var value = array[index2], current = iteratee2(value); + if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) { + var computed = current, result2 = value; + } + } + return result2; + } + function baseFill(array, value, start2, end) { + var length = array.length; + start2 = toInteger(start2); + if (start2 < 0) { + start2 = -start2 > length ? 0 : length + start2; + } + end = end === undefined2 || end > length ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start2 > end ? 0 : toLength(end); + while (start2 < end) { + array[start2++] = value; + } + return array; + } + function baseFilter(collection, predicate) { + var result2 = []; + baseEach(collection, function(value, index2, collection2) { + if (predicate(value, index2, collection2)) { + result2.push(value); + } + }); + return result2; + } + function baseFlatten(array, depth, predicate, isStrict, result2) { + var index2 = -1, length = array.length; + predicate || (predicate = isFlattenable); + result2 || (result2 = []); + while (++index2 < length) { + var value = array[index2]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + baseFlatten(value, depth - 1, predicate, isStrict, result2); + } else { + arrayPush(result2, value); + } + } else if (!isStrict) { + result2[result2.length] = value; + } + } + return result2; + } + var baseFor = createBaseFor(); + var baseForRight = createBaseFor(true); + function baseForOwn(object, iteratee2) { + return object && baseFor(object, iteratee2, keys); + } + function baseForOwnRight(object, iteratee2) { + return object && baseForRight(object, iteratee2, keys); + } + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + function baseGet(object, path2) { + path2 = castPath(path2, object); + var index2 = 0, length = path2.length; + while (object != null && index2 < length) { + object = object[toKey(path2[index2++])]; + } + return index2 && index2 == length ? object : undefined2; + } + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result2 = keysFunc(object); + return isArray(object) ? result2 : arrayPush(result2, symbolsFunc(object)); + } + function baseGetTag(value) { + if (value == null) { + return value === undefined2 ? undefinedTag : nullTag; + } + return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value); + } + function baseGt(value, other) { + return value > other; + } + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + function baseHasIn(object, key) { + return object != null && key in Object2(object); + } + function baseInRange(number3, start2, end) { + return number3 >= nativeMin(start2, end) && number3 < nativeMax(start2, end); + } + function baseIntersection(arrays, iteratee2, comparator) { + var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = []; + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee2) { + array = arrayMap(array, baseUnary(iteratee2)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2; + } + array = arrays[0]; + var index2 = -1, seen = caches[0]; + outer: + while (++index2 < length && result2.length < maxLength) { + var value = array[index2], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseInverter(object, setter, iteratee2, accumulator) { + baseForOwn(object, function(value, key, object2) { + setter(accumulator, iteratee2(value), key, object2); + }); + return accumulator; + } + function baseInvoke(object, path2, args) { + path2 = castPath(path2, object); + object = parent(object, path2); + var func = object == null ? object : object[toKey(last(path2))]; + return func == null ? undefined2 : apply(func, object, args); + } + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack()); + return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty.call(other, "__wrapped__"); + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; + stack || (stack = new Stack()); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack()); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + function baseIsMatch(object, source, matchData, customizer) { + var index2 = matchData.length, length = index2, noCustomizer = !customizer; + if (object == null) { + return !length; + } + object = Object2(object); + while (index2--) { + var data = matchData[index2]; + if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { + return false; + } + } + while (++index2 < length) { + data = matchData[index2]; + var key = data[0], objValue = object[key], srcValue = data[1]; + if (noCustomizer && data[2]) { + if (objValue === undefined2 && !(key in object)) { + return false; + } + } else { + var stack = new Stack(); + if (customizer) { + var result2 = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) { + return false; + } + } + } + return true; + } + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + function baseIsTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + function baseIteratee(value) { + if (typeof value == "function") { + return value; + } + if (value == null) { + return identity4; + } + if (typeof value == "object") { + return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); + } + return property(value); + } + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result2 = []; + for (var key in Object2(object)) { + if (hasOwnProperty.call(object, key) && key != "constructor") { + result2.push(key); + } + } + return result2; + } + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), result2 = []; + for (var key in object) { + if (!(key == "constructor" && (isProto || !hasOwnProperty.call(object, key)))) { + result2.push(key); + } + } + return result2; + } + function baseLt(value, other) { + return value < other; + } + function baseMap(collection, iteratee2) { + var index2 = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value, key, collection2) { + result2[++index2] = iteratee2(value, key, collection2); + }); + return result2; + } + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + function baseMatchesProperty(path2, srcValue) { + if (isKey(path2) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path2), srcValue); + } + return function(object) { + var objValue = get3(object, path2); + return objValue === undefined2 && objValue === srcValue ? hasIn(object, path2) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack()); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } else { + var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2; + if (newValue === undefined2) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue); + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2; + var isCommon = newValue === undefined2; + if (isCommon) { + var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } else { + newValue = []; + } + } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } else { + isCommon = false; + } + } + if (isCommon) { + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack["delete"](srcValue); + } + assignMergeValue(object, key, newValue); + } + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined2; + } + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee2) { + if (isArray(iteratee2)) { + return function(value) { + return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2); + }; + } + return iteratee2; + }); + } else { + iteratees = [identity4]; + } + var index2 = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + var result2 = baseMap(collection, function(value, key, collection2) { + var criteria = arrayMap(iteratees, function(iteratee2) { + return iteratee2(value); + }); + return { "criteria": criteria, "index": ++index2, "value": value }; + }); + return baseSortBy(result2, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path2) { + return hasIn(object, path2); + }); + } + function basePickBy(object, paths, predicate) { + var index2 = -1, length = paths.length, result2 = {}; + while (++index2 < length) { + var path2 = paths[index2], value = baseGet(object, path2); + if (predicate(value, path2)) { + baseSet(result2, castPath(path2, object), value); + } + } + return result2; + } + function basePropertyDeep(path2) { + return function(object) { + return baseGet(object, path2); + }; + } + function basePullAll(array, values2, iteratee2, comparator) { + var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index2 = -1, length = values2.length, seen = array; + if (array === values2) { + values2 = copyArray(values2); + } + if (iteratee2) { + seen = arrayMap(array, baseUnary(iteratee2)); + } + while (++index2 < length) { + var fromIndex = 0, value = values2[index2], computed = iteratee2 ? iteratee2(value) : value; + while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, lastIndex = length - 1; + while (length--) { + var index2 = indexes[length]; + if (length == lastIndex || index2 !== previous) { + var previous = index2; + if (isIndex(index2)) { + splice.call(array, index2, 1); + } else { + baseUnset(array, index2); + } + } + } + return array; + } + function baseRandom(lower2, upper) { + return lower2 + nativeFloor(nativeRandom() * (upper - lower2 + 1)); + } + function baseRange(start2, end, step, fromRight) { + var index2 = -1, length = nativeMax(nativeCeil((end - start2) / (step || 1)), 0), result2 = Array2(length); + while (length--) { + result2[fromRight ? length : ++index2] = start2; + start2 += step; + } + return result2; + } + function baseRepeat(string, n) { + var result2 = ""; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result2; + } + do { + if (n % 2) { + result2 += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + return result2; + } + function baseRest(func, start2) { + return setToString(overRest(func, start2, identity4), func + ""); + } + function baseSample(collection) { + return arraySample(values(collection)); + } + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + function baseSet(object, path2, value, customizer) { + if (!isObject(object)) { + return object; + } + path2 = castPath(path2, object); + var index2 = -1, length = path2.length, lastIndex = length - 1, nested = object; + while (nested != null && ++index2 < length) { + var key = toKey(path2[index2]), newValue = value; + if (key === "__proto__" || key === "constructor" || key === "prototype") { + return object; + } + if (index2 != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined2; + if (newValue === undefined2) { + newValue = isObject(objValue) ? objValue : isIndex(path2[index2 + 1]) ? [] : {}; + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + var baseSetData = !metaMap ? identity4 : function(func, data) { + metaMap.set(func, data); + return func; + }; + var baseSetToString = !defineProperty ? identity4 : function(func, string) { + return defineProperty(func, "toString", { + "configurable": true, + "enumerable": false, + "value": constant(string), + "writable": true + }); + }; + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + function baseSlice(array, start2, end) { + var index2 = -1, length = array.length; + if (start2 < 0) { + start2 = -start2 > length ? 0 : length + start2; + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start2 > end ? 0 : end - start2 >>> 0; + start2 >>>= 0; + var result2 = Array2(length); + while (++index2 < length) { + result2[index2] = array[index2 + start2]; + } + return result2; + } + function baseSome(collection, predicate) { + var result2; + baseEach(collection, function(value, index2, collection2) { + result2 = predicate(value, index2, collection2); + return !result2; + }); + return !!result2; + } + function baseSortedIndex(array, value, retHighest) { + var low = 0, high = array == null ? low : array.length; + if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = low + high >>> 1, computed = array[mid]; + if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity4, retHighest); + } + function baseSortedIndexBy(array, value, iteratee2, retHighest) { + var low = 0, high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + value = iteratee2(value); + var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2; + while (low < high) { + var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed); + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? computed <= value : computed < value; + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + function baseSortedUniq(array, iteratee2) { + var index2 = -1, length = array.length, resIndex = 0, result2 = []; + while (++index2 < length) { + var value = array[index2], computed = iteratee2 ? iteratee2(value) : value; + if (!index2 || !eq(computed, seen)) { + var seen = computed; + result2[resIndex++] = value === 0 ? 0 : value; + } + } + return result2; + } + function baseToNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + function baseToString(value) { + if (typeof value == "string") { + return value; + } + if (isArray(value)) { + return arrayMap(value, baseToString) + ""; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ""; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function baseUniq(array, iteratee2, comparator) { + var index2 = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2; + if (comparator) { + isCommon = false; + includes2 = arrayIncludesWith; + } else if (length >= LARGE_ARRAY_SIZE) { + var set4 = iteratee2 ? null : createSet(array); + if (set4) { + return setToArray(set4); + } + isCommon = false; + includes2 = cacheHas; + seen = new SetCache(); + } else { + seen = iteratee2 ? [] : result2; + } + outer: + while (++index2 < length) { + var value = array[index2], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee2) { + seen.push(computed); + } + result2.push(value); + } else if (!includes2(seen, computed, comparator)) { + if (seen !== result2) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseUnset(object, path2) { + path2 = castPath(path2, object); + object = parent(object, path2); + return object == null || delete object[toKey(last(path2))]; + } + function baseUpdate(object, path2, updater, customizer) { + return baseSet(object, path2, updater(baseGet(object, path2)), customizer); + } + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, index2 = fromRight ? length : -1; + while ((fromRight ? index2-- : ++index2 < length) && predicate(array[index2], index2, array)) { + } + return isDrop ? baseSlice(array, fromRight ? 0 : index2, fromRight ? index2 + 1 : length) : baseSlice(array, fromRight ? index2 + 1 : 0, fromRight ? length : index2); + } + function baseWrapperValue(value, actions) { + var result2 = value; + if (result2 instanceof LazyWrapper) { + result2 = result2.value(); + } + return arrayReduce(actions, function(result3, action) { + return action.func.apply(action.thisArg, arrayPush([result3], action.args)); + }, result2); + } + function baseXor(arrays, iteratee2, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index2 = -1, result2 = Array2(length); + while (++index2 < length) { + var array = arrays[index2], othIndex = -1; + while (++othIndex < length) { + if (othIndex != index2) { + result2[index2] = baseDifference(result2[index2] || array, arrays[othIndex], iteratee2, comparator); + } + } + } + return baseUniq(baseFlatten(result2, 1), iteratee2, comparator); + } + function baseZipObject(props, values2, assignFunc) { + var index2 = -1, length = props.length, valsLength = values2.length, result2 = {}; + while (++index2 < length) { + var value = index2 < valsLength ? values2[index2] : undefined2; + assignFunc(result2, props[index2], value); + } + return result2; + } + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + function castFunction(value) { + return typeof value == "function" ? value : identity4; + } + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + var castRest = baseRest; + function castSlice(array, start2, end) { + var length = array.length; + end = end === undefined2 ? length : end; + return !start2 && end >= length ? array : baseSlice(array, start2, end); + } + var clearTimeout2 = ctxClearTimeout || function(id2) { + return root2.clearTimeout(id2); + }; + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + buffer.copy(result2); + return result2; + } + function cloneArrayBuffer(arrayBuffer) { + var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer)); + return result2; + } + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + function cloneRegExp(regexp) { + var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result2.lastIndex = regexp.lastIndex; + return result2; + } + function cloneSymbol(symbol) { + return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {}; + } + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value); + var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); + if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) { + return 1; + } + if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) { + return -1; + } + } + return 0; + } + function compareMultiple(object, other, orders) { + var index2 = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; + while (++index2 < length) { + var result2 = compareAscending(objCriteria[index2], othCriteria[index2]); + if (result2) { + if (index2 >= ordersLength) { + return result2; + } + var order = orders[index2]; + return result2 * (order == "desc" ? -1 : 1); + } + } + return object.index - other.index; + } + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried; + while (++leftIndex < leftLength) { + result2[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result2[leftIndex++] = args[argsIndex++]; + } + return result2; + } + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried; + while (++argsIndex < rangeLength) { + result2[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result2[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result2; + } + function copyArray(source, array) { + var index2 = -1, length = source.length; + array || (array = Array2(length)); + while (++index2 < length) { + array[index2] = source[index2]; + } + return array; + } + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + var index2 = -1, length = props.length; + while (++index2 < length) { + var key = props[index2]; + var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2; + if (newValue === undefined2) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + function createAggregator(setter, initializer) { + return function(collection, iteratee2) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; + return func(collection, setter, getIteratee(iteratee2, 2), accumulator); + }; + } + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index2 = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2; + customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined2 : customizer; + length = 1; + } + object = Object2(object); + while (++index2 < length) { + var source = sources[index2]; + if (source) { + assigner(object, source, index2, customizer); + } + } + return object; + }); + } + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee2) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee2); + } + var length = collection.length, index2 = fromRight ? length : -1, iterable = Object2(collection); + while (fromRight ? index2-- : ++index2 < length) { + if (iteratee2(iterable[index2], index2, iterable) === false) { + break; + } + } + return collection; + }; + } + function createBaseFor(fromRight) { + return function(object, iteratee2, keysFunc) { + var index2 = -1, iterable = Object2(object), props = keysFunc(object), length = props.length; + while (length--) { + var key = props[fromRight ? length : ++index2]; + if (iteratee2(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var fn = this && this !== root2 && this instanceof wrapper ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2; + var chr = strSymbols ? strSymbols[0] : string.charAt(0); + var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); + return chr[methodName]() + trailing; + }; + } + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); + }; + } + function createCtor(Ctor) { + return function() { + var args = arguments; + switch (args.length) { + case 0: + return new Ctor(); + case 1: + return new Ctor(args[0]); + case 2: + return new Ctor(args[0], args[1]); + case 3: + return new Ctor(args[0], args[1], args[2]); + case 4: + return new Ctor(args[0], args[1], args[2], args[3]); + case 5: + return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args); + return isObject(result2) ? result2 : thisBinding; + }; + } + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index2 = length, placeholder = getHolder(wrapper); + while (index2--) { + args[index2] = arguments[index2]; + } + var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); + length -= holders.length; + if (length < arity) { + return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined2, args, holders, undefined2, undefined2, arity - length); + } + var fn = this && this !== root2 && this instanceof wrapper ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object2(collection); + if (!isArrayLike(collection)) { + var iteratee2 = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { + return iteratee2(iterable[key], key, iterable); + }; + } + var index2 = findIndexFunc(collection, predicate, fromIndex); + return index2 > -1 ? iterable[iteratee2 ? collection[index2] : index2] : undefined2; + }; + } + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, index2 = length, prereq = LodashWrapper.prototype.thru; + if (fromRight) { + funcs.reverse(); + } + while (index2--) { + var func = funcs[index2]; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == "wrapper") { + var wrapper = new LodashWrapper([], true); + } + } + index2 = wrapper ? index2 : length; + while (++index2 < length) { + func = funcs[index2]; + var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2; + if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); + } + } + return function() { + var args = arguments, value = args[0]; + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index3 = 0, result2 = length ? funcs[index3].apply(this, args) : value; + while (++index3 < length) { + result2 = funcs[index3].call(this, result2); + } + return result2; + }; + }); + } + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index2 = length; + while (index2--) { + args[index2] = arguments[index2]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary2, arity - length); + } + var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func; + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary2 < length) { + args.length = ary2; + } + if (this && this !== root2 && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + function createInverter(setter, toIteratee) { + return function(object, iteratee2) { + return baseInverter(object, setter, toIteratee(iteratee2), {}); + }; + } + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result2; + if (value === undefined2 && other === undefined2) { + return defaultValue; + } + if (value !== undefined2) { + result2 = value; + } + if (other !== undefined2) { + if (result2 === undefined2) { + return other; + } + if (typeof value == "string" || typeof other == "string") { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result2 = operator(value, other); + } + return result2; + }; + } + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee2) { + return apply(iteratee2, thisArg, args); + }); + }); + }); + } + function createPadding(length, chars) { + chars = chars === undefined2 ? " " : baseToString(chars); + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length); + } + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root2 && this instanceof wrapper ? Ctor : func; + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + function createRange(fromRight) { + return function(start2, end, step) { + if (step && typeof step != "number" && isIterateeCall(start2, end, step)) { + end = step = undefined2; + } + start2 = toFinite(start2); + if (end === undefined2) { + end = start2; + start2 = 0; + } else { + end = toFinite(end); + } + step = step === undefined2 ? start2 < end ? 1 : -1 : toFinite(step); + return baseRange(start2, end, step, fromRight); + }; + } + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == "string" && typeof other == "string")) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials; + bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, + bitmask, + thisArg, + newPartials, + newHolders, + newPartialsRight, + newHoldersRight, + argPos, + ary2, + arity + ]; + var result2 = wrapFunc.apply(undefined2, newData); + if (isLaziable(func)) { + setData(result2, newData); + } + result2.placeholder = placeholder; + return setWrapToString(result2, func, bitmask); + } + function createRound(methodName) { + var func = Math2[methodName]; + return function(number3, precision) { + number3 = toNumber(number3); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number3)) { + var pair = (toString(number3) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision)); + pair = (toString(value) + "e").split("e"); + return +(pair[0] + "e" + (+pair[1] - precision)); + } + return func(number3); + }; + } + var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop3 : function(values2) { + return new Set2(values2); + }; + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined2; + } + ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger(ary2), 0); + arity = arity === undefined2 ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, holdersRight = holders; + partials = holders = undefined2; + } + var data = isBindKey ? undefined2 : getData(func); + var newData = [ + func, + bitmask, + thisArg, + partials, + holders, + partialsRight, + holdersRight, + argPos, + ary2, + arity + ]; + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result2 = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result2 = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result2 = createPartial(func, bitmask, thisArg, partials); + } else { + result2 = createHybrid.apply(undefined2, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result2, newData), func, bitmask); + } + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined2 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) { + return srcValue; + } + return objValue; + } + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack); + stack["delete"](srcValue); + } + return objValue; + } + function customOmitClone(value) { + return isPlainObject(value) ? undefined2 : value; + } + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index2 = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2; + stack.set(array, other); + stack.set(other, array); + while (++index2 < arrLength) { + var arrValue = array[index2], othValue = other[index2]; + if (customizer) { + var compared = isPartial ? customizer(othValue, arrValue, index2, other, array, stack) : customizer(arrValue, othValue, index2, array, other, stack); + } + if (compared !== undefined2) { + if (compared) { + continue; + } + result2 = false; + break; + } + if (seen) { + if (!arraySome(other, function(othValue2, othIndex) { + if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result2 = false; + break; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + result2 = false; + break; + } + } + stack["delete"](array); + stack["delete"](other); + return result2; + } + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { + return false; + } + object = object.buffer; + other = other.buffer; + case arrayBufferTag: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) { + return false; + } + return true; + case boolTag: + case dateTag: + case numberTag: + return eq(+object, +other); + case errorTag: + return object.name == other.name && object.message == other.message; + case regexpTag: + case stringTag: + return object == other + ""; + case mapTag: + var convert = mapToArray; + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + if (object.size != other.size && !isPartial) { + return false; + } + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + stack.set(object, other); + var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack["delete"](object); + return result2; + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; + if (objLength != othLength && !isPartial) { + return false; + } + var index2 = objLength; + while (index2--) { + var key = objProps[index2]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result2 = true; + stack.set(object, other); + stack.set(other, object); + var skipCtor = isPartial; + while (++index2 < objLength) { + key = objProps[index2]; + var objValue = object[key], othValue = other[key]; + if (customizer) { + var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); + } + if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { + result2 = false; + break; + } + skipCtor || (skipCtor = key == "constructor"); + } + if (result2 && !skipCtor) { + var objCtor = object.constructor, othCtor = other.constructor; + if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) { + result2 = false; + } + } + stack["delete"](object); + stack["delete"](other); + return result2; + } + function flatRest(func) { + return setToString(overRest(func, undefined2, flatten), func + ""); + } + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + var getData = !metaMap ? noop3 : function(func) { + return metaMap.get(func); + }; + function getFuncName(func) { + var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty.call(realNames, result2) ? array.length : 0; + while (length--) { + var data = array[length], otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result2; + } + function getHolder(func) { + var object = hasOwnProperty.call(lodash, "placeholder") ? lodash : func; + return object.placeholder; + } + function getIteratee() { + var result2 = lodash.iteratee || iteratee; + result2 = result2 === iteratee ? baseIteratee : result2; + return arguments.length ? result2(arguments[0], arguments[1]) : result2; + } + function getMapData(map3, key) { + var data = map3.__data__; + return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + } + function getMatchData(object) { + var result2 = keys(object), length = result2.length; + while (length--) { + var key = result2[length], value = object[key]; + result2[length] = [key, value, isStrictComparable(value)]; + } + return result2; + } + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined2; + } + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; + try { + value[symToStringTag] = undefined2; + var unmasked = true; + } catch (e) { + } + var result2 = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result2; + } + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object2(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result2 = []; + while (object) { + arrayPush(result2, getSymbols(object)); + object = getPrototype(object); + } + return result2; + }; + var getTag = baseGetTag; + if (DataView2 && getTag(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { + getTag = function(value) { + var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : ""; + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag; + case mapCtorString: + return mapTag; + case promiseCtorString: + return promiseTag; + case setCtorString: + return setTag; + case weakMapCtorString: + return weakMapTag; + } + } + return result2; + }; + } + function getView(start2, end, transforms) { + var index2 = -1, length = transforms.length; + while (++index2 < length) { + var data = transforms[index2], size2 = data.size; + switch (data.type) { + case "drop": + start2 += size2; + break; + case "dropRight": + end -= size2; + break; + case "take": + end = nativeMin(end, start2 + size2); + break; + case "takeRight": + start2 = nativeMax(start2, end - size2); + break; + } + } + return { "start": start2, "end": end }; + } + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + function hasPath(object, path2, hasFunc) { + path2 = castPath(path2, object); + var index2 = -1, length = path2.length, result2 = false; + while (++index2 < length) { + var key = toKey(path2[index2]); + if (!(result2 = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result2 || ++index2 != length) { + return result2; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); + } + function initCloneArray(array) { + var length = array.length, result2 = new array.constructor(length); + if (length && typeof array[0] == "string" && hasOwnProperty.call(array, "index")) { + result2.index = array.index; + result2.input = array.input; + } + return result2; + } + function initCloneObject(object) { + return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; + } + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + case boolTag: + case dateTag: + return new Ctor(+object); + case dataViewTag: + return cloneDataView(object, isDeep); + case float32Tag: + case float64Tag: + case int8Tag: + case int16Tag: + case int32Tag: + case uint8Tag: + case uint8ClampedTag: + case uint16Tag: + case uint32Tag: + return cloneTypedArray(object, isDeep); + case mapTag: + return new Ctor(); + case numberTag: + case stringTag: + return new Ctor(object); + case regexpTag: + return cloneRegExp(object); + case setTag: + return new Ctor(); + case symbolTag: + return cloneSymbol(object); + } + } + function insertWrapDetails(source, details2) { + var length = details2.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details2[lastIndex] = (length > 1 ? "& " : "") + details2[lastIndex]; + details2 = details2.join(length > 2 ? ", " : " "); + return source.replace(reWrapComment, "{\n/* [wrapped with " + details2 + "] */\n"); + } + function isFlattenable(value) { + return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + } + function isIndex(value, length) { + var type2 = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + } + function isIterateeCall(value, index2, object) { + if (!isObject(object)) { + return false; + } + var type2 = typeof index2; + if (type2 == "number" ? isArrayLike(object) && isIndex(index2, object.length) : type2 == "string" && index2 in object) { + return eq(object[index2], value); + } + return false; + } + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type2 = typeof value; + if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object); + } + function isKeyable(value) { + var type2 = typeof value; + return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null; + } + function isLaziable(func) { + var funcName = getFuncName(func), other = lodash[funcName]; + if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + var isMaskable = coreJsData ? isFunction : stubFalse; + function isPrototype(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto; + return value === proto; + } + function isStrictComparable(value) { + return value === value && !isObject(value); + } + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object)); + }; + } + function memoizeCapped(func) { + var result2 = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + var cache = result2.cache; + return result2; + } + function mergeData(data, source) { + var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG; + if (!(isCommon || isCombo)) { + return data; + } + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + value = source[7]; + if (value) { + data[7] = value; + } + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + if (data[9] == null) { + data[9] = source[9]; + } + data[0] = source[0]; + data[1] = newBitmask; + return data; + } + function nativeKeysIn(object) { + var result2 = []; + if (object != null) { + for (var key in Object2(object)) { + result2.push(key); + } + } + return result2; + } + function objectToString(value) { + return nativeObjectToString.call(value); + } + function overRest(func, start2, transform3) { + start2 = nativeMax(start2 === undefined2 ? func.length - 1 : start2, 0); + return function() { + var args = arguments, index2 = -1, length = nativeMax(args.length - start2, 0), array = Array2(length); + while (++index2 < length) { + array[index2] = args[start2 + index2]; + } + index2 = -1; + var otherArgs = Array2(start2 + 1); + while (++index2 < start2) { + otherArgs[index2] = args[index2]; + } + otherArgs[start2] = transform3(array); + return apply(func, this, otherArgs); + }; + } + function parent(object, path2) { + return path2.length < 2 ? object : baseGet(object, baseSlice(path2, 0, -1)); + } + function reorder(array, indexes) { + var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array); + while (length--) { + var index2 = indexes[length]; + array[length] = isIndex(index2, arrLength) ? oldArray[index2] : undefined2; + } + return array; + } + function safeGet(object, key) { + if (key === "constructor" && typeof object[key] === "function") { + return; + } + if (key == "__proto__") { + return; + } + return object[key]; + } + var setData = shortOut(baseSetData); + var setTimeout2 = ctxSetTimeout || function(func, wait2) { + return root2.setTimeout(func, wait2); + }; + var setToString = shortOut(baseSetToString); + function setWrapToString(wrapper, reference, bitmask) { + var source = reference + ""; + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + function shortOut(func) { + var count2 = 0, lastCalled = 0; + return function() { + var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); + lastCalled = stamp; + if (remaining > 0) { + if (++count2 >= HOT_COUNT) { + return arguments[0]; + } + } else { + count2 = 0; + } + return func.apply(undefined2, arguments); + }; + } + function shuffleSelf(array, size2) { + var index2 = -1, length = array.length, lastIndex = length - 1; + size2 = size2 === undefined2 ? length : size2; + while (++index2 < size2) { + var rand = baseRandom(index2, lastIndex), value = array[rand]; + array[rand] = array[index2]; + array[index2] = value; + } + array.length = size2; + return array; + } + var stringToPath = memoizeCapped(function(string) { + var result2 = []; + if (string.charCodeAt(0) === 46) { + result2.push(""); + } + string.replace(rePropName, function(match, number3, quote, subString) { + result2.push(quote ? subString.replace(reEscapeChar, "$1") : number3 || match); + }); + return result2; + }); + function toKey(value) { + if (typeof value == "string" || isSymbol(value)) { + return value; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) { + } + try { + return func + ""; + } catch (e) { + } + } + return ""; + } + function updateWrapDetails(details2, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = "_." + pair[0]; + if (bitmask & pair[1] && !arrayIncludes(details2, value)) { + details2.push(value); + } + }); + return details2.sort(); + } + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result2.__actions__ = copyArray(wrapper.__actions__); + result2.__index__ = wrapper.__index__; + result2.__values__ = wrapper.__values__; + return result2; + } + function chunk(array, size2, guard) { + if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) { + size2 = 1; + } else { + size2 = nativeMax(toInteger(size2), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size2 < 1) { + return []; + } + var index2 = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2)); + while (index2 < length) { + result2[resIndex++] = baseSlice(array, index2, index2 += size2); + } + return result2; + } + function compact(array) { + var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = []; + while (++index2 < length) { + var value = array[index2]; + if (value) { + result2[resIndex++] = value; + } + } + return result2; + } + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array2(length - 1), array = arguments[0], index2 = length; + while (index2--) { + args[index2 - 1] = arguments[index2]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + var difference = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : []; + }); + var differenceBy = baseRest(function(array, values2) { + var iteratee2 = last(values2); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : []; + }); + var differenceWith = baseRest(function(array, values2) { + var comparator = last(values2); + if (isArrayLikeObject(comparator)) { + comparator = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : []; + }); + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function dropRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; + } + function dropWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; + } + function fill(array, value, start2, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start2 && typeof start2 != "number" && isIterateeCall(array, value, start2)) { + start2 = 0; + end = length; + } + return baseFill(array, value, start2, end); + } + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index2 = fromIndex == null ? 0 : toInteger(fromIndex); + if (index2 < 0) { + index2 = nativeMax(length + index2, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index2); + } + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index2 = length - 1; + if (fromIndex !== undefined2) { + index2 = toInteger(fromIndex); + index2 = fromIndex < 0 ? nativeMax(length + index2, 0) : nativeMin(index2, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index2, true); + } + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + function fromPairs(pairs) { + var index2 = -1, length = pairs == null ? 0 : pairs.length, result2 = {}; + while (++index2 < length) { + var pair = pairs[index2]; + result2[pair[0]] = pair[1]; + } + return result2; + } + function head(array) { + return array && array.length ? array[0] : undefined2; + } + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index2 = fromIndex == null ? 0 : toInteger(fromIndex); + if (index2 < 0) { + index2 = nativeMax(length + index2, 0); + } + return baseIndexOf(array, value, index2); + } + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; + }); + var intersectionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + if (iteratee2 === last(mapped)) { + iteratee2 = undefined2; + } else { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : []; + }); + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + comparator = typeof comparator == "function" ? comparator : undefined2; + if (comparator) { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : []; + }); + function join(array, separator) { + return array == null ? "" : nativeJoin.call(array, separator); + } + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined2; + } + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index2 = length; + if (fromIndex !== undefined2) { + index2 = toInteger(fromIndex); + index2 = index2 < 0 ? nativeMax(length + index2, 0) : nativeMin(index2, length - 1); + } + return value === value ? strictLastIndexOf(array, value, index2) : baseFindIndex(array, baseIsNaN, index2, true); + } + function nth(array, n) { + return array && array.length ? baseNth(array, toInteger(n)) : undefined2; + } + var pull = baseRest(pullAll); + function pullAll(array, values2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array; + } + function pullAllBy(array, values2, iteratee2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array; + } + function pullAllWith(array, values2, comparator) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array; + } + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes); + basePullAt(array, arrayMap(indexes, function(index2) { + return isIndex(index2, length) ? +index2 : index2; + }).sort(compareAscending)); + return result2; + }); + function remove2(array, predicate) { + var result2 = []; + if (!(array && array.length)) { + return result2; + } + var index2 = -1, indexes = [], length = array.length; + predicate = getIteratee(predicate, 3); + while (++index2 < length) { + var value = array[index2]; + if (predicate(value, index2, array)) { + result2.push(value); + indexes.push(index2); + } + } + basePullAt(array, indexes); + return result2; + } + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + function slice2(array, start2, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != "number" && isIterateeCall(array, start2, end)) { + start2 = 0; + end = length; + } else { + start2 = start2 == null ? 0 : toInteger(start2); + end = end === undefined2 ? length : toInteger(end); + } + return baseSlice(array, start2, end); + } + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + function sortedIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2)); + } + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index2 = baseSortedIndex(array, value); + if (index2 < length && eq(array[index2], value)) { + return index2; + } + } + return -1; + } + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + function sortedLastIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true); + } + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index2 = baseSortedIndex(array, value, true) - 1; + if (eq(array[index2], value)) { + return index2; + } + } + return -1; + } + function sortedUniq(array) { + return array && array.length ? baseSortedUniq(array) : []; + } + function sortedUniqBy(array, iteratee2) { + return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : []; + } + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + function takeRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; + } + function takeWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; + } + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + var unionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)); + }); + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator); + }); + function uniq(array) { + return array && array.length ? baseUniq(array) : []; + } + function uniqBy(array, iteratee2) { + return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : []; + } + function uniqWith(array, comparator) { + comparator = typeof comparator == "function" ? comparator : undefined2; + return array && array.length ? baseUniq(array, undefined2, comparator) : []; + } + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index2) { + return arrayMap(array, baseProperty(index2)); + }); + } + function unzipWith(array, iteratee2) { + if (!(array && array.length)) { + return []; + } + var result2 = unzip(array); + if (iteratee2 == null) { + return result2; + } + return arrayMap(result2, function(group) { + return apply(iteratee2, undefined2, group); + }); + } + var without = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, values2) : []; + }); + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + var xorBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); + }); + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator); + }); + var zip = baseRest(unzip); + function zipObject(props, values2) { + return baseZipObject(props || [], values2 || [], assignValue); + } + function zipObjectDeep(props, values2) { + return baseZipObject(props || [], values2 || [], baseSet); + } + var zipWith = baseRest(function(arrays) { + var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2; + iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2; + return unzipWith(arrays, iteratee2); + }); + function chain(value) { + var result2 = lodash(value); + result2.__chain__ = true; + return result2; + } + function tap(value, interceptor) { + interceptor(value); + return value; + } + function thru(value, interceptor) { + return interceptor(value); + } + var wrapperAt = flatRest(function(paths) { + var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) { + return baseAt(object, paths); + }; + if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) { + return this.thru(interceptor); + } + value = value.slice(start2, +start2 + (length ? 1 : 0)); + value.__actions__.push({ + "func": thru, + "args": [interceptor], + "thisArg": undefined2 + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined2); + } + return array; + }); + }); + function wrapperChain() { + return chain(this); + } + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + function wrapperNext() { + if (this.__values__ === undefined2) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++]; + return { "done": done, "value": value }; + } + function wrapperToIterator() { + return this; + } + function wrapperPlant(value) { + var result2, parent2 = this; + while (parent2 instanceof baseLodash) { + var clone2 = wrapperClone(parent2); + clone2.__index__ = 0; + clone2.__values__ = undefined2; + if (result2) { + previous.__wrapped__ = clone2; + } else { + result2 = clone2; + } + var previous = clone2; + parent2 = parent2.__wrapped__; + } + previous.__wrapped__ = value; + return result2; + } + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + "func": thru, + "args": [reverse], + "thisArg": undefined2 + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + var countBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty.call(result2, key)) { + ++result2[key]; + } else { + baseAssignValue(result2, key, 1); + } + }); + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + function filter2(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + var find3 = createFind(findIndex); + var findLast = createFind(findLastIndex); + function flatMap(collection, iteratee2) { + return baseFlatten(map2(collection, iteratee2), 1); + } + function flatMapDeep(collection, iteratee2) { + return baseFlatten(map2(collection, iteratee2), INFINITY); + } + function flatMapDepth(collection, iteratee2, depth) { + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(map2(collection, iteratee2), depth); + } + function forEach(collection, iteratee2) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee2, 3)); + } + function forEachRight(collection, iteratee2) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee2, 3)); + } + var groupBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty.call(result2, key)) { + result2[key].push(value); + } else { + baseAssignValue(result2, key, [value]); + } + }); + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; + } + var invokeMap = baseRest(function(collection, path2, args) { + var index2 = -1, isFunc = typeof path2 == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value) { + result2[++index2] = isFunc ? apply(path2, value, args) : baseInvoke(value, path2, args); + }); + return result2; + }); + var keyBy = createAggregator(function(result2, value, key) { + baseAssignValue(result2, key, value); + }); + function map2(collection, iteratee2) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee2, 3)); + } + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined2 : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + var partition = createAggregator(function(result2, value, key) { + result2[key ? 0 : 1].push(value); + }, function() { + return [[], []]; + }); + function reduce(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach); + } + function reduceRight(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight); + } + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + function sampleSize(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + var now2 = ctxNow || function() { + return root2.Date.now(); + }; + function after(n, func) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + function ary(func, n, guard) { + n = guard ? undefined2 : n; + n = func && n == null ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n); + } + function before(n, func) { + var result2; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result2 = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined2; + } + return result2; + }; + } + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + var bindKey2 = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey2)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + function curry(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curry.placeholder; + return result2; + } + function curryRight(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curryRight.placeholder; + return result2; + } + function debounce(func, wait2, options) { + var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + wait2 = toNumber(wait2) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = "maxWait" in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait2) : maxWait; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, thisArg = lastThis; + lastArgs = lastThis = undefined2; + lastInvokeTime = time; + result2 = func.apply(thisArg, args); + return result2; + } + function leadingEdge(time) { + lastInvokeTime = time; + timerId = setTimeout2(timerExpired, wait2); + return leading ? invokeFunc(time) : result2; + } + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait2 - timeSinceLastCall; + return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; + } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; + return lastCallTime === undefined2 || timeSinceLastCall >= wait2 || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } + function timerExpired() { + var time = now2(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + timerId = setTimeout2(timerExpired, remainingWait(time)); + } + function trailingEdge(time) { + timerId = undefined2; + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined2; + return result2; + } + function cancel() { + if (timerId !== undefined2) { + clearTimeout2(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined2; + } + function flush2() { + return timerId === undefined2 ? result2 : trailingEdge(now2()); + } + function debounced() { + var time = now2(), isInvoking = shouldInvoke(time); + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + if (isInvoking) { + if (timerId === undefined2) { + return leadingEdge(lastCallTime); + } + if (maxing) { + clearTimeout2(timerId); + timerId = setTimeout2(timerExpired, wait2); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined2) { + timerId = setTimeout2(timerExpired, wait2); + } + return result2; + } + debounced.cancel = cancel; + debounced.flush = flush2; + return debounced; + } + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + var delay = baseRest(function(func, wait2, args) { + return baseDelay(func, toNumber(wait2) || 0, args); + }); + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + function memoize(func, resolver) { + if (typeof func != "function" || resolver != null && typeof resolver != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; + if (cache.has(key)) { + return cache.get(key); + } + var result2 = func.apply(this, args); + memoized.cache = cache.set(key, result2) || cache; + return result2; + }; + memoized.cache = new (memoize.Cache || MapCache)(); + return memoized; + } + memoize.Cache = MapCache; + function negate(predicate) { + if (typeof predicate != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: + return !predicate.call(this); + case 1: + return !predicate.call(this, args[0]); + case 2: + return !predicate.call(this, args[0], args[1]); + case 3: + return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + function once(func) { + return before(2, func); + } + var overArgs = castRest(function(func, transforms) { + transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + var funcsLength = transforms.length; + return baseRest(function(args) { + var index2 = -1, length = nativeMin(args.length, funcsLength); + while (++index2 < length) { + args[index2] = transforms[index2].call(this, args[index2]); + } + return apply(func, this, args); + }); + }); + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders); + }); + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders); + }); + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes); + }); + function rest(func, start2) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start2 = start2 === undefined2 ? start2 : toInteger(start2); + return baseRest(func, start2); + } + function spread(func, start2) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start2 = start2 == null ? 0 : nativeMax(toInteger(start2), 0); + return baseRest(function(args) { + var array = args[start2], otherArgs = castSlice(args, 0, start2); + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + function throttle(func, wait2, options) { + var leading = true, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = "leading" in options ? !!options.leading : leading; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + return debounce(func, wait2, { + "leading": leading, + "maxWait": wait2, + "trailing": trailing + }); + } + function unary(func) { + return ary(func, 1); + } + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + function cloneWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + function cloneDeep2(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + function eq(value, other) { + return value === other || value !== value && other !== other; + } + var gt = createRelationalOperation(baseGt); + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + var isArguments = baseIsArguments(function() { + return arguments; + }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }; + var isArray = Array2.isArray; + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + function isBoolean(value) { + return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag; + } + var isBuffer = nativeIsBuffer || stubFalse; + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + function isEqual(value, other) { + return baseIsEqual(value, other); + } + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + var result2 = customizer ? customizer(value, other) : undefined2; + return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2; + } + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value); + } + function isFinite2(value) { + return typeof value == "number" && nativeIsFinite(value); + } + function isFunction(value) { + if (!isObject(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + function isInteger(value) { + return typeof value == "number" && value == toInteger(value); + } + function isLength(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + function isObject(value) { + var type2 = typeof value; + return value != null && (type2 == "object" || type2 == "function"); + } + function isObjectLike(value) { + return value != null && typeof value == "object"; + } + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + function isNaN2(value) { + return isNumber(value) && value != +value; + } + function isNative(value) { + if (isMaskable(value)) { + throw new Error2(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + function isNull(value) { + return value === null; + } + function isNil(value) { + return value == null; + } + function isNumber(value) { + return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag; + } + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + } + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + function isString(value) { + return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag; + } + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag; + } + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + function isUndefined(value) { + return value === undefined2; + } + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + var lt = createRelationalOperation(baseLt); + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; + return func(value); + } + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = value < 0 ? -1 : 1; + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + function toInteger(value) { + var result2 = toFinite(value), remainder = result2 % 1; + return result2 === result2 ? remainder ? result2 - remainder : result2 : 0; + } + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + function toNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == "function" ? value.valueOf() : value; + value = isObject(other) ? other + "" : other; + } + if (typeof value != "string") { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; + } + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + function toSafeInteger(value) { + return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + var assign2 = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + var at = flatRest(baseAt); + function create2(prototype, properties) { + var result2 = baseCreate(prototype); + return properties == null ? result2 : baseAssign(result2, properties); + } + var defaults = baseRest(function(object, sources) { + object = Object2(object); + var index2 = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + while (++index2 < length) { + var source = sources[index2]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + if (value === undefined2 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) { + object[key] = source[key]; + } + } + } + return object; + }); + var defaultsDeep = baseRest(function(args) { + args.push(undefined2, customDefaultsMerge); + return apply(mergeWith, undefined2, args); + }); + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + function forIn(object, iteratee2) { + return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn); + } + function forInRight(object, iteratee2) { + return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn); + } + function forOwn(object, iteratee2) { + return object && baseForOwn(object, getIteratee(iteratee2, 3)); + } + function forOwnRight(object, iteratee2) { + return object && baseForOwnRight(object, getIteratee(iteratee2, 3)); + } + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + function get3(object, path2, defaultValue) { + var result2 = object == null ? undefined2 : baseGet(object, path2); + return result2 === undefined2 ? defaultValue : result2; + } + function has(object, path2) { + return object != null && hasPath(object, path2, baseHas); + } + function hasIn(object, path2) { + return object != null && hasPath(object, path2, baseHasIn); + } + var invert = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + result2[value] = key; + }, constant(identity4)); + var invertBy = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + if (hasOwnProperty.call(result2, value)) { + result2[value].push(key); + } else { + result2[value] = [key]; + } + }, getIteratee); + var invoke = baseRest(baseInvoke); + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + function mapKeys(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, iteratee2(value, key, object2), value); + }); + return result2; + } + function mapValues(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, key, iteratee2(value, key, object2)); + }); + return result2; + } + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + var omit = flatRest(function(object, paths) { + var result2 = {}; + if (object == null) { + return result2; + } + var isDeep = false; + paths = arrayMap(paths, function(path2) { + path2 = castPath(path2, object); + isDeep || (isDeep = path2.length > 1); + return path2; + }); + copyObject(object, getAllKeysIn(object), result2); + if (isDeep) { + result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result2, paths[length]); + } + return result2; + }); + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path2) { + return predicate(value, path2[0]); + }); + } + function result(object, path2, defaultValue) { + path2 = castPath(path2, object); + var index2 = -1, length = path2.length; + if (!length) { + length = 1; + object = undefined2; + } + while (++index2 < length) { + var value = object == null ? undefined2 : object[toKey(path2[index2])]; + if (value === undefined2) { + index2 = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + function set3(object, path2, value) { + return object == null ? object : baseSet(object, path2, value); + } + function setWith(object, path2, value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseSet(object, path2, value, customizer); + } + var toPairs = createToPairs(keys); + var toPairsIn = createToPairs(keysIn); + function transform2(object, iteratee2, accumulator) { + var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); + iteratee2 = getIteratee(iteratee2, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor() : []; + } else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index2, object2) { + return iteratee2(accumulator, value, index2, object2); + }); + return accumulator; + } + function unset(object, path2) { + return object == null ? true : baseUnset(object, path2); + } + function update2(object, path2, updater) { + return object == null ? object : baseUpdate(object, path2, castFunction(updater)); + } + function updateWith(object, path2, updater, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseUpdate(object, path2, castFunction(updater), customizer); + } + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + function clamp(number3, lower2, upper) { + if (upper === undefined2) { + upper = lower2; + lower2 = undefined2; + } + if (upper !== undefined2) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower2 !== undefined2) { + lower2 = toNumber(lower2); + lower2 = lower2 === lower2 ? lower2 : 0; + } + return baseClamp(toNumber(number3), lower2, upper); + } + function inRange(number3, start2, end) { + start2 = toFinite(start2); + if (end === undefined2) { + end = start2; + start2 = 0; + } else { + end = toFinite(end); + } + number3 = toNumber(number3); + return baseInRange(number3, start2, end); + } + function random(lower2, upper, floating) { + if (floating && typeof floating != "boolean" && isIterateeCall(lower2, upper, floating)) { + upper = floating = undefined2; + } + if (floating === undefined2) { + if (typeof upper == "boolean") { + floating = upper; + upper = undefined2; + } else if (typeof lower2 == "boolean") { + floating = lower2; + lower2 = undefined2; + } + } + if (lower2 === undefined2 && upper === undefined2) { + lower2 = 0; + upper = 1; + } else { + lower2 = toFinite(lower2); + if (upper === undefined2) { + upper = lower2; + lower2 = 0; + } else { + upper = toFinite(upper); + } + } + if (lower2 > upper) { + var temp = lower2; + lower2 = upper; + upper = temp; + } + if (floating || lower2 % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower2 + rand * (upper - lower2 + freeParseFloat("1e-" + ((rand + "").length - 1))), upper); + } + return baseRandom(lower2, upper); + } + var camelCase = createCompounder(function(result2, word, index2) { + word = word.toLowerCase(); + return result2 + (index2 ? capitalize(word) : word); + }); + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); + } + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + var length = string.length; + position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length); + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + function escape(string) { + string = toString(string); + return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; + } + function escapeRegExp(string) { + string = toString(string); + return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string; + } + var kebabCase = createCompounder(function(result2, word, index2) { + return result2 + (index2 ? "-" : "") + word.toLowerCase(); + }); + var lowerCase = createCompounder(function(result2, word, index2) { + return result2 + (index2 ? " " : "") + word.toLowerCase(); + }); + var lowerFirst = createCaseFirst("toLowerCase"); + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars); + } + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? string + createPadding(length - strLength, chars) : string; + } + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? createPadding(length - strLength, chars) + string : string; + } + function parseInt2(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ""), radix || 0); + } + function repeat(string, n, guard) { + if (guard ? isIterateeCall(string, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + function replace() { + var args = arguments, string = toString(args[0]); + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + var snakeCase = createCompounder(function(result2, word, index2) { + return result2 + (index2 ? "_" : "") + word.toLowerCase(); + }); + function split(string, separator, limit) { + if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) { + separator = limit = undefined2; + } + limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + var startCase = createCompounder(function(result2, word, index2) { + return result2 + (index2 ? " " : "") + upperFirst(word); + }); + function startsWith(string, target, position) { + string = toString(string); + position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + function template(string, options, guard) { + var settings = lodash.templateSettings; + if (guard && isIterateeCall(string, options, guard)) { + options = undefined2; + } + string = toString(string); + options = assignInWith({}, options, settings, customDefaultsAssignIn); + var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys); + var isEscaping, isEvaluating, index2 = 0, interpolate = options.interpolate || reNoMatch, source = "__p += '"; + var reDelimiters = RegExp2((options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$", "g"); + var sourceURL = "//# sourceURL=" + (hasOwnProperty.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; + string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { + interpolateValue || (interpolateValue = esTemplateValue); + source += string.slice(index2, offset).replace(reUnescapedString, escapeStringChar); + if (escapeValue) { + isEscaping = true; + source += "' +\n__e(" + escapeValue + ") +\n'"; + } + if (evaluateValue) { + isEvaluating = true; + source += "';\n" + evaluateValue + ";\n__p += '"; + } + if (interpolateValue) { + source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; + } + index2 = offset + match.length; + return match; + }); + source += "';\n"; + var variable = hasOwnProperty.call(options, "variable") && options.variable; + if (!variable) { + source = "with (obj) {\n" + source + "\n}\n"; + } else if (reForbiddenIdentifierChars.test(variable)) { + throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT); + } + source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;"); + source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}"; + var result2 = attempt(function() { + return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues); + }); + result2.source = source; + if (isError(result2)) { + throw result2; + } + return result2; + } + function toLower(value) { + return toString(value).toLowerCase(); + } + function toUpper(value) { + return toString(value).toUpperCase(); + } + function trim(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return baseTrim(string); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1; + return castSlice(strSymbols, start2, end).join(""); + } + function trimEnd(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.slice(0, trimmedEndIndex(string) + 1); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1; + return castSlice(strSymbols, 0, end).join(""); + } + function trimStart(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.replace(reTrimStart, ""); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), start2 = charsStartIndex(strSymbols, stringToArray(chars)); + return castSlice(strSymbols, start2).join(""); + } + function truncate(string, options) { + var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; + if (isObject(options)) { + var separator = "separator" in options ? options.separator : separator; + length = "length" in options ? toInteger(options.length) : length; + omission = "omission" in options ? baseToString(options.omission) : omission; + } + string = toString(string); + var strLength = string.length; + if (hasUnicode(string)) { + var strSymbols = stringToArray(string); + strLength = strSymbols.length; + } + if (length >= strLength) { + return string; + } + var end = length - stringSize(omission); + if (end < 1) { + return omission; + } + var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end); + if (separator === undefined2) { + return result2 + omission; + } + if (strSymbols) { + end += result2.length - end; + } + if (isRegExp(separator)) { + if (string.slice(end).search(separator)) { + var match, substring = result2; + if (!separator.global) { + separator = RegExp2(separator.source, toString(reFlags.exec(separator)) + "g"); + } + separator.lastIndex = 0; + while (match = separator.exec(substring)) { + var newEnd = match.index; + } + result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd); + } + } else if (string.indexOf(baseToString(separator), end) != end) { + var index2 = result2.lastIndexOf(separator); + if (index2 > -1) { + result2 = result2.slice(0, index2); + } + } + return result2 + omission; + } + function unescape(string) { + string = toString(string); + return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string; + } + var upperCase = createCompounder(function(result2, word, index2) { + return result2 + (index2 ? " " : "") + word.toUpperCase(); + }); + var upperFirst = createCaseFirst("toUpperCase"); + function words(string, pattern, guard) { + string = toString(string); + pattern = guard ? undefined2 : pattern; + if (pattern === undefined2) { + return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); + } + return string.match(pattern) || []; + } + var attempt = baseRest(function(func, args) { + try { + return apply(func, undefined2, args); + } catch (e) { + return isError(e) ? e : new Error2(e); + } + }); + var bindAll = flatRest(function(object, methodNames) { + arrayEach(methodNames, function(key) { + key = toKey(key); + baseAssignValue(object, key, bind(object[key], object)); + }); + return object; + }); + function cond(pairs) { + var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee(); + pairs = !length ? [] : arrayMap(pairs, function(pair) { + if (typeof pair[1] != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return [toIteratee(pair[0]), pair[1]]; + }); + return baseRest(function(args) { + var index2 = -1; + while (++index2 < length) { + var pair = pairs[index2]; + if (apply(pair[0], this, args)) { + return apply(pair[1], this, args); + } + } + }); + } + function conforms(source) { + return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); + } + function constant(value) { + return function() { + return value; + }; + } + function defaultTo(value, defaultValue) { + return value == null || value !== value ? defaultValue : value; + } + var flow = createFlow(); + var flowRight = createFlow(true); + function identity4(value) { + return value; + } + function iteratee(func) { + return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG)); + } + function matches(source) { + return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); + } + function matchesProperty(path2, srcValue) { + return baseMatchesProperty(path2, baseClone(srcValue, CLONE_DEEP_FLAG)); + } + var method = baseRest(function(path2, args) { + return function(object) { + return baseInvoke(object, path2, args); + }; + }); + var methodOf = baseRest(function(object, args) { + return function(path2) { + return baseInvoke(object, path2, args); + }; + }); + function mixin(object, source, options) { + var props = keys(source), methodNames = baseFunctions(source, props); + if (options == null && !(isObject(source) && (methodNames.length || !props.length))) { + options = source; + source = object; + object = this; + methodNames = baseFunctions(source, keys(source)); + } + var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction(object); + arrayEach(methodNames, function(methodName) { + var func = source[methodName]; + object[methodName] = func; + if (isFunc) { + object.prototype[methodName] = function() { + var chainAll = this.__chain__; + if (chain2 || chainAll) { + var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__); + actions.push({ "func": func, "args": arguments, "thisArg": object }); + result2.__chain__ = chainAll; + return result2; + } + return func.apply(object, arrayPush([this.value()], arguments)); + }; + } + }); + return object; + } + function noConflict() { + if (root2._ === this) { + root2._ = oldDash; + } + return this; + } + function noop3() { + } + function nthArg(n) { + n = toInteger(n); + return baseRest(function(args) { + return baseNth(args, n); + }); + } + var over = createOver(arrayMap); + var overEvery = createOver(arrayEvery); + var overSome = createOver(arraySome); + function property(path2) { + return isKey(path2) ? baseProperty(toKey(path2)) : basePropertyDeep(path2); + } + function propertyOf(object) { + return function(path2) { + return object == null ? undefined2 : baseGet(object, path2); + }; + } + var range = createRange(); + var rangeRight = createRange(true); + function stubArray() { + return []; + } + function stubFalse() { + return false; + } + function stubObject() { + return {}; + } + function stubString() { + return ""; + } + function stubTrue() { + return true; + } + function times(n, iteratee2) { + n = toInteger(n); + if (n < 1 || n > MAX_SAFE_INTEGER) { + return []; + } + var index2 = MAX_ARRAY_LENGTH, length = nativeMin(n, MAX_ARRAY_LENGTH); + iteratee2 = getIteratee(iteratee2); + n -= MAX_ARRAY_LENGTH; + var result2 = baseTimes(length, iteratee2); + while (++index2 < n) { + iteratee2(index2); + } + return result2; + } + function toPath(value) { + if (isArray(value)) { + return arrayMap(value, toKey); + } + return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); + } + function uniqueId(prefix) { + var id2 = ++idCounter; + return toString(prefix) + id2; + } + var add2 = createMathOperation(function(augend, addend) { + return augend + addend; + }, 0); + var ceil = createRound("ceil"); + var divide = createMathOperation(function(dividend, divisor) { + return dividend / divisor; + }, 1); + var floor = createRound("floor"); + function max4(array) { + return array && array.length ? baseExtremum(array, identity4, baseGt) : undefined2; + } + function maxBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2; + } + function mean(array) { + return baseMean(array, identity4); + } + function meanBy(array, iteratee2) { + return baseMean(array, getIteratee(iteratee2, 2)); + } + function min3(array) { + return array && array.length ? baseExtremum(array, identity4, baseLt) : undefined2; + } + function minBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2; + } + var multiply = createMathOperation(function(multiplier, multiplicand) { + return multiplier * multiplicand; + }, 1); + var round = createRound("round"); + var subtract = createMathOperation(function(minuend, subtrahend) { + return minuend - subtrahend; + }, 0); + function sum(array) { + return array && array.length ? baseSum(array, identity4) : 0; + } + function sumBy(array, iteratee2) { + return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0; + } + lodash.after = after; + lodash.ary = ary; + lodash.assign = assign2; + lodash.assignIn = assignIn; + lodash.assignInWith = assignInWith; + lodash.assignWith = assignWith; + lodash.at = at; + lodash.before = before; + lodash.bind = bind; + lodash.bindAll = bindAll; + lodash.bindKey = bindKey2; + lodash.castArray = castArray; + lodash.chain = chain; + lodash.chunk = chunk; + lodash.compact = compact; + lodash.concat = concat; + lodash.cond = cond; + lodash.conforms = conforms; + lodash.constant = constant; + lodash.countBy = countBy; + lodash.create = create2; + lodash.curry = curry; + lodash.curryRight = curryRight; + lodash.debounce = debounce; + lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; + lodash.defer = defer; + lodash.delay = delay; + lodash.difference = difference; + lodash.differenceBy = differenceBy; + lodash.differenceWith = differenceWith; + lodash.drop = drop; + lodash.dropRight = dropRight; + lodash.dropRightWhile = dropRightWhile; + lodash.dropWhile = dropWhile; + lodash.fill = fill; + lodash.filter = filter2; + lodash.flatMap = flatMap; + lodash.flatMapDeep = flatMapDeep; + lodash.flatMapDepth = flatMapDepth; + lodash.flatten = flatten; + lodash.flattenDeep = flattenDeep; + lodash.flattenDepth = flattenDepth; + lodash.flip = flip; + lodash.flow = flow; + lodash.flowRight = flowRight; + lodash.fromPairs = fromPairs; + lodash.functions = functions; + lodash.functionsIn = functionsIn; + lodash.groupBy = groupBy; + lodash.initial = initial; + lodash.intersection = intersection; + lodash.intersectionBy = intersectionBy; + lodash.intersectionWith = intersectionWith; + lodash.invert = invert; + lodash.invertBy = invertBy; + lodash.invokeMap = invokeMap; + lodash.iteratee = iteratee; + lodash.keyBy = keyBy; + lodash.keys = keys; + lodash.keysIn = keysIn; + lodash.map = map2; + lodash.mapKeys = mapKeys; + lodash.mapValues = mapValues; + lodash.matches = matches; + lodash.matchesProperty = matchesProperty; + lodash.memoize = memoize; + lodash.merge = merge; + lodash.mergeWith = mergeWith; + lodash.method = method; + lodash.methodOf = methodOf; + lodash.mixin = mixin; + lodash.negate = negate; + lodash.nthArg = nthArg; + lodash.omit = omit; + lodash.omitBy = omitBy; + lodash.once = once; + lodash.orderBy = orderBy; + lodash.over = over; + lodash.overArgs = overArgs; + lodash.overEvery = overEvery; + lodash.overSome = overSome; + lodash.partial = partial; + lodash.partialRight = partialRight; + lodash.partition = partition; + lodash.pick = pick; + lodash.pickBy = pickBy; + lodash.property = property; + lodash.propertyOf = propertyOf; + lodash.pull = pull; + lodash.pullAll = pullAll; + lodash.pullAllBy = pullAllBy; + lodash.pullAllWith = pullAllWith; + lodash.pullAt = pullAt; + lodash.range = range; + lodash.rangeRight = rangeRight; + lodash.rearg = rearg; + lodash.reject = reject; + lodash.remove = remove2; + lodash.rest = rest; + lodash.reverse = reverse; + lodash.sampleSize = sampleSize; + lodash.set = set3; + lodash.setWith = setWith; + lodash.shuffle = shuffle; + lodash.slice = slice2; + lodash.sortBy = sortBy; + lodash.sortedUniq = sortedUniq; + lodash.sortedUniqBy = sortedUniqBy; + lodash.split = split; + lodash.spread = spread; + lodash.tail = tail; + lodash.take = take; + lodash.takeRight = takeRight; + lodash.takeRightWhile = takeRightWhile; + lodash.takeWhile = takeWhile; + lodash.tap = tap; + lodash.throttle = throttle; + lodash.thru = thru; + lodash.toArray = toArray; + lodash.toPairs = toPairs; + lodash.toPairsIn = toPairsIn; + lodash.toPath = toPath; + lodash.toPlainObject = toPlainObject; + lodash.transform = transform2; + lodash.unary = unary; + lodash.union = union; + lodash.unionBy = unionBy; + lodash.unionWith = unionWith; + lodash.uniq = uniq; + lodash.uniqBy = uniqBy; + lodash.uniqWith = uniqWith; + lodash.unset = unset; + lodash.unzip = unzip; + lodash.unzipWith = unzipWith; + lodash.update = update2; + lodash.updateWith = updateWith; + lodash.values = values; + lodash.valuesIn = valuesIn; + lodash.without = without; + lodash.words = words; + lodash.wrap = wrap; + lodash.xor = xor; + lodash.xorBy = xorBy; + lodash.xorWith = xorWith; + lodash.zip = zip; + lodash.zipObject = zipObject; + lodash.zipObjectDeep = zipObjectDeep; + lodash.zipWith = zipWith; + lodash.entries = toPairs; + lodash.entriesIn = toPairsIn; + lodash.extend = assignIn; + lodash.extendWith = assignInWith; + mixin(lodash, lodash); + lodash.add = add2; + lodash.attempt = attempt; + lodash.camelCase = camelCase; + lodash.capitalize = capitalize; + lodash.ceil = ceil; + lodash.clamp = clamp; + lodash.clone = clone; + lodash.cloneDeep = cloneDeep2; + lodash.cloneDeepWith = cloneDeepWith; + lodash.cloneWith = cloneWith; + lodash.conformsTo = conformsTo; + lodash.deburr = deburr; + lodash.defaultTo = defaultTo; + lodash.divide = divide; + lodash.endsWith = endsWith; + lodash.eq = eq; + lodash.escape = escape; + lodash.escapeRegExp = escapeRegExp; + lodash.every = every; + lodash.find = find3; + lodash.findIndex = findIndex; + lodash.findKey = findKey; + lodash.findLast = findLast; + lodash.findLastIndex = findLastIndex; + lodash.findLastKey = findLastKey; + lodash.floor = floor; + lodash.forEach = forEach; + lodash.forEachRight = forEachRight; + lodash.forIn = forIn; + lodash.forInRight = forInRight; + lodash.forOwn = forOwn; + lodash.forOwnRight = forOwnRight; + lodash.get = get3; + lodash.gt = gt; + lodash.gte = gte; + lodash.has = has; + lodash.hasIn = hasIn; + lodash.head = head; + lodash.identity = identity4; + lodash.includes = includes; + lodash.indexOf = indexOf; + lodash.inRange = inRange; + lodash.invoke = invoke; + lodash.isArguments = isArguments; + lodash.isArray = isArray; + lodash.isArrayBuffer = isArrayBuffer; + lodash.isArrayLike = isArrayLike; + lodash.isArrayLikeObject = isArrayLikeObject; + lodash.isBoolean = isBoolean; + lodash.isBuffer = isBuffer; + lodash.isDate = isDate; + lodash.isElement = isElement; + lodash.isEmpty = isEmpty; + lodash.isEqual = isEqual; + lodash.isEqualWith = isEqualWith; + lodash.isError = isError; + lodash.isFinite = isFinite2; + lodash.isFunction = isFunction; + lodash.isInteger = isInteger; + lodash.isLength = isLength; + lodash.isMap = isMap; + lodash.isMatch = isMatch; + lodash.isMatchWith = isMatchWith; + lodash.isNaN = isNaN2; + lodash.isNative = isNative; + lodash.isNil = isNil; + lodash.isNull = isNull; + lodash.isNumber = isNumber; + lodash.isObject = isObject; + lodash.isObjectLike = isObjectLike; + lodash.isPlainObject = isPlainObject; + lodash.isRegExp = isRegExp; + lodash.isSafeInteger = isSafeInteger; + lodash.isSet = isSet; + lodash.isString = isString; + lodash.isSymbol = isSymbol; + lodash.isTypedArray = isTypedArray; + lodash.isUndefined = isUndefined; + lodash.isWeakMap = isWeakMap; + lodash.isWeakSet = isWeakSet; + lodash.join = join; + lodash.kebabCase = kebabCase; + lodash.last = last; + lodash.lastIndexOf = lastIndexOf; + lodash.lowerCase = lowerCase; + lodash.lowerFirst = lowerFirst; + lodash.lt = lt; + lodash.lte = lte; + lodash.max = max4; + lodash.maxBy = maxBy; + lodash.mean = mean; + lodash.meanBy = meanBy; + lodash.min = min3; + lodash.minBy = minBy; + lodash.stubArray = stubArray; + lodash.stubFalse = stubFalse; + lodash.stubObject = stubObject; + lodash.stubString = stubString; + lodash.stubTrue = stubTrue; + lodash.multiply = multiply; + lodash.nth = nth; + lodash.noConflict = noConflict; + lodash.noop = noop3; + lodash.now = now2; + lodash.pad = pad; + lodash.padEnd = padEnd; + lodash.padStart = padStart; + lodash.parseInt = parseInt2; + lodash.random = random; + lodash.reduce = reduce; + lodash.reduceRight = reduceRight; + lodash.repeat = repeat; + lodash.replace = replace; + lodash.result = result; + lodash.round = round; + lodash.runInContext = runInContext2; + lodash.sample = sample; + lodash.size = size; + lodash.snakeCase = snakeCase; + lodash.some = some; + lodash.sortedIndex = sortedIndex; + lodash.sortedIndexBy = sortedIndexBy; + lodash.sortedIndexOf = sortedIndexOf; + lodash.sortedLastIndex = sortedLastIndex; + lodash.sortedLastIndexBy = sortedLastIndexBy; + lodash.sortedLastIndexOf = sortedLastIndexOf; + lodash.startCase = startCase; + lodash.startsWith = startsWith; + lodash.subtract = subtract; + lodash.sum = sum; + lodash.sumBy = sumBy; + lodash.template = template; + lodash.times = times; + lodash.toFinite = toFinite; + lodash.toInteger = toInteger; + lodash.toLength = toLength; + lodash.toLower = toLower; + lodash.toNumber = toNumber; + lodash.toSafeInteger = toSafeInteger; + lodash.toString = toString; + lodash.toUpper = toUpper; + lodash.trim = trim; + lodash.trimEnd = trimEnd; + lodash.trimStart = trimStart; + lodash.truncate = truncate; + lodash.unescape = unescape; + lodash.uniqueId = uniqueId; + lodash.upperCase = upperCase; + lodash.upperFirst = upperFirst; + lodash.each = forEach; + lodash.eachRight = forEachRight; + lodash.first = head; + mixin(lodash, function() { + var source = {}; + baseForOwn(lodash, function(func, methodName) { + if (!hasOwnProperty.call(lodash.prototype, methodName)) { + source[methodName] = func; + } + }); + return source; + }(), { "chain": false }); + lodash.VERSION = VERSION; + arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) { + lodash[methodName].placeholder = lodash; + }); + arrayEach(["drop", "take"], function(methodName, index2) { + LazyWrapper.prototype[methodName] = function(n) { + n = n === undefined2 ? 1 : nativeMax(toInteger(n), 0); + var result2 = this.__filtered__ && !index2 ? new LazyWrapper(this) : this.clone(); + if (result2.__filtered__) { + result2.__takeCount__ = nativeMin(n, result2.__takeCount__); + } else { + result2.__views__.push({ + "size": nativeMin(n, MAX_ARRAY_LENGTH), + "type": methodName + (result2.__dir__ < 0 ? "Right" : "") + }); + } + return result2; + }; + LazyWrapper.prototype[methodName + "Right"] = function(n) { + return this.reverse()[methodName](n).reverse(); + }; + }); + arrayEach(["filter", "map", "takeWhile"], function(methodName, index2) { + var type2 = index2 + 1, isFilter = type2 == LAZY_FILTER_FLAG || type2 == LAZY_WHILE_FLAG; + LazyWrapper.prototype[methodName] = function(iteratee2) { + var result2 = this.clone(); + result2.__iteratees__.push({ + "iteratee": getIteratee(iteratee2, 3), + "type": type2 + }); + result2.__filtered__ = result2.__filtered__ || isFilter; + return result2; + }; + }); + arrayEach(["head", "last"], function(methodName, index2) { + var takeName = "take" + (index2 ? "Right" : ""); + LazyWrapper.prototype[methodName] = function() { + return this[takeName](1).value()[0]; + }; + }); + arrayEach(["initial", "tail"], function(methodName, index2) { + var dropName = "drop" + (index2 ? "" : "Right"); + LazyWrapper.prototype[methodName] = function() { + return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); + }; + }); + LazyWrapper.prototype.compact = function() { + return this.filter(identity4); + }; + LazyWrapper.prototype.find = function(predicate) { + return this.filter(predicate).head(); + }; + LazyWrapper.prototype.findLast = function(predicate) { + return this.reverse().find(predicate); + }; + LazyWrapper.prototype.invokeMap = baseRest(function(path2, args) { + if (typeof path2 == "function") { + return new LazyWrapper(this); + } + return this.map(function(value) { + return baseInvoke(value, path2, args); + }); + }); + LazyWrapper.prototype.reject = function(predicate) { + return this.filter(negate(getIteratee(predicate))); + }; + LazyWrapper.prototype.slice = function(start2, end) { + start2 = toInteger(start2); + var result2 = this; + if (result2.__filtered__ && (start2 > 0 || end < 0)) { + return new LazyWrapper(result2); + } + if (start2 < 0) { + result2 = result2.takeRight(-start2); + } else if (start2) { + result2 = result2.drop(start2); + } + if (end !== undefined2) { + end = toInteger(end); + result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start2); + } + return result2; + }; + LazyWrapper.prototype.takeRightWhile = function(predicate) { + return this.reverse().takeWhile(predicate).reverse(); + }; + LazyWrapper.prototype.toArray = function() { + return this.take(MAX_ARRAY_LENGTH); + }; + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName); + if (!lodashFunc) { + return; + } + lodash.prototype[methodName] = function() { + var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray(value); + var interceptor = function(value2) { + var result3 = lodashFunc.apply(lodash, arrayPush([value2], args)); + return isTaker && chainAll ? result3[0] : result3; + }; + if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) { + isLazy = useLazy = false; + } + var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid; + if (!retUnwrapped && useLazy) { + value = onlyLazy ? value : new LazyWrapper(this); + var result2 = func.apply(value, args); + result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 }); + return new LodashWrapper(result2, chainAll); + } + if (isUnwrapped && onlyLazy) { + return func.apply(this, args); + } + result2 = this.thru(interceptor); + return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2; + }; + }); + arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) { + var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); + lodash.prototype[methodName] = function() { + var args = arguments; + if (retUnwrapped && !this.__chain__) { + var value = this.value(); + return func.apply(isArray(value) ? value : [], args); + } + return this[chainName](function(value2) { + return func.apply(isArray(value2) ? value2 : [], args); + }); + }; + }); + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var lodashFunc = lodash[methodName]; + if (lodashFunc) { + var key = lodashFunc.name + ""; + if (!hasOwnProperty.call(realNames, key)) { + realNames[key] = []; + } + realNames[key].push({ "name": methodName, "func": lodashFunc }); + } + }); + realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{ + "name": "wrapper", + "func": undefined2 + }]; + LazyWrapper.prototype.clone = lazyClone; + LazyWrapper.prototype.reverse = lazyReverse; + LazyWrapper.prototype.value = lazyValue; + lodash.prototype.at = wrapperAt; + lodash.prototype.chain = wrapperChain; + lodash.prototype.commit = wrapperCommit; + lodash.prototype.next = wrapperNext; + lodash.prototype.plant = wrapperPlant; + lodash.prototype.reverse = wrapperReverse; + lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; + lodash.prototype.first = lodash.prototype.head; + if (symIterator) { + lodash.prototype[symIterator] = wrapperToIterator; + } + return lodash; + }; + var _ = runInContext(); + if (typeof define == "function" && typeof define.amd == "object" && define.amd) { + root2._ = _; + define(function() { + return _; + }); + } else if (freeModule) { + (freeModule.exports = _)._ = _; + freeExports._ = _; + } else { + root2._ = _; + } + }).call(exports); + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => BCPlugin +}); +module.exports = __toCommonJS(main_exports); + +// node_modules/juggl-api/dist/index.mjs +var import_obsidian = require("obsidian"); +var CAT_DANGLING = "dangling"; +var CORE_STORE_ID = "core"; +var VizId = class { + constructor(id2, storeId) { + this.id = id2; + this.storeId = storeId; + } + toString() { + return `${this.storeId}:${this.id}`; + } + toId() { + return this.toString(); + } + static fromId(id2) { + const split = id2.split(":"); + const storeId = split[0]; + const _id = split.slice(1).join(":"); + return new VizId(_id, storeId); + } + static fromNode(node) { + return VizId.fromId(node.id()); + } + static fromNodes(nodes) { + return nodes.map((n) => VizId.fromNode(n)); + } + static fromFile(file) { + return new VizId(file.name, "core"); + } + static toId(id2, storeId) { + return new VizId(id2, storeId).toId(); + } +}; +var _parseTags = function(tags) { + return [].concat(...tags.map((tag) => { + tag = tag.slice(1); + const hSplit = tag.split("/"); + const tags2 = []; + for (const i in hSplit) { + const hTag = hSplit.slice(0, parseInt(i) + 1).join("-"); + tags2.push(`tag-${hTag}`); + } + return tags2; + })); +}; +var getClasses = function(file, metadataCache) { + if (file) { + const classes = []; + if (["png", "jpg", "jpeg", "gif", "bmp", "svg", "tiff"].contains(file.extension)) { + classes.push("image"); + } else if (["mp3", "webm", "wav", "m4a", "ogg", "3gp", "flac"].contains(file.extension)) { + classes.push("audio"); + } else if (["mp4", "webm", "ogv"].contains(file.extension)) { + classes.push("video"); + } else if (file.extension === "pdf") { + classes.push("pdf"); + } + if (file.extension === "md") { + classes.push("note"); + const cache = metadataCache.getFileCache(file); + if (cache == null ? void 0 : cache.frontmatter) { + if ("image" in cache.frontmatter) { + classes.push("image"); + } + if ("tags" in cache.frontmatter) { + const tags = (0, import_obsidian.parseFrontMatterTags)(cache.frontmatter); + if (tags) { + classes.push(..._parseTags(tags)); + } + } + if ("cssclass" in cache.frontmatter) { + const clazzes = (0, import_obsidian.parseFrontMatterStringArray)(cache.frontmatter, "cssclass"); + if (clazzes) { + classes.push(...clazzes); + } + } + } + if (cache == null ? void 0 : cache.tags) { + classes.push(..._parseTags(cache.tags.map((t) => t.tag))); + } + } else { + classes.push("file"); + } + return classes; + } + return [CAT_DANGLING]; +}; +var nodeFromFile = async function(file, plugin, settings, id2) { + if (!id2) { + id2 = VizId.toId(file.name, CORE_STORE_ID); + } + const cache = plugin.app.metadataCache.getFileCache(file); + const name = file.extension === "md" ? file.basename : file.name; + const classes = getClasses(file, plugin.app.metadataCache).join(" "); + const data = { + id: id2, + name, + path: file.path + }; + if (["png", "jpg", "jpeg", "gif", "bmp", "svg", "tiff"].contains(file.extension)) { + try { + data["resource_url"] = `http://localhost:${plugin.settings.imgServerPort}/${encodeURI(file.path)}`; + } catch (e) { + } + } + if (settings.readContent && file.extension == "md") { + data["content"] = await plugin.app.vault.cachedRead(file); + } + const frontmatter = cache == null ? void 0 : cache.frontmatter; + if (frontmatter) { + Object.keys(frontmatter).forEach((k) => { + if (!(k === "position")) { + if (k === "image") { + const imageField = frontmatter[k]; + try { + new URL(imageField); + data[k] = imageField; + } catch (e) { + try { + data[k] = `http://localhost:${plugin.settings.imgServerPort}/${encodeURI(imageField)}`; + } catch (e3) { + } + } + } else { + data[k] = frontmatter[k]; + } + } + }); + } + return { + group: "nodes", + data, + classes + }; +}; +var nodeDangling = function(path2) { + return { + group: "nodes", + data: { + id: VizId.toId(path2, CORE_STORE_ID), + name: path2 + }, + classes: "dangling" + }; +}; +var wikilinkRegex = "\\[\\[([^\\]\\r\\n]+?)\\]\\]"; +var nameRegex = "[^\\W\\d]\\w*"; +var regexEscape = function(str) { + return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); +}; +var parseTypedLink = function(link2, line, typedLinkPrefix) { + const regexPublishedIn = new RegExp(`^${regexEscape(typedLinkPrefix)} (publishedIn) (\\d\\d\\d\\d) (${wikilinkRegex},? *)+$`); + const matchPI = regexPublishedIn.exec(line); + if (!(matchPI === null)) { + return { + class: "type-publishedIn", + isInline: false, + properties: { + year: matchPI[2], + context: "", + type: "publishedIn" + } + }; + } + const regex = new RegExp(`^${regexEscape(typedLinkPrefix)} (${nameRegex}) (${wikilinkRegex},? *)+$`); + const match = regex.exec(line); + const splitLink = link2.original.split("|"); + let alias = null; + if (splitLink.length > 1) { + alias = splitLink.slice(1).join().slice(0, -2); + } + if (!(match === null)) { + return { + class: `type-${match[1]}`, + isInline: false, + properties: { + alias, + context: "", + type: match[1] + } + }; + } + return null; +}; +var getPlugin = function(app2) { + if ("juggl" in app2.plugins.plugins) { + return app2.plugins.plugins["juggl"]; + } + return null; +}; + +// src/main.ts +var import_obsidian44 = require("obsidian"); + +// node_modules/obsidian-community-lib/dist/utils.js +var feather = __toESM(require_feather()); +var import_obsidian2 = require("obsidian"); +async function wait(delay) { + return new Promise((resolve) => setTimeout(resolve, delay)); +} +function addFeatherIcon(name, attr2 = { viewBox: "0 0 24 24", width: "100", height: "100" }) { + if (feather.icons[name]) { + const iconName = `feather-${name}`; + (0, import_obsidian2.addIcon)(iconName, feather.icons[name].toSvg(attr2)); + return iconName; + } else { + throw Error(`This Icon (${name}) doesn't exist in the Feather Library.`); + } +} +async function copy(content, success = () => new import_obsidian2.Notice("Copied to clipboard"), failure = (reason) => { + new import_obsidian2.Notice("Could not copy to clipboard"); + console.log({ reason }); +}) { + await navigator.clipboard.writeText(content).then(success, failure); +} +var isInVault = (noteName, sourcePath = "") => !!app.metadataCache.getFirstLinkpathDest(noteName, sourcePath); +function hoverPreview(event, view, to) { + const targetEl = event.target; + app.workspace.trigger("hover-link", { + event, + source: view.getViewType(), + hoverParent: view, + targetEl, + linktext: to + }); +} +async function createNewMDNote(newName, currFilePath = "") { + const newFileFolder = app.fileManager.getNewFileParent(currFilePath).path; + const newFilePath = (0, import_obsidian2.normalizePath)(`${newFileFolder}${newFileFolder === "/" ? "" : "/"}${addMD(newName)}`); + return await app.vault.create(newFilePath, ""); +} +var addMD = (noteName) => { + return noteName.match(/\.MD$|\.md$/m) ? noteName : noteName + ".md"; +}; +async function openOrSwitch(dest, event, options = { createNewFile: true }) { + const { workspace } = app; + let destFile = app.metadataCache.getFirstLinkpathDest(dest, ""); + if (!destFile && options.createNewFile) { + destFile = await createNewMDNote(dest); + } else if (!destFile && !options.createNewFile) + return; + const leavesWithDestAlreadyOpen = []; + workspace.iterateAllLeaves((leaf) => { + var _a; + if (leaf.view instanceof import_obsidian2.MarkdownView) { + const file = (_a = leaf.view) === null || _a === void 0 ? void 0 : _a.file; + if (file && file.basename + "." + file.extension === dest) { + leavesWithDestAlreadyOpen.push(leaf); + } + } + }); + if (leavesWithDestAlreadyOpen.length > 0) { + workspace.setActiveLeaf(leavesWithDestAlreadyOpen[0]); + } else { + const mode = app.vault.getConfig("defaultViewMode"); + const leaf = event.ctrlKey || event.getModifierState("Meta") ? workspace.splitActiveLeaf() : workspace.getUnpinnedLeaf(); + await leaf.openFile(destFile, { active: true, mode }); + } +} +async function openView(viewType, viewClass, side = "right") { + let leaf = null; + for (leaf of app.workspace.getLeavesOfType(viewType)) { + if (leaf.view instanceof viewClass) { + return leaf.view; + } + await leaf.setViewState({ type: "empty" }); + break; + } + leaf = (leaf !== null && leaf !== void 0 ? leaf : side === "right") ? app.workspace.getRightLeaf(false) : app.workspace.getLeftLeaf(false); + await leaf.setViewState({ + type: viewType, + active: true + }); + return leaf.view; +} +function resolvedLinksComplete(noFiles) { + const { resolvedLinks } = app.metadataCache; + return Object.keys(resolvedLinks).length === noFiles; +} +async function waitForResolvedLinks(delay = 1e3, max4 = 50) { + const noFiles = app.vault.getMarkdownFiles().length; + let i = 0; + while (!resolvedLinksComplete(noFiles) && i < max4) { + await wait(delay); + i++; + } + if (i === max4) { + throw Error("Obsidian-Community-Lib: ResolvedLinks did not finish initialising. `max` iterations was reached first."); + } +} + +// src/constants.ts +var MATRIX_VIEW = "BC-matrix"; +var DUCK_VIEW = "BC-ducks"; +var TREE_VIEW = "BC-tree"; +var TRAIL_ICON = "BC-trail-icon"; +var TRAIL_ICON_SVG = ''; +var DUCK_ICON = "BC-duck-icon"; +var DUCK_ICON_SVG = ''; +var splitLinksRegex = new RegExp(/\[\[(.+?)\]\]/g); +var dropHeaderOrAlias = new RegExp(/\[\[([^#|]+)\]\]/); +var regNFlags = new RegExp(/^.(.*?)\W(\w*)$/); +var TRAIL_LENGTHS = [ + "Shortest", + "Longest", + "All" +]; +var VISTYPES = [ + "Force Directed Graph", + "Tidy Tree", + "Circle Packing", + "Edge Bundling", + "Arc Diagram", + "Sunburst", + "Tree Map", + "Icicle", + "Radial Tree" +]; +var DIRECTIONS = ["up", "same", "down", "next", "prev"]; +var ARROW_DIRECTIONS = { + up: "\u2191", + same: "\u2194", + down: "\u2193", + next: "\u2192", + prev: "\u2190" +}; +var RELATIONS = ["Parent", "Sibling", "Child"]; +var REAlCLOSED = ["Real", "Closed"]; +var ALLUNLINKED = ["All", "No Unlinked"]; +var CODEBLOCK_TYPES = ["tree", "juggl"]; +var CODEBLOCK_FIELDS = [ + "type", + "dir", + "fields", + "depth", + "title", + "flat", + "content", + "from", + "implied" +]; +var JUGGL_CB_DEFAULTS = { + animateLayout: true, + autoAddNodes: false, + autoExpand: false, + autoZoom: false, + coreStore: "core", + expandInitial: false, + fdgdLayout: "d3-force", + filter: "", + height: "750px", + hoverEdges: false, + layout: "force-directed", + limit: 250, + mergeEdges: true, + metaKeyHover: true, + mode: "workspace", + navigator: true, + openWithShift: false, + readContent: true, + styleGroups: [], + toolbar: true, + width: "100%", + zoomSpeed: 1 +}; +var JUGGL_TRAIL_DEFAULTS = Object.assign(JUGGL_CB_DEFAULTS, { + animateLayout: true, + autoZoom: false, + fdgdLayout: "d3-force", + height: "300px", + readContent: false, + toolbar: false, + navigator: false +}); +CODEBLOCK_FIELDS.push(...Object.keys(JUGGL_CB_DEFAULTS)); +var blankUserHier = () => { + return { up: [], same: [], down: [], next: [], prev: [] }; +}; +var blankRealNImplied = () => { + return { + up: { reals: [], implieds: [] }, + down: { reals: [], implieds: [] }, + same: { reals: [], implieds: [] }, + next: { reals: [], implieds: [] }, + prev: { reals: [], implieds: [] } + }; +}; +var [ + BC_I_AUNT, + BC_I_COUSIN, + BC_I_SIBLING_1, + BC_I_SIBLING_2, + BC_I_REFLEXIVE, + BC_I_PARENT +] = [ + "BC-Aunt", + "BC-Cousin", + "BC-Sibling-1", + "BC-Sibling-2", + "BC-Reflexive", + "BC-Parent" +]; +var [ + BC_FOLDER_NOTE, + BC_FOLDER_NOTE_SUBFOLDERS, + BC_FOLDER_NOTE_RECURSIVE, + BC_TAG_NOTE, + BC_TAG_NOTE_FIELD, + BC_TAG_NOTE_EXACT, + BC_LINK_NOTE, + BC_TRAVERSE_NOTE, + BC_REGEX_NOTE, + BC_REGEX_NOTE_FIELD, + BC_DV_NOTE, + BC_DV_NOTE_FIELD, + BC_IGNORE, + BC_IGNORE_DENDRON, + BC_HIDE_TRAIL, + BC_ORDER +] = [ + "BC-folder-note", + "BC-folder-note-subfolders", + "BC-folder-note-recursive", + "BC-tag-note", + "BC-tag-note-field", + "BC-tag-note-exact", + "BC-link-note", + "BC-traverse-note", + "BC-regex-note", + "BC-regex-note-field", + "BC-dataview-note", + "BC-dataview-note-field", + "BC-ignore", + "BC-ignore-dendron", + "BC-hide-trail", + "BC-order" +]; +var BC_FIELDS_INFO = [ + { + field: BC_FOLDER_NOTE, + desc: "Set this note as a Breadcrumbs folder-note. All other notes in this folder will be added to the graph with the field name specified in this key's value", + afterYaml: ": ", + afterInline: ":: ", + alt: true + }, + { + field: BC_FOLDER_NOTE_SUBFOLDERS, + desc: "Link to notes in subfolders with the given field.", + afterYaml: ": ", + afterInline: ":: ", + alt: false + }, + { + field: BC_FOLDER_NOTE_RECURSIVE, + desc: "Recursively add notes in subfolders to the foldernote of _that_ subfolder.", + afterYaml: ": true", + afterInline: ":: true", + alt: false + }, + { + field: BC_TAG_NOTE, + desc: "Set this note as a Breadcrumbs tag-note. All other notes with this tag will be added to the graph using the default fieldName specified in `Settings > Alternative Hierarchies > Tag Notes > Default Field`, or using the fieldName you specify with `BC-tag-note-field: fieldName`", + afterYaml: ": '#", + afterInline: ":: #", + alt: true + }, + { + field: BC_TAG_NOTE_FIELD, + desc: "Manually choose the field for this tag-note to use", + afterYaml: ": ", + afterInline: ":: ", + alt: false + }, + { + field: BC_TAG_NOTE_EXACT, + desc: "Only look for notes with the exact tag. i.e. `#A` won't match `#A/B`", + afterYaml: ": true", + afterInline: ":: true", + alt: false + }, + { + field: BC_LINK_NOTE, + desc: "Set this note as a Breadcrumbs link-note. All links leaving this note will be added to the graph with the field name specified in this key's value.", + afterYaml: ": ", + afterInline: ":: ", + alt: true + }, + { + field: BC_TRAVERSE_NOTE, + desc: "Set this note as a Breadcrumbs traverse-note. Starting from this note, the Obsidian graph will be traversed in depth-first order, and all notes along the way will be added to the BC graph using the fieldName you specify", + afterYaml: ": ", + afterInline: ":: ", + alt: true + }, + { + field: BC_REGEX_NOTE, + desc: "Set this note as a Breadcrumbs regex-note. The value of this field is a regular expression (of the form '/regex/flags'). All note names that match the regex will be added to the BC graph using the default fieldName specified in `Settings > Alternative Hierarchies > Regex Notes > Default Field`, or using the fieldName you specify in 'BC-regex-note-field'.", + afterYaml: ": '/", + afterInline: ":: /", + alt: true + }, + { + field: BC_REGEX_NOTE_FIELD, + desc: "Manually choose the field for this regex-note to use", + afterYaml: ": ", + afterInline: ":: ", + alt: false + }, + { + field: BC_DV_NOTE, + desc: "Set this note as a Breadcrumbs Dataview-note. The value of this field is a Dataview `from` query. All notes that match the query will be added to the BC graph using the default fieldName specified in `Settings > Alternative Hierarchies > Dataview Notes > Default Field`, or using the fieldName you specify in 'BC-dataview-note-field'.", + afterYaml: ": '", + afterInline: ":: ", + alt: true + }, + { + field: BC_DV_NOTE_FIELD, + desc: "Manually choose the field for this Dataview-note to use", + afterYaml: ": ", + afterInline: ":: ", + alt: false + }, + { + field: BC_IGNORE, + desc: "Tells Breadcrumbs to ignore a note from its index entirely. This is useful if you want to use Breadcrumbs to index notes, but you don't want to show them in the graph.", + afterYaml: ": true", + afterInline: ":: true", + alt: false + }, + { + field: BC_IGNORE_DENDRON, + desc: "Tells Breadcrumbs to not treat this note as a dendron note (only useful if the note name has you dendron splitter in it, usually a period `.`).", + afterYaml: ": true", + afterInline: ":: true", + alt: false + }, + { + field: BC_HIDE_TRAIL, + desc: "Don't show the trail in this note", + afterYaml: ": true", + afterInline: ":: true", + alt: false + }, + { + field: BC_ORDER, + desc: "Set the order of this note in the Matrix view. A lower value places this note higher in the order.", + afterYaml: ": ", + afterInline: ":: ", + alt: false + } +]; +var BC_ALTS = BC_FIELDS_INFO.filter((f) => f.alt).map((f) => f.field); +var ILLEGAL_FILENAME_CHARS = [ + "\\", + "/", + ":", + "*", + "?", + '"', + "<", + ">", + "|" +]; +var DATAVIEW_MISSING = "The Dataview plugin must be installed for this to work"; +var API_NAME = "BCAPI"; +var DEFAULT_SETTINGS = { + addDendronNotes: false, + addDateNotes: false, + aliasesInIndex: false, + alphaSortAsc: true, + altLinkFields: [], + CSVPaths: "", + createIndexIndent: " ", + dateFormat: "YYYY-MM-DD", + dateNoteFormat: "yyyy-MM-dd", + dateNoteField: "next", + dataviewNoteField: "up", + dateNoteAddMonth: "", + dateNoteAddYear: "", + debugMode: "WARN", + dendronNoteDelimiter: ".", + dendronNoteField: "up", + dvWaitTime: 5e3, + enableAlphaSort: true, + enableRelationSuggestor: false, + fieldSuggestor: true, + filterImpliedSiblingsOfDifferentTypes: false, + jugglLayout: "hierarchy", + limitWriteBCCheckboxes: [], + CHECKBOX_STATES_OVERWRITTEN: false, + gridDefaultDepth: 25, + hierarchyNotes: [""], + hierarchyNoteIsParent: false, + HNUpField: "", + indexNotes: [""], + namingSystemField: "", + namingSystemRegex: "", + namingSystemSplit: ".", + namingSystemEndsWithDelimiter: false, + refreshOnNoteChange: false, + useAllMetadata: true, + openMatrixOnLoad: true, + openDuckOnLoad: false, + openDownOnLoad: true, + parseJugglLinksWithoutJuggl: false, + showNameOrType: true, + showRelationType: true, + regexNoteField: "", + relSuggestorTrigger: "\\", + rlLeaf: true, + showAllPathsIfNoneToIndexNote: false, + showAllAliases: true, + showBCs: true, + showBCsInEditLPMode: false, + showRefreshNotice: true, + showImpliedRelations: true, + showTrail: true, + showGrid: true, + showJuggl: false, + showPrevNext: true, + sortByNameShowAlias: false, + squareDirectionsOrder: [0, 1, 2, 3, 4], + limitTrailCheckboxes: [], + limitJumpToFirstFields: [], + showAll: "All", + noPathMessage: `This note has no real or implied parents`, + tagNoteField: "", + threadIntoNewPane: false, + threadingTemplate: "{{field}} of {{current}}", + threadingDirTemplates: { up: "", same: "", down: "", next: "", prev: "" }, + threadUnderCursor: false, + trailSeperator: "\u2192", + treatCurrNodeAsImpliedSibling: false, + trimDendronNotes: false, + respectReadableLineLength: true, + userHiers: [ + { + up: ["up"], + same: ["same"], + down: ["down"], + next: ["next"], + prev: ["prev"] + } + ], + writeBCsInline: false, + showWriteAllBCsCmd: false, + visGraph: "Force Directed Graph", + visRelation: "Parent", + visClosed: "Real", + visAll: "All", + wikilinkIndex: true, + impliedRelations: { + siblingIdentity: false, + sameParentIsSibling: true, + siblingsSiblingIsSibling: false, + siblingsParentIsParent: false, + parentsSiblingsIsParents: false, + parentsParentsIsParent: false, + cousinsIsSibling: false + }, + refreshOnNoteSave: false, + showUpInJuggl: false +}; + +// src/Views/MatrixView.ts +var import_loglevel14 = __toESM(require_loglevel()); +var import_obsidian10 = require("obsidian"); + +// src/Debugger.ts +var import_loglevel = __toESM(require_loglevel()); +var Debugger = class { + constructor(plugin) { + this.debugLessThan = (level) => import_loglevel.levels[this.plugin.settings.debugMode] < level; + this.plugin = plugin; + } + start2G(group) { + if (this.debugLessThan(3)) + console.groupCollapsed(group); + } + end2G(...msgs) { + if (this.debugLessThan(3)) { + if (msgs.length) + (0, import_loglevel.info)(...msgs); + console.groupEnd(); + } + } + start1G(group) { + if (this.debugLessThan(2)) + console.groupCollapsed(group); + } + end1G(...msgs) { + if (this.debugLessThan(2)) { + if (msgs.length) + (0, import_loglevel.debug)(...msgs); + console.groupEnd(); + } + } + startGs(...groups) { + this.start2G(groups[0]); + if (groups[1]) + this.start1G(groups[1]); + } + endGs(count2, ...msgs) { + if (count2 === 1) + this.end2G(...msgs); + else { + this.end1G(); + this.end2G(...msgs); + } + } +}; + +// node_modules/svelte/internal/index.mjs +function noop() { +} +function assign(tar, src) { + for (const k in src) + tar[k] = src[k]; + return tar; +} +function run(fn) { + return fn(); +} +function blank_object() { + return /* @__PURE__ */ Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === "function"; +} +function safe_not_equal(a2, b) { + return a2 != a2 ? b == b : a2 !== b || (a2 && typeof a2 === "object" || typeof a2 === "function"); +} +var src_url_equal_anchor; +function src_url_equal(element_src, url) { + if (!src_url_equal_anchor) { + src_url_equal_anchor = document.createElement("a"); + } + src_url_equal_anchor.href = url; + return element_src === src_url_equal_anchor.href; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } +} +function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx; +} +function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === void 0) { + return lets; + } + if (typeof lets === "object") { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i = 0; i < len; i += 1) { + merged[i] = $$scope.dirty[i] | lets[i]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; +} +function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) { + if (slot_changes) { + const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); + slot.p(slot_context, slot_changes); + } +} +function get_all_dirty_from_scope($$scope) { + if ($$scope.ctx.length > 32) { + const dirty = []; + const length = $$scope.ctx.length / 32; + for (let i = 0; i < length; i++) { + dirty[i] = -1; + } + return dirty; + } + return -1; +} +function exclude_internal_props(props) { + const result = {}; + for (const k in props) + if (k[0] !== "$") + result[k] = props[k]; + return result; +} +function null_to_empty(value) { + return value == null ? "" : value; +} +var is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; +} +function append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + node.parentNode.removeChild(node); +} +function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function svg_element(name) { + return document.createElementNS("http://www.w3.org/2000/svg", name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(" "); +} +function empty() { + return text(""); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function get_binding_group_value(group, __value, checked) { + const value = /* @__PURE__ */ new Set(); + for (let i = 0; i < group.length; i += 1) { + if (group[i].checked) + value.add(group[i].__value); + } + if (!checked) { + value.delete(__value); + } + return Array.from(value); +} +function children(element2) { + return Array.from(element2.childNodes); +} +function set_data(text2, data) { + data = "" + data; + if (text2.wholeText !== data) + text2.data = data; +} +function set_input_value(input, value) { + input.value = value == null ? "" : value; +} +function set_style(node, key, value, important) { + node.style.setProperty(key, value, important ? "important" : ""); +} +function select_option(select, value) { + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; + } + } + select.selectedIndex = -1; +} +function select_value(select) { + const selected_option = select.querySelector(":checked") || select.options[0]; + return selected_option && selected_option.__value; +} +var current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; +} +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} +var dirty_components = []; +var binding_callbacks = []; +var render_callbacks = []; +var flush_callbacks = []; +var resolved_promise = Promise.resolve(); +var update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +var flushing = false; +var seen_callbacks = /* @__PURE__ */ new Set(); +function flush() { + if (flushing) + return; + flushing = true; + do { + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +var outroing = /* @__PURE__ */ new Set(); +var outros; +function group_outros() { + outros = { + r: 0, + c: [], + p: outros + }; +} +function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; +} +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +function transition_out(block, local, detach2, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach2) + block.d(1); + callback(); + } + }); + block.o(local); + } +} +var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; +function get_spread_update(levels2, updates) { + const update2 = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i = levels2.length; + while (i--) { + const o = levels2[i]; + const n = updates[i]; + if (n) { + for (const key in o) { + if (!(key in n)) + to_null_out[key] = 1; + } + for (const key in n) { + if (!accounted_for[key]) { + update2[key] = n[key]; + accounted_for[key] = 1; + } + } + levels2[i] = n; + } else { + for (const key in o) { + accounted_for[key] = 1; + } + } + } + for (const key in to_null_out) { + if (!(key in update2)) + update2[key] = void 0; + } + return update2; +} +function get_spread_object(spread_props) { + return typeof spread_props === "object" && spread_props !== null ? spread_props : {}; +} +function create_component(block) { + block && block.c(); +} +function mount_component(component, target, anchor, customElement) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i / 31 | 0] |= 1 << i % 31; +} +function init(component, options, instance24, create_fragment24, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: null, + props, + update: noop, + not_equal, + bound: blank_object(), + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance24 ? instance24(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment24 ? create_fragment24($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + end_hydrating(); + flush(); + } + set_current_component(parent_component); +} +var SvelteElement; +if (typeof HTMLElement === "function") { + SvelteElement = class extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + connectedCallback() { + const { on_mount } = this.$$; + this.$$.on_disconnect = on_mount.map(run).filter(is_function); + for (const key in this.$$.slotted) { + this.appendChild(this.$$.slotted[key]); + } + } + attributeChangedCallback(attr2, _oldValue, newValue) { + this[attr2] = newValue; + } + disconnectedCallback() { + run_all(this.$$.on_disconnect); + } + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type2, callback) { + const callbacks = this.$$.callbacks[type2] || (this.$$.callbacks[type2] = []); + callbacks.push(callback); + return () => { + const index2 = callbacks.indexOf(callback); + if (index2 !== -1) + callbacks.splice(index2, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + }; +} +var SvelteComponent = class { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type2, callback) { + const callbacks = this.$$.callbacks[type2] || (this.$$.callbacks[type2] = []); + callbacks.push(callback); + return () => { + const index2 = callbacks.indexOf(callback); + if (index2 !== -1) + callbacks.splice(index2, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +}; + +// src/refreshIndex.ts +var import_graphology2 = __toESM(require_graphology_umd_min()); +var import_loglevel13 = __toESM(require_loglevel()); +var import_obsidian9 = require("obsidian"); + +// src/Utils/graphUtils.ts +var import_graphology = __toESM(require_graphology_umd_min()); +var import_graphology_traversal = __toESM(require_graphology_traversal()); +var import_loglevel4 = __toESM(require_loglevel()); + +// src/Utils/HierUtils.ts +function getFields(userHiers, dir = "all") { + const fields = []; + userHiers.forEach((hier) => { + if (dir === "all") { + DIRECTIONS.forEach((eachDir) => { + fields.push(...hier[eachDir]); + }); + } else { + fields.push(...hier[dir]); + } + }); + return fields; +} +var getOppDir = (dir) => { + switch (dir) { + case "up": + return "down"; + case "down": + return "up"; + case "same": + return "same"; + case "next": + return "prev"; + case "prev": + return "next"; + } +}; +function getFieldInfo(userHiers, field) { + let fieldDir; + let fieldHier; + DIRECTIONS.forEach((dir) => { + userHiers.forEach((hier) => { + if (hier[dir].includes(field)) { + fieldDir = dir; + fieldHier = hier; + return; + } + }); + }); + return { fieldHier, fieldDir }; +} +function getOppFields(userHiers, field, dir) { + if (field.endsWith(">")) + return [field.slice(0, -4)]; + const oppFields = [fallbackOppField(field, dir)]; + const { fieldHier, fieldDir } = getFieldInfo(userHiers, field); + if (!fieldHier || !fieldDir) + return oppFields; + const oppDir = getOppDir(fieldDir); + oppFields.unshift(...fieldHier[oppDir]); + return oppFields; +} +var hierToStr = (hier) => DIRECTIONS.map((dir) => `${ARROW_DIRECTIONS[dir]}: ${hier[dir].join(", ")}`).join("\n"); +var fallbackField = (field, dir) => `${field} <${ARROW_DIRECTIONS[dir]}>`; +var fallbackOppField = (field, dir) => `${field} <${ARROW_DIRECTIONS[getOppDir(dir)]}>`; +function iterateHiers(userHiers, fn) { + userHiers.forEach((hier) => { + DIRECTIONS.forEach((dir) => { + hier[dir].forEach((field) => { + fn(hier, dir, field); + }); + }); + }); +} + +// src/Utils/ObsidianUtils.ts +var import_loglevel3 = __toESM(require_loglevel()); +var import_obsidian3 = require("obsidian"); + +// src/Utils/generalUtils.ts +var import_loglevel2 = __toESM(require_loglevel()); +var dropPath = (path2) => path2.replace(/^.*\//, ""); +var dropDendron = (path2, settings) => settings.trimDendronNotes ? path2.split(settings.dendronNoteDelimiter).last() : path2; +var dropPathNDendron = (path2, settings) => dropDendron(dropPath(path2), settings); +var dropFolder = (path2) => path2.split("/").last().split(".").slice(0, -1).join("."); +var splitAndTrim = (fields) => { + if (!fields || fields === "") + return []; + else + return fields.split(",").map((str) => str.trim()); +}; +function padArray(arr, finalLength, filler = "") { + const copy3 = [...arr]; + const currLength = copy3.length; + if (currLength > finalLength) + throw new Error("Current length is greater than final length"); + else if (currLength === finalLength) + return copy3; + else { + for (let i = currLength; i < finalLength; i++) + copy3.push(filler); + return copy3; + } +} +function transpose(A2) { + const cols = A2[0].length; + const AT = []; + for (let j = 0; j < cols; j++) + AT.push(A2.map((row) => row[j])); + return AT; +} +function runs(arr) { + const runs2 = []; + let i = 0; + while (i < arr.length) { + const currValue = arr[i]; + runs2.push({ value: currValue, first: i, last: void 0 }); + while (currValue === arr[i]) { + i++; + } + runs2.last().last = i - 1; + } + return runs2; +} +function swapItems(i, j, arr) { + const max4 = arr.length - 1; + if (i < 0 || i > max4 || j < 0 || j > max4) + return arr; + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + return arr; +} +function strToRegex(input) { + const match = input.match(regNFlags); + if (!match) + return null; + const [, innerRegex, flags] = match; + try { + const regex = new RegExp(innerRegex, flags); + return regex; + } catch (e) { + (0, import_loglevel2.warn)(e); + return null; + } +} +function escapeRegex(string) { + return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); +} + +// src/Utils/ObsidianUtils.ts +var getSettings = () => app.plugins.plugins.breadcrumbs.settings; +var getCurrFile = () => app.workspace.getActiveFile(); +var getBaseFromMDPath = (path2) => { + const splitSlash = path2.split("/").last(); + if (splitSlash.endsWith(".md")) { + return splitSlash.split(".md").slice(0, -1).join("."); + } else + return splitSlash; +}; +var getDVBasename = (file) => file.basename || file.name; +var getFolderName = (file) => { + var _a; + return ((_a = file == null ? void 0 : file.parent) == null ? void 0 : _a.name) || file.folder; +}; +function makeWiki(str, wikiQ = true) { + let copy3 = str.slice(); + if (wikiQ) { + copy3 = "[[" + copy3; + copy3 += "]]"; + } + return copy3; +} +function dropWikilinks(str) { + let copy3 = str.slice(); + if (copy3.startsWith("[[") && copy3.endsWith("]]")) + copy3 = copy3.slice(2, -2); + return copy3; +} +var createOrUpdateYaml = async (key, value, file, frontmatter, api) => { + const valueStr = value.toString(); + if (!frontmatter || frontmatter[key] === void 0) { + (0, import_loglevel3.info)(`Creating: ${key}: ${valueStr}`); + await api.createYamlProperty(key, `['${valueStr}']`, file); + } else if ([...[frontmatter[key]]].flat(3).some((val) => val == valueStr)) { + (0, import_loglevel3.info)("Already Exists!"); + return; + } else { + const oldValueFlat = [...[frontmatter[key]]].flat(4); + const newValue = [...oldValueFlat, `'${valueStr}'`]; + (0, import_loglevel3.info)(`Updating: ${key}: ${newValue}`); + await api.update(key, `[${newValue.join(", ")}]`, file); + } +}; +function changeYaml(yaml, key, newVal) { + if (yaml === "") { + return `${key}: ['${newVal}']`; + } else { + const parsed = (0, import_obsidian3.parseYaml)(yaml); + const value = parsed[key]; + if (value === void 0) { + parsed[key] = newVal; + } else if (typeof value === "string" && value !== newVal) { + parsed[key] = [value, newVal]; + } else if (typeof (value == null ? void 0 : value[0]) === "string" && value.includes && !value.includes(newVal)) { + parsed[key] = [...value, newVal]; + } + return (0, import_obsidian3.stringifyYaml)(parsed); + } +} +function splitAtYaml2(content) { + if (!content.startsWith("---\n")) + return ["", content]; + else { + const splits = content.split("---"); + return [ + splits.slice(0, 2).join("---") + "---", + splits.slice(2).join("---") + ]; + } +} +var dropHash = (tag) => tag.startsWith("#") ? tag.slice(1) : tag; +var addHash = (tag) => tag.startsWith("#") ? tag : `#${tag}`; +function getAlt(node, plugin) { + var _a; + const { altLinkFields, showAllAliases } = plugin.settings; + if (altLinkFields.length) { + const file = app.metadataCache.getFirstLinkpathDest(node, ""); + if (file) { + const metadata = app.metadataCache.getFileCache(file); + for (const altField of altLinkFields) { + const value = (_a = metadata == null ? void 0 : metadata.frontmatter) == null ? void 0 : _a[altField]; + const arr = typeof value === "string" ? splitAndTrim(value) : value; + if (value) + return showAllAliases ? arr.join(", ") : arr[0]; + } + } + } else + return null; +} +async function waitForCache(plugin) { + var _a; + if (app.plugins.enabledPlugins.has("dataview")) { + let basename; + while (!basename || !app.plugins.plugins.dataview.api.page(basename)) { + await wait(100); + basename = (_a = getCurrFile()) == null ? void 0 : _a.basename; + } + } else { + await waitForResolvedLinks(app); + } +} +var linkClass = (to, realQ = true) => `internal-link BC-Link ${isInVault(to) ? "" : "is-unresolved"} ${realQ ? "" : "BC-Implied"}`; +var getDVApi = (plugin) => { + var _a; + return (_a = app.plugins.plugins.dataview) == null ? void 0 : _a.api; +}; +function isInsideYaml() { + const { workspace, metadataCache } = app; + const { activeLeaf } = workspace; + const { + state: { mode } + } = activeLeaf.getViewState(); + if (mode !== "source") + return null; + const { editor } = activeLeaf.view; + const file = getCurrFile(); + if (!file) + return null; + const { frontmatter } = metadataCache.getFileCache(file); + if (!frontmatter) + return false; + const { start: start2, end } = frontmatter.position; + const currOff = editor.posToOffset(editor.getCursor()); + if (currOff >= start2.offset && currOff <= end.offset) + return true; + else + return false; +} + +// src/Utils/graphUtils.ts +function closeImpliedLinks(real, implied) { + const closedG = real.copy(); + implied.forEachEdge((key, a2, s, t) => { + closedG.mergeEdge(t, s, a2); + }); + return closedG; +} +function removeUnlinkedNodes(g) { + const copy3 = g.copy(); + copy3.forEachNode((node) => { + if (!copy3.degree(node)) + copy3.dropNode(node); + }); + return copy3; +} +function getSubInDirs(g, ...dirs) { + const sub = new import_graphology.MultiGraph(); + g == null ? void 0 : g.forEachEdge((k, a2, s, t) => { + if (dirs.includes(a2.dir)) { + addNodesIfNot(sub, [s, t], { order: a2.order }); + sub.addEdge(s, t, a2); + } + }); + return sub; +} +function getSubForFields(g, fields) { + const sub = new import_graphology.MultiGraph(); + g.forEachEdge((k, a2, s, t) => { + if (fields.includes(a2.field)) { + addNodesIfNot(sub, [s, t], { order: a2.order }); + sub.addEdge(s, t, a2); + } + }); + return sub; +} +function getReflexiveClosure(g, userHiers) { + const copy3 = g.copy(); + copy3.forEachEdge((k, a2, s, t) => { + const { dir, field } = a2; + if (field === void 0) + return; + const oppDir = getOppDir(dir); + const oppField = dir === "same" ? field : getOppFields(userHiers, field, dir)[0]; + addNodesIfNot(copy3, [s, t], { order: 9999 }); + addEdgeIfNot(copy3, t, s, { + dir: oppDir, + field: oppField, + implied: BC_I_REFLEXIVE + }); + }); + return copy3; +} +function addNodesIfNot(g, nodes, attr2 = { order: 9999 }) { + for (const node of nodes) { + g.updateNode(node, (exstantAttrs) => { + const extantOrder = exstantAttrs.order; + return { + ...exstantAttrs, + order: extantOrder && extantOrder < 9999 ? extantOrder : attr2.order + }; + }); + } +} +function addEdgeIfNot(g, source, target, attr2) { + if (!g.hasEdge(source, target)) + g.addEdge(source, target, attr2); +} +var getSinks = (g) => g.filterNodes((node) => g.hasNode(node) && !g.outDegree(node)); +var getOutNeighbours = (g, node) => g.hasNode(node) ? g.outNeighbors(node) : []; +var getInNeighbours = (g, node) => g.hasNode(node) ? g.inNeighbors(node) : []; +function dfsAllPaths(g, start2) { + const queue = [{ node: start2, path: [] }]; + const visited = {}; + const allPaths = []; + let i = 0; + while (queue.length > 0 && i < 1e3) { + i++; + const { node, path: path2 } = queue.shift(); + const extPath = [node, ...path2]; + const succsNotVisited = g.hasNode(node) ? g.filterOutNeighbors(node, (succ) => !visited[succ] || visited[succ] < 5) : []; + const newItems = succsNotVisited.map((succ) => { + visited[succ] = visited[succ] ? visited[succ] + 1 : 1; + return { node: succ, path: extPath }; + }); + queue.unshift(...newItems); + if (!g.hasNode(node) || !g.outDegree(node)) + allPaths.push(extPath); + } + return allPaths; +} +function bfsAllPaths(g, start2) { + const pathsArr = []; + const queue = [{ node: start2, path: [] }]; + let i = 0; + while (queue.length !== 0 && i < 1e3) { + i++; + const { node, path: path2 } = queue.shift(); + const extPath = [node, ...path2]; + const succs = g.hasNode(node) ? g.filterOutNeighbors(node, (n) => !path2.includes(n)) : []; + for (const node2 of succs) { + queue.push({ node: node2, path: extPath }); + } + if (!g.hasNode(node) || succs.length === 0) { + pathsArr.push(extPath); + } + } + pathsArr.forEach((path2) => { + if (path2.length) + path2.splice(path2.length - 1, 1); + }); + (0, import_loglevel4.info)({ pathsArr }); + return pathsArr; +} +function removeCycles(g, startNode) { + const copy3 = g.copy(); + let prevNode = null; + (0, import_graphology_traversal.dfsFromNode)(copy3, startNode, (n) => { + copy3.forEachOutNeighbor(n, (t) => { + if (t === prevNode && copy3.hasEdge(t, prevNode)) { + try { + copy3.dropEdge(t, prevNode); + } catch (error6) { + console.error(t, prevNode, error6); + } + } + }); + prevNode = n; + }); + return copy3; +} +function buildObsGraph() { + const ObsG = new import_graphology.MultiGraph(); + const { resolvedLinks, unresolvedLinks } = app.metadataCache; + for (const source in resolvedLinks) { + if (!source.endsWith(".md")) + continue; + const sourceBase = getBaseFromMDPath(source); + addNodesIfNot(ObsG, [sourceBase]); + for (const dest in resolvedLinks[source]) { + if (!dest.endsWith(".md")) + continue; + const destBase = getBaseFromMDPath(dest); + addNodesIfNot(ObsG, [destBase]); + ObsG.addEdge(sourceBase, destBase, { resolved: true }); + } + } + for (const source in unresolvedLinks) { + const sourceBase = getBaseFromMDPath(source); + addNodesIfNot(ObsG, [sourceBase]); + for (const dest in unresolvedLinks[source]) { + const destBase = getBaseFromMDPath(dest); + addNodesIfNot(ObsG, [destBase]); + if (sourceBase === destBase) + continue; + ObsG.addEdge(sourceBase, destBase, { resolved: false }); + } + } + (0, import_loglevel4.info)({ ObsG }); + return ObsG; +} +function populateMain(settings, mainG, source, field, target, sourceOrder, targetOrder, fillOpp = false) { + const { userHiers } = settings; + const dir = getFieldInfo(userHiers, field).fieldDir; + addNodesIfNot(mainG, [source], { + order: sourceOrder + }); + addNodesIfNot(mainG, [target], { + order: targetOrder + }); + addEdgeIfNot(mainG, source, target, { + dir, + field + }); + if (fillOpp) { + addEdgeIfNot(mainG, target, source, { + dir: getOppDir(dir), + field: getOppFields(userHiers, field, dir)[0] + }); + } +} +var getTargetOrder = (frontms, target) => { + var _a, _b; + return parseInt((_b = (_a = frontms.find((ff) => { + var _a2; + return ((_a2 = ff == null ? void 0 : ff.file) == null ? void 0 : _a2.basename) === target; + })) == null ? void 0 : _a[BC_ORDER]) != null ? _b : "9999"); +}; +var getSourceOrder = (frontm) => { + var _a; + return parseInt((_a = frontm[BC_ORDER]) != null ? _a : "9999"); +}; +function getRealnImplied(plugin, currNode, dir = null) { + const realsnImplieds = blankRealNImplied(); + const { settings, closedG } = plugin; + const { userHiers } = settings; + if (!closedG.hasNode(currNode)) + return realsnImplieds; + closedG.forEachEdge(currNode, (k, a2, s, t) => { + const { field, dir: edgeDir, implied } = a2; + const oppField = getOppFields(userHiers, field, edgeDir)[0]; + (dir ? [dir, getOppDir(dir)] : DIRECTIONS).forEach((currDir) => { + const oppDir = getOppDir(currDir); + if (s === currNode && (edgeDir === currDir || edgeDir === oppDir)) { + const arr = realsnImplieds[edgeDir].reals; + if (arr.findIndex((item) => item.to === t) === -1) { + arr.push({ to: t, field, implied }); + } + } else if (edgeDir === currDir || edgeDir === oppDir) { + const arr = realsnImplieds[getOppDir(edgeDir)].implieds; + if (arr.findIndex((item) => item.to === s) === -1) { + arr.push({ + to: s, + field: oppField, + implied + }); + } + } + }); + }); + return realsnImplieds; +} + +// src/Relations.ts +function addSiblingsFromSameParent(g, settings) { + const { userHiers, treatCurrNodeAsImpliedSibling } = settings; + g.forEachNode((currN, a2) => { + g.forEachOutEdge(currN, (k, currNAttr, s, parentNode) => { + var _a; + if (currNAttr.dir !== "up") + return; + const { fieldDir, fieldHier } = getFieldInfo(userHiers, currNAttr.field); + const field = (_a = fieldHier.same[0]) != null ? _a : fallbackField(currNAttr.field, fieldDir); + g.forEachOutEdge(parentNode, (k2, a3, s2, impliedSibling) => { + if (a3.dir !== "down" || !treatCurrNodeAsImpliedSibling && impliedSibling === currN) + return; + addEdgeIfNot(g, currN, impliedSibling, { + dir: "same", + field, + implied: BC_I_SIBLING_1 + }); + }); + }); + }); +} +function addSiblingsParentIsParent(g) { + g.forEachNode((currN, a2) => { + g.forEachOutEdge(currN, (k, currNAttr, s, sibling) => { + if (currNAttr.dir !== "same") + return; + g.forEachOutEdge(sibling, (k2, a3, s2, parent) => { + const { dir, field } = a3; + if (dir !== "up") + return; + addEdgeIfNot(g, currN, parent, { + dir: "up", + field, + implied: BC_I_PARENT + }); + }); + }); + }); +} +function addAuntsUncles(g) { + g.forEachNode((currN, a2) => { + g.forEachOutEdge(currN, (k, currEAttr, s, parentNode) => { + if (currEAttr.dir !== "up") + return; + g.forEachOutEdge(parentNode, (k2, a3, s2, uncle) => { + if (a3.dir !== "same") + return; + addEdgeIfNot(g, currN, uncle, { + dir: "up", + field: currEAttr.field, + implied: BC_I_AUNT + }); + }); + }); + }); +} +function addCousins(g) { + g.forEachNode((currN, a2) => { + g.forEachOutEdge(currN, (k, currEAttr, s, parentNode) => { + if (currEAttr.dir !== "up") + return; + g.forEachOutEdge(parentNode, (k2, parentSiblingAttr, s2, uncle) => { + if (parentSiblingAttr.dir !== "same") + return; + g.forEachOutEdge(uncle, (k3, a3, s3, cousin) => { + if (a3.dir !== "down" || currN === cousin) + return; + addEdgeIfNot(g, currN, cousin, { + dir: "same", + field: parentSiblingAttr.field, + implied: BC_I_COUSIN + }); + }); + }); + }); + }); +} +function addStructuralEquivalenceSiblings(g) { + g.forEachNode((currN, a2) => { + g.forEachInEdge(currN, (k, aSis, sis, _) => { + if (aSis.dir !== "same") + return; + g.forEachInEdge(currN, (k2, aBro, bro, _2) => { + if (aBro.dir !== "same" || sis === bro) + return; + if (aBro.field === aSis.field) { + addEdgeIfNot(g, sis, bro, { + dir: "same", + field: aBro.field, + implied: BC_I_SIBLING_2 + }); + } + }); + }); + }); +} + +// src/AlternativeHierarchies/CSVCrumbs.ts +var import_loglevel5 = __toESM(require_loglevel()); +var import_obsidian4 = require("obsidian"); +async function getCSVRows(plugin) { + const { CSVPaths } = plugin.settings; + const CSVRows = []; + if (CSVPaths === "") + return CSVRows; + const fullPath = (0, import_obsidian4.normalizePath)(CSVPaths); + const content = await app.vault.adapter.read(fullPath); + const lines = content.split("\n"); + const headers = lines[0].split(",").map((head) => head.trim()); + lines.slice(1).forEach((row) => { + const rowObj = {}; + row.split(",").map((head) => dropWikilinks(head.trim())).forEach((item, i) => { + rowObj[headers[i]] = item; + }); + (0, import_loglevel5.debug)({ rowObj }); + CSVRows.push(rowObj); + }); + return CSVRows; +} +function addCSVCrumbs(g, CSVRows, dir, field) { + CSVRows.forEach((row) => { + addNodesIfNot(g, [row.file]); + if (field === "" || !row[field]) + return; + addNodesIfNot(g, [row[field]]); + addEdgeIfNot(g, row.file, row[field], { dir, field }); + }); +} + +// src/AlternativeHierarchies/DataviewNotes.ts +var import_loglevel6 = __toESM(require_loglevel()); +var import_obsidian5 = require("obsidian"); +function addDataviewNotesToGraph(plugin, eligableAlts, frontms, mainG) { + const { settings } = plugin; + const { userHiers, dataviewNoteField } = settings; + const dv = getDVApi(plugin); + if (!dv && eligableAlts.length) { + new import_obsidian5.Notice(DATAVIEW_MISSING); + return; + } + const fields = getFields(userHiers); + eligableAlts.forEach((altFile) => { + var _a; + const basename = getDVBasename(altFile.file); + let query = altFile[BC_DV_NOTE]; + if (query.hasOwnProperty("path")) { + query = `[[${query.path}]]`; + } + let field = (_a = altFile[BC_DV_NOTE_FIELD]) != null ? _a : dataviewNoteField || fields[0]; + let targets = []; + try { + targets = dv.pages(query).values; + } catch (er) { + new import_obsidian5.Notice(`${query} is not a valid Dataview from-query`); + (0, import_loglevel6.warn)(er); + } + for (const target of targets) { + if (target[BC_IGNORE]) + continue; + const targetBN = getDVBasename(target.file); + const sourceOrder = getSourceOrder(altFile); + const targetOrder = getTargetOrder(frontms, targetBN); + populateMain(settings, mainG, basename, field, targetBN, sourceOrder, targetOrder, true); + } + }); +} + +// src/AlternativeHierarchies/DateNotes.ts +var luxon = __toESM(require_luxon()); +function addDateNotesToGraph(plugin, frontms, mainG) { + const { settings } = plugin; + const { + addDateNotes, + dateNoteAddMonth, + dateNoteAddYear, + dateNoteFormat, + dateNoteField + } = settings; + if (!addDateNotes) + return; + const { regex } = luxon.DateTime.fromFormatExplain("", dateNoteFormat); + frontms.forEach((page) => { + const { file } = page; + const { day } = file; + if (!day || !regex.test(getDVBasename(file))) + return; + const today = getDVBasename(file); + const tomorrow = day.plus({ days: 1 }); + const tomStr = tomorrow.toFormat(dateNoteFormat); + populateMain(settings, mainG, today, dateNoteField, tomStr, 9999, 9999, true); + }); +} + +// src/AlternativeHierarchies/DendronNotes.ts +var getDendronParent = (dendron, splitter) => dendron.split(splitter).slice(0, -1).join(splitter); +function addDendronNotesToGraph(plugin, frontms, mainG) { + const { settings } = plugin; + const { addDendronNotes, dendronNoteDelimiter, dendronNoteField } = settings; + if (!addDendronNotes) + return; + for (const frontm of frontms) { + if (frontm[BC_IGNORE_DENDRON] || frontm[BC_IGNORE]) + continue; + let curr = getDVBasename(frontm.file); + let parent = getDendronParent(curr, dendronNoteDelimiter); + while (parent !== "") { + const parentFile = frontms.find((fm) => getDVBasename(fm.file) === parent); + if (!parentFile || parentFile[BC_IGNORE_DENDRON] !== true) { + populateMain(settings, mainG, curr, dendronNoteField, parent, 9999, 9999, true); + } + curr = parent; + parent = getDendronParent(parent, dendronNoteDelimiter); + } + } +} + +// src/AlternativeHierarchies/FolderNotes.ts +var import_obsidian6 = require("obsidian"); +var getSubsFromFolder = (folder) => { + const otherNotes = [], subFolders = []; + folder.children.forEach((tAbstract) => { + if (tAbstract instanceof import_obsidian6.TFile) + otherNotes.push(tAbstract); + else + subFolders.push(tAbstract); + }); + return { otherNotes, subFolders }; +}; +function addFolderNotesToGraph(plugin, folderNotes, frontms, mainG) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + folderNotes.forEach((altFile) => { + const { file } = altFile; + const basename = getDVBasename(file); + const topFolderName = getFolderName(file); + const topFolder = app.vault.getAbstractFileByPath(topFolderName); + const targets = frontms.map((ff) => ff.file).filter((other) => getFolderName(other) === topFolderName && other.path !== file.path && !other[BC_IGNORE]).map(getDVBasename); + const field = altFile[BC_FOLDER_NOTE]; + if (typeof field !== "string" || !fields.includes(field)) + return; + targets.forEach((target) => { + const sourceOrder = getSourceOrder(altFile); + const targetOrder = getTargetOrder(frontms, basename); + populateMain(settings, mainG, basename, field, target, sourceOrder, targetOrder, true); + }); + if (altFile[BC_FOLDER_NOTE_SUBFOLDERS]) { + const subfolderField = altFile[BC_FOLDER_NOTE_SUBFOLDERS]; + if (typeof subfolderField !== "string" || !fields.includes(subfolderField)) + return; + const { subFolders } = getSubsFromFolder(topFolder); + subFolders.forEach((subFolder) => { + subFolder.children.forEach((child) => { + if (child instanceof import_obsidian6.TFile) { + const childBasename = getDVBasename(child); + populateMain(settings, mainG, basename, subfolderField, childBasename, 9999, 9999, true); + } + }); + }); + } + if (altFile[BC_FOLDER_NOTE_RECURSIVE]) { + const { subFolders } = getSubsFromFolder(topFolder); + const folderQueue = [...subFolders]; + let currFolder = folderQueue.shift(); + while (currFolder !== void 0) { + const { otherNotes, subFolders: subFolders2 } = getSubsFromFolder(currFolder); + const folderNote = currFolder.name; + const targets2 = otherNotes.map(getDVBasename); + const sourceOrder = 9999; + const targetOrder = 9999; + const parentFolderNote = currFolder.parent.name; + populateMain(settings, mainG, parentFolderNote, field, folderNote, sourceOrder, targetOrder, true); + targets2.forEach((target) => { + if (target === folderNote) + return; + const sourceOrder2 = 9999; + const targetOrder2 = 9999; + populateMain(settings, mainG, folderNote, field, target, sourceOrder2, targetOrder2, true); + }); + folderQueue.push(...subFolders2); + currFolder = folderQueue.shift(); + } + } + }); +} + +// src/AlternativeHierarchies/HierarchyNotes/HierarchyNotes.ts +async function getHierarchyNoteItems(file) { + const { listItems } = app.metadataCache.getFileCache(file); + if (!listItems) + return []; + const basename = getDVBasename(file); + const { hierarchyNoteIsParent } = getSettings(); + const lines = (await app.vault.cachedRead(file)).split("\n"); + const hierarchyNoteItems = []; + const afterBulletReg = new RegExp(/\s*[+*-]\s(.*$)/); + const dropWikiLinksReg = new RegExp(/\[\[(.*?)\]\]/); + const fieldReg = new RegExp(/(.*?)\[\[.*?\]\]/); + for (const item of listItems) { + const line = lines[item.position.start.line]; + const afterBulletCurr = afterBulletReg.exec(line)[1]; + const note = dropWikiLinksReg.exec(afterBulletCurr)[1]; + let field = fieldReg.exec(afterBulletCurr)[1].trim() || null; + const { parent } = item; + if (parent >= 0) { + const parentNote = lines[parent]; + const afterBulletParent = afterBulletReg.exec(parentNote)[1]; + const dropWikiParent = dropWikiLinksReg.exec(afterBulletParent)[1]; + hierarchyNoteItems.push({ + note, + parent: dropWikiParent, + field + }); + } else { + hierarchyNoteItems.push({ + note, + parent: hierarchyNoteIsParent ? basename : null, + field + }); + } + } + return hierarchyNoteItems; +} +function addHNsToGraph(settings, hnArr, mainG) { + const { HNUpField, userHiers } = settings; + const upFields = getFields(userHiers, "up"); + hnArr.forEach((hnItem, i) => { + var _a, _b; + const { note, field, parent } = hnItem; + const targetField = field != null ? field : HNUpField || upFields[0]; + const dir = (_a = getFieldInfo(userHiers, targetField)) == null ? void 0 : _a.fieldDir; + const oppDir = getOppDir(dir); + const oppField = getOppFields(userHiers, targetField, dir)[0]; + if (parent === null) { + const s = note; + const t = (_b = hnArr[i + 1]) == null ? void 0 : _b.note; + addNodesIfNot(mainG, [s, t]); + addEdgeIfNot(mainG, s, t, { dir: oppDir, field: oppField }); + } else { + addNodesIfNot(mainG, [note, parent]); + if (settings.showUpInJuggl) { + addEdgeIfNot(mainG, note, parent, { + dir, + field: targetField + }); + } + addEdgeIfNot(mainG, parent, note, { + dir: oppDir, + field: oppField + }); + } + }); +} + +// src/AlternativeHierarchies/JugglLinks.ts +async function getJugglLinks(plugin, files) { + const { settings, db } = plugin; + db.start2G("getJugglLinks"); + const { userHiers } = settings; + const typedLinksArr = await Promise.all(files.map(async (file) => { + var _a, _b; + const jugglLink = { file, links: [] }; + const links = (_b = (_a = app.metadataCache.getFileCache(file)) == null ? void 0 : _a.links) != null ? _b : []; + const content = links.length ? await app.vault.cachedRead(file) : ""; + const lines = content.split("\n"); + links.forEach((link2) => { + var _a2, _b2, _c, _d, _e, _f, _g; + const lineNo = link2.position.start.line; + const line = lines[lineNo]; + const linksInLine = (_c = (_b2 = (_a2 = line.match(splitLinksRegex)) == null ? void 0 : _a2.map((link3) => link3.slice(2, link3.length - 2))) == null ? void 0 : _b2.map((innerText) => innerText.split("|")[0])) != null ? _c : []; + const typedLinkPrefix = (_e = (_d = app.plugins.plugins.juggl) == null ? void 0 : _d.settings.typedLinkPrefix) != null ? _e : "-"; + const parsedLinks = parseTypedLink(link2, line, typedLinkPrefix); + const field = (_g = (_f = parsedLinks == null ? void 0 : parsedLinks.properties) == null ? void 0 : _f.type) != null ? _g : ""; + if (field === "") + return; + const { fieldDir } = getFieldInfo(userHiers, field) || {}; + if (!fieldDir) + return; + jugglLink.links.push({ + dir: fieldDir, + field, + linksInLine + }); + }); + return jugglLink; + })); + const allFields = getFields(userHiers); + const filteredLinks = typedLinksArr.map((jugglLink) => { + jugglLink.links = jugglLink.links.filter((link2) => allFields.includes(link2.field)); + return jugglLink; + }); + db.end2G({ filteredLinks }); + return filteredLinks; +} +function addJugglLinksToGraph(settings, jugglLinks, frontms, mainG) { + jugglLinks.forEach((jugglLink) => { + const { basename } = jugglLink.file; + jugglLink.links.forEach((link2) => { + const { dir, field, linksInLine } = link2; + if (dir === "") + return; + const sourceOrder = getTargetOrder(frontms, basename); + linksInLine.forEach((linkInLine) => { + const targetsOrder = getTargetOrder(frontms, linkInLine); + populateMain(settings, mainG, basename, field, linkInLine, sourceOrder, targetsOrder); + }); + }); + }); +} + +// src/AlternativeHierarchies/LinkNotes.ts +function addLinkNotesToGraph(plugin, eligableAlts, frontms, mainG) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + eligableAlts.forEach((altFile) => { + var _a, _b, _c, _d; + const linkNoteFile = altFile.file; + const linkNoteBasename = getDVBasename(linkNoteFile); + let field = altFile[BC_LINK_NOTE]; + if (typeof field !== "string" || !fields.includes(field)) + return; + const links = (_b = (_a = app.metadataCache.getFileCache(linkNoteFile)) == null ? void 0 : _a.links) == null ? void 0 : _b.map((l) => l.link.match(/[^#|]+/)[0]); + const embeds = (_d = (_c = app.metadataCache.getFileCache(linkNoteFile)) == null ? void 0 : _c.embeds) == null ? void 0 : _d.map((l) => l.link.match(/[^#|]+/)[0]); + const targets = [...links != null ? links : [], ...embeds != null ? embeds : []]; + for (const target of targets) { + const sourceOrder = getSourceOrder(altFile); + const targetOrder = getTargetOrder(frontms, linkNoteBasename); + populateMain(settings, mainG, linkNoteBasename, field, target, sourceOrder, targetOrder, true); + } + }); +} + +// src/AlternativeHierarchies/RegexNotes.ts +var import_loglevel7 = __toESM(require_loglevel()); +function addRegexNotesToGraph(plugin, eligableAlts, frontms, mainG) { + const { settings } = plugin; + const { userHiers, regexNoteField } = settings; + const fields = getFields(userHiers); + eligableAlts.forEach((altFile) => { + const regexNoteFile = altFile.file; + const regexNoteBasename = getDVBasename(regexNoteFile); + const regex = strToRegex(altFile[BC_REGEX_NOTE]); + (0, import_loglevel7.info)({ regex }); + let field = altFile[BC_REGEX_NOTE_FIELD]; + if (typeof field !== "string" || !fields.includes(field)) + field = regexNoteField || fields[0]; + const targets = []; + frontms.forEach((page) => { + if (page[BC_IGNORE]) + return; + const basename = getDVBasename(page.file); + if (basename !== regexNoteBasename && regex.test(basename)) + targets.push(basename); + }); + for (const target of targets) { + const sourceOrder = getSourceOrder(altFile); + const targetOrder = getTargetOrder(frontms, regexNoteBasename); + populateMain(settings, mainG, regexNoteBasename, field, target, sourceOrder, targetOrder, true); + } + }); +} + +// src/AlternativeHierarchies/TagNotes.ts +var import_loglevel8 = __toESM(require_loglevel()); +var getAllTags = (file, withHash = true) => { + var _a, _b; + const { tags, frontmatter } = app.metadataCache.getFileCache(file); + const allTags = []; + tags == null ? void 0 : tags.forEach((t) => allTags.push(dropHash(t.tag))); + [(_a = frontmatter == null ? void 0 : frontmatter.tags) != null ? _a : []].flat().forEach((t) => { + splitAndTrim(t).forEach((innerT) => allTags.push(dropHash(innerT))); + }); + [(_b = frontmatter == null ? void 0 : frontmatter.tag) != null ? _b : []].flat().forEach((t) => { + splitAndTrim(t).forEach((innerT) => allTags.push(dropHash(innerT))); + }); + return allTags.map((t) => (withHash ? "#" : "") + t.toLowerCase()); +}; +function addTagNotesToGraph(plugin, eligableAlts, frontms, mainG) { + const { settings } = plugin; + const { userHiers, tagNoteField } = settings; + const fields = getFields(userHiers); + eligableAlts.forEach((altFile) => { + var _a; + const tagNoteFile = altFile.file; + const tagNoteBasename = getDVBasename(tagNoteFile); + const tag = addHash(altFile[BC_TAG_NOTE].trim().toLowerCase()); + (0, import_loglevel8.info)({ tag }); + const hasThisTag = (file) => { + const allTags = getAllTags(file); + return altFile[BC_TAG_NOTE_EXACT] !== void 0 ? allTags.includes(tag) : allTags.some((t) => t.includes(tag)); + }; + const targets = frontms.map((ff) => ff.file).filter((file) => file.path !== tagNoteFile.path && hasThisTag(file) && !file[BC_IGNORE]).map(getDVBasename); + (0, import_loglevel8.info)({ targets }); + let field = (_a = altFile[BC_TAG_NOTE_FIELD]) != null ? _a : tagNoteField || fields[0]; + targets.forEach((target) => { + const sourceOrder = getSourceOrder(altFile); + const targetOrder = getTargetOrder(frontms, tagNoteBasename); + populateMain(settings, mainG, tagNoteBasename, field, target, sourceOrder, targetOrder, true); + }); + }); +} + +// src/AlternativeHierarchies/TraverseNotes.ts +var import_loglevel9 = __toESM(require_loglevel()); +function addTraverseNotesToGraph(plugin, traverseNotes, mainG, obsG) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + traverseNotes.forEach((altFile) => { + const { file } = altFile; + const basename = getDVBasename(file); + const noCycles = removeCycles(obsG, basename); + let field = altFile[BC_TRAVERSE_NOTE]; + if (typeof field !== "string" || !fields.includes(field)) + return; + const allPaths = dfsAllPaths(noCycles, basename); + (0, import_loglevel9.info)(allPaths); + const reversed = [...allPaths].map((path2) => path2.reverse()); + reversed.forEach((path2) => { + path2.forEach((node, i) => { + const next = path2[i + 1]; + if (next === void 0) + return; + populateMain(settings, mainG, node, field, next, 9999, 9999, true); + }); + }); + }); +} + +// src/Views/TrailView.ts +var import_loglevel12 = __toESM(require_loglevel()); +var import_obsidian8 = require("obsidian"); + +// src/Components/NextPrev.svelte +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[8] = list[i].field; + child_ctx[9] = list[i].real; + child_ctx[10] = list[i].to; + return child_ctx; +} +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[8] = list[i].field; + child_ctx[9] = list[i].real; + child_ctx[10] = list[i].to; + return child_ctx; +} +function create_each_block_1(ctx) { + let div; + let strong; + let t0_value = ctx[8] + ""; + let t0; + let t1; + let t2_value = ctx[10] + ""; + let t2; + let t3; + let div_class_value; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[4](ctx[10], ...args); + } + function mouseover_handler(...args) { + return ctx[5](ctx[10], ...args); + } + return { + c() { + div = element("div"); + strong = element("strong"); + t0 = text(t0_value); + t1 = space(); + t2 = text(t2_value); + t3 = space(); + attr(div, "class", div_class_value = linkClass(ctx[10], ctx[9]) + " BC-prev svelte-11g23nm"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, strong); + append(strong, t0); + append(div, t1); + append(div, t2); + append(div, t3); + if (!mounted) { + dispose = [ + listen(div, "click", click_handler), + listen(div, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 2 && t0_value !== (t0_value = ctx[8] + "")) + set_data(t0, t0_value); + if (dirty & 2 && t2_value !== (t2_value = ctx[10] + "")) + set_data(t2, t2_value); + if (dirty & 2 && div_class_value !== (div_class_value = linkClass(ctx[10], ctx[9]) + " BC-prev svelte-11g23nm")) { + attr(div, "class", div_class_value); + } + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block(ctx) { + let div; + let t0_value = ctx[10] + ""; + let t0; + let t1; + let strong; + let t2_value = ctx[8] + ""; + let t2; + let t3; + let div_class_value; + let mounted; + let dispose; + function click_handler_1(...args) { + return ctx[6](ctx[10], ...args); + } + function mouseover_handler_1(...args) { + return ctx[7](ctx[10], ...args); + } + return { + c() { + div = element("div"); + t0 = text(t0_value); + t1 = space(); + strong = element("strong"); + t2 = text(t2_value); + t3 = space(); + attr(div, "class", div_class_value = linkClass(ctx[10], ctx[9]) + " BC-next svelte-11g23nm"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, t0); + append(div, t1); + append(div, strong); + append(strong, t2); + append(div, t3); + if (!mounted) { + dispose = [ + listen(div, "click", click_handler_1), + listen(div, "mouseover", mouseover_handler_1) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 1 && t0_value !== (t0_value = ctx[10] + "")) + set_data(t0, t0_value); + if (dirty & 1 && t2_value !== (t2_value = ctx[8] + "")) + set_data(t2, t2_value); + if (dirty & 1 && div_class_value !== (div_class_value = linkClass(ctx[10], ctx[9]) + " BC-next svelte-11g23nm")) { + attr(div, "class", div_class_value); + } + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment(ctx) { + let div2; + let div0; + let span0; + let t; + let div1; + let span1; + let each_value_1 = ctx[1]; + let each_blocks_1 = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks_1[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); + } + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); + } + return { + c() { + div2 = element("div"); + div0 = element("div"); + span0 = element("span"); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + t = space(); + div1 = element("div"); + span1 = element("span"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(div0, "class", "BC-prevs svelte-11g23nm"); + attr(div1, "class", "BC-nexts svelte-11g23nm"); + attr(div2, "class", "BC-NextPrev-Container svelte-11g23nm"); + }, + m(target, anchor) { + insert(target, div2, anchor); + append(div2, div0); + append(div0, span0); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(span0, null); + } + append(div2, t); + append(div2, div1); + append(div1, span1); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(span1, null); + } + }, + p(ctx2, [dirty]) { + if (dirty & 6) { + each_value_1 = ctx2[1]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1(ctx2, each_value_1, i); + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_1(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(span0, null); + } + } + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + each_blocks_1.length = each_value_1.length; + } + if (dirty & 5) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(span1, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div2); + destroy_each(each_blocks_1, detaching); + destroy_each(each_blocks, detaching); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let { plugin } = $$props; + let { next } = $$props; + let { prev } = $$props; + const activeLeafView = app.workspace.activeLeaf.view; + const click_handler = async (to, e) => await openOrSwitch(to, e); + const mouseover_handler = (to, e) => hoverPreview(e, activeLeafView, to); + const click_handler_1 = async (to, e) => await openOrSwitch(to, e); + const mouseover_handler_1 = (to, e) => hoverPreview(e, activeLeafView, to); + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(3, plugin = $$props2.plugin); + if ("next" in $$props2) + $$invalidate(0, next = $$props2.next); + if ("prev" in $$props2) + $$invalidate(1, prev = $$props2.prev); + }; + return [ + next, + prev, + activeLeafView, + plugin, + click_handler, + mouseover_handler, + click_handler_1, + mouseover_handler_1 + ]; +} +var NextPrev = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { plugin: 3, next: 0, prev: 1 }); + } +}; +var NextPrev_default = NextPrev; + +// src/Components/TrailGrid.svelte +function get_each_context2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + child_ctx[17] = i; + return child_ctx; +} +function get_each_context_12(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i].value; + child_ctx[19] = list[i].first; + child_ctx[20] = list[i].last; + return child_ctx; +} +function create_each_block_12(ctx) { + var _a; + let div1; + let div0; + let t0_value = ((_a = getAlt(ctx[18], ctx[0])) != null ? _a : dropDendron(ctx[18], ctx[5])) + ""; + let t0; + let div0_class_value; + let t1; + let div1_class_value; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[10](ctx[18], ...args); + } + function mouseover_handler(...args) { + return ctx[11](ctx[18], ...args); + } + return { + c() { + div1 = element("div"); + div0 = element("div"); + t0 = text(t0_value); + t1 = space(); + attr(div0, "class", div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-c6w3ih"); + attr(div1, "class", div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-c6w3ih"); + set_style(div1, "grid-area", ctx[19] + 1 + " / " + (ctx[17] + 1) + " / " + (ctx[20] + 2) + " / " + (ctx[17] + 2)); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, div0); + append(div0, t0); + append(div1, t1); + if (!mounted) { + dispose = [ + listen(div1, "click", click_handler), + listen(div1, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + var _a2; + ctx = new_ctx; + if (dirty & 17 && t0_value !== (t0_value = ((_a2 = getAlt(ctx[18], ctx[0])) != null ? _a2 : dropDendron(ctx[18], ctx[5])) + "")) + set_data(t0, t0_value); + if (dirty & 16 && div0_class_value !== (div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-c6w3ih")) { + attr(div0, "class", div0_class_value); + } + if (dirty & 16 && div1_class_value !== (div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-c6w3ih")) { + attr(div1, "class", div1_class_value); + } + if (dirty & 16) { + set_style(div1, "grid-area", ctx[19] + 1 + " / " + (ctx[17] + 1) + " / " + (ctx[20] + 2) + " / " + (ctx[17] + 2)); + } + }, + d(detaching) { + if (detaching) + detach(div1); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block2(ctx) { + let each_1_anchor; + let each_value_1 = ctx[4][ctx[17]]; + let each_blocks = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_12(get_each_context_12(ctx, each_value_1, i)); + } + return { + c() { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + each_1_anchor = empty(); + }, + m(target, anchor) { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(target, anchor); + } + insert(target, each_1_anchor, anchor); + }, + p(ctx2, dirty) { + if (dirty & 113) { + each_value_1 = ctx2[4][ctx2[17]]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_12(ctx2, each_value_1, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_12(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_1.length; + } + }, + d(detaching) { + destroy_each(each_blocks, detaching); + if (detaching) + detach(each_1_anchor); + } + }; +} +function create_fragment2(ctx) { + let div2; + let div0; + let t0; + let div1; + let span3; + let span0; + let t2; + let span2; + let button0; + let t3; + let button0_disabled_value; + let t4; + let span1; + let t5; + let t6; + let button1; + let t7; + let button1_disabled_value; + let mounted; + let dispose; + let each_value = ctx[3]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block2(get_each_context2(ctx, each_value, i)); + } + return { + c() { + div2 = element("div"); + div0 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t0 = space(); + div1 = element("div"); + span3 = element("span"); + span0 = element("span"); + span0.textContent = "\u2699\uFE0F"; + t2 = space(); + span2 = element("span"); + button0 = element("button"); + t3 = text("-"); + t4 = space(); + span1 = element("span"); + t5 = text(ctx[1]); + t6 = space(); + button1 = element("button"); + t7 = text("+"); + attr(div0, "class", "BC-trail-grid svelte-c6w3ih"); + set_style(div0, "grid-template-columns", "1fr ".repeat(ctx[3].length)); + set_style(div0, "grid-template-rows", "1fr ".repeat(ctx[2].length)); + attr(span0, "class", "BC-grid-options-icon svelte-c6w3ih"); + attr(button0, "class", "BC-depth-button svelte-c6w3ih"); + button0.disabled = button0_disabled_value = ctx[1] === 1; + attr(span1, "class", "tree-item-flair"); + attr(button1, "class", "BC-depth-button svelte-c6w3ih"); + button1.disabled = button1_disabled_value = ctx[1] === ctx[7]; + attr(span2, "class", "BC-grid-options-options svelte-c6w3ih"); + attr(div1, "class", "BC-grid-options svelte-c6w3ih"); + attr(div2, "class", "BC-grid-wrapper svelte-c6w3ih"); + }, + m(target, anchor) { + insert(target, div2, anchor); + append(div2, div0); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + append(div2, t0); + append(div2, div1); + append(div1, span3); + append(span3, span0); + append(span3, t2); + append(span3, span2); + append(span2, button0); + append(button0, t3); + append(span2, t4); + append(span2, span1); + append(span1, t5); + append(span2, t6); + append(span2, button1); + append(button1, t7); + if (!mounted) { + dispose = [ + listen(button0, "click", ctx[12]), + listen(button1, "click", ctx[13]) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 121) { + each_value = ctx2[3]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context2(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block2(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div0, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (dirty & 8) { + set_style(div0, "grid-template-columns", "1fr ".repeat(ctx2[3].length)); + } + if (dirty & 4) { + set_style(div0, "grid-template-rows", "1fr ".repeat(ctx2[2].length)); + } + if (dirty & 2 && button0_disabled_value !== (button0_disabled_value = ctx2[1] === 1)) { + button0.disabled = button0_disabled_value; + } + if (dirty & 2) + set_data(t5, ctx2[1]); + if (dirty & 2 && button1_disabled_value !== (button1_disabled_value = ctx2[1] === ctx2[7])) { + button1.disabled = button1_disabled_value; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div2); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +function instance2($$self, $$props, $$invalidate) { + let paddedTrails; + let transposedTrails; + let allRuns; + let { sortedTrails } = $$props; + let { plugin } = $$props; + const { settings } = plugin; + const { gridDefaultDepth } = settings; + const activeLeafView = app.workspace.activeLeaf.view; + const maxLength = sortedTrails.last().length; + let depth = Math.min(maxLength, gridDefaultDepth); + let slicedTrails = sortedTrails; + const click_handler = async (value, e) => await openOrSwitch(value, e); + const mouseover_handler = (value, e) => hoverPreview(e, activeLeafView, value); + const click_handler_1 = () => $$invalidate(1, depth -= 1); + const click_handler_2 = () => $$invalidate(1, depth += 1); + $$self.$$set = ($$props2) => { + if ("sortedTrails" in $$props2) + $$invalidate(8, sortedTrails = $$props2.sortedTrails); + if ("plugin" in $$props2) + $$invalidate(0, plugin = $$props2.plugin); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 262) { + $: { + $$invalidate(2, slicedTrails = []); + sortedTrails.forEach((trail) => { + const slice2 = trail.slice(maxLength - depth); + if (slice2.length) + slicedTrails.push(slice2); + }); + } + } + if ($$self.$$.dirty & 6) { + $: + $$invalidate(9, paddedTrails = slicedTrails.map((trail) => padArray(trail, depth))); + } + if ($$self.$$.dirty & 512) { + $: + $$invalidate(3, transposedTrails = transpose(paddedTrails)); + } + if ($$self.$$.dirty & 8) { + $: + $$invalidate(4, allRuns = transposedTrails.map(runs)); + } + }; + return [ + plugin, + depth, + slicedTrails, + transposedTrails, + allRuns, + settings, + activeLeafView, + maxLength, + sortedTrails, + paddedTrails, + click_handler, + mouseover_handler, + click_handler_1, + click_handler_2 + ]; +} +var TrailGrid = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance2, create_fragment2, safe_not_equal, { sortedTrails: 8, plugin: 0 }); + } +}; +var TrailGrid_default = TrailGrid; + +// src/Components/TrailPath.svelte +function get_each_context3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + return child_ctx; +} +function get_each_context_13(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[16] = list[i]; + child_ctx[18] = i; + return child_ctx; +} +function create_else_block(ctx) { + let each_1_anchor; + let each_value_1 = ctx[13]; + let each_blocks = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_13(get_each_context_13(ctx, each_value_1, i)); + } + return { + c() { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + each_1_anchor = empty(); + }, + m(target, anchor) { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(target, anchor); + } + insert(target, each_1_anchor, anchor); + }, + p(ctx2, dirty) { + if (dirty & 186) { + each_value_1 = ctx2[13]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_13(ctx2, each_value_1, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_13(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_1.length; + } + }, + d(detaching) { + destroy_each(each_blocks, detaching); + if (detaching) + detach(each_1_anchor); + } + }; +} +function create_if_block_1(ctx) { + let span; + return { + c() { + span = element("span"); + span.textContent = `${ctx[6]}`; + attr(span, "class", "BC-empty-trail"); + }, + m(target, anchor) { + insert(target, span, anchor); + }, + p: noop, + d(detaching) { + if (detaching) + detach(span); + } + }; +} +function create_if_block_2(ctx) { + let span; + return { + c() { + span = element("span"); + span.textContent = `${" " + ctx[7] + " "}`; + attr(span, "class", "BC-trail-sep"); + }, + m(target, anchor) { + insert(target, span, anchor); + }, + p: noop, + d(detaching) { + if (detaching) + detach(span); + } + }; +} +function create_each_block_13(ctx) { + var _a; + let span; + let t0_value = ((_a = getAlt(ctx[16], ctx[1])) != null ? _a : dropDendron(ctx[16], ctx[4])) + ""; + let t0; + let t1; + let if_block_anchor; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[8](ctx[16], ...args); + } + function mouseover_handler(...args) { + return ctx[9](ctx[16], ...args); + } + let if_block = ctx[18] < ctx[13].length - 1 && create_if_block_2(ctx); + return { + c() { + span = element("span"); + t0 = text(t0_value); + t1 = space(); + if (if_block) + if_block.c(); + if_block_anchor = empty(); + attr(span, "class", "internal-link BC-Link"); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, t0); + insert(target, t1, anchor); + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + if (!mounted) { + dispose = [ + listen(span, "click", click_handler), + listen(span, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + var _a2; + ctx = new_ctx; + if (dirty & 10 && t0_value !== (t0_value = ((_a2 = getAlt(ctx[16], ctx[1])) != null ? _a2 : dropDendron(ctx[16], ctx[4])) + "")) + set_data(t0, t0_value); + if (ctx[18] < ctx[13].length - 1) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block_2(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (detaching) + detach(span); + if (detaching) + detach(t1); + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block3(ctx) { + let div; + let t; + function select_block_type(ctx2, dirty) { + if (!ctx2[13].length) + return create_if_block_1; + return create_else_block; + } + let current_block_type = select_block_type(ctx, -1); + let if_block = current_block_type(ctx); + return { + c() { + div = element("div"); + if_block.c(); + t = space(); + }, + m(target, anchor) { + insert(target, div, anchor); + if_block.m(div, null); + append(div, t); + }, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(div, t); + } + } + }, + d(detaching) { + if (detaching) + detach(div); + if_block.d(); + } + }; +} +function create_if_block(ctx) { + let div; + let button; + let t; + let mounted; + let dispose; + return { + c() { + div = element("div"); + button = element("button"); + t = text(ctx[2]); + attr(button, "class", "button-div"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, button); + append(button, t); + if (!mounted) { + dispose = [ + listen(button, "click", ctx[10]), + listen(button, "contextmenu", ctx[11]) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty & 4) + set_data(t, ctx2[2]); + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment3(ctx) { + let span; + let div; + let t; + let each_value = ctx[3]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block3(get_each_context3(ctx, each_value, i)); + } + let if_block = ctx[0].length > 1 && create_if_block(ctx); + return { + c() { + span = element("span"); + div = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t = space(); + if (if_block) + if_block.c(); + attr(div, "class", "trails-div"); + attr(span, "class", "BC-trail-path-container svelte-3c1frp"); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, div); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + append(span, t); + if (if_block) + if_block.m(span, null); + }, + p(ctx2, [dirty]) { + if (dirty & 250) { + each_value = ctx2[3]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context3(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (ctx2[0].length > 1) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block(ctx2); + if_block.c(); + if_block.m(span, null); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(span); + destroy_each(each_blocks, detaching); + if (if_block) + if_block.d(); + } + }; +} +function instance3($$self, $$props, $$invalidate) { + let trailsToShow; + let { sortedTrails } = $$props; + let { plugin } = $$props; + const { settings } = plugin; + const { view } = app.workspace.activeLeaf; + let { showAll, noPathMessage, trailSeperator } = settings; + let trail_length = showAll; + const click_handler = async (crumb, e) => await openOrSwitch(crumb, e); + const mouseover_handler = (crumb, e) => hoverPreview(e, view, crumb); + const click_handler_1 = () => $$invalidate(2, trail_length = getTrailLength(trail_length)); + const contextmenu_handler = (e) => { + e.preventDefault(); + $$invalidate(2, trail_length = getTrailLength(trail_length, -1)); + }; + $$self.$$set = ($$props2) => { + if ("sortedTrails" in $$props2) + $$invalidate(0, sortedTrails = $$props2.sortedTrails); + if ("plugin" in $$props2) + $$invalidate(1, plugin = $$props2.plugin); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 5) { + $: + $$invalidate(3, trailsToShow = trail_length == "All" ? sortedTrails : trail_length == "Shortest" ? [sortedTrails[0]] : [sortedTrails.last()]); + } + }; + return [ + sortedTrails, + plugin, + trail_length, + trailsToShow, + settings, + view, + noPathMessage, + trailSeperator, + click_handler, + mouseover_handler, + click_handler_1, + contextmenu_handler + ]; +} +var TrailPath = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance3, create_fragment3, safe_not_equal, { sortedTrails: 0, plugin: 1 }); + } +}; +var TrailPath_default = TrailPath; + +// src/Visualisations/Juggl.ts +var import_loglevel11 = __toESM(require_loglevel()); +var import_obsidian7 = require("obsidian"); + +// src/Commands/CreateIndex.ts +var import_lodash = __toESM(require_lodash()); +var import_loglevel10 = __toESM(require_loglevel()); +function addAliasesToIndex(plugin, index2) { + var _a, _b, _c, _d; + const { aliasesInIndex } = plugin.settings; + const lines = index2.slice().split("\n"); + if (aliasesInIndex) { + for (let line of lines) { + const [indent, ...content] = line.split("- "); + const note = content.join("- "); + if (!note) + continue; + const currFile = app.metadataCache.getFirstLinkpathDest(note, ""); + if (currFile !== null) { + const cache = app.metadataCache.getFileCache(currFile); + const alias = (_b = (_a = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _a.alias) != null ? _b : []; + const aliases = (_d = (_c = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _c.aliases) != null ? _d : []; + const allAliases = [...[alias].flat(3), ...[aliases].flat(3)]; + if (allAliases.length) { + line += ` (${allAliases.join(", ")})`; + } + } + } + } + return lines.join("\n"); +} +function createIndex(allPaths, asWikilinks, indent = " ") { + let index2 = ""; + const copy3 = (0, import_lodash.cloneDeep)(allPaths); + const reversed = copy3.map((path2) => path2.reverse()); + reversed.forEach((path2) => path2.shift()); + const realIndent = indent === "\\t" ? " " : indent; + const visited = {}; + reversed.forEach((path2) => { + for (let depth = 0; depth < path2.length; depth++) { + const currNode = path2[depth]; + if (visited.hasOwnProperty(currNode) && visited[currNode].includes(depth)) + continue; + else { + index2 += `${realIndent.repeat(depth)}- ${asWikilinks ? makeWiki(currNode) : currNode} +`; + if (!visited.hasOwnProperty(currNode)) + visited[currNode] = []; + visited[currNode].push(depth); + } + } + }); + return index2; +} +async function copyLocalIndex(plugin) { + const { settings, closedG } = plugin; + const { wikilinkIndex, createIndexIndent } = settings; + const { basename } = getCurrFile(); + const onlyDowns = getSubInDirs(closedG, "down"); + const allPaths = dfsAllPaths(onlyDowns, basename); + const index2 = addAliasesToIndex(plugin, createIndex(allPaths, wikilinkIndex, createIndexIndent)); + (0, import_loglevel10.info)({ index: index2 }); + await copy(index2); +} +async function copyGlobalIndex(plugin) { + const { settings, closedG } = plugin; + const { wikilinkIndex, createIndexIndent } = settings; + const onlyDowns = getSubInDirs(closedG, "down"); + const onlyUps = getSubInDirs(closedG, "up"); + const sinks = getSinks(onlyUps); + let globalIndex = ""; + sinks.forEach((terminal) => { + globalIndex += terminal + "\n"; + const allPaths = dfsAllPaths(onlyDowns, terminal); + globalIndex += addAliasesToIndex(plugin, createIndex(allPaths, wikilinkIndex, createIndexIndent)) + "\n"; + }); + (0, import_loglevel10.info)({ globalIndex }); + await copy(globalIndex); +} +var indexToLinePairs = (index2, flat = false) => index2.split("\n").map((line) => { + const [indent, ...content] = line.split("- "); + return [flat ? "" : indent, content.join("- ")]; +}).filter((pair) => pair[1] !== ""); + +// src/Components/JugglButton.svelte +function create_fragment4(ctx) { + let button; + let t; + let mounted; + let dispose; + return { + c() { + button = element("button"); + t = text(ctx[3]); + attr(button, "type", "button"); + attr(button, "class", "juggl-button"); + attr(button, "aria-label", ctx[2]); + button.disabled = ctx[1]; + }, + m(target, anchor) { + insert(target, button, anchor); + append(button, t); + if (!mounted) { + dispose = listen(button, "click", function() { + if (is_function(ctx[0])) + ctx[0].apply(this, arguments); + }); + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + if (dirty & 8) + set_data(t, ctx[3]); + if (dirty & 4) { + attr(button, "aria-label", ctx[2]); + } + if (dirty & 2) { + button.disabled = ctx[1]; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(button); + mounted = false; + dispose(); + } + }; +} +function instance4($$self, $$props, $$invalidate) { + let renderedIcon; + let { icon } = $$props; + let { onClick } = $$props; + let { disabled = false } = $$props; + let { title = "" } = $$props; + $$self.$$set = ($$props2) => { + if ("icon" in $$props2) + $$invalidate(4, icon = $$props2.icon); + if ("onClick" in $$props2) + $$invalidate(0, onClick = $$props2.onClick); + if ("disabled" in $$props2) + $$invalidate(1, disabled = $$props2.disabled); + if ("title" in $$props2) + $$invalidate(2, title = $$props2.title); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 16) { + $: + $$invalidate(3, renderedIcon = icon); + } + }; + return [onClick, disabled, title, renderedIcon, icon]; +} +var JugglButton = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance4, create_fragment4, safe_not_equal, { + icon: 4, + onClick: 0, + disabled: 1, + title: 2 + }); + } +}; +var JugglButton_default = JugglButton; + +// src/Components/JugglDepth.svelte +function create_if_block2(ctx) { + let div; + let jugglbutton0; + let t0; + let jugglbutton1; + let t1; + let jugglbutton2; + let current; + jugglbutton0 = new JugglButton_default({ + props: { + icon: "-", + disabled: ctx[3] <= 0, + onClick: ctx[4] + } + }); + jugglbutton1 = new JugglButton_default({ + props: { + icon: ctx[3], + disabled: true, + onClick: null + } + }); + jugglbutton2 = new JugglButton_default({ + props: { + icon: "+", + disabled: ctx[3] >= ctx[1], + onClick: ctx[5] + } + }); + return { + c() { + div = element("div"); + create_component(jugglbutton0.$$.fragment); + t0 = space(); + create_component(jugglbutton1.$$.fragment); + t1 = space(); + create_component(jugglbutton2.$$.fragment); + attr(div, "class", "cy-toolbar-section"); + }, + m(target, anchor) { + insert(target, div, anchor); + mount_component(jugglbutton0, div, null); + append(div, t0); + mount_component(jugglbutton1, div, null); + append(div, t1); + mount_component(jugglbutton2, div, null); + current = true; + }, + p(ctx2, dirty) { + const jugglbutton0_changes = {}; + if (dirty & 8) + jugglbutton0_changes.disabled = ctx2[3] <= 0; + if (dirty & 12) + jugglbutton0_changes.onClick = ctx2[4]; + jugglbutton0.$set(jugglbutton0_changes); + const jugglbutton1_changes = {}; + if (dirty & 8) + jugglbutton1_changes.icon = ctx2[3]; + jugglbutton1.$set(jugglbutton1_changes); + const jugglbutton2_changes = {}; + if (dirty & 10) + jugglbutton2_changes.disabled = ctx2[3] >= ctx2[1]; + if (dirty & 12) + jugglbutton2_changes.onClick = ctx2[5]; + jugglbutton2.$set(jugglbutton2_changes); + }, + i(local) { + if (current) + return; + transition_in(jugglbutton0.$$.fragment, local); + transition_in(jugglbutton1.$$.fragment, local); + transition_in(jugglbutton2.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(jugglbutton0.$$.fragment, local); + transition_out(jugglbutton1.$$.fragment, local); + transition_out(jugglbutton2.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + destroy_component(jugglbutton0); + destroy_component(jugglbutton1); + destroy_component(jugglbutton2); + } + }; +} +function create_fragment5(ctx) { + let if_block_anchor; + let current; + let if_block = ctx[0] && create_if_block2(ctx); + return { + c() { + if (if_block) + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx2, [dirty]) { + if (ctx2[0]) { + if (if_block) { + if_block.p(ctx2, dirty); + if (dirty & 1) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block2(ctx2); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + check_outros(); + } + }, + i(local) { + if (current) + return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function instance5($$self, $$props, $$invalidate) { + let { visible = true } = $$props; + let { maxDepth } = $$props; + let { onUpdateDepth } = $$props; + let depth = maxDepth; + const func = () => { + $$invalidate(3, depth -= 1); + onUpdateDepth(depth); + }; + const func_12 = () => { + $$invalidate(3, depth += 1); + onUpdateDepth(depth); + }; + $$self.$$set = ($$props2) => { + if ("visible" in $$props2) + $$invalidate(0, visible = $$props2.visible); + if ("maxDepth" in $$props2) + $$invalidate(1, maxDepth = $$props2.maxDepth); + if ("onUpdateDepth" in $$props2) + $$invalidate(2, onUpdateDepth = $$props2.onUpdateDepth); + }; + return [visible, maxDepth, onUpdateDepth, depth, func, func_12]; +} +var JugglDepth = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance5, create_fragment5, safe_not_equal, { + visible: 0, + maxDepth: 1, + onUpdateDepth: 2 + }); + } +}; +var JugglDepth_default = JugglDepth; + +// src/Visualisations/Juggl.ts +var STORE_ID = "core"; +var BCStoreEvents = class extends import_obsidian7.Events { +}; +var BCStore = class extends import_obsidian7.Component { + constructor(graph, metadata, depthMap) { + super(); + this.graph = graph; + this.cache = metadata; + this.depthMap = depthMap; + } + asString(node) { + const id2 = VizId.fromNode(node); + return id2.id.slice(0, -3); + } + getFile(nodeId) { + return this.cache.getFirstLinkpathDest(nodeId.id, ""); + } + async connectNodes(allNodes, newNodes, graph) { + const edges = []; + const nodesListS = new Set(allNodes.map((node) => this.asString(node)).filter((s) => s)); + newNodes.forEach((node) => { + const name = this.asString(node); + if (!this.graph.hasNode(name)) { + return; + } + this.graph.forEachOutEdge(this.asString(node), (key, attr2, source, target) => { + if (nodesListS.has(target)) { + edges.push({ + data: { + id: `BC:${source}->${target}`, + source: VizId.toId(source, STORE_ID) + ".md", + target: VizId.toId(target, STORE_ID) + ".md", + type: attr2.field, + dir: attr2.dir + }, + classes: `type-${attr2.field} dir-${attr2.dir} breadcrumbs$` + }); + } + }); + }); + return Promise.resolve(edges); + } + getEvents(view) { + return new BCStoreEvents(); + } + async getNeighbourhood(nodeIds, view) { + const new_nodes = []; + for (const nodeId of nodeIds) { + const name = nodeId.id.slice(0, -3); + if (!this.graph.hasNode(name)) { + continue; + } + for (const new_node of this.graph.neighbors(name)) { + new_nodes.push(await this.get(new VizId(new_node + ".md", STORE_ID), view)); + } + } + return new_nodes; + } + refreshNode(id2, view) { + return; + } + storeId() { + return STORE_ID; + } + get(nodeId, view) { + const file = this.getFile(nodeId); + let depth = 0; + if (this.depthMap && nodeId.id in this.depthMap) { + depth = this.depthMap[nodeId.id]; + } + if (file === null) { + const dangling = nodeDangling(nodeId.id); + dangling.data.depth = depth; + return Promise.resolve(dangling); + } + const cache = this.cache.getFileCache(file); + if (cache === null) { + (0, import_loglevel11.info)("returning empty cache", nodeId); + return Promise.resolve(nodeDangling(nodeId.id)); + } + return nodeFromFile(file, view.plugin, view.settings, nodeId.toId()).then((node) => { + node.data.depth = depth; + return node; + }); + } +}; +function createJuggl(plugin, target, initialNodes, args, depthMap = null) { + try { + const jugglPlugin = getPlugin(app); + if (!jugglPlugin) { + return; + } + for (let key in JUGGL_CB_DEFAULTS) { + if (key in args && args[key] === void 0) + args[key] = JUGGL_CB_DEFAULTS[key]; + } + const bcStore = new BCStore(plugin.mainG, app.metadataCache, depthMap); + const stores = { + coreStore: bcStore, + dataStores: [bcStore] + }; + const juggl = jugglPlugin.createJuggl(target, args, stores, initialNodes); + plugin.addChild(juggl); + (0, import_loglevel11.info)({ juggl }); + return juggl; + } catch (error6) { + (0, import_loglevel11.warn)({ error: error6 }); + return null; + } +} +function zoomToSource(juggl, source) { + if (!juggl) { + return; + } + juggl.on("vizReady", (viz) => { + viz.one("layoutstop", (e) => { + const viz2 = e.cy; + const node = viz2.$id(VizId.toId(source + ".md", STORE_ID)); + viz2.animate({ + center: { + eles: node + }, + duration: 250, + queue: false, + zoom: 1.7 + }); + }); + }); +} +function zoomToGraph(juggl) { + juggl.on("vizReady", (viz) => { + viz.fit(viz.nodes()); + }); +} +function createDepthMap(paths, source, offset = 0) { + let depthMap = {}; + depthMap[source + ".md"] = 0; + paths.forEach((path2) => { + for (let i = 0; i < path2.length; i++) { + const name = path2[i] + ".md"; + const depth = path2.length - i - 1 + offset; + if (name in depthMap) { + depthMap[name] = Math.min(depthMap[name], depth); + } else { + depthMap[name] = depth; + } + } + }); + return depthMap; +} +function updateDepth(juggl, depth) { + juggl.viz.$(`[depth>${depth}]`).addClass("filtered"); + juggl.viz.$(`[depth<=${depth}]`).removeClass("filtered"); +} +function createJugglTrail(plugin, target, paths, source, args) { + const toolbarDiv = document.createElement("div"); + toolbarDiv.addClass("cy-toolbar"); + target.appendChild(toolbarDiv); + const sectDiv = document.createElement("div"); + sectDiv.addClass("cy-toolbar-section"); + toolbarDiv.appendChild(sectDiv); + const amtChildren = target.children.length; + let jugglUp = null; + let jugglDown = null; + new JugglButton_default({ + target: sectDiv, + props: { + icon: "\u2191", + onClick: () => { + if (jugglUp) { + target.children[amtChildren].classList.remove("juggl-hide"); + depthUp.$set({ visible: true }); + } + if (jugglDown) { + target.children[amtChildren + 1].classList.add("juggl-hide"); + depthDown.$set({ visible: false }); + } + }, + disabled: false, + title: "Show up graph" + } + }); + new JugglButton_default({ + target: sectDiv, + props: { + icon: "\u2193", + onClick: () => { + if (jugglDown) { + target.children[amtChildren + 1].classList.remove("juggl-hide"); + depthUp.$set({ visible: false }); + if (jugglUp) { + target.children[amtChildren].classList.add("juggl-hide"); + depthDown.$set({ visible: true }); + } + return; + } + const sub = getSubInDirs(plugin.mainG, "down", "up"); + const closed = getReflexiveClosure(sub, plugin.settings.userHiers); + const subClosed = getSubInDirs(closed, "down"); + const { createIndexIndent } = plugin.settings; + const allPaths = dfsAllPaths(subClosed, source); + const index2 = createIndex(allPaths, false, createIndexIndent); + const lines = index2.split("\n").map((line) => { + const [indent, ...content] = line.split("- "); + return content.join("- "); + }).filter((pair) => pair); + let depthMapDown = createDepthMap(allPaths, source); + const maxDepthDown = Math.max(...Object.values(depthMapDown)); + depthDown = new JugglDepth_default({ + target: toolbarDiv, + props: { + maxDepth: maxDepthDown, + onUpdateDepth: (d) => { + updateDepth(jugglDown, d); + } + } + }); + let nodesS = new Set(lines); + nodesS.add(source); + const nodes2 = Array.from(nodesS).map((s) => s + ".md"); + const argsDown = Object.assign({}, args); + const layout2 = plugin.settings.jugglLayout; + if (layout2 === "hierarchy") { + argsDown.layout = { + name: "dagre", + animate: false, + ranker: (graph) => { + Object.keys(graph._nodes).forEach((id2) => { + const name = VizId.fromId(id2).id; + if (name in depthMapDown) { + graph._nodes[id2].rank = depthMapDown[name] + 1; + } else { + graph._nodes[id2].rank = 0; + } + }); + } + }; + } else { + argsDown.layout = layout2; + } + const isFdgd2 = layout2 === "cola" || layout2 === "d3-force"; + if (isFdgd2) { + argsDown.fdgdLayout = layout2; + argsDown.layout = "force-directed"; + } else { + argsDown.autoZoom = true; + argsDown.animateLayout = false; + } + jugglDown = createJuggl(plugin, target, nodes2, argsDown, depthMapDown); + if (isFdgd2) { + zoomToSource(jugglDown, source); + } else { + zoomToGraph(jugglDown); + } + if (jugglUp) { + target.children[amtChildren].addClass("juggl-hide"); + depthUp.$set({ visible: false }); + } + }, + disabled: false, + title: "Show down graph" + } + }); + const depthMapUp = createDepthMap(paths, source, 1); + const maxDepthUp = Math.max(...Object.values(depthMapUp)); + let depthDown; + const depthUp = new JugglDepth_default({ + target: toolbarDiv, + props: { + maxDepth: maxDepthUp, + onUpdateDepth: (d) => { + updateDepth(jugglUp, d); + } + } + }); + let nodes = Array.from(new Set(paths.reduce((prev, curr) => prev.concat(curr), []))); + nodes.push(source); + nodes = nodes.map((s) => s + ".md"); + const argsUp = Object.assign({}, args); + const layout = plugin.settings.jugglLayout; + if (layout === "hierarchy") { + argsUp.layout = { + name: "dagre", + animate: false, + ranker: (graph) => { + Object.keys(graph._nodes).forEach((id2) => { + const name = VizId.fromId(id2).id; + if (name in depthMapUp) { + graph._nodes[id2].rank = maxDepthUp - depthMapUp[name] + 1; + } else { + graph._nodes[id2].rank = maxDepthUp + 2; + } + }); + } + }; + } else { + argsUp.layout = layout; + } + const isFdgd = layout === "cola" || layout === "d3-force"; + if (isFdgd) { + argsUp.fdgdLayout = layout; + argsUp.layout = "force-directed"; + } else { + argsUp.autoZoom = true; + argsUp.animateLayout = false; + } + jugglUp = createJuggl(plugin, target, nodes, argsUp, depthMapUp); + if (isFdgd) { + zoomToSource(jugglUp, source); + } else { + zoomToGraph(jugglUp); + } +} + +// src/Views/TrailView.ts +function getLimitedTrailSub(plugin) { + const { settings, mainG, closedG } = plugin; + const { limitTrailCheckboxes, userHiers } = settings; + if (getFields(userHiers).every((field) => limitTrailCheckboxes.includes(field))) { + return getSubInDirs(closedG, "up"); + } else { + const oppFields = limitTrailCheckboxes.map((field) => { + var _a; + return (_a = getOppFields(userHiers, field, "up")) == null ? void 0 : _a[0]; + }).filter((field) => field !== void 0); + const subGraph = getSubForFields(mainG, [ + ...limitTrailCheckboxes, + ...oppFields + ]); + const closed = getReflexiveClosure(subGraph, userHiers); + return getSubInDirs(closed, "up"); + } +} +function getBreadcrumbs(settings, g, currFile) { + const { basename, extension } = currFile; + if (extension !== "md") + return null; + const allTrails = bfsAllPaths(g, basename); + let filteredTrails = [...allTrails]; + const { indexNotes, showAllPathsIfNoneToIndexNote } = settings; + if (indexNotes[0] && filteredTrails.length) { + filteredTrails = filteredTrails.filter((trail) => indexNotes.includes(trail[0])); + if (filteredTrails.length === 0 && showAllPathsIfNoneToIndexNote) + filteredTrails = [...allTrails]; + } + const sortedTrails = filteredTrails.filter((trail) => trail.length > 0).sort((a2, b) => a2.length - b.length); + return sortedTrails; +} +function getNextNPrev(plugin, currNode) { + const { mainG } = plugin; + const { userHiers } = plugin.settings; + if (!mainG) + return null; + const nextNPrev = blankRealNImplied(); + mainG.forEachEdge(currNode, (k, a2, s, t) => { + const { dir, field, implied } = a2; + if (dir !== "next" && dir !== "prev") + return; + if (s === currNode) { + nextNPrev[dir].reals.push({ field, to: t, implied }); + } else { + const oppField = getOppFields(userHiers, field, dir)[0]; + nextNPrev[getOppDir(dir)].implieds.push({ + field: oppField, + to: s, + implied + }); + } + }); + return nextNPrev; +} +function getTrailLength(curr, offset = 1) { + const index2 = (TRAIL_LENGTHS.indexOf(curr) + offset) % TRAIL_LENGTHS.length; + return TRAIL_LENGTHS[index2 < 0 ? TRAIL_LENGTHS.length + index2 : index2]; +} +async function drawTrail(plugin) { + var _a, _b, _c, _d; + try { + const { settings, db, mainG } = plugin; + const { + showBCs, + noPathMessage, + respectReadableLineLength, + showTrail, + showGrid, + showJuggl, + showPrevNext, + showBCsInEditLPMode + } = settings; + db.start2G("drawTrail"); + const activeMDView = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView); + const mode = activeMDView == null ? void 0 : activeMDView.getMode(); + if (!showBCs || !activeMDView || mode !== "preview" && !showBCsInEditLPMode) { + (_a = activeMDView == null ? void 0 : activeMDView.containerEl.querySelector(".BC-trail")) == null ? void 0 : _a.remove(); + return db.end2G(); + } + const { file } = activeMDView; + const { frontmatter } = (_b = app.metadataCache.getFileCache(file)) != null ? _b : {}; + if ((frontmatter == null ? void 0 : frontmatter[BC_HIDE_TRAIL]) || (frontmatter == null ? void 0 : frontmatter["kanban-plugin"])) + return db.end2G(); + const { basename } = file; + if (!mainG.hasNode(basename)) + return db.end2G(); + const view = mode === "preview" ? activeMDView.previewMode.containerEl.querySelector("div.markdown-preview-view") : activeMDView.contentEl.querySelector("div.markdown-source-view"); + (_c = activeMDView.containerEl.querySelectorAll(".BC-trail")) == null ? void 0 : _c.forEach((trail) => trail.remove()); + const closedUp = getLimitedTrailSub(plugin); + const sortedTrails = getBreadcrumbs(settings, closedUp, file); + (0, import_loglevel12.info)({ sortedTrails }); + const { + next: { reals: rNext, implieds: iNext }, + prev: { reals: rPrev, implieds: iPrev } + } = getNextNPrev(plugin, basename); + const next = [...rNext]; + iNext.forEach((i) => { + if (next.findIndex((n) => n.to === i.to) === -1) + next.push(i); + }); + const prev = [...rPrev]; + iPrev.forEach((i) => { + if (prev.findIndex((n) => n.to === i.to) === -1) + prev.push(i); + }); + const noItems = !sortedTrails.length && !next.length && !prev.length; + if (noItems && noPathMessage === "") + return db.end2G(); + const selectorForMaxWidth = mode === "preview" ? ".markdown-preview-view.is-readable-line-width .markdown-preview-sizer" : ""; + const elForMaxWidth = selectorForMaxWidth !== "" ? document.querySelector(selectorForMaxWidth) : null; + const max_width = elForMaxWidth ? getComputedStyle(elForMaxWidth).getPropertyValue("max-width") : "100%"; + const trailDiv = createDiv({ + cls: `BC-trail ${respectReadableLineLength ? "is-readable-line-width markdown-preview-sizer markdown-preview-section" : ""}`, + attr: { + style: (mode !== "preview" ? `max-width: ${max_width};` : "") + "margin: 0 auto; width: 100%;" + } + }); + plugin.visited.push([file.path, trailDiv]); + if (mode === "preview") { + view.querySelector("div.markdown-preview-sizer").before(trailDiv); + } else { + const cmGutter = view.querySelector("div.cm-gutters"); + if (cmGutter) { + requestAnimationFrame(() => { + const gutterHeight = trailDiv.getBoundingClientRect().height; + cmGutter.style.paddingTop = `${gutterHeight + 4}px`; + }); + } + (_d = view.querySelector("div.cm-contentContainer")) == null ? void 0 : _d.before(trailDiv); + } + trailDiv.empty(); + if (settings.indexNotes.includes(basename)) { + trailDiv.innerText = "Index Note"; + return db.end2G(); + } + if (noItems) { + trailDiv.innerText = noPathMessage; + return db.end2G(); + } + const targetProps = { + target: trailDiv, + props: { sortedTrails, plugin } + }; + if (showTrail && sortedTrails.length) + new TrailPath_default(targetProps); + if (showGrid && sortedTrails.length) + new TrailGrid_default(targetProps); + if (showPrevNext && (next.length || prev.length)) { + new NextPrev_default({ + target: trailDiv, + props: { plugin, next, prev } + }); + } + if (showJuggl && sortedTrails.length) { + createJugglTrail(plugin, trailDiv, sortedTrails, basename, JUGGL_TRAIL_DEFAULTS); + } + db.end2G(); + } catch (err) { + (0, import_loglevel12.error)(err); + plugin.db.end2G(); + } +} + +// src/refreshIndex.ts +function getDVMetadataCache(plugin, files) { + const { db } = plugin; + const api = getDVApi(plugin); + db.start1G("getDVMetadataCache"); + const frontms = files.map((file) => api.page(file.path)); + db.end1G({ frontms }); + return frontms; +} +function getObsMetadataCache(plugin, files) { + const { db } = plugin; + db.start1G("getObsMetadataCache"); + const frontms = files.map((file) => { + const { frontmatter } = app.metadataCache.getFileCache(file); + return frontmatter ? { file, ...frontmatter } : { file }; + }); + db.end1G({ frontms }); + return frontms; +} +var isDVProxy = (item) => typeof item.defaultComparator === "function"; +function unproxy(item) { + const unproxied = []; + const queue = [item]; + while (queue.length) { + const currItem = queue.shift(); + if (isDVProxy(currItem)) + queue.push(...currItem.values); + else + unproxied.push(currItem); + } + return unproxied; +} +function parseFieldValue(value) { + if (!value) + return []; + const parsed = []; + try { + if (typeof value === "string") { + const splits = value.match(splitLinksRegex); + if (splits !== null) { + const linkNames = splits.map((link2) => getBaseFromMDPath(link2.match(dropHeaderOrAlias)[1])); + parsed.push(...linkNames); + } + } else { + const rawValues = [value].flat(4); + (0, import_loglevel13.debug)(...rawValues); + rawValues.forEach((rawItem) => { + if (!rawItem) + return; + const unProxied = unproxy(rawItem); + unProxied.forEach((value2) => { + if (typeof value2 === "string" || typeof value2 === "number") { + const rawAsString = value2.toString(); + const splits = rawAsString.match(splitLinksRegex); + if (splits !== null) { + const strs = splits.map((link2) => getBaseFromMDPath(link2.match(dropHeaderOrAlias)[1])); + parsed.push(...strs); + } else { + const basename = getBaseFromMDPath(rawAsString); + parsed.push(basename.split("#")[0].split("|")[0]); + } + } else if (value2.path !== void 0) { + const basename = getBaseFromMDPath(value2.path); + if (basename !== void 0) + parsed.push(basename); + } + }); + }); + } + return parsed; + } catch (err) { + (0, import_loglevel13.error)(err); + return parsed; + } +} +async function buildMainG(plugin) { + const mainG = new import_graphology2.MultiGraph(); + try { + const { settings, db } = plugin; + const { userHiers, CSVPaths, parseJugglLinksWithoutJuggl, hierarchyNotes } = settings; + db.start2G("initGraphs"); + if (userHiers.length === 0) { + db.end2G(); + new import_obsidian9.Notice("You do not have any Breadcrumbs hierarchies set up."); + return mainG; + } + const files = app.vault.getMarkdownFiles(); + const dvQ = app.plugins.enabledPlugins.has("dataview"); + let frontms = dvQ ? getDVMetadataCache(plugin, files) : getObsMetadataCache(plugin, files); + if (frontms.some((frontm) => frontm === void 0)) { + await wait(2e3); + frontms = dvQ ? getDVMetadataCache(plugin, files) : getObsMetadataCache(plugin, files); + } + const CSVRows = CSVPaths !== "" ? await getCSVRows(plugin) : []; + const eligableAlts = {}; + BC_ALTS.forEach((alt) => eligableAlts[alt] = []); + db.start2G("addFrontmatterToGraph"); + frontms.forEach((page) => { + BC_ALTS.forEach((alt) => { + if (page[alt] !== void 0 && page[alt] !== null) + eligableAlts[alt].push(page); + }); + const basename = getDVBasename(page.file); + const sourceOrder = getSourceOrder(page); + iterateHiers(userHiers, (hier, dir, field) => { + const values = parseFieldValue(page[field]); + values.forEach((target) => { + if (target.startsWith("<%") || target.startsWith("{{")) + return; + const targetOrder = getTargetOrder(frontms, target); + populateMain(settings, mainG, basename, field, target, sourceOrder, targetOrder); + }); + if (CSVRows.length) + addCSVCrumbs(mainG, CSVRows, dir, field); + }); + }); + db.end2G(); + const jugglLinks = app.plugins.plugins.juggl || parseJugglLinksWithoutJuggl ? await getJugglLinks(plugin, files) : []; + if (jugglLinks.length) + addJugglLinksToGraph(settings, jugglLinks, frontms, mainG); + db.start2G("Alternative Hierarchies"); + db.start2G("Hierarchy Notes"); + if (hierarchyNotes.length) { + for (const noteOrFolder of hierarchyNotes) { + if (noteOrFolder.endsWith("/")) { + const folder = app.vault.getAbstractFileByPath((0, import_obsidian9.normalizePath)(noteOrFolder)); + if (!(folder instanceof import_obsidian9.TFolder)) + continue; + for (const child of folder.children) { + if (child instanceof import_obsidian9.TFile) { + addHNsToGraph(settings, await getHierarchyNoteItems(child), mainG); + } + } + } else { + const file = app.metadataCache.getFirstLinkpathDest(noteOrFolder, ""); + if (file) + addHNsToGraph(settings, await getHierarchyNoteItems(file), mainG); + } + } + } + db.end2G(); + db.start2G("Folder Notes"); + addFolderNotesToGraph(plugin, eligableAlts[BC_FOLDER_NOTE], frontms, mainG); + db.end2G(); + db.start2G("Tag Notes"); + addTagNotesToGraph(plugin, eligableAlts[BC_TAG_NOTE], frontms, mainG); + db.end2G(); + db.start2G("Link Notes"); + addLinkNotesToGraph(plugin, eligableAlts[BC_LINK_NOTE], frontms, mainG); + db.end2G(); + db.start2G("Regex Notes"); + addRegexNotesToGraph(plugin, eligableAlts[BC_REGEX_NOTE], frontms, mainG); + db.end2G(); + db.start2G("Traverse Notes"); + addTraverseNotesToGraph(plugin, eligableAlts[BC_TRAVERSE_NOTE], mainG, buildObsGraph()); + db.end2G(); + db.start2G("Dendron Notes"); + addDendronNotesToGraph(plugin, frontms, mainG); + db.end2G(); + db.start2G("Dataview Notes"); + addDataviewNotesToGraph(plugin, eligableAlts[BC_DV_NOTE], frontms, mainG); + db.end2G(); + db.start2G("Date Notes"); + addDateNotesToGraph(plugin, frontms, mainG); + db.end2G(); + db.end2G(); + files.forEach((file) => addNodesIfNot(mainG, [file.basename])); + db.end2G("graphs inited", { mainG }); + return mainG; + } catch (err) { + (0, import_loglevel13.error)(err); + plugin.db.end2G(); + return mainG; + } +} +function buildClosedG(plugin) { + const { mainG, settings } = plugin; + const { + userHiers, + impliedRelations: { + sameParentIsSibling, + parentsSiblingsIsParents, + cousinsIsSibling, + siblingsSiblingIsSibling, + siblingsParentIsParent + } + } = settings; + let closedG = getReflexiveClosure(mainG, userHiers); + if (sameParentIsSibling) + addSiblingsFromSameParent(closedG, settings); + if (siblingsParentIsParent) + addSiblingsParentIsParent(closedG); + if (parentsSiblingsIsParents) + addAuntsUncles(closedG); + if (cousinsIsSibling) + addCousins(closedG); + if (siblingsSiblingIsSibling) + addStructuralEquivalenceSiblings(closedG); + return closedG; +} +async function refreshIndex(plugin) { + var _a; + if (!plugin.activeLeafChange) + plugin.registerActiveLeafChangeEvent(); + if (!plugin.layoutChange) + plugin.registerLayoutChangeEvent(); + plugin.mainG = await buildMainG(plugin); + plugin.closedG = buildClosedG(plugin); + for (const { type: type2 } of plugin.VIEWS) + await ((_a = plugin.getActiveTYPEView(type2)) == null ? void 0 : _a.draw()); + if (plugin.settings.showBCs) + await drawTrail(plugin); + if (plugin.settings.showRefreshNotice) + new import_obsidian9.Notice("BC Index refreshed"); +} + +// src/Components/MatrixButtons.svelte +function create_if_block3(ctx) { + let button; + let mounted; + let dispose; + return { + c() { + button = element("button"); + button.textContent = `${ctx[2] ? "\u2197" : "\u2198"}`; + attr(button, "class", "BC-sort-button svelte-barhym"); + attr(button, "aria-label", "Alphabetical Sorting Order"); + }, + m(target, anchor) { + insert(target, button, anchor); + if (!mounted) { + dispose = listen(button, "click", ctx[5]); + mounted = true; + } + }, + p: noop, + d(detaching) { + if (detaching) + detach(button); + mounted = false; + dispose(); + } + }; +} +function create_fragment6(ctx) { + let button; + let t1; + let if_block_anchor; + let mounted; + let dispose; + let if_block = ctx[3] && create_if_block3(ctx); + return { + c() { + button = element("button"); + button.textContent = "\u21BB"; + t1 = space(); + if (if_block) + if_block.c(); + if_block_anchor = empty(); + attr(button, "class", "BC-refresh-button svelte-barhym"); + attr(button, "aria-label", "Refresh Index"); + }, + m(target, anchor) { + insert(target, button, anchor); + insert(target, t1, anchor); + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + if (!mounted) { + dispose = listen(button, "click", ctx[4]); + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (ctx2[3]) + if_block.p(ctx2, dirty); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(button); + if (detaching) + detach(t1); + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + mounted = false; + dispose(); + } + }; +} +function instance6($$self, $$props, $$invalidate) { + let { matrixView } = $$props; + const { plugin } = matrixView; + const { alphaSortAsc, enableAlphaSort } = plugin.settings; + const click_handler = async () => await refreshIndex(plugin); + const click_handler_1 = async () => { + $$invalidate(1, plugin.settings.alphaSortAsc = !alphaSortAsc, plugin); + await plugin.saveSettings(); + await matrixView.draw(); + }; + $$self.$$set = ($$props2) => { + if ("matrixView" in $$props2) + $$invalidate(0, matrixView = $$props2.matrixView); + }; + return [ + matrixView, + plugin, + alphaSortAsc, + enableAlphaSort, + click_handler, + click_handler_1 + ]; +} +var MatrixButtons = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance6, create_fragment6, safe_not_equal, { matrixView: 0 }); + } +}; +var MatrixButtons_default = MatrixButtons; + +// src/Components/Matrix.svelte +function get_each_context4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + return child_ctx; +} +function get_each_context_14(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[16] = list[i].field; + child_ctx[17] = list[i].impliedItems; + child_ctx[18] = list[i].realItems; + return child_ctx; +} +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[21] = list[i].alt; + child_ctx[22] = list[i].cls; + child_ctx[23] = list[i].implied; + child_ctx[24] = list[i].to; + child_ctx[25] = list[i].parent; + return child_ctx; +} +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[21] = list[i].alt; + child_ctx[22] = list[i].cls; + child_ctx[23] = list[i].implied; + child_ctx[24] = list[i].to; + return child_ctx; +} +function create_if_block4(ctx) { + let div1; + let div0; + let h4; + let t0_value = ctx[16] + ""; + let t0; + let t1; + let t2; + let t3; + let if_block0 = ctx[7] && create_if_block_5(ctx); + let if_block1 = ctx[18].length && create_if_block_4(ctx); + let if_block2 = ctx[4] && ctx[17].length && create_if_block_12(ctx); + return { + c() { + div1 = element("div"); + div0 = element("div"); + h4 = element("h4"); + t0 = text(t0_value); + t1 = space(); + if (if_block0) + if_block0.c(); + t2 = space(); + if (if_block1) + if_block1.c(); + t3 = space(); + if (if_block2) + if_block2.c(); + attr(h4, "class", "BC-Matrix-header svelte-1p44ezg"); + attr(div0, "class", "BC-Matrix-headers svelte-1p44ezg"); + attr(div1, "class", "BC-Matrix-square svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, div0); + append(div0, h4); + append(h4, t0); + append(div0, t1); + if (if_block0) + if_block0.m(div0, null); + append(div1, t2); + if (if_block1) + if_block1.m(div1, null); + append(div1, t3); + if (if_block2) + if_block2.m(div1, null); + }, + p(ctx2, dirty) { + if (dirty & 1 && t0_value !== (t0_value = ctx2[16] + "")) + set_data(t0, t0_value); + if (ctx2[7]) + if_block0.p(ctx2, dirty); + if (ctx2[18].length) { + if (if_block1) { + if_block1.p(ctx2, dirty); + } else { + if_block1 = create_if_block_4(ctx2); + if_block1.c(); + if_block1.m(div1, t3); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + if (ctx2[4] && ctx2[17].length) { + if (if_block2) { + if_block2.p(ctx2, dirty); + } else { + if_block2 = create_if_block_12(ctx2); + if_block2.c(); + if_block2.m(div1, null); + } + } else if (if_block2) { + if_block2.d(1); + if_block2 = null; + } + }, + d(detaching) { + if (detaching) + detach(div1); + if (if_block0) + if_block0.d(); + if (if_block1) + if_block1.d(); + if (if_block2) + if_block2.d(); + } + }; +} +function create_if_block_5(ctx) { + let h6; + let t_value = ctx[18].length ? "Real" : "Implied"; + let t; + return { + c() { + h6 = element("h6"); + t = text(t_value); + attr(h6, "class", "BC-Matrix-header svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, h6, anchor); + append(h6, t); + }, + p(ctx2, dirty) { + if (dirty & 1 && t_value !== (t_value = ctx2[18].length ? "Real" : "Implied")) + set_data(t, t_value); + }, + d(detaching) { + if (detaching) + detach(h6); + } + }; +} +function create_if_block_4(ctx) { + let ol; + let each_value_3 = ctx[18]; + let each_blocks = []; + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); + } + return { + c() { + ol = element("ol"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(ol, "class", "svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, ol, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(ol, null); + } + }, + p(ctx2, dirty) { + if (dirty & 45) { + each_value_3 = ctx2[18]; + let i; + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3(ctx2, each_value_3, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ol, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_3.length; + } + }, + d(detaching) { + if (detaching) + detach(ol); + destroy_each(each_blocks, detaching); + } + }; +} +function create_each_block_3(ctx) { + var _a; + let li; + let div; + let t0_value = ((_a = ctx[21]) != null ? _a : dropPathNDendron(ctx[24], ctx[3])) + ""; + let t0; + let div_class_value; + let div_aria_label_value; + let div_aria_label_position_value; + let t1; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[8](ctx[24], ...args); + } + function mouseover_handler(...args) { + return ctx[9](ctx[24], ...args); + } + return { + c() { + var _a2; + li = element("li"); + div = element("div"); + t0 = text(t0_value); + t1 = space(); + attr(div, "class", div_class_value = ctx[22] + " " + ((_a2 = ctx[23]) != null ? _a2 : "") + " svelte-1p44ezg"); + attr(div, "aria-label", div_aria_label_value = ctx[21] ? ctx[24] : ""); + attr(div, "aria-label-position", div_aria_label_position_value = ctx[5] ? "left" : "right"); + attr(li, "class", "svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, li, anchor); + append(li, div); + append(div, t0); + append(li, t1); + if (!mounted) { + dispose = [ + listen(div, "click", click_handler), + listen(div, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + var _a2, _b; + ctx = new_ctx; + if (dirty & 1 && t0_value !== (t0_value = ((_a2 = ctx[21]) != null ? _a2 : dropPathNDendron(ctx[24], ctx[3])) + "")) + set_data(t0, t0_value); + if (dirty & 1 && div_class_value !== (div_class_value = ctx[22] + " " + ((_b = ctx[23]) != null ? _b : "") + " svelte-1p44ezg")) { + attr(div, "class", div_class_value); + } + if (dirty & 1 && div_aria_label_value !== (div_aria_label_value = ctx[21] ? ctx[24] : "")) { + attr(div, "aria-label", div_aria_label_value); + } + }, + d(detaching) { + if (detaching) + detach(li); + mounted = false; + run_all(dispose); + } + }; +} +function create_if_block_12(ctx) { + let div; + let h4; + let t1; + let t2; + let ol; + let ol_start_value; + let if_block = ctx[17].length && create_if_block_22(ctx); + let each_value_2 = ctx[17]; + let each_blocks = []; + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); + } + return { + c() { + div = element("div"); + h4 = element("h4"); + h4.textContent = `${" "}`; + t1 = space(); + if (if_block) + if_block.c(); + t2 = space(); + ol = element("ol"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(h4, "class", "BC-Matrix-header svelte-1p44ezg"); + attr(div, "class", "BC-Matrix-headers svelte-1p44ezg"); + attr(ol, "start", ol_start_value = ctx[18].length + 1); + attr(ol, "class", "svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, h4); + append(div, t1); + if (if_block) + if_block.m(div, null); + insert(target, t2, anchor); + insert(target, ol, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(ol, null); + } + }, + p(ctx2, dirty) { + if (ctx2[17].length) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block_22(ctx2); + if_block.c(); + if_block.m(div, null); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + if (dirty & 111) { + each_value_2 = ctx2[17]; + let i; + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2(ctx2, each_value_2, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_2(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ol, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_2.length; + } + if (dirty & 1 && ol_start_value !== (ol_start_value = ctx2[18].length + 1)) { + attr(ol, "start", ol_start_value); + } + }, + d(detaching) { + if (detaching) + detach(div); + if (if_block) + if_block.d(); + if (detaching) + detach(t2); + if (detaching) + detach(ol); + destroy_each(each_blocks, detaching); + } + }; +} +function create_if_block_22(ctx) { + let if_block_anchor; + let if_block = ctx[7] && ctx[18].length && create_if_block_3(ctx); + return { + c() { + if (if_block) + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (ctx2[7] && ctx2[18].length) { + if (if_block) { + } else { + if_block = create_if_block_3(ctx2); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_if_block_3(ctx) { + let h6; + return { + c() { + h6 = element("h6"); + h6.textContent = "Implied"; + attr(h6, "class", "BC-Matrix-header svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, h6, anchor); + }, + d(detaching) { + if (detaching) + detach(h6); + } + }; +} +function create_each_block_2(ctx) { + var _a; + let li; + let div; + let t_value = ((_a = ctx[21]) != null ? _a : dropPathNDendron(ctx[24], ctx[3])) + ""; + let t; + let div_class_value; + let div_aria_label_value; + let div_aria_label_position_value; + let li_class_value; + let mounted; + let dispose; + function click_handler_1(...args) { + return ctx[10](ctx[24], ...args); + } + function mouseover_handler_1(...args) { + return ctx[11](ctx[24], ...args); + } + return { + c() { + var _a2; + li = element("li"); + div = element("div"); + t = text(t_value); + attr(div, "class", div_class_value = ctx[22] + " " + ((_a2 = ctx[23]) != null ? _a2 : "") + " svelte-1p44ezg"); + attr(div, "aria-label", div_aria_label_value = (ctx[21] ? `${ctx[24]} +` : "") + (ctx[25] ? "\u2191 " + ctx[25] : "")); + attr(div, "aria-label-position", div_aria_label_position_value = ctx[5] ? "left" : "right"); + attr(li, "class", li_class_value = "BC-Implied " + (ctx[6] && ctx[24] === ctx[1].basename ? "BC-active-note" : "") + " svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, li, anchor); + append(li, div); + append(div, t); + if (!mounted) { + dispose = [ + listen(div, "click", click_handler_1), + listen(div, "mouseover", mouseover_handler_1) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + var _a2, _b; + ctx = new_ctx; + if (dirty & 1 && t_value !== (t_value = ((_a2 = ctx[21]) != null ? _a2 : dropPathNDendron(ctx[24], ctx[3])) + "")) + set_data(t, t_value); + if (dirty & 1 && div_class_value !== (div_class_value = ctx[22] + " " + ((_b = ctx[23]) != null ? _b : "") + " svelte-1p44ezg")) { + attr(div, "class", div_class_value); + } + if (dirty & 1 && div_aria_label_value !== (div_aria_label_value = (ctx[21] ? `${ctx[24]} +` : "") + (ctx[25] ? "\u2191 " + ctx[25] : ""))) { + attr(div, "aria-label", div_aria_label_value); + } + if (dirty & 3 && li_class_value !== (li_class_value = "BC-Implied " + (ctx[6] && ctx[24] === ctx[1].basename ? "BC-active-note" : "") + " svelte-1p44ezg")) { + attr(li, "class", li_class_value); + } + }, + d(detaching) { + if (detaching) + detach(li); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block_14(ctx) { + let if_block_anchor; + let if_block = (ctx[18].length || ctx[4] && ctx[17].length) && create_if_block4(ctx); + return { + c() { + if (if_block) + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (ctx2[18].length || ctx2[4] && ctx2[17].length) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block4(ctx2); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_each_block4(ctx) { + let div; + let t; + let each_value_1 = ctx[13]; + let each_blocks = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_14(get_each_context_14(ctx, each_value_1, i)); + } + return { + c() { + div = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t = space(); + attr(div, "class", "BC-matrix-hier svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, div, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + append(div, t); + }, + p(ctx2, dirty) { + if (dirty & 255) { + each_value_1 = ctx2[13]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_14(ctx2, each_value_1, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_14(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div, t); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_1.length; + } + }, + d(detaching) { + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + } + }; +} +function create_fragment7(ctx) { + let div0; + let matrixbuttons; + let t; + let div1; + let div1_class_value; + let current; + matrixbuttons = new MatrixButtons_default({ + props: { matrixView: ctx[2] } + }); + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block4(get_each_context4(ctx, each_value, i)); + } + return { + c() { + div0 = element("div"); + create_component(matrixbuttons.$$.fragment); + t = space(); + div1 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(div0, "class", "BC-matrix-buttons"); + attr(div1, "class", div1_class_value = "BC-Matrix markdown-preview-view " + (ctx[0].length ? "" : "BC-empty-view") + " svelte-1p44ezg"); + }, + m(target, anchor) { + insert(target, div0, anchor); + mount_component(matrixbuttons, div0, null); + insert(target, t, anchor); + insert(target, div1, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + current = true; + }, + p(ctx2, [dirty]) { + const matrixbuttons_changes = {}; + if (dirty & 4) + matrixbuttons_changes.matrixView = ctx2[2]; + matrixbuttons.$set(matrixbuttons_changes); + if (dirty & 255) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context4(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block4(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div1, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (!current || dirty & 1 && div1_class_value !== (div1_class_value = "BC-Matrix markdown-preview-view " + (ctx2[0].length ? "" : "BC-empty-view") + " svelte-1p44ezg")) { + attr(div1, "class", div1_class_value); + } + }, + i(local) { + if (current) + return; + transition_in(matrixbuttons.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(matrixbuttons.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div0); + destroy_component(matrixbuttons); + if (detaching) + detach(t); + if (detaching) + detach(div1); + destroy_each(each_blocks, detaching); + } + }; +} +function instance7($$self, $$props, $$invalidate) { + let { hierSquares } = $$props; + let { currFile } = $$props; + let { matrixView } = $$props; + const { plugin } = matrixView; + const { settings } = plugin; + const { showImpliedRelations, rlLeaf, treatCurrNodeAsImpliedSibling, showRelationType } = settings; + const click_handler = async (to, e) => await openOrSwitch(to, e); + const mouseover_handler = (to, event) => hoverPreview(event, matrixView, to); + const click_handler_1 = async (to, e) => await openOrSwitch(to, e); + const mouseover_handler_1 = (to, e) => hoverPreview(e, matrixView, to); + $$self.$$set = ($$props2) => { + if ("hierSquares" in $$props2) + $$invalidate(0, hierSquares = $$props2.hierSquares); + if ("currFile" in $$props2) + $$invalidate(1, currFile = $$props2.currFile); + if ("matrixView" in $$props2) + $$invalidate(2, matrixView = $$props2.matrixView); + }; + return [ + hierSquares, + currFile, + matrixView, + settings, + showImpliedRelations, + rlLeaf, + treatCurrNodeAsImpliedSibling, + showRelationType, + click_handler, + mouseover_handler, + click_handler_1, + mouseover_handler_1 + ]; +} +var Matrix = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance7, create_fragment7, safe_not_equal, { + hierSquares: 0, + currFile: 1, + matrixView: 2 + }); + } +}; +var Matrix_default = Matrix; + +// src/Views/MatrixView.ts +function getMatrixNeighbours(plugin, currNode) { + const { closedG, settings } = plugin; + const { userHiers } = settings; + const neighbours = blankRealNImplied(); + if (!closedG) + return neighbours; + closedG.forEachEdge(currNode, (k, a2, s, t) => { + const { field, dir, implied } = a2; + if (s === currNode) { + neighbours[dir].reals.push({ to: t, field, implied }); + } else { + neighbours[getOppDir(dir)].implieds.push({ + to: s, + field: getOppFields(userHiers, field, dir)[0], + implied + }); + } + }); + return neighbours; +} +var MatrixView = class extends import_obsidian10.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = TRAIL_ICON; + this.toInternalLinkObj = (to, realQ = true, parent, implied) => { + return { + to, + cls: linkClass(to, realQ), + alt: this.getAlt(to), + order: this.getOrder(to), + parent, + implied + }; + }; + this.getOrder = (node) => Number.parseInt(this.plugin.mainG.getNodeAttribute(node, "order")); + this.sortItemsAlpha = (a2, b) => { + var _a, _b; + const { sortByNameShowAlias, alphaSortAsc } = this.plugin.settings; + const aToSort = (sortByNameShowAlias ? a2.to : (_a = a2.alt) != null ? _a : a2.to).toLowerCase(); + const bToSort = (sortByNameShowAlias ? b.to : (_b = b.alt) != null ? _b : b.to).toLowerCase(); + const less = alphaSortAsc ? -1 : 1; + const more = alphaSortAsc ? 1 : -1; + return aToSort < bToSort ? less : more; + }; + this.plugin = plugin; + this.db = new Debugger(plugin); + } + async onload() { + super.onload(); + const { plugin } = this; + app.workspace.onLayoutReady(() => { + setTimeout(async () => await this.draw(), app.plugins.plugins.dataview ? app.plugins.plugins.dataview.api ? 1 : plugin.settings.dvWaitTime : 3e3); + }); + } + getViewType() { + return MATRIX_VIEW; + } + getDisplayText() { + return "Breadcrumbs Matrix"; + } + async onOpen() { + } + onClose() { + var _a; + (_a = this.view) == null ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + getAlt(node) { + const { plugin } = this; + const { altLinkFields, showAllAliases } = plugin.settings; + if (!altLinkFields.length) + return null; + const dv = getDVApi(plugin); + if (dv) { + const page = dv.page(node); + if (!page) + return null; + for (const alt of altLinkFields) { + const value = page[alt]; + const arr = typeof value === "string" ? splitAndTrim(value) : value; + if (value) + return showAllAliases ? arr.join(", ") : arr[0]; + } + } else { + const file = app.metadataCache.getFirstLinkpathDest(node, ""); + if (file) { + const { frontmatter } = app.metadataCache.getFileCache(file); + for (const altField of altLinkFields) { + const value = frontmatter == null ? void 0 : frontmatter[altField]; + const arr = typeof value === "string" ? splitAndTrim(value) : value; + if (value) + return showAllAliases ? arr.join(", ") : arr[0]; + } + } + } + } + removeDuplicateImplied(reals, implieds) { + const realTos = reals.map((real) => real.to); + return implieds.filter((implied) => !realTos.includes(implied.to)); + } + getHierSquares(userHiers, currFile) { + const { plugin } = this; + const { mainG, settings } = plugin; + const { enableAlphaSort, squareDirectionsOrder } = settings; + if (!mainG) + return []; + const { basename } = currFile; + if (!mainG.hasNode(basename)) + return []; + const realsnImplieds = getMatrixNeighbours(plugin, basename); + return userHiers.map((hier) => { + const filteredRealNImplied = blankRealNImplied(); + const resultsFilter = (item, dir, oppDir, arrow) => hier[dir].includes(item.field) || item.field.includes(`<${arrow}>`) && hier[oppDir].includes(item.field.split(" <")[0]); + for (const dir in realsnImplieds) { + const oppDir = getOppDir(dir); + const arrow = ARROW_DIRECTIONS[dir]; + const { reals, implieds } = realsnImplieds[dir]; + filteredRealNImplied[dir].reals = reals.filter((real) => resultsFilter(real, dir, oppDir, arrow)).map((item) => this.toInternalLinkObj(item.to, true, null, item.implied)); + filteredRealNImplied[dir].implieds = implieds.filter((implied) => resultsFilter(implied, dir, oppDir, arrow)).map((item) => this.toInternalLinkObj(item.to, false, null, item.implied)); + } + let { + up: { reals: ru, implieds: iu }, + same: { reals: rs, implieds: is }, + down: { reals: rd, implieds: id2 }, + next: { reals: rn, implieds: iN }, + prev: { reals: rp, implieds: ip } + } = filteredRealNImplied; + [iu, is, id2, iN, ip] = [ + this.removeDuplicateImplied(ru, iu), + this.removeDuplicateImplied(rs, is), + this.removeDuplicateImplied(rd, id2), + this.removeDuplicateImplied(rn, iN), + this.removeDuplicateImplied(rp, ip) + ]; + const iSameNoDup = []; + is.forEach((impSib) => { + if (iSameNoDup.every((noDup) => noDup.to !== impSib.to)) { + iSameNoDup.push(impSib); + } + }); + is = iSameNoDup; + const getFieldInHier = (dir) => hier[dir][0] ? hier[dir].join(", ") : `${hier[getOppDir(dir)].join(",")}${ARROW_DIRECTIONS[dir]}`; + const squares = [ru, rs, rd, rn, rp, iu, is, id2, iN, ip]; + if (enableAlphaSort) + squares.forEach((sq) => sq.sort(this.sortItemsAlpha)); + squares.forEach((sq) => sq.sort((a2, b) => a2.order - b.order)); + (0, import_loglevel14.info)([ + { ru }, + { rs }, + { rd }, + { rn }, + { rp }, + { iu }, + { is }, + { id: id2 }, + { iN }, + { ip } + ]); + const square = [ + { + realItems: ru, + impliedItems: iu, + field: getFieldInHier("up") + }, + { + realItems: rs, + impliedItems: is, + field: getFieldInHier("same") + }, + { + realItems: rd, + impliedItems: id2, + field: getFieldInHier("down") + }, + { + realItems: rn, + impliedItems: iN, + field: getFieldInHier("next") + }, + { + realItems: rp, + impliedItems: ip, + field: getFieldInHier("prev") + } + ]; + return squareDirectionsOrder.map((order) => square[order]); + }); + } + async draw() { + try { + const { contentEl, db, plugin } = this; + db.start2G("Draw Matrix View"); + contentEl.empty(); + const { userHiers } = plugin.settings; + const currFile = getCurrFile(); + if (!currFile) + return; + const hierSquares = this.getHierSquares(userHiers, currFile).filter((squareArr) => squareArr.some((sq) => sq.realItems.length + sq.impliedItems.length > 0)); + new Matrix_default({ + target: contentEl, + props: { hierSquares, matrixView: this, currFile } + }); + db.end2G(); + } catch (err) { + (0, import_loglevel14.error)(err); + this.db.end2G(); + } + } +}; + +// src/API.ts +var BCAPI = class { + constructor(plugin) { + this.DIRECTIONS = DIRECTIONS; + this.ARROW_DIRECTIONS = ARROW_DIRECTIONS; + this.buildObsGraph = buildObsGraph; + this.refreshIndex = async () => await refreshIndex(this.plugin); + this.getSubInDirs = (dirs, g = this.mainG) => getSubInDirs(g, ...dirs); + this.getSubForFields = (fields, g = this.mainG) => getSubForFields(g, fields); + this.dfsAllPaths = (fromNode = ((_a) => (_a = getCurrFile()) == null ? void 0 : _a.basename)(), g = this.mainG) => dfsAllPaths(g, fromNode); + this.createIndex = (allPaths, wikilinks = false, indent = " ") => createIndex(allPaths, wikilinks, indent); + this.getMatrixNeighbours = (fromNode = ((_b) => (_b = getCurrFile()) == null ? void 0 : _b.basename)()) => getMatrixNeighbours(this.plugin, fromNode); + this.getOppDir = (dir) => getOppDir(dir); + this.getOppFields = (field) => { + const { fieldDir } = getFieldInfo(this.plugin.settings.userHiers, field); + return getOppFields(this.plugin.settings.userHiers, field, fieldDir); + }; + this.getFieldInfo = (field) => getFieldInfo(this.plugin.settings.userHiers, field); + this.getFields = (dir) => getFields(this.plugin.settings.userHiers, dir != null ? dir : "all"); + this.plugin = plugin; + this.mainG = this.plugin.mainG; + this.closedG = this.plugin.closedG; + } + iterateHiers(cb) { + iterateHiers(this.plugin.settings.userHiers, cb); + } +}; + +// src/AlternativeHierarchies/HierarchyNotes/HierNoteModal.ts +var import_obsidian14 = require("obsidian"); + +// src/AlternativeHierarchies/HierarchyNotes/HierarchyNoteManipulator.ts +var import_loglevel15 = __toESM(require_loglevel()); +var import_obsidian13 = require("obsidian"); + +// src/AlternativeHierarchies/HierarchyNotes/ModifyHierItemModal.ts +var import_obsidian12 = require("obsidian"); + +// src/Components/ModifyHNItemComp.svelte +var import_console = require("console"); +var import_obsidian11 = require("obsidian"); +function create_if_block_23(ctx) { + let if_block_anchor; + function select_block_type(ctx2, dirty) { + if (ctx2[2].depth === 0) + return create_if_block_32; + return create_else_block2; + } + let current_block_type = select_block_type(ctx, -1); + let if_block = current_block_type(ctx); + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + d(detaching) { + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_else_block2(ctx) { + let div; + let pre; + let t_value = ctx[6](ctx[5], ctx[2].depth - 4, true) + ""; + let t; + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx2, dirty) { + if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth - 4, true) + "")) + set_data(t, t_value); + }, + d(detaching) { + if (detaching) + detach(div); + } + }; +} +function create_if_block_32(ctx) { + let div; + return { + c() { + div = element("div"); + div.textContent = "Can't add parent to top level item, choose another direction"; + }, + m(target, anchor) { + insert(target, div, anchor); + }, + p: noop, + d(detaching) { + if (detaching) + detach(div); + } + }; +} +function create_if_block_13(ctx) { + let div; + let pre; + let t_value = ctx[6](ctx[5], ctx[2].depth + 4, true) + ""; + let t; + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx2, dirty) { + if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth + 4, true) + "")) + set_data(t, t_value); + }, + d(detaching) { + if (detaching) + detach(div); + } + }; +} +function create_if_block5(ctx) { + let div; + let pre; + let t_value = ctx[6](ctx[5], ctx[2].depth, true) + ""; + let t; + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx2, dirty) { + if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth, true) + "")) + set_data(t, t_value); + }, + d(detaching) { + if (detaching) + detach(div); + } + }; +} +function create_fragment8(ctx) { + let h5; + let t0; + let t1_value = ARROW_DIRECTIONS[ctx[0]] + ""; + let t1; + let t2; + let t3_value = dropWikilinks(ctx[2].line) + ""; + let t3; + let t4; + let div1; + let t5; + let div0; + let pre; + let strong; + let t6_value = ctx[6](dropWikilinks(ctx[2].line), ctx[2].depth, true) + ""; + let t6; + let t7; + let t8; + let select; + let option0; + let option1; + let option2; + let t12; + let input; + let t13; + let button; + let mounted; + let dispose; + let if_block0 = ctx[0] === "up" && create_if_block_23(ctx); + function select_block_type_1(ctx2, dirty) { + if (ctx2[0] === "same") + return create_if_block5; + if (ctx2[0] === "down") + return create_if_block_13; + } + let current_block_type = select_block_type_1(ctx, -1); + let if_block1 = current_block_type && current_block_type(ctx); + return { + c() { + h5 = element("h5"); + t0 = text("Add an "); + t1 = text(t1_value); + t2 = text(" to "); + t3 = text(t3_value); + t4 = space(); + div1 = element("div"); + if (if_block0) + if_block0.c(); + t5 = space(); + div0 = element("div"); + pre = element("pre"); + strong = element("strong"); + t6 = text(t6_value); + t7 = space(); + if (if_block1) + if_block1.c(); + t8 = space(); + select = element("select"); + option0 = element("option"); + option0.textContent = "up"; + option1 = element("option"); + option1.textContent = "same"; + option2 = element("option"); + option2.textContent = "down"; + t12 = space(); + input = element("input"); + t13 = space(); + button = element("button"); + button.textContent = "Add"; + attr(pre, "class", "svelte-13g4k7i"); + option0.__value = "up"; + option0.value = option0.__value; + option1.__value = "same"; + option1.value = option1.__value; + option2.__value = "down"; + option2.value = option2.__value; + attr(select, "class", "dropdown"); + attr(select, "width", "1"); + if (ctx[0] === void 0) + add_render_callback(() => ctx[8].call(select)); + attr(input, "type", "text"); + attr(input, "placeholder", "New item"); + }, + m(target, anchor) { + insert(target, h5, anchor); + append(h5, t0); + append(h5, t1); + append(h5, t2); + append(h5, t3); + insert(target, t4, anchor); + insert(target, div1, anchor); + if (if_block0) + if_block0.m(div1, null); + append(div1, t5); + append(div1, div0); + append(div0, pre); + append(pre, strong); + append(strong, t6); + append(div1, t7); + if (if_block1) + if_block1.m(div1, null); + append(div1, t8); + append(div1, select); + append(select, option0); + append(select, option1); + append(select, option2); + select_option(select, ctx[0]); + append(div1, t12); + append(div1, input); + ctx[9](input); + set_input_value(input, ctx[5]); + append(div1, t13); + append(div1, button); + if (!mounted) { + dispose = [ + listen(select, "change", ctx[8]), + listen(input, "input", ctx[10]), + listen(button, "click", ctx[11]) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 1 && t1_value !== (t1_value = ARROW_DIRECTIONS[ctx2[0]] + "")) + set_data(t1, t1_value); + if (dirty & 4 && t3_value !== (t3_value = dropWikilinks(ctx2[2].line) + "")) + set_data(t3, t3_value); + if (ctx2[0] === "up") { + if (if_block0) { + if_block0.p(ctx2, dirty); + } else { + if_block0 = create_if_block_23(ctx2); + if_block0.c(); + if_block0.m(div1, t5); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + if (dirty & 4 && t6_value !== (t6_value = ctx2[6](dropWikilinks(ctx2[2].line), ctx2[2].depth, true) + "")) + set_data(t6, t6_value); + if (current_block_type === (current_block_type = select_block_type_1(ctx2, dirty)) && if_block1) { + if_block1.p(ctx2, dirty); + } else { + if (if_block1) + if_block1.d(1); + if_block1 = current_block_type && current_block_type(ctx2); + if (if_block1) { + if_block1.c(); + if_block1.m(div1, t8); + } + } + if (dirty & 1) { + select_option(select, ctx2[0]); + } + if (dirty & 32 && input.value !== ctx2[5]) { + set_input_value(input, ctx2[5]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(h5); + if (detaching) + detach(t4); + if (detaching) + detach(div1); + if (if_block0) + if_block0.d(); + if (if_block1) { + if_block1.d(); + } + ctx[9](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance8($$self, $$props, $$invalidate) { + let { modal } = $$props; + let { settings } = $$props; + let { hnItem } = $$props; + let { file } = $$props; + let { rel } = $$props; + let inputEl; + let newItem = app.workspace.activeLeaf.view.file.basename; + const buildNewItem = (newItem2, depth = hnItem.depth, preview = false) => `${" ".repeat(Math.round(depth / (preview ? 2 : 1)))}- ${preview ? newItem2 || "" : makeWiki(newItem2)}`; + function select_change_handler() { + rel = select_value(this); + $$invalidate(0, rel); + } + function input_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + inputEl = $$value; + $$invalidate(4, inputEl); + }); + } + function input_input_handler() { + newItem = this.value; + $$invalidate(5, newItem); + } + const click_handler = async (e) => { + if (rel === "up" && hnItem.depth === 0) { + new import_obsidian11.Notice("Can't add parent to top level item, choose another direction"); + return; + } else { + try { + const content = await app.vault.read(file); + const lines = content.split("\n"); + const lineNo = rel === "up" ? hnItem.lineNo : hnItem.lineNo + 1; + const depth = rel === "up" ? hnItem.depth - 4 : rel === "down" ? hnItem.depth + 4 : hnItem.depth; + lines.splice(lineNo, 0, buildNewItem(newItem, depth)); + await app.vault.modify(file, lines.join("\n")); + modal.close(); + } catch (err) { + (0, import_console.error)(err); + new import_obsidian11.Notice("An error occured, please check the console"); + } + } + }; + $$self.$$set = ($$props2) => { + if ("modal" in $$props2) + $$invalidate(1, modal = $$props2.modal); + if ("settings" in $$props2) + $$invalidate(7, settings = $$props2.settings); + if ("hnItem" in $$props2) + $$invalidate(2, hnItem = $$props2.hnItem); + if ("file" in $$props2) + $$invalidate(3, file = $$props2.file); + if ("rel" in $$props2) + $$invalidate(0, rel = $$props2.rel); + }; + return [ + rel, + modal, + hnItem, + file, + inputEl, + newItem, + buildNewItem, + settings, + select_change_handler, + input_binding, + input_input_handler, + click_handler + ]; +} +var ModifyHNItemComp = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance8, create_fragment8, safe_not_equal, { + modal: 1, + settings: 7, + hnItem: 2, + file: 3, + rel: 0 + }); + } +}; +var ModifyHNItemComp_default = ModifyHNItemComp; + +// src/AlternativeHierarchies/HierarchyNotes/ModifyHierItemModal.ts +var ModifyHierItemModal = class extends import_obsidian12.Modal { + constructor(plugin, hnItem, file, rel) { + super(app); + this.plugin = plugin; + this.modal = this; + this.hnItem = hnItem; + this.file = file; + this.rel = rel; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + this.mount = new ModifyHNItemComp_default({ + target: contentEl, + props: { + modal: this, + settings: this.plugin.settings, + hnItem: this.hnItem, + file: this.file, + rel: this.rel + } + }); + } + onClose() { + this.mount.$destroy(); + this.contentEl.empty(); + } +}; + +// src/AlternativeHierarchies/HierarchyNotes/HierarchyNoteManipulator.ts +var HierarchyNoteManipulator = class extends import_obsidian13.FuzzySuggestModal { + constructor(plugin, hierNoteName) { + super(app); + this.plugin = plugin; + this.settings = this.plugin.settings; + this.hierNoteName = hierNoteName; + const chooseOverride = (evt) => { + this.chooser.useSelectedItem(evt); + return false; + }; + this.scope.register([], "Delete", chooseOverride); + this.scope.register(["Shift"], "ArrowUp", chooseOverride); + this.scope.register(["Shift"], "ArrowRight", chooseOverride); + this.scope.register(["Shift"], "ArrowDown", chooseOverride); + } + async onOpen() { + this.setPlaceholder("HN Manipulator"); + this.setInstructions([ + { command: "Shift + Enter", purpose: "Jump to item" }, + { command: "Shift + \u2191", purpose: "Add parent" }, + { command: "Shift + \u2192", purpose: "Add sibling" }, + { command: "Shift + \u2193 / Enter / Click", purpose: "Add child" }, + { command: "Delete", purpose: "Delete item" } + ]); + this.file = app.metadataCache.getFirstLinkpathDest(this.hierNoteName, ""); + if (!this.file) + this.lines = []; + console.log(this); + const content = await app.vault.cachedRead(this.file); + this.lines = content.split("\n"); + this.listItems = app.metadataCache.getFileCache(this.file).listItems; + console.log(this); + super.onOpen(); + } + getItems() { + const items = this.listItems.map((item) => { + const i = item.position.start.line; + return { i, line: this.lines[i] }; + }).map((item) => { + const splits = item.line.split("- "); + const depth = splits[0].length; + const line = splits.slice(1).join("- "); + return { depth, line, lineNo: item.i }; + }); + (0, import_loglevel15.info)(items); + return items; + } + getItemText(item) { + return `${" ".repeat(item.depth)}- ${dropWikilinks(item.line)}`; + } + renderSuggestion(item, el) { + super.renderSuggestion(item, el); + el.innerText = `${" ".repeat(item.item.depth)}- ${dropWikilinks(item.item.line)}`; + } + async deleteItem(item) { + try { + this.lines.splice(item.lineNo, 1); + this.listItems.splice(item.lineNo, 1); + await app.vault.modify(this.file, this.lines.join("\n")); + new import_obsidian13.Notice("Item deleted Succesfully"); + } catch (err) { + (0, import_loglevel15.error)(err); + new import_obsidian13.Notice("An error occured. Please check the console"); + } + } + onChooseItem(item, evt) { + if (evt instanceof KeyboardEvent && evt.key === "Delete") { + this.deleteItem(item); + } else if (evt instanceof KeyboardEvent && evt.key == "Enter" && evt.shiftKey) { + const view = app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView); + const { editor } = view != null ? view : {}; + if (!editor) + return; + view.leaf.openFile(this.file, { active: true, mode: "source" }); + editor.setCursor({ line: item.lineNo, ch: item.depth + 2 }); + } else if (evt instanceof KeyboardEvent || evt instanceof MouseEvent) { + let rel; + if (evt instanceof MouseEvent && evt.type == "click") + rel = "down"; + if (evt instanceof KeyboardEvent) { + if (evt.key === "Enter") + rel = "down"; + } + if (evt instanceof KeyboardEvent && evt.shiftKey) { + if (evt.key === "ArrowUp") + rel = "up"; + if (evt.key === "ArrowDown") + rel = "down"; + if (evt.key === "ArrowRight") + rel = "same"; + } + new ModifyHierItemModal(this.plugin, item, this.file, rel).open(); + this.close(); + } + } +}; + +// src/AlternativeHierarchies/HierarchyNotes/HierNoteModal.ts +var HierarchyNoteSelectorModal = class extends import_obsidian14.FuzzySuggestModal { + constructor(plugin) { + super(app); + this.plugin = plugin; + this.settings = this.plugin.settings; + } + onOpen() { + this.setPlaceholder("HN Chooser"); + const { hierarchyNotes } = this.settings; + if (hierarchyNotes.length === 0) { + this.close(); + new import_obsidian14.Notice("No hierarchy notes found"); + } else if (hierarchyNotes.length === 1 && !hierarchyNotes[0].endsWith("/")) { + this.close(); + new HierarchyNoteManipulator(this.plugin, hierarchyNotes[0]).open(); + } else { + super.onOpen(); + } + } + getItems() { + const { hierarchyNotes } = this.settings; + if (hierarchyNotes.length == 1 && hierarchyNotes[0].endsWith("/")) { + let folder = hierarchyNotes[0].slice(0, -1); + if (app.plugins.plugins.dataview != void 0) { + let pages = app.plugins.plugins.dataview.api.pages(`"${folder}"`); + return pages.values.map((page) => page.file.path); + } else { + new import_obsidian14.Notice("make sure you have dataview enabled"); + } + } else + return hierarchyNotes; + } + getItemText(item) { + return `${item}`; + } + renderSuggestion(item, el) { + super.renderSuggestion(item, el); + } + onChooseItem(item, evt) { + new HierarchyNoteManipulator(this.plugin, item).open(); + this.close(); + } +}; + +// src/Codeblocks.ts +var import_loglevel16 = __toESM(require_loglevel()); +var import_obsidian16 = require("obsidian"); + +// src/Components/RenderMarkdown.svelte +var import_obsidian15 = require("obsidian"); +function create_fragment9(ctx) { + let div; + return { + c() { + div = element("div"); + attr(div, "class", "BC-note-content svelte-7e9i10"); + }, + m(target, anchor) { + insert(target, div, anchor); + ctx[2](div); + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div); + ctx[2](null); + } + }; +} +function instance9($$self, $$props, $$invalidate) { + var __awaiter = this && this.__awaiter || function(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()); + }); + }; + let { path: path2 } = $$props; + function getContent(note) { + return __awaiter(this, void 0, void 0, function* () { + const file = app.metadataCache.getFirstLinkpathDest(note, ""); + return yield app.vault.cachedRead(file); + }); + } + let el; + onMount(() => __awaiter(void 0, void 0, void 0, function* () { + import_obsidian15.MarkdownRenderer.renderMarkdown(yield getContent(path2), el, path2, null); + })); + function div_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + el = $$value; + $$invalidate(0, el); + }); + } + $$self.$$set = ($$props2) => { + if ("path" in $$props2) + $$invalidate(1, path2 = $$props2.path); + }; + return [el, path2, div_binding]; +} +var RenderMarkdown = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance9, create_fragment9, safe_not_equal, { path: 1 }); + } +}; +var RenderMarkdown_default = RenderMarkdown; + +// src/Components/CBTree.svelte +function get_each_context5(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[17] = list[i][0]; + child_ctx[18] = list[i][1]; + return child_ctx; +} +function create_if_block_24(ctx) { + let h3; + let t0; + let t1; + let t2; + return { + c() { + h3 = element("h3"); + t0 = text(ctx[8]); + t1 = text(" of "); + t2 = text(ctx[4]); + }, + m(target, anchor) { + insert(target, h3, anchor); + append(h3, t0); + append(h3, t1); + append(h3, t2); + }, + p(ctx2, dirty) { + if (dirty & 16) + set_data(t2, ctx2[4]); + }, + d(detaching) { + if (detaching) + detach(h3); + } + }; +} +function create_if_block6(ctx) { + let current_block_type_index; + let if_block; + let if_block_anchor; + let current; + const if_block_creators = [create_if_block_14, create_else_block3]; + const if_blocks = []; + function select_block_type(ctx2, dirty) { + if (ctx2[7] === "open" || ctx2[7] === "closed") + return 0; + return 1; + } + current_block_type_index = select_block_type(ctx, -1); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_blocks[current_block_type_index].m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + if_block.p(ctx2, dirty); + }, + i(local) { + if (current) + return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if_blocks[current_block_type_index].d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_else_block3(ctx) { + let div; + let pre; + let t0_value = ctx[17] + "-"; + let t0; + let t1; + let span; + let a2; + let t2_value = dropDendron(ctx[18], ctx[5]) + ""; + let t2; + let a_class_value; + let t3; + let mounted; + let dispose; + function click_handler_1(...args) { + return ctx[15](ctx[18], ...args); + } + function mouseover_handler_1(...args) { + return ctx[16](ctx[18], ...args); + } + return { + c() { + div = element("div"); + pre = element("pre"); + t0 = text(t0_value); + t1 = space(); + span = element("span"); + a2 = element("a"); + t2 = text(t2_value); + t3 = space(); + attr(pre, "class", "indent svelte-1df5nr5"); + attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5"); + attr(span, "class", "internal-link"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t0); + append(div, t1); + append(div, span); + append(span, a2); + append(a2, t2); + append(div, t3); + if (!mounted) { + dispose = [ + listen(span, "click", click_handler_1), + listen(span, "mouseover", mouseover_handler_1) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 1 && t0_value !== (t0_value = ctx[17] + "-")) + set_data(t0, t0_value); + if (dirty & 1 && t2_value !== (t2_value = dropDendron(ctx[18], ctx[5]) + "")) + set_data(t2, t2_value); + if (dirty & 1 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5")) { + attr(a2, "class", a_class_value); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_if_block_14(ctx) { + let div; + let pre; + let t0_value = ctx[17] + ""; + let t0; + let t1; + let details2; + let summary; + let span; + let a2; + let t2_value = dropDendron(ctx[18], ctx[5]) + ""; + let t2; + let a_class_value; + let t3; + let rendermarkdown; + let details_open_value; + let t4; + let current; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[13](ctx[18], ...args); + } + function mouseover_handler(...args) { + return ctx[14](ctx[18], ...args); + } + rendermarkdown = new RenderMarkdown_default({ props: { path: ctx[18] } }); + return { + c() { + div = element("div"); + pre = element("pre"); + t0 = text(t0_value); + t1 = space(); + details2 = element("details"); + summary = element("summary"); + span = element("span"); + a2 = element("a"); + t2 = text(t2_value); + t3 = space(); + create_component(rendermarkdown.$$.fragment); + t4 = space(); + attr(pre, "class", "indent svelte-1df5nr5"); + attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5"); + attr(span, "class", "internal-link"); + details2.open = details_open_value = ctx[7] === "open"; + attr(details2, "class", "svelte-1df5nr5"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t0); + append(div, t1); + append(div, details2); + append(details2, summary); + append(summary, span); + append(span, a2); + append(a2, t2); + append(details2, t3); + mount_component(rendermarkdown, details2, null); + append(div, t4); + current = true; + if (!mounted) { + dispose = [ + listen(span, "click", click_handler), + listen(span, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if ((!current || dirty & 1) && t0_value !== (t0_value = ctx[17] + "")) + set_data(t0, t0_value); + if ((!current || dirty & 1) && t2_value !== (t2_value = dropDendron(ctx[18], ctx[5]) + "")) + set_data(t2, t2_value); + if (!current || dirty & 1 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5")) { + attr(a2, "class", a_class_value); + } + const rendermarkdown_changes = {}; + if (dirty & 1) + rendermarkdown_changes.path = ctx[18]; + rendermarkdown.$set(rendermarkdown_changes); + }, + i(local) { + if (current) + return; + transition_in(rendermarkdown.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(rendermarkdown.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + destroy_component(rendermarkdown); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block5(ctx) { + let show_if = meetsConditions(ctx[17], ctx[18], ctx[1], ctx[2], ctx[3]); + let if_block_anchor; + let current; + let if_block = show_if && create_if_block6(ctx); + return { + c() { + if (if_block) + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + if (dirty & 15) + show_if = meetsConditions(ctx2[17], ctx2[18], ctx2[1], ctx2[2], ctx2[3]); + if (show_if) { + if (if_block) { + if_block.p(ctx2, dirty); + if (dirty & 15) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block6(ctx2); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + check_outros(); + } + }, + i(local) { + if (current) + return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_fragment10(ctx) { + let t; + let div; + let current; + let if_block = ctx[6] !== false && create_if_block_24(ctx); + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block5(get_each_context5(ctx, each_value, i)); + } + const out = (i) => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + return { + c() { + if (if_block) + if_block.c(); + t = space(); + div = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(div, "class", "BC-tree svelte-1df5nr5"); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, t, anchor); + insert(target, div, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + current = true; + }, + p(ctx2, [dirty]) { + if (ctx2[6] !== false) + if_block.p(ctx2, dirty); + if (dirty & 687) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context5(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + transition_in(each_blocks[i], 1); + } else { + each_blocks[i] = create_each_block5(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div, null); + } + } + group_outros(); + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + check_outros(); + } + }, + i(local) { + if (current) + return; + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + current = true; + }, + o(local) { + each_blocks = each_blocks.filter(Boolean); + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + current = false; + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(t); + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + } + }; +} +function instance10($$self, $$props, $$invalidate) { + let { plugin } = $$props; + let { el } = $$props; + let { lines } = $$props; + let { froms } = $$props; + let { min: min3 } = $$props; + let { max: max4 } = $$props; + let { basename } = $$props; + let { parsedSource } = $$props; + const { settings } = plugin; + const { title, content, dir } = parsedSource; + const activeLeafView = app.workspace.activeLeaf.view; + const click_handler = async (link2, e) => await openOrSwitch(link2, e); + const mouseover_handler = (link2, e) => hoverPreview(e, activeLeafView, link2); + const click_handler_1 = async (link2, e) => await openOrSwitch(link2, e); + const mouseover_handler_1 = (link2, e) => hoverPreview(e, activeLeafView, link2); + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(10, plugin = $$props2.plugin); + if ("el" in $$props2) + $$invalidate(11, el = $$props2.el); + if ("lines" in $$props2) + $$invalidate(0, lines = $$props2.lines); + if ("froms" in $$props2) + $$invalidate(1, froms = $$props2.froms); + if ("min" in $$props2) + $$invalidate(2, min3 = $$props2.min); + if ("max" in $$props2) + $$invalidate(3, max4 = $$props2.max); + if ("basename" in $$props2) + $$invalidate(4, basename = $$props2.basename); + if ("parsedSource" in $$props2) + $$invalidate(12, parsedSource = $$props2.parsedSource); + }; + return [ + lines, + froms, + min3, + max4, + basename, + settings, + title, + content, + dir, + activeLeafView, + plugin, + el, + parsedSource, + click_handler, + mouseover_handler, + click_handler_1, + mouseover_handler_1 + ]; +} +var CBTree = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance10, create_fragment10, safe_not_equal, { + plugin: 10, + el: 11, + lines: 0, + froms: 1, + min: 2, + max: 3, + basename: 4, + parsedSource: 12 + }); + } +}; +var CBTree_default = CBTree; + +// src/Codeblocks.ts +function getCodeblockCB(plugin) { + const { settings, db } = plugin; + const { userHiers, createIndexIndent } = settings; + return (source, el, ctx) => { + var _a; + db.start2G("Codeblock"); + const parsedSource = parseCodeBlockSource(source); + const err = codeblockError(plugin, parsedSource); + if (err !== "") { + el.innerHTML = err; + db.end2G(); + return; + } + let min3 = 0, max4 = Infinity; + let { depth, dir, fields, from, implied, flat } = parsedSource; + if (depth !== void 0) { + const minNum = parseInt(depth[0]); + if (!isNaN(minNum)) + min3 = minNum; + const maxNum = parseInt(depth[1]); + if (!isNaN(maxNum)) + max4 = maxNum; + } + const currFile = app.metadataCache.getFirstLinkpathDest(ctx.sourcePath, ""); + const { basename } = currFile; + let froms = void 0; + if (from !== void 0) { + try { + const api = getDVApi(plugin); + if (api) { + const pages = (_a = api.pagePaths(from)) == null ? void 0 : _a.values; + froms = pages.map(dropFolder); + } else + new import_obsidian16.Notice("Dataview must be enabled for `from` to work."); + } catch (e) { + new import_obsidian16.Notice(`The query "${from}" failed.`); + } + } + const oppDir = getOppDir(dir); + const sub = implied === false ? getSubInDirs(plugin.mainG, dir) : getSubInDirs(plugin.mainG, dir, oppDir); + const closed = getReflexiveClosure(sub, userHiers); + const subFields = fields != null ? fields : getFields(userHiers); + const subClosed = getSubForFields(getSubInDirs(closed, dir), subFields); + const allPaths = dfsAllPaths(subClosed, basename); + const index2 = createIndex(allPaths, false, createIndexIndent); + (0, import_loglevel16.info)({ allPaths, index: index2 }); + const lines = indexToLinePairs(index2, flat); + switch (parsedSource.type) { + case "tree": + new CBTree_default({ + target: el, + props: { + plugin, + el, + min: min3, + max: max4, + lines, + froms, + basename, + parsedSource + } + }); + break; + case "juggl": + createdJugglCB(plugin, el, parsedSource, lines, froms, basename, min3, max4); + break; + } + db.end2G(); + }; +} +var parseAsBool = (value) => value === "true" ? true : value === "false" ? false : value; +function parseCodeBlockSource(source) { + const lines = source.split("\n"); + const getValue = (type2) => { + var _a, _b, _c; + return (_c = (_b = (_a = lines.find((l) => l.startsWith(`${type2}:`))) == null ? void 0 : _a.split(":")) == null ? void 0 : _b[1]) == null ? void 0 : _c.trim(); + }; + const results = {}; + CODEBLOCK_FIELDS.forEach((field) => { + const value = getValue(field); + results[field] = parseAsBool(value); + }); + results.fields = results.fields ? splitAndTrim(results.fields) : void 0; + if (results.depth) { + const match = results.depth.match(/(\d*)-?(\d*)/); + results.depth = [match[1], match[2]]; + } + return results; +} +function codeblockError(plugin, parsedSource) { + var _a; + const { dir, fields, type: type2, title, depth, flat, content, from, implied } = parsedSource; + const { userHiers } = plugin.settings; + let err = ""; + if (!CODEBLOCK_TYPES.includes(type2)) + err += `type: ${type2} is not a valid type. It must be one of: ${CODEBLOCK_TYPES.map((type3) => `${type3}`).join(", ")}.
`; + const validDir = DIRECTIONS.includes(dir); + if (!validDir) + err += `dir: ${dir} is not a valid direction.
`; + const allFields = getFields(userHiers); + (_a = [fields].flat()) == null ? void 0 : _a.forEach((f) => { + if (f !== void 0 && !allFields.includes(f)) + err += `fields: ${f} is not a field in your hierarchies.
`; + }); + if (title !== void 0 && title !== false) + err += `title: ${title} is not a valid value. It has to be false, or leave the entire line out.
`; + if (depth !== void 0 && depth.every((num) => isNaN(parseInt(num)))) + err += `depth: ${depth} is not a valid value. It has to be a number.
`; + if (flat !== void 0 && flat !== true) + err += `flat: ${flat} is not a valid value. It has to be true, or leave the entire line out.
`; + if (content !== void 0 && content !== "open" && content !== "closed") + err += `content: ${content} is not a valid value. It has to be open or closed, or leave the entire line out.
`; + if (from !== void 0 && !app.plugins.enabledPlugins.has("dataview")) { + err += `Dataview must be enabled to use from.
`; + } + if (implied !== void 0 && implied !== false) + err += `implied: ${implied} is not a valid value. It has to be false, or leave the entire line out.
`; + return err === "" ? "" : `${err}
+ A valid example would be: +

+      type: tree
+      dir: ${validDir ? dir : "down"}
+      fields: ${allFields.map((f) => {
+    return { f, dir: getFieldInfo(userHiers, f).fieldDir };
+  }).filter((info14) => info14.dir === dir).map((info14) => info14.f).join(", ") || "child"}
+      depth: 3
+      
`; +} +var indentToDepth = (indent) => indent.length / 2 + 1; +function meetsConditions(indent, node, froms, min3, max4) { + const depth = indentToDepth(indent); + return depth >= min3 && depth <= max4 && (froms === void 0 || froms.includes(node)); +} +function createdJugglCB(plugin, target, args, lines, froms, source, min3, max4) { + const nodes = lines.filter(([indent, node]) => meetsConditions(indent, node, froms, min3, max4)).map(([_, node]) => node + ".md"); + if (min3 <= 0) + nodes.push(source + ".md"); + createJuggl(plugin, target, nodes, args); +} + +// src/Commands/jumpToFirstDir.ts +var import_obsidian17 = require("obsidian"); +async function jumpToFirstDir(plugin, dir) { + var _a; + const { limitJumpToFirstFields } = plugin.settings; + const file = getCurrFile(); + if (!file) { + new import_obsidian17.Notice("You need to be focussed on a Markdown file"); + return; + } + const { basename } = file; + const realsNImplieds = getRealnImplied(plugin, basename, dir)[dir]; + const allBCs = [...realsNImplieds.reals, ...realsNImplieds.implieds]; + if (allBCs.length === 0) { + new import_obsidian17.Notice(`No ${dir} found`); + return; + } + const toNode = (_a = allBCs.find((bc) => limitJumpToFirstFields.includes(bc.field))) == null ? void 0 : _a.to; + if (!toNode) { + new import_obsidian17.Notice(`No note was found in ${dir} given the limited fields allowed: ${limitJumpToFirstFields.join(", ")}`); + return; + } + const toFile = app.metadataCache.getFirstLinkpathDest(toNode, ""); + await app.workspace.activeLeaf.openFile(toFile); +} + +// src/Commands/threading.ts +var import_obsidian18 = require("obsidian"); +var resolveThreadingNameTemplate = (template, currFile, field, dir, dateFormat) => template ? template.replace("{{current}}", currFile.basename).replace("{{field}}", field).replace("{{dir}}", dir).replace("{{date}}", moment().format(dateFormat)) : "Untitled"; +function makeFilenameUnique(filename) { + let i = 1, newName = filename; + while (app.metadataCache.getFirstLinkpathDest(newName, "")) { + if (i === 1) + newName += ` ${i}`; + else + newName = newName.slice(0, -2) + ` ${i}`; + i++; + } + return newName; +} +async function resolveThreadingContentTemplate(writeBCsInline, templatePath, oppField, currFile, crumb) { + let newContent = crumb; + if (templatePath) { + const templateFile = app.metadataCache.getFirstLinkpathDest(templatePath, ""); + const template = await app.vault.cachedRead(templateFile); + newContent = template.replace(/\{\{BC-thread-crumb\}\}/i, writeBCsInline ? `${oppField}:: [[${currFile.basename}]]` : `${oppField}: ['${currFile.basename}']`); + } + return newContent; +} +async function thread(plugin, field) { + var _a; + const { settings } = plugin; + const { + userHiers, + threadingTemplate, + dateFormat, + threadIntoNewPane, + threadingDirTemplates, + threadUnderCursor, + writeBCsInline + } = settings; + const currFile = getCurrFile(); + if (!currFile) + return; + const newFileParent = app.fileManager.getNewFileParent(currFile.path); + const dir = getFieldInfo(userHiers, field).fieldDir; + const oppField = getOppFields(userHiers, field, dir)[0]; + let newBasename = resolveThreadingNameTemplate(threadingTemplate, currFile, field, dir, dateFormat); + newBasename = makeFilenameUnique(newBasename); + const oppCrumb = writeBCsInline ? `${oppField}:: [[${currFile.basename}]]` : `--- +${oppField}: ['${currFile.basename}'] +---`; + const templatePath = threadingDirTemplates[dir]; + const newContent = await resolveThreadingContentTemplate(writeBCsInline, templatePath, oppField, currFile, oppCrumb); + const newFile = await app.vault.create((0, import_obsidian18.normalizePath)(`${newFileParent.path}/${newBasename}.md`), newContent); + if (!writeBCsInline) { + const { api } = (_a = app.plugins.plugins.metaedit) != null ? _a : {}; + if (!api) { + new import_obsidian18.Notice("Metaedit must be enabled to write to yaml. Alternatively, toggle the setting `Write Breadcrumbs Inline` to use Dataview inline fields instead."); + return; + } + await createOrUpdateYaml(field, newFile.basename, currFile, app.metadataCache.getFileCache(currFile).frontmatter, api); + } else { + const crumb = `${field}:: [[${newFile.basename}]]`; + const { editor } = app.workspace.activeLeaf.view; + if (threadUnderCursor || !editor) { + editor.replaceRange(crumb, editor.getCursor()); + } else { + let content = await app.vault.read(currFile); + const splits = splitAtYaml2(content); + content = splits[0] + (splits[0].length ? "\n" : "") + crumb + (splits[1].length ? "\n" : "") + splits[1]; + await app.vault.modify(currFile, content); + } + } + const leaf = threadIntoNewPane ? app.workspace.getLeaf(true) : app.workspace.activeLeaf; + await leaf.openFile(newFile, { active: true, mode: "source" }); + if (templatePath) { + if (app.plugins.plugins["templater-obsidian"]) { + app.commands.executeCommandById("templater-obsidian:replace-in-file-templater"); + } else { + new import_obsidian18.Notice("The Templater plugin must be enabled to resolve the templates in the new note"); + } + } + if (threadingTemplate) { + const editor = leaf.view.editor; + editor.setCursor(editor.getValue().length); + } else { + const noteNameInputs = document.getElementsByClassName("view-header-title"); + const newNoteInputEl = Array.from(noteNameInputs).find((input) => input.innerText === newBasename); + newNoteInputEl.innerText = ""; + newNoteInputEl.focus(); + } +} + +// src/Commands/WriteBCs.ts +var import_loglevel17 = __toESM(require_loglevel()); +var import_obsidian19 = require("obsidian"); +async function writeBCToFile(plugin, currFile) { + const { settings, mainG } = plugin; + const file = currFile != null ? currFile : getCurrFile(); + const { limitWriteBCCheckboxes, writeBCsInline, userHiers } = settings; + const succInfo = mainG.mapInEdges(file.basename, (k, a2, s, t) => { + const { field, dir } = a2; + const oppField = getOppFields(userHiers, field, dir)[0]; + return { succ: s, field: oppField }; + }); + for (const { succ, field } of succInfo) { + if (!limitWriteBCCheckboxes.includes(field)) + return; + const content = await app.vault.read(file); + const [yaml, afterYaml] = splitAtYaml2(content); + if (!writeBCsInline) { + const inner = yaml === "" ? yaml : yaml.slice(4, -4); + const newYaml = changeYaml(inner, field, succ); + const newContent = `--- +${newYaml} +---${afterYaml}`; + await app.vault.modify(file, newContent); + } else { + const newContent = yaml + (yaml.length ? "\n" : "") + `${field}:: [[${succ}]]` + (afterYaml.length ? "\n" : "") + afterYaml; + await app.vault.modify(file, newContent); + } + } +} +async function writeBCsToAllFiles(plugin) { + if (!plugin.settings.showWriteAllBCsCmd) { + new import_obsidian19.Notice("You first need to enable this command in Breadcrumbs' settings."); + return; + } + if (window.confirm("This action will write the implied Breadcrumbs of each file to that file.\nIt uses the MetaEdit plugins API to update the YAML, so it should only affect that frontmatter of your note.\nI can't promise that nothing bad will happen. **This operation cannot be undone**.")) { + if (window.confirm("Are you sure? You have been warned that this operation will attempt to update all files with implied breadcrumbs.")) { + if (window.confirm("For real, please make a back up before.")) { + const notice = new import_obsidian19.Notice("Operation Started"); + const problemFiles = []; + for (const file of app.vault.getMarkdownFiles()) { + try { + await writeBCToFile(plugin, file); + } catch (e) { + problemFiles.push(file.path); + } + } + notice.setMessage("Operation Complete"); + if (problemFiles.length) { + new import_obsidian19.Notice("Some files were not updated due to errors. Check the console to see which ones."); + (0, import_loglevel17.warn)({ problemFiles }); + } + } + } + } +} + +// src/FieldSuggestor.ts +var import_obsidian20 = require("obsidian"); +var FieldSuggestor = class extends import_obsidian20.EditorSuggest { + constructor(plugin) { + super(app); + this.getSuggestions = (context) => { + const { query } = context; + return BC_FIELDS_INFO.map((sug) => sug.field).filter((sug) => sug.includes(query)); + }; + this.plugin = plugin; + } + onTrigger(cursor, editor, _) { + var _a; + const sub = editor.getLine(cursor.line).substring(0, cursor.ch); + const match = (_a = sub.match(/^BC-(.*)$/)) == null ? void 0 : _a[1]; + if (match !== void 0) { + return { + end: cursor, + start: { + ch: sub.lastIndexOf(match), + line: cursor.line + }, + query: match + }; + } + return null; + } + renderSuggestion(suggestion, el) { + var _a; + el.createDiv({ + text: suggestion.replace("BC-", ""), + cls: "BC-suggester-container", + attr: { + "aria-label": (_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) == null ? void 0 : _a.desc, + "aria-label-position": "right" + } + }); + } + selectSuggestion(suggestion) { + const { context, plugin } = this; + if (!context) + return; + const field = BC_FIELDS_INFO.find((f) => f.field === suggestion); + const replacement = `${suggestion}${field == null ? void 0 : field[isInsideYaml(app) ? "afterYaml" : "afterInline"]}`; + context.editor.replaceRange(replacement, { ch: 0, line: context.start.line }, context.end); + } +}; + +// src/RelationSuggestor.ts +var import_obsidian21 = require("obsidian"); +var RelationSuggestor = class extends import_obsidian21.EditorSuggest { + constructor(plugin) { + super(app); + this.getSuggestions = (context) => { + const { query } = context; + const { userHiers } = this.plugin.settings; + return getFields(userHiers).filter((sug) => sug.includes(query)); + }; + this.plugin = plugin; + } + onTrigger(cursor, editor, _) { + var _a; + const trig = this.plugin.settings.relSuggestorTrigger; + const sub = editor.getLine(cursor.line).substring(0, cursor.ch); + const regex = new RegExp(`.*?${escapeRegex(trig)}(.*)$`); + const match = (_a = regex.exec(sub)) == null ? void 0 : _a[1]; + if (match === void 0) + return null; + return { + start: { + ch: sub.lastIndexOf(trig), + line: cursor.line + }, + end: cursor, + query: match + }; + } + renderSuggestion(suggestion, el) { + el.createDiv({ + text: suggestion, + cls: "codeblock-suggestion" + }); + } + selectSuggestion(suggestion) { + const { context, plugin } = this; + if (!context) + return; + const trig = plugin.settings.relSuggestorTrigger; + const { start: start2, end, editor } = context; + const replacement = suggestion + (isInsideYaml(app) ? ": " : ":: ") + "[["; + editor.replaceRange(replacement, { ch: start2.ch + 1 - trig.length, line: start2.line }, end); + } +}; + +// src/Settings/BreadcrumbsSettingTab.ts +var import_obsidian40 = require("obsidian"); + +// src/Components/KoFi.svelte +function create_fragment11(ctx) { + let script; + let script_src_value; + let t; + let div; + let mounted; + let dispose; + return { + c() { + script = element("script"); + t = space(); + div = element("div"); + attr(script, "type", "text/javascript"); + if (!src_url_equal(script.src, script_src_value = "https://ko-fi.com/widgets/widget_2.js")) + attr(script, "src", script_src_value); + attr(div, "class", "BC-Kofi-button svelte-1j4tt4j"); + }, + m(target, anchor) { + append(document.head, script); + insert(target, t, anchor); + insert(target, div, anchor); + ctx[2](div); + if (!mounted) { + dispose = listen(script, "load", ctx[1]); + mounted = true; + } + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + detach(script); + if (detaching) + detach(t); + if (detaching) + detach(div); + ctx[2](null); + mounted = false; + dispose(); + } + }; +} +function instance11($$self, $$props, $$invalidate) { + let button; + const initializeKofi = () => { + kofiwidget2.init("Support Breadcrumbs development!", "#29abe0", "G2G454TZF"); + $$invalidate(0, button.innerHTML = kofiwidget2.getHTML(), button); + }; + function div_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + button = $$value; + $$invalidate(0, button); + }); + } + return [button, initializeKofi, div_binding]; +} +var KoFi = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance11, create_fragment11, safe_not_equal, {}); + } +}; +var KoFi_default = KoFi; + +// src/Settings/CreateIndexSettings.ts +var import_obsidian22 = require("obsidian"); +function addCreateIndexSettings(plugin, cmdsDetails) { + const { settings } = plugin; + const createIndexDetails = subDetails("Create Index", cmdsDetails); + new import_obsidian22.Setting(createIndexDetails).setName("Add wiklink brackets").setDesc(fragWithHTML("When creating an index, should it wrap the note name in wikilinks [[]] or not.\n\u2705 = yes, \u274C = no.")).addToggle((toggle) => toggle.setValue(settings.wikilinkIndex).onChange(async (value) => { + settings.wikilinkIndex = value; + await plugin.saveSettings(); + })); + new import_obsidian22.Setting(createIndexDetails).setName("Indent Character").setDesc(fragWithHTML("The character(s) used to indent the index. These can be anything you want, but will usually be either spaces or tabs. Enter \\t to use tabs.")).addText((text2) => { + text2.setValue(settings.createIndexIndent).onChange(async (value) => { + settings.createIndexIndent = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian22.Setting(createIndexDetails).setName("Show aliases of notes in index").setDesc("Show the aliases of each note in brackets.\n\u2705 = yes, \u274C = no.").addToggle((toggle) => toggle.setValue(settings.aliasesInIndex).onChange(async (value) => { + settings.aliasesInIndex = value; + await plugin.saveSettings(); + })); +} + +// src/Settings/CSVSettings.ts +var import_obsidian23 = require("obsidian"); +function addCSVSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const csvDetails = subDetails("CSV Notes", alternativeHierarchyDetails); + new import_obsidian23.Setting(csvDetails).setName("CSV Breadcrumb Paths").setDesc("The file path of a csv files with breadcrumbs information.").addText((text2) => { + text2.setValue(settings.CSVPaths); + text2.inputEl.onblur = async () => { + settings.CSVPaths = text2.inputEl.value; + await plugin.saveSettings(); + }; + }); +} + +// src/Settings/DataviewNoteSettings.ts +var import_obsidian24 = require("obsidian"); +function addDataviewSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + const dvDetails = subDetails("Dataview Notes", alternativeHierarchyDetails); + new import_obsidian24.Setting(dvDetails).setName("Default Dataview Note Field").setDesc(fragWithHTML("By default, Dataview notes use the first field in your hierarchies (usually an \u2191 field). Choose a different one to use by default, without having to specify BC-dataview-note-field: {field}.
If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => { + fields.forEach((field) => dd.addOption(field, field)); + dd.addOption("", "").setValue(settings.dataviewNoteField).onChange(async (field) => { + settings.dataviewNoteField = field; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Settings/DateNoteSettings.ts +var import_obsidian25 = require("obsidian"); +function addDateNoteSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + const fieldOptions = { "": "" }; + fields.forEach((field) => fieldOptions[field] = field); + const dateNoteDetails = subDetails("Date Notes", alternativeHierarchyDetails); + new import_obsidian25.Setting(dateNoteDetails).setName("Add Date Notes to Graph").setDesc("Breadcrumbs will try to link each daily note to the next one using the date format you provide in the settings below.").addToggle((toggle) => { + toggle.setValue(settings.addDateNotes).onChange(async (value) => { + settings.addDateNotes = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); + new import_obsidian25.Setting(dateNoteDetails).setName("Daily Note Format").setDesc(fragWithHTML(`The Luxon date format of your daily notes.
Note: Luxon uses different formats to Moment, so your format for the Daily Notes plugin may not work here. Be sure to check out the docs to find the right format.
You can escape characters by wrapping them in single quotes (e.g. yyyy-MM-dd 'Daily Note')`)).addText((text2) => { + text2.setValue(settings.dateNoteFormat); + text2.inputEl.onblur = async () => { + settings.dateNoteFormat = text2.getValue(); + await plugin.saveSettings(); + await refreshIndex(plugin); + }; + }); + new import_obsidian25.Setting(dateNoteDetails).setName("Date Note Field").setDesc(fragWithHTML("Select a field to point to tomorrow's note from the current note. The opposite field will be used to point to yesterday's note.")).addDropdown((dd) => { + dd.addOptions(fieldOptions).setValue(settings.dateNoteField).onChange(async (field) => { + settings.dateNoteField = field; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Settings/DebuggingSettings.ts +var import_loglevel18 = __toESM(require_loglevel()); +var import_obsidian26 = require("obsidian"); +function addDebuggingsSettings(plugin, containerEl) { + const { settings } = plugin; + const debugDetails = details("Debugging", containerEl); + new import_obsidian26.Setting(debugDetails).setName("Debug Mode").setDesc(fragWithHTML("Set the minimum level of debug messages to console log. If you choose TRACE, then everything will be logged. If you choose ERROR, then only the most necessary issues will be logged. SILENT will turn off all logs.")).addDropdown((dd) => { + Object.keys(import_loglevel18.default.levels).forEach((key) => dd.addOption(key, key)); + dd.setValue(settings.debugMode).onChange(async (value) => { + import_loglevel18.default.setLevel(value); + settings.debugMode = value; + await plugin.saveSettings(); + }); + }); + debugDetails.createEl("button", { text: "Console log settings" }, (el) => { + el.addEventListener("click", () => console.log(settings)); + }); +} + +// src/Settings/DendronSettings.ts +var import_obsidian27 = require("obsidian"); +function addDendronSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + const dendronDetails = subDetails("Dendron Notes", alternativeHierarchyDetails); + new import_obsidian27.Setting(dendronDetails).setName("Add Dendron notes to graph").setDesc(fragWithHTML("Dendron notes create a hierarchy using note names.
nmath.algebra is a note about algebra, whose parent is math.
nmath.calculus.limits is a note about limits whose parent is the note math.calculus, the parent of which is math.")).addToggle((toggle) => toggle.setValue(settings.addDendronNotes).onChange(async (value) => { + settings.addDendronNotes = value; + await plugin.saveSettings(); + })); + new import_obsidian27.Setting(dendronDetails).setName("Delimiter").setDesc(fragWithHTML("Which delimiter should Breadcrumbs look for? The default is ..")).addText((text2) => { + text2.setPlaceholder("Delimiter").setValue(settings.dendronNoteDelimiter); + text2.inputEl.onblur = async () => { + const value = text2.getValue(); + if (value) + settings.dendronNoteDelimiter = value; + else { + new import_obsidian27.Notice(`The delimiter can't be blank`); + settings.dendronNoteDelimiter = DEFAULT_SETTINGS.dendronNoteDelimiter; + } + await plugin.saveSettings(); + }; + }); + new import_obsidian27.Setting(dendronDetails).setName("Trim Dendron Note Names").setDesc(fragWithHTML("When displaying a dendron note name, should it be trimmed to only show the last item in the chain?
e.g. A.B.C \u2192 C.")).addToggle((toggle) => toggle.setValue(settings.trimDendronNotes).onChange(async (value) => { + settings.trimDendronNotes = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian27.Setting(dendronDetails).setName("Dendron Note Field").setDesc("Which field should Breadcrumbs use for Dendron notes?").addDropdown((dd) => { + fields.forEach((field) => dd.addOption(field, field)); + dd.setValue(settings.dendronNoteField); + dd.onChange(async (value) => { + settings.dendronNoteField = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Settings/GeneralSettings.ts +var import_obsidian28 = require("obsidian"); +function addGeneralSettings(plugin, containerEl) { + const { settings } = plugin; + const generalDetails = details("General Options", containerEl); + new import_obsidian28.Setting(generalDetails).setName("Refresh Index on Note Change").setDesc(fragWithHTML("Refresh the Breadcrumbs index data everytime you change notes.
Note: This can be very slow on large vaults.")).addToggle((toggle) => toggle.setValue(settings.refreshOnNoteChange).onChange(async (value) => { + settings.refreshOnNoteChange = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Refresh Index On Note Save").addToggle((toggle) => toggle.setValue(settings.refreshOnNoteSave).onChange(async (value) => { + settings.refreshOnNoteSave = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Show Refresh Index Notice").setDesc("When Refreshing Index, should it show a notice once the operation is complete?").addToggle((toggle) => toggle.setValue(settings.showRefreshNotice).onChange(async (value) => { + settings.showRefreshNotice = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Alias Fields").setDesc(fragWithHTML("A comma-separated list of fields used to specify aliases. These fields will be checked, in order, to display an alternate note title in different views.
This field will probably be alias or aliases, but it can be anything, like title.")).addText((text2) => { + text2.setValue(settings.altLinkFields.join(", ")); + text2.inputEl.onblur = async () => { + settings.altLinkFields = splitAndTrim(text2.getValue()); + await plugin.saveSettings(); + }; + }); + new import_obsidian28.Setting(generalDetails).setName("Only show first alias").setDesc("If a note has an alias (using the fields in the setting above), should only the first one be shown?").addToggle((toggle) => toggle.setValue(!settings.showAllAliases).onChange(async (value) => { + settings.showAllAliases = !value; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + new import_obsidian28.Setting(generalDetails).setName("Use yaml or inline fields for hierarchy data").setDesc("If enabled, Breadcrumbs will make it's hierarchy using yaml fields, and inline Dataview fields.\nIf this is disabled, it will only use Juggl links (See below).").addToggle((toggle) => toggle.setValue(settings.useAllMetadata).onChange(async (value) => { + settings.useAllMetadata = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + new import_obsidian28.Setting(generalDetails).setName("Use Juggl link syntax without having Juggl installed.").setDesc(fragWithHTML(`Should Breadcrumbs look for Juggl links even if you don't have Juggl installed? If you do have Juggl installed, it will always look for Juggl links.`)).addToggle((toggle) => toggle.setValue(settings.parseJugglLinksWithoutJuggl).onChange(async (value) => { + settings.parseJugglLinksWithoutJuggl = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Enable Field Suggestor").setDesc(fragWithHTML("Alot of Breadcrumbs features require a metadata (or inline Dataview) field to work. For example, `BC-folder-note`.
The Field Suggestor will show an autocomplete menu with all available Breadcrumbs field options when you type BC- at the start of a line.")).addToggle((toggle) => toggle.setValue(settings.fieldSuggestor).onChange(async (value) => { + settings.fieldSuggestor = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Enable Relation Suggestor").setDesc(fragWithHTML("Enable an editor suggestor which gets triggered by a custom string to show a list of relations from your hierarchies to insert.")).addToggle((toggle) => toggle.setValue(settings.enableRelationSuggestor).onChange(async (value) => { + settings.enableRelationSuggestor = value; + await plugin.saveSettings(); + })); + new import_obsidian28.Setting(generalDetails).setName("Relation Suggestor Trigger").setDesc(fragWithHTML("The string used to trigger the relation suggestor. Default is \\.")).addText((text2) => text2.setValue(settings.relSuggestorTrigger).onChange(async (value) => { + settings.relSuggestorTrigger = value; + await plugin.saveSettings(); + })); + if (app.plugins.plugins.dataview !== void 0) { + new import_obsidian28.Setting(generalDetails).setName("Dataview Wait Time").setDesc("Enter an integer number of seconds to wait for the Dataview Index to load. The larger your vault, the longer it will take. The default is 5 seconds.").addText((text2) => text2.setPlaceholder("Seconds").setValue((settings.dvWaitTime / 1e3).toString()).onChange(async (value) => { + const num = Number(value); + if (num > 0) { + settings.dvWaitTime = num * 1e3; + await plugin.saveSettings(); + } else { + new import_obsidian28.Notice("The interval must be a non-negative number"); + } + })); + } +} + +// src/Settings/HierarchyNoteSettings.ts +var import_obsidian29 = require("obsidian"); +function addHierarchyNoteSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const hierarchyNoteDetails = subDetails("Hierarchy Notes", alternativeHierarchyDetails); + new import_obsidian29.Setting(hierarchyNoteDetails).setName("Hierarchy Note(s)").setDesc(fragWithHTML("A comma-separated list of notes used to create external Breadcrumb structures.
You can also point to a folder of hierarchy notes by entering folderName/ (ending with a /).
Hierarchy note names and folders of hierarchy notes can both be entered in the same comma-separated list.")).addText((text2) => { + text2.setPlaceholder("Hierarchy Note(s)").setValue(settings.hierarchyNotes.join(", ")); + text2.inputEl.onblur = async () => { + const splits = splitAndTrim(text2.getValue()); + settings.hierarchyNotes = splits; + await plugin.saveSettings(); + }; + }); + new import_obsidian29.Setting(hierarchyNoteDetails).setName("Hierarchy note is parent of top-level items").setDesc("Should the actual hierarchy note be treated as the parent of all the top-level items in the list? \u2705 = Yes, \u274C = No").addToggle((toggle) => { + toggle.setValue(settings.hierarchyNoteIsParent).onChange(async (value) => { + settings.hierarchyNoteIsParent = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); + new import_obsidian29.Setting(hierarchyNoteDetails).setName("Default Hierarchy Note Field").setDesc(fragWithHTML("By default, hierarchy notes use the first up field in your hierarchies. Choose a different one to use by default. If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => { + const upFields = getFields(settings.userHiers, "up"); + const options = {}; + upFields.forEach((field) => options[field] = field); + dd.addOptions(options).setValue(settings.HNUpField || upFields[0]).onChange(async (field) => { + settings.HNUpField = field; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Components/UserHierarchies.svelte +var import_obsidian30 = require("obsidian"); + +// node_modules/svelte-icons/components/IconBase.svelte +function create_if_block7(ctx) { + let title_1; + let t; + return { + c() { + title_1 = svg_element("title"); + t = text(ctx[0]); + }, + m(target, anchor) { + insert(target, title_1, anchor); + append(title_1, t); + }, + p(ctx2, dirty) { + if (dirty & 1) + set_data(t, ctx2[0]); + }, + d(detaching) { + if (detaching) + detach(title_1); + } + }; +} +function create_fragment12(ctx) { + let svg; + let if_block_anchor; + let current; + let if_block = ctx[0] && create_if_block7(ctx); + const default_slot_template = ctx[3].default; + const default_slot = create_slot(default_slot_template, ctx, ctx[2], null); + return { + c() { + svg = svg_element("svg"); + if (if_block) + if_block.c(); + if_block_anchor = empty(); + if (default_slot) + default_slot.c(); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr(svg, "viewBox", ctx[1]); + attr(svg, "class", "svelte-c8tyih"); + }, + m(target, anchor) { + insert(target, svg, anchor); + if (if_block) + if_block.m(svg, null); + append(svg, if_block_anchor); + if (default_slot) { + default_slot.m(svg, null); + } + current = true; + }, + p(ctx2, [dirty]) { + if (ctx2[0]) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block7(ctx2); + if_block.c(); + if_block.m(svg, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + if (default_slot) { + if (default_slot.p && (!current || dirty & 4)) { + update_slot_base(default_slot, default_slot_template, ctx2, ctx2[2], !current ? get_all_dirty_from_scope(ctx2[2]) : get_slot_changes(default_slot_template, ctx2[2], dirty, null), null); + } + } + if (!current || dirty & 2) { + attr(svg, "viewBox", ctx2[1]); + } + }, + i(local) { + if (current) + return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(svg); + if (if_block) + if_block.d(); + if (default_slot) + default_slot.d(detaching); + } + }; +} +function instance12($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + let { title = null } = $$props; + let { viewBox } = $$props; + $$self.$$set = ($$props2) => { + if ("title" in $$props2) + $$invalidate(0, title = $$props2.title); + if ("viewBox" in $$props2) + $$invalidate(1, viewBox = $$props2.viewBox); + if ("$$scope" in $$props2) + $$invalidate(2, $$scope = $$props2.$$scope); + }; + return [title, viewBox, $$scope, slots]; +} +var IconBase = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance12, create_fragment12, safe_not_equal, { title: 0, viewBox: 1 }); + } +}; +var IconBase_default = IconBase; + +// node_modules/svelte-icons/fa/FaListUl.svelte +function create_default_slot(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment13(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 512 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance13($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaListUl = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance13, create_fragment13, safe_not_equal, {}); + } +}; +var FaListUl_default = FaListUl; + +// node_modules/svelte-icons/fa/FaPlus.svelte +function create_default_slot2(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment14(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot2] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance14($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaPlus = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance14, create_fragment14, safe_not_equal, {}); + } +}; +var FaPlus_default = FaPlus; + +// node_modules/svelte-icons/fa/FaRegTrashAlt.svelte +function create_default_slot3(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment15(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot3] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance15($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaRegTrashAlt = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance15, create_fragment15, safe_not_equal, {}); + } +}; +var FaRegTrashAlt_default = FaRegTrashAlt; + +// src/Components/UserHierarchies.svelte +function get_each_context6(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + child_ctx[15] = i; + return child_ctx; +} +function get_each_context_15(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[16] = list[i]; + return child_ctx; +} +function create_each_block_15(ctx) { + let div; + let label; + let t0_value = ARROW_DIRECTIONS[ctx[16]] + ""; + let t0; + let label_for_value; + let t1; + let input; + let input_name_value; + let input_value_value; + let mounted; + let dispose; + function change_handler(...args) { + return ctx[11](ctx[15], ctx[16], ...args); + } + return { + c() { + var _a, _b; + div = element("div"); + label = element("label"); + t0 = text(t0_value); + t1 = space(); + input = element("input"); + attr(label, "class", "BC-Arrow-Label svelte-1e9on6f"); + attr(label, "for", label_for_value = ctx[16]); + attr(input, "type", "text"); + attr(input, "size", "20"); + attr(input, "name", input_name_value = ctx[16]); + input.value = input_value_value = (_b = (_a = ctx[13][ctx[16]]) == null ? void 0 : _a.join(", ")) != null ? _b : ""; + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, label); + append(label, t0); + append(div, t1); + append(div, input); + if (!mounted) { + dispose = listen(input, "change", change_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + var _a, _b; + ctx = new_ctx; + if (dirty & 2 && input_value_value !== (input_value_value = (_b = (_a = ctx[13][ctx[16]]) == null ? void 0 : _a.join(", ")) != null ? _b : "") && input.value !== input_value_value) { + input.value = input_value_value; + } + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + dispose(); + } + }; +} +function create_each_block6(ctx) { + let details2; + let summary; + let t0_value = DIRECTIONS.map(func).map(func_1).join(" ") + ""; + let t0; + let t1; + let span; + let button0; + let t3; + let button1; + let t5; + let button2; + let t7; + let t8; + let mounted; + let dispose; + function func(...args) { + return ctx[7](ctx[13], ...args); + } + function click_handler_3() { + return ctx[8](ctx[15]); + } + function click_handler_4() { + return ctx[9](ctx[15]); + } + function click_handler_5() { + return ctx[10](ctx[15]); + } + let each_value_1 = DIRECTIONS; + let each_blocks = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_15(get_each_context_15(ctx, each_value_1, i)); + } + return { + c() { + details2 = element("details"); + summary = element("summary"); + t0 = text(t0_value); + t1 = space(); + span = element("span"); + button0 = element("button"); + button0.textContent = "\u2191"; + t3 = space(); + button1 = element("button"); + button1.textContent = "\u2193"; + t5 = space(); + button2 = element("button"); + button2.textContent = "X"; + t7 = space(); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t8 = space(); + attr(button0, "aria-label", "Swap with Hierarchy Above"); + attr(button0, "class", "svelte-1e9on6f"); + attr(button1, "aria-label", "Swap with Hierarchy Below"); + attr(button1, "class", "svelte-1e9on6f"); + attr(button2, "aria-label", "Remove Hierarchy"); + attr(button2, "class", "svelte-1e9on6f"); + attr(span, "class", "BC-Buttons"); + attr(summary, "class", "svelte-1e9on6f"); + attr(details2, "class", "BC-Hier-Details svelte-1e9on6f"); + }, + m(target, anchor) { + insert(target, details2, anchor); + append(details2, summary); + append(summary, t0); + append(summary, t1); + append(summary, span); + append(span, button0); + append(span, t3); + append(span, button1); + append(span, t5); + append(span, button2); + append(details2, t7); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(details2, null); + } + append(details2, t8); + if (!mounted) { + dispose = [ + listen(button0, "click", click_handler_3), + listen(button1, "click", click_handler_4), + listen(button2, "click", click_handler_5) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 2 && t0_value !== (t0_value = DIRECTIONS.map(func).map(func_1).join(" ") + "")) + set_data(t0, t0_value); + if (dirty & 15) { + each_value_1 = DIRECTIONS; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_15(ctx, each_value_1, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_15(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(details2, t8); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_1.length; + } + }, + d(detaching) { + if (detaching) + detach(details2); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment16(ctx) { + let div4; + let div3; + let button0; + let div0; + let faplus; + let t0; + let button1; + let div1; + let faregtrashalt; + let t1; + let button2; + let div2; + let falistul; + let t2; + let current; + let mounted; + let dispose; + faplus = new FaPlus_default({}); + faregtrashalt = new FaRegTrashAlt_default({}); + falistul = new FaListUl_default({}); + let each_value = ctx[1]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block6(get_each_context6(ctx, each_value, i)); + } + return { + c() { + div4 = element("div"); + div3 = element("div"); + button0 = element("button"); + div0 = element("div"); + create_component(faplus.$$.fragment); + t0 = space(); + button1 = element("button"); + div1 = element("div"); + create_component(faregtrashalt.$$.fragment); + t1 = space(); + button2 = element("button"); + div2 = element("div"); + create_component(falistul.$$.fragment); + t2 = space(); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(div0, "class", "icon svelte-1e9on6f"); + attr(button0, "aria-label", "Add New Hierarchy"); + attr(div1, "class", "icon svelte-1e9on6f"); + attr(button1, "aria-label", "Reset All Hierarchies"); + attr(div2, "class", "icon svelte-1e9on6f"); + attr(button2, "aria-label", "Show Hierarchies"); + attr(div3, "class", "BC-Buttons svelte-1e9on6f"); + }, + m(target, anchor) { + insert(target, div4, anchor); + append(div4, div3); + append(div3, button0); + append(button0, div0); + mount_component(faplus, div0, null); + append(div3, t0); + append(div3, button1); + append(button1, div1); + mount_component(faregtrashalt, div1, null); + append(div3, t1); + append(div3, button2); + append(button2, div2); + mount_component(falistul, div2, null); + append(div4, t2); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div4, null); + } + current = true; + if (!mounted) { + dispose = [ + listen(button0, "click", ctx[4]), + listen(button1, "click", ctx[5]), + listen(button2, "click", ctx[6]) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 15) { + each_value = ctx2[1]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context6(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block6(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div4, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i(local) { + if (current) + return; + transition_in(faplus.$$.fragment, local); + transition_in(faregtrashalt.$$.fragment, local); + transition_in(falistul.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(faplus.$$.fragment, local); + transition_out(faregtrashalt.$$.fragment, local); + transition_out(falistul.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div4); + destroy_component(faplus); + destroy_component(faregtrashalt); + destroy_component(falistul); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +var func_1 = (dirFields) => `(${dirFields})`; +function instance16($$self, $$props, $$invalidate) { + var __awaiter = this && this.__awaiter || function(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()); + }); + }; + let { plugin } = $$props; + const { settings } = plugin; + let currHiers = [...plugin.settings.userHiers]; + function update2(currHiers2) { + return __awaiter(this, void 0, void 0, function* () { + $$invalidate(0, plugin.settings.userHiers = currHiers2, plugin); + yield plugin.saveSettings(); + }); + } + const click_handler = async () => $$invalidate(1, currHiers = [...currHiers, blankUserHier()]); + const click_handler_1 = async () => { + if (window.confirm("Are you sure you want to reset all hierarchies?")) { + $$invalidate(1, currHiers = []); + await update2(currHiers); + } + }; + const click_handler_2 = () => new import_obsidian30.Notice(currHiers.map(hierToStr).join("\n\n")); + const func = (hier, dir) => { + var _a, _b; + return (_b = (_a = hier[dir]) == null ? void 0 : _a.join(", ")) != null ? _b : ""; + }; + const click_handler_3 = async (i) => { + $$invalidate(1, currHiers = swapItems(i, i - 1, currHiers)); + await update2(currHiers); + }; + const click_handler_4 = async (i) => { + $$invalidate(1, currHiers = swapItems(i, i + 1, currHiers)); + await update2(currHiers); + }; + const click_handler_5 = async (i) => { + const oldHier = currHiers.splice(i, 1)[0]; + oldHier.up.forEach((upField) => { + const index2 = settings.limitTrailCheckboxes.indexOf(upField); + if (index2 > -1) + settings.limitTrailCheckboxes.splice(index2, 1); + }); + DIRECTIONS.forEach((dir) => { + oldHier[dir].forEach((field) => { + const indexI = settings.limitJumpToFirstFields.indexOf(field); + if (indexI > -1) + settings.limitJumpToFirstFields.splice(indexI, 1); + const indexJ = settings.limitWriteBCCheckboxes.indexOf(field); + if (indexJ > -1) + settings.limitJumpToFirstFields.splice(indexJ, 1); + }); + }); + $$invalidate(1, currHiers); + await update2(currHiers); + }; + const change_handler = async (i, dir, e) => { + const { value } = e.target; + const splits = splitAndTrim(value); + $$invalidate(1, currHiers[i][dir] = splits, currHiers); + await update2(currHiers); + splits.forEach((split) => { + if (dir === "up" && !settings.limitTrailCheckboxes.includes(split)) + settings.limitTrailCheckboxes.push(split); + if (!settings.limitJumpToFirstFields.includes(split)) + settings.limitJumpToFirstFields.push(split); + if (!settings.limitWriteBCCheckboxes.includes(split)) + settings.limitWriteBCCheckboxes.push(split); + }); + await plugin.saveSettings(); + }; + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(0, plugin = $$props2.plugin); + }; + return [ + plugin, + currHiers, + settings, + update2, + click_handler, + click_handler_1, + click_handler_2, + func, + click_handler_3, + click_handler_4, + click_handler_5, + change_handler + ]; +} +var UserHierarchies = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance16, create_fragment16, safe_not_equal, { plugin: 0 }); + } +}; +var UserHierarchies_default = UserHierarchies; + +// src/Settings/HierarchySettings.ts +function addHierarchySettings(plugin, containerEl) { + const fieldDetails = details("Hierarchies", containerEl); + fieldDetails.createEl("p", { + text: "Here you can set up different hierarchies you use in your vault. To add a new hierarchy, click the plus button. Then, fill in the field names of your hierachy into the 5 boxes that appear." + }); + fieldDetails.createEl("p", { + text: "For each direction, you can enter multiple field names in a comma-seperated list. For example: `parent, broader, upper`" + }); + new UserHierarchies_default({ + target: fieldDetails, + props: { plugin } + }); +} + +// src/Components/Checkboxes.svelte +var import_loglevel19 = __toESM(require_loglevel()); +function get_each_context7(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[12] = list[i]; + return child_ctx; +} +function create_each_block7(ctx) { + let div; + let label; + let input; + let input_value_value; + let t0; + let t1_value = ctx[12] + ""; + let t1; + let t2; + let mounted; + let dispose; + return { + c() { + div = element("div"); + label = element("label"); + input = element("input"); + t0 = space(); + t1 = text(t1_value); + t2 = space(); + attr(input, "type", "checkbox"); + input.__value = input_value_value = ctx[12]; + input.value = input.__value; + ctx[8][0].push(input); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, label); + append(label, input); + input.checked = ~ctx[1].indexOf(input.__value); + append(label, t0); + append(label, t1); + append(div, t2); + if (!mounted) { + dispose = [ + listen(input, "change", ctx[7]), + listen(input, "change", ctx[9]) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty & 1 && input_value_value !== (input_value_value = ctx2[12])) { + input.__value = input_value_value; + input.value = input.__value; + } + if (dirty & 2) { + input.checked = ~ctx2[1].indexOf(input.__value); + } + if (dirty & 1 && t1_value !== (t1_value = ctx2[12] + "")) + set_data(t1, t1_value); + }, + d(detaching) { + if (detaching) + detach(div); + ctx[8][0].splice(ctx[8][0].indexOf(input), 1); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment17(ctx) { + let div0; + let button; + let t0; + let t1_value = ctx[2] ? "None" : "All"; + let t1; + let t2; + let div1; + let mounted; + let dispose; + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block7(get_each_context7(ctx, each_value, i)); + } + return { + c() { + div0 = element("div"); + button = element("button"); + t0 = text("Select "); + t1 = text(t1_value); + t2 = space(); + div1 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(div1, "class", "grid svelte-d1my4i"); + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, button); + append(button, t0); + append(button, t1); + insert(target, t2, anchor); + insert(target, div1, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + if (!mounted) { + dispose = listen(button, "click", ctx[6]); + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 4 && t1_value !== (t1_value = ctx2[2] ? "None" : "All")) + set_data(t1, t1_value); + if (dirty & 11) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context7(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block7(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div1, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div0); + if (detaching) + detach(t2); + if (detaching) + detach(div1); + destroy_each(each_blocks, detaching); + mounted = false; + dispose(); + } + }; +} +function instance17($$self, $$props, $$invalidate) { + let toNone; + var __awaiter = this && this.__awaiter || function(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()); + }); + }; + let { plugin } = $$props; + let { settingName } = $$props; + let { options } = $$props; + const { settings } = plugin; + let selected = settings[settingName]; + function save() { + return __awaiter(this, void 0, void 0, function* () { + if (settings[settingName] === void 0) + return (0, import_loglevel19.warn)(settingName + " not found in BC settings"); + settings[settingName] = selected; + yield plugin.saveSettings(); + yield refreshIndex(plugin); + }); + } + const $$binding_groups = [[]]; + const click_handler = async () => { + if (toNone) + $$invalidate(1, selected = []); + else + $$invalidate(1, selected = options); + await save(); + }; + function input_change_handler() { + selected = get_binding_group_value($$binding_groups[0], this.__value, this.checked); + $$invalidate(1, selected); + } + const change_handler = async () => await save(); + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(4, plugin = $$props2.plugin); + if ("settingName" in $$props2) + $$invalidate(5, settingName = $$props2.settingName); + if ("options" in $$props2) + $$invalidate(0, options = $$props2.options); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 2) { + $: + $$invalidate(2, toNone = selected.length === 0 ? false : true); + } + }; + return [ + options, + selected, + toNone, + save, + plugin, + settingName, + click_handler, + input_change_handler, + $$binding_groups, + change_handler + ]; +} +var Checkboxes = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance17, create_fragment17, safe_not_equal, { plugin: 4, settingName: 5, options: 0 }); + } +}; +var Checkboxes_default = Checkboxes; + +// src/Settings/JumpToNextSettings.ts +function addJumpToNextSettings(plugin, viewDetails) { + const { settings } = plugin; + const jumpToDirDetails = subDetails("Jump to Next Direction", viewDetails); + jumpToDirDetails.createDiv({ cls: "setting-item-name", text: "Limit which fields to jump to" }); + new Checkboxes_default({ + target: jumpToDirDetails, + props: { + plugin, + settingName: "limitJumpToFirstFields", + options: getFields(settings.userHiers) + } + }); +} + +// src/Settings/MatrixViewSettings.ts +var import_obsidian31 = require("obsidian"); +function addMatrixViewSettings(plugin, viewDetails) { + const { settings } = plugin; + const MLViewDetails = subDetails("Matrix View", viewDetails); + new import_obsidian31.Setting(MLViewDetails).setName("Show all field names or just relation types").setDesc(fragWithHTML("Show the list of metadata fields for each relation type (e.g. parent, broader, upper), or just the name of the relation type, i.e. 'Parent', 'Sibling', 'Child'.
\u2705 = show the full list.")).addToggle((toggle) => toggle.setValue(settings.showNameOrType).onChange(async (value) => { + settings.showNameOrType = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Show Relationship Type").setDesc(fragWithHTML("Show whether a link is real or implied.")).addToggle((toggle) => toggle.setValue(settings.showRelationType).onChange(async (value) => { + settings.showRelationType = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Directions Order").setDesc(fragWithHTML(`Change the order in which the directions appear in the Matrix view.
The default is "up, same, down, next, prev" (01234). +
    +
  • 0 \u2192 up
  • +
  • 1 \u2192 same
  • +
  • 2 \u2192 down
  • +
  • 3 \u2192 next
  • +
  • 4 \u2192 prev
  • +
+ Note: You can remove numbers to hide those directions in the Matrix View. For example, 02 will only show up and down, in that order.`)).addText((text2) => { + text2.setValue(settings.squareDirectionsOrder.join("")); + text2.inputEl.onblur = async () => { + const value = text2.getValue(); + const values = value.split(""); + if (value.length <= 5 && values.every((value2) => ["0", "1", "2", "3", "4"].includes(value2))) { + settings.squareDirectionsOrder = values.map((order) => Number.parseInt(order)); + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + } else { + new import_obsidian31.Notice('The value must be a 5 digit number using only the digits "0", "1", "2", "3", "4"'); + } + }; + }); + new import_obsidian31.Setting(MLViewDetails).setName("Enable Alpahebtical Sorting").setDesc("By default, items in the Matrix view are sorted by the order they appear in your notes. Toggle this on to enable alphabetical sorting.").addToggle((toggle) => toggle.setValue(settings.enableAlphaSort).onChange(async (value) => { + settings.enableAlphaSort = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Sort Alphabetically Ascending/Descending").setDesc("Sort square items alphabetically in Ascending (\u2705) or Descending (\u274C) order.").addToggle((toggle) => toggle.setValue(settings.alphaSortAsc).onChange(async (value) => { + settings.alphaSortAsc = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Sort by note name, but show alias").setDesc("When this is turned off, notes will first be sorted by their alias, and then by their name if no alias is found. Turn this on to sort by note name always, but still show the alias in the results.").addToggle((toggle) => toggle.setValue(settings.sortByNameShowAlias).onChange(async (value) => { + settings.sortByNameShowAlias = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Show Implied Relations").setDesc("Whether or not to show implied relations at all.").addToggle((toggle) => toggle.setValue(settings.showImpliedRelations).onChange(async (value) => { + settings.showImpliedRelations = value; + await plugin.saveSettings(); + await plugin.getActiveTYPEView(MATRIX_VIEW).draw(); + })); + new import_obsidian31.Setting(MLViewDetails).setName("Open View in Right or Left side").setDesc("When loading the matrix view, should it open on the left or right side leaf? \u2705 = Right, \u274C = Left.").addToggle((toggle) => toggle.setValue(settings.rlLeaf).onChange(async (value) => { + settings.rlLeaf = value; + await plugin.saveSettings(); + app.workspace.detachLeavesOfType(MATRIX_VIEW); + await openView(app, MATRIX_VIEW, MatrixView, value ? "right" : "left"); + })); +} + +// src/Settings/NoSystemSettings.ts +var import_obsidian32 = require("obsidian"); +function addNoSystemSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const { userHiers } = settings; + const fields = getFields(userHiers); + const noSystemDetails = subDetails("Naming System", alternativeHierarchyDetails); + new import_obsidian32.Setting(noSystemDetails).setName("Naming System Regex").setDesc(fragWithHTML("If you name your notes using the Johnny Decimal System or a related system, enter a regular expression matching the longest possible naming system you use. The regex should only match the naming system part of the name, not the actual note title.
For example, if you use the Johnny Decimal System, you might use /^\\d\\.\\d\\.\\w/g to match the note named 1.2.a Cars.
If you don't want to choose a default, select the blank option at the bottom of the list.")).addText((text2) => { + text2.setValue(settings.namingSystemRegex); + text2.inputEl.onblur = async () => { + const value = text2.getValue(); + if (value === "" || strToRegex(value)) { + settings.namingSystemRegex = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + } else { + new import_obsidian32.Notice("Invalid Regex"); + } + }; + }); + new import_obsidian32.Setting(noSystemDetails).setName("Naming System Delimiter").setDesc(fragWithHTML("What character do you use to split up your naming convention? For example, if you use 1.2.a.b, then your delimiter is a period (.).")).addText((text2) => { + text2.setValue(settings.namingSystemSplit); + text2.inputEl.onblur = async () => { + const value = text2.getValue(); + settings.namingSystemSplit = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + }; + }); + new import_obsidian32.Setting(noSystemDetails).setName("Naming System Field").setDesc("Which field should Breadcrumbs use for Naming System notes?").addDropdown((dd) => { + fields.forEach((field) => { + dd.addOption(field, field); + }); + dd.setValue(settings.namingSystemField); + dd.onChange(async (value) => { + settings.namingSystemField = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); + new import_obsidian32.Setting(noSystemDetails).setName("Naming System Ends with Delimiter").setDesc(fragWithHTML("Does your naming convention end with the delimiter? For example, 1.2. Note does end with the delimiter, but 1.2 Note does not.
For matching purposes, it is highly recommended to name your notes with the delimiter on the end. Only turn this setting on if you do name your notes this way, but know that the results may not be as accurate if you don't.")).addToggle((tog) => tog.setValue(settings.namingSystemEndsWithDelimiter).onChange(async (value) => { + settings.namingSystemEndsWithDelimiter = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); +} + +// src/Settings/RegexNoteSettings.ts +var import_obsidian33 = require("obsidian"); +function addRegexNoteSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const regexNoteDetails = subDetails("Regex Notes", alternativeHierarchyDetails); + new import_obsidian33.Setting(regexNoteDetails).setName("Default Regex Note Field").setDesc(fragWithHTML("By default, regex notes use the first field in your hierarchies (usually an \u2191 field). Choose a different one to use by default, without having to specify BC-regex-note-field: {field}.
If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => { + const options = {}; + getFields(settings.userHiers).forEach((field) => options[field] = field); + dd.addOptions(Object.assign(options, { "": "" })).setValue(settings.regexNoteField).onChange(async (field) => { + settings.regexNoteField = field; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Settings/RelationSettings.ts +var import_obsidian34 = require("obsidian"); +function addRelationSettings(plugin, containerEl) { + const { settings } = plugin; + const relationDetails = details("Relationships", containerEl); + function mermaidDiagram(diagramStr) { + import_obsidian34.MarkdownRenderer.renderMarkdown(diagramStr, relationDetails.createDiv(), "", null); + } + relationDetails.createEl("p", { + text: "Here you can toggle on/off different types of implied relationships. All of your explicit (real) relationships will still show, but you can choose which implied ones get filled in.\nAll implied relationships are given a CSS class of the type of implied relation, so you can style them differently. For example `.BC-Aunt`." + }); + new import_obsidian34.Setting(relationDetails).setName("Same Parent is Siblings").setDesc("If one note shares a parent with another, treat them as siblings").addToggle((tg) => tg.setValue(settings.impliedRelations.sameParentIsSibling).onChange(async (val) => { + settings.impliedRelations.sameParentIsSibling = val; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nSister -->|up| Dad\nMe <-.->|same| Sister\n```"); + new import_obsidian34.Setting(relationDetails).setName("Siblings' Siblings").setDesc("Treat your siblings' siblings as your siblings").addToggle((tg) => tg.setValue(settings.impliedRelations.siblingsSiblingIsSibling).onChange(async (val) => { + settings.impliedRelations.siblingsSiblingIsSibling = val; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + mermaidDiagram("```mermaid\nflowchart LR\nMe -->|same| Sister\nMe -->|same| Brother\nSister <-.->|same| Brother\n```"); + new import_obsidian34.Setting(relationDetails).setName("Siblings' Parent is Parent").setDesc("Your siblings' parents are your parents").addToggle((tg) => tg.setValue(settings.impliedRelations.siblingsParentIsParent).onChange(async (val) => { + settings.impliedRelations.siblingsParentIsParent = val; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + mermaidDiagram("```mermaid\nflowchart LR\nSister -->|up| Dad\nSister <-->|same| Me\nMe -.->|up| Dad\n```"); + new import_obsidian34.Setting(relationDetails).setName("Aunt/Uncle").setDesc("Treat your parent's siblings as your parents (aunts/uncles)").addToggle((tg) => tg.setValue(settings.impliedRelations.parentsSiblingsIsParents).onChange(async (val) => { + settings.impliedRelations.parentsSiblingsIsParents = val; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nDad -->|same| Uncle\nMe -.->|up| Uncle\n```"); + new import_obsidian34.Setting(relationDetails).setName("Cousins").setDesc("Treat the cousins of a note as siblings (parents' siblings' children are cousins)").addToggle((tg) => tg.setValue(settings.impliedRelations.cousinsIsSibling).onChange(async (val) => { + settings.impliedRelations.cousinsIsSibling = val; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); + mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nDad -->|same| Uncle\nUncle -->|down| Cousin\nMe <-.->|same| Cousin\n```"); + new import_obsidian34.Setting(relationDetails).setName("Make Current Note an Implied Sibling").setDesc("Techincally, the current note is always it's own implied sibling. By default, it is not show as such. Toggle this on to make it show.").addToggle((toggle) => toggle.setValue(settings.treatCurrNodeAsImpliedSibling).onChange(async (value) => { + settings.treatCurrNodeAsImpliedSibling = value; + await plugin.saveSettings(); + await refreshIndex(plugin); + })); +} + +// src/Settings/TagNoteSettings.ts +var import_obsidian35 = require("obsidian"); +function addTagNoteSettings(plugin, alternativeHierarchyDetails) { + const { settings } = plugin; + const tagNoteDetails = subDetails("Tag Notes", alternativeHierarchyDetails); + new import_obsidian35.Setting(tagNoteDetails).setName("Default Tag Note Field").setDesc(fragWithHTML("By default, tag notes use the first field in your hierarchies (usually an \u2191 field). Choose a different one to use by default, without having to specify BC-tag-note-field: {field}.
If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => { + const options = {}; + getFields(settings.userHiers).forEach((field) => options[field] = field); + dd.addOptions(Object.assign(options, { "": "" })).setValue(settings.tagNoteField).onChange(async (field) => { + settings.tagNoteField = field; + await plugin.saveSettings(); + await refreshIndex(plugin); + }); + }); +} + +// src/Settings/ThreadingSettings.ts +var import_obsidian36 = require("obsidian"); +function addThreadingSettings(plugin, cmdsDetails) { + const { settings } = plugin; + const threadingDetails = subDetails("Threading", cmdsDetails); + threadingDetails.createDiv({ + text: "Settings for the commands `Create new from current note`" + }); + new import_obsidian36.Setting(threadingDetails).setName("Open new threads in new pane or current pane").addToggle((tog) => { + tog.setValue(settings.threadIntoNewPane); + tog.onChange(async (value) => { + settings.threadIntoNewPane = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian36.Setting(threadingDetails).setName("Thread under Cursor").setDesc(fragWithHTML("If the setting Write Breadcrumbs Inline is enabled, where should the new Breadcrumb be added to the current note? \u2705 = Under the cursor, \u274C = At the top of the note (under the yaml, if applicable)")).addToggle((tog) => { + tog.setValue(settings.threadUnderCursor); + tog.onChange(async (value) => { + settings.threadUnderCursor = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian36.Setting(threadingDetails).setName("New Note Name Template").setDesc(fragWithHTML(`When threading into a new note, choose the template for the new note name.
+ Options include:
+
    +
  • {{field}}: the field being thread into
  • +
  • {{dir}}: the direction being thread into
  • +
  • {{current}}: the current note name
  • +
  • {{date}}: the current date (Set the format in the setting below)
  • +
`)).addText((text2) => { + text2.setValue(settings.threadingTemplate); + text2.inputEl.onblur = async () => { + const value = text2.getValue(); + if (ILLEGAL_FILENAME_CHARS.some((char) => value.includes(char))) { + new import_obsidian36.Notice(`File name cannot contain any of these characters: ${ILLEGAL_FILENAME_CHARS.join(" ")}`); + text2.setValue(settings.threadingTemplate); + } else { + settings.threadingTemplate = value; + await plugin.saveSettings(); + } + }; + }); + new import_obsidian36.Setting(threadingDetails).setName("Date Format").setDesc("The date format used in the Threading Template (setting above)").addMomentFormat((format2) => { + format2.setDefaultFormat(DEFAULT_SETTINGS.dateFormat).setValue(settings.dateFormat).onChange(async (value) => { + settings.dateFormat = value; + await plugin.saveSettings(); + }); + }); + const threadDirTemplatesSetting = new import_obsidian36.Setting(threadingDetails).setClass("thread-dir-templates").setName("Templater Template per Direction").setDesc(fragWithHTML(`For each direction to be thread into, choose a Templater template to insert into the new note.
+ Give the basename, or the full file path (e.g. Templates/Parent Template).`)); + DIRECTIONS.forEach((dir) => threadDirTemplatesSetting.addText((text2) => { + text2.setPlaceholder(ARROW_DIRECTIONS[dir]).setValue(settings.threadingDirTemplates[dir]); + text2.inputEl.onblur = async () => { + settings.threadingDirTemplates[dir] = text2.getValue(); + await plugin.saveSettings(); + }; + })); +} + +// src/Settings/TrailSettings.ts +var import_obsidian37 = require("obsidian"); +function addTrailViewSettings(plugin, viewDetails) { + const { settings } = plugin; + const trailDetails = subDetails("Trail/Grid/Juggl", viewDetails); + new import_obsidian37.Setting(trailDetails).setName("Show Breadcrumbs in Edit/Live-Preview Mode").setDesc("It always shows in preview mode, but should it also show in the other two?").addToggle((toggle) => toggle.setValue(settings.showBCsInEditLPMode).onChange(async (value) => { + settings.showBCsInEditLPMode = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })); + trailDetails.createEl("hr"); + trailDetails.createDiv({ + cls: "setting-item-name", + text: "Limit Trail View to only show certain fields" + }); + new Checkboxes_default({ + target: trailDetails, + props: { + plugin, + settingName: "limitTrailCheckboxes", + options: getFields(settings.userHiers, "up") + } + }); + const viewsToShow = new import_obsidian37.Setting(trailDetails).setName("Views to show").setDesc("Choose which of the views to show at the top of the note. Juggl View requires the Juggl plugin.").addToggle((toggle) => { + toggle.setTooltip("Trail view").setValue(settings.showTrail).onChange(async (value) => { + settings.showTrail = value; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }).addToggle((toggle) => { + toggle.setTooltip("Grid view").setValue(settings.showGrid).onChange(async (value) => { + settings.showGrid = value; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }).addToggle((toggle) => { + toggle.setTooltip("Next/Previous view").setValue(settings.showPrevNext).onChange(async (value) => { + settings.showPrevNext = value; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }); + if (app.plugins.plugins.juggl !== void 0) { + viewsToShow.addToggle((toggle) => { + toggle.setTooltip("Juggl view").setValue(settings.showJuggl).onChange(async (value) => { + settings.showJuggl = value; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }); + } + new import_obsidian37.Setting(trailDetails).setName("Grid view depth").setDesc("Limit the initial depth of the grid view").addSlider((slider) => { + slider.setLimits(0, 25, 1).setValue(settings.gridDefaultDepth).setDynamicTooltip(); + slider.sliderEl.onblur = async () => { + settings.gridDefaultDepth = slider.getValue(); + await plugin.saveSettings(); + await drawTrail(plugin); + }; + }); + new import_obsidian37.Setting(trailDetails).setName("Index Note(s)").setDesc(fragWithHTML("The note that all of your other notes lead back to. The parent of all your parent notes. Just enter the basename.
You can also have multiple index notes (comma-separated list).
Leaving this field empty will make the trail show all paths going as far up the parent-tree as possible.")).addText((text2) => { + text2.setPlaceholder("Index Note").setValue(settings.indexNotes.join(", ")); + text2.inputEl.onblur = async () => { + const splits = splitAndTrim(text2.getValue()); + if (splits[0] === void 0 || splits.every((index2) => isInVault(index2))) { + settings.indexNotes = splits; + await plugin.saveSettings(); + } else + new import_obsidian37.Notice("Atleast one of the notes is not in your vault"); + }; + }); + new import_obsidian37.Setting(trailDetails).setName("Shows all paths if none to index note are found").setDesc("If you have an index note chosen, but the trail view has no paths going up to those index notes, should it show all paths instead?").addToggle((toggle) => toggle.setValue(settings.showAllPathsIfNoneToIndexNote).onChange(async (value) => { + settings.showAllPathsIfNoneToIndexNote = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })); + new import_obsidian37.Setting(trailDetails).setName("Default: All, Longest, or Shortest").setDesc("If multiple paths are found going up the parent tree, which of them should show?").addDropdown((dd) => { + const options = {}; + TRAIL_LENGTHS.forEach((length) => { + options[length] = length; + }); + dd.addOptions(options); + dd.setValue(settings.showAll); + dd.onChange(async (val) => { + settings.showAll = val; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }); + new import_obsidian37.Setting(trailDetails).setName("Seperator").setDesc(fragWithHTML("The character to show between crumbs in the breadcrumb trail. The default is \u2192")).addText((text2) => text2.setPlaceholder("\u2192").setValue(settings.trailSeperator).onChange(async (value) => { + settings.trailSeperator = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })); + new import_obsidian37.Setting(trailDetails).setName("No path found message").setDesc("The text to display when no path to the index note is found, or the current note has no parent.").addText((text2) => text2.setPlaceholder("No path to index note was found").setValue(settings.noPathMessage).onChange(async (value) => { + settings.noPathMessage = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })); + new import_obsidian37.Setting(trailDetails).setName("Respect Readable Line Length").setDesc("Should the breadcrumbs trail adjust its width to the readable line length, or use as much space as possible? \u2705 = use readable line length.").addToggle((toggle) => toggle.setValue(settings.respectReadableLineLength).onChange(async (value) => { + settings.respectReadableLineLength = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })); + new import_obsidian37.Setting(trailDetails).setName("Show up fields in Juggl").setDesc("Juggl will show both up and down fields").addToggle((toggle) => { + toggle.setValue(settings.showUpInJuggl).onChange(async (value) => { + settings.showUpInJuggl = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian37.Setting(trailDetails).setName("Juggl view layout").setDesc(fragWithHTML("The layout type to use for the Juggl view.
The hierarchy layout is most natural for Breadcrumbs, but for large graphs D3 Force is recommended.")).addDropdown((dc) => { + dc.addOption("hierarchy", "Hierarchy"); + dc.addOption("d3-force", "D3 Force"); + dc.addOption("cola", "Cola Force"); + dc.addOption("grid", "Grid"); + dc.addOption("concentric", "Concentric"); + dc.setValue(settings.jugglLayout); + dc.onChange(async (value) => { + settings.jugglLayout = value; + await plugin.saveSettings(); + await drawTrail(plugin); + }); + }); +} + +// src/Settings/VisModalSettings.ts +var import_obsidian38 = require("obsidian"); +function addVisModalSettings(plugin, viewDetails) { + const { settings } = plugin; + const visModalDetails = subDetails("Visualisation Modal", viewDetails); + new import_obsidian38.Setting(visModalDetails).setName("Default Visualisation Type").setDesc("Which visualisation to show by default").addDropdown((cb) => { + VISTYPES.forEach((option) => { + cb.addOption(option, option); + }); + cb.setValue(settings.visGraph); + cb.onChange(async (value) => { + settings.visGraph = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian38.Setting(visModalDetails).setName("Default Relation").setDesc("Which relation type to show first when opening the modal").addDropdown((dd) => { + RELATIONS.forEach((option) => { + dd.addOption(option, option); + }); + dd.setValue(settings.visRelation); + dd.onChange(async (value) => { + settings.visRelation = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian38.Setting(visModalDetails).setName("Default Real/Closed").setDesc("Show the real or closed graph by default").addDropdown((cb) => { + REAlCLOSED.forEach((option) => { + cb.addOption(option, option); + }); + cb.setValue(settings.visClosed); + cb.onChange(async (value) => { + settings.visClosed = value; + await plugin.saveSettings(); + }); + }); + new import_obsidian38.Setting(visModalDetails).setName("Default Unlinked").setDesc("Show all nodes or only those which have links by default").addDropdown((cb) => { + ALLUNLINKED.forEach((option) => { + cb.addOption(option, option); + }); + cb.setValue(settings.visAll); + cb.onChange(async (value) => { + settings.visAll = value; + await plugin.saveSettings(); + }); + }); +} + +// src/Settings/WriteBCsSettings.ts +var import_obsidian39 = require("obsidian"); +function addWriteBCsSettings(plugin, cmdsDetails) { + const { settings } = plugin; + const writeBCsToFileDetails = subDetails("Write Breadcrumbs to File", cmdsDetails); + writeBCsToFileDetails.createDiv({ + cls: "setting-item-name", + text: "Limit to only write certain fields" + }); + new Checkboxes_default({ + target: writeBCsToFileDetails, + props: { + plugin, + options: getFields(settings.userHiers), + settingName: "limitWriteBCCheckboxes" + } + }); + new import_obsidian39.Setting(writeBCsToFileDetails).setName("Write Inline").setDesc("When writing BCs to file, should they be written inline (using Dataview syntax), or into the YAML of the note?").addToggle((toggle) => toggle.setValue(settings.writeBCsInline).onChange(async (value) => { + settings.writeBCsInline = value; + await plugin.saveSettings(); + })); + new import_obsidian39.Setting(writeBCsToFileDetails).setName(fragWithHTML("Show the Write Breadcrumbs to ALL Files command")).setDesc("This command attempts to update ALL files with implied breadcrumbs pointing to them. So, it is not shown by default (even though it has 3 confirmation boxes to ensure you want to run it").addToggle((toggle) => toggle.setValue(settings.showWriteAllBCsCmd).onChange(async (value) => { + settings.showWriteAllBCsCmd = value; + await plugin.saveSettings(); + })); +} + +// src/Settings/BreadcrumbsSettingTab.ts +var fragWithHTML = (html) => createFragment((frag) => frag.createDiv().innerHTML = html); +var details = (text2, parent) => parent.createEl("details", {}, (d) => d.createEl("summary", { text: text2 })); +var subDetails = (text2, parent) => parent.createDiv({ + attr: { style: "padding-left: 10px;" } +}).createEl("details", {}, (d) => d.createEl("summary", { text: text2 })); +var BCSettingTab = class extends import_obsidian40.PluginSettingTab { + constructor(plugin) { + super(app, plugin); + this.plugin = plugin; + } + async display() { + const { plugin, containerEl } = this; + const { settings } = plugin; + containerEl.empty(); + containerEl.createEl("h2", { text: "Breadcrumbs Settings" }); + containerEl.addClass("BC-settings-tab"); + addHierarchySettings(plugin, containerEl); + addRelationSettings(plugin, containerEl); + addGeneralSettings(plugin, containerEl); + const viewDetails = details("Views", containerEl); + new import_obsidian40.Setting(viewDetails).setName("Open Views by Default").setDesc(fragWithHTML("Choose which of the views to open onload
Order is: Trail/Grid/Juggl, Matrix, Ducks, Tree")).addToggle((toggle) => toggle.setTooltip("Trail/Grid/Juggl").setValue(settings.showBCs).onChange(async (value) => { + settings.showBCs = value; + await plugin.saveSettings(); + await drawTrail(plugin); + })).addToggle((toggle) => { + toggle.setTooltip("Matrix View").setValue(settings.openMatrixOnLoad).onChange(async (value) => { + settings.openMatrixOnLoad = value; + await plugin.saveSettings(); + }); + }).addToggle((toggle) => { + toggle.setTooltip("Ducks View").setValue(settings.openDuckOnLoad).onChange(async (value) => { + settings.openDuckOnLoad = value; + await plugin.saveSettings(); + }); + }).addToggle((toggle) => { + toggle.setTooltip("Tree View").setValue(settings.openDownOnLoad).onChange(async (value) => { + settings.openDownOnLoad = value; + await plugin.saveSettings(); + }); + }); + viewDetails.createEl("hr"); + addMatrixViewSettings(plugin, viewDetails); + addTrailViewSettings(plugin, viewDetails); + addVisModalSettings(plugin, viewDetails); + const alternativeHierarchyDetails = details("Alternative Hierarchies", containerEl); + addTagNoteSettings(plugin, alternativeHierarchyDetails); + addRegexNoteSettings(plugin, alternativeHierarchyDetails); + addNoSystemSettings(plugin, alternativeHierarchyDetails); + addHierarchyNoteSettings(plugin, alternativeHierarchyDetails); + addCSVSettings(plugin, alternativeHierarchyDetails); + addDendronSettings(plugin, alternativeHierarchyDetails); + addDataviewSettings(plugin, alternativeHierarchyDetails); + addDateNoteSettings(plugin, alternativeHierarchyDetails); + const cmdsDetails = details("Commands", containerEl); + addWriteBCsSettings(plugin, cmdsDetails); + addCreateIndexSettings(plugin, cmdsDetails); + addThreadingSettings(plugin, cmdsDetails); + addJumpToNextSettings(plugin, cmdsDetails); + addDebuggingsSettings(plugin, containerEl); + new KoFi_default({ target: containerEl }); + } +}; + +// src/Views/DucksView.ts +var import_obsidian41 = require("obsidian"); + +// node_modules/svelte-icons/fa/FaInfo.svelte +function create_default_slot4(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment18(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 192 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot4] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance18($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaInfo = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance18, create_fragment18, safe_not_equal, {}); + } +}; +var FaInfo_default = FaInfo; + +// src/Components/Ducks.svelte +function get_each_context8(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + return child_ctx; +} +function create_each_block8(ctx) { + let div; + let a2; + let t0_value = ctx[13] + ""; + let t0; + let t1; + let mounted; + let dispose; + function click_handler(...args) { + return ctx[8](ctx[13], ...args); + } + function mouseover_handler(...args) { + return ctx[9](ctx[13], ...args); + } + return { + c() { + div = element("div"); + a2 = element("a"); + t0 = text(t0_value); + t1 = space(); + attr(a2, "class", "internal-link"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, a2); + append(a2, t0); + append(div, t1); + if (!mounted) { + dispose = [ + listen(div, "click", click_handler), + listen(div, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 8 && t0_value !== (t0_value = ctx[13] + "")) + set_data(t0, t0_value); + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment19(ctx) { + let div; + let h6; + let t1; + let span; + let fainfo; + let span_aria_label_value; + let t2; + let label; + let t3; + let input0; + let t4; + let input1; + let t5; + let current; + let mounted; + let dispose; + fainfo = new FaInfo_default({}); + let each_value = ctx[3]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block8(get_each_context8(ctx, each_value, i)); + } + return { + c() { + div = element("div"); + h6 = element("h6"); + h6.textContent = "Notes without Breadcrumbs"; + t1 = space(); + span = element("span"); + create_component(fainfo.$$.fragment); + t2 = space(); + label = element("label"); + t3 = text("Filter:\r\n "); + input0 = element("input"); + t4 = space(); + input1 = element("input"); + t5 = space(); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(span, "class", "icon svelte-gmdm3a"); + attr(span, "aria-label", span_aria_label_value = `A Regex used to filter the results. +If 'Include' is checked, it will only show notes that match the regex. +If 'Include' is not checked, this regex will filter out notes that match it.`); + attr(input0, "type", "text"); + attr(input0, "placeholder", "Regex"); + attr(input1, "aria-label", "Include"); + attr(input1, "type", "checkbox"); + attr(div, "class", "BC-Ducks markdown-preview-view"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, h6); + append(div, t1); + append(div, span); + mount_component(fainfo, span, null); + append(div, t2); + append(div, label); + append(label, t3); + append(label, input0); + set_input_value(input0, ctx[1]); + append(div, t4); + append(div, input1); + input1.checked = ctx[2]; + append(div, t5); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + current = true; + if (!mounted) { + dispose = [ + listen(input0, "input", ctx[6]), + listen(input1, "change", ctx[7]) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & 2 && input0.value !== ctx2[1]) { + set_input_value(input0, ctx2[1]); + } + if (dirty & 4) { + input1.checked = ctx2[2]; + } + if (dirty & 9) { + each_value = ctx2[3]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context8(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block8(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i(local) { + if (current) + return; + transition_in(fainfo.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(fainfo.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + destroy_component(fainfo); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +function instance19($$self, $$props, $$invalidate) { + let ducks; + let { plugin } = $$props; + let { ducksView } = $$props; + const { mainG } = plugin; + const files = app.vault.getMarkdownFiles(); + let query = ""; + let regex = new RegExp(query, "g"); + let include = true; + const getDucks = (regex2) => { + if (!regex2) + return; + return files.map((file) => file.basename).filter((name) => !mainG.neighbors(name).length && include === regex2.test(name)); + }; + function input0_input_handler() { + query = this.value; + $$invalidate(1, query); + } + function input1_change_handler() { + include = this.checked; + $$invalidate(2, include); + } + const click_handler = async (duck, e) => await openOrSwitch(duck, e); + const mouseover_handler = (duck, e) => hoverPreview(e, ducksView, duck); + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(4, plugin = $$props2.plugin); + if ("ducksView" in $$props2) + $$invalidate(0, ducksView = $$props2.ducksView); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 2) { + $: { + try { + const newReg = new RegExp(query, "g"); + $$invalidate(5, regex = newReg); + } catch (e) { + } + } + } + if ($$self.$$.dirty & 32) { + $: + $$invalidate(3, ducks = getDucks(regex)); + } + }; + return [ + ducksView, + query, + include, + ducks, + plugin, + regex, + input0_input_handler, + input1_change_handler, + click_handler, + mouseover_handler + ]; +} +var Ducks = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance19, create_fragment19, safe_not_equal, { plugin: 4, ducksView: 0 }); + } +}; +var Ducks_default = Ducks; + +// src/Views/DucksView.ts +var DucksView = class extends import_obsidian41.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = DUCK_ICON; + this.plugin = plugin; + } + async onload() { + super.onload(); + await this.plugin.saveSettings(); + app.workspace.onLayoutReady(async () => { + await this.draw(); + }); + } + getViewType() { + return DUCK_VIEW; + } + getDisplayText() { + return "Breadcrumbs Ducks"; + } + async onOpen() { + } + onClose() { + var _a; + (_a = this.view) == null ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + async draw() { + this.contentEl.empty(); + this.view = new Ducks_default({ + target: this.contentEl, + props: { plugin: this.plugin, ducksView: this } + }); + } +}; + +// src/Views/TreeView.ts +var import_obsidian42 = require("obsidian"); + +// src/Components/SideTree.svelte +var import_loglevel20 = __toESM(require_loglevel()); + +// node_modules/svelte-icons/fa/FaFire.svelte +function create_default_slot5(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment20(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 384 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot5] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance20($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaFire = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance20, create_fragment20, safe_not_equal, {}); + } +}; +var FaFire_default = FaFire; + +// node_modules/svelte-icons/fa/FaRegSnowflake.svelte +function create_default_slot6(ctx) { + let path2; + return { + c() { + path2 = svg_element("path"); + attr(path2, "d", "M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z"); + }, + m(target, anchor) { + insert(target, path2, anchor); + }, + d(detaching) { + if (detaching) + detach(path2); + } + }; +} +function create_fragment21(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]]; + let iconbase_props = { + $$slots: { default: [create_default_slot6] }, + $$scope: { ctx } + }; + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } + iconbase = new IconBase_default({ props: iconbase_props }); + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx2, [dirty]) { + const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {}; + if (dirty & 2) { + iconbase_changes.$$scope = { dirty, ctx: ctx2 }; + } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) + return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} +function instance21($$self, $$props, $$invalidate) { + $$self.$$set = ($$new_props) => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; + $$props = exclude_internal_props($$props); + return [$$props]; +} +var FaRegSnowflake = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance21, create_fragment21, safe_not_equal, {}); + } +}; +var FaRegSnowflake_default = FaRegSnowflake; + +// src/Components/SideTree.svelte +function get_each_context9(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + return child_ctx; +} +function get_each_context_16(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i]; + return child_ctx; +} +function create_else_block4(ctx) { + let fafire; + let current; + fafire = new FaFire_default({}); + return { + c() { + create_component(fafire.$$.fragment); + }, + m(target, anchor) { + mount_component(fafire, target, anchor); + current = true; + }, + i(local) { + if (current) + return; + transition_in(fafire.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(fafire.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(fafire, detaching); + } + }; +} +function create_if_block_15(ctx) { + let faregsnowflake; + let current; + faregsnowflake = new FaRegSnowflake_default({}); + return { + c() { + create_component(faregsnowflake.$$.fragment); + }, + m(target, anchor) { + mount_component(faregsnowflake, target, anchor); + current = true; + }, + i(local) { + if (current) + return; + transition_in(faregsnowflake.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(faregsnowflake.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(faregsnowflake, detaching); + } + }; +} +function create_each_block_16(ctx) { + let option; + let t_value = ctx[18] + ""; + let t; + let option_value_value; + return { + c() { + option = element("option"); + t = text(t_value); + option.__value = option_value_value = ctx[18]; + option.value = option.__value; + }, + m(target, anchor) { + insert(target, option, anchor); + append(option, t); + }, + p: noop, + d(detaching) { + if (detaching) + detach(option); + } + }; +} +function create_if_block8(ctx) { + let div; + let pre; + let t0_value = ctx[15][0] + "-"; + let t0; + let t1; + let span; + let a2; + let t2_value = dropDendron(ctx[15][1], ctx[6]) + ""; + let t2; + let a_class_value; + let t3; + let mounted; + let dispose; + function click_handler_2(...args) { + return ctx[10](ctx[15], ...args); + } + function mouseover_handler(...args) { + return ctx[11](ctx[15], ...args); + } + return { + c() { + div = element("div"); + pre = element("pre"); + t0 = text(t0_value); + t1 = space(); + span = element("span"); + a2 = element("a"); + t2 = text(t2_value); + t3 = space(); + attr(pre, "class", "svelte-8j6nux"); + attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[15][1]) ? "" : "is-unresolved") + " svelte-8j6nux"); + attr(span, "class", "internal-link"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t0); + append(div, t1); + append(div, span); + append(span, a2); + append(a2, t2); + append(div, t3); + if (!mounted) { + dispose = [ + listen(span, "click", click_handler_2), + listen(span, "mouseover", mouseover_handler) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 32 && t0_value !== (t0_value = ctx[15][0] + "-")) + set_data(t0, t0_value); + if (dirty & 32 && t2_value !== (t2_value = dropDendron(ctx[15][1], ctx[6]) + "")) + set_data(t2, t2_value); + if (dirty & 32 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[15][1]) ? "" : "is-unresolved") + " svelte-8j6nux")) { + attr(a2, "class", a_class_value); + } + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + run_all(dispose); + } + }; +} +function create_each_block9(ctx) { + let if_block_anchor; + let if_block = ctx[15].length > 1 && create_if_block8(ctx); + return { + c() { + if (if_block) + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx2, dirty) { + if (ctx2[15].length > 1) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block8(ctx2); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(if_block_anchor); + } + }; +} +function create_fragment22(ctx) { + let span; + let current_block_type_index; + let if_block; + let span_aria_label_value; + let t0; + let button; + let t2; + let select; + let t3; + let div; + let current; + let mounted; + let dispose; + const if_block_creators = [create_if_block_15, create_else_block4]; + const if_blocks = []; + function select_block_type(ctx2, dirty) { + if (ctx2[4]) + return 0; + return 1; + } + current_block_type_index = select_block_type(ctx, -1); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + let each_value_1 = DIRECTIONS; + let each_blocks_1 = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks_1[i] = create_each_block_16(get_each_context_16(ctx, each_value_1, i)); + } + let each_value = ctx[5]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block9(get_each_context9(ctx, each_value, i)); + } + return { + c() { + span = element("span"); + if_block.c(); + t0 = space(); + button = element("button"); + button.textContent = "\u21BB"; + t2 = space(); + select = element("select"); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + t3 = space(); + div = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + attr(span, "class", "icon svelte-8j6nux"); + attr(span, "aria-label", span_aria_label_value = ctx[4] ? `Frozen on: ${ctx[3]}` : "Unfrozen"); + attr(span, "aria-label-position", "left"); + attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)"); + attr(button, "class", "svelte-8j6nux"); + attr(select, "class", "dropdown"); + if (ctx[2] === void 0) + add_render_callback(() => ctx[9].call(select)); + attr(div, "class", "BC-downs svelte-8j6nux"); + }, + m(target, anchor) { + insert(target, span, anchor); + if_blocks[current_block_type_index].m(span, null); + insert(target, t0, anchor); + insert(target, button, anchor); + insert(target, t2, anchor); + insert(target, select, anchor); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(select, null); + } + select_option(select, ctx[2]); + insert(target, t3, anchor); + insert(target, div, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + current = true; + if (!mounted) { + dispose = [ + listen(span, "click", ctx[7]), + listen(button, "click", ctx[8]), + listen(select, "change", ctx[9]) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx2, dirty); + if (current_block_type_index !== previous_block_index) { + group_outros(); + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + check_outros(); + if_block = if_blocks[current_block_type_index]; + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); + if_block.c(); + } else { + } + transition_in(if_block, 1); + if_block.m(span, null); + } + if (!current || dirty & 24 && span_aria_label_value !== (span_aria_label_value = ctx2[4] ? `Frozen on: ${ctx2[3]}` : "Unfrozen")) { + attr(span, "aria-label", span_aria_label_value); + } + if (dirty & 0) { + each_value_1 = DIRECTIONS; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_16(ctx2, each_value_1, i); + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_16(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(select, null); + } + } + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + each_blocks_1.length = each_value_1.length; + } + if (dirty & 4) { + select_option(select, ctx2[2]); + } + if (dirty & 98) { + each_value = ctx2[5]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context9(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block9(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i(local) { + if (current) + return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (detaching) + detach(span); + if_blocks[current_block_type_index].d(); + if (detaching) + detach(t0); + if (detaching) + detach(button); + if (detaching) + detach(t2); + if (detaching) + detach(select); + destroy_each(each_blocks_1, detaching); + if (detaching) + detach(t3); + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +function instance22($$self, $$props, $$invalidate) { + let { plugin } = $$props; + let { view } = $$props; + const { settings, app: app2, closedG } = plugin; + const { createIndexIndent } = settings; + let dir = "down"; + let frozen = false; + let { basename } = getCurrFile(); + plugin.registerEvent(app2.workspace.on("active-leaf-change", () => { + var _a; + if (frozen) + return; + $$invalidate(3, basename = (_a = getCurrFile()) === null || _a === void 0 ? void 0 : _a.basename); + })); + let lines; + const click_handler = () => { + var _a; + $$invalidate(4, frozen = !frozen); + if (!frozen) + $$invalidate(3, basename = (_a = getCurrFile()) == null ? void 0 : _a.basename); + }; + const click_handler_1 = async () => { + await refreshIndex(plugin); + await view.draw(); + }; + function select_change_handler() { + dir = select_value(this); + $$invalidate(2, dir); + } + const click_handler_2 = async (line, e) => await openOrSwitch(line[1], e); + const mouseover_handler = (line, e) => hoverPreview(e, view, line[1]); + $$self.$$set = ($$props2) => { + if ("plugin" in $$props2) + $$invalidate(0, plugin = $$props2.plugin); + if ("view" in $$props2) + $$invalidate(1, view = $$props2.view); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 12) { + $: { + const downG = getSubInDirs(closedG, dir); + const allPaths = dfsAllPaths(downG, basename); + const index2 = createIndex(allPaths, false, createIndexIndent); + (0, import_loglevel20.info)({ allPaths, index: index2 }); + $$invalidate(5, lines = indexToLinePairs(index2)); + } + } + }; + return [ + plugin, + view, + dir, + basename, + frozen, + lines, + settings, + click_handler, + click_handler_1, + select_change_handler, + click_handler_2, + mouseover_handler + ]; +} +var SideTree = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance22, create_fragment22, safe_not_equal, { plugin: 0, view: 1 }); + } +}; +var SideTree_default = SideTree; + +// src/Views/TreeView.ts +var TreeView = class extends import_obsidian42.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = addFeatherIcon("corner-right-down"); + this.plugin = plugin; + } + async onload() { + super.onload(); + app.workspace.onLayoutReady(async () => { + await this.draw(); + }); + } + getViewType() { + return TREE_VIEW; + } + getDisplayText() { + return "Breadcrumbs Down"; + } + async onOpen() { + } + onClose() { + var _a; + (_a = this.view) == null ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + async draw() { + this.contentEl.empty(); + this.view = new SideTree_default({ + target: this.contentEl, + props: { plugin: this.plugin, view: this } + }); + } +}; + +// node_modules/d3-array/src/ascending.js +function ascending_default(a2, b) { + return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN; +} + +// node_modules/d3-array/src/bisector.js +function bisector_default(f) { + let delta = f; + let compare = f; + if (f.length === 1) { + delta = (d, x4) => f(d) - x4; + compare = ascendingComparator(f); + } + function left(a2, x4, lo, hi) { + if (lo == null) + lo = 0; + if (hi == null) + hi = a2.length; + while (lo < hi) { + const mid = lo + hi >>> 1; + if (compare(a2[mid], x4) < 0) + lo = mid + 1; + else + hi = mid; + } + return lo; + } + function right(a2, x4, lo, hi) { + if (lo == null) + lo = 0; + if (hi == null) + hi = a2.length; + while (lo < hi) { + const mid = lo + hi >>> 1; + if (compare(a2[mid], x4) > 0) + hi = mid; + else + lo = mid + 1; + } + return lo; + } + function center(a2, x4, lo, hi) { + if (lo == null) + lo = 0; + if (hi == null) + hi = a2.length; + const i = left(a2, x4, lo, hi - 1); + return i > lo && delta(a2[i - 1], x4) > -delta(a2[i], x4) ? i - 1 : i; + } + return { left, center, right }; +} +function ascendingComparator(f) { + return (d, x4) => ascending_default(f(d), x4); +} + +// node_modules/d3-array/src/number.js +function number_default(x4) { + return x4 === null ? NaN : +x4; +} + +// node_modules/d3-array/src/bisect.js +var ascendingBisect = bisector_default(ascending_default); +var bisectRight = ascendingBisect.right; +var bisectLeft = ascendingBisect.left; +var bisectCenter = bisector_default(number_default).center; +var bisect_default = bisectRight; + +// node_modules/d3-array/src/ticks.js +var e10 = Math.sqrt(50); +var e5 = Math.sqrt(10); +var e2 = Math.sqrt(2); +function ticks_default(start2, stop, count2) { + var reverse, i = -1, n, ticks, step; + stop = +stop, start2 = +start2, count2 = +count2; + if (start2 === stop && count2 > 0) + return [start2]; + if (reverse = stop < start2) + n = start2, start2 = stop, stop = n; + if ((step = tickIncrement(start2, stop, count2)) === 0 || !isFinite(step)) + return []; + if (step > 0) { + let r0 = Math.round(start2 / step), r1 = Math.round(stop / step); + if (r0 * step < start2) + ++r0; + if (r1 * step > stop) + --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) + ticks[i] = (r0 + i) * step; + } else { + step = -step; + let r0 = Math.round(start2 * step), r1 = Math.round(stop * step); + if (r0 / step < start2) + ++r0; + if (r1 / step > stop) + --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) + ticks[i] = (r0 + i) / step; + } + if (reverse) + ticks.reverse(); + return ticks; +} +function tickIncrement(start2, stop, count2) { + var step = (stop - start2) / Math.max(0, count2), power = Math.floor(Math.log(step) / Math.LN10), error6 = step / Math.pow(10, power); + return power >= 0 ? (error6 >= e10 ? 10 : error6 >= e5 ? 5 : error6 >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error6 >= e10 ? 10 : error6 >= e5 ? 5 : error6 >= e2 ? 2 : 1); +} +function tickStep(start2, stop, count2) { + var step0 = Math.abs(stop - start2) / Math.max(0, count2), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error6 = step0 / step1; + if (error6 >= e10) + step1 *= 10; + else if (error6 >= e5) + step1 *= 5; + else if (error6 >= e2) + step1 *= 2; + return stop < start2 ? -step1 : step1; +} + +// node_modules/d3-array/src/max.js +function max(values, valueof) { + let max4; + if (valueof === void 0) { + for (const value of values) { + if (value != null && (max4 < value || max4 === void 0 && value >= value)) { + max4 = value; + } + } + } else { + let index2 = -1; + for (let value of values) { + if ((value = valueof(value, ++index2, values)) != null && (max4 < value || max4 === void 0 && value >= value)) { + max4 = value; + } + } + } + return max4; +} + +// node_modules/d3-array/src/range.js +function range_default(start2, stop, step) { + start2 = +start2, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n < 3 ? 1 : +step; + var i = -1, n = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range = new Array(n); + while (++i < n) { + range[i] = start2 + i * step; + } + return range; +} + +// node_modules/d3-dispatch/src/dispatch.js +var noop2 = { value: () => { +} }; +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) + throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} +function Dispatch(_) { + this._ = _; +} +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) + throw new Error("unknown type: " + t); + return { type: t, name }; + }); +} +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length; + if (arguments.length < 2) { + while (++i < n) + if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) + return t; + return; + } + if (callback != null && typeof callback !== "function") + throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) + _[t] = set(_[t], typename.name, callback); + else if (callback == null) + for (t in _) + _[t] = set(_[t], typename.name, null); + } + return this; + }, + copy: function() { + var copy3 = {}, _ = this._; + for (var t in _) + copy3[t] = _[t].slice(); + return new Dispatch(copy3); + }, + call: function(type2, that) { + if ((n = arguments.length - 2) > 0) + for (var args = new Array(n), i = 0, n, t; i < n; ++i) + args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (t = this._[type2], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + }, + apply: function(type2, that, args) { + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + } +}; +function get(type2, name) { + for (var i = 0, n = type2.length, c3; i < n; ++i) { + if ((c3 = type2[i]).name === name) { + return c3.value; + } + } +} +function set(type2, name, callback) { + for (var i = 0, n = type2.length; i < n; ++i) { + if (type2[i].name === name) { + type2[i] = noop2, type2 = type2.slice(0, i).concat(type2.slice(i + 1)); + break; + } + } + if (callback != null) + type2.push({ name, value: callback }); + return type2; +} +var dispatch_default = dispatch; + +// node_modules/d3-selection/src/namespaces.js +var xhtml = "http://www.w3.org/1999/xhtml"; +var namespaces_default = { + svg: "http://www.w3.org/2000/svg", + xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +// node_modules/d3-selection/src/namespace.js +function namespace_default(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") + name = name.slice(i + 1); + return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; +} + +// node_modules/d3-selection/src/creator.js +function creatorInherit(name) { + return function() { + var document2 = this.ownerDocument, uri = this.namespaceURI; + return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name); + }; +} +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} +function creator_default(name) { + var fullname = namespace_default(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); +} + +// node_modules/d3-selection/src/selector.js +function none() { +} +function selector_default(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +// node_modules/d3-selection/src/selection/select.js +function select_default(select) { + if (typeof select !== "function") + select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/array.js +function array_default(x4) { + return typeof x4 === "object" && "length" in x4 ? x4 : Array.from(x4); +} + +// node_modules/d3-selection/src/selectorAll.js +function empty2() { + return []; +} +function selectorAll_default(selector) { + return selector == null ? empty2 : function() { + return this.querySelectorAll(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectAll.js +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array_default(group); + }; +} +function selectAll_default(select) { + if (typeof select === "function") + select = arrayAll(select); + else + select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + return new Selection(subgroups, parents); +} + +// node_modules/d3-selection/src/matcher.js +function matcher_default(selector) { + return function() { + return this.matches(selector); + }; +} +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectChild.js +var find = Array.prototype.find; +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} +function childFirst() { + return this.firstElementChild; +} +function selectChild_default(match) { + return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/selectChildren.js +var filter = Array.prototype.filter; +function children2() { + return this.children; +} +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} +function selectChildren_default(match) { + return this.selectAll(match == null ? children2 : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/filter.js +function filter_default(match) { + if (typeof match !== "function") + match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/selection/sparse.js +function sparse_default(update2) { + return new Array(update2.length); +} + +// node_modules/d3-selection/src/selection/enter.js +function enter_default() { + return new Selection(this._enter || this._groups.map(sparse_default), this._parents); +} +function EnterNode(parent, datum2) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum2; +} +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function(child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function(selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function(selector) { + return this._parent.querySelectorAll(selector); + } +}; + +// node_modules/d3-selection/src/constant.js +function constant_default(x4) { + return function() { + return x4; + }; +} + +// node_modules/d3-selection/src/selection/data.js +function bindIndex(parent, group, enter, update2, exit, data) { + var i = 0, node, groupLength = group.length, dataLength = data.length; + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update2[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} +function bindKey(parent, group, enter, update2, exit, data, key) { + var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update2[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } +} +function datum(node) { + return node.__data__; +} +function data_default(value, key) { + if (!arguments.length) + return Array.from(this, datum); + var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; + if (typeof value !== "function") + value = constant_default(value); + for (var m2 = groups.length, update2 = new Array(m2), enter = new Array(m2), exit = new Array(m2), j = 0; j < m2; ++j) { + var parent = parents[j], group = groups[j], groupLength = group.length, data = array_default(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update2[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength); + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) + i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) + ; + previous._next = next || null; + } + } + } + update2 = new Selection(update2, parents); + update2._enter = enter; + update2._exit = exit; + return update2; +} + +// node_modules/d3-selection/src/selection/exit.js +function exit_default() { + return new Selection(this._exit || this._groups.map(sparse_default), this._parents); +} + +// node_modules/d3-selection/src/selection/join.js +function join_default(onenter, onupdate, onexit) { + var enter = this.enter(), update2 = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) + update2 = onupdate(update2); + if (onexit == null) + exit.remove(); + else + onexit(exit); + return enter && update2 ? enter.merge(update2).order() : update2; +} + +// node_modules/d3-selection/src/selection/merge.js +function merge_default(selection2) { + if (!(selection2 instanceof Selection)) + throw new Error("invalid merge"); + for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Selection(merges, this._parents); +} + +// node_modules/d3-selection/src/selection/order.js +function order_default() { + for (var groups = this._groups, j = -1, m2 = groups.length; ++j < m2; ) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) + next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; +} + +// node_modules/d3-selection/src/selection/sort.js +function sort_default(compare) { + if (!compare) + compare = ascending; + function compareNode(a2, b) { + return a2 && b ? compare(a2.__data__, b.__data__) : !a2 - !b; + } + for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + return new Selection(sortgroups, this._parents).order(); +} +function ascending(a2, b) { + return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN; +} + +// node_modules/d3-selection/src/selection/call.js +function call_default() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +// node_modules/d3-selection/src/selection/nodes.js +function nodes_default() { + return Array.from(this); +} + +// node_modules/d3-selection/src/selection/node.js +function node_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) + return node; + } + } + return null; +} + +// node_modules/d3-selection/src/selection/size.js +function size_default() { + let size = 0; + for (const node of this) + ++size; + return size; +} + +// node_modules/d3-selection/src/selection/empty.js +function empty_default() { + return !this.node(); +} + +// node_modules/d3-selection/src/selection/each.js +function each_default(callback) { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) + callback.call(node, node.__data__, i, group); + } + } + return this; +} + +// node_modules/d3-selection/src/selection/attr.js +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttribute(name); + else + this.setAttribute(name, v); + }; +} +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttributeNS(fullname.space, fullname.local); + else + this.setAttributeNS(fullname.space, fullname.local, v); + }; +} +function attr_default(name, value) { + var fullname = namespace_default(name); + if (arguments.length < 2) { + var node = this.node(); + return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); + } + return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value)); +} + +// node_modules/d3-selection/src/window.js +function window_default(node) { + return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView; +} + +// node_modules/d3-selection/src/selection/style.js +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.style.removeProperty(name); + else + this.style.setProperty(name, v, priority); + }; +} +function style_default(name, value, priority) { + return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); +} +function styleValue(node, name) { + return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name); +} + +// node_modules/d3-selection/src/selection/property.js +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + delete this[name]; + else + this[name] = v; + }; +} +function property_default(name, value) { + return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; +} + +// node_modules/d3-selection/src/selection/classed.js +function classArray(string) { + return string.trim().split(/^|\s+/); +} +function classList(node) { + return node.classList || new ClassList(node); +} +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.add(names[i]); +} +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.remove(names[i]); +} +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} +function classed_default(name, value) { + var names = classArray(name + ""); + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) + if (!list.contains(names[i])) + return false; + return true; + } + return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); +} + +// node_modules/d3-selection/src/selection/text.js +function textRemove() { + this.textContent = ""; +} +function textConstant(value) { + return function() { + this.textContent = value; + }; +} +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} +function text_default(value) { + return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent; +} + +// node_modules/d3-selection/src/selection/html.js +function htmlRemove() { + this.innerHTML = ""; +} +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} +function html_default(value) { + return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; +} + +// node_modules/d3-selection/src/selection/raise.js +function raise() { + if (this.nextSibling) + this.parentNode.appendChild(this); +} +function raise_default() { + return this.each(raise); +} + +// node_modules/d3-selection/src/selection/lower.js +function lower() { + if (this.previousSibling) + this.parentNode.insertBefore(this, this.parentNode.firstChild); +} +function lower_default() { + return this.each(lower); +} + +// node_modules/d3-selection/src/selection/append.js +function append_default(name) { + var create2 = typeof name === "function" ? name : creator_default(name); + return this.select(function() { + return this.appendChild(create2.apply(this, arguments)); + }); +} + +// node_modules/d3-selection/src/selection/insert.js +function constantNull() { + return null; +} +function insert_default(name, before) { + var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before); + return this.select(function() { + return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +// node_modules/d3-selection/src/selection/remove.js +function remove() { + var parent = this.parentNode; + if (parent) + parent.removeChild(this); +} +function remove_default() { + return this.each(remove); +} + +// node_modules/d3-selection/src/selection/clone.js +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function clone_default(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +// node_modules/d3-selection/src/selection/datum.js +function datum_default(value) { + return arguments.length ? this.property("__data__", value) : this.node().__data__; +} + +// node_modules/d3-selection/src/selection/on.js +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} +function parseTypenames2(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + return { type: t, name }; + }); +} +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) + return; + for (var j = 0, i = -1, m2 = on.length, o; j < m2; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) + on.length = i; + else + delete this.__on; + }; +} +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) + for (var j = 0, m2 = on.length; j < m2; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = { type: typename.type, name: typename.name, value, listener, options }; + if (!on) + this.__on = [o]; + else + on.push(o); + }; +} +function on_default(typename, value, options) { + var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t; + if (arguments.length < 2) { + var on = this.node().__on; + if (on) + for (var j = 0, m2 = on.length, o; j < m2; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) + this.each(on(typenames[i], value, options)); + return this; +} + +// node_modules/d3-selection/src/selection/dispatch.js +function dispatchEvent(node, type2, params) { + var window2 = window_default(node), event = window2.CustomEvent; + if (typeof event === "function") { + event = new event(type2, params); + } else { + event = window2.document.createEvent("Event"); + if (params) + event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail; + else + event.initEvent(type2, false, false); + } + node.dispatchEvent(event); +} +function dispatchConstant(type2, params) { + return function() { + return dispatchEvent(this, type2, params); + }; +} +function dispatchFunction(type2, params) { + return function() { + return dispatchEvent(this, type2, params.apply(this, arguments)); + }; +} +function dispatch_default2(type2, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params)); +} + +// node_modules/d3-selection/src/selection/iterator.js +function* iterator_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) + yield node; + } + } +} + +// node_modules/d3-selection/src/selection/index.js +var root = [null]; +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} +function selection() { + return new Selection([[document.documentElement]], root); +} +function selection_selection() { + return this; +} +Selection.prototype = selection.prototype = { + constructor: Selection, + select: select_default, + selectAll: selectAll_default, + selectChild: selectChild_default, + selectChildren: selectChildren_default, + filter: filter_default, + data: data_default, + enter: enter_default, + exit: exit_default, + join: join_default, + merge: merge_default, + selection: selection_selection, + order: order_default, + sort: sort_default, + call: call_default, + nodes: nodes_default, + node: node_default, + size: size_default, + empty: empty_default, + each: each_default, + attr: attr_default, + style: style_default, + property: property_default, + classed: classed_default, + text: text_default, + html: html_default, + raise: raise_default, + lower: lower_default, + append: append_default, + insert: insert_default, + remove: remove_default, + clone: clone_default, + datum: datum_default, + on: on_default, + dispatch: dispatch_default2, + [Symbol.iterator]: iterator_default +}; +var selection_default = selection; + +// node_modules/d3-selection/src/select.js +function select_default2(selector) { + return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root); +} + +// node_modules/d3-selection/src/sourceEvent.js +function sourceEvent_default(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) + event = sourceEvent; + return event; +} + +// node_modules/d3-selection/src/pointer.js +function pointer_default(event, node) { + event = sourceEvent_default(event); + if (node === void 0) + node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point3 = svg.createSVGPoint(); + point3.x = event.clientX, point3.y = event.clientY; + point3 = point3.matrixTransform(node.getScreenCTM().inverse()); + return [point3.x, point3.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +// node_modules/d3-drag/src/noevent.js +function nopropagation(event) { + event.stopImmediatePropagation(); +} +function noevent_default(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-drag/src/nodrag.js +function nodrag_default(view) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, true); + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", noevent_default, true); + } else { + root2.__noselect = root2.style.MozUserSelect; + root2.style.MozUserSelect = "none"; + } +} +function yesdrag(view, noclick) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null); + if (noclick) { + selection2.on("click.drag", noevent_default, true); + setTimeout(function() { + selection2.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", null); + } else { + root2.style.MozUserSelect = root2.__noselect; + delete root2.__noselect; + } +} + +// node_modules/d3-drag/src/constant.js +var constant_default2 = (x4) => () => x4; + +// node_modules/d3-drag/src/event.js +function DragEvent(type2, { + sourceEvent, + subject, + target, + identifier, + active, + x: x4, + y: y4, + dx, + dy, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + subject: { value: subject, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + identifier: { value: identifier, enumerable: true, configurable: true }, + active: { value: active, enumerable: true, configurable: true }, + x: { value: x4, enumerable: true, configurable: true }, + y: { value: y4, enumerable: true, configurable: true }, + dx: { value: dx, enumerable: true, configurable: true }, + dy: { value: dy, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// node_modules/d3-drag/src/drag.js +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} +function defaultContainer() { + return this.parentNode; +} +function defaultSubject(event, d) { + return d == null ? { x: event.x, y: event.y } : d; +} +function defaultTouchable() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function drag_default() { + var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0; + function drag(selection2) { + selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + function mousedowned(event, d) { + if (touchending || !filter2.call(this, event, d)) + return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) + return; + select_default2(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag_default(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + function mousemoved(event) { + noevent_default(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + function mouseupped(event) { + select_default2(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent_default(event); + gestures.mouse("end", event); + } + function touchstarted(event, d) { + if (!filter2.call(this, event, d)) + return; + var touches = event.changedTouches, c3 = container.call(this, event, d), n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c3, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + function touchmoved(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent_default(event); + gesture("drag", event, touches[i]); + } + } + } + function touchended(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, 500); + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + function beforestart(that, container2, event, d, identifier, touch) { + var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch: dispatch2 + }), d)) == null) + return; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return function gesture(type2, event2, touch2) { + var p0 = p, n; + switch (type2) { + case "start": + gestures[identifier] = gesture, n = active++; + break; + case "end": + delete gestures[identifier], --active; + case "drag": + p = pointer_default(touch2 || event2, container2), n = active; + break; + } + dispatch2.call(type2, that, new DragEvent(type2, { + sourceEvent: event2, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch: dispatch2 + }), d); + }; + } + drag.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2; + }; + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container; + }; + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject; + }; + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable; + }; + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + return drag; +} + +// node_modules/d3-color/src/define.js +function define_default(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) + prototype[key] = definition[key]; + return prototype; +} + +// node_modules/d3-color/src/color.js +function Color() { +} +var darker = 0.7; +var brighter = 1 / darker; +var reI = "\\s*([+-]?\\d+)\\s*"; +var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*"; +var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; +var reHex = /^#([0-9a-f]{3,8})$/; +var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"); +var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"); +var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"); +var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"); +var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"); +var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); +var named = { + 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 +}; +define_default(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); +function color_formatHex() { + return this.rgb().formatHex(); +} +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} +function color_formatRgb() { + return this.rgb().formatRgb(); +} +function color(format2) { + var m2, l; + format2 = (format2 + "").trim().toLowerCase(); + return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; +} +function rgbn(n) { + return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1); +} +function rgba(r, g, b, a2) { + if (a2 <= 0) + r = g = b = NaN; + return new Rgb(r, g, b, a2); +} +function rgbConvert(o) { + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} +define_default(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} +function rgb_formatRgb() { + var a2 = this.opacity; + a2 = isNaN(a2) ? 1 : Math.max(0, Math.min(1, a2)); + return (a2 === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a2 === 1 ? ")" : ", " + a2 + ")"); +} +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} +function hsla(h, s, l, a2) { + if (a2 <= 0) + h = s = l = NaN; + else if (l <= 0 || l >= 1) + h = s = NaN; + else if (s <= 0) + h = NaN; + return new Hsl(h, s, l, a2); +} +function hslConvert(o) { + if (o instanceof Hsl) + return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Hsl(); + if (o instanceof Hsl) + return o; + o = o.rgb(); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max4 = Math.max(r, g, b), h = NaN, s = max4 - min3, l = (max4 + min3) / 2; + if (s) { + if (r === max4) + h = (g - b) / s + (g < b) * 6; + else if (g === max4) + h = (b - r) / s + 2; + else + h = (r - g) / s + 4; + s /= l < 0.5 ? max4 + min3 : 2 - max4 - min3; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; + return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a2 = this.opacity; + a2 = isNaN(a2) ? 1 : Math.max(0, Math.min(1, a2)); + return (a2 === 1 ? "hsl(" : "hsla(") + (this.h || 0) + ", " + (this.s || 0) * 100 + "%, " + (this.l || 0) * 100 + "%" + (a2 === 1 ? ")" : ", " + a2 + ")"); + } +})); +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; +} + +// node_modules/d3-color/src/math.js +var radians = Math.PI / 180; +var degrees = 180 / Math.PI; + +// node_modules/d3-color/src/cubehelix.js +var A = -0.14861; +var B = 1.78277; +var C = -0.29227; +var D = -0.90649; +var E = 1.97294; +var ED = E * D; +var EB = E * B; +var BC_DA = B * C - D * A; +function cubehelixConvert(o) { + if (o instanceof Cubehelix) + return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) + o = rgbConvert(o); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h), sinh2 = Math.sin(h); + return new Rgb(255 * (l + a2 * (A * cosh2 + B * sinh2)), 255 * (l + a2 * (C * cosh2 + D * sinh2)), 255 * (l + a2 * (E * cosh2)), this.opacity); + } +})); + +// node_modules/d3-interpolate/src/basis.js +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; +} +function basis_default(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/basisClosed.js +function basisClosed_default(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/constant.js +var constant_default3 = (x4) => () => x4; + +// node_modules/d3-interpolate/src/color.js +function linear(a2, d) { + return function(t) { + return a2 + t * d; + }; +} +function exponential(a2, b, y4) { + return a2 = Math.pow(a2, y4), b = Math.pow(b, y4) - a2, y4 = 1 / y4, function(t) { + return Math.pow(a2 + t * b, y4); + }; +} +function hue(a2, b) { + var d = b - a2; + return d ? linear(a2, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant_default3(isNaN(a2) ? b : a2); +} +function gamma(y4) { + return (y4 = +y4) === 1 ? nogamma : function(a2, b) { + return b - a2 ? exponential(a2, b, y4) : constant_default3(isNaN(a2) ? b : a2); + }; +} +function nogamma(a2, b) { + var d = b - a2; + return d ? linear(a2, d) : constant_default3(isNaN(a2) ? b : a2); +} + +// node_modules/d3-interpolate/src/rgb.js +var rgb_default = function rgbGamma(y4) { + var color2 = gamma(y4); + function rgb2(start2, end) { + var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.r = r(t); + start2.g = g(t); + start2.b = b(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + rgb2.gamma = rgbGamma; + return rgb2; +}(1); +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2; + for (i = 0; i < n; ++i) { + color2 = rgb(colors[i]); + r[i] = color2.r || 0; + g[i] = color2.g || 0; + b[i] = color2.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color2.opacity = 1; + return function(t) { + color2.r = r(t); + color2.g = g(t); + color2.b = b(t); + return color2 + ""; + }; + }; +} +var rgbBasis = rgbSpline(basis_default); +var rgbBasisClosed = rgbSpline(basisClosed_default); + +// node_modules/d3-interpolate/src/numberArray.js +function numberArray_default(a2, b) { + if (!b) + b = []; + var n = a2 ? Math.min(b.length, a2.length) : 0, c3 = b.slice(), i; + return function(t) { + for (i = 0; i < n; ++i) + c3[i] = a2[i] * (1 - t) + b[i] * t; + return c3; + }; +} +function isNumberArray(x4) { + return ArrayBuffer.isView(x4) && !(x4 instanceof DataView); +} + +// node_modules/d3-interpolate/src/array.js +function genericArray(a2, b) { + var nb = b ? b.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x4 = new Array(na), c3 = new Array(nb), i; + for (i = 0; i < na; ++i) + x4[i] = value_default(a2[i], b[i]); + for (; i < nb; ++i) + c3[i] = b[i]; + return function(t) { + for (i = 0; i < na; ++i) + c3[i] = x4[i](t); + return c3; + }; +} + +// node_modules/d3-interpolate/src/date.js +function date_default(a2, b) { + var d = new Date(); + return a2 = +a2, b = +b, function(t) { + return d.setTime(a2 * (1 - t) + b * t), d; + }; +} + +// node_modules/d3-interpolate/src/number.js +function number_default2(a2, b) { + return a2 = +a2, b = +b, function(t) { + return a2 * (1 - t) + b * t; + }; +} + +// node_modules/d3-interpolate/src/object.js +function object_default(a2, b) { + var i = {}, c3 = {}, k; + if (a2 === null || typeof a2 !== "object") + a2 = {}; + if (b === null || typeof b !== "object") + b = {}; + for (k in b) { + if (k in a2) { + i[k] = value_default(a2[k], b[k]); + } else { + c3[k] = b[k]; + } + } + return function(t) { + for (k in i) + c3[k] = i[k](t); + return c3; + }; +} + +// node_modules/d3-interpolate/src/string.js +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var reB = new RegExp(reA.source, "g"); +function zero(b) { + return function() { + return b; + }; +} +function one(b) { + return function(t) { + return b(t) + ""; + }; +} +function string_default(a2, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a2 = a2 + "", b = b + ""; + while ((am = reA.exec(a2)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) + s[i] += bs; + else + s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) + s[i] += bm; + else + s[++i] = bm; + } else { + s[++i] = null; + q.push({ i, x: number_default2(am, bm) }); + } + bi = reB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) + s[i] += bs; + else + s[++i] = bs; + } + return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) { + for (var i2 = 0, o; i2 < b; ++i2) + s[(o = q[i2]).i] = o.x(t); + return s.join(""); + }); +} + +// node_modules/d3-interpolate/src/value.js +function value_default(a2, b) { + var t = typeof b, c3; + return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default2 : t === "string" ? (c3 = color(b)) ? (b = c3, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default2)(a2, b); +} + +// node_modules/d3-interpolate/src/round.js +function round_default(a2, b) { + return a2 = +a2, b = +b, function(t) { + return Math.round(a2 * (1 - t) + b * t); + }; +} + +// node_modules/d3-interpolate/src/transform/decompose.js +var degrees2 = 180 / Math.PI; +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; +function decompose_default(a2, b, c3, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a2 * a2 + b * b)) + a2 /= scaleX, b /= scaleX; + if (skewX = a2 * c3 + b * d) + c3 -= a2 * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c3 * c3 + d * d)) + c3 /= scaleY, d /= scaleY, skewX /= scaleY; + if (a2 * d < b * c3) + a2 = -a2, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a2) * degrees2, + skewX: Math.atan(skewX) * degrees2, + scaleX, + scaleY + }; +} + +// node_modules/d3-interpolate/src/transform/parse.js +var svgNode; +function parseCss(value) { + const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f); +} +function parseSvg(value) { + if (value == null) + return identity; + if (!svgNode) + svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) + return identity; + value = value.matrix; + return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f); +} + +// node_modules/d3-interpolate/src/transform/index.js +function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({ i: i - 4, x: number_default2(xa, xb) }, { i: i - 2, x: number_default2(ya, yb) }); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + function rotate(a2, b, s, q) { + if (a2 !== b) { + if (a2 - b > 180) + b += 360; + else if (b - a2 > 180) + a2 += 360; + q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default2(a2, b) }); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + function skewX(a2, b, s, q) { + if (a2 !== b) { + q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default2(a2, b) }); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({ i: i - 4, x: number_default2(xa, xb) }, { i: i - 2, x: number_default2(ya, yb) }); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + return function(a2, b) { + var s = [], q = []; + a2 = parse(a2), b = parse(b); + translate(a2.translateX, a2.translateY, b.translateX, b.translateY, s, q); + rotate(a2.rotate, b.rotate, s, q); + skewX(a2.skewX, b.skewX, s, q); + scale(a2.scaleX, a2.scaleY, b.scaleX, b.scaleY, s, q); + a2 = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) + s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +// node_modules/d3-interpolate/src/zoom.js +var epsilon2 = 1e-12; +function cosh(x4) { + return ((x4 = Math.exp(x4)) + 1 / x4) / 2; +} +function sinh(x4) { + return ((x4 = Math.exp(x4)) - 1 / x4) / 2; +} +function tanh(x4) { + return ((x4 = Math.exp(2 * x4)) - 1) / (x4 + 1); +} +var zoom_default = function zoomRho(rho, rho2, rho4) { + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + i.duration = S * 1e3 * rho / Math.SQRT2; + return i; + } + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + return zoom; +}(Math.SQRT2, 2, 4); + +// node_modules/d3-interpolate/src/cubehelix.js +function cubehelix2(hue2) { + return function cubehelixGamma(y4) { + y4 = +y4; + function cubehelix3(start2, end) { + var h = hue2((start2 = cubehelix(start2)).h, (end = cubehelix(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.h = h(t); + start2.s = s(t); + start2.l = l(Math.pow(t, y4)); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + cubehelix3.gamma = cubehelixGamma; + return cubehelix3; + }(1); +} +var cubehelix_default = cubehelix2(hue); +var cubehelixLong = cubehelix2(nogamma); + +// node_modules/d3-interpolate/src/quantize.js +function quantize_default(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) + samples[i] = interpolator(i / (n - 1)); + return samples; +} + +// node_modules/d3-timer/src/timer.js +var frame = 0; +var timeout = 0; +var interval = 0; +var pokeDelay = 1e3; +var taskHead; +var taskTail; +var clockLast = 0; +var clockNow = 0; +var clockSkew = 0; +var clock = typeof performance === "object" && performance.now ? performance : Date; +var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { + setTimeout(f, 17); +}; +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} +function clearNow() { + clockNow = 0; +} +function Timer() { + this._call = this._time = this._next = null; +} +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") + throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) + taskTail._next = this; + else + taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; +function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; +} +function timerFlush() { + now(); + ++frame; + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) + t._call.call(null, e); + t = t._next; + } + --frame; +} +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} +function poke() { + var now2 = clock.now(), delay = now2 - clockLast; + if (delay > pokeDelay) + clockSkew -= delay, clockLast = now2; +} +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) + time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} +function sleep(time) { + if (frame) + return; + if (timeout) + timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) + timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) + interval = clearInterval(interval); + } else { + if (!interval) + clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +// node_modules/d3-timer/src/timeout.js +function timeout_default(callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart((elapsed) => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +// node_modules/d3-transition/src/transition/schedule.js +var emptyOn = dispatch_default("start", "end", "cancel", "interrupt"); +var emptyTween = []; +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; +function schedule_default(node, name, id2, index2, group, timing) { + var schedules = node.__transition; + if (!schedules) + node.__transition = {}; + else if (id2 in schedules) + return; + create(node, id2, { + name, + index: index2, + group, + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} +function init2(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > CREATED) + throw new Error("too late; already scheduled"); + return schedule; +} +function set2(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > STARTED) + throw new Error("too late; already running"); + return schedule; +} +function get2(node, id2) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id2])) + throw new Error("transition not found"); + return schedule; +} +function create(node, id2, self2) { + var schedules = node.__transition, tween; + schedules[id2] = self2; + self2.timer = timer(schedule, 0, self2.time); + function schedule(elapsed) { + self2.state = SCHEDULED; + self2.timer.restart(start2, self2.delay, self2.time); + if (self2.delay <= elapsed) + start2(elapsed - self2.delay); + } + function start2(elapsed) { + var i, j, n, o; + if (self2.state !== SCHEDULED) + return stop(); + for (i in schedules) { + o = schedules[i]; + if (o.name !== self2.name) + continue; + if (o.state === STARTED) + return timeout_default(start2); + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } else if (+i < id2) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + timeout_default(function() { + if (self2.state === STARTED) { + self2.state = RUNNING; + self2.timer.restart(tick2, self2.delay, self2.time); + tick2(elapsed); + } + }); + self2.state = STARTING; + self2.on.call("start", node, node.__data__, self2.index, self2.group); + if (self2.state !== STARTING) + return; + self2.state = STARTED; + tween = new Array(n = self2.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self2.tween[i].value.call(node, node.__data__, self2.index, self2.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + function tick2(elapsed) { + var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i = -1, n = tween.length; + while (++i < n) { + tween[i].call(node, t); + } + if (self2.state === ENDING) { + self2.on.call("end", node, node.__data__, self2.index, self2.group); + stop(); + } + } + function stop() { + self2.state = ENDED; + self2.timer.stop(); + delete schedules[id2]; + for (var i in schedules) + return; + delete node.__transition; + } +} + +// node_modules/d3-transition/src/interrupt.js +function interrupt_default(node, name) { + var schedules = node.__transition, schedule, active, empty3 = true, i; + if (!schedules) + return; + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty3 = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + if (empty3) + delete node.__transition; +} + +// node_modules/d3-transition/src/selection/interrupt.js +function interrupt_default2(name) { + return this.each(function() { + interrupt_default(this, name); + }); +} + +// node_modules/d3-transition/src/transition/tween.js +function tweenRemove(id2, name) { + var tween0, tween1; + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + schedule.tween = tween1; + }; +} +function tweenFunction(id2, name, value) { + var tween0, tween1; + if (typeof value !== "function") + throw new Error(); + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) + tween1.push(t); + } + schedule.tween = tween1; + }; +} +function tween_default(name, value) { + var id2 = this._id; + name += ""; + if (arguments.length < 2) { + var tween = get2(this.node(), id2).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value)); +} +function tweenValue(transition2, name, value) { + var id2 = transition2._id; + transition2.each(function() { + var schedule = set2(this, id2); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + return function(node) { + return get2(node, id2).value[name]; + }; +} + +// node_modules/d3-transition/src/transition/interpolate.js +function interpolate_default(a2, b) { + var c3; + return (typeof b === "number" ? number_default2 : b instanceof color ? rgb_default : (c3 = color(b)) ? (b = c3, rgb_default) : string_default)(a2, b); +} + +// node_modules/d3-transition/src/transition/attr.js +function attrRemove2(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS2(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrConstantNS2(fullname, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attrFunctionNS2(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attr_default2(name, value) { + var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value)); +} + +// node_modules/d3-transition/src/transition/attrTween.js +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween_default(name, value) { + var key = "attr." + name; + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + var fullname = namespace_default(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +// node_modules/d3-transition/src/transition/delay.js +function delayFunction(id2, value) { + return function() { + init2(this, id2).delay = +value.apply(this, arguments); + }; +} +function delayConstant(id2, value) { + return value = +value, function() { + init2(this, id2).delay = value; + }; +} +function delay_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay; +} + +// node_modules/d3-transition/src/transition/duration.js +function durationFunction(id2, value) { + return function() { + set2(this, id2).duration = +value.apply(this, arguments); + }; +} +function durationConstant(id2, value) { + return value = +value, function() { + set2(this, id2).duration = value; + }; +} +function duration_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration; +} + +// node_modules/d3-transition/src/transition/ease.js +function easeConstant(id2, value) { + if (typeof value !== "function") + throw new Error(); + return function() { + set2(this, id2).ease = value; + }; +} +function ease_default(value) { + var id2 = this._id; + return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease; +} + +// node_modules/d3-transition/src/transition/easeVarying.js +function easeVarying(id2, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") + throw new Error(); + set2(this, id2).ease = v; + }; +} +function easeVarying_default(value) { + if (typeof value !== "function") + throw new Error(); + return this.each(easeVarying(this._id, value)); +} + +// node_modules/d3-transition/src/transition/filter.js +function filter_default2(match) { + if (typeof match !== "function") + match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Transition(subgroups, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/merge.js +function merge_default2(transition2) { + if (transition2._id !== this._id) + throw new Error(); + for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Transition(merges, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/on.js +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) + t = t.slice(0, i); + return !t || t === "start"; + }); +} +function onFunction(id2, name, listener) { + var on0, on1, sit = start(name) ? init2 : set2; + return function() { + var schedule = sit(this, id2), on = schedule.on; + if (on !== on0) + (on1 = (on0 = on).copy()).on(name, listener); + schedule.on = on1; + }; +} +function on_default2(name, listener) { + var id2 = this._id; + return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener)); +} + +// node_modules/d3-transition/src/transition/remove.js +function removeFunction(id2) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) + if (+i !== id2) + return; + if (parent) + parent.removeChild(this); + }; +} +function remove_default2() { + return this.on("end.remove", removeFunction(this._id)); +} + +// node_modules/d3-transition/src/transition/select.js +function select_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") + select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2)); + } + } + } + return new Transition(subgroups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selectAll.js +function selectAll_default2(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") + select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children3 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children3.length; k < l; ++k) { + if (child = children3[k]) { + schedule_default(child, name, id2, k, children3, inherit2); + } + } + subgroups.push(children3); + parents.push(node); + } + } + } + return new Transition(subgroups, parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selection.js +var Selection2 = selection_default.prototype.constructor; +function selection_default2() { + return new Selection2(this._groups, this._parents); +} + +// node_modules/d3-transition/src/transition/style.js +function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} +function styleRemove2(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function styleFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + ""; + if (value1 == null) + string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function styleMaybeRemove(id2, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2; + return function() { + var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0; + if (on !== on0 || listener0 !== listener) + (on1 = (on0 = on).copy()).on(event, listener0 = listener); + schedule.on = on1; + }; +} +function style_default2(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; + return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null); +} + +// node_modules/d3-transition/src/transition/styleTween.js +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} +function styleTween_default(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +// node_modules/d3-transition/src/transition/text.js +function textConstant2(value) { + return function() { + this.textContent = value; + }; +} +function textFunction2(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} +function text_default2(value) { + return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + "")); +} + +// node_modules/d3-transition/src/transition/textTween.js +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} +function textTween_default(value) { + var key = "text"; + if (arguments.length < 1) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + return this.tween(key, textTween(value)); +} + +// node_modules/d3-transition/src/transition/transition.js +function transition_default() { + var name = this._name, id0 = this._id, id1 = newId(); + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit2 = get2(node, id0); + schedule_default(node, name, id1, i, group, { + time: inherit2.time + inherit2.delay + inherit2.duration, + delay: 0, + duration: inherit2.duration, + ease: inherit2.ease + }); + } + } + } + return new Transition(groups, this._parents, name, id1); +} + +// node_modules/d3-transition/src/transition/end.js +function end_default() { + var on0, on1, that = this, id2 = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = { value: reject }, end = { value: function() { + if (--size === 0) + resolve(); + } }; + that.each(function() { + var schedule = set2(this, id2), on = schedule.on; + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + schedule.on = on1; + }); + if (size === 0) + resolve(); + }); +} + +// node_modules/d3-transition/src/transition/index.js +var id = 0; +function Transition(groups, parents, name, id2) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id2; +} +function transition(name) { + return selection_default().transition(name); +} +function newId() { + return ++id; +} +var selection_prototype = selection_default.prototype; +Transition.prototype = transition.prototype = { + constructor: Transition, + select: select_default3, + selectAll: selectAll_default2, + filter: filter_default2, + merge: merge_default2, + selection: selection_default2, + transition: transition_default, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: on_default2, + attr: attr_default2, + attrTween: attrTween_default, + style: style_default2, + styleTween: styleTween_default, + text: text_default2, + textTween: textTween_default, + remove: remove_default2, + tween: tween_default, + delay: delay_default, + duration: duration_default, + ease: ease_default, + easeVarying: easeVarying_default, + end: end_default, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +// node_modules/d3-ease/src/cubic.js +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +// node_modules/d3-transition/src/selection/transition.js +var defaultTiming = { + time: null, + delay: 0, + duration: 250, + ease: cubicInOut +}; +function inherit(node, id2) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id2])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id2} not found`); + } + } + return timing; +} +function transition_default2(name) { + var id2, timing; + if (name instanceof Transition) { + id2 = name._id, name = name._name; + } else { + id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule_default(node, name, id2, i, group, timing || inherit(node, id2)); + } + } + } + return new Transition(groups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/selection/index.js +selection_default.prototype.interrupt = interrupt_default2; +selection_default.prototype.transition = transition_default2; + +// node_modules/d3-brush/src/brush.js +var { abs, max: max2, min } = Math; +function number1(e) { + return [+e[0], +e[1]]; +} +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x4, e) { + return x4 == null ? null : [[+x4[0], e[0][1]], [+x4[1], e[1][1]]]; + }, + output: function(xy) { + return xy && [xy[0][0], xy[1][0]]; + } +}; +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y4, e) { + return y4 == null ? null : [[e[0][0], +y4[0]], [e[1][0], +y4[1]]]; + }, + output: function(xy) { + return xy && [xy[0][1], xy[1][1]]; + } +}; +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { + return xy == null ? null : number2(xy); + }, + output: function(xy) { + return xy; + } +}; +function type(t) { + return { type: t }; +} + +// node_modules/d3-path/src/path.js +var pi = Math.PI; +var tau = 2 * pi; +var epsilon = 1e-6; +var tauEpsilon = tau - epsilon; +function Path() { + this._x0 = this._y0 = this._x1 = this._y1 = null; + this._ = ""; +} +function path() { + return new Path(); +} +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x4, y4) { + this._ += "M" + (this._x0 = this._x1 = +x4) + "," + (this._y0 = this._y1 = +y4); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x4, y4) { + this._ += "L" + (this._x1 = +x4) + "," + (this._y1 = +y4); + }, + quadraticCurveTo: function(x1, y1, x4, y4) { + this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x4) + "," + (this._y1 = +y4); + }, + bezierCurveTo: function(x1, y1, x22, y22, x4, y4) { + this._ += "C" + +x1 + "," + +y1 + "," + +x22 + "," + +y22 + "," + (this._x1 = +x4) + "," + (this._y1 = +y4); + }, + arcTo: function(x1, y1, x22, y22, r) { + x1 = +x1, y1 = +y1, x22 = +x22, y22 = +y22, r = +r; + var x0 = this._x1, y0 = this._y1, x21 = x22 - x1, y21 = y22 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01; + if (r < 0) + throw new Error("negative radius: " + r); + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } else if (!(l01_2 > epsilon)) + ; + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } else { + var x20 = x22 - x0, y20 = y22 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21; + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x4, y4, r, a0, a1, ccw) { + x4 = +x4, y4 = +y4, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x4 + dx, y0 = y4 + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0; + if (r < 0) + throw new Error("negative radius: " + r); + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + if (!r) + return; + if (da < 0) + da = da % tau + tau; + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x4 - dx) + "," + (y4 - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x4 + r * Math.cos(a1)) + "," + (this._y1 = y4 + r * Math.sin(a1)); + } + }, + rect: function(x4, y4, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x4) + "," + (this._y0 = this._y1 = +y4) + "h" + +w + "v" + +h + "h" + -w + "Z"; + }, + toString: function() { + return this._; + } +}; +var path_default = path; + +// node_modules/d3-force/src/center.js +function center_default(x4, y4) { + var nodes, strength = 1; + if (x4 == null) + x4 = 0; + if (y4 == null) + y4 = 0; + function force() { + var i, n = nodes.length, node, sx = 0, sy = 0; + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + for (sx = (sx / n - x4) * strength, sy = (sy / n - y4) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + force.initialize = function(_) { + nodes = _; + }; + force.x = function(_) { + return arguments.length ? (x4 = +_, force) : x4; + }; + force.y = function(_) { + return arguments.length ? (y4 = +_, force) : y4; + }; + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + return force; +} + +// node_modules/d3-quadtree/src/add.js +function add_default(d) { + const x4 = +this._x.call(null, d), y4 = +this._y.call(null, d); + return add(this.cover(x4, y4), x4, y4, d); +} +function add(tree, x4, y4, d) { + if (isNaN(x4) || isNaN(y4)) + return tree; + var parent, node = tree._root, leaf = { data: d }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j; + if (!node) + return tree._root = leaf, tree; + while (node.length) { + if (right = x4 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y4 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) + return parent[i] = leaf, tree; + } + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x4 === xp && y4 === yp) + return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x4 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y4 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm)); + return parent[j] = node, parent[i] = leaf, tree; +} +function addAll(data) { + var d, i, n = data.length, x4, y4, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity; + for (i = 0; i < n; ++i) { + if (isNaN(x4 = +this._x.call(null, d = data[i])) || isNaN(y4 = +this._y.call(null, d))) + continue; + xz[i] = x4; + yz[i] = y4; + if (x4 < x0) + x0 = x4; + if (x4 > x1) + x1 = x4; + if (y4 < y0) + y0 = y4; + if (y4 > y1) + y1 = y4; + } + if (x0 > x1 || y0 > y1) + return this; + this.cover(x0, y0).cover(x1, y1); + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + return this; +} + +// node_modules/d3-quadtree/src/cover.js +function cover_default(x4, y4) { + if (isNaN(x4 = +x4) || isNaN(y4 = +y4)) + return this; + var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1; + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x4)) + 1; + y1 = (y0 = Math.floor(y4)) + 1; + } else { + var z = x1 - x0 || 1, node = this._root, parent, i; + while (x0 > x4 || x4 >= x1 || y0 > y4 || y4 >= y1) { + i = (y4 < y0) << 1 | x4 < x0; + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + if (this._root && this._root.length) + this._root = node; + } + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +// node_modules/d3-quadtree/src/data.js +function data_default2() { + var data = []; + this.visit(function(node) { + if (!node.length) + do + data.push(node.data); + while (node = node.next); + }); + return data; +} + +// node_modules/d3-quadtree/src/extent.js +function extent_default(_) { + return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +// node_modules/d3-quadtree/src/quad.js +function quad_default(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +// node_modules/d3-quadtree/src/find.js +function find_default(x4, y4, radius) { + var data, x0 = this._x0, y0 = this._y0, x1, y1, x22, y22, x32 = this._x1, y32 = this._y1, quads = [], node = this._root, q, i; + if (node) + quads.push(new quad_default(node, x0, y0, x32, y32)); + if (radius == null) + radius = Infinity; + else { + x0 = x4 - radius, y0 = y4 - radius; + x32 = x4 + radius, y32 = y4 + radius; + radius *= radius; + } + while (q = quads.pop()) { + if (!(node = q.node) || (x1 = q.x0) > x32 || (y1 = q.y0) > y32 || (x22 = q.x1) < x0 || (y22 = q.y1) < y0) + continue; + if (node.length) { + var xm = (x1 + x22) / 2, ym = (y1 + y22) / 2; + quads.push(new quad_default(node[3], xm, ym, x22, y22), new quad_default(node[2], x1, ym, xm, y22), new quad_default(node[1], xm, y1, x22, ym), new quad_default(node[0], x1, y1, xm, ym)); + if (i = (y4 >= ym) << 1 | x4 >= xm) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } else { + var dx = x4 - +this._x.call(null, node.data), dy = y4 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x4 - d, y0 = y4 - d; + x32 = x4 + d, y32 = y4 + d; + data = node.data; + } + } + } + return data; +} + +// node_modules/d3-quadtree/src/remove.js +function remove_default3(d) { + if (isNaN(x4 = +this._x.call(null, d)) || isNaN(y4 = +this._y.call(null, d))) + return this; + var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x4, y4, xm, ym, right, bottom, i, j; + if (!node) + return this; + if (node.length) + while (true) { + if (right = x4 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y4 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) + return this; + if (!node.length) + break; + if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) + retainer = parent, j = i; + } + while (node.data !== d) + if (!(previous = node, node = node.next)) + return this; + if (next = node.next) + delete node.next; + if (previous) + return next ? previous.next = next : delete previous.next, this; + if (!parent) + return this._root = next, this; + next ? parent[i] = next : delete parent[i]; + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) { + if (retainer) + retainer[j] = node; + else + this._root = node; + } + return this; +} +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) + this.remove(data[i]); + return this; +} + +// node_modules/d3-quadtree/src/root.js +function root_default() { + return this._root; +} + +// node_modules/d3-quadtree/src/size.js +function size_default2() { + var size = 0; + this.visit(function(node) { + if (!node.length) + do + ++size; + while (node = node.next); + }); + return size; +} + +// node_modules/d3-quadtree/src/visit.js +function visit_default(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) + quads.push(new quad_default(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) + quads.push(new quad_default(child, xm, ym, x1, y1)); + if (child = node[2]) + quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[1]) + quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[0]) + quads.push(new quad_default(child, x0, y0, xm, ym)); + } + } + return this; +} + +// node_modules/d3-quadtree/src/visitAfter.js +function visitAfter_default(callback) { + var quads = [], next = [], q; + if (this._root) + quads.push(new quad_default(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) + quads.push(new quad_default(child, x0, y0, xm, ym)); + if (child = node[1]) + quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[2]) + quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[3]) + quads.push(new quad_default(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +// node_modules/d3-quadtree/src/x.js +function defaultX(d) { + return d[0]; +} +function x_default(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +// node_modules/d3-quadtree/src/y.js +function defaultY(d) { + return d[1]; +} +function y_default(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +// node_modules/d3-quadtree/src/quadtree.js +function quadtree(nodes, x4, y4) { + var tree = new Quadtree(x4 == null ? defaultX : x4, y4 == null ? defaultY : y4, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} +function Quadtree(x4, y4, x0, y0, x1, y1) { + this._x = x4; + this._y = y4; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = void 0; +} +function leaf_copy(leaf) { + var copy3 = { data: leaf.data }, next = copy3; + while (leaf = leaf.next) + next = next.next = { data: leaf.data }; + return copy3; +} +var treeProto = quadtree.prototype = Quadtree.prototype; +treeProto.copy = function() { + var copy3 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child; + if (!node) + return copy3; + if (!node.length) + return copy3._root = leaf_copy(node), copy3; + nodes = [{ source: node, target: copy3._root = new Array(4) }]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) + nodes.push({ source: child, target: node.target[i] = new Array(4) }); + else + node.target[i] = leaf_copy(child); + } + } + } + return copy3; +}; +treeProto.add = add_default; +treeProto.addAll = addAll; +treeProto.cover = cover_default; +treeProto.data = data_default2; +treeProto.extent = extent_default; +treeProto.find = find_default; +treeProto.remove = remove_default3; +treeProto.removeAll = removeAll; +treeProto.root = root_default; +treeProto.size = size_default2; +treeProto.visit = visit_default; +treeProto.visitAfter = visitAfter_default; +treeProto.x = x_default; +treeProto.y = y_default; + +// node_modules/d3-force/src/constant.js +function constant_default5(x4) { + return function() { + return x4; + }; +} + +// node_modules/d3-force/src/jiggle.js +function jiggle_default(random) { + return (random() - 0.5) * 1e-6; +} + +// node_modules/d3-force/src/collide.js +function x(d) { + return d.x + d.vx; +} +function y(d) { + return d.y + d.vy; +} +function collide_default(radius) { + var nodes, radii, random, strength = 1, iterations = 1; + if (typeof radius !== "function") + radius = constant_default5(radius == null ? 1 : +radius); + function force() { + var i, n = nodes.length, tree, node, xi, yi, ri, ri2; + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x4 = xi - data.x - data.vx, y4 = yi - data.y - data.vy, l = x4 * x4 + y4 * y4; + if (l < r * r) { + if (x4 === 0) + x4 = jiggle_default(random), l += x4 * x4; + if (y4 === 0) + y4 = jiggle_default(random), l += y4 * y4; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x4 *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y4 *= l) * r; + data.vx -= x4 * (r = 1 - r); + data.vy -= y4 * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + function prepare(quad) { + if (quad.data) + return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) + node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : radius; + }; + return force; +} + +// node_modules/d3-force/src/link.js +function index(d) { + return d.index; +} +function find2(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) + throw new Error("node not found: " + nodeId); + return node; +} +function link_default(links) { + var id2 = index, strength = defaultStrength, strengths, distance = constant_default5(30), distances, nodes, count2, bias, random, iterations = 1; + if (links == null) + links = []; + function defaultStrength(link2) { + return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]); + } + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link2, source, target, x4, y4, l, b; i < n; ++i) { + link2 = links[i], source = link2.source, target = link2.target; + x4 = target.x + target.vx - source.x - source.vx || jiggle_default(random); + y4 = target.y + target.vy - source.y - source.vy || jiggle_default(random); + l = Math.sqrt(x4 * x4 + y4 * y4); + l = (l - distances[i]) / l * alpha * strengths[i]; + x4 *= l, y4 *= l; + target.vx -= x4 * (b = bias[i]); + target.vy -= y4 * b; + source.vx += x4 * (b = 1 - b); + source.vy += y4 * b; + } + } + } + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link2; + for (i = 0, count2 = new Array(n); i < m2; ++i) { + link2 = links[i], link2.index = i; + if (typeof link2.source !== "object") + link2.source = find2(nodeById, link2.source); + if (typeof link2.target !== "object") + link2.target = find2(nodeById, link2.target); + count2[link2.source.index] = (count2[link2.source.index] || 0) + 1; + count2[link2.target.index] = (count2[link2.target.index] || 0) + 1; + } + for (i = 0, bias = new Array(m2); i < m2; ++i) { + link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]); + } + strengths = new Array(m2), initializeStrength(); + distances = new Array(m2), initializeDistance(); + } + function initializeStrength() { + if (!nodes) + return; + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + function initializeDistance() { + if (!nodes) + return; + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + force.id = function(_) { + return arguments.length ? (id2 = _, force) : id2; + }; + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initializeStrength(), force) : strength; + }; + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant_default5(+_), initializeDistance(), force) : distance; + }; + return force; +} + +// node_modules/d3-force/src/lcg.js +var a = 1664525; +var c = 1013904223; +var m = 4294967296; +function lcg_default() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} + +// node_modules/d3-force/src/simulation.js +function x2(d) { + return d.x; +} +function y2(d) { + return d.y; +} +var initialRadius = 10; +var initialAngle = Math.PI * (3 - Math.sqrt(5)); +function simulation_default(nodes) { + var simulation, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer(step), event = dispatch_default("tick", "end"), random = lcg_default(); + if (nodes == null) + nodes = []; + function step() { + tick2(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + function tick2(iterations) { + var i, n = nodes.length, node; + if (iterations === void 0) + iterations = 1; + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + forces.forEach(function(force) { + force(alpha); + }); + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) + node.x += node.vx *= velocityDecay; + else + node.x = node.fx, node.vx = 0; + if (node.fy == null) + node.y += node.vy *= velocityDecay; + else + node.y = node.fy, node.vy = 0; + } + } + return simulation; + } + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) + node.x = node.fx; + if (node.fy != null) + node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + function initializeForce(force) { + if (force.initialize) + force.initialize(nodes, random); + return force; + } + initializeNodes(); + return simulation = { + tick: tick2, + restart: function() { + return stepper.restart(step), simulation; + }, + stop: function() { + return stepper.stop(), simulation; + }, + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + force: function(name, _) { + return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name); + }, + find: function(x4, y4, radius) { + var i = 0, n = nodes.length, dx, dy, d2, node, closest; + if (radius == null) + radius = Infinity; + else + radius *= radius; + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x4 - node.x; + dy = y4 - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) + closest = node, radius = d2; + } + return closest; + }, + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +// node_modules/d3-force/src/manyBody.js +function manyBody_default() { + var nodes, node, random, alpha, strength = constant_default5(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81; + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x2, y2).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) + node = nodes[i], tree.visit(apply); + } + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, node2; + strengths = new Array(n); + for (i = 0; i < n; ++i) + node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes); + } + function accumulate(quad) { + var strength2 = 0, q, c3, weight = 0, x4, y4, i; + if (quad.length) { + for (x4 = y4 = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c3 = Math.abs(q.value))) { + strength2 += q.value, weight += c3, x4 += c3 * q.x, y4 += c3 * q.y; + } + } + quad.x = x4 / weight; + quad.y = y4 / weight; + } else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do + strength2 += strengths[q.data.index]; + while (q = q.next); + } + quad.value = strength2; + } + function apply(quad, x1, _, x22) { + if (!quad.value) + return true; + var x4 = quad.x - node.x, y4 = quad.y - node.y, w = x22 - x1, l = x4 * x4 + y4 * y4; + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x4 === 0) + x4 = jiggle_default(random), l += x4 * x4; + if (y4 === 0) + y4 = jiggle_default(random), l += y4 * y4; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + node.vx += x4 * quad.value * alpha / l; + node.vy += y4 * quad.value * alpha / l; + } + return true; + } else if (quad.length || l >= distanceMax2) + return; + if (quad.data !== node || quad.next) { + if (x4 === 0) + x4 = jiggle_default(random), l += x4 * x4; + if (y4 === 0) + y4 = jiggle_default(random), l += y4 * y4; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + } + do + if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x4 * w; + node.vy += y4 * w; + } + while (quad = quad.next); + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength; + }; + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + return force; +} + +// node_modules/d3-format/src/formatDecimal.js +function formatDecimal_default(x4) { + return Math.abs(x4 = Math.round(x4)) >= 1e21 ? x4.toLocaleString("en").replace(/,/g, "") : x4.toString(10); +} +function formatDecimalParts(x4, p) { + if ((i = (x4 = p ? x4.toExponential(p - 1) : x4.toExponential()).indexOf("e")) < 0) + return null; + var i, coefficient = x4.slice(0, i); + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x4.slice(i + 1) + ]; +} + +// node_modules/d3-format/src/exponent.js +function exponent_default(x4) { + return x4 = formatDecimalParts(Math.abs(x4)), x4 ? x4[1] : NaN; +} + +// node_modules/d3-format/src/formatGroup.js +function formatGroup_default(grouping, thousands) { + return function(value, width) { + var i = value.length, t = [], j = 0, g = grouping[0], length = 0; + while (i > 0 && g > 0) { + if (length + g + 1 > width) + g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) + break; + g = grouping[j = (j + 1) % grouping.length]; + } + return t.reverse().join(thousands); + }; +} + +// node_modules/d3-format/src/formatNumerals.js +function formatNumerals_default(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// node_modules/d3-format/src/formatSpecifier.js +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) + throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} +formatSpecifier.prototype = FormatSpecifier.prototype; +function FormatSpecifier(specifier) { + this.fill = specifier.fill === void 0 ? " " : specifier.fill + ""; + this.align = specifier.align === void 0 ? ">" : specifier.align + ""; + this.sign = specifier.sign === void 0 ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === void 0 ? void 0 : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === void 0 ? "" : specifier.type + ""; +} +FormatSpecifier.prototype.toString = function() { + return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type; +}; + +// node_modules/d3-format/src/formatTrim.js +function formatTrim_default(s) { + out: + for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": + i0 = i1 = i; + break; + case "0": + if (i0 === 0) + i0 = i; + i1 = i; + break; + default: + if (!+s[i]) + break out; + if (i0 > 0) + i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +// node_modules/d3-format/src/formatPrefixAuto.js +var prefixExponent; +function formatPrefixAuto_default(x4, p) { + var d = formatDecimalParts(x4, p); + if (!d) + return x4 + ""; + var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length; + return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x4, Math.max(0, p + i - 1))[0]; +} + +// node_modules/d3-format/src/formatRounded.js +function formatRounded_default(x4, p) { + var d = formatDecimalParts(x4, p); + if (!d) + return x4 + ""; + var coefficient = d[0], exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} + +// node_modules/d3-format/src/formatTypes.js +var formatTypes_default = { + "%": (x4, p) => (x4 * 100).toFixed(p), + "b": (x4) => Math.round(x4).toString(2), + "c": (x4) => x4 + "", + "d": formatDecimal_default, + "e": (x4, p) => x4.toExponential(p), + "f": (x4, p) => x4.toFixed(p), + "g": (x4, p) => x4.toPrecision(p), + "o": (x4) => Math.round(x4).toString(8), + "p": (x4, p) => formatRounded_default(x4 * 100, p), + "r": formatRounded_default, + "s": formatPrefixAuto_default, + "X": (x4) => Math.round(x4).toString(16).toUpperCase(), + "x": (x4) => Math.round(x4).toString(16) +}; + +// node_modules/d3-format/src/identity.js +function identity_default(x4) { + return x4; +} + +// node_modules/d3-format/src/locale.js +var map = Array.prototype.map; +var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; +function locale_default(locale2) { + var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + ""; + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero2 = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type; + if (type2 === "n") + comma = true, type2 = "g"; + else if (!formatTypes_default[type2]) + precision === void 0 && (precision = 12), trim = true, type2 = "g"; + if (zero2 || fill === "0" && align === "=") + zero2 = true, fill = "0", align = "="; + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : ""; + var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2); + precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision)); + function format2(value) { + var valuePrefix = prefix, valueSuffix = suffix, i, n, c3; + if (type2 === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + var valueNegative = value < 0 || 1 / value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + if (trim) + value = formatTrim_default(value); + if (valueNegative && +value === 0 && sign !== "+") + valueNegative = false; + valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c3 = value.charCodeAt(i), 48 > c3 || c3 > 57) { + valueSuffix = (c3 === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + if (comma && !zero2) + value = group(value, Infinity); + var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : ""; + if (comma && zero2) + value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; + } + return numerals(value); + } + format2.toString = function() { + return specifier + ""; + }; + return format2; + } + function formatPrefix2(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3]; + return function(value2) { + return f(k * value2) + prefix; + }; + } + return { + format: newFormat, + formatPrefix: formatPrefix2 + }; +} + +// node_modules/d3-format/src/defaultLocale.js +var locale; +var format; +var formatPrefix; +defaultLocale({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); +function defaultLocale(definition) { + locale = locale_default(definition); + format = locale.format; + formatPrefix = locale.formatPrefix; + return locale; +} + +// node_modules/d3-format/src/precisionFixed.js +function precisionFixed_default(step) { + return Math.max(0, -exponent_default(Math.abs(step))); +} + +// node_modules/d3-format/src/precisionPrefix.js +function precisionPrefix_default(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step))); +} + +// node_modules/d3-format/src/precisionRound.js +function precisionRound_default(step, max4) { + step = Math.abs(step), max4 = Math.abs(max4) - step; + return Math.max(0, exponent_default(max4) - exponent_default(step)) + 1; +} + +// node_modules/d3-hierarchy/src/cluster.js +function defaultSeparation(a2, b) { + return a2.parent === b.parent ? 1 : 2; +} +function meanX(children3) { + return children3.reduce(meanXReduce, 0) / children3.length; +} +function meanXReduce(x4, c3) { + return x4 + c3.x; +} +function maxY(children3) { + return 1 + children3.reduce(maxYReduce, 0); +} +function maxYReduce(y4, c3) { + return Math.max(y4, c3.y); +} +function leafLeft(node) { + var children3; + while (children3 = node.children) + node = children3[0]; + return node; +} +function leafRight(node) { + var children3; + while (children3 = node.children) + node = children3[children3.length - 1]; + return node; +} +function cluster_default() { + var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = false; + function cluster(root2) { + var previousNode, x4 = 0; + root2.eachAfter(function(node) { + var children3 = node.children; + if (children3) { + node.x = meanX(children3); + node.y = maxY(children3); + } else { + node.x = previousNode ? x4 += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + var left = leafLeft(root2), right = leafRight(root2), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; + return root2.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root2.x) * dx; + node.y = (root2.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root2.y ? node.y / root2.y : 1)) * dy; + }); + } + cluster.separation = function(x4) { + return arguments.length ? (separation = x4, cluster) : separation; + }; + cluster.size = function(x4) { + return arguments.length ? (nodeSize = false, dx = +x4[0], dy = +x4[1], cluster) : nodeSize ? null : [dx, dy]; + }; + cluster.nodeSize = function(x4) { + return arguments.length ? (nodeSize = true, dx = +x4[0], dy = +x4[1], cluster) : nodeSize ? [dx, dy] : null; + }; + return cluster; +} + +// node_modules/d3-hierarchy/src/hierarchy/count.js +function count(node) { + var sum = 0, children3 = node.children, i = children3 && children3.length; + if (!i) + sum = 1; + else + while (--i >= 0) + sum += children3[i].value; + node.value = sum; +} +function count_default() { + return this.eachAfter(count); +} + +// node_modules/d3-hierarchy/src/hierarchy/each.js +function each_default2(callback, that) { + let index2 = -1; + for (const node of this) { + callback.call(that, node, ++index2, this); + } + return this; +} + +// node_modules/d3-hierarchy/src/hierarchy/eachBefore.js +function eachBefore_default(callback, that) { + var node = this, nodes = [node], children3, i, index2 = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index2, this); + if (children3 = node.children) { + for (i = children3.length - 1; i >= 0; --i) { + nodes.push(children3[i]); + } + } + } + return this; +} + +// node_modules/d3-hierarchy/src/hierarchy/eachAfter.js +function eachAfter_default(callback, that) { + var node = this, nodes = [node], next = [], children3, i, n, index2 = -1; + while (node = nodes.pop()) { + next.push(node); + if (children3 = node.children) { + for (i = 0, n = children3.length; i < n; ++i) { + nodes.push(children3[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index2, this); + } + return this; +} + +// node_modules/d3-hierarchy/src/hierarchy/find.js +function find_default2(callback, that) { + let index2 = -1; + for (const node of this) { + if (callback.call(that, node, ++index2, this)) { + return node; + } + } +} + +// node_modules/d3-hierarchy/src/hierarchy/sum.js +function sum_default(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, children3 = node.children, i = children3 && children3.length; + while (--i >= 0) + sum += children3[i].value; + node.value = sum; + }); +} + +// node_modules/d3-hierarchy/src/hierarchy/sort.js +function sort_default2(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} + +// node_modules/d3-hierarchy/src/hierarchy/path.js +function path_default2(end) { + var start2 = this, ancestor = leastCommonAncestor(start2, end), nodes = [start2]; + while (start2 !== ancestor) { + start2 = start2.parent; + nodes.push(start2); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} +function leastCommonAncestor(a2, b) { + if (a2 === b) + return a2; + var aNodes = a2.ancestors(), bNodes = b.ancestors(), c3 = null; + a2 = aNodes.pop(); + b = bNodes.pop(); + while (a2 === b) { + c3 = a2; + a2 = aNodes.pop(); + b = bNodes.pop(); + } + return c3; +} + +// node_modules/d3-hierarchy/src/hierarchy/ancestors.js +function ancestors_default() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} + +// node_modules/d3-hierarchy/src/hierarchy/descendants.js +function descendants_default() { + return Array.from(this); +} + +// node_modules/d3-hierarchy/src/hierarchy/leaves.js +function leaves_default() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} + +// node_modules/d3-hierarchy/src/hierarchy/links.js +function links_default() { + var root2 = this, links = []; + root2.each(function(node) { + if (node !== root2) { + links.push({ source: node.parent, target: node }); + } + }); + return links; +} + +// node_modules/d3-hierarchy/src/hierarchy/iterator.js +function* iterator_default2() { + var node = this, current, next = [node], children3, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children3 = node.children) { + for (i = 0, n = children3.length; i < n; ++i) { + next.push(children3[i]); + } + } + } + } while (next.length); +} + +// node_modules/d3-hierarchy/src/hierarchy/index.js +function hierarchy(data, children3) { + if (data instanceof Map) { + data = [void 0, data]; + if (children3 === void 0) + children3 = mapChildren; + } else if (children3 === void 0) { + children3 = objectChildren; + } + var root2 = new Node(data), node, nodes = [root2], child, childs, i, n; + while (node = nodes.pop()) { + if ((childs = children3(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + return root2.eachBefore(computeHeight); +} +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} +function objectChildren(d) { + return d.children; +} +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} +function copyData(node) { + if (node.data.value !== void 0) + node.value = node.data.value; + node.data = node.data.data; +} +function computeHeight(node) { + var height = 0; + do + node.height = height; + while ((node = node.parent) && node.height < ++height); +} +function Node(data) { + this.data = data; + this.depth = this.height = 0; + this.parent = null; +} +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: count_default, + each: each_default2, + eachAfter: eachAfter_default, + eachBefore: eachBefore_default, + find: find_default2, + sum: sum_default, + sort: sort_default2, + path: path_default2, + ancestors: ancestors_default, + descendants: descendants_default, + leaves: leaves_default, + links: links_default, + copy: node_copy, + [Symbol.iterator]: iterator_default2 +}; + +// node_modules/d3-hierarchy/src/accessors.js +function required(f) { + if (typeof f !== "function") + throw new Error(); + return f; +} + +// node_modules/d3-hierarchy/src/constant.js +function constantZero() { + return 0; +} +function constant_default6(x4) { + return function() { + return x4; + }; +} + +// node_modules/d3-hierarchy/src/treemap/round.js +function round_default2(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} + +// node_modules/d3-hierarchy/src/treemap/dice.js +function dice_default(parent, x0, y0, x1, y1) { + var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x1 - x0) / parent.value; + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} + +// node_modules/d3-hierarchy/src/partition.js +function partition_default() { + var dx = 1, dy = 1, padding = 0, round = false; + function partition(root2) { + var n = root2.height + 1; + root2.x0 = root2.y0 = padding; + root2.x1 = dx; + root2.y1 = dy / n; + root2.eachBefore(positionNode(dy, n)); + if (round) + root2.eachBefore(round_default2); + return root2; + } + function positionNode(dy2, n) { + return function(node) { + if (node.children) { + dice_default(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n); + } + var x0 = node.x0, y0 = node.y0, x1 = node.x1 - padding, y1 = node.y1 - padding; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + partition.round = function(x4) { + return arguments.length ? (round = !!x4, partition) : round; + }; + partition.size = function(x4) { + return arguments.length ? (dx = +x4[0], dy = +x4[1], partition) : [dx, dy]; + }; + partition.padding = function(x4) { + return arguments.length ? (padding = +x4, partition) : padding; + }; + return partition; +} + +// node_modules/d3-hierarchy/src/stratify.js +var preroot = { depth: -1 }; +var ambiguous = {}; +function defaultId(d) { + return d.id; +} +function defaultParentId(d) { + return d.parentId; +} +function stratify_default() { + var id2 = defaultId, parentId = defaultParentId; + function stratify2(data) { + var nodes = Array.from(data), n = nodes.length, d, i, root2, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map(); + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node(d); + if ((nodeId = id2(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); + if (!parent) + throw new Error("missing: " + nodeId); + if (parent === ambiguous) + throw new Error("ambiguous: " + nodeId); + if (parent.children) + parent.children.push(node); + else + parent.children = [node]; + node.parent = parent; + } else { + if (root2) + throw new Error("multiple roots"); + root2 = node; + } + } + if (!root2) + throw new Error("no root"); + root2.parent = preroot; + root2.eachBefore(function(node2) { + node2.depth = node2.parent.depth + 1; + --n; + }).eachBefore(computeHeight); + root2.parent = null; + if (n > 0) + throw new Error("cycle"); + return root2; + } + stratify2.id = function(x4) { + return arguments.length ? (id2 = required(x4), stratify2) : id2; + }; + stratify2.parentId = function(x4) { + return arguments.length ? (parentId = required(x4), stratify2) : parentId; + }; + return stratify2; +} + +// node_modules/d3-hierarchy/src/tree.js +function defaultSeparation2(a2, b) { + return a2.parent === b.parent ? 1 : 2; +} +function nextLeft(v) { + var children3 = v.children; + return children3 ? children3[0] : v.t; +} +function nextRight(v) { + var children3 = v.children; + return children3 ? children3[children3.length - 1] : v.t; +} +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} +function executeShifts(v) { + var shift = 0, change = 0, children3 = v.children, i = children3.length, w; + while (--i >= 0) { + w = children3[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; + this.a = this; + this.z = 0; + this.m = 0; + this.c = 0; + this.s = 0; + this.t = null; + this.i = i; +} +TreeNode.prototype = Object.create(Node.prototype); +function treeRoot(root2) { + var tree = new TreeNode(root2, 0), node, nodes = [tree], child, children3, i, n; + while (node = nodes.pop()) { + if (children3 = node._.children) { + node.children = new Array(n = children3.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children3[i], i)); + child.parent = node; + } + } + } + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} +function tree_default() { + var separation = defaultSeparation2, dx = 1, dy = 1, nodeSize = null; + function tree(root2) { + var t = treeRoot(root2); + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + if (nodeSize) + root2.eachBefore(sizeNode); + else { + var left = root2, right = root2, bottom = root2; + root2.eachBefore(function(node) { + if (node.x < left.x) + left = node; + if (node.x > right.x) + right = node; + if (node.depth > bottom.depth) + bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, tx = s - left.x, kx = dx / (right.x + s + tx), ky = dy / (bottom.depth || 1); + root2.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + return root2; + } + function firstWalk(v) { + var children3 = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null; + if (children3) { + executeShifts(v); + var midpoint = (children3[0].z + children3[children3.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + function apportion(v, w, ancestor) { + if (w) { + var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + tree.separation = function(x4) { + return arguments.length ? (separation = x4, tree) : separation; + }; + tree.size = function(x4) { + return arguments.length ? (nodeSize = false, dx = +x4[0], dy = +x4[1], tree) : nodeSize ? null : [dx, dy]; + }; + tree.nodeSize = function(x4) { + return arguments.length ? (nodeSize = true, dx = +x4[0], dy = +x4[1], tree) : nodeSize ? [dx, dy] : null; + }; + return tree; +} + +// node_modules/d3-hierarchy/src/treemap/slice.js +function slice_default(parent, x0, y0, x1, y1) { + var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y1 - y0) / parent.value; + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} + +// node_modules/d3-hierarchy/src/treemap/squarify.js +var phi = (1 + Math.sqrt(5)) / 2; +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta; + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + do + sumValue = nodes[i1++].value; + while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) + minValue = nodeValue; + if (nodeValue > maxValue) + maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { + sumValue -= nodeValue; + break; + } + minRatio = newRatio; + } + rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) }); + if (row.dice) + dice_default(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else + slice_default(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + return rows; +} +var squarify_default = function custom(ratio) { + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + squarify.ratio = function(x4) { + return custom((x4 = +x4) > 1 ? x4 : 1); + }; + return squarify; +}(phi); + +// node_modules/d3-hierarchy/src/treemap/index.js +function treemap_default() { + var tile = squarify_default, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero; + function treemap(root2) { + root2.x0 = root2.y0 = 0; + root2.x1 = dx; + root2.y1 = dy; + root2.eachBefore(positionNode); + paddingStack = [0]; + if (round) + root2.eachBefore(round_default2); + return root2; + } + function positionNode(node) { + var p = paddingStack[node.depth], x0 = node.x0 + p, y0 = node.y0 + p, x1 = node.x1 - p, y1 = node.y1 - p; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) + x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) + y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + treemap.round = function(x4) { + return arguments.length ? (round = !!x4, treemap) : round; + }; + treemap.size = function(x4) { + return arguments.length ? (dx = +x4[0], dy = +x4[1], treemap) : [dx, dy]; + }; + treemap.tile = function(x4) { + return arguments.length ? (tile = required(x4), treemap) : tile; + }; + treemap.padding = function(x4) { + return arguments.length ? treemap.paddingInner(x4).paddingOuter(x4) : treemap.paddingInner(); + }; + treemap.paddingInner = function(x4) { + return arguments.length ? (paddingInner = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingInner; + }; + treemap.paddingOuter = function(x4) { + return arguments.length ? treemap.paddingTop(x4).paddingRight(x4).paddingBottom(x4).paddingLeft(x4) : treemap.paddingTop(); + }; + treemap.paddingTop = function(x4) { + return arguments.length ? (paddingTop = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingTop; + }; + treemap.paddingRight = function(x4) { + return arguments.length ? (paddingRight = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingRight; + }; + treemap.paddingBottom = function(x4) { + return arguments.length ? (paddingBottom = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingBottom; + }; + treemap.paddingLeft = function(x4) { + return arguments.length ? (paddingLeft = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingLeft; + }; + return treemap; +} + +// node_modules/d3-hierarchy/src/treemap/binary.js +function binary_default(parent, x0, y0, x1, y1) { + var nodes = parent.children, i, n = nodes.length, sum, sums = new Array(n + 1); + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + partition(0, n, parent.value, x0, y0, x1, y1); + function partition(i2, j, value, x02, y02, x12, y12) { + if (i2 >= j - 1) { + var node = nodes[i2]; + node.x0 = x02, node.y0 = y02; + node.x1 = x12, node.y1 = y12; + return; + } + var valueOffset = sums[i2], valueTarget = value / 2 + valueOffset, k = i2 + 1, hi = j - 1; + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) + k = mid + 1; + else + hi = mid; + } + if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k) + --k; + var valueLeft = sums[k] - valueOffset, valueRight = value - valueLeft; + if (x12 - x02 > y12 - y02) { + var xk = value ? (x02 * valueRight + x12 * valueLeft) / value : x12; + partition(i2, k, valueLeft, x02, y02, xk, y12); + partition(k, j, valueRight, xk, y02, x12, y12); + } else { + var yk = value ? (y02 * valueRight + y12 * valueLeft) / value : y12; + partition(i2, k, valueLeft, x02, y02, x12, yk); + partition(k, j, valueRight, x02, yk, x12, y12); + } + } +} + +// node_modules/d3-scale/src/init.js +function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; +} + +// node_modules/d3-scale/src/ordinal.js +var implicit = Symbol("implicit"); +function ordinal() { + var index2 = /* @__PURE__ */ new Map(), domain = [], range = [], unknown = implicit; + function scale(d) { + var key = d + "", i = index2.get(key); + if (!i) { + if (unknown !== implicit) + return unknown; + index2.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + scale.domain = function(_) { + if (!arguments.length) + return domain.slice(); + domain = [], index2 = /* @__PURE__ */ new Map(); + for (const value of _) { + const key = value + ""; + if (index2.has(key)) + continue; + index2.set(key, domain.push(value)); + } + return scale; + }; + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + initRange.apply(scale, arguments); + return scale; +} + +// node_modules/d3-scale/src/band.js +function band() { + var scale = ordinal().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, r0 = 0, r1 = 1, step, bandwidth, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5; + delete scale.unknown; + function rescale() { + var n = domain().length, reverse = r1 < r0, start2 = reverse ? r1 : r0, stop = reverse ? r0 : r1; + step = (stop - start2) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) + step = Math.floor(step); + start2 += (stop - start2 - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) + start2 = Math.round(start2), bandwidth = Math.round(bandwidth); + var values = range_default(n).map(function(i) { + return start2 + step * i; + }); + return ordinalRange(reverse ? values.reverse() : values); + } + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + scale.range = function(_) { + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); + }; + scale.bandwidth = function() { + return bandwidth; + }; + scale.step = function() { + return step; + }; + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + scale.copy = function() { + return band(domain(), [r0, r1]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align); + }; + return initRange.apply(rescale(), arguments); +} +function pointish(scale) { + var copy3 = scale.copy; + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + scale.copy = function() { + return pointish(copy3()); + }; + return scale; +} +function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} + +// node_modules/d3-scale/src/constant.js +function constants(x4) { + return function() { + return x4; + }; +} + +// node_modules/d3-scale/src/number.js +function number(x4) { + return +x4; +} + +// node_modules/d3-scale/src/continuous.js +var unit = [0, 1]; +function identity2(x4) { + return x4; +} +function normalize(a2, b) { + return (b -= a2 = +a2) ? function(x4) { + return (x4 - a2) / b; + } : constants(isNaN(b) ? NaN : 0.5); +} +function clamper(a2, b) { + var t; + if (a2 > b) + t = a2, a2 = b, b = t; + return function(x4) { + return Math.max(a2, Math.min(b, x4)); + }; +} +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) + d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else + d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x4) { + return r0(d0(x4)); + }; +} +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1; + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + return function(x4) { + var i2 = bisect_default(domain, x4, 1, j) - 1; + return r[i2](d[i2](x4)); + }; +} +function copy2(source, target) { + return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown()); +} +function transformer() { + var domain = unit, range = unit, interpolate = value_default, transform2, untransform, unknown, clamp = identity2, piecewise, output, input; + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity2) + clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + function scale(x4) { + return x4 == null || isNaN(x4 = +x4) ? unknown : (output || (output = piecewise(domain.map(transform2), range, interpolate)))(transform2(clamp(x4))); + } + scale.invert = function(y4) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform2), number_default2)))(y4))); + }; + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice(); + }; + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = round_default, rescale(); + }; + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity2, rescale()) : clamp !== identity2; + }; + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + return function(t, u) { + transform2 = t, untransform = u; + return rescale(); + }; +} +function continuous() { + return transformer()(identity2, identity2); +} + +// node_modules/d3-scale/src/tickFormat.js +function tickFormat(start2, stop, count2, specifier) { + var step = tickStep(start2, stop, count2), precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start2), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix_default(step, value))) + specifier.precision = precision; + return formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop))))) + specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed_default(step))) + specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return format(specifier); +} + +// node_modules/d3-scale/src/linear.js +function linearish(scale) { + var domain = scale.domain; + scale.ticks = function(count2) { + var d = domain(); + return ticks_default(d[0], d[d.length - 1], count2 == null ? 10 : count2); + }; + scale.tickFormat = function(count2, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count2 == null ? 10 : count2, specifier); + }; + scale.nice = function(count2) { + if (count2 == null) + count2 = 10; + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start2 = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + if (stop < start2) { + step = start2, start2 = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + while (maxIter-- > 0) { + step = tickIncrement(start2, stop, count2); + if (step === prestep) { + d[i0] = start2; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start2 = Math.floor(start2 / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start2 = Math.ceil(start2 * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + return scale; + }; + return scale; +} +function linear2() { + var scale = continuous(); + scale.copy = function() { + return copy2(scale, linear2()); + }; + initRange.apply(scale, arguments); + return linearish(scale); +} + +// node_modules/d3-scale-chromatic/src/colors.js +function colors_default(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) + colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +// node_modules/d3-scale-chromatic/src/categorical/category10.js +var category10_default = colors_default("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +// node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js +var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.5, 0.8)); +var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.5, 0.8)); +var c2 = cubehelix(); +function rainbow_default(t) { + if (t < 0 || t > 1) + t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c2.h = 360 * t - 100; + c2.s = 1.5 - 1.5 * ts; + c2.l = 0.8 - 0.9 * ts; + return c2 + ""; +} + +// node_modules/d3-shape/src/constant.js +function constant_default7(x4) { + return function constant() { + return x4; + }; +} + +// node_modules/d3-shape/src/math.js +var abs2 = Math.abs; +var atan2 = Math.atan2; +var cos = Math.cos; +var max3 = Math.max; +var min2 = Math.min; +var sin = Math.sin; +var sqrt = Math.sqrt; +var epsilon3 = 1e-12; +var pi2 = Math.PI; +var halfPi = pi2 / 2; +var tau2 = 2 * pi2; +function acos(x4) { + return x4 > 1 ? 0 : x4 < -1 ? pi2 : Math.acos(x4); +} +function asin(x4) { + return x4 >= 1 ? halfPi : x4 <= -1 ? -halfPi : Math.asin(x4); +} + +// node_modules/d3-shape/src/arc.js +function arcInnerRadius(d) { + return d.innerRadius; +} +function arcOuterRadius(d) { + return d.outerRadius; +} +function arcStartAngle(d) { + return d.startAngle; +} +function arcEndAngle(d) { + return d.endAngle; +} +function arcPadAngle(d) { + return d && d.padAngle; +} +function intersect(x0, y0, x1, y1, x22, y22, x32, y32) { + var x10 = x1 - x0, y10 = y1 - y0, x322 = x32 - x22, y322 = y32 - y22, t = y322 * x10 - x322 * y10; + if (t * t < epsilon3) + return; + t = (x322 * (y0 - y22) - y322 * (x0 - x22)) / t; + return [x0 + t * x10, y0 + t * y10]; +} +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt(max3(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d) / d2, cy0 = (-D2 * dx - dy * d) / d2, cx1 = (D2 * dy + dx * d) / d2, cy1 = (-D2 * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) + cx0 = cx1, cy0 = cy1; + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} +function arc_default() { + var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant_default7(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null; + function arc() { + var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi, a1 = endAngle.apply(this, arguments) - halfPi, da = abs2(a1 - a0), cw = a1 > a0; + if (!context) + context = buffer = path_default(); + if (r1 < r0) + r = r1, r1 = r0, r0 = r; + if (!(r1 > epsilon3)) + context.moveTo(0, 0); + else if (da > tau2 - epsilon3) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon3) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } else { + var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon3 && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), rc = min2(abs2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1; + if (rp > epsilon3) { + var p0 = asin(rp / r0 * sin(ap)), p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon3) + p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0; + else + da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon3) + p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1; + else + da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + var x01 = r1 * cos(a01), y01 = r1 * sin(a01), x10 = r0 * cos(a10), y10 = r0 * sin(a10); + if (rc > epsilon3) { + var x11 = r1 * cos(a11), y11 = r1 * sin(a11), x00 = r0 * cos(a00), y00 = r0 * sin(a00), oc; + if (da < pi2 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min2(rc, (r0 - lc) / (kc - 1)); + rc1 = min2(rc, (r1 - lc) / (kc + 1)); + } + } + if (!(da1 > epsilon3)) + context.moveTo(x01, y01); + else if (rc1 > epsilon3) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + if (rc1 < rc) + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } else + context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + if (!(r0 > epsilon3) || !(da0 > epsilon3)) + context.lineTo(x10, y10); + else if (rc0 > epsilon3) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + if (rc0 < rc) + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } else + context.arc(0, 0, r0, a10, a00, cw); + } + context.closePath(); + if (buffer) + return context = null, buffer + "" || null; + } + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi2 / 2; + return [cos(a2) * r, sin(a2) * r]; + }; + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : innerRadius; + }; + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : outerRadius; + }; + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : cornerRadius; + }; + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant_default7(+_), arc) : padRadius; + }; + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : startAngle; + }; + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : endAngle; + }; + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : padAngle; + }; + arc.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, arc) : context; + }; + return arc; +} + +// node_modules/d3-shape/src/array.js +var slice = Array.prototype.slice; +function array_default2(x4) { + return typeof x4 === "object" && "length" in x4 ? x4 : Array.from(x4); +} + +// node_modules/d3-shape/src/curve/linear.js +function Linear(context) { + this._context = context; +} +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || this._line !== 0 && this._point === 1) + this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x4, y4) { + x4 = +x4, y4 = +y4; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x4, y4) : this._context.moveTo(x4, y4); + break; + case 1: + this._point = 2; + default: + this._context.lineTo(x4, y4); + break; + } + } +}; +function linear_default(context) { + return new Linear(context); +} + +// node_modules/d3-shape/src/point.js +function x3(p) { + return p[0]; +} +function y3(p) { + return p[1]; +} + +// node_modules/d3-shape/src/line.js +function line_default(x4, y4) { + var defined = constant_default7(true), context = null, curve = linear_default, output = null; + x4 = typeof x4 === "function" ? x4 : x4 === void 0 ? x3 : constant_default7(x4); + y4 = typeof y4 === "function" ? y4 : y4 === void 0 ? y3 : constant_default7(y4); + function line(data) { + var i, n = (data = array_default2(data)).length, d, defined0 = false, buffer; + if (context == null) + output = curve(buffer = path_default()); + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) + output.lineStart(); + else + output.lineEnd(); + } + if (defined0) + output.point(+x4(d, i, data), +y4(d, i, data)); + } + if (buffer) + return output = null, buffer + "" || null; + } + line.x = function(_) { + return arguments.length ? (x4 = typeof _ === "function" ? _ : constant_default7(+_), line) : x4; + }; + line.y = function(_) { + return arguments.length ? (y4 = typeof _ === "function" ? _ : constant_default7(+_), line) : y4; + }; + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant_default7(!!_), line) : defined; + }; + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + return line; +} + +// node_modules/d3-shape/src/curve/radial.js +var curveRadialLinear = curveRadial(linear_default); +function Radial(curve) { + this._curve = curve; +} +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a2, r) { + this._curve.point(r * Math.sin(a2), r * -Math.cos(a2)); + } +}; +function curveRadial(curve) { + function radial(context) { + return new Radial(curve(context)); + } + radial._curve = curve; + return radial; +} + +// node_modules/d3-shape/src/lineRadial.js +function lineRadial(l) { + var c3 = l.curve; + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + l.curve = function(_) { + return arguments.length ? c3(curveRadial(_)) : c3()._curve; + }; + return l; +} +function lineRadial_default() { + return lineRadial(line_default().curve(curveRadialLinear)); +} + +// node_modules/d3-shape/src/link/index.js +function linkSource(d) { + return d.source; +} +function linkTarget(d) { + return d.target; +} +function link(curve) { + var source = linkSource, target = linkTarget, x4 = x3, y4 = y3, context = null; + function link2() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) + context = buffer = path_default(); + curve(context, +x4.apply(this, (argv[0] = s, argv)), +y4.apply(this, argv), +x4.apply(this, (argv[0] = t, argv)), +y4.apply(this, argv)); + if (buffer) + return context = null, buffer + "" || null; + } + link2.source = function(_) { + return arguments.length ? (source = _, link2) : source; + }; + link2.target = function(_) { + return arguments.length ? (target = _, link2) : target; + }; + link2.x = function(_) { + return arguments.length ? (x4 = typeof _ === "function" ? _ : constant_default7(+_), link2) : x4; + }; + link2.y = function(_) { + return arguments.length ? (y4 = typeof _ === "function" ? _ : constant_default7(+_), link2) : y4; + }; + link2.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, link2) : context; + }; + return link2; +} +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} +function linkHorizontal() { + return link(curveHorizontal); +} + +// node_modules/d3-shape/src/curve/basis.js +function point2(that, x4, y4) { + that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x4) / 6, (that._y0 + 4 * that._y1 + y4) / 6); +} +function Basis(context) { + this._context = context; +} +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: + point2(this, this._x1, this._y1); + case 2: + this._context.lineTo(this._x1, this._y1); + break; + } + if (this._line || this._line !== 0 && this._point === 1) + this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x4, y4) { + x4 = +x4, y4 = +y4; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x4, y4) : this._context.moveTo(x4, y4); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); + default: + point2(this, x4, y4); + break; + } + this._x0 = this._x1, this._x1 = x4; + this._y0 = this._y1, this._y1 = y4; + } +}; + +// node_modules/d3-shape/src/curve/bundle.js +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x4 = this._x, y4 = this._y, j = x4.length - 1; + if (j > 0) { + var x0 = x4[0], y0 = y4[0], dx = x4[j] - x0, dy = y4[j] - y0, i = -1, t; + while (++i <= j) { + t = i / j; + this._basis.point(this._beta * x4[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y4[i] + (1 - this._beta) * (y0 + t * dy)); + } + } + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x4, y4) { + this._x.push(+x4); + this._y.push(+y4); + } +}; +var bundle_default = function custom2(beta) { + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + bundle.beta = function(beta2) { + return custom2(+beta2); + }; + return bundle; +}(0.85); + +// node_modules/d3-zoom/src/constant.js +var constant_default8 = (x4) => () => x4; + +// node_modules/d3-zoom/src/event.js +function ZoomEvent(type2, { + sourceEvent, + target, + transform: transform2, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + transform: { value: transform2, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} + +// node_modules/d3-zoom/src/transform.js +function Transform(k, x4, y4) { + this.k = k; + this.x = x4; + this.y = y4; +} +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x4, y4) { + return x4 === 0 & y4 === 0 ? this : new Transform(this.k, this.x + this.k * x4, this.y + this.k * y4); + }, + apply: function(point3) { + return [point3[0] * this.k + this.x, point3[1] * this.k + this.y]; + }, + applyX: function(x4) { + return x4 * this.k + this.x; + }, + applyY: function(y4) { + return y4 * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x4) { + return (x4 - this.x) / this.k; + }, + invertY: function(y4) { + return (y4 - this.y) / this.k; + }, + rescaleX: function(x4) { + return x4.copy().domain(x4.range().map(this.invertX, this).map(x4.invert, x4)); + }, + rescaleY: function(y4) { + return y4.copy().domain(y4.range().map(this.invertY, this).map(y4.invert, y4)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; +var identity3 = new Transform(1, 0, 0); +transform.prototype = Transform.prototype; +function transform(node) { + while (!node.__zoom) + if (!(node = node.parentNode)) + return identity3; + return node.__zoom; +} + +// node_modules/d3-zoom/src/noevent.js +function nopropagation3(event) { + event.stopImmediatePropagation(); +} +function noevent_default3(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-zoom/src/zoom.js +function defaultFilter2(event) { + return (!event.ctrlKey || event.type === "wheel") && !event.button; +} +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} +function defaultTransform() { + return this.__zoom || identity3; +} +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1); +} +function defaultTouchable2() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function defaultConstrain(transform2, extent, translateExtent) { + var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1]; + return transform2.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)); +} +function zoom_default2() { + var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10; + function zoom(selection2) { + selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + zoom.transform = function(collection, transform2, point3, event) { + var selection2 = collection.selection ? collection.selection() : collection; + selection2.property("__zoom", defaultTransform); + if (collection !== selection2) { + schedule(collection, transform2, point3, event); + } else { + selection2.interrupt().each(function() { + gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); + }); + } + }; + zoom.scaleBy = function(selection2, k, p, event) { + zoom.scaleTo(selection2, function() { + var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + zoom.scaleTo = function(selection2, k, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + zoom.translateBy = function(selection2, x4, y4, event) { + zoom.transform(selection2, function() { + return constrain(this.__zoom.translate(typeof x4 === "function" ? x4.apply(this, arguments) : x4, typeof y4 === "function" ? y4.apply(this, arguments) : y4), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + zoom.translateTo = function(selection2, x4, y4, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity3.translate(p0[0], p0[1]).scale(t.k).translate(typeof x4 === "function" ? -x4.apply(this, arguments) : -x4, typeof y4 === "function" ? -y4.apply(this, arguments) : -y4), e, translateExtent); + }, p, event); + }; + function scale(transform2, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + } + function translate(transform2, p0, p1) { + var x4 = p0[0] - p1[0] * transform2.k, y4 = p0[1] - p1[1] * transform2.k; + return x4 === transform2.x && y4 === transform2.y ? transform2 : new Transform(transform2.k, x4, y4); + } + function centroid(extent2) { + return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; + } + function schedule(transition2, transform2, point3, event) { + transition2.on("start.zoom", function() { + gesture(this, arguments).event(event).start(); + }).on("interrupt.zoom end.zoom", function() { + gesture(this, arguments).event(event).end(); + }).tween("zoom", function() { + var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point3 == null ? centroid(e) : typeof point3 === "function" ? point3.apply(that, args) : point3, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a2 = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a2.invert(p).concat(w / a2.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) + t = b; + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + function gesture(that, args, clean) { + return !clean && that.__zooming || new Gesture(that, args); + } + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + Gesture.prototype = { + event: function(event) { + if (event) + this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform2) { + if (this.mouse && key !== "mouse") + this.mouse[1] = transform2.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") + this.touch0[1] = transform2.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") + this.touch1[1] = transform2.invert(this.touch1[0]); + this.that.__zoom = transform2; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type2) { + var d = select_default2(this.that).datum(); + listeners.call(type2, this.that, new ZoomEvent(type2, { + sourceEvent: this.sourceEvent, + target: zoom, + type: type2, + transform: this.that.__zoom, + dispatch: listeners + }), d); + } + }; + function wheeled(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event); + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } else if (t.k === k) + return; + else { + g.mouse = [p, t.invert(p)]; + interrupt_default(this); + g.start(); + } + noevent_default3(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function wheelidled() { + g.wheel = null; + g.end(); + } + } + function mousedowned(event, ...args) { + if (touchending || !filter2.apply(this, arguments)) + return; + var g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), currentTarget = event.currentTarget, x0 = event.clientX, y0 = event.clientY; + nodrag_default(event.view); + nopropagation3(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt_default(this); + g.start(); + function mousemoved(event2) { + noevent_default3(event2); + if (!g.moved) { + var dx = event2.clientX - x0, dy = event2.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + function mouseupped(event2) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event2.view, g.moved); + noevent_default3(event2); + g.event(event2).end(); + } + } + function dblclicked(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var t0 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + noevent_default3(event); + if (duration > 0) + select_default2(this).transition().duration(duration).call(schedule, t1, p0, event); + else + select_default2(this).call(zoom.transform, t1, p0, event); + } + function touchstarted(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; + nopropagation3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) + g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) + g.touch1 = p, g.taps = 0; + } + if (touchstarting) + touchstarting = clearTimeout(touchstarting); + if (started) { + if (g.taps < 2) + touchfirst = p[0], touchstarting = setTimeout(function() { + touchstarting = null; + }, touchDelay); + interrupt_default(this); + g.start(); + } + } + function touchmoved(event, ...args) { + if (!this.__zooming) + return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l; + noevent_default3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) + g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) + g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) + p = g.touch0[0], l = g.touch0[1]; + else + return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + function touchended(event, ...args) { + if (!this.__zooming) + return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t; + nopropagation3(event); + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) + delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) + delete g.touch1; + } + if (g.touch1 && !g.touch0) + g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) + g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + if (g.taps === 2) { + t = pointer_default(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select_default2(this).on("dblclick.zoom"); + if (p) + p.apply(this, arguments); + } + } + } + } + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default8(+_), zoom) : wheelDelta; + }; + zoom.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default8(!!_), zoom) : filter2; + }; + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default8(!!_), zoom) : touchable; + }; + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default8([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + return zoom; +} + +// src/Visualisations/VisModal.ts +var import_obsidian43 = require("obsidian"); + +// src/Components/VisComp.svelte +var import_loglevel21 = __toESM(require_loglevel()); + +// src/Visualisations/ArcDiagram.ts +var arcDiagram = (graph, currFile, modal, width, height) => { + const data = graphlibToD3(graph); + const margin = { top: 20, right: 20, bottom: 20, left: 150 }; + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width); + const nodes = data.nodes.map(({ id: id2, name }) => ({ + id: id2, + name, + sourceLinks: [], + targetLinks: [] + })); + const nodeById = new Map(nodes.map((d) => [d.id, d])); + const links = data.links.map(({ source, target }) => ({ + source: nodeById.get(source), + target: nodeById.get(target) + })); + for (const link2 of links) { + const { source, target } = link2; + source.sourceLinks.push(link2); + target.targetLinks.push(link2); + } + svg.append("style").text(` + +path { + stroke: #808080; + opacity: 0.8; +} + +text { + stroke: var(--text-a); + opacity: 0.8; +} + + +.hover g.primary text { + fill: black; +} + +.hover g.secondary text { + fill: #333; +} + +.hover .secondary { + color: red; +} + +.hover path.primary { + stroke: #333; + stroke-opacity: 1; +} + +.hover rect { + opacity: 1; + cursor: pointer; +} + +`); + const y4 = point(nodes.map((d) => d.name).sort(ascending_default), [ + margin.top, + height - margin.bottom + ]); + const label = svg.append("g").attr("font-family", "sans-serif").attr("font-size", 10).attr("text-anchor", "end").selectAll("g").data(nodes).join("g").attr("transform", (d) => `translate(${margin.left},${d.y = y4(d.name)})`).call((g) => g.append("text").attr("x", -6).attr("dy", "0.35em").text((d) => d.name)).call((g) => g.append("circle").attr("r", 3)); + const path2 = svg.insert("g", "*").attr("fill", "none").attr("stroke-opacity", 0.6).attr("stroke-width", 1.5).selectAll("path").data(links).join("path").attr("d", arc); + const step = 104; + const nodeClick = (event, dest) => { + openOrSwitch(dest, event); + modal.close(); + }; + const overlay = svg.append("g").attr("fill", "none").attr("pointer-events", "all").selectAll("rect").data(nodes).join("rect").attr("width", margin.left + 40).attr("height", step).attr("y", (d) => y4(d.name) - step / 2).on("mouseover", (d) => { + svg.classed("hover", true); + label.classed("primary", (n) => n === d); + label.classed("secondary", (n) => n.sourceLinks.some((l) => l.target === d) || n.targetLinks.some((l) => l.source === d)); + path2.classed("primary", (l) => l.source === d || l.target === d).filter(".primary").raise(); + }).on("mouseout", (d) => { + svg.classed("hover", false); + label.classed("primary", false); + label.classed("secondary", false); + path2.classed("primary", false).order(); + }).on("click", (event, d) => { + nodeClick(event, d.name); + }); + function arc(d) { + const y1 = d.source.y; + const y22 = d.target.y; + const r = Math.abs(y22 - y1) / 2; + return `M${margin.left},${y1}A${r},${r} 0,0,${y1 < y22 ? 1 : 0} ${margin.left},${y22}`; + } + function zoomed({ transform: transform2 }) { + svg.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 8]).on("zoom", zoomed)); +}; + +// src/Visualisations/CirclePacking.ts +var circlePacking = (graph, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy2 = stratify_default()(flatAdj); + console.log({ hierarchy: hierarchy2 }); + const adjList = bfsAdjList(graph, currFile.basename); + console.log({ adjList }); + const noDoubles = [...adjList]; + noDoubles.forEach((a2, i) => { + if (noDoubles.some((b, j) => i !== j && a2.name === b.name)) { + const index2 = noDoubles.findIndex((b, j) => i !== j && a2.name === b.name); + noDoubles.splice(index2, 1); + } + }); + console.log({ noDoubles }); + const linkArr = noDoubles.map((d) => { + return { source: d.name, target: d.parentId }; + }); + const links = linkArr.map((d) => Object.create(d)); + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width); + const nodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); + const node = svg.append("g").selectAll("circle").data(noDoubles).join("circle").attr("r", (d) => Math.round(d.height / 10) + 10).attr("cx", width / 2).attr("cy", height / 2).style("fill", nodeColour).style("fill-opacity", 0.6).attr("stroke", nodeColour).style("stroke-width", 4); + node.attr("aria-label", (d) => d.name); + const nodeClick = (event, dest) => { + const currFile2 = getCurrFile(); + openOrSwitch(dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + nodeClick(event, d.name); + }); + const link2 = svg.append("g").attr("stroke", "#868282").attr("stroke-opacity", 0.6).selectAll("line").data(links).join("line").attr("stroke-width", 0.8); + const simulation = simulation_default().force("center", center_default().x(width / 2).y(height / 2)).force("charge", manyBody_default().strength(0.5)).force("collide", collide_default().strength(0.025).radius(30).iterations(1)); + simulation.nodes(noDoubles).on("tick", function(d) { + node.attr("cx", (d2) => d2.x).attr("cy", (d2) => d2.y); + }); + function zoomed({ transform: transform2 }) { + node.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 8]).on("zoom", zoomed)); + const drag = (simulation2) => { + function dragstarted(event, d) { + if (!event.active) + simulation2.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + } + function dragged(event, d) { + d.fx = event.x; + d.fy = event.y; + } + function dragended(event, d) { + if (!event.active) + simulation2.alphaTarget(0); + d.fx = null; + d.fy = null; + } + return drag_default().on("start", dragstarted).on("drag", dragged).on("end", dragended); + }; + node.call(drag(simulation)); +}; + +// src/Visualisations/EdgeBundling.ts +var edgeBundling = (graph, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hier = stratify_default()(flatAdj); + console.log({ hier }); + const PADDING_BUBBLE = 15; + const PADDING_LABEL = 30; + const BUBBLE_SIZE_MIN = 4; + const BUBBLE_SIZE_MAX = 20; + var diameter = 560, radius = diameter / 2, innerRadius = radius - 170; + var cluster = cluster_default().size([360, innerRadius]); + var line = lineRadial_default().curve(bundle_default.beta(0.85)).radius(function(d) { + return d[1]; + }).angle(function(d) { + return d[0] / 180 * Math.PI; + }); + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).append("g").attr("transform", "translate(" + radius + "," + radius + ")"); + var link2 = svg.append("g").selectAll(".link"), label = svg.append("g").selectAll(".label"), bubble = svg.append("g").selectAll(".bubble"); + var bubbleSizeScale = linear2().domain([0, 100]).range([BUBBLE_SIZE_MIN, BUBBLE_SIZE_MAX]); + var root2 = packageHierarchy(hier).sum(function(d) { + console.log(d); + return d.height; + }); + cluster(root2); + const leaves = root2.leaves(); + const _link = link2.data(packageImports(leaves)).enter().append("path").each(function(d) { + d.source = d[0], d.target = d[d.length - 1]; + }).attr("class", "link").attr("d", line).attr("fill", "none").attr("stroke", "black"); + const _label = label.data(leaves).enter().append("text").attr("class", "label").attr("dy", "0.31em").attr("transform", function(d) { + return "rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_LABEL) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); + }).attr("text-anchor", function(d) { + return d.x < 180 ? "start" : "end"; + }).text(function(d) { + return d.data.key; + }); + const _bubble = bubble.data(leaves).enter().append("circle").attr("class", "bubble").attr("transform", function(d) { + return "rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_BUBBLE) + ",0)"; + }).attr("r", (d) => bubbleSizeScale(d.value)).attr("stroke", "black").attr("fill", "#69a3b2").style("opacity", 0.2); + function packageHierarchy(classes) { + var map2 = {}; + function find3(name, data) { + var node = map2[name], i; + if (!node) { + node = map2[name] = data || { name, children: [] }; + if (name.length) { + node.parent = find3(name.substring(0, i = name.lastIndexOf("."))); + node.parent.children.push(node); + node.key = name.substring(i + 1); + } + } + return node; + } + classes.forEach(function(d) { + find3(d.name, d); + }); + return hierarchy(map2[""]); + } + function packageImports(nodes) { + var map2 = {}, imports = []; + nodes.forEach(function(d) { + map2[d.data.name] = d; + }); + nodes.forEach(function(d) { + if (d.data.imports) + d.data.imports.forEach(function(i) { + imports.push(map2[d.data.name].path(map2[i])); + }); + }); + return imports; + } +}; + +// src/Visualisations/ForceDirectedG.ts +var forceDirectedG = (graph, currFile, modal, width, height) => { + const { settings } = modal.plugin; + let nodeToGetTo = currFile.basename; + console.log({ nodeToGetTo }); + console.time("Find all paths"); + console.timeEnd("Find all paths"); + const defaultNodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); + let currNodeColour = defaultNodeColour; + const colourChangeInput = select_default2(".d3-graph").append("input").attr("type", "color"); + colourChangeInput.on("change", function changeColor(el) { + currNodeColour = el.target.value; + node.transition().duration(300).style("fill", (d) => { + if (d.index === currNodeIndex) + return; + return currNodeColour; + }); + }); + const data = graphlibToD3(graph); + const links = data.links.map((d) => Object.create(d)); + const currNode = data.nodes.find((node2) => node2.name === currFile.basename); + let currNodeIndex; + if (!currNode) { + const id2 = data.nodes.length; + data.nodes.push({ id: id2, name: currFile.basename }); + currNodeIndex = id2; + } else { + currNodeIndex = currNode.id; + } + const nodes = data.nodes.map((d) => Object.create(d)); + const simulation = simulation_default(nodes).force("link", link_default(links).id((d) => d.id)).force("charge", manyBody_default().strength(-8)).force("center", center_default(width / 2, height / 2).strength(0.5)); + const drag = (simulation2) => { + function dragstarted(event, d) { + if (!event.active) + simulation2.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + } + function dragged(event, d) { + d.fx = event.x; + d.fy = event.y; + } + function dragended(event, d) { + if (!event.active) + simulation2.alphaTarget(0); + d.fx = null; + d.fy = null; + } + return drag_default().on("start", dragstarted).on("drag", dragged).on("end", dragended); + }; + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).attr("class", "forceDirectedG"); + const link2 = svg.append("g").attr("stroke", "#868282").attr("stroke-opacity", 0.6).selectAll("line").data(links).join("line").attr("stroke-width", 0.8).attr("marker-end", "url(#end)"); + var path2 = svg.append("svg:g").selectAll("path").data(links).enter().append("svg:path").attr("class", "link").attr("marker-end", "url(#end)"); + const arrowHead = svg.append("svg:defs").selectAll("marker").data(["end"]).enter().append("svg:marker").attr("id", String).attr("viewBox", "0 -5 10 10").attr("refX", 20).attr("refY", 0.1).attr("markerWidth", 6).attr("markerHeight", 6).attr("orient", "auto").attr("stroke-width", 10).append("svg:path").attr("d", "M0,-5L10,0L0,5"); + const nameFromIndex = (d) => data.nodes.find((node2) => node2.id === d.index).name; + const indexFromName = (name) => data.nodes.find((node2) => node2.name === name).id; + const node = svg.append("g").selectAll("circle").data(nodes).join("circle").attr("r", 5).attr("fill", (d) => { + if (nameFromIndex(d) === currFile.basename) { + return "#ffffff"; + } else { + return currNodeColour; + } + }).call(drag(simulation)); + node.attr("aria-label", (d) => d.name); + const nodeClick = (event, dest) => { + openOrSwitch(dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + nodeClick(event, d.name); + }); + node.on("mousedown", (event, d) => { + if (event.button === 2) { + nodeToGetTo = d.name; + node.style("fill", (n) => { + if (n.name === nodeToGetTo) { + return "#ff0000"; + } else + return currNodeColour; + }); + } + }); + function linked(a2, b) { + if (a2 === b) + return true; + const linkedArr = links.find((link3) => link3.source.index === a2 && link3.target.index === b || link3.target.index === a2 && link3.source.index === b); + return !!linkedArr; + } + node.on("mouseover", (event, d) => { + node.transition().duration(150).style("opacity", (o) => { + return linked(d.index, o.index) ? 1 : 0.2; + }); + link2.transition().duration(150).style("opacity", function(o) { + return o.source.index === d.index || o.target.index === d.index ? 1 : 0.2; + }); + const hoveredNode = nameFromIndex(d); + }).on("mouseout", unfocus); + function focusNeighbours(d, event) { + } + function unfocus() { + node.style("opacity", 1); + link2.style("opacity", 1).style("stroke", "#868282"); + } + simulation.on("tick", () => { + link2.attr("x1", (d) => d.source.x).attr("y1", (d) => d.source.y).attr("x2", (d) => d.target.x).attr("y2", (d) => d.target.y); + node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); + }); + function zoomed({ transform: transform2 }) { + node.attr("transform", transform2); + link2.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 10]).on("zoom", zoomed)); + function saveGraph() { + const clone = svg.clone(true); + localStorage.setItem("FDG", JSON.stringify(clone)); + } +}; + +// src/Visualisations/Icicle.ts +var icicle = (graph, currFile, modal, width, viewHeight) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hier = stratify_default()(flatAdj); + console.log({ hier }); + const format2 = format(",d"); + const color2 = ordinal(quantize_default(rainbow_default, hier.children.length + 1)); + const partition = (data) => { + const root3 = hierarchy(data).sum((d) => d.value).sort((a2, b) => b.height - a2.height || b.value - a2.value); + return partition_default().size([viewHeight, (root3.height + 1) * width / 3])(root3); + }; + const root2 = partition(hier); + let focus = root2; + const svg = select_default2(".d3-graph").append("svg").attr("height", viewHeight).attr("width", width).style("font", "10px sans-serif"); + const cell = svg.selectAll("g").data(root2.descendants()).join("g").attr("transform", (d) => `translate(${d.y0},${d.x0})`); + const rect = cell.append("rect").attr("width", (d) => d.y1 - d.y0 - 1).attr("height", (d) => rectHeight(d)).attr("fill-opacity", 0.6).attr("fill", (d) => { + if (!d.depth) + return "#ccc"; + while (d.depth > 1) + d = d.parent; + return color2(d.data.data.name); + }).style("cursor", "pointer").on("click", clicked); + const text2 = cell.append("text").style("user-select", "none").attr("pointer-events", "none").attr("x", 4).attr("y", 13); + text2.append("tspan").text((d) => d.data.data.name); + const tspan = text2.append("tspan").attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7).text((d) => ` ${format2(d.value)}`); + cell.append("title").text((d) => `${d.ancestors().map((d2) => d2.data.data.name)}`); + function clicked(event, p) { + console.log({ p }); + focus = focus === p ? p = p.parent : p; + root2.each((d) => { + d.target = { + x0: (d.x0 - p.x0) / (p.x1 - p.x0) * viewHeight, + x1: (d.x1 - p.x0) / (p.x1 - p.x0) * viewHeight, + y0: d.y0 - p.y0, + y1: d.y1 - p.y0 + }; + console.log(d.target.x0); + }); + const t = cell.transition().duration(750).attr("transform", (d) => `translate(${d.target.y0},${d.target.x0})`); + rect.transition(t).attr("height", (d) => rectHeight(d.target)); + text2.transition(t).attr("fill-opacity", (d) => +labelVisible(d.target)); + tspan.transition(t).attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7); + } + function rectHeight(d) { + console.log({ d }); + return d.x1 - d.x0 - Math.min(1, (d.x1 - d.x0) / 2); + } + function labelVisible(d) { + return d.y1 <= width && d.y0 >= 0 && d.x1 - d.x0 > 16; + } +}; + +// src/Visualisations/RadialTree.ts +var radialTree = (graph, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy2 = stratify_default()(flatAdj); + console.log({ hierarchy: hierarchy2 }); + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width); + const root2 = hierarchy(hierarchy2, (d) => d.children).sum((d) => d.children ? 0 : 1).sort((a2, b) => a2.depth - b.depth); + const outerRadius = width / 2; + const innerRadius = outerRadius - 170; + const cluster = cluster_default().size([360, innerRadius]).separation((a2, b) => 1); + const color2 = ordinal().domain(graph.nodes()).range(category10_default); + function maxLength(d) { + return d.data.data.depth + (d.children ? max(d.children, maxLength) : 0); + } + function setRadius(d, y0, k) { + d.radius = (y0 += d.data.data.depth) * k; + if (d.children) + d.children.forEach((d2) => setRadius(d2, y0, k)); + } + function setColor(d) { + var name = d.data.data.name; + d.color = color2.domain().indexOf(name) >= 0 ? color2(name) : d.parent ? d.parent.color : null; + if (d.children) + d.children.forEach(setColor); + } + function linkVariable(d) { + return linkStep(d.source.x, d.source.radius, d.target.x, d.target.radius); + } + function linkConstant(d) { + return linkStep(d.source.x, d.source.y, d.target.x, d.target.y); + } + function linkExtensionVariable(d) { + return linkStep(d.target.x, d.target.radius, d.target.x, innerRadius); + } + function linkExtensionConstant(d) { + return linkStep(d.target.x, d.target.y, d.target.x, innerRadius); + } + function linkStep(startAngle, startRadius, endAngle, endRadius) { + const c0 = Math.cos(startAngle = (startAngle - 90) / 180 * Math.PI); + const s0 = Math.sin(startAngle); + const c1 = Math.cos(endAngle = (endAngle - 90) / 180 * Math.PI); + const s1 = Math.sin(endAngle); + return "M" + startRadius * c0 + "," + startRadius * s0 + (endAngle === startAngle ? "" : "A" + startRadius + "," + startRadius + " 0 0 " + (endAngle > startAngle ? 1 : 0) + " " + startRadius * c1 + "," + startRadius * s1) + "L" + endRadius * c1 + "," + endRadius * s1; + } + const legend = (svg2) => { + const g = svg2.selectAll("g").data(color2.domain()).join("g").attr("transform", (d, i) => `translate(${-outerRadius},${-outerRadius + i * 20})`); + g.append("rect").attr("width", 18).attr("height", 18).attr("fill", color2); + g.append("text").attr("x", 24).attr("y", 9).attr("dy", "0.35em").text((d) => d); + }; + cluster(root2); + setRadius(root2, root2.data.data.depth = 0, innerRadius / maxLength(root2)); + setColor(root2); + svg.append("g").call(legend); + svg.append("style").text(` + +.link--active { +stroke: #000 !important; +stroke-width: 1.5px; +} + +.link-extension--active { +stroke-opacity: .6; +} + +.label--active { +font-weight: bold; +} + +`); + const linkExtension = svg.append("g").attr("fill", "none").attr("stroke", "#000").attr("stroke-opacity", 0.25).selectAll("path").data(root2.links().filter((d) => !d.target.children)).join("path").each(function(d) { + d.target.linkExtensionNode = this; + }).attr("d", linkExtensionConstant); + const link2 = svg.append("g").attr("fill", "none").attr("stroke", "#000").selectAll("path").data(root2.links()).join("path").each(function(d) { + d.target.linkNode = this; + }).attr("d", linkConstant).attr("stroke", (d) => d.target.color); + const label = svg.append("g").selectAll("text").data(root2.leaves()).join("text").attr("dy", ".31em").attr("transform", (d) => `rotate(${d.x - 90}) translate(${innerRadius + 4},0)${d.x < 180 ? "" : " rotate(180)"}`).attr("text-anchor", (d) => d.x < 180 ? "start" : "end").text((d) => d.data.data.name).on("mouseover", mouseovered(true)).on("mouseout", mouseovered(false)); + function mouseovered(active) { + return function(event, d) { + select_default2(this).classed("label--active", active); + select_default2(d.linkExtensionNode).classed("link-extension--active", active).raise(); + do + select_default2(d.linkNode).classed("link--active", active).raise(); + while (d = d.parent); + }; + } + function zoomed({ transform: transform2 }) { + linkExtension.attr("transform", transform2); + link2.attr("transform", transform2); + label.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 8]).on("zoom", zoomed)); +}; + +// src/Visualisations/Sunburst.ts +var sunburst = (graph, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy2 = stratify_default()(flatAdj); + console.log({ hierarchy: hierarchy2 }); + var radius = Math.min(width, height) / 2; + var color2 = ordinal(category10_default); + var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + var partition = partition_default().size([2 * Math.PI, radius]); + var root2 = hierarchy(hierarchy2).sum(function(d) { + return d.height; + }); + partition(root2); + var arc = arc_default().startAngle(function(d) { + return d.x0; + }).endAngle(function(d) { + return d.x1; + }).innerRadius(function(d) { + return d.y0; + }).outerRadius(function(d) { + return d.y1; + }); + g.selectAll("path").data(root2.descendants()).enter().append("path").attr("display", function(d) { + return d.depth ? null : "none"; + }).attr("d", arc).style("stroke", "#fff").style("fill", function(d) { + return color2((d.children ? d : d.parent).data.name); + }); +}; + +// src/Visualisations/TidyTree.ts +var tidyTree = (graph, currFile, modal, width, height) => { + const tree = (data) => { + const root3 = hierarchy(data); + root3.dx = 10; + root3.dy = width / (root3.height + 1); + return tree_default().nodeSize([root3.dx, root3.dy])(root3); + }; + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy2 = stratify_default()(flatAdj); + console.log({ hierarchy: hierarchy2 }); + const root2 = tree(hierarchy2); + console.log(root2); + let x0 = Infinity; + let x1 = -x0; + root2.each((d) => { + if (d.x > x1) + x1 = d.x; + if (d.x < x0) + x0 = d.x; + }); + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width); + const g = svg.append("g").attr("font-family", "sans-serif").attr("font-size", 10).attr("transform", `translate(${root2.dy / 3},${root2.dx - x0})`); + const link2 = g.append("g").attr("fill", "none").attr("stroke", "#555").attr("stroke-opacity", 0.4).attr("stroke-width", 1.5).selectAll("path").data(root2.links()).join("path").attr("d", linkHorizontal().x((d) => d.y).y((d) => d.x)); + const node = g.append("g").attr("stroke-linejoin", "round").attr("stroke-width", 10).selectAll("g").data(root2.descendants()).join("g").attr("transform", (d) => `translate(${d.y},${d.x})`); + node.append("circle").attr("fill", (d) => d.children ? "#555" : "#999").attr("r", 10); + node.attr("aria-label", (d) => { + console.log(d); + return d.data.data.name; + }); + const nodeClick = (event, dest) => { + openOrSwitch(dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + console.log({ d }); + nodeClick(event, d.data.data.name); + }); + node.append("text").attr("dy", "0.31em").attr("x", (d) => d.children ? -6 : 6).attr("text-anchor", (d) => d.children ? "end" : "start").text((d) => d.data.data.name).clone(true).lower().attr("stroke", "white"); + function zoomed({ transform: transform2 }) { + svg.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 8]).on("zoom", zoomed)); +}; + +// src/Visualisations/TreeMap.ts +var treeMap = (graph, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy2 = stratify_default()(flatAdj); + console.log({ hierarchy: hierarchy2 }); + const root2 = treemap_default().tile(binary_default).size([width, height]).padding(1).round(true)(hierarchy2.sum((d) => d.height).sort((a2, b) => b.height - a2.height)); + const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).style("font", "10px sans-serif"); + const leaf = svg.selectAll("g").data(root2.leaves()).join("g").attr("transform", (d) => `translate(${d.x0},${d.y0})`); + leaf.attr("aria-label", (d) => d.data.name); + const color2 = ordinal(category10_default); + leaf.append("rect").attr("fill", (d) => { + while (d.depth > 1) + d = d.parent; + return color2(d.data.id); + }).attr("fill-opacity", 0.6).attr("width", (d) => d.x1 - d.x0).attr("height", (d) => d.y1 - d.y0); + leaf.append("clipPath").append("use"); + const nodeClick = (event, dest) => { + openOrSwitch(dest, event); + modal.close(); + }; + leaf.on("click", (event, d) => { + console.log({ d }); + nodeClick(event, d.data.name); + }); + function zoomed({ transform: transform2 }) { + svg.attr("transform", transform2); + } + svg.call(zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.5, 8]).on("zoom", zoomed)); +}; + +// src/Components/VisComp.svelte +function get_each_context10(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[23] = list[i].text; + child_ctx[24] = list[i].options; + child_ctx[25] = list[i].val; + child_ctx[26] = list; + child_ctx[27] = i; + return child_ctx; +} +function get_each_context_17(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; +} +function create_each_block_17(ctx) { + let option; + let t_value = ctx[28] + ""; + let t; + let option_value_value; + return { + c() { + option = element("option"); + t = text(t_value); + option.__value = option_value_value = ctx[28]; + option.value = option.__value; + }, + m(target, anchor) { + insert(target, option, anchor); + append(option, t); + }, + p(ctx2, dirty) { + if (dirty & 1 && t_value !== (t_value = ctx2[28] + "")) + set_data(t, t_value); + if (dirty & 1 && option_value_value !== (option_value_value = ctx2[28])) { + option.__value = option_value_value; + option.value = option.__value; + } + }, + d(detaching) { + if (detaching) + detach(option); + } + }; +} +function create_each_block10(ctx) { + let span; + let t0_value = ctx[23] + ""; + let t0; + let t1; + let select; + let t2; + let mounted; + let dispose; + let each_value_1 = ctx[24]; + let each_blocks = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_17(get_each_context_17(ctx, each_value_1, i)); + } + function select_change_handler() { + ctx[2].call(select, ctx[26], ctx[27]); + } + return { + c() { + span = element("span"); + t0 = text(t0_value); + t1 = text(":\r\n "); + select = element("select"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t2 = space(); + if (ctx[25] === void 0) + add_render_callback(select_change_handler); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, t0); + append(span, t1); + append(span, select); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(select, null); + } + select_option(select, ctx[25]); + append(span, t2); + if (!mounted) { + dispose = listen(select, "change", select_change_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & 1 && t0_value !== (t0_value = ctx[23] + "")) + set_data(t0, t0_value); + if (dirty & 1) { + each_value_1 = ctx[24]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_17(ctx, each_value_1, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_17(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value_1.length; + } + if (dirty & 1) { + select_option(select, ctx[25]); + } + }, + d(detaching) { + if (detaching) + detach(span); + destroy_each(each_blocks, detaching); + mounted = false; + dispose(); + } + }; +} +function create_fragment23(ctx) { + let div0; + let t; + let div1; + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block10(get_each_context10(ctx, each_value, i)); + } + return { + c() { + div0 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t = space(); + div1 = element("div"); + attr(div1, "class", "d3-graph"); + }, + m(target, anchor) { + insert(target, div0, anchor); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + insert(target, t, anchor); + insert(target, div1, anchor); + }, + p(ctx2, [dirty]) { + if (dirty & 1) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context10(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block10(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div0, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div0); + destroy_each(each_blocks, detaching); + if (detaching) + detach(t); + if (detaching) + detach(div1); + } + }; +} +function instance23($$self, $$props, $$invalidate) { + let argArr; + let { modal } = $$props; + const { plugin } = modal; + const { mainG, settings } = plugin; + const { visGraph, visRelation, visClosed, visAll } = settings; + const currFile = getCurrFile(); + const selectors = [ + { + text: "Type", + options: VISTYPES, + val: visGraph + }, + { + text: "Relation", + options: RELATIONS, + val: visRelation + }, + { + text: "Close Implied", + options: REAlCLOSED, + val: visClosed + }, + { + text: "No Unlinked", + options: ALLUNLINKED, + val: visAll + } + ]; + const [width, height] = [Math.round(window.innerWidth / 1.3), Math.round(window.innerHeight / 1.3)]; + const [up, same, down] = [ + getSubInDirs(mainG, "up"), + getSubInDirs(mainG, "same"), + getSubInDirs(mainG, "down") + ]; + const [closedParentNoSingle, closedSiblingNoSingle, closedChildNoSingle] = [ + closeImpliedLinks(up, down), + closeImpliedLinks(same, same), + closeImpliedLinks(down, up) + ]; + const graphs = { + Parent: { + Real: { + All: up, + "No Unlinked": removeUnlinkedNodes(up) + }, + Closed: { + All: closedParentNoSingle, + "No Unlinked": removeUnlinkedNodes(closedParentNoSingle) + } + }, + Sibling: { + Real: { + All: same, + "No Unlinked": removeUnlinkedNodes(same) + }, + Closed: { + All: closedSiblingNoSingle, + "No Unlinked": removeUnlinkedNodes(closedSiblingNoSingle) + } + }, + Child: { + Real: { + All: down, + "No Unlinked": removeUnlinkedNodes(down) + }, + Closed: { + All: closedChildNoSingle, + "No Unlinked": removeUnlinkedNodes(closedChildNoSingle) + } + } + }; + const types = { + "Force Directed Graph": forceDirectedG, + "Tidy Tree": tidyTree, + "Circle Packing": circlePacking, + "Edge Bundling": edgeBundling, + "Arc Diagram": arcDiagram, + Sunburst: sunburst, + "Tree Map": treeMap, + Icicle: icicle, + "Radial Tree": radialTree + }; + function draw(type2) { + if (!document.querySelector(".d3-graph")) { + setTimeout(() => { + var _a; + (_a = document.querySelector(".d3-graph")) === null || _a === void 0 ? void 0 : _a.empty(); + try { + types[type2](...argArr); + } catch (error6) { + (0, import_loglevel21.warn)(error6); + } + }, 10); + } else { + document.querySelector(".d3-graph").empty(); + try { + types[type2](...argArr); + } catch (error6) { + (0, import_loglevel21.warn)(error6); + } + } + } + function select_change_handler(each_value, each_index) { + each_value[each_index].val = select_value(this); + $$invalidate(0, selectors); + } + $$self.$$set = ($$props2) => { + if ("modal" in $$props2) + $$invalidate(1, modal = $$props2.modal); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & 3) { + $: + argArr = [ + graphs[selectors[1].val][selectors[2].val][selectors[3].val], + app, + currFile, + modal, + width, + height + ]; + } + if ($$self.$$.dirty & 1) { + $: + draw(selectors[0].val); + } + }; + return [selectors, modal, select_change_handler]; +} +var VisComp = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance23, create_fragment23, safe_not_equal, { modal: 1 }); + } +}; +var VisComp_default = VisComp; + +// src/Visualisations/VisModal.ts +function graphlibToD3(g) { + const d3Graph = { nodes: [], links: [] }; + const nodeIDs = {}; + g.nodes().forEach((node, i) => { + d3Graph.nodes.push({ id: i, name: node }); + nodeIDs[node] = i; + }); + g.forEachEdge((k, a2, s, t) => { + d3Graph.links.push({ + source: nodeIDs[s], + target: nodeIDs[t] + }); + }); + return d3Graph; +} +function bfsAdjList(g, startNode) { + const queue = [startNode]; + const adjList = []; + let i = 0; + while (queue.length && i < 1e3) { + i++; + const currNode = queue.shift(); + const neighbours = { + succs: getOutNeighbours(g, currNode), + pres: getInNeighbours(g, currNode) + }; + console.log({ currNode, neighbours }); + const next = { + name: currNode, + pres: void 0, + succs: void 0, + parentId: i, + depth: i + }; + if (neighbours.succs.length) { + next.succs = neighbours.succs; + queue.push(...neighbours.succs); + } + if (neighbours.pres.length) { + next.pres = neighbours.pres; + } + adjList.push(next); + } + const maxDepth = adjList.sort((a2, b) => a2.depth - b.depth).last().depth; + adjList.forEach((item) => item.height = maxDepth - item.depth); + return adjList; +} +function dfsFlatAdjList(g, startNode) { + const nodes = g.nodes(); + const nodeCount = nodes.length; + const visits = {}; + nodes.forEach((node, i2) => { + visits[node] = nodeCount * i2; + }); + const queue = [startNode]; + const adjList = []; + let depth = 1; + let i = 0; + while (queue.length && i < 1e3) { + i++; + const currNode = queue.shift(); + const next = getOutNeighbours(g, currNode); + if (next.length) { + queue.unshift(...next); + next.forEach((succ) => { + const parentId = nodeCount * nodes.indexOf(succ); + if (!adjList.some((adjItem) => adjItem.name === currNode && adjItem.parentId === parentId)) { + adjList.push({ + id: visits[currNode], + name: currNode, + parentId, + depth + }); + visits[currNode]++; + } + }); + depth++; + } else { + adjList.push({ + id: visits[currNode], + name: currNode, + parentId: 999999999, + depth + }); + depth = 1; + visits[currNode]++; + } + } + adjList.push({ + id: 999999999, + name: "CONTAINER", + parentId: void 0, + depth: 0 + }); + const maxDepth = adjList.sort((a2, b) => a2.depth - b.depth).last().depth; + adjList.forEach((item) => item.height = maxDepth - item.depth); + console.log({ visits }); + return adjList; +} +var stratify = stratify_default().id(function(d) { + console.log({ d }); + return d.name; +}).parentId(function(d) { + return d.parentId; +}); +var VisModal8 = class extends import_obsidian43.Modal { + constructor(plugin) { + super(app); + this.plugin = plugin; + this.modal = this; + } + onOpen() { + new import_obsidian43.Notice("Alot of these features may not work, it is still very experimental."); + const { contentEl } = this; + contentEl.empty(); + new VisComp_default({ + target: contentEl, + props: { + modal: this + } + }); + } + onClose() { + this.contentEl.empty(); + } +}; + +// src/main.ts +var BCPlugin = class extends import_obsidian44.Plugin { + constructor() { + super(...arguments); + this.visited = []; + this.activeLeafChange = void 0; + this.layoutChange = void 0; + this.loadSettings = async () => this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + this.saveSettings = async () => await this.saveData(this.settings); + } + registerActiveLeafChangeEvent() { + this.activeLeafChange = app.workspace.on("file-open", async () => { + if (this.settings.refreshOnNoteChange) + await refreshIndex(this); + else { + const activeView = this.getActiveTYPEView(MATRIX_VIEW); + if (activeView) + await activeView.draw(); + } + }); + this.registerEvent(this.activeLeafChange); + } + registerLayoutChangeEvent() { + this.layoutChange = app.workspace.on("layout-change", async () => { + if (this.settings.showBCs) + await drawTrail(this); + }); + this.registerEvent(this.layoutChange); + } + async onload() { + console.log("loading breadcrumbs plugin"); + await this.loadSettings(); + this.addSettingTab(new BCSettingTab(this)); + this.db = new Debugger(this); + const { settings } = this; + const { + fieldSuggestor, + enableRelationSuggestor, + openMatrixOnLoad, + openDuckOnLoad, + openDownOnLoad, + showBCs, + userHiers + } = settings; + if (fieldSuggestor) + this.registerEditorSuggest(new FieldSuggestor(this)); + if (enableRelationSuggestor) + this.registerEditorSuggest(new RelationSuggestor(this)); + if (settings.limitTrailCheckboxes.length === 0) + settings.limitTrailCheckboxes = getFields(settings.userHiers); + if (typeof settings.showAll === "boolean") + settings.showAll = settings.showAll ? "All" : "Shortest"; + this.VIEWS = [ + { + plain: "Matrix", + type: MATRIX_VIEW, + constructor: MatrixView, + openOnLoad: openMatrixOnLoad + }, + { + plain: "Duck", + type: DUCK_VIEW, + constructor: DucksView, + openOnLoad: openDuckOnLoad + }, + { + plain: "Down", + type: TREE_VIEW, + constructor: TreeView, + openOnLoad: openDownOnLoad + } + ]; + for (const { constructor, type: type2 } of this.VIEWS) { + this.registerView(type2, (leaf) => new constructor(leaf, this)); + } + (0, import_obsidian44.addIcon)(DUCK_ICON, DUCK_ICON_SVG); + (0, import_obsidian44.addIcon)(TRAIL_ICON, TRAIL_ICON_SVG); + await waitForCache(this); + this.mainG = await buildMainG(this); + this.closedG = buildClosedG(this); + app.workspace.onLayoutReady(async () => { + var _a; + const noFiles = app.vault.getMarkdownFiles().length; + if (((_a = this.mainG) == null ? void 0 : _a.nodes().length) < noFiles) { + await wait(3e3); + this.mainG = await buildMainG(this); + this.closedG = buildClosedG(this); + } + for (const { openOnLoad, type: type2, constructor } of this.VIEWS) + if (openOnLoad) + await openView(type2, constructor); + if (showBCs) + await drawTrail(this); + this.registerActiveLeafChangeEvent(); + this.registerLayoutChangeEvent(); + const saveCommandDefinition = app.commands.commands["editor:save-file"]; + const save = saveCommandDefinition == null ? void 0 : saveCommandDefinition.callback; + if (typeof save === "function") { + saveCommandDefinition.callback = async () => { + await save(); + if (this.settings.refreshOnNoteSave) { + await refreshIndex(this); + const activeView = this.getActiveTYPEView(MATRIX_VIEW); + if (activeView) + await activeView.draw(); + } + }; + } + app.workspace.iterateAllLeaves((leaf) => { + if (leaf instanceof import_obsidian44.MarkdownView) + leaf.view.previewMode.rerender(true); + }); + }); + for (const { type: type2, plain, constructor } of this.VIEWS) { + this.addCommand({ + id: `show-${type2}-view`, + name: `Open ${plain} View`, + checkCallback: async (checking) => { + if (checking) + return app.workspace.getLeavesOfType(type2).length === 0; + await openView(type2, constructor); + } + }); + } + this.addCommand({ + id: "open-vis-modal", + name: "Open Visualisation Modal", + callback: () => new VisModal8(this).open() + }); + this.addCommand({ + id: "manipulate-hierarchy-notes", + name: "Adjust Hierarchy Notes", + callback: () => new HierarchyNoteSelectorModal(this).open() + }); + this.addCommand({ + id: "Refresh-Breadcrumbs-Index", + name: "Refresh Breadcrumbs Index", + callback: async () => await refreshIndex(this) + }); + this.addCommand({ + id: "Toggle-trail-in-Edit&LP", + name: "Toggle: Show Trail/Grid in Edit & LP mode", + callback: async () => { + settings.showBCsInEditLPMode = !settings.showBCsInEditLPMode; + await this.saveSettings(); + await drawTrail(this); + } + }); + this.addCommand({ + id: "Write-Breadcrumbs-to-Current-File", + name: "Write Breadcrumbs to Current File", + callback: async () => await writeBCToFile(this) + }); + this.addCommand({ + id: "Write-Breadcrumbs-to-All-Files", + name: "Write Breadcrumbs to **ALL** Files", + callback: async () => await writeBCsToAllFiles(this) + }); + this.addCommand({ + id: "local-index", + name: "Copy a Local Index to the clipboard", + callback: async () => await copyLocalIndex(this) + }); + this.addCommand({ + id: "global-index", + name: "Copy a Global Index to the clipboard", + callback: async () => await copyGlobalIndex(this) + }); + ["up", "down", "next", "prev"].forEach((dir) => { + this.addCommand({ + id: `jump-to-first-${dir}`, + name: `Jump to first '${dir}'`, + callback: async () => await jumpToFirstDir(this, dir) + }); + }); + getFields(userHiers).forEach((field) => { + this.addCommand({ + id: `new-file-with-curr-as-${field}`, + name: `Create a new '${field}' from the current note`, + callback: async () => await thread(this, field) + }); + }); + this.addRibbonIcon(addFeatherIcon("tv"), "Breadcrumbs Visualisation", () => new VisModal8(this).open()); + this.registerMarkdownCodeBlockProcessor("breadcrumbs", getCodeblockCB(this)); + const jugglPlugin = getPlugin(app); + if (jugglPlugin) { + this.bcStore = new BCStore(this.mainG, app.metadataCache); + jugglPlugin.registerStore(this.bcStore); + } + this.api = new BCAPI(this); + (window[API_NAME] = this.api) && this.register(() => delete window[API_NAME]); + } + getActiveTYPEView(type2) { + const { constructor } = this.VIEWS.find((view) => view.type === type2); + const leaves = app.workspace.getLeavesOfType(type2); + if (leaves && leaves.length >= 1) { + const { view } = leaves[0]; + if (view instanceof constructor) + return view; + } + return null; + } + onunload() { + console.log("unloading"); + this.VIEWS.forEach(async (view) => { + app.workspace.getLeavesOfType(view.type).forEach((leaf) => { + leaf.detach(); + }); + }); + this.visited.forEach((visit) => visit[1].remove()); + if (this.bcStore) { + const jugglPlugin = getPlugin(app); + if (jugglPlugin) { + jugglPlugin.removeStore(this.bcStore); + } + } + } +}; +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvd2VicGFjay9ib290c3RyYXAiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2RlZHVwZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctYXQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2ljb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3NyYy9pY29ucy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvcmVwbGFjZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL3RvLXN2Zy5qcyIsICJub2RlX21vZHVsZXMvbG9nbGV2ZWwvbGliL2xvZ2xldmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5L3NyYy91dGlscy5qcyIsICJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXIuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3Rha2UuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaW5kaWNlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvY2hhaW4uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2l0ZXJhdGlvbi9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL25laWdoYm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL2FkamFjZW5jeS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvc2VyaWFsaXphdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2NsYXNzZXMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdXRpbHMvaXMtZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2ZvcmVhY2guanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy90eXBlZC1hcnJheXMuanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy9pdGVyYWJsZXMuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9tbmVtb25pc3QvZml4ZWQtZGVxdWUuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5LXRyYXZlcnNhbC9iZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL2Rmcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS10cmF2ZXJzYWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2VuZ2xpc2guanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHRlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9zeXN0ZW1ab25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9maXhlZE9mZnNldFpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9pbnZhbGlkWm9uZS5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9zZXR0aW5ncy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2R1cmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW50ZXJ2YWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWZmLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWdpdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9jb252ZXJzaW9ucy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2RhdGV0aW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAic3JjL21haW4udHMiLCAibm9kZV9tb2R1bGVzL2p1Z2dsLWFwaS9kaXN0L2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvb2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzLmpzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL1ZpZXdzL01hdHJpeFZpZXcudHMiLCAic3JjL0RlYnVnZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwgInNyYy9yZWZyZXNoSW5kZXgudHMiLCAic3JjL1V0aWxzL2dyYXBoVXRpbHMudHMiLCAic3JjL1V0aWxzL0hpZXJVdGlscy50cyIsICJzcmMvVXRpbHMvT2JzaWRpYW5VdGlscy50cyIsICJzcmMvVXRpbHMvZ2VuZXJhbFV0aWxzLnRzIiwgInNyYy9SZWxhdGlvbnMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGF2aWV3Tm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRGF0ZU5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RlbmRyb25Ob3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyYXJjaHlOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9KdWdnbExpbmtzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0xpbmtOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9SZWdleE5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RhZ05vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RyYXZlcnNlTm90ZXMudHMiLCAic3JjL1ZpZXdzL1RyYWlsVmlldy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvTmV4dFByZXYuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvVHJhaWxHcmlkLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9UcmFpbEdyaWQuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1RyYWlsUGF0aC5zdmVsdGUiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0p1Z2dsLnRzIiwgInNyYy9Db21tYW5kcy9DcmVhdGVJbmRleC50cyIsICJzcmMvQ29tcG9uZW50cy9KdWdnbEJ1dHRvbi5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9NYXRyaXguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeC5zdmVsdGUiLCAic3JjL0FQSS50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyTm90ZU1vZGFsLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvci50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9Nb2RpZnlIaWVySXRlbU1vZGFsLnRzIiwgInNyYy9zcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29kZWJsb2Nrcy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvUmVuZGVyTWFya2Rvd24uc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1JlbmRlck1hcmtkb3duLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ0JUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlIiwgInNyYy9Db21tYW5kcy9qdW1wVG9GaXJzdERpci50cyIsICJzcmMvQ29tbWFuZHMvdGhyZWFkaW5nLnRzIiwgInNyYy9Db21tYW5kcy9Xcml0ZUJDcy50cyIsICJzcmMvRmllbGRTdWdnZXN0b3IudHMiLCAic3JjL1JlbGF0aW9uU3VnZ2VzdG9yLnRzIiwgInNyYy9TZXR0aW5ncy9CcmVhZGNydW1ic1NldHRpbmdUYWIudHMiLCAic3JjL0NvbXBvbmVudHMvS29GaS5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0NyZWF0ZUluZGV4U2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0NTVlNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9EYXRhdmlld05vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGF0ZU5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGVidWdnaW5nU2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0RlbmRyb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvR2VuZXJhbFNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlOb3RlU2V0dGluZ3MudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1VzZXJIaWVyYXJjaGllcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvVXNlckhpZXJhcmNoaWVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFMaXN0VWwuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFQbHVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2ZhL0ZhUmVnVHJhc2hBbHQuc3ZlbHRlIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlTZXR0aW5ncy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0p1bXBUb05leHRTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvTWF0cml4Vmlld1NldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9Ob1N5c3RlbVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9SZWdleE5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvUmVsYXRpb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVGFnTm90ZVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9UaHJlYWRpbmdTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVHJhaWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVmlzTW9kYWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvV3JpdGVCQ3NTZXR0aW5ncy50cyIsICJzcmMvVmlld3MvRHVja3NWaWV3LnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFJbmZvLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvRHVja3Muc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL0R1Y2tzLnN2ZWx0ZSIsICJzcmMvVmlld3MvVHJlZVZpZXcudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1NpZGVUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9TaWRlVHJlZS5zdmVsdGUiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS1pY29ucy9mYS9GYUZpcmUuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFSZWdTbm93Zmxha2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY3ViZWhlbGl4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3ZhbHVlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcm91bmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2N1YmVoZWxpeC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3F1YW50aXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvYnJ1c2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXBhdGgvc3JjL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9jb3Zlci5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvZmluZC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Jvb3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy92aXNpdEFmdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMveC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29sbGlkZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9sY2cuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9zaW11bGF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbWFueUJvZHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUHJlZml4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblJvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2NsdXN0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2NvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQmVmb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQWZ0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2ZpbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvcGF0aC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9kZXNjZW5kYW50cy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvbGVhdmVzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9saW5rcy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FjY2Vzc29ycy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3JvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvZGljZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYXJ0aXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvc3RyYXRpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3NsaWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc3F1YXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvYmFuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpY2tGb3JtYXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY29sb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9yYWluYm93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9yYWRpYWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYnVuZGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVmlzTW9kYWwudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9BcmNEaWFncmFtLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9DaXJjbGVQYWNraW5nLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmcudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0ZvcmNlRGlyZWN0ZWRHLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9JY2ljbGUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1N1bmJ1cnN0LnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9UaWR5VHJlZS50cyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVHJlZU1hcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZmVhdGhlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJmZWF0aGVyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsICIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwgIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjbGFzc05hbWVzID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBkb24ndCBpbmhlcml0IGZyb20gT2JqZWN0IHNvIHdlIGNhbiBza2lwIGhhc093blByb3BlcnR5IGNoZWNrIGxhdGVyXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTUxODMyOC9jcmVhdGluZy1qcy1vYmplY3Qtd2l0aC1vYmplY3QtY3JlYXRlbnVsbCNhbnN3ZXItMjEwNzkyMzJcblx0XHRmdW5jdGlvbiBTdG9yYWdlT2JqZWN0KCkge31cblx0XHRTdG9yYWdlT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0XHRmdW5jdGlvbiBfcGFyc2VBcnJheSAocmVzdWx0U2V0LCBhcnJheSkge1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRfcGFyc2UocmVzdWx0U2V0LCBhcnJheVtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlTnVtYmVyIChyZXN1bHRTZXQsIG51bSkge1xuXHRcdFx0cmVzdWx0U2V0W251bV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9wYXJzZU9iamVjdCAocmVzdWx0U2V0LCBvYmplY3QpIHtcblx0XHRcdGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChvYmplY3QsIGspKSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlIHRvIGZhbHNlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQgdG8gYXZvaWQgY2hhbmdpbmcgb2JqZWN0IHN0cnVjdHVyZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tLzIwMTIvMTEvd3JpdGluZy1mYXN0LW1lbW9yeS1lZmZpY2llbnQtamF2YXNjcmlwdC8jZGUtcmVmZXJlbmNpbmctbWlzY29uY2VwdGlvbnNcblx0XHRcdFx0XHRyZXN1bHRTZXRba10gPSAhIW9iamVjdFtrXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBTUEFDRSA9IC9cXHMrLztcblx0XHRmdW5jdGlvbiBfcGFyc2VTdHJpbmcgKHJlc3VsdFNldCwgc3RyKSB7XG5cdFx0XHR2YXIgYXJyYXkgPSBzdHIuc3BsaXQoU1BBQ0UpO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRyZXN1bHRTZXRbYXJyYXlbaV1dID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfcGFyc2UgKHJlc3VsdFNldCwgYXJnKSB7XG5cdFx0XHRpZiAoIWFyZykgcmV0dXJuO1xuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHQvLyAnZm9vIGJhcidcblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRfcGFyc2VTdHJpbmcocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyBbJ2ZvbycsICdiYXInLCAuLi5dXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRfcGFyc2VBcnJheShyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vIHsgJ2Zvbyc6IHRydWUsIC4uLiB9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdF9wYXJzZU9iamVjdChyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vICcxMzAnXG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdF9wYXJzZU51bWJlcihyZXN1bHRTZXQsIGFyZyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NsYXNzTmFtZXMgKCkge1xuXHRcdFx0Ly8gZG9uJ3QgbGVhayBhcmd1bWVudHNcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvd2lraS9PcHRpbWl6YXRpb24ta2lsbGVycyMzMi1sZWFraW5nLWFyZ3VtZW50c1xuXHRcdFx0dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYXJncyA9IEFycmF5KGxlbik7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjbGFzc1NldCA9IG5ldyBTdG9yYWdlT2JqZWN0KCk7XG5cdFx0XHRfcGFyc2VBcnJheShjbGFzc1NldCwgYXJncyk7XG5cblx0XHRcdHZhciBsaXN0ID0gW107XG5cblx0XHRcdGZvciAodmFyIGsgaW4gY2xhc3NTZXQpIHtcblx0XHRcdFx0aWYgKGNsYXNzU2V0W2tdKSB7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKGspXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3Quam9pbignICcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBfY2xhc3NOYW1lcztcblx0fSkoKTtcblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmdcbiAgICAgICAgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSlcbiAgICAgICAgOiBzdGVwLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxuLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwgInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCAidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwgInZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBleGlzdCA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGV4aXN0ID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYXJlZCgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsICJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCAidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsICJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsICIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCAidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGhpZGUoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbmlmIChJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QobmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKFdlYWtNYXApKTtcbiIsICJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaSsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG5cbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCAiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsICJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheUluY2x1ZGVzKGZhbHNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsICJ2YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3JyZWN0U2V0dGVyID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBjb3JyZWN0U2V0dGVyID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMoTywgcHJvdG8pO1xuICAgIGlmIChjb3JyZWN0U2V0dGVyKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxuc2hhcmVkKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsICIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwgInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjEuMycsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnXHUwMEE5IDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsICJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCAidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCAidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwgInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsICJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCAidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsICJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsICJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBERUZBVUxUX0FUVFJTIGZyb20gJy4vZGVmYXVsdC1hdHRycy5qc29uJztcblxuY2xhc3MgSWNvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRlbnRzLCB0YWdzID0gW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIHRoaXMuYXR0cnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FUVFJTLFxuICAgICAgLi4ueyBjbGFzczogYGZlYXRoZXIgZmVhdGhlci0ke25hbWV9YCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNWRyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdmcoYXR0cnMgPSB7fSkge1xuICAgIGNvbnN0IGNvbWJpbmVkQXR0cnMgPSB7XG4gICAgICAuLi50aGlzLmF0dHJzLFxuICAgICAgLi4uYXR0cnMsXG4gICAgICAuLi57IGNsYXNzOiBjbGFzc25hbWVzKHRoaXMuYXR0cnMuY2xhc3MsIGF0dHJzLmNsYXNzKSB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYDxzdmcgJHthdHRyc1RvU3RyaW5nKGNvbWJpbmVkQXR0cnMpfT4ke3RoaXMuY29udGVudHN9PC9zdmc+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBJY29uYC5cbiAgICpcbiAgICogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIElmIG9sZCBjb2RlIGV4cGVjdHMgYGZlYXRoZXIuaWNvbnMuPG5hbWU+YFxuICAgKiB0byBiZSBhIHN0cmluZywgYHRvU3RyaW5nKClgIHdpbGwgZ2V0IGltcGxpY2l0bHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGF0dHJpYnV0ZXMgb2JqZWN0IHRvIHN0cmluZyBvZiBIVE1MIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJzVG9TdHJpbmcoYXR0cnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoa2V5ID0+IGAke2tleX09XCIke2F0dHJzW2tleV19XCJgKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCAiaW1wb3J0IEljb24gZnJvbSAnLi9pY29uJztcbmltcG9ydCBpY29ucyBmcm9tICcuLi9kaXN0L2ljb25zLmpzb24nO1xuaW1wb3J0IHRhZ3MgZnJvbSAnLi90YWdzLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3Qua2V5cyhpY29ucylcbiAgLm1hcChrZXkgPT4gbmV3IEljb24oa2V5LCBpY29uc1trZXldLCB0YWdzW2tleV0pKVxuICAucmVkdWNlKChvYmplY3QsIGljb24pID0+IHtcbiAgICBvYmplY3RbaWNvbi5uYW1lXSA9IGljb247XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSwge30pO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB0b1N2ZyBmcm9tICcuL3RvLXN2Zyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaWNvbnMsIHRvU3ZnLCByZXBsYWNlIH07XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBIVE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGBkYXRhLWZlYXRoZXJgIGF0dHJpYnV0ZSB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZShhdHRycyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmVhdGhlci5yZXBsYWNlKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicpO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mZWF0aGVyXScpO1xuXG4gIEFycmF5LmZyb20oZWxlbWVudHNUb1JlcGxhY2UpLmZvckVhY2goZWxlbWVudCA9PlxuICAgIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGF0dHJzKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgYXR0cnMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50QXR0cnMgPSBnZXRBdHRycyhlbGVtZW50KTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnRBdHRyc1snZGF0YS1mZWF0aGVyJ107XG4gIGRlbGV0ZSBlbGVtZW50QXR0cnNbJ2RhdGEtZmVhdGhlciddO1xuXG4gIGNvbnN0IHN2Z1N0cmluZyA9IGljb25zW25hbWVdLnRvU3ZnKHtcbiAgICAuLi5hdHRycyxcbiAgICAuLi5lbGVtZW50QXR0cnMsXG4gICAgLi4ueyBjbGFzczogY2xhc3NuYW1lcyhhdHRycy5jbGFzcywgZWxlbWVudEF0dHJzLmNsYXNzKSB9LFxuICB9KTtcbiAgY29uc3Qgc3ZnRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgIHN2Z1N0cmluZyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICk7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBzdmdEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcblxuICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRBdHRycyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcykucmVkdWNlKChhdHRycywgYXR0cikgPT4ge1xuICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIHJldHVybiBhdHRycztcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gU1ZHIHN0cmluZy5cbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b1N2ZyhuYW1lLCBhdHRycyA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICAnZmVhdGhlci50b1N2ZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZygpIGluc3RlYWQuJyxcbiAgKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1aXJlZCBga2V5YCAoaWNvbiBuYW1lKSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4nKTtcbiAgfVxuXG4gIGlmICghaWNvbnNbbmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gaWNvbiBtYXRjaGluZyAnJHtcbiAgICAgICAgbmFtZVxuICAgICAgfScuIFNlZSB0aGUgY29tcGxldGUgbGlzdCBvZiBpY29ucyBhdCBodHRwczovL2ZlYXRoZXJpY29ucy5jb21gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaWNvbnNbbmFtZV0udG9TdmcoYXR0cnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1N2ZztcbiIsICIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIENvbGxlY3Rpb24gb2YgaGVscGZ1bCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLWxpa2UgcG9seWZpbGwuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXQgICAgICAgLSBGaXJzdCBvYmplY3QuXG4gKiBAcGFyYW0gIHtvYmplY3R9IFsuLi5vYmplY3RzXSAtIE9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnblBvbHlmaWxsKCkge1xuICBjb25zdCB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cbiAgZm9yIChsZXQgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKCFhcmd1bWVudHNbaV0pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGFyZ3VtZW50c1tpXSkgdGFyZ2V0W2tdID0gYXJndW1lbnRzW2ldW2tdO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubGV0IGFzc2lnbiA9IGFzc2lnblBvbHlmaWxsO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicpIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbmV4cG9ydCB7YXNzaWdufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpcnN0IG1hdGNoaW5nIGVkZ2UgZm9yIGdpdmVuIHBhdGguXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSBleGlzdGVuY2Ugb2Ygc291cmNlICYgdGFyZ2V0LiBUaGlzXG4gKiBtdXN0IGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgZ3JhcGggIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAqIEBwYXJhbSAge2FueX0gICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgICAtIFR5cGUgb2YgdGhlIGVkZ2UgKG1peGVkLCBkaXJlY3RlZCBvciB1bmRpcmVjdGVkKS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdFZGdlKGdyYXBoLCBzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpO1xuXG4gIGxldCBlZGdlID0gbnVsbDtcblxuICBpZiAoIXNvdXJjZURhdGEpIHJldHVybiBlZGdlO1xuXG4gIGlmICh0eXBlID09PSAnbWl4ZWQnKSB7XG4gICAgZWRnZSA9XG4gICAgICAoc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XSkgfHxcbiAgICAgIChzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgJiYgc291cmNlRGF0YS51bmRpcmVjdGVkW3RhcmdldF0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkaXJlY3RlZCcpIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgR3JhcGggaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgbyAtIFRhcmdldCBPYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvKSB7XG4gIGxldCBrO1xuXG4gIGZvciAoayBpbiBvKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFwicHJpdmF0ZVwiIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgYnkgY29uY2VhbGluZyBpdFxuICogdXNpbmcgdGhlIGBlbnVtZXJhYmxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAgIC0gTWVtYmVyIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgJiB0aGUgZ2l2ZW4gZ2V0dGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgLSBNZW1iZXIgbmFtZS5cbiAqIEBwYXJhbSB7bWl4ZWR9ICAgIHZhbHVlICAtIFRoZSBhdHRhY2hlZCBnZXR0ZXIgb3IgZml4ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT25seVByb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9O1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLmdldCA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBjb25zdGl0dXRlIHZhbGlkIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBoaW50cyAtIFRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUhpbnRzKGhpbnRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChoaW50cykpIHJldHVybiBmYWxzZTtcblxuICBpZiAoaGludHMuYXR0cmlidXRlcyAmJiAhQXJyYXkuaXNBcnJheShoaW50cy5hdHRyaWJ1dGVzKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBnZW5lcmF0aW5nIGluY3JlbWVudGFsIGlkcyBmb3IgZWRnZXMuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSgpIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpICYgMHhmZjtcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJldHVybiBpKys7XG4gIH07XG59XG4iLCAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEl0ZXJhdG9yIENsYXNzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBTaW1wbGUgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5J3MgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogSXRlcmF0b3IgY2xhc3MuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gTmV4dCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICBpZiAodHlwZW9mIG5leHQgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9pdGVyYXRvcjogZXhwZWN0aW5nIGEgZnVuY3Rpb24hJyk7XG5cbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn1cblxuLyoqXG4gKiBJZiBzeW1ib2xzIGFyZSBzdXBwb3J0ZWQsIHdlIGFkZCBgbmV4dGAgdG8gYFN5bWJvbC5pdGVyYXRvcmAuXG4gKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJylcbiAgSXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9mIHRoZSBnaXZlbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtICB7YW55Li4ufSB2YWx1ZXMgLSBWYWx1ZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3Iub2YgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgIGwgPSBhcmdzLmxlbmd0aCxcbiAgICBpID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IGFyZ3NbaSsrXX07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3IuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7ZG9uZTogdHJ1ZX07XG4gIH0pO1xuXG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGdpdmVuIGluZGV4ZWQgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSBzZXF1ZW5jZSAtIFRhcmdldCBzZXF1ZW5jZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5mcm9tU2VxdWVuY2UgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdmFyIGkgPSAwLFxuICAgIGwgPSBzZXF1ZW5jZS5sZW5ndGg7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBzZXF1ZW5jZVtpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5JdGVyYXRvci5pcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvcikgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUubmV4dCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3I7XG4iLCAiZXhwb3J0cy5BUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG5leHBvcnRzLlNZTUJPTF9TVVBQT1JUID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG4iLCAiLyoqXG4gKiBPYmxpdGVyYXRvciBJdGVyIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEZ1bmN0aW9uIGNvZXJjaW5nIHZhbHVlcyB0byBhbiBpdGVyYXRvci4gSXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCB3aGVuIG5lZWRpbmdcbiAqIHRvIGhhbmRsZSBpdGVyYWJsZXMgYW5kIGl0ZXJhdG9ycyB0aGUgc2FtZSB3YXkuXG4gKi9cbnZhciBJdGVyYXRvciA9IHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG5mdW5jdGlvbiBpdGVyT3JOdWxsKHRhcmdldCkge1xuICAvLyBJbmRleGVkIHNlcXVlbmNlXG4gIGlmIChcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSB8fFxuICAgIChBUlJBWV9CVUZGRVJfU1VQUE9SVCAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodGFyZ2V0KSlcbiAgKVxuICAgIHJldHVybiBJdGVyYXRvci5mcm9tU2VxdWVuY2UodGFyZ2V0KTtcblxuICAvLyBJbnZhbGlkIHZhbHVlXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIC8vIEl0ZXJhYmxlXG4gIGlmIChTWU1CT0xfU1VQUE9SVCAmJiB0eXBlb2YgdGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cbiAgLy8gSXRlcmF0b3IgZHVjay10eXBpbmdcbiAgaWYgKHR5cGVvZiB0YXJnZXQubmV4dCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRhcmdldDtcblxuICAvLyBJbnZhbGlkIG9iamVjdFxuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpdGVyKHRhcmdldCkge1xuICB2YXIgaXRlcmF0b3IgPSBpdGVyT3JOdWxsKHRhcmdldCk7XG5cbiAgaWYgKCFpdGVyYXRvcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnb2JsaXRlcmF0b3I6IHRhcmdldCBpcyBub3QgaXRlcmFibGUgbm9yIGEgdmFsaWQgaXRlcmF0b3IuJ1xuICAgICk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcbiIsICIvKiBlc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiAwICovXG4vKipcbiAqIE9ibGl0ZXJhdG9yIFRha2UgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogRnVuY3Rpb24gdGFraW5nIG4gb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCByZXR1cm5zIHRoZW1cbiAqIGludG8gYW4gYXJyYXkuXG4gKi9cbnZhciBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogVGFrZS5cbiAqXG4gKiBAcGFyYW0gIHtJdGVyYWJsZX0gaXRlcmFibGUgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgW25dICAgICAgLSBPcHRpb25hbCBudW1iZXIgb2YgaXRlbXMgdG8gdGFrZS5cbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRha2UoaXRlcmFibGUsIG4pIHtcbiAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IG4gOiBJbmZpbml0eSxcbiAgICBhcnJheSA9IGwgIT09IEluZmluaXR5ID8gbmV3IEFycmF5KGwpIDogW10sXG4gICAgc3RlcCxcbiAgICBpID0gMDtcblxuICB2YXIgaXRlcmF0b3IgPSBpdGVyKGl0ZXJhYmxlKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChpID09PSBsKSByZXR1cm4gYXJyYXk7XG5cbiAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGkgIT09IG4pIGFycmF5Lmxlbmd0aCA9IGk7XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICBhcnJheVtpKytdID0gc3RlcC52YWx1ZTtcbiAgfVxufTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgQ3VzdG9tIEVycm9yc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlZmluaW5nIGN1c3RvbSBlcnJvcnMgZm9yIGVhc2Ugb2YgdXNlICYgZWFzeSB1bml0IHRlc3RzIGFjcm9zc1xuICogaW1wbGVtZW50YXRpb25zIChub3JtYWxpemVkIHR5cG9sb2d5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gZXJyb3JcbiAqIG1lc3NhZ2VzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvcnJlY3QgZXJyb3Igd2FzIGZvdW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmFtZSA9ICdHcmFwaEVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciBleHRlbmRzIEdyYXBoRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yJztcblxuICAgIC8vIFRoaXMgaXMgVjggc3BlY2lmaWMgdG8gZW5oYW5jZSBzdGFjayByZWFkYWJpbGl0eVxuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpXG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yXG4gICAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdEZvdW5kR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2FnZUdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdVc2FnZUdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFVzYWdlR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEludGVybmFsIERhdGEgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSW50ZXJuYWwgY2xhc3NlcyBob3BlZnVsbHkgcmVkdWNlZCB0byBzdHJ1Y3RzIGJ5IGVuZ2luZXMgJiBzdG9yaW5nXG4gKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIG5vZGVzICYgZWRnZXMuXG4gKlxuICogTm90ZSB0aGF0IHRob3NlIGNsYXNzZXMgZG9uJ3QgcmVseSBvbiB0aGUgYGNsYXNzYCBrZXl3b3JkIHRvIGF2b2lkIHNvbWVcbiAqIGNydWZ0IGludHJvZHVjZWQgYnkgbW9zdCBvZiBFUzIwMTUgdHJhbnNwaWxlcnMuXG4gKi9cblxuLyoqXG4gKiBNaXhlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNaXhlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuTWl4ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy51bmRpcmVjdGVkRGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG4gIHRoaXMudW5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG4gIHRoaXMudW5kaXJlY3RlZCA9IHt9O1xufTtcblxuLyoqXG4gKiBEaXJlY3RlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuRGlyZWN0ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG59O1xuXG5EaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS51cGdyYWRlVG9NaXhlZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG4vKipcbiAqIFVuZGlyZWN0ZWROb2RlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyAtIE5vZGUncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5kaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuVW5kaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG5VbmRpcmVjdGVkTm9kZURhdGEucHJvdG90eXBlLnVwZ3JhZGVUb01peGVkID0gZnVuY3Rpb24gKCkge1xuICAvLyBEZWdyZWVzXG4gIHRoaXMuaW5EZWdyZWUgPSAwO1xuICB0aGlzLm91dERlZ3JlZSA9IDA7XG4gIHRoaXMuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy5pbiA9IHt9O1xuICB0aGlzLm91dCA9IHt9O1xufTtcblxuLyoqXG4gKiBFZGdlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICBzdHJpbmcgICAgICAgLSBUaGUgZWRnZSdzIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgc291cmNlICAgICAgIC0gU291cmNlIG9mIHRoZSBlZGdlLlxuICogQHBhcmFtIHtzdHJpbmd9ICB0YXJnZXQgICAgICAgLSBUYXJnZXQgb2YgdGhlIGVkZ2UuXG4gKiBAcGFyYW0ge29iamVjdH0gIGF0dHJpYnV0ZXMgICAtIEVkZ2UncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRWRnZURhdGEodW5kaXJlY3RlZCwga2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICB0aGlzLnVuZGlyZWN0ZWQgPSB1bmRpcmVjdGVkO1xuXG4gIC8vIEV4dHJlbWl0aWVzXG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgSW5kZXhlcyBGdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQnVuY2ggb2YgZnVuY3Rpb25zIHVzZWQgdG8gY29tcHV0ZSBvciBjbGVhciBpbmRleGVzLlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gdXBkYXRpbmcgdGhlICdzdHJ1Y3R1cmUnIGluZGV4IHdpdGggdGhlIGdpdmVuIGVkZ2UncyBkYXRhLlxuICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIHRoZSBtdWx0aSBncmFwaCwgcmVsYXRlZCBlZGdlcyBhcmUgc3RvcmVkIGluIGFcbiAqIHNldCB0aGF0IGlzIHRoZSBzYW1lIGZvciBBIC0+IEIgJiBCIDwtIEEuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RWRnZURhdGF9IGVkZ2VEYXRhICAgLSBBZGRlZCBlZGdlJ3MgZGF0YS5cbiAqIEBwYXJhbSB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0ge05vZGVEYXRhfSB0YXJnZXREYXRhIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RydWN0dXJlSW5kZXgoXG4gIGdyYXBoLFxuICB1bmRpcmVjdGVkLFxuICBlZGdlRGF0YSxcbiAgc291cmNlLFxuICB0YXJnZXQsXG4gIHNvdXJjZURhdGEsXG4gIHRhcmdldERhdGFcbikge1xuICBjb25zdCBtdWx0aSA9IGdyYXBoLm11bHRpO1xuXG4gIGxldCBvdXRLZXkgPSAnb3V0JztcbiAgbGV0IGluS2V5ID0gJ2luJztcblxuICBpZiAodW5kaXJlY3RlZCkgb3V0S2V5ID0gaW5LZXkgPSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IGFkaiwgY29udGFpbmVyO1xuXG4gIGlmIChtdWx0aSkge1xuICAgIC8vIEhhbmRsaW5nIHNvdXJjZVxuICAgIGFkaiA9IHNvdXJjZURhdGFbb3V0S2V5XTtcbiAgICBjb250YWluZXIgPSBhZGpbdGFyZ2V0XTtcblxuICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29udGFpbmVyID0gbmV3IFNldCgpO1xuICAgICAgYWRqW3RhcmdldF0gPSBjb250YWluZXI7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFkZChlZGdlRGF0YSk7XG5cbiAgICAvLyBJZiBzZWxmTG9vcCwgd2UgYnJlYWsgaGVyZVxuICAgIGlmIChzb3VyY2UgPT09IHRhcmdldCAmJiB1bmRpcmVjdGVkKSByZXR1cm47XG5cbiAgICAvLyBIYW5kbGluZyB0YXJnZXQgKHdlIHdvbid0IGFkZCB0aGUgZWRnZSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHRha2VuXG4gICAgLy8gY2FyZSBvZiB3aXRoIHNvdXJjZSBhYm92ZSlcbiAgICBhZGogPSB0YXJnZXREYXRhW2luS2V5XTtcbiAgICBpZiAodHlwZW9mIGFkaltzb3VyY2VdID09PSAndW5kZWZpbmVkJykgYWRqW3NvdXJjZV0gPSBjb250YWluZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gSGFuZGxpbmcgc291cmNlXG4gICAgc291cmNlRGF0YVtvdXRLZXldW3RhcmdldF0gPSBlZGdlRGF0YTtcblxuICAgIC8vIElmIHNlbGZMb29wLCB3ZSBicmVhayBoZXJlXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0ICYmIHVuZGlyZWN0ZWQpIHJldHVybjtcblxuICAgIC8vIEhhbmRsaW5nIHRhcmdldFxuICAgIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV0gPSBlZGdlRGF0YTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSAnc3RydWN0dXJlJyBpbmRleCBkYXRhIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0VkZ2VEYXRhfSBlZGdlRGF0YSAtIERyb3BwZWQgZWRnZSdzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVkZ2VGcm9tU3RydWN0dXJlSW5kZXgoZ3JhcGgsIHVuZGlyZWN0ZWQsIGVkZ2VEYXRhKSB7XG4gIGNvbnN0IG11bHRpID0gZ3JhcGgubXVsdGk7XG5cbiAgY29uc3Qge3NvdXJjZTogc291cmNlRGF0YSwgdGFyZ2V0OiB0YXJnZXREYXRhfSA9IGVkZ2VEYXRhO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZURhdGEua2V5LFxuICAgIHRhcmdldCA9IHRhcmdldERhdGEua2V5O1xuXG4gIC8vIE5PVEU6IHNpbmNlIHRoZSBlZGdlIHNldCBpcyB0aGUgc2FtZSBmb3Igc291cmNlICYgdGFyZ2V0LCB3ZSBjYW4gb25seVxuICAvLyBhZmZlY3Qgc291cmNlXG4gIGNvbnN0IG91dEtleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnb3V0JyxcbiAgICBzb3VyY2VJbmRleCA9IHNvdXJjZURhdGFbb3V0S2V5XTtcblxuICBjb25zdCBpbktleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnaW4nO1xuXG4gIGlmICh0YXJnZXQgaW4gc291cmNlSW5kZXgpIHtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGNvbnN0IHNldCA9IHNvdXJjZUluZGV4W3RhcmdldF07XG5cbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMSkge1xuICAgICAgICBkZWxldGUgc291cmNlSW5kZXhbdGFyZ2V0XTtcbiAgICAgICAgZGVsZXRlIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXQuZGVsZXRlKGVkZ2VEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgZGVsZXRlIHNvdXJjZUluZGV4W3RhcmdldF07XG4gIH1cblxuICBpZiAobXVsdGkpIHJldHVybjtcblxuICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldERhdGFbaW5LZXldO1xuXG4gIGRlbGV0ZSB0YXJnZXRJbmRleFtzb3VyY2VdO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSB3aG9sZSAnc3RydWN0dXJlJyBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSBncmFwaCAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU3RydWN0dXJlSW5kZXgoZ3JhcGgpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgbGV0IHN0ZXA7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBzdGVwLnZhbHVlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIHVwZ3JhZGUgYSBzaW1wbGUgYHN0cnVjdHVyZWAgaW5kZXggdG8gYSBtdWx0aSBvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgZ3JhcGggLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpKGdyYXBoKSB7XG4gIGdyYXBoLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBub2RlKSA9PiB7XG4gICAgLy8gRGlyZWN0ZWRcbiAgICBpZiAoZGF0YS5vdXQpIHtcbiAgICAgIGZvciAoY29uc3QgbmVpZ2hib3IgaW4gZGF0YS5vdXQpIHtcbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLm91dFtuZWlnaGJvcl0pO1xuICAgICAgICBkYXRhLm91dFtuZWlnaGJvcl0gPSBlZGdlcztcbiAgICAgICAgZ3JhcGguX25vZGVzLmdldChuZWlnaGJvcikuaW5bbm9kZV0gPSBlZGdlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVbmRpcmVjdGVkXG4gICAgaWYgKGRhdGEudW5kaXJlY3RlZCkge1xuICAgICAgZm9yIChjb25zdCBuZWlnaGJvciBpbiBkYXRhLnVuZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKG5laWdoYm9yID4gbm9kZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLnVuZGlyZWN0ZWRbbmVpZ2hib3JdKTtcbiAgICAgICAgZGF0YS51bmRpcmVjdGVkW25laWdoYm9yXSA9IGVkZ2VzO1xuICAgICAgICBncmFwaC5fbm9kZXMuZ2V0KG5laWdoYm9yKS51bmRpcmVjdGVkW25vZGVdID0gZWRnZXM7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTm9kZSBBdHRyaWJ1dGVzIG1ldGhvZHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXNzaWduLCBpc1BsYWluT2JqZWN0fSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsIE5vdEZvdW5kR3JhcGhFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgTk9ERSA9IDA7XG5jb25zdCBTT1VSQ0UgPSAxO1xuY29uc3QgVEFSR0VUID0gMjtcbmNvbnN0IE9QUE9TSVRFID0gMztcblxuZnVuY3Rpb24gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gIGdyYXBoLFxuICBtZXRob2QsXG4gIG1vZGUsXG4gIG5vZGVPckVkZ2UsXG4gIG5hbWVPckVkZ2UsXG4gIGFkZDEsXG4gIGFkZDJcbikge1xuICBsZXQgbm9kZURhdGEsIGVkZ2VEYXRhLCBhcmcxLCBhcmcyO1xuXG4gIG5vZGVPckVkZ2UgPSAnJyArIG5vZGVPckVkZ2U7XG5cbiAgaWYgKG1vZGUgPT09IE5PREUpIHtcbiAgICBub2RlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQobm9kZU9yRWRnZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlT3JFZGdlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhcmcxID0gbmFtZU9yRWRnZTtcbiAgICBhcmcyID0gYWRkMTtcbiAgfSBlbHNlIGlmIChtb2RlID09PSBPUFBPU0lURSkge1xuICAgIG5hbWVPckVkZ2UgPSAnJyArIG5hbWVPckVkZ2U7XG5cbiAgICBlZGdlRGF0YSA9IGdyYXBoLl9lZGdlcy5nZXQobmFtZU9yRWRnZSk7XG5cbiAgICBpZiAoIWVkZ2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtuYW1lT3JFZGdlfVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBlZGdlRGF0YS5zb3VyY2Uua2V5O1xuICAgIGNvbnN0IHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gc291cmNlKSB7XG4gICAgICBub2RlRGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcbiAgICB9IGVsc2UgaWYgKG5vZGVPckVkZ2UgPT09IHRhcmdldCkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBub2RlIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgXCIke25hbWVPckVkZ2V9XCIgZWRnZSAoJHtzb3VyY2V9LCAke3RhcmdldH0pLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXJnMSA9IGFkZDE7XG4gICAgYXJnMiA9IGFkZDI7XG4gIH0gZWxzZSB7XG4gICAgZWRnZURhdGEgPSBncmFwaC5fZWRnZXMuZ2V0KG5vZGVPckVkZ2UpO1xuXG4gICAgaWYgKCFlZGdlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKG1vZGUgPT09IFNPVVJDRSkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVEYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuICAgIH1cblxuICAgIGFyZzEgPSBuYW1lT3JFZGdlO1xuICAgIGFyZzIgPSBhZGQxO1xuICB9XG5cbiAgcmV0dXJuIFtub2RlRGF0YSwgYXJnMSwgYXJnMl07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVHZXR0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UpIHtcbiAgICBjb25zdCBbZGF0YV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2VcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlU2V0dGVyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSwgYWRkMikge1xuICAgIGNvbnN0IFtkYXRhLCBuYW1lLCB2YWx1ZV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxLFxuICAgICAgYWRkMlxuICAgICk7XG5cbiAgICBkYXRhLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxLCBhZGQyKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWUsIHVwZGF0ZXJdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMSxcbiAgICAgIGFkZDJcbiAgICApO1xuXG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiB1cGRhdGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YS5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHZhbHVlID0gdXBkYXRlcihhdHRyaWJ1dGVzW25hbWVdKTtcblxuICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGRhdGEuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGFzc2lnbihkYXRhLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UsIGFkZDEpIHtcbiAgICBjb25zdCBbZGF0YSwgdXBkYXRlcl0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgTk9ERV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIE5PREVfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3Igbm9kZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnTm9kZScpLCBOT0RFKTtcblxuICAgIC8vIEZvciBzb3VyY2VzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ1NvdXJjZScpLCBTT1VSQ0UpO1xuXG4gICAgLy8gRm9yIHRhcmdldHNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnVGFyZ2V0JyksIFRBUkdFVCk7XG5cbiAgICAvLyBGb3Igb3Bwb3NpdGVzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ09wcG9zaXRlJyksIE9QUE9TSVRFKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEVkZ2UgQXR0cmlidXRlcyBtZXRob2RzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Fzc2lnbiwgaXNQbGFpbk9iamVjdCwgZ2V0TWF0Y2hpbmdFZGdlfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLFxuICBOb3RGb3VuZEdyYXBoRXJyb3IsXG4gIFVzYWdlR3JhcGhFcnJvclxufSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgZ2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHttaXhlZH0gICAgICAgICAgLSBUaGUgYXR0cmlidXRlJ3MgdmFsdWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlc1tuYW1lXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlcyBnZXR0ZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSB0YXJnZXQgZWxlbWVudCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAtIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhcmd1bWVudHNbMV07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09ICh0eXBlID09PSAndW5kaXJlY3RlZCcpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiICR7dHlwZX0gZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLmF0dHJpYnV0ZXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSBjaGVja2VyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgc2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge21peGVkfSAgdmFsdWUgICAtIE5ldyBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKiBAcGFyYW0gIHttaXhlZH0gIHZhbHVlICAgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIG5hbWU7XG5cbiAgICAgIG5hbWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1szXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSB1cGRhdGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogVXBkYXRlIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkgdXNpbmdcbiAgICogdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHVwZGF0ZXIpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbM107XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHVwZGF0ZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXNbbmFtZV0pO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnc2V0JyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVtb3ZlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVSZW1vdmVyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZGVzaXJlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lICAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBTb3VyY2UgZWxlbWVudC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVwbGFjZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBtZXRob2QgICAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgICAgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTmV3IGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBOZXcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhdHRyaWJ1dGVzO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3JlcGxhY2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlIG1lcmdlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIE1lcmdlIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50ICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gbWVyZ2UuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIGF0dHJpYnV0ZXM7XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC5gXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhc3NpZ24oZGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgdXBkYXRlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIFVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCB1cGRhdGVyKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIHVwZGF0ZXI7XG5cbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIHVwZGF0ZXIgaXMgbm90IGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgRURHRV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIEVER0VfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3IgZWRnZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnRWRnZScpLCAnbWl4ZWQnKTtcblxuICAgIC8vIEZvciBkaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdEaXJlY3RlZEVkZ2UnKSwgJ2RpcmVjdGVkJyk7XG5cbiAgICAvLyBGb3IgdW5kaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdVbmRpcmVjdGVkRWRnZScpLCAndW5kaXJlY3RlZCcpO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIENoYWluIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBWYXJpYWRpYyBmdW5jdGlvbiBjb21iaW5pbmcgdGhlIGdpdmVuIGl0ZXJhYmxlcy5cbiAqL1xudmFyIEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9pdGVyYXRvci5qcycpLFxuICBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogQ2hhaW4uXG4gKlxuICogQHBhcmFtICB7Li4uSXRlcmF0b3J9IGl0ZXJhYmxlcyAtIFRhcmdldCBpdGVyYWJsZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjaGFpbigpIHtcbiAgdmFyIGl0ZXJhYmxlcyA9IGFyZ3VtZW50cyxcbiAgICBjdXJyZW50LFxuICAgIGkgPSAtMTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIGl0ZXJhdGUoKSB7XG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICBpKys7XG5cbiAgICAgIGlmIChpID49IGl0ZXJhYmxlcy5sZW5ndGgpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICAgIGN1cnJlbnQgPSBpdGVyKGl0ZXJhYmxlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIHN0ZXAgPSBjdXJyZW50Lm5leHQoKTtcblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIGl0ZXJhdGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcDtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBFZGdlIEl0ZXJhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlciBhXG4gKiBncmFwaCdzIGVkZ2VzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLCBOb3RGb3VuZEdyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IEVER0VTX0lURVJBVElPTiA9IFtcbiAge1xuICAgIG5hbWU6ICdlZGdlcycsXG4gICAgdHlwZTogJ21peGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luRWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0RWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnb3V0J1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luYm91bmRFZGdlcycsXG4gICAgdHlwZTogJ21peGVkJyxcbiAgICBkaXJlY3Rpb246ICdpbidcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdvdXRib3VuZEVkZ2VzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAndW5kaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBGdW5jdGlvbiBjb2xsZWN0aW5nIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHthcnJheX0gIGVkZ2VzICAtIEVkZ2VzIGFycmF5IHRvIHBvcHVsYXRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBUaGUgZm91bmQgZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTaW1wbGUoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSBlZGdlcy5wdXNoKG9iamVjdFtrXS5rZXkpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0TXVsdGkoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KVxuICAgIG9iamVjdFtrXS5mb3JFYWNoKGVkZ2VEYXRhID0+IGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoU2ltcGxlKG9iamVjdCwgY2FsbGJhY2ssIGF2b2lkKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBpZiAoayA9PT0gYXZvaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTXVsdGkob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBvYmplY3Rba10uZm9yRWFjaChlZGdlRGF0YSA9PlxuICAgICAgY2FsbGJhY2soXG4gICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdCB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1wbGUob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgbGV0IHNob3VsZEJyZWFrID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGZpbmRNdWx0aShvYmplY3QsIGNhbGxiYWNrLCBhdm9pZCkge1xuICBsZXQgaXRlcmF0b3IsIHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2UsIHRhcmdldDtcblxuICBsZXQgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGsgPT09IGF2b2lkKSBjb250aW51ZTtcblxuICAgIGl0ZXJhdG9yID0gb2JqZWN0W2tdLnZhbHVlcygpO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICAgIHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2Uua2V5LFxuICAgICAgICB0YXJnZXQua2V5LFxuICAgICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhLmtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhdG9yKG9iamVjdCwgYXZvaWQpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGxldCBpbm5lciA9IG51bGwsXG4gICAgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuICAgIGxldCBlZGdlRGF0YTtcblxuICAgIGlmIChpbm5lcikge1xuICAgICAgY29uc3Qgc3RlcCA9IGlubmVyLm5leHQoKTtcblxuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICBpbm5lciA9IG51bGw7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgICBjb25zdCBrID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGsgPT09IGF2b2lkKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICBpbm5lciA9IGVkZ2VEYXRhLnZhbHVlcygpO1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZWRnZTogZWRnZURhdGEua2V5LFxuICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2U6IGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICAgIHRhcmdldDogZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZXM6IGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICB1bmRpcmVjdGVkOiBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY29sbGVjdGluZyBlZGdlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgZWRnZXMgIC0gRWRnZXMgYXJyYXkgdG8gcG9wdWxhdGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9iamVjdCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gIGsgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgIC0gVGhlIGZvdW5kIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Rm9yS2V5U2ltcGxlKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZvcktleU11bHRpKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZXNEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZXNEYXRhKSByZXR1cm47XG5cbiAgZWRnZXNEYXRhLmZvckVhY2goZWRnZURhdGEgPT4gZWRnZXMucHVzaChlZGdlRGF0YS5rZXkpKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB1c2luZ1xuICogYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge21peGVkfSAgICBrICAgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoRm9yS2V5U2ltcGxlKG9iamVjdCwgaywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgY2FsbGJhY2soXG4gICAgZWRnZURhdGEua2V5LFxuICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgc291cmNlRGF0YS5rZXksXG4gICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzRGF0YS5mb3JFYWNoKGVkZ2VEYXRhID0+XG4gICAgY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB0byBtYXRjaFxuICogb25lIG9mIHRoZW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAqL1xuZnVuY3Rpb24gZmluZEZvcktleVNpbXBsZShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZURhdGEpIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gIGlmIChcbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKVxuICAgIHJldHVybiBlZGdlRGF0YS5rZXk7XG59XG5cbmZ1bmN0aW9uIGZpbmRGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZWRnZXNEYXRhLnZhbHVlcygpO1xuICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICBzaG91bGRCcmVhayA9IGNhbGxiYWNrKFxuICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS50YXJnZXQuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlZ2RlcyBmcm9tIHRoZSBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSXRlcmF0b3JGb3JLZXkob2JqZWN0LCBrKSB7XG4gIGNvbnN0IHYgPSBvYmplY3Rba107XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHYudmFsdWVzKCk7XG5cbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHNvdXJjZTogZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0QXR0cmlidXRlczogZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdW5kaXJlY3RlZDogZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEl0ZXJhdG9yLm9mKFtcbiAgICB2LmtleSxcbiAgICB2LmF0dHJpYnV0ZXMsXG4gICAgdi5zb3VyY2Uua2V5LFxuICAgIHYudGFyZ2V0LmtleSxcbiAgICB2LnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgIHYudGFyZ2V0LmF0dHJpYnV0ZXNcbiAgXSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBBcnJheSBvZiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWRnZUFycmF5KGdyYXBoLCB0eXBlKSB7XG4gIGlmIChncmFwaC5zaXplID09PSAwKSByZXR1cm4gW107XG5cbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcgfHwgdHlwZSA9PT0gZ3JhcGgudHlwZSkge1xuICAgIGlmICh0eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGdyYXBoLl9lZGdlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UoZ3JhcGguX2VkZ2VzLmtleXMoKSwgZ3JhcGguX2VkZ2VzLnNpemUpO1xuICB9XG5cbiAgY29uc3Qgc2l6ZSA9XG4gICAgdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnID8gZ3JhcGgudW5kaXJlY3RlZFNpemUgOiBncmFwaC5kaXJlY3RlZFNpemU7XG5cbiAgY29uc3QgbGlzdCA9IG5ldyBBcnJheShzaXplKSxcbiAgICBtYXNrID0gdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX2VkZ2VzLnZhbHVlcygpO1xuXG4gIGxldCBpID0gMDtcbiAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChkYXRhLnVuZGlyZWN0ZWQgPT09IG1hc2spIGxpc3RbaSsrXSA9IGRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hFZGdlKGdyYXBoLCB0eXBlLCBjYWxsYmFjaykge1xuICBpZiAoZ3JhcGguc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBsZXQgc3RlcCwgZGF0YTtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fZWRnZXMudmFsdWVzKCk7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIgJiYgZGF0YS51bmRpcmVjdGVkICE9PSBtYXNrKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHtrZXksIGF0dHJpYnV0ZXMsIHNvdXJjZSwgdGFyZ2V0fSA9IGRhdGE7XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGtleSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2Uua2V5LFxuICAgICAgdGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBkYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2sgdG8gbWF0Y2ggb25lIG9mXG4gKiB0aGVtLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZShncmFwaCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBzaG91bGRGaWx0ZXIgPSB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IGdyYXBoLnR5cGU7XG4gIGNvbnN0IG1hc2sgPSB0eXBlID09PSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IHN0ZXAsIGRhdGE7XG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgIGRhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qge2tleSwgYXR0cmlidXRlcywgc291cmNlLCB0YXJnZXR9ID0gZGF0YTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBrZXksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgc291cmNlLmtleSxcbiAgICAgIHRhcmdldC5rZXksXG4gICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIHRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YS51bmRpcmVjdGVkXG4gICAgKTtcblxuICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjcmVhdGluZyBhbiBpdGVyYXRvciBvZiBlZGdlcyBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3IoZ3JhcGgsIHR5cGUpIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybiBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGVkZ2U6IGRhdGEua2V5LFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgc291cmNlOiBkYXRhLnNvdXJjZS5rZXksXG4gICAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZUF0dHJpYnV0ZXM6IGRhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICB0YXJnZXRBdHRyaWJ1dGVzOiBkYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgdW5kaXJlY3RlZDogZGF0YS51bmRpcmVjdGVkXG4gICAgfTtcblxuICAgIHJldHVybiB7dmFsdWUsIGRvbmU6IGZhbHNlfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlICYgdGhlIGdpdmVuIG5vZGUuXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgY29uc3QgZm4gPSBtdWx0aSA/IGNvbGxlY3RNdWx0aSA6IGNvbGxlY3RTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSBmbihlZGdlcywgbm9kZURhdGEuaW4pO1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIGZuKGVkZ2VzLCBub2RlRGF0YS5vdXQpO1xuXG4gICAgLy8gSGFuZGxpbmcgc2VsZiBsb29wIGVkZ2UgY2FzZVxuICAgIGlmICghZGlyZWN0aW9uICYmIG5vZGVEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihub2RlRGF0YS5rZXkpLCAxKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4oZWRnZXMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gIG11bHRpICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpIG9yIG5vdC5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICBjb25zdCBmbiA9IG11bHRpID8gZm9yRWFjaE11bHRpIDogZm9yRWFjaFNpbXBsZTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIGZuKG5vZGVEYXRhLmluLCBjYWxsYmFjayk7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKG5vZGVEYXRhLm91dCwgY2FsbGJhY2ssICFkaXJlY3Rpb24gPyBub2RlRGF0YS5rZXkgOiBudWxsKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjayB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZUZvck5vZGUobXVsdGksIHR5cGUsIGRpcmVjdGlvbiwgbm9kZURhdGEsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kTXVsdGkgOiBmaW5kU2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEub3V0LCBjYWxsYmFjaywgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvdW5kID0gZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZURhdGEgIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVkZ2VJdGVyYXRvckZvck5vZGUodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSkge1xuICBsZXQgaXRlcmF0b3IgPSBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnb3V0JyAmJiB0eXBlb2Ygbm9kZURhdGEuaW4gIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEuaW4pKTtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nICYmIHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihcbiAgICAgICAgaXRlcmF0b3IsXG4gICAgICAgIGNyZWF0ZUl0ZXJhdG9yKG5vZGVEYXRhLm91dCwgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpXG4gICAgICApO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcgJiYgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEudW5kaXJlY3RlZCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNyZWF0aW5nIGFuIGFycmF5IG9mIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcmV0dXJuIHthcnJheX0gICAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JQYXRoKHR5cGUsIG11bHRpLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEsIHRhcmdldCkge1xuICBjb25zdCBmbiA9IG11bHRpID8gY29sbGVjdEZvcktleU11bHRpIDogY29sbGVjdEZvcktleVNpbXBsZTtcblxuICBjb25zdCBlZGdlcyA9IFtdO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEuaW4gIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ291dCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS5pbiwgdGFyZ2V0KTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKGVkZ2VzLCBzb3VyY2VEYXRhLm91dCwgdGFyZ2V0KTtcblxuICAgIC8vIEhhbmRsaW5nIHNlbGYgbG9vcCBlZGdlIGNhc2VcbiAgICBpZiAoIWRpcmVjdGlvbiAmJiBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihzb3VyY2VEYXRhLmtleSksIDEpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEudW5kaXJlY3RlZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBtdWx0aSAgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uICAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge05vZGVEYXRhfSBzb3VyY2VEYXRhIC0gU291cmNlIG5vZGUncyBkYXRhLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHRhcmdldCAgICAgLSBUYXJnZXQgbm9kZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JQYXRoKFxuICB0eXBlLFxuICBtdWx0aSxcbiAgZGlyZWN0aW9uLFxuICBzb3VyY2VEYXRhLFxuICB0YXJnZXQsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgZm4gPSBtdWx0aSA/IGZvckVhY2hGb3JLZXlNdWx0aSA6IGZvckVhY2hGb3JLZXlTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5pbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uICE9PSAnb3V0JylcbiAgICAgIGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHNvdXJjZURhdGEua2V5ICE9PSB0YXJnZXQpXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEub3V0ICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdpbicpXG4gICAgICAgIGZuKHNvdXJjZURhdGEub3V0LCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm4oc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgICAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFZGdlRm9yUGF0aCh0eXBlLCBtdWx0aSwgZGlyZWN0aW9uLCBzb3VyY2VEYXRhLCB0YXJnZXQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kRm9yS2V5TXVsdGkgOiBmaW5kRm9yS2V5U2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3VuZCA9IGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRGF0YS5rZXkgIT09IHRhcmdldClcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJykge1xuICAgICAgICBmb3VuZCA9IGZuKFxuICAgICAgICAgIHNvdXJjZURhdGEub3V0LFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAhZGlyZWN0aW9uID8gc291cmNlRGF0YS5rZXkgOiBudWxsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm91bmQgPSBmbihzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZm9yIHRoZSBnaXZlbiBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdGFyZ2V0ICAgICAtIFRhcmdldCBub2RlLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrICAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KSB7XG4gIGxldCBpdGVyYXRvciA9IEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgZGlyZWN0aW9uICE9PSAnb3V0JyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEuaW5cbiAgICApXG4gICAgICBpdGVyYXRvciA9IGNoYWluKGl0ZXJhdG9yLCBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLmluLCB0YXJnZXQpKTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLm91dCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGRpcmVjdGlvbiAhPT0gJ2luJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEub3V0XG4gICAgKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3JGb3JLZXkoc291cmNlRGF0YS5vdXQsIHRhcmdldCkpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldClcbiAgICAgICk7XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3I7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGFuIGVkZ2UgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXJyYXlDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgY2VydGFpbiBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMDogUmV0dXJuIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqXG4gICAqIEFyaXR5IDE6IFJldHVybiBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlICAgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQXJpdHkgMjogUmV0dXJuIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHthcnJheXxudW1iZXJ9IC0gVGhlIGVkZ2VzIG9yIHRoZSBudW1iZXIgb2YgZWRnZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNyZWF0ZUVkZ2VBcnJheSh0aGlzLCB0eXBlKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXNcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBub2RlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUFycmF5Rm9yUGF0aChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBzb3VyY2VEYXRhLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDAsIDEgb3IgMiBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBhIGVkZ2UgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZm9yRWFjaE5hbWUgPSAnZm9yRWFjaCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgYnkgYXBwbHlpbmcgdGhlIGdpdmVuXG4gICAqIGNhbGxiYWNrLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpIHJldHVybjtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjYWxsYmFjayA9IHNvdXJjZTtcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZSh0aGlzLCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgY2FsbGJhY2sgPSB0YXJnZXQ7XG5cbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke2ZvckVhY2hOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciBhIG5vZGUncyBlZGdlc1xuICAgICAgLy8gVE9ETzogbWF5YmUgYXR0YWNoIHRoZSBzdWIgbWV0aG9kIHRvIHRoZSBpbnN0YW5jZSBkeW5hbWljYWxseT9cbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvck5vZGUoXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIG5vZGVEYXRhLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7Zm9yRWFjaE5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvclBhdGgoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgc291cmNlRGF0YSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDEsIDIgb3IgMyBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBtYXBwaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGJ5IGFwcGx5aW5nIHRoZSBnaXZlblxuICAgKiBjYWxsYmFjay5cbiAgICpcbiAgICogQXJpdHkgMTogTWFwIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogTWFwIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogTWFwIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIGNvbnN0IG1hcE5hbWUgPSAnbWFwJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG5cbiAgQ2xhc3MucHJvdG90eXBlW21hcE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGxldCByZXN1bHQ7XG5cbiAgICAvLyBXZSBrbm93IHRoZSByZXN1bHQgbGVuZ3RoIGJlZm9yZWhhbmRcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykgbGVuZ3RoICs9IHRoaXMudW5kaXJlY3RlZFNpemU7XG4gICAgICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSBsZW5ndGggKz0gdGhpcy5kaXJlY3RlZFNpemU7XG5cbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG4gICAgICBsZXQgaSA9IDA7XG5cbiAgICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IGxlbmd0aCBiZWZvcmVoYW5kXG4gICAgLy8gVE9ETzogd2UgY2FuIGluIHNvbWUgaW5zdGFuY2VzIG9mIHNpbXBsZSBncmFwaHMsIGtub3dpbmcgZGVncmVlXG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVcbiAgICogZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEZpbHRlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogRmlsdGVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogRmlsdGVyIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBmaWx0ZXJOYW1lID0gJ2ZpbHRlcicgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtmaWx0ZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKSByZXN1bHQucHVzaChlKTtcbiAgICB9KTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGFjY3VtdWxhdG9yXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBSZWR1Y2UgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDI6IFJlZHVjZSBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDM6IFJlZHVjZSB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgICAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgcmVkdWNlTmFtZSA9ICdyZWR1Y2UnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbcmVkdWNlTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoZXhwZWN0aW5nIDIsIDMgb3IgNCBhbmQgZ290ICR7YXJncy5sZW5ndGh9KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMl0gIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IG1pc3NpbmcgaW5pdGlhbCB2YWx1ZS4gWW91IG11c3QgcHJvdmlkZSBpdCBiZWNhdXNlIHRoZSBjYWxsYmFjayB0YWtlcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGFuZCB3ZSBjYW5ub3QgaW5mZXIgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhcyB5b3UgY291bGQgd2l0aCBhIHNpbXBsZSBhcnJheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgaW5pdGlhbFZhbHVlO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICBpbml0aWFsVmFsdWUgPSBhcmdzWzFdO1xuICAgICAgYXJncyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbMl07XG4gICAgICBhcmdzID0gW2FyZ3NbMF1dO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1syXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbM107XG4gICAgICBhcmdzID0gW2FyZ3NbMF0sIGFyZ3NbMV1dO1xuICAgIH1cblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBicmVha2FibGUgZWRnZSBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoXG4gKiBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZmluZEVkZ2VOYW1lID0gJ2ZpbmQnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIG1hdGNoXG4gICAqIG9uZSBvZiB0aGVtIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbZmluZEVkZ2VOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY2FsbGJhY2sgPSBzb3VyY2U7XG4gICAgICByZXR1cm4gZmluZEVkZ2UodGhpcywgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIGNhbGxiYWNrID0gdGFyZ2V0O1xuXG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAodHlwZW9mIG5vZGVEYXRhID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICAvLyBUT0RPOiBtYXliZSBhdHRhY2ggdGhlIHN1YiBtZXRob2QgdG8gdGhlIGluc3RhbmNlIGR5bmFtaWNhbGx5P1xuICAgICAgcmV0dXJuIGZpbmRFZGdlRm9yTm9kZShcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgdHlwZSA9PT0gJ21peGVkJyA/IHRoaXMudHlwZSA6IHR5cGUsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbm9kZURhdGEsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gZmluZEVkZ2VGb3JQYXRoKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHNvdXJjZURhdGEsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7ZmluZEVkZ2VOYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMSwgMiBvciAzIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFueSBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtzb21lTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuXG4gICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZEVkZ2VOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFsbCBvZiB0aGVtIG1hdGNoZSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtldmVyeU5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhlLCBlYSwgcywgdCwgc2EsIHRhLCB1KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kRWRnZU5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYW4gZWRnZSBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlSXRlcmF0b3JDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZTogb3JpZ2luYWxOYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgbmFtZSA9IG9yaWdpbmFsTmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIGVkZ2VzLlxuICAgKlxuICAgKiBBcml0eSAwOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMTogSXRlcmF0ZSBvdmVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgICAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgIHNvdXJjZSAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gICAqXG4gICAqIEByZXR1cm4ge2FycmF5fG51bWJlcn0gLSBUaGUgZWRnZXMgb3IgdGhlIG51bWJlciBvZiBlZGdlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3IodGhpcywgdHlwZSk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG5cbiAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUl0ZXJhdG9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtuYW1lfTogIGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIHNvdXJjZSBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMCwgMSBvciAyIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGV2ZXJ5IGVkZ2UgaXRlcmF0aW9uIG1ldGhvZCB0byB0aGUgR3JhcGggY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gR3JhcGggLSBHcmFwaCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgRURHRVNfSVRFUkFUSU9OLmZvckVhY2goZGVzY3JpcHRpb24gPT4ge1xuICAgIGF0dGFjaEVkZ2VBcnJheUNyZWF0b3IoR3JhcGgsIGRlc2NyaXB0aW9uKTtcbiAgICBhdHRhY2hGb3JFYWNoRWRnZShHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmRFZGdlKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gICAgYXR0YWNoRWRnZUl0ZXJhdG9yQ3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTmVpZ2hib3IgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlclxuICogbmVpZ2hib3JzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge05vdEZvdW5kR3JhcGhFcnJvciwgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IE5FSUdIQk9SU19JVEVSQVRJT04gPSBbXG4gIHtcbiAgICBuYW1lOiAnbmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnaW5OZWlnaGJvcnMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0TmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdpbmJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ2luJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ291dGJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZE5laWdoYm9ycycsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ3VuZGlyZWN0ZWROZWlnaGJvcnMnLFxuICAgIHR5cGU6ICd1bmRpcmVjdGVkJ1xuICB9XG5dO1xuXG4vKipcbiAqIEZ1bmN0aW9uIG1lcmdpbmcgbmVpZ2hib3JzIGludG8gdGhlIGdpdmVuIHNldCBpdGVyYXRpbmcgb3ZlciB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QmFzaWNTZXR9IG5laWdoYm9ycyAtIE5laWdoYm9ycyBzZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAgLSBUYXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBtZXJnZShuZWlnaGJvcnMsIG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IG5laWdoYm9yIGluIG9iamVjdCkgbmVpZ2hib3JzLmFkZChuZWlnaGJvcik7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgcmVsZXZhbnQgbmVpZ2hib3JzIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICBkaXJlY3Rpb24gLSBEaXJlY3Rpb24uXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICAgICAgIC0gVGhlIGxpc3Qgb2YgbmVpZ2hib3JzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOZWlnaGJvckFycmF5Rm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIE9iamVjdC5rZXlzKG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gT2JqZWN0LmtleXMobm9kZURhdGFbZGlyZWN0aW9uXSk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IG5laWdoYm9ycyA9IG5ldyBTZXQoKTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIG1lcmdlKG5laWdoYm9ycywgbm9kZURhdGEuaW4pO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLm91dCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRha2UobmVpZ2hib3JzLnZhbHVlcygpLCBuZWlnaGJvcnMuc2l6ZSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdpdmVuIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYVxuICogY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlLFxuICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgIGNvbnN0IG5laWdoYm9yRGF0YSA9IHNvdXJjZURhdGEgPT09IG5vZGVEYXRhID8gdGFyZ2V0RGF0YSA6IHNvdXJjZURhdGE7XG5cbiAgICBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgb2JqZWN0LCBjYWxsYmFjaykge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNhbGxiYWNrKG5laWdoYm9yRGF0YS5rZXksIG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBnaXZlbiBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbSB1c2luZyBhIHByZWRpY2F0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmaW5kSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBuZWlnaGJvckRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBvYmplY3QsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBsZXQgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNvbnN0IHNob3VsZEJyZWFrID0gY2FsbGJhY2sobmVpZ2hib3JEYXRhLmtleSwgbmVpZ2hib3JEYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gbmVpZ2hib3JEYXRhLmtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaE5laWdoYm9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICAvLyBJZiB3ZSB3YW50IG9ubHkgdW5kaXJlY3RlZCBvciBpbiBvciBvdXQsIHdlIGNhbiByb2xsIHNvbWUgb3B0aW1pemF0aW9uc1xuICBpZiAodHlwZSAhPT0gJ21peGVkJykge1xuICAgIGlmICh0eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YVtkaXJlY3Rpb25dLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbiwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5vdXQsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvckVhY2hJbk9iamVjdE9uY2UodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTmVpZ2hib3IodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSwgY2FsbGJhY2spIHtcbiAgLy8gSWYgd2Ugd2FudCBvbmx5IHVuZGlyZWN0ZWQgb3IgaW4gb3Igb3V0LCB3ZSBjYW4gcm9sbCBzb21lIG9wdGltaXphdGlvbnNcbiAgaWYgKHR5cGUgIT09ICdtaXhlZCcpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGFbZGlyZWN0aW9uXSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gRWxzZSB3ZSBuZWVkIHRvIGtlZXAgYSBzZXQgb2YgbmVpZ2hib3JzIG5vdCB0byByZXR1cm4gZHVwbGljYXRlc1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEub3V0LCBjYWxsYmFjayk7XG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm91bmQgPSBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gbm9kZSdzIHJlbGV2YW50IG5laWdoYm9ycy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBuZWlnaGJvcnMuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gRGlyZWN0aW9uLlxuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgb2JqZWN0KSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgIGwgPSBrZXlzLmxlbmd0aDtcblxuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrZXlzW2krK11dO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB7bmVpZ2hib3I6IG5laWdoYm9yRGF0YS5rZXksIGF0dHJpYnV0ZXM6IG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzfVxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG9iamVjdCkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICBsID0ga2V5cy5sZW5ndGg7XG5cbiAgbGV0IGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tleXNbaSsrXV07XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZSxcbiAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5laWdoYm9yRGF0YS5rZXkpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgdmlzaXRlZC5hZGQobmVpZ2hib3JEYXRhLmtleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZToge25laWdoYm9yOiBuZWlnaGJvckRhdGEua2V5LCBhdHRyaWJ1dGVzOiBuZWlnaGJvckRhdGEuYXR0cmlidXRlc31cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcih0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gY3JlYXRlT2JqZWN0SXRlcmF0b3Iobm9kZURhdGEsIG5vZGVEYXRhW2RpcmVjdGlvbl0pO1xuICB9XG5cbiAgbGV0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgICBpdGVyYXRvcixcbiAgICAgICAgY3JlYXRlRGVkdXBlZE9iamVjdEl0ZXJhdG9yKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLm91dClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgaXRlcmF0b3IsXG4gICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihDbGFzcywgZGVzY3JpcHRpb24pIHtcbiAgY29uc3Qge25hbWUsIHR5cGUsIGRpcmVjdGlvbn0gPSBkZXNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGNlcnRhaW4gbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgbm9kZSAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEByZXR1cm4ge2FycmF5fSAtIFRoZSBuZWlnaGJvcnMgb2YgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtuYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JBcnJheUZvck5vZGUoXG4gICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIG5vZGVEYXRhXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGZvckVhY2hOYW1lID0gJ2ZvckVhY2gnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgZm9yRWFjaE5laWdoYm9yRm9yTm9kZShcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG1hcHBpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBtYXBOYW1lID0gJ21hcCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVttYXBOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIFRPRE86IG9wdGltaXplIHdoZW4gc2l6ZSBpcyBrbm93biBiZWZvcmVoYW5kXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2sobiwgYSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYSBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZmlsdGVyTmFtZSA9ICdmaWx0ZXInICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbZmlsdGVyTmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2sobiwgYSkpIHJlc3VsdC5wdXNoKG4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCByZWR1Y2VOYW1lID0gJ3JlZHVjZScgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtyZWR1Y2VOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtyZWR1Y2VOYW1lfTogbWlzc2luZyBpbml0aWFsIHZhbHVlLiBZb3UgbXVzdCBwcm92aWRlIGl0IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHRha2VzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgYW5kIHdlIGNhbm5vdCBpbmZlciB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFzIHlvdSBjb3VsZCB3aXRoIGEgc2ltcGxlIGFycmF5LmBcbiAgICAgICk7XG5cbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbiwgYSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGEgYnJlYWthYmxlIG5laWdoYm9ycyBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlXG4gKiBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGNhcGl0YWxpemVkU2luZ3VsYXIgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICBjb25zdCBmaW5kTmFtZSA9ICdmaW5kJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZpbmROYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmaW5kTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgcmV0dXJuIGZpbmROZWlnaGJvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIGZpbmQgaWYgYW55IG9mIHRoZW1cbiAgICogbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW3NvbWVOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kTmFtZV0obm9kZSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdG8gZmluZCBpZiBhbGwgb2YgdGhlbVxuICAgKiBtYXRjaGUgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW2V2ZXJ5TmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICByZXR1cm4gIWNhbGxiYWNrKG4sIGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoTmVpZ2hib3JJdGVyYXRvckNyZWF0b3IoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgaXRlcmF0b3JOYW1lID0gbmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtpdGVyYXRvck5hbWVdID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7aXRlcmF0b3JOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGFcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBldmVyeSBuZWlnaGJvciBpdGVyYXRpb24gbWV0aG9kIHRvIHRoZSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIEdyYXBoIGNsYXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgTkVJR0hCT1JTX0lURVJBVElPTi5mb3JFYWNoKGRlc2NyaXB0aW9uID0+IHtcbiAgICBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZvckVhY2hOZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmROZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaE5laWdoYm9ySXRlcmF0b3JDcmVhdG9yKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogR3JhcGhvbG9neSBBZGphY2VuY3kgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEF0dGFjaGluZyBzb21lIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFcbiAqIGdyYXBoJ3MgYWRqYWNlbmN5LlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBzaW1wbGUgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoXG4gIGJyZWFrYWJsZSxcbiAgYXNzeW1ldHJpYyxcbiAgZGlzY29ubmVjdGVkTm9kZXMsXG4gIGdyYXBoLFxuICBjYWxsYmFja1xuKSB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX25vZGVzLnZhbHVlcygpO1xuXG4gIGNvbnN0IHR5cGUgPSBncmFwaC50eXBlO1xuXG4gIGxldCBzdGVwLCBzb3VyY2VEYXRhLCBuZWlnaGJvciwgYWRqLCBlZGdlRGF0YSwgdGFyZ2V0RGF0YSwgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBoYXNFZGdlcyA9IHRydWU7XG4gICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS5rZXksXG4gICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBhZGogPSBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGlmIChhc3N5bWV0cmljICYmIHNvdXJjZURhdGEua2V5ID4gbmVpZ2hib3IpIGNvbnRpbnVlO1xuXG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgIGhhc0VkZ2VzID0gdHJ1ZTtcbiAgICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICB0YXJnZXREYXRhLmtleSxcbiAgICAgICAgICBzb3VyY2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYnJlYWthYmxlICYmIHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbXVsdGkgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lNdWx0aShcbiAgYnJlYWthYmxlLFxuICBhc3N5bWV0cmljLFxuICBkaXNjb25uZWN0ZWROb2RlcyxcbiAgZ3JhcGgsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbiAgbGV0IHN0ZXA7XG4gIGxldCBzb3VyY2VEYXRhO1xuICBsZXQgbmVpZ2hib3I7XG4gIGxldCBjb250YWluZXI7XG4gIGxldCBjb250YWluZXJTdGVwO1xuICBsZXQgYWRqO1xuICBsZXQgZWRnZURhdGE7XG4gIGxldCB0YXJnZXREYXRhO1xuICBsZXQgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGFkaltuZWlnaGJvcl0udmFsdWVzKCk7XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICgoY29udGFpbmVyU3RlcCA9IGNvbnRhaW5lci5uZXh0KCkpLCBjb250YWluZXJTdGVwLmRvbmUgIT09IHRydWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGVkZ2VEYXRhID0gY29udGFpbmVyU3RlcC52YWx1ZTtcbiAgICAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcblxuICAgICAgZm9yIChuZWlnaGJvciBpbiBhZGopIHtcbiAgICAgICAgaWYgKGFzc3ltZXRyaWMgJiYgc291cmNlRGF0YS5rZXkgPiBuZWlnaGJvcikgY29udGludWU7XG5cbiAgICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgKChjb250YWluZXJTdGVwID0gY29udGFpbmVyLm5leHQoKSksIGNvbnRhaW5lclN0ZXAuZG9uZSAhPT0gdHJ1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZWRnZURhdGEgPSBjb250YWluZXJTdGVwLnZhbHVlO1xuICAgICAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRqYWNlbmN5SXRlcmF0b3JTaW1wbGUoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBhZGosXG4vLyAgICAgb2Zmc2V0O1xuXG4vLyAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbi8vICAgICBsZXQgc3RlcDtcblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ291dGVyJykge1xuLy8gICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuLy8gICAgICAgaWYgKHN0ZXAuZG9uZSA9PT0gdHJ1ZSkgcmV0dXJuIHN0ZXA7XG5cbi8vICAgICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4vLyAgICAgICBzdGF0ZSA9ICdkaXJlY3RlZCc7XG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG4vLyAgICAgICBuZWlnaGJvcnMgPSBPYmplY3Qua2V5cyhzb3VyY2VEYXRhLm91dCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEudW5kaXJlY3RlZCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItdW5kaXJlY3RlZCc7XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gSW5uZXJcbi8vICAgICBpZiAob2Zmc2V0ID49IG5laWdoYm9ycy5sZW5ndGgpIHtcbi8vICAgICAgIGlmIChzdGF0ZSA9PT0gJ2lubmVyLXVuZGlyZWN0ZWQnKSBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICBlbHNlIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGNvbnN0IG5laWdoYm9yID0gbmVpZ2hib3JzW29mZnNldCsrXTtcbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IGFkaltuZWlnaGJvcl07XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2VLZXk6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkamFjZW5jeUl0ZXJhdG9yTXVsdGkoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBjb250YWluZXIgPSBudWxsLFxuLy8gICAgIGFkaixcbi8vICAgICBvZmZzZXQ7XG5cbi8vICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuLy8gICAgIGxldCBzdGVwO1xuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnb3V0ZXInKSB7XG4vLyAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4vLyAgICAgICBpZiAoc3RlcC5kb25lID09PSB0cnVlKSByZXR1cm4gc3RlcDtcblxuLy8gICAgICAgc291cmNlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbi8vICAgICAgIHN0YXRlID0gJ2RpcmVjdGVkJztcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuLy8gICAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBhZGogPSBzb3VyY2VEYXRhLm91dDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEub3V0KTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci1kaXJlY3RlZCc7XG5cbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAndW5kaXJlY3RlZCcpIHtcbi8vICAgICAgIGlmICh0eXBlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ291dGVyJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS51bmRpcmVjdGVkO1xuLy8gICAgICAgbmVpZ2hib3JzID0gT2JqZWN0LmtleXMoc291cmNlRGF0YS51bmRpcmVjdGVkKTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci11bmRpcmVjdGVkJztcbi8vICAgICB9XG5cbi8vICAgICAvLyBJbm5lclxuLy8gICAgIGlmICghY29udGFpbmVyICYmIG9mZnNldCA+PSBuZWlnaGJvcnMubGVuZ3RoKSB7XG4vLyAgICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJykgc3RhdGUgPSAnb3V0ZXInO1xuLy8gICAgICAgZWxzZSBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcblxuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBpZiAoIWNvbnRhaW5lcikge1xuLy8gICAgICAgY29uc3QgbmVpZ2hib3IgPSBuZWlnaGJvcnNbb2Zmc2V0KytdO1xuLy8gICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgc3RlcCA9IGNvbnRhaW5lci5uZXh0KCk7XG5cbi8vICAgICBpZiAoc3RlcC5kb25lKSB7XG4vLyAgICAgICBjb250YWluZXIgPSBudWxsO1xuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgU2VyaWFsaXphdGlvbiBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQ29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byB2YWxpZGF0ZSBpbXBvcnQtZXhwb3J0IGZvcm1hdHMgJiB0byBvdXB1dFxuICogdGhlbSBmcm9tIGludGVybmFsIGdyYXBoIGRhdGEuXG4gKlxuICogU2VyaWFsaXplZCBOb2RlOlxuICoge2tleSwgP2F0dHJpYnV0ZXN9XG4gKlxuICogU2VyaWFsaXplZCBFZGdlOlxuICoge2tleT8sIHNvdXJjZSwgdGFyZ2V0LCBhdHRyaWJ1dGVzPywgdW5kaXJlY3RlZD99XG4gKlxuICogU2VyaWFsaXplZCBHcmFwaDpcbiAqIHtub2Rlc1tdLCBlZGdlcz9bXX1cbiAqL1xuaW1wb3J0IHthc3NpZ24sIGlzUGxhaW5PYmplY3QsIGlzRW1wdHl9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgbm9kZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIG5vZGUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVOb2RlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge2tleX07XG5cbiAgaWYgKCFpc0VtcHR5KGRhdGEuYXR0cmlidXRlcykpXG4gICAgc2VyaWFsaXplZC5hdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgZWRnZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIGVkZ2UuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBlZGdlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgIGtleSxcbiAgICBzb3VyY2U6IGRhdGEuc291cmNlLmtleSxcbiAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleVxuICB9O1xuXG4gIGlmICghaXNFbXB0eShkYXRhLmF0dHJpYnV0ZXMpKVxuICAgIHNlcmlhbGl6ZWQuYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICBpZiAoZGF0YS51bmRpcmVjdGVkKSBzZXJpYWxpemVkLnVuZGlyZWN0ZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHNlcmlhbGl6ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHttaXhlZH0gdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VyaWFsaXplZE5vZGUodmFsdWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdub3Qtb2JqZWN0JztcblxuICBpZiAoISgna2V5JyBpbiB2YWx1ZSkpIHJldHVybiAnbm8ta2V5JztcblxuICBpZiAoXG4gICAgJ2F0dHJpYnV0ZXMnIGluIHZhbHVlICYmXG4gICAgKCFpc1BsYWluT2JqZWN0KHZhbHVlLmF0dHJpYnV0ZXMpIHx8IHZhbHVlLmF0dHJpYnV0ZXMgPT09IG51bGwpXG4gIClcbiAgICByZXR1cm4gJ2ludmFsaWQtYXR0cmlidXRlcyc7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc2VyaWFsaXplZCBlZGdlLlxuICpcbiAqIEBwYXJhbSAge21peGVkfSB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXJpYWxpemVkRWRnZSh2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gJ25vdC1vYmplY3QnO1xuXG4gIGlmICghKCdzb3VyY2UnIGluIHZhbHVlKSkgcmV0dXJuICduby1zb3VyY2UnO1xuXG4gIGlmICghKCd0YXJnZXQnIGluIHZhbHVlKSkgcmV0dXJuICduby10YXJnZXQnO1xuXG4gIGlmIChcbiAgICAnYXR0cmlidXRlcycgaW4gdmFsdWUgJiZcbiAgICAoIWlzUGxhaW5PYmplY3QodmFsdWUuYXR0cmlidXRlcykgfHwgdmFsdWUuYXR0cmlidXRlcyA9PT0gbnVsbClcbiAgKVxuICAgIHJldHVybiAnaW52YWxpZC1hdHRyaWJ1dGVzJztcblxuICBpZiAoJ3VuZGlyZWN0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51bmRpcmVjdGVkICE9PSAnYm9vbGVhbicpXG4gICAgcmV0dXJuICdpbnZhbGlkLXVuZGlyZWN0ZWQnO1xuXG4gIHJldHVybiBudWxsO1xufVxuIiwgIi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuLyoqXG4gKiBHcmFwaG9sb2d5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBncmFwaG9sb2d5IHNwZWNzLlxuICovXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBJdGVyYXRvciBmcm9tICdvYmxpdGVyYXRvci9pdGVyYXRvcic7XG5pbXBvcnQgdGFrZSBmcm9tICdvYmxpdGVyYXRvci90YWtlJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtcbiAgTWl4ZWROb2RlRGF0YSxcbiAgRGlyZWN0ZWROb2RlRGF0YSxcbiAgVW5kaXJlY3RlZE5vZGVEYXRhLFxuICBFZGdlRGF0YVxufSBmcm9tICcuL2RhdGEnO1xuXG5pbXBvcnQge1xuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleCxcbiAgY2xlYXJFZGdlRnJvbVN0cnVjdHVyZUluZGV4LFxuICBjbGVhclN0cnVjdHVyZUluZGV4LFxuICB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpXG59IGZyb20gJy4vaW5kaWNlcyc7XG5cbmltcG9ydCBhdHRhY2hOb2RlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL25vZGVzJztcbmltcG9ydCBhdHRhY2hFZGdlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL2VkZ2VzJztcbmltcG9ydCBhdHRhY2hFZGdlSXRlcmF0aW9uTWV0aG9kcyBmcm9tICcuL2l0ZXJhdGlvbi9lZGdlcyc7XG5pbXBvcnQgYXR0YWNoTmVpZ2hib3JJdGVyYXRpb25NZXRob2RzIGZyb20gJy4vaXRlcmF0aW9uL25laWdoYm9ycyc7XG5pbXBvcnQge1xuICBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlLFxuICBmb3JFYWNoQWRqYWNlbmN5TXVsdGlcbn0gZnJvbSAnLi9pdGVyYXRpb24vYWRqYWNlbmN5JztcblxuaW1wb3J0IHtcbiAgc2VyaWFsaXplTm9kZSxcbiAgc2VyaWFsaXplRWRnZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkTm9kZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkRWRnZVxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5pbXBvcnQge1xuICBhc3NpZ24sXG4gIGdldE1hdGNoaW5nRWRnZSxcbiAgaXNHcmFwaCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgcHJpdmF0ZVByb3BlcnR5LFxuICByZWFkT25seVByb3BlcnR5LFxuICBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSxcbiAgdmFsaWRhdGVIaW50c1xufSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb25zdGFudHMuXG4gKi9cbmNvbnN0IElOU1RBTkNFX0lEID0gaW5jcmVtZW50YWxJZFN0YXJ0aW5nRnJvbVJhbmRvbUJ5dGUoKTtcblxuLyoqXG4gKiBFbnVtcy5cbiAqL1xuY29uc3QgVFlQRVMgPSBuZXcgU2V0KFsnZGlyZWN0ZWQnLCAndW5kaXJlY3RlZCcsICdtaXhlZCddKTtcblxuY29uc3QgRU1JVFRFUl9QUk9QUyA9IG5ldyBTZXQoW1xuICAnZG9tYWluJyxcbiAgJ19ldmVudHMnLFxuICAnX2V2ZW50c0NvdW50JyxcbiAgJ19tYXhMaXN0ZW5lcnMnXG5dKTtcblxuY29uc3QgRURHRV9BRERfTUVUSE9EUyA9IFtcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZVxuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifURpcmVjdGVkRWRnZWAsXG4gICAgZ2VuZXJhdGVLZXk6IHRydWUsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifVVuZGlyZWN0ZWRFZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZSxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlV2l0aEtleWBcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1EaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiB2ZXJiID0+IGAke3ZlcmJ9VW5kaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRTID0ge1xuICBhbGxvd1NlbGZMb29wczogdHJ1ZSxcbiAgbXVsdGk6IGZhbHNlLFxuICB0eXBlOiAnbWl4ZWQnXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBHcmFwaCBjbGFzcyBmb3IgdmFyaW91cyBtZXRob2RzLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gYWRkIGEgbm9kZSB0byB0aGUgZ2l2ZW4gZ3JhcGhcbiAqXG4gKiBAcGFyYW0gIHtHcmFwaH0gICBncmFwaCAgICAgICAgICAgLSBUYXJnZXQgZ3JhcGguXG4gKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAgICAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSAge29iamVjdH0gIFthdHRyaWJ1dGVzXSAgICAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJuIHtOb2RlRGF0YX0gICAgICAgICAgICAgICAgLSBDcmVhdGVkIG5vZGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYWRkTm9kZShncmFwaCwgbm9kZSwgYXR0cmlidXRlcykge1xuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguYWRkTm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBTdHJpbmcgY29lcmNpb25cbiAgbm9kZSA9ICcnICsgbm9kZTtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKGdyYXBoLl9ub2Rlcy5oYXMobm9kZSkpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5hZGROb2RlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBhbHJlYWR5IGV4aXN0IGluIHRoZSBncmFwaC5gXG4gICAgKTtcblxuICBjb25zdCBkYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Mobm9kZSwgYXR0cmlidXRlcyk7XG5cbiAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgLy8gRW1pdHRpbmdcbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgdGhlIGFib3ZlIGJ1dCB3aXRob3V0IHNhbml0eSBjaGVja3MgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgaW4gY29udGV4dHNcbiAqIHdoZXJlIG5lY2Vzc2FyeSBjaGVja3Mgd2VyZSBhbHJlYWR5IGRvbmUuXG4gKi9cbmZ1bmN0aW9uIHVuc2FmZUFkZE5vZGUoZ3JhcGgsIG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3QgZGF0YSA9IG5ldyBncmFwaC5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHJldHVybiB7YW55fSAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGVkZ2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgb2YgdGhlIHdyb25nIHR5cGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYW4gb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIGFkZEVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzXG4pIHtcbiAgLy8gQ2hlY2tpbmcgdmFsaWRpdHkgb2Ygb3BlcmF0aW9uXG4gIGlmICghdW5kaXJlY3RlZCAmJiBncmFwaC50eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhIGRpcmVjdGVkIGVkZ2UgdG8gYW4gdW5kaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGRVbmRpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmICh1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICdkaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhbiB1bmRpcmVjdGVkIGVkZ2UgdG8gYSBkaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGREaXJlY3RlZEVkZ2UgaW5zdGVhZC5gXG4gICAgKTtcblxuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBDb2VyY2lvbiBvZiBzb3VyY2UgJiB0YXJnZXQ6XG4gIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICB0YXJnZXQgPSAnJyArIHRhcmdldDtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpLFxuICAgIHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG5cbiAgaWYgKCFzb3VyY2VEYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogc291cmNlIG5vZGUgXCIke3NvdXJjZX1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgaWYgKCF0YXJnZXREYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdGFyZ2V0IG5vZGUgXCIke3RhcmdldH1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgLy8gTXVzdCB0aGUgZ3JhcGggZ2VuZXJhdGUgYW4gaWQgZm9yIHRoaXMgZWRnZT9cbiAgY29uc3QgZXZlbnREYXRhID0ge1xuICAgIGtleTogbnVsbCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgYXR0cmlidXRlc1xuICB9O1xuXG4gIGlmIChtdXN0R2VuZXJhdGVLZXkpIHtcbiAgICAvLyBOT1RFOiBpbiB0aGlzIGNhc2Ugd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGV4aXN0IGFuZCBpcyBhbHJlYWR5IGNvcnJlY3RseSBjYXN0ZWQgYXMgYSBzdHJpbmdcbiAgICBlZGdlID0gZ3JhcGguX2VkZ2VLZXlHZW5lcmF0b3IoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2lvbiBvZiBlZGdlIGtleVxuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICAvLyBIZXJlLCB3ZSBoYXZlIGEga2V5IGNvbGxpc2lvblxuICAgIGlmIChncmFwaC5fZWRnZXMuaGFzKGVkZ2UpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bmFtZX06IHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuICB9XG5cbiAgLy8gSGVyZSwgd2UgbWlnaHQgaGF2ZSBhIHNvdXJjZSAvIHRhcmdldCBjb2xsaXNpb25cbiAgaWYgKFxuICAgICFncmFwaC5tdWx0aSAmJlxuICAgICh1bmRpcmVjdGVkXG4gICAgICA/IHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIDogdHlwZW9mIHNvdXJjZURhdGEub3V0W3RhcmdldF0gIT09ICd1bmRlZmluZWQnKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IGFuIGVkZ2UgbGlua2luZyBcIiR7c291cmNlfVwiIHRvIFwiJHt0YXJnZXR9XCIgYWxyZWFkeSBleGlzdHMuIElmIHlvdSByZWFsbHkgd2FudCB0byBhZGQgbXVsdGlwbGUgZWRnZXMgbGlua2luZyB0aG9zZSBub2RlcywgeW91IHNob3VsZCBjcmVhdGUgYSBtdWx0aSBncmFwaCBieSB1c2luZyB0aGUgJ211bHRpJyBvcHRpb24uYFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9yaW5nIHNvbWUgZGF0YVxuICBjb25zdCBlZGdlRGF0YSA9IG5ldyBFZGdlRGF0YShcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2UsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhLFxuICAgIGF0dHJpYnV0ZXNcbiAgKTtcblxuICAvLyBBZGRpbmcgdGhlIGVkZ2UgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9lZGdlcy5zZXQoZWRnZSwgZWRnZURhdGEpO1xuXG4gIC8vIEluY3JlbWVudGluZyBub2RlIGRlZ3JlZSBjb3VudGVyc1xuICBpZiAoc291cmNlID09PSB0YXJnZXQpIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5kaXJlY3RlZFNlbGZMb29wcysrO1xuICAgICAgZ3JhcGguX2RpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkRGVncmVlKys7XG4gICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5vdXREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUrKztcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGluZyByZWxldmFudCBpbmRleFxuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleChcbiAgICBncmFwaCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2VEYXRhLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhXG4gICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQpIGdyYXBoLl91bmRpcmVjdGVkU2l6ZSsrO1xuICBlbHNlIGdyYXBoLl9kaXJlY3RlZFNpemUrKztcblxuICAvLyBFbWl0dGluZ1xuICBldmVudERhdGEua2V5ID0gZWRnZTtcblxuICBncmFwaC5lbWl0KCdlZGdlQWRkZWQnLCBldmVudERhdGEpO1xuXG4gIHJldHVybiBlZGdlO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2FzVXBkYXRlcl0gICAgICAgLSBBcmUgd2UgdXBkYXRpbmcgb3IgbWVyZ2luZz9cbiAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgICAgICAtIFRoZSBlZGdlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG9mIHRoZSB3cm9uZyB0eXBlLlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBtZXJnZUVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzLFxuICBhc1VwZGF0ZXJcbikge1xuICAvLyBDaGVja2luZyB2YWxpZGl0eSBvZiBvcGVyYXRpb25cbiAgaWYgKCF1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGEgZGlyZWN0ZWQgZWRnZSB0byBhbiB1bmRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZFVuZGlyZWN0ZWRFZGdlIGluc3RlYWQuYFxuICAgICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQgJiYgZ3JhcGgudHlwZSA9PT0gJ2RpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSB0byBhIGRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZERpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKGFzVXBkYXRlcikge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgdXBkYXRlciBmdW5jdGlvbi4gRXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgYXR0cmlidXRlcy4gRXhwZWN0aW5nIGFuIG9iamVjdCBidXQgZ290IFwiJHthdHRyaWJ1dGVzfVwiYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvZXJjaW9uIG9mIHNvdXJjZSAmIHRhcmdldDpcbiAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gIGxldCB1cGRhdGVyO1xuXG4gIGlmIChhc1VwZGF0ZXIpIHtcbiAgICB1cGRhdGVyID0gYXR0cmlidXRlcztcbiAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBsZXQgc291cmNlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQoc291cmNlKTtcbiAgbGV0IHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG4gIGxldCBlZGdlRGF0YTtcblxuICAvLyBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBkdXBsaWNhdGU/XG4gIGxldCBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YTtcblxuICBpZiAoIW11c3RHZW5lcmF0ZUtleSkge1xuICAgIGVkZ2VEYXRhID0gZ3JhcGguX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmIChlZGdlRGF0YSkge1xuICAgICAgLy8gSGVyZSwgd2UgbmVlZCB0byBlbnN1cmUsIGlmIHRoZSB1c2VyIGdhdmUgYSBrZXksIHRoYXQgc291cmNlICYgdGFyZ2V0XG4gICAgICAvLyBhcmUgY29oZXJlbnRcbiAgICAgIGlmIChcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSAhPT0gc291cmNlIHx8XG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXkgIT09IHRhcmdldCB8fFxuICAgICAgICAodW5kaXJlY3RlZCAmJlxuICAgICAgICAgIChlZGdlRGF0YS5zb3VyY2Uua2V5ICE9PSB0YXJnZXQgfHwgZWRnZURhdGEudGFyZ2V0LmtleSAhPT0gc291cmNlKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBpbmNvbnNpc3RlbmN5IGRldGVjdGVkIHdoZW4gYXR0ZW1wdGluZyB0byBtZXJnZSB0aGUgXCIke2VkZ2V9XCIgZWRnZSB3aXRoIFwiJHtzb3VyY2V9XCIgc291cmNlICYgXCIke3RhcmdldH1cIiB0YXJnZXQgdnMuIChcIiR7ZWRnZURhdGEuc291cmNlLmtleX1cIiwgXCIke2VkZ2VEYXRhLnRhcmdldC5rZXl9XCIpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSBlZGdlRGF0YTtcbiAgICB9XG4gIH1cblxuICAvLyBIZXJlLCB3ZSBtaWdodCBoYXZlIGEgc291cmNlIC8gdGFyZ2V0IGNvbGxpc2lvblxuICBpZiAoIWFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhICYmICFncmFwaC5tdWx0aSAmJiBzb3VyY2VEYXRhKSB7XG4gICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSB1bmRpcmVjdGVkXG4gICAgICA/IHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdXG4gICAgICA6IHNvdXJjZURhdGEub3V0W3RhcmdldF07XG4gIH1cblxuICAvLyBIYW5kbGluZyBkdXBsaWNhdGVzXG4gIGlmIChhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YSkge1xuICAgIGNvbnN0IGluZm8gPSBbYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEua2V5LCBmYWxzZSwgZmFsc2UsIGZhbHNlXTtcblxuICAgIC8vIFdlIGNhbiBza2lwIHRoZSBhdHRyaWJ1dGUgbWVyZ2luZyBwYXJ0IGlmIHRoZSB1c2VyIGRpZCBub3QgcHJvdmlkZSB0aGVtXG4gICAgaWYgKGFzVXBkYXRlciA/ICF1cGRhdGVyIDogIWF0dHJpYnV0ZXMpIHJldHVybiBpbmZvO1xuXG4gICAgLy8gVXBkYXRpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBpZiAoYXNVcGRhdGVyKSB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcztcbiAgICAgIGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXMgPSB1cGRhdGVyKG9sZEF0dHJpYnV0ZXMpO1xuXG4gICAgICBncmFwaC5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgICAga2V5OiBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5rZXksXG4gICAgICAgIGF0dHJpYnV0ZXM6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1lcmdpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBlbHNlIHtcbiAgICAgIGFzc2lnbihhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgZ3JhcGguZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgICBrZXk6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmtleSxcbiAgICAgICAgYXR0cmlidXRlczogYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcyB8fCB7fTtcblxuICBpZiAoYXNVcGRhdGVyICYmIHVwZGF0ZXIpIGF0dHJpYnV0ZXMgPSB1cGRhdGVyKGF0dHJpYnV0ZXMpO1xuXG4gIC8vIE11c3QgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkIGZvciB0aGlzIGVkZ2U/XG4gIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICBrZXk6IG51bGwsXG4gICAgdW5kaXJlY3RlZCxcbiAgICBzb3VyY2UsXG4gICAgdGFyZ2V0LFxuICAgIGF0dHJpYnV0ZXNcbiAgfTtcblxuICBpZiAobXVzdEdlbmVyYXRlS2V5KSB7XG4gICAgLy8gTk9URTogaW4gdGhpcyBjYXNlIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUga2V5IGRvZXMgbm90IGFscmVhZHlcbiAgICAvLyBleGlzdCBhbmQgaXMgYWxyZWFkeSBjb3JyZWN0bHkgY2FzdGVkIGFzIGEgc3RyaW5nXG4gICAgZWRnZSA9IGdyYXBoLl9lZGdlS2V5R2VuZXJhdG9yKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNpb24gb2YgZWRnZSBrZXlcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgLy8gSGVyZSwgd2UgaGF2ZSBhIGtleSBjb2xsaXNpb25cbiAgICBpZiAoZ3JhcGguX2VkZ2VzLmhhcyhlZGdlKSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke25hbWV9OiB0aGUgXCIke2VkZ2V9XCIgZWRnZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcbiAgfVxuXG4gIGxldCBzb3VyY2VXYXNBZGRlZCA9IGZhbHNlO1xuICBsZXQgdGFyZ2V0V2FzQWRkZWQgPSBmYWxzZTtcblxuICBpZiAoIXNvdXJjZURhdGEpIHtcbiAgICBzb3VyY2VEYXRhID0gdW5zYWZlQWRkTm9kZShncmFwaCwgc291cmNlLCB7fSk7XG4gICAgc291cmNlV2FzQWRkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgICB0YXJnZXREYXRhID0gc291cmNlRGF0YTtcbiAgICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0YXJnZXREYXRhKSB7XG4gICAgdGFyZ2V0RGF0YSA9IHVuc2FmZUFkZE5vZGUoZ3JhcGgsIHRhcmdldCwge30pO1xuICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFN0b3Jpbmcgc29tZSBkYXRhXG4gIGVkZ2VEYXRhID0gbmV3IEVkZ2VEYXRhKHVuZGlyZWN0ZWQsIGVkZ2UsIHNvdXJjZURhdGEsIHRhcmdldERhdGEsIGF0dHJpYnV0ZXMpO1xuXG4gIC8vIEFkZGluZyB0aGUgZWRnZSB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJcbiAgZ3JhcGguX2VkZ2VzLnNldChlZGdlLCBlZGdlRGF0YSk7XG5cbiAgLy8gSW5jcmVtZW50aW5nIG5vZGUgZGVncmVlIGNvdW50ZXJzXG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMrKztcbiAgICAgIGdyYXBoLl91bmRpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fZGlyZWN0ZWRTZWxmTG9vcENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEudW5kaXJlY3RlZERlZ3JlZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLm91dERlZ3JlZSsrO1xuICAgICAgdGFyZ2V0RGF0YS5pbkRlZ3JlZSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHJlbGV2YW50IGluZGV4XG4gIHVwZGF0ZVN0cnVjdHVyZUluZGV4KFxuICAgIGdyYXBoLFxuICAgIHVuZGlyZWN0ZWQsXG4gICAgZWRnZURhdGEsXG4gICAgc291cmNlLFxuICAgIHRhcmdldCxcbiAgICBzb3VyY2VEYXRhLFxuICAgIHRhcmdldERhdGFcbiAgKTtcblxuICBpZiAodW5kaXJlY3RlZCkgZ3JhcGguX3VuZGlyZWN0ZWRTaXplKys7XG4gIGVsc2UgZ3JhcGguX2RpcmVjdGVkU2l6ZSsrO1xuXG4gIC8vIEVtaXR0aW5nXG4gIGV2ZW50RGF0YS5rZXkgPSBlZGdlO1xuXG4gIGdyYXBoLmVtaXQoJ2VkZ2VBZGRlZCcsIGV2ZW50RGF0YSk7XG5cbiAgcmV0dXJuIFtlZGdlLCB0cnVlLCBzb3VyY2VXYXNBZGRlZCwgdGFyZ2V0V2FzQWRkZWRdO1xufVxuXG4vKipcbiAqIEdyYXBoIGNsYXNzXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbb3B0aW9uc10gLSBPcHRpb25zOlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbYWxsb3dTZWxmTG9vcHNdIC0gQWxsb3cgc2VsZiBsb29wcz9cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgW3R5cGVdICAgICAgICAgICAtIFR5cGUgb2YgdGhlIGdyYXBoLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbWFwXSAgICAgICAgICAgIC0gQWxsb3cgcmVmZXJlbmNlcyBhcyBrZXlzP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbXVsdGldICAgICAgICAgIC0gQWxsb3cgcGFyYWxsZWwgZWRnZXM/XG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgYXJndW1lbnRzIGFyZSBub3QgdmFsaWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXBoIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLy0tIFNvbHZpbmcgb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRTLCBvcHRpb25zKTtcblxuICAgIC8vIEVuZm9yY2luZyBvcHRpb25zIHZhbGlkaXR5XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm11bHRpICE9PSAnYm9vbGVhbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5jb25zdHJ1Y3RvcjogaW52YWxpZCAnbXVsdGknIG9wdGlvbi4gRXhwZWN0aW5nIGEgYm9vbGVhbiBidXQgZ290IFwiJHtvcHRpb25zLm11bHRpfVwiLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIVRZUEVTLmhhcyhvcHRpb25zLnR5cGUpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ3R5cGUnIG9wdGlvbi4gU2hvdWxkIGJlIG9uZSBvZiBcIm1peGVkXCIsIFwiZGlyZWN0ZWRcIiBvciBcInVuZGlyZWN0ZWRcIiBidXQgZ290IFwiJHtvcHRpb25zLnR5cGV9XCIuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbGxvd1NlbGZMb29wcyAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ2FsbG93U2VsZkxvb3BzJyBvcHRpb24uIEV4cGVjdGluZyBhIGJvb2xlYW4gYnV0IGdvdCBcIiR7b3B0aW9ucy5hbGxvd1NlbGZMb29wc31cIi5gXG4gICAgICApO1xuXG4gICAgLy8tLSBQcml2YXRlIHByb3BlcnRpZXNcblxuICAgIC8vIFV0aWxpdGllc1xuICAgIGNvbnN0IE5vZGVEYXRhQ2xhc3MgPVxuICAgICAgb3B0aW9ucy50eXBlID09PSAnbWl4ZWQnXG4gICAgICAgID8gTWl4ZWROb2RlRGF0YVxuICAgICAgICA6IG9wdGlvbnMudHlwZSA9PT0gJ2RpcmVjdGVkJ1xuICAgICAgICA/IERpcmVjdGVkTm9kZURhdGFcbiAgICAgICAgOiBVbmRpcmVjdGVkTm9kZURhdGE7XG5cbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBOb2RlRGF0YUNsYXNzKTtcblxuICAgIC8vIEludGVybmFsIGVkZ2Uga2V5IGdlbmVyYXRvclxuXG4gICAgLy8gTk9URTogdGhpcyBpbnRlcm5hbCBnZW5lcmF0b3IgcHJvZHVjZSBrZXlzIHRoYXQgYXJlIHN0cmluZ3NcbiAgICAvLyBjb21wb3NlZCBvZiBhIHdlaXJkIHByZWZpeCwgYW4gaW5jcmVtZW50YWwgaW5zdGFuY2UgaWQgc3RhcnRpbmcgZnJvbVxuICAgIC8vIGEgcmFuZG9tIGJ5dGUgYW5kIGZpbmFsbHkgYW4gaW50ZXJuYWwgaW5zdGFuY2UgaW5jcmVtZW50YWwgaWQuXG4gICAgLy8gQWxsIHRoaXMgdG8gYXZvaWQgaW50cmEtZnJhbWUgYW5kIGNyb3NzLWZyYW1lIGFkdmVyc2FyaWFsIGlucHV0c1xuICAgIC8vIHRoYXQgY2FuIGZvcmNlIGEgc2luZ2xlICMuYWRkRWRnZSBjYWxsIHRvIGRlZ2VuZXJhdGUgaW50byBhIE8obilcbiAgICAvLyBhdmFpbGFibGUga2V5IHNlYXJjaCBsb29wLlxuXG4gICAgLy8gSXQgYWxzbyBlbnN1cmVzIHRoYXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZWRnZSBrZXlzIGFyZSB1bmxpa2VseVxuICAgIC8vIHRvIHByb2R1Y2UgY29sbGlzaW9ucyB3aXRoIGFyYml0cmFyeSBrZXlzIGdpdmVuIGJ5IHVzZXJzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBJTlNUQU5DRV9JRCgpO1xuICAgIGxldCBlZGdlSWQgPSAwO1xuXG4gICAgY29uc3QgZWRnZUtleUdlbmVyYXRvciA9ICgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFibGVFZGdlS2V5O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGF2YWlsYWJsZUVkZ2VLZXkgPSAnZ2VpZF8nICsgaW5zdGFuY2VJZCArICdfJyArIGVkZ2VJZCsrO1xuICAgICAgfSB3aGlsZSAodGhpcy5fZWRnZXMuaGFzKGF2YWlsYWJsZUVkZ2VLZXkpKTtcblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZUVkZ2VLZXk7XG4gICAgfTtcblxuICAgIC8vIEluZGV4ZXNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19hdHRyaWJ1dGVzJywge30pO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX25vZGVzJywgbmV3IE1hcCgpKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19lZGdlcycsIG5ldyBNYXAoKSk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfZGlyZWN0ZWRTaXplJywgMCk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfdW5kaXJlY3RlZFNpemUnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19kaXJlY3RlZFNlbGZMb29wQ291bnQnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ191bmRpcmVjdGVkU2VsZkxvb3BDb3VudCcsIDApO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX2VkZ2VLZXlHZW5lcmF0b3InLCBlZGdlS2V5R2VuZXJhdG9yKTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19vcHRpb25zJywgb3B0aW9ucyk7XG5cbiAgICAvLyBFbWl0dGVyIHByb3BlcnRpZXNcbiAgICBFTUlUVEVSX1BST1BTLmZvckVhY2gocHJvcCA9PiBwcml2YXRlUHJvcGVydHkodGhpcywgcHJvcCwgdGhpc1twcm9wXSkpO1xuXG4gICAgLy8tLSBQcm9wZXJ0aWVzIHJlYWRlcnNcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdvcmRlcicsICgpID0+IHRoaXMuX25vZGVzLnNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3NpemUnLCAoKSA9PiB0aGlzLl9lZGdlcy5zaXplKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdkaXJlY3RlZFNpemUnLCAoKSA9PiB0aGlzLl9kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3VuZGlyZWN0ZWRTaXplJywgKCkgPT4gdGhpcy5fdW5kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3NlbGZMb29wQ291bnQnLFxuICAgICAgKCkgPT4gdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50ICsgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ2RpcmVjdGVkU2VsZkxvb3BDb3VudCcsXG4gICAgICAoKSA9PiB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50JyxcbiAgICAgICgpID0+IHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50XG4gICAgKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdtdWx0aScsIHRoaXMuX29wdGlvbnMubXVsdGkpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3R5cGUnLCB0aGlzLl9vcHRpb25zLnR5cGUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ2FsbG93U2VsZkxvb3BzJywgdGhpcy5fb3B0aW9ucy5hbGxvd1NlbGZMb29wcyk7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnaW1wbGVtZW50YXRpb24nLCAoKSA9PiAnZ3JhcGhvbG9neScpO1xuICB9XG5cbiAgX3Jlc2V0SW5zdGFuY2VDb3VudGVycygpIHtcbiAgICB0aGlzLl9kaXJlY3RlZFNpemUgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTaXplID0gMDtcbiAgICB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnQgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50ID0gMDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBSZWFkXG4gICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzLmhhcygnJyArIG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZGlyZWN0ZWQgZWRnZSBpcyBmb3VuZCBpbiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIEFyaXR5IDE6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQuXG4gICAqL1xuICBoYXNEaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3QgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIHJldHVybiAhIWVkZ2VEYXRhICYmICFlZGdlRGF0YS51bmRpcmVjdGVkO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGNvbnN0IGVkZ2VzID0gbm9kZURhdGEub3V0W3RhcmdldF07XG5cbiAgICAgIGlmICghZWRnZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyAhIWVkZ2VzLnNpemUgOiB0cnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5oYXNEaXJlY3RlZEVkZ2U6IGludmFsaWQgYXJpdHkgKCR7YXJndW1lbnRzLmxlbmd0aH0sIGluc3RlYWQgb2YgMSBvciAyKS4gWW91IGNhbiBlaXRoZXIgYXNrIGZvciBhbiBlZGdlIGlkIG9yIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGVkZ2UgYmV0d2VlbiBhIHNvdXJjZSAmIGEgdGFyZ2V0LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gdW5kaXJlY3RlZCBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc1VuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgICAgcmV0dXJuICEhZWRnZURhdGEgJiYgZWRnZURhdGEudW5kaXJlY3RlZDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICAgIC8vIElmIHRoZSBub2RlIHNvdXJjZSBvciB0aGUgdGFyZ2V0IGlzIG5vdCBpbiB0aGUgZ3JhcGggd2UgYnJlYWtcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghbm9kZURhdGEpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSXMgdGhlcmUgYSBkaXJlY3RlZCBlZGdlIHBvaW50aW5nIHRvd2FyZCB0YXJnZXQ/XG4gICAgICBjb25zdCBlZGdlcyA9IG5vZGVEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XTtcblxuICAgICAgaWYgKCFlZGdlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5tdWx0aSA/ICEhZWRnZXMuc2l6ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLmhhc0RpcmVjdGVkRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc0VkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZWRnZXMuaGFzKGVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGxldCBlZGdlcyA9IHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIG5vZGVEYXRhLm91dFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKVxuICAgICAgICBlZGdlcyA9XG4gICAgICAgICAgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgbm9kZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLm11bHRpID8gISFlZGdlcy5zaXplIDogdHJ1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguaGFzRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSBkaXJlY3RlZCBmYXNoaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9IHNvdXJjZSAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKiBAcGFyYW0gIHthbnl9IHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBncmFwaCBpcyBtdWx0aS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybjtcblxuICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZGlyZWN0ZWRFZGdlOiB0aGlzIG1ldGhvZCBpcyBpcnJlbGV2YW50IHdpdGggbXVsdGlncmFwaHMgc2luY2UgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXQuIFNlZSAjLmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IChzb3VyY2VEYXRhLm91dCAmJiBzb3VyY2VEYXRhLm91dFt0YXJnZXRdKSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZURhdGEpIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSB1bmRpcmVjdGVkIGZhc2hpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG11bHRpLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHNvdXJjZSBvciB0YXJnZXQgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIHVuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RpcmVjdGVkJykgcmV0dXJuO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51bmRpcmVjdGVkRWRnZTogdGhpcyBtZXRob2QgaXMgaXJyZWxldmFudCB3aXRoIG11bHRpZ3JhcGhzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0LiBTZWUgIy51bmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZEVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGVkZ2UgbWF0Y2hpbmcgc291cmNlICYgdGFyZ2V0IGluIGEgbWl4ZWQgZmFzaGlvbi5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUaGUgZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZWRnZShzb3VyY2UsIHRhcmdldCkge1xuICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmVkZ2U6IHRoaXMgbWV0aG9kIGlzIGlycmVsZXZhbnQgd2l0aCBtdWx0aWdyYXBocyBzaW5jZSB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBlZGdlcyBiZXR3ZWVuIHNvdXJjZSAmIHRhcmdldC4gU2VlICMuZWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEub3V0ICYmIHNvdXJjZURhdGEub3V0W3RhcmdldF0pIHx8XG4gICAgICAoc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIGRpcmVjdGVkIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlRGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVEaXJlY3RlZE5laWdoYm9yczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS5pbiB8fCBuZWlnaGJvciBpbiBub2RlRGF0YS5vdXQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0IG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlT3V0TmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlT3V0TmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG5laWdoYm9yIGluIG5vZGVEYXRhLm91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbiBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZUluTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlSW5OZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbmVpZ2hib3IgaW4gbm9kZURhdGEuaW47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgdW5kaXJlY3RlZCBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZVVuZGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVVbmRpcmVjdGVkTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLmluIHx8IG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbmJvdW5kIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlSW5ib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZUluYm91bmROZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgICBpZiAobmVpZ2hib3IgaW4gbm9kZURhdGEuaW4pIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGlmIChuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0Ym91bmQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBuZWlnaGJvciAtIFRoZSBuZWlnaGJvcidzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBhcmVPdXRib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZU91dGJvdW5kTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpbkRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIG91dCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5vdXREZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5vdXREZWdyZWUgKyBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBkaXJlY3RlZERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgbG9vcHMgPSBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIGNvbnN0IGluRGVncmVlID0gbm9kZURhdGEuaW5EZWdyZWUgKyBsb29wcztcbiAgICBjb25zdCBvdXREZWdyZWUgPSBub2RlRGF0YS5vdXREZWdyZWUgKyBsb29wcztcblxuICAgIHJldHVybiBpbkRlZ3JlZSArIG91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgdW5kaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IGxvb3BzID0gbm9kZURhdGEudW5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIHJldHVybiBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlICsgbG9vcHMgKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyBkaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgbGV0IGRlZ3JlZSA9IDA7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBkZWdyZWUgKz0gbm9kZURhdGEudW5kaXJlY3RlZERlZ3JlZSArIG5vZGVEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9XG4gICAgICAgIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGluIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGluRGVncmVlV2l0aG91dFNlbGZMb29wcyhub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZVdpdGhvdXRTZWxmTG9vcHM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5pbkRlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3Mgb3V0IGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgub3V0RGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLm91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlIHdpdGhvdXQgY29uc2lkZXJpbmcgc2VsZiBsb29wcy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgIC0gVGhlIG5vZGUncyBpbiBkZWdyZWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyB1bmRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLnVuZGlyZWN0ZWREZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBsZXQgZGVncmVlID0gMDtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGRlZ3JlZSArPSBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9IG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNvdXJjZShlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguc291cmNlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHRhcmdldChlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudGFyZ2V0OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnRhcmdldC5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIGV4dHJlbWl0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHthcnJheX0gICAgICAtIFRoZSBlZGdlJ3MgZXh0cmVtaXRpZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZXh0cmVtaXRpZXMoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZWRnZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZXh0cmVtaXRpZXM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIFtlZGdlRGF0YS5zb3VyY2Uua2V5LCBlZGdlRGF0YS50YXJnZXQua2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG5vZGUgJiBhbiBlZGdlLCByZXR1cm5zIHRoZSBvdGhlciBleHRyZW1pdHkgb2YgdGhlIGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgIC0gVGhlIHJlbGF0ZWQgbm9kZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGggb3IgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgIGVkZ2UgJiBub2RlIGFyZSBub3QgcmVsYXRlZC5cbiAgICovXG4gIG9wcG9zaXRlKG5vZGUsIGVkZ2UpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLm9wcG9zaXRlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGRhdGEuc291cmNlLmtleTtcbiAgICBjb25zdCB0YXJnZXQgPSBkYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZSA9PT0gc291cmNlKSByZXR1cm4gdGFyZ2V0O1xuICAgIGlmIChub2RlID09PSB0YXJnZXQpIHJldHVybiBzb3VyY2U7XG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLm9wcG9zaXRlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIFwiJHtlZGdlfVwiIGVkZ2UgKCR7c291cmNlfSwgJHt0YXJnZXR9KS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaGFzIHRoZSBnaXZlbiBub2RlIGFzIGV4dHJlbWl0eS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgLSBUaGUgcmVsYXRlZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGVpdGhlciB0aGUgbm9kZSBvciB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBoYXNFeHRyZW1pdHkoZWRnZSwgbm9kZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguaGFzRXh0cmVtaXR5OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXkgPT09IG5vZGUgfHwgZGF0YS50YXJnZXQua2V5ID09PSBub2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyB1bmRpcmVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgaXNVbmRpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc1VuZGlyZWN0ZWQ6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEudW5kaXJlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaXMgZGlyZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpc0RpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc0RpcmVjdGVkOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiAhZGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyBhIHNlbGYgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGlzU2VsZkxvb3AoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmlzU2VsZkxvb3A6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuc291cmNlID09PSBkYXRhLnRhcmdldDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBNdXRhdGlvblxuICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgdG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBleGlzdC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAgICovXG4gIGFkZE5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYWRkTm9kZSh0aGlzLCBub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiBub2RlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbWVyZ2UgYSBub2RlIGludG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqL1xuICBtZXJnZU5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGlmIChhdHRyaWJ1dGVzICYmICFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgubWVyZ2VOb2RlOiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhbiBvYmplY3QgYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICk7XG5cbiAgICAvLyBTdHJpbmcgY29lcmNpb25cbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMsIHdlIG1lcmdlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgYXNzaWduKGRhdGEuYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgICAgICBrZXk6IG5vZGUsXG4gICAgICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW25vZGUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBkYXRhID0gbmV3IHRoaXMuTm9kZURhdGFDbGFzcyhub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEFkZGluZyB0aGUgbm9kZSB0byBpbnRlcm5hbCByZWdpc3RlclxuICAgIHRoaXMuX25vZGVzLnNldChub2RlLCBkYXRhKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQWRkZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW25vZGUsIHRydWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGdyYXBoIG9yIGVsc2UgdG9cbiAgICogdXBkYXRlIGl0cyBhdHRyaWJ1dGVzIHVzaW5nIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgLSBUaGUgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IFt1cGRhdGVyXSAtIE9wdGlvbmFsIHVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgLSBUaGUgbm9kZS5cbiAgICovXG4gIHVwZGF0ZU5vZGUobm9kZSwgdXBkYXRlcikge1xuICAgIGlmICh1cGRhdGVyICYmIHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudXBkYXRlTm9kZTogaW52YWxpZCB1cGRhdGVyIGZ1bmN0aW9uLiBFeHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290IFwiJHt1cGRhdGVyfVwiYFxuICAgICAgKTtcblxuICAgIC8vIFN0cmluZyBjb2VyY2lvblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cywgd2UgdXBkYXRlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHVwZGF0ZXIpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IGRhdGEuYXR0cmlidXRlcztcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihvbGRBdHRyaWJ1dGVzKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICAgICAga2V5OiBub2RlLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbm9kZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB1cGRhdGVyID8gdXBkYXRlcih7fSkgOiB7fTtcblxuICAgIGRhdGEgPSBuZXcgdGhpcy5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gICAgdGhpcy5fbm9kZXMuc2V0KG5vZGUsIGRhdGEpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBZGRlZCcsIHtcbiAgICAgIGtleTogbm9kZSxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiBbbm9kZSwgdHJ1ZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBub2RlICYgYWxsIGl0cyBhdHRhY2hlZCBlZGdlcyBmcm9tIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICBub2RlIC0gVGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge0dyYXBofVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkcm9wTm9kZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kcm9wTm9kZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBSZW1vdmluZyBhdHRhY2hlZCBlZGdlc1xuICAgIC8vIFRPRE86IHdlIGNvdWxkIGRvIGZhc3RlclxuICAgIHRoaXMuZm9yRWFjaEVkZ2Uobm9kZSwgZWRnZSA9PiB7XG4gICAgICB0aGlzLmRyb3BFZGdlKGVkZ2UpO1xuICAgIH0pO1xuXG4gICAgLy8gRHJvcHBpbmcgdGhlIG5vZGUgZnJvbSB0aGUgcmVnaXN0ZXJcbiAgICB0aGlzLl9ub2Rlcy5kZWxldGUobm9kZSk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZURyb3BwZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzOiBub2RlRGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBBcml0eSAxOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVkZ2UgLSBUaGUgZWRnZS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICB0YXJnZXQgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGRyb3BFZGdlKGVkZ2UpIHtcbiAgICBsZXQgZWRnZURhdGE7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgYXJndW1lbnRzWzBdLFxuICAgICAgICB0YXJnZXQgPSAnJyArIGFyZ3VtZW50c1sxXTtcblxuICAgICAgZWRnZURhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHRoaXMudHlwZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiAtPiBcIiR7dGFyZ2V0fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgICAgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERyb3BwaW5nIHRoZSBlZGdlIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgdGhpcy5fZWRnZXMuZGVsZXRlKGVkZ2VEYXRhLmtleSk7XG5cbiAgICAvLyBVcGRhdGluZyByZWxhdGVkIGRlZ3JlZXNcbiAgICBjb25zdCB7c291cmNlOiBzb3VyY2VEYXRhLCB0YXJnZXQ6IHRhcmdldERhdGEsIGF0dHJpYnV0ZXN9ID0gZWRnZURhdGE7XG5cbiAgICBjb25zdCB1bmRpcmVjdGVkID0gZWRnZURhdGEudW5kaXJlY3RlZDtcblxuICAgIGlmIChzb3VyY2VEYXRhID09PSB0YXJnZXREYXRhKSB7XG4gICAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICAgIHNvdXJjZURhdGEudW5kaXJlY3RlZERlZ3JlZS0tO1xuICAgICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEub3V0RGVncmVlLS07XG4gICAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhcmluZyBpbmRleFxuICAgIGNsZWFyRWRnZUZyb21TdHJ1Y3R1cmVJbmRleCh0aGlzLCB1bmRpcmVjdGVkLCBlZGdlRGF0YSk7XG5cbiAgICBpZiAodW5kaXJlY3RlZCkgdGhpcy5fdW5kaXJlY3RlZFNpemUtLTtcbiAgICBlbHNlIHRoaXMuX2RpcmVjdGVkU2l6ZS0tO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VEcm9wcGVkJywge1xuICAgICAga2V5OiBlZGdlLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHNvdXJjZTogc291cmNlRGF0YS5rZXksXG4gICAgICB0YXJnZXQ6IHRhcmdldERhdGEua2V5LFxuICAgICAgdW5kaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gcmVtb3ZlIGV2ZXJ5IGVkZ2UgJiBldmVyeSBub2RlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyaW5nIG5vZGVzXG4gICAgdGhpcy5fbm9kZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHJlbW92ZSBldmVyeSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyRWRnZXMoKSB7XG4gICAgY2xlYXJTdHJ1Y3R1cmVJbmRleCh0aGlzKTtcblxuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZXNDbGVhcmVkJyk7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ3JhcGggaGFzIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0F0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldHRpbmcgYSB2YWx1ZSBmb3IgdGhlIGRlc2lyZWQgZ3JhcGgncyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFZhbHVlIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdhdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2luZyBhIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZGVzaXJlZCBncmFwaCdzIGF0dHJpYnV0ZSdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IHVwZGF0ZXIgLSBGdW5jdGlvbiB1c2UgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqL1xuICB1cGRhdGVBdHRyaWJ1dGUobmFtZSwgdXBkYXRlcikge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUF0dHJpYnV0ZTogdXBkYXRlciBzaG91bGQgYmUgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlc1tuYW1lXSA9IHVwZGF0ZXIodmFsdWUpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2F0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlbW92aW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmVwbGFjaW5nIHRoZSBncmFwaCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIE5ldyBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICByZXBsYWNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgucmVwbGFjZUF0dHJpYnV0ZXM6IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgbWVyZ2luZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBtZXJnZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1lcmdlQXR0cmlidXRlczogcHJvdmlkZWQgYXR0cmlidXRlcyBhcmUgbm90IGEgcGxhaW4gb2JqZWN0LidcbiAgICAgICk7XG5cbiAgICBhc3NpZ24odGhpcy5fYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIEZ1bmN0aW9uIHVzZWQgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiB1cGRhdGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgKi9cbiAgdXBkYXRlQXR0cmlidXRlcyh1cGRhdGVyKSB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlQXR0cmlidXRlczogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHVwZGF0ZXIodGhpcy5fYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHVwZGF0ZSBlYWNoIG5vZGUncyBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gIHVwZGF0ZXIgLSBVcGRhdGVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9ICAgIFtoaW50c10gLSBPcHRpb25hbCBoaW50cy5cbiAgICovXG4gIHVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlcyh1cGRhdGVyLCBoaW50cykge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlczogZXhwZWN0aW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24uJ1xuICAgICAgKTtcblxuICAgIGlmIChoaW50cyAmJiAhdmFsaWRhdGVIaW50cyhoaW50cykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoTm9kZUF0dHJpYnV0ZXM6IGludmFsaWQgaGludHMuIEV4cGVjdGluZyBhbiBvYmplY3QgaGF2aW5nIHRoZSBmb2xsb3dpbmcgc2hhcGU6IHthdHRyaWJ1dGVzPzogW3N0cmluZ119J1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgbm9kZURhdGEuYXR0cmlidXRlcyA9IHVwZGF0ZXIobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2VhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBoaW50czogaGludHMgPyBoaW50cyA6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCB0byB1cGRhdGUgZWFjaCBlZGdlJ3MgYXR0cmlidXRlcyB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259ICB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbiB0byB1c2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgICBbaGludHNdIC0gT3B0aW9uYWwgaGludHMuXG4gICAqL1xuICB1cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXModXBkYXRlciwgaGludHMpIHtcbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXM6IGV4cGVjdGluZyBhbiB1cGRhdGVyIGZ1bmN0aW9uLidcbiAgICAgICk7XG5cbiAgICBpZiAoaGludHMgJiYgIXZhbGlkYXRlSGludHMoaGludHMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlRWFjaEVkZ2VBdHRyaWJ1dGVzOiBpbnZhbGlkIGhpbnRzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGhhdmluZyB0aGUgZm9sbG93aW5nIHNoYXBlOiB7YXR0cmlidXRlcz86IFtzdHJpbmddfSdcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX2VkZ2VzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2VEYXRhLCB0YXJnZXREYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnZWFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGhpbnRzOiBoaW50cyA/IGhpbnRzIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEl0ZXJhdGlvbi1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQWRqYWNlbmN5RW50cnk6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMubXVsdGkpIGZvckVhY2hBZGphY2VuY3lNdWx0aShmYWxzZSwgZmFsc2UsIHRydWUsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIGFzc3ltZXRyaWMgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaEFzc3ltZXRyaWNBZGphY2VuY3lFbnRyeTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmICh0aGlzLm11bHRpKSBmb3JFYWNoQWRqYWNlbmN5TXVsdGkoZmFsc2UsIHRydWUsIGZhbHNlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnlXaXRoT3JwaGFucyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQXNzeW1ldHJpY0FkamFjZW5jeUVudHJ5V2l0aE9ycGhhbnM6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgbGlzdCBvZiB0aGUgZ3JhcGgncyBub2Rlcy5cbiAgICpcbiAgICogQHJldHVybiB7YXJyYXl9IC0gVGhlIG5vZGVzLlxuICAgKi9cbiAgbm9kZXMoKSB7XG4gICAgaWYgKHR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub2Rlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UodGhpcy5fbm9kZXMua2V5cygpLCB0aGlzLl9ub2Rlcy5zaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3Mgbm9kZXMgdXNpbmcgdGhlIGdpdmVuIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcywgaW5kZXgpLlxuICAgKi9cbiAgZm9yRWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIG5vZGVEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpdGVyYXRpbmcgYXR0ZW1wdGluZyB0byBmaW5kIGEgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaW5kTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maW5kTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIG5vZGVEYXRhLmtleTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIG1hcHBpbmcgbm9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBDYWxsYmFjayAoa2V5LCBhdHRyaWJ1dGVzKS5cbiAgICovXG4gIG1hcE5vZGVzKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1hcE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMub3JkZXIpO1xuICAgIGxldCBpID0gMDtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG4gICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgc29tZSBub2RlIHZlcmlmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBzb21lTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5zb21lTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciBhbGwgbm9kZSB2ZXJpZnkgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIChrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgZXZlcnlOb2RlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmV2ZXJ5Tm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgZmlsdGVyaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaWx0ZXJOb2RlcyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maWx0ZXJOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIGlmIChjYWxsYmFjayhub2RlRGF0YS5rZXksIG5vZGVEYXRhLmF0dHJpYnV0ZXMpKVxuICAgICAgICByZXN1bHQucHVzaChub2RlRGF0YS5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlZHVjaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGFjY3VtdWxhdG9yLCBrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgcmVkdWNlTm9kZXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5yZWR1Y2VOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMilcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnJlZHVjZU5vZGVzOiBtaXNzaW5nIGluaXRpYWwgdmFsdWUuIFlvdSBtdXN0IHByb3ZpZGUgaXQgYmVjYXVzZSB0aGUgY2FsbGJhY2sgdGFrZXMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBhbmQgd2UgY2Fubm90IGluZmVyIHRoZSBpbml0aWFsIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgYXMgeW91IGNvdWxkIHdpdGggYSBzaW1wbGUgYXJyYXkuJ1xuICAgICAgKTtcblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIG5vZGUgZW50cmllcy5cbiAgICpcbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqL1xuICBub2RlRW50cmllcygpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcigoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICBpZiAoc3RlcC5kb25lKSByZXR1cm4gc3RlcDtcblxuICAgICAgY29uc3QgZGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7bm9kZTogZGF0YS5rZXksIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc30sXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIFNlcmlhbGl6YXRpb25cbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgZXhwb3J0aW5nIHRoZSB0YXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7YXJyYXl9ICAgICAgLSBUaGUgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIGV4cG9ydE5vZGUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmV4cG9ydE5vZGU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZU5vZGUobm9kZSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGV4cG9ydGluZyB0aGUgdGFyZ2V0IGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGFyZ2V0IGVkZ2UuXG4gICAqIEByZXR1cm4ge2FycmF5fSAgICAgIC0gVGhlIHNlcmlhbGl6ZWQgZWRnZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpcyBub3QgZm91bmQuXG4gICAqL1xuICBleHBvcnRFZGdlKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5leHBvcnRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVFZGdlKGVkZ2UsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGV4cG9ydCB0aGUgd2hvbGUgZ3JhcGguXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICovXG4gIGV4cG9ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheSh0aGlzLl9ub2Rlcy5zaXplKTtcblxuICAgIGxldCBpID0gMDtcblxuICAgIHRoaXMuX25vZGVzLmZvckVhY2goKGRhdGEsIGtleSkgPT4ge1xuICAgICAgbm9kZXNbaSsrXSA9IHNlcmlhbGl6ZU5vZGUoa2V5LCBkYXRhKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVkZ2VzID0gbmV3IEFycmF5KHRoaXMuX2VkZ2VzLnNpemUpO1xuXG4gICAgaSA9IDA7XG5cbiAgICB0aGlzLl9lZGdlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIGVkZ2VzW2krK10gPSBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5nZXRBdHRyaWJ1dGVzKCksXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIG11bHRpOiB0aGlzLm11bHRpLFxuICAgICAgICBhbGxvd1NlbGZMb29wczogdGhpcy5hbGxvd1NlbGZMb29wc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gbm9kZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnROb2RlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWROb2RlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnROb2RlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgbm9kZS4gQSBzZXJpYWxpemVkIG5vZGUgc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcImtleVwiIHByb3BlcnR5LidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ25vLWtleScpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogbm8ga2V5IHByb3ZpZGVkLidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ2ludmFsaWQtYXR0cmlidXRlcycpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCwgbnVsbCBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIG5vZGVcbiAgICBjb25zdCB7a2V5LCBhdHRyaWJ1dGVzID0ge319ID0gZGF0YTtcblxuICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZU5vZGUoa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICBlbHNlIHRoaXMuYWRkTm9kZShrZXksIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBlZGdlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICBkYXRhICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gZWRnZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnRFZGdlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWRFZGdlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgZWRnZS4gQSBzZXJpYWxpemVkIGVkZ2Ugc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcInNvdXJjZVwiICYgXCJ0YXJnZXRcIiBwcm9wZXJ0eS4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICduby1zb3VyY2UnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IG1pc3Npbmcgc291Y2UuJ1xuICAgICAgICApO1xuICAgICAgaWYgKGVycm9yID09PSAnbm8tdGFyZ2V0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBtaXNzaW5nIHRhcmdldC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLWF0dHJpYnV0ZXMnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgYXR0cmlidXRlcy4gQXR0cmlidXRlcyBzaG91bGQgYmUgYSBwbGFpbiBvYmplY3QsIG51bGwgb3Igb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLXVuZGlyZWN0ZWQnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgdW5kaXJlY3RlZC4gVW5kaXJlY3RlZCBzaG91bGQgYmUgYm9vbGVhbiBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIGVkZ2VcbiAgICBjb25zdCB7c291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMgPSB7fSwgdW5kaXJlY3RlZCA9IGZhbHNlfSA9IGRhdGE7XG5cbiAgICBsZXQgbWV0aG9kO1xuXG4gICAgaWYgKCdrZXknIGluIGRhdGEpIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlV2l0aEtleVxuICAgICAgICAgIDogdGhpcy5tZXJnZURpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB1bmRpcmVjdGVkXG4gICAgICAgID8gdGhpcy5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZVdpdGhLZXk7XG5cbiAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGRhdGEua2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlXG4gICAgICAgICAgOiB0aGlzLm1lcmdlRGlyZWN0ZWRFZGdlXG4gICAgICAgIDogdW5kaXJlY3RlZFxuICAgICAgICA/IHRoaXMuYWRkVW5kaXJlY3RlZEVkZ2VcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZTtcblxuICAgICAgbWV0aG9kLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGltcG9ydCBhIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdHxHcmFwaH0gZGF0YSAgLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICBtZXJnZSAtIFdoZXRoZXIgdG8gbWVyZ2UgZGF0YS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICovXG4gIGltcG9ydChkYXRhLCBtZXJnZSA9IGZhbHNlKSB7XG4gICAgLy8gSW1wb3J0aW5nIGEgR3JhcGggaW5zdGFuY2VcbiAgICBpZiAoaXNHcmFwaChkYXRhKSkge1xuICAgICAgdGhpcy5pbXBvcnQoZGF0YS5leHBvcnQoKSwgbWVyZ2UpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSW1wb3J0aW5nIGEgc2VyaWFsaXplZCBncmFwaFxuICAgIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmltcG9ydDogaW52YWxpZCBhcmd1bWVudC4gRXhwZWN0aW5nIGEgc2VyaWFsaXplZCBncmFwaCBvciwgYWx0ZXJuYXRpdmVseSwgYSBHcmFwaCBpbnN0YW5jZS4nXG4gICAgICApO1xuXG4gICAgaWYgKGRhdGEuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEuYXR0cmlidXRlcykpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhIHBsYWluIG9iamVjdC4nXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKTtcbiAgICAgIGVsc2UgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIGxldCBpLCBsLCBsaXN0O1xuXG4gICAgaWYgKGRhdGEubm9kZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLm5vZGVzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIG5vZGVzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0Tm9kZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZWRnZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLmVkZ2VzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGVkZ2VzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0RWRnZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogVXRpbHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIGEgbnVsbCBjb3B5IG9mIHRoZSBncmFwaCwgaS5lLiBhIGdyYXBoIHdpdGhvdXQgbm9kZXNcbiAgICogJiBlZGdlcyBidXQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHRvIG1lcmdlIHdpdGggdGhlIGN1cnJlbnQgb25lcy5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgIC0gVGhlIG51bGwgY29weS5cbiAgICovXG4gIG51bGxDb3B5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaChhc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpKTtcbiAgICBncmFwaC5yZXBsYWNlQXR0cmlidXRlcyhhc3NpZ24oe30sIHRoaXMuZ2V0QXR0cmlidXRlcygpKSk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgYW4gZW1wdHkgY29weSBvZiB0aGUgZ3JhcGgsIGkuZS4gYSBncmFwaCB3aXRob3V0IGVkZ2VzIGJ1dFxuICAgKiB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCB0aGUgY3VycmVudCBvbmVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBUaGUgZW1wdHkgY29weS5cbiAgICovXG4gIGVtcHR5Q29weShvcHRpb25zKSB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzLm51bGxDb3B5KG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fbm9kZXMuZm9yRWFjaCgobm9kZURhdGEsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG5cbiAgICAgIC8vIE5PVEU6IG5vIG5lZWQgdG8gZW1pdCBldmVudHMgc2luY2UgdXNlciBjYW5ub3QgYWNjZXNzIHRoZSBpbnN0YW5jZSB5ZXRcbiAgICAgIG5vZGVEYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Moa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIGdyYXBoLl9ub2Rlcy5zZXQoa2V5LCBub2RlRGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBleGFjdCBjb3B5IG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICBjb3B5KCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5lbXB0eUNvcHkoKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fZWRnZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICAvLyBOT1RFOiBubyBuZWVkIHRvIGVtaXQgZXZlbnRzIHNpbmNlIHVzZXIgY2Fubm90IGFjY2VzcyB0aGUgaW5zdGFuY2UgeWV0XG4gICAgICBhZGRFZGdlKFxuICAgICAgICBncmFwaCxcbiAgICAgICAgJ2NvcHknLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZWRnZURhdGEudW5kaXJlY3RlZCxcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgICBhc3NpZ24oe30sIGVkZ2VEYXRhLmF0dHJpYnV0ZXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBncmFwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXBncmFkaW5nIHRoZSBncmFwaCB0byBhIG1peGVkIG9uZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICB1cGdyYWRlVG9NaXhlZCgpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnbWl4ZWQnKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFVwZ3JhZGluZyBub2RlIGRhdGE6XG4gICAgLy8gTk9URTogbWF5YmUgdGhpcyBjb3VsZCBsZWFkIHRvIHNvbWUgZGUtb3B0aW1pemF0aW9uIGJ5IHVzdWFsXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmVzIGJ1dCBJIGNhbm5vdCBiZSBzdXJlIG9mIGl0LiBBbm90aGVyIHNvbHV0aW9uXG4gICAgLy8gd291bGQgYmUgdG8gcmVpbnN0YW50aWF0ZSB0aGUgY2xhc3NlcyBidXQgdGhpcyBzdXJlbHkgaGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBhbmQgbWVtb3J5IGltcGFjdC5cbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKGRhdGEgPT4gZGF0YS51cGdyYWRlVG9NaXhlZCgpKTtcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy50eXBlID0gJ21peGVkJztcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICd0eXBlJywgdGhpcy5fb3B0aW9ucy50eXBlKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBNaXhlZE5vZGVEYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGdyYWRpbmcgdGhlIGdyYXBoIHRvIGEgbXVsdGkgb25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gLSBUaGUgY29weS5cbiAgICovXG4gIHVwZ3JhZGVUb011bHRpKCkge1xuICAgIGlmICh0aGlzLm11bHRpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy5tdWx0aSA9IHRydWU7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnbXVsdGknLCB0cnVlKTtcblxuICAgIC8vIFVwZ3JhZGluZyBpbmRpY2VzXG4gICAgdXBncmFkZVN0cnVjdHVyZUluZGV4VG9NdWx0aSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEtub3duIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCBieSBKYXZhU2NyaXB0IHRvIHBlcmZvcm0gSlNPTiBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IC0gVGhlIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBbb2JqZWN0IEdyYXBoXS5cbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBHcmFwaF0nO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgbm9kZSdzIGNvbnNvbGUgdG8gZGlzcGxheSBhIGN1c3RvbSBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBGb3JtYXR0ZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaC5cbiAgICovXG4gIGluc3BlY3QoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB7fTtcbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIG5vZGVzW2tleV0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlZGdlcyA9IHt9LFxuICAgICAgbXVsdGlJbmRleCA9IHt9O1xuXG4gICAgdGhpcy5fZWRnZXMuZm9yRWFjaCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBkYXRhLnVuZGlyZWN0ZWQgPyAnLS0nIDogJy0+JztcblxuICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgIGxldCBzb3VyY2UgPSBkYXRhLnNvdXJjZS5rZXk7XG4gICAgICBsZXQgdGFyZ2V0ID0gZGF0YS50YXJnZXQua2V5O1xuICAgICAgbGV0IHRtcDtcblxuICAgICAgaWYgKGRhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2UgPiB0YXJnZXQpIHtcbiAgICAgICAgdG1wID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSB0YXJnZXQ7XG4gICAgICAgIHRhcmdldCA9IHRtcDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzYyA9IGAoJHtzb3VyY2V9KSR7ZGlyZWN0aW9ufSgke3RhcmdldH0pYDtcblxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnZ2VpZF8nKSkge1xuICAgICAgICBsYWJlbCArPSBgWyR7a2V5fV06IGA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdWx0aUluZGV4W2Rlc2NdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10rKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsICs9IGAke211bHRpSW5kZXhbZGVzY119LiBgO1xuICAgICAgfVxuXG4gICAgICBsYWJlbCArPSBkZXNjO1xuXG4gICAgICBlZGdlc1tsYWJlbF0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkdW1teSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShrKSAmJlxuICAgICAgICAhRU1JVFRFUl9QUk9QUy5oYXMoaykgJiZcbiAgICAgICAgdHlwZW9mIHRoaXNba10gIT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGsgIT09ICdzeW1ib2wnXG4gICAgICApXG4gICAgICAgIGR1bW15W2tdID0gdGhpc1trXTtcbiAgICB9XG5cbiAgICBkdW1teS5hdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlcztcbiAgICBkdW1teS5ub2RlcyA9IG5vZGVzO1xuICAgIGR1bW15LmVkZ2VzID0gZWRnZXM7XG5cbiAgICBwcml2YXRlUHJvcGVydHkoZHVtbXksICdjb25zdHJ1Y3RvcicsIHRoaXMuY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIGR1bW15O1xuICB9XG59XG5cbi8qKlxuICogQXR0YWNoaW5nIG1ldGhvZHMgdG8gdGhlIHByb3RvdHlwZS5cbiAqXG4gKiBIZXJlLCB3ZSBhcmUgYXR0YWNoaW5nIGEgd2lkZSB2YXJpZXR5IG9mIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzJ1xuICogcHJvdG90eXBlIHdoZW4gdGhvc2UgYXJlIHZlcnkgbnVtZXJvdXMgYW5kIHdoZW4gdGhlaXIgY3JlYXRpb24gaXNcbiAqIGFic3RyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBBdHRhY2hpbmcgY3VzdG9tIGluc3BlY3QgbWV0aG9kIGZvciBub2RlID49IDEwLlxuICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEdyYXBoLnByb3RvdHlwZVtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9XG4gICAgR3JhcGgucHJvdG90eXBlLmluc3BlY3Q7XG5cbi8qKlxuICogUmVsYXRlZCB0byBlZGdlIGFkZGl0aW9uLlxuICovXG5FREdFX0FERF9NRVRIT0RTLmZvckVhY2gobWV0aG9kID0+IHtcbiAgWydhZGQnLCAnbWVyZ2UnLCAndXBkYXRlJ10uZm9yRWFjaCh2ZXJiID0+IHtcbiAgICBjb25zdCBuYW1lID0gbWV0aG9kLm5hbWUodmVyYik7XG4gICAgY29uc3QgZm4gPSB2ZXJiID09PSAnYWRkJyA/IGFkZEVkZ2UgOiBtZXJnZUVkZ2U7XG5cbiAgICBpZiAobWV0aG9kLmdlbmVyYXRlS2V5KSB7XG4gICAgICBHcmFwaC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIEdyYXBoLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChlZGdlLCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vKipcbiAqIEF0dHJpYnV0ZXMtcmVsYXRlZC5cbiAqL1xuYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKTtcbmF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWV0aG9kcyhHcmFwaCk7XG5cbi8qKlxuICogRWRnZSBpdGVyYXRpb24tcmVsYXRlZC5cbiAqL1xuYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuXG4vKipcbiAqIE5laWdoYm9yIGl0ZXJhdGlvbi1yZWxhdGVkLlxuICovXG5hdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBIZWxwZXIgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBCdWlsZGluZyBzb21lIGhpZ2hlci1vcmRlciBjbGFzc2VzIGluc3RhbnRpYXRpbmcgdGhlIGdyYXBoIHdpdGhcbiAqIHByZWRlZmluaXRlIG9wdGlvbnMuXG4gKi9cbmltcG9ydCB7YXNzaWdufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBHcmFwaCBmcm9tICcuL2dyYXBoJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvcnMuXG4gKi9cbmNsYXNzIERpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICdkaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgbXVsdGkgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgaWYgKGZpbmFsT3B0aW9ucy50eXBlICE9PSAnZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgVW5kaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAndW5kaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnVW5kaXJlY3RlZEdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBtdWx0aSBpbiBnaXZlbiBvcHRpb25zISdcbiAgICAgICk7XG5cbiAgICBpZiAoZmluYWxPcHRpb25zLnR5cGUgIT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ1VuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlHcmFwaCBleHRlbmRzIEdyYXBoIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGZpbmFsT3B0aW9ucyA9IGFzc2lnbih7bXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aUdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBzaW1wbGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlEaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAnZGlyZWN0ZWQnLCBtdWx0aTogdHJ1ZX0sIG9wdGlvbnMpO1xuXG4gICAgaWYgKCdtdWx0aScgaW4gZmluYWxPcHRpb25zICYmIGZpbmFsT3B0aW9ucy5tdWx0aSAhPT0gdHJ1ZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ2RpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlVbmRpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICd1bmRpcmVjdGVkJywgbXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aVVuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnTXVsdGlVbmRpcmVjdGVkR3JhcGguZnJvbTogaW5jb25zaXN0ZW50IFwiJyArXG4gICAgICAgICAgZmluYWxPcHRpb25zLnR5cGUgK1xuICAgICAgICAgICdcIiB0eXBlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIHN1cGVyKGZpbmFsT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2hpbmcgc3RhdGljICMuZnJvbSBtZXRob2QgdG8gZWFjaCBvZiB0aGUgY29uc3RydWN0b3JzLlxuICovXG5mdW5jdGlvbiBhdHRhY2hTdGF0aWNGcm9tTWV0aG9kKENsYXNzKSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBncmFwaCBmcm9tIHNlcmlhbGl6ZWQgZGF0YSBvciBhbm90aGVyIGdyYXBoJ3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtICB7R3JhcGh8U2VyaWFsaXplZEdyYXBofSBkYXRhICAgICAgLSBIeWRyYXRhdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICAgICAgICAgICAgICAgIFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NsYXNzfVxuICAgKi9cbiAgQ2xhc3MuZnJvbSA9IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7XG4gICAgLy8gTWVyZ2luZyBnaXZlbiBvcHRpb25zIHdpdGggc2VyaWFsaXplZCBvbmVzXG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt9LCBkYXRhLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xhc3MoZmluYWxPcHRpb25zKTtcbiAgICBpbnN0YW5jZS5pbXBvcnQoZGF0YSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5cbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoR3JhcGgpO1xuYXR0YWNoU3RhdGljRnJvbU1ldGhvZChEaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoVW5kaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoTXVsdGlHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpRGlyZWN0ZWRHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpVW5kaXJlY3RlZEdyYXBoKTtcblxuR3JhcGguR3JhcGggPSBHcmFwaDtcbkdyYXBoLkRpcmVjdGVkR3JhcGggPSBEaXJlY3RlZEdyYXBoO1xuR3JhcGguVW5kaXJlY3RlZEdyYXBoID0gVW5kaXJlY3RlZEdyYXBoO1xuR3JhcGguTXVsdGlHcmFwaCA9IE11bHRpR3JhcGg7XG5HcmFwaC5NdWx0aURpcmVjdGVkR3JhcGggPSBNdWx0aURpcmVjdGVkR3JhcGg7XG5HcmFwaC5NdWx0aVVuZGlyZWN0ZWRHcmFwaCA9IE11bHRpVW5kaXJlY3RlZEdyYXBoO1xuXG5HcmFwaC5JbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciA9IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yO1xuR3JhcGguTm90Rm91bmRHcmFwaEVycm9yID0gTm90Rm91bmRHcmFwaEVycm9yO1xuR3JhcGguVXNhZ2VHcmFwaEVycm9yID0gVXNhZ2VHcmFwaEVycm9yO1xuXG5leHBvcnQge1xuICBHcmFwaCxcbiAgRGlyZWN0ZWRHcmFwaCxcbiAgVW5kaXJlY3RlZEdyYXBoLFxuICBNdWx0aUdyYXBoLFxuICBNdWx0aURpcmVjdGVkR3JhcGgsXG4gIE11bHRpVW5kaXJlY3RlZEdyYXBoXG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBpc0dyYXBoXG4gKiA9PT09PT09PT09PT09PT09PT09XG4gKlxuICogVmVyeSBzaW1wbGUgZnVuY3Rpb24gYWltaW5nIGF0IGVuc3VyaW5nIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhXG4gKiBncmFwaG9sb2d5IGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQ2hlY2tpbmcgdGhlIHZhbHVlIGlzIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUubXVsdGkgPT09ICdib29sZWFuJ1xuICApO1xufTtcbiIsICJleHBvcnRzLkFSUkFZX0JVRkZFUl9TVVBQT1JUID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydHMuU1lNQk9MX1NVUFBPUlQgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEZvckVhY2ggRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZWFzaWx5IGl0ZXJhdGUgb3ZlciBtaXhlZCB2YWx1ZXMuXG4gKi9cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG4vKipcbiAqIEZ1bmN0aW9uIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFsbW9zdCBhbnkgaXRlcmFibGUgSlMgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICAgIGl0ZXJhYmxlIC0gSXRlcmFibGUgdmFsdWUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGl0ZXJhYmxlLCBjYWxsYmFjaykge1xuICB2YXIgaXRlcmF0b3IsIGssIGksIGwsIHM7XG5cbiAgaWYgKCFpdGVyYWJsZSkgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBpbnZhbGlkIGl0ZXJhYmxlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nKTtcblxuICAvLyBUaGUgdGFyZ2V0IGlzIGFuIGFycmF5IG9yIGEgc3RyaW5nIG9yIGZ1bmN0aW9uIGFyZ3VtZW50c1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShpdGVyYWJsZSkgfHxcbiAgICAoQVJSQVlfQlVGRkVSX1NVUFBPUlQgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGl0ZXJhYmxlKSkgfHxcbiAgICB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXRlcmFibGUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSdcbiAgKSB7XG4gICAgZm9yIChpID0gMCwgbCA9IGl0ZXJhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgY2FsbGJhY2soaXRlcmFibGVbaV0sIGkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaGFzIGEgIy5mb3JFYWNoIG1ldGhvZFxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYWJsZS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGlzIGl0ZXJhYmxlXG4gIGlmIChcbiAgICBTWU1CT0xfU1VQUE9SVCAmJlxuICAgIFN5bWJvbC5pdGVyYXRvciBpbiBpdGVyYWJsZSAmJlxuICAgIHR5cGVvZiBpdGVyYWJsZS5uZXh0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGl0ZXJhYmxlID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBpcyBhbiBpdGVyYXRvclxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKCgocyA9IGl0ZXJhdG9yLm5leHQoKSksIHMuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGNhbGxiYWNrKHMudmFsdWUsIGkpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgZm9yIChrIGluIGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICBjYWxsYmFjayhpdGVyYWJsZVtrXSwgayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBUeXBlZCBBcnJheSBIZWxwZXJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIGhlbHBlcnMgcmVsYXRlZCB0byB0eXBlZCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGFuIHVuc2lnbmVkIGludGVnZXIgYXJyYXkgdG8gc3RvcmUgcG9pbnRlcnMsIG9uZSBtaWdodCB3YW50IHRvXG4gKiBjaG9vc2UgdGhlIG9wdGltYWwgd29yZCBzaXplIGluIHJlZ2FyZHMgdG8gdGhlIGFjdHVhbCBudW1iZXJzIG9mIHBvaW50ZXJzXG4gKiB0byBzdG9yZS5cbiAqXG4gKiBUaGlzIGhlbHBlcnMgZG9lcyBqdXN0IHRoYXQuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBzaXplIC0gRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkgdG8gbWFwLlxuICogQHJldHVybiB7VHlwZWRBcnJheX1cbiAqL1xudmFyIE1BWF84QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA4KSAtIDEsXG4gICAgTUFYXzE2QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCAxNikgLSAxLFxuICAgIE1BWF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzIpIC0gMTtcblxudmFyIE1BWF9TSUdORURfOEJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgNykgLSAxLFxuICAgIE1BWF9TSUdORURfMTZCSVRfSU5URUdFUiA9IE1hdGgucG93KDIsIDE1KSAtIDEsXG4gICAgTUFYX1NJR05FRF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcblxuZXhwb3J0cy5nZXRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfOEJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfMTZCSVRfSU5URUdFUilcbiAgICByZXR1cm4gVWludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF8zMkJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50MzJBcnJheTtcblxuICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdDogUG9pbnRlciBBcnJheSBvZiBzaXplID4gNDI5NDk2NzI5NSBpcyBub3Qgc3VwcG9ydGVkLicpO1xufTtcblxuZXhwb3J0cy5nZXRTaWduZWRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzhCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzE2QklUX0lOVEVHRVIpXG4gICAgcmV0dXJuIEludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF9TSUdORURfMzJCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50MzJBcnJheTtcblxuICByZXR1cm4gRmxvYXQ2NEFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1pbmltYWwgdHlwZSBhYmxlIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG5leHBvcnRzLmdldE51bWJlclR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXG4gIC8vIDw9IDMyIGJpdHMgaXRudGVnZXI/XG4gIGlmICh2YWx1ZSA9PT0gKHZhbHVlIHwgMCkpIHtcblxuICAgIC8vIE5lZ2F0aXZlXG4gICAgaWYgKE1hdGguc2lnbih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBpZiAodmFsdWUgPD0gMTI3ICYmIHZhbHVlID49IC0xMjgpXG4gICAgICAgIHJldHVybiBJbnQ4QXJyYXk7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAzMjc2NyAmJiB2YWx1ZSA+PSAtMzI3NjgpXG4gICAgICAgIHJldHVybiBJbnQxNkFycmF5O1xuXG4gICAgICByZXR1cm4gSW50MzJBcnJheTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAyNTUpXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gICAgICBpZiAodmFsdWUgPD0gNjU1MzUpXG4gICAgICAgIHJldHVybiBVaW50MTZBcnJheTtcblxuICAgICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICAgIH1cbiAgfVxuXG4gIC8vIDUzIGJpdHMgaW50ZWdlciAmIGZsb2F0c1xuICAvLyBOT1RFOiBpdCdzIGtpbmRhIGhhcmQgdG8gdGVsbCB3aGV0aGVyIHdlIGNvdWxkIHVzZSAzMmJpdHMgb3Igbm90Li4uXG4gIHJldHVybiBGbG9hdDY0QXJyYXk7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWluaW1hbCB0eXBlIGFibGUgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcnJheVxuICogb2YgSmF2YVNjcmlwdCBudW1iZXJzLlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgICBhcnJheSAgLSBBcnJheSB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gZ2V0dGVyIC0gT3B0aW9uYWwgZ2V0dGVyLlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG52YXIgVFlQRV9QUklPUklUWSA9IHtcbiAgVWludDhBcnJheTogMSxcbiAgSW50OEFycmF5OiAyLFxuICBVaW50MTZBcnJheTogMyxcbiAgSW50MTZBcnJheTogNCxcbiAgVWludDMyQXJyYXk6IDUsXG4gIEludDMyQXJyYXk6IDYsXG4gIEZsb2F0MzJBcnJheTogNyxcbiAgRmxvYXQ2NEFycmF5OiA4XG59O1xuXG4vLyBUT0RPOiBtYWtlIHRoaXMgYSBvbmUtc2hvdCBmb3Igb25lIHZhbHVlXG5leHBvcnRzLmdldE1pbmltYWxSZXByZXNlbnRhdGlvbiA9IGZ1bmN0aW9uKGFycmF5LCBnZXR0ZXIpIHtcbiAgdmFyIG1heFR5cGUgPSBudWxsLFxuICAgICAgbWF4UHJpb3JpdHkgPSAwLFxuICAgICAgcCxcbiAgICAgIHQsXG4gICAgICB2LFxuICAgICAgaSxcbiAgICAgIGw7XG5cbiAgZm9yIChpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHYgPSBnZXR0ZXIgPyBnZXR0ZXIoYXJyYXlbaV0pIDogYXJyYXlbaV07XG4gICAgdCA9IGV4cG9ydHMuZ2V0TnVtYmVyVHlwZSh2KTtcbiAgICBwID0gVFlQRV9QUklPUklUWVt0Lm5hbWVdO1xuXG4gICAgaWYgKHAgPiBtYXhQcmlvcml0eSkge1xuICAgICAgbWF4UHJpb3JpdHkgPSBwO1xuICAgICAgbWF4VHlwZSA9IHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heFR5cGU7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0cy5pc1R5cGVkQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbmNhdCBieXRlIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0gIHsuLi5CeXRlQXJyYXl9XG4gKiBAcmV0dXJuIHtCeXRlQXJyYXl9XG4gKi9cbmV4cG9ydHMuY29uY2F0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsZW5ndGggPSAwLFxuICAgICAgaSxcbiAgICAgIG8sXG4gICAgICBsO1xuXG4gIGZvciAoaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgIGxlbmd0aCArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuXG4gIHZhciBhcnJheSA9IG5ldyAoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yKShsZW5ndGgpO1xuXG4gIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJyYXkuc2V0KGFyZ3VtZW50c1tpXSwgbyk7XG4gICAgbyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgYSBieXRlIGFycmF5IG9mIGluZGljZXMuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSAgICBsZW5ndGggLSBMZW5ndGggb2YgdGFyZ2V0LlxuICogQHJldHVybiB7Qnl0ZUFycmF5fVxuICovXG5leHBvcnRzLmluZGljZXMgPSBmdW5jdGlvbihsZW5ndGgpIHtcbiAgdmFyIFBvaW50ZXJBcnJheSA9IGV4cG9ydHMuZ2V0UG9pbnRlckFycmF5KGxlbmd0aCk7XG5cbiAgdmFyIGFycmF5ID0gbmV3IFBvaW50ZXJBcnJheShsZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgYXJyYXlbaV0gPSBpO1xuXG4gIHJldHVybiBhcnJheTtcbn07XG4iLCAiLyoqXG4gKiBNbmVtb25pc3QgSXRlcmFibGUgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBIYXJtb25pemVkIGl0ZXJhdGlvbiBoZWxwZXJzIG92ZXIgbWl4ZWQgaXRlcmFibGUgdGFyZ2V0cy5cbiAqL1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdvYmxpdGVyYXRvci9mb3JlYWNoJyk7XG5cbnZhciB0eXBlZCA9IHJlcXVpcmUoJy4vdHlwZWQtYXJyYXlzLmpzJyk7XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IHN1cHBvcnRzIGFycmF5LWxpa2VcbiAqIHJhbmRvbSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodGFyZ2V0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgfHwgdHlwZWQuaXNUeXBlZEFycmF5KHRhcmdldCk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBndWVzcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmUgb3ZlciB3aGljaCB3ZSBhcmUgZ29pbmdcbiAqIHRvIGl0ZXJhdGUuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ3Vlc3NMZW5ndGgodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdGFyZ2V0Lmxlbmd0aCA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5sZW5ndGg7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQuc2l6ZSA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5zaXplO1xuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQgYW4gaXRlcmFibGUgdG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgdmFyIGwgPSBndWVzc0xlbmd0aCh0YXJnZXQpO1xuXG4gIHZhciBhcnJheSA9IHR5cGVvZiBsID09PSAnbnVtYmVyJyA/IG5ldyBBcnJheShsKSA6IFtdO1xuXG4gIHZhciBpID0gMDtcblxuICAvLyBUT0RPOiB3ZSBjb3VsZCBvcHRpbWl6ZSB3aGVuIGdpdmVuIHRhcmdldCBpcyBhcnJheSBsaWtlXG4gIGZvckVhY2godGFyZ2V0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGFycmF5W2krK10gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYWJvdmUgYnV0IHJldHVybnMgYSBzdXBwbGVtZW50YXJ5IGluZGljZXMgYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheVdpdGhJbmRpY2VzKHRhcmdldCkge1xuICB2YXIgbCA9IGd1ZXNzTGVuZ3RoKHRhcmdldCk7XG5cbiAgdmFyIEluZGV4QXJyYXkgPSB0eXBlb2YgbCA9PT0gJ251bWJlcicgP1xuICAgIHR5cGVkLmdldFBvaW50ZXJBcnJheShsKSA6XG4gICAgQXJyYXk7XG5cbiAgdmFyIGFycmF5ID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEFycmF5KGwpIDogW107XG4gIHZhciBpbmRpY2VzID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEluZGV4QXJyYXkobCkgOiBbXTtcblxuICB2YXIgaSA9IDA7XG5cbiAgLy8gVE9ETzogd2UgY291bGQgb3B0aW1pemUgd2hlbiBnaXZlbiB0YXJnZXQgaXMgYXJyYXkgbGlrZVxuICBmb3JFYWNoKHRhcmdldCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIGluZGljZXNbaV0gPSBpKys7XG4gIH0pO1xuXG4gIHJldHVybiBbYXJyYXksIGluZGljZXNdO1xufVxuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xuZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuZXhwb3J0cy5ndWVzc0xlbmd0aCA9IGd1ZXNzTGVuZ3RoO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMudG9BcnJheVdpdGhJbmRpY2VzID0gdG9BcnJheVdpdGhJbmRpY2VzO1xuIiwgIi8qKlxuICogT2JsaXRlcmF0b3IgSXRlcmF0b3IgQ2xhc3NcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIFNpbXBsZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkncyBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRvciBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHQgLSBOZXh0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ibGl0ZXJhdG9yL2l0ZXJhdG9yOiBleHBlY3RpbmcgYSBmdW5jdGlvbiEnKTtcblxuICB0aGlzLm5leHQgPSBuZXh0O1xufVxuXG4vKipcbiAqIElmIHN5bWJvbHMgYXJlIHN1cHBvcnRlZCwgd2UgYWRkIGBuZXh0YCB0byBgU3ltYm9sLml0ZXJhdG9yYC5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb2YgdGhlIGdpdmVuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gIHthbnkuLi59IHZhbHVlcyAtIFZhbHVlcy5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgbCA9IGFyZ3MubGVuZ3RoLFxuICAgIGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpID49IGwpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICByZXR1cm4ge2RvbmU6IGZhbHNlLCB2YWx1ZTogYXJnc1tpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvci5cbiAqXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3IuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpdGVyYXRvciA9IG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtkb25lOiB0cnVlfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gaW5kZXhlZCBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHNlcXVlbmNlIC0gVGFyZ2V0IHNlcXVlbmNlLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmZyb21TZXF1ZW5jZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB2YXIgaSA9IDAsXG4gICAgbCA9IHNlcXVlbmNlLmxlbmd0aDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IHNlcXVlbmNlW2krK119O1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkl0ZXJhdG9yLmlzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5uZXh0ID09PSAnZnVuY3Rpb24nXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBJdGVyYXRvcjtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBGaXhlZERlcXVlXG4gKiA9PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBGaXhlZCBjYXBhY2l0eSBkb3VibGUtZW5kZWQgcXVldWUgaW1wbGVtZW50ZWQgYXMgcmluZyBkZXF1ZS5cbiAqL1xudmFyIGl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4vdXRpbHMvaXRlcmFibGVzLmpzJyksXG4gICAgSXRlcmF0b3IgPSByZXF1aXJlKCdvYmxpdGVyYXRvci9pdGVyYXRvcicpO1xuXG4vKipcbiAqIEZpeGVkRGVxdWUuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEZpeGVkRGVxdWUoQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdtbmVtb25pc3QvZml4ZWQtZGVxdWU6IGV4cGVjdGluZyBhbiBBcnJheSBjbGFzcyBhbmQgYSBjYXBhY2l0eS4nKTtcblxuICBpZiAodHlwZW9mIGNhcGFjaXR5ICE9PSAnbnVtYmVyJyB8fCBjYXBhY2l0eSA8PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlOiBgY2FwYWNpdHlgIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlci4nKTtcblxuICB0aGlzLkFycmF5Q2xhc3MgPSBBcnJheUNsYXNzO1xuICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXlDbGFzcyh0aGlzLmNhcGFjaXR5KTtcbiAgdGhpcy5jbGVhcigpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGNsZWFyIHRoZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIFByb3BlcnRpZXNcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuc2l6ZSA9IDA7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGFwcGVuZCBhIHZhbHVlIHRvIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgIGl0ZW0gLSBJdGVtIHRvIGFwcGVuZC5cbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAtIFJldHVybnMgdGhlIG5ldyBzaXplIG9mIHRoZSBkZXF1ZS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gdGhpcy5jYXBhY2l0eSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5wdXNoOiBkZXF1ZSBjYXBhY2l0eSAoJyArIHRoaXMuY2FwYWNpdHkgKyAnKSBleGNlZWRlZCEnKTtcblxuICB2YXIgaW5kZXggPSAodGhpcy5zdGFydCArIHRoaXMuc2l6ZSkgJSB0aGlzLmNhcGFjaXR5O1xuXG4gIHRoaXMuaXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICByZXR1cm4gKyt0aGlzLnNpemU7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIHByZXBlbmQgYSB2YWx1ZSB0byB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBpdGVtIC0gSXRlbSB0byBwcmVwZW5kLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAgIC0gUmV0dXJucyB0aGUgbmV3IHNpemUgb2YgdGhlIGRlcXVlLlxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oaXRlbSkge1xuICBpZiAodGhpcy5zaXplID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlLnVuc2hpZnQ6IGRlcXVlIGNhcGFjaXR5ICgnICsgdGhpcy5jYXBhY2l0eSArICcpIGV4Y2VlZGVkIScpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgLSAxO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSAwKVxuICAgIGluZGV4ID0gdGhpcy5jYXBhY2l0eSAtIDE7XG5cbiAgdGhpcy5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICB0aGlzLnN0YXJ0ID0gaW5kZXg7XG5cbiAgcmV0dXJuICsrdGhpcy5zaXplO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwb3AgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX0gLSBSZXR1cm5zIHRoZSBwb3BwZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IGluZGV4ID0gKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxKSAlIHRoaXMuY2FwYWNpdHk7XG5cbiAgdGhpcy5zaXplLS07XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBzaGlmdCB0aGUgZGVxdWUuXG4gKlxuICogQHJldHVybiB7YW55fSAtIFJldHVybnMgdGhlIHNoaWZ0ZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5zdGFydDtcblxuICB0aGlzLnNpemUtLTtcbiAgdGhpcy5zdGFydCsrO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRoaXMuc3RhcnQgPSAwO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW2luZGV4XTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHVzZWQgdG8gcGVlayB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucGVla0ZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW3RoaXMuc3RhcnRdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwZWVrIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnBlZWtMYXN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxO1xuXG4gIGlmIChpbmRleCA+IHRoaXMuY2FwYWNpdHkpXG4gICAgaW5kZXggLT0gdGhpcy5jYXBhY2l0eTtcblxuICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZSBvZiB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7YW55fVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICBpZiAodGhpcy5zaXplID09PSAwKVxuICAgIHJldHVybjtcblxuICBpbmRleCA9IHRoaXMuc3RhcnQgKyBpbmRleDtcblxuICBpZiAoaW5kZXggPiB0aGlzLmNhcGFjaXR5KVxuICAgIGluZGV4IC09IHRoaXMuY2FwYWNpdHk7XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGRlcXVlLlxuICpcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgIHNjb3BlICAgIC0gT3B0aW9uYWwgc2NvcGUuXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgc2NvcGUpIHtcbiAgc2NvcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNjb3BlIDogdGhpcztcblxuICB2YXIgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICB3aGlsZSAoaiA8IGwpIHtcbiAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCB0aGlzLml0ZW1zW2ldLCBqLCB0aGlzKTtcbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjb252ZXJ0IHRoZSBkZXF1ZSB0byBhIEphdmFTY3JpcHQgYXJyYXkuXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbi8vIFRPRE86IG9wdGlvbmFsIGFycmF5IGNsYXNzIGFzIGFyZ3VtZW50P1xuRml4ZWREZXF1ZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIE9wdGltaXphdGlvblxuICB2YXIgb2Zmc2V0ID0gdGhpcy5zdGFydCArIHRoaXMuc2l6ZTtcblxuICBpZiAob2Zmc2V0IDwgdGhpcy5jYXBhY2l0eSlcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zbGljZSh0aGlzLnN0YXJ0LCBvZmZzZXQpO1xuXG4gIHZhciBhcnJheSA9IG5ldyB0aGlzLkFycmF5Q2xhc3ModGhpcy5zaXplKSxcbiAgICAgIGMgPSB0aGlzLmNhcGFjaXR5LFxuICAgICAgbCA9IHRoaXMuc2l6ZSxcbiAgICAgIGkgPSB0aGlzLnN0YXJ0LFxuICAgICAgaiA9IDA7XG5cbiAgd2hpbGUgKGogPCBsKSB7XG4gICAgYXJyYXlbal0gPSB0aGlzLml0ZW1zW2ldO1xuICAgIGkrKztcbiAgICBqKys7XG5cbiAgICBpZiAoaSA9PT0gYylcbiAgICAgIGkgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyB2YWx1ZXMuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zLFxuICAgICAgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgIGlmIChqID49IGwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuXG4gICAgdmFyIHZhbHVlID0gaXRlbXNbaV07XG5cbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyBlbnRyaWVzLlxuICpcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuaXRlbXMsXG4gICAgICBjID0gdGhpcy5jYXBhY2l0eSxcbiAgICAgIGwgPSB0aGlzLnNpemUsXG4gICAgICBpID0gdGhpcy5zdGFydCxcbiAgICAgIGogPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGogPj0gbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSBpdGVtc1tpXTtcblxuICAgIGkrKztcblxuICAgIGlmIChpID09PSBjKVxuICAgICAgaSA9IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IFtqKyssIHZhbHVlXSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEF0dGFjaGluZyB0aGUgIy52YWx1ZXMgbWV0aG9kIHRvIFN5bWJvbC5pdGVyYXRvciBpZiBwb3NzaWJsZS5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBGaXhlZERlcXVlLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRml4ZWREZXF1ZS5wcm90b3R5cGUudmFsdWVzO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGtub3duIG1ldGhvZHMuXG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFycmF5ID0gdGhpcy50b0FycmF5KCk7XG5cbiAgYXJyYXkudHlwZSA9IHRoaXMuQXJyYXlDbGFzcy5uYW1lO1xuICBhcnJheS5jYXBhY2l0eSA9IHRoaXMuY2FwYWNpdHk7XG5cbiAgLy8gVHJpY2sgc28gdGhhdCBub2RlIGRpc3BsYXlzIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdjb25zdHJ1Y3RvcicsIHtcbiAgICB2YWx1ZTogRml4ZWREZXF1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEZpeGVkRGVxdWUucHJvdG90eXBlW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gRml4ZWREZXF1ZS5wcm90b3R5cGUuaW5zcGVjdDtcblxuLyoqXG4gKiBTdGF0aWMgQC5mcm9tIGZ1bmN0aW9uIHRha2luZyBhbiBhcmJpdHJhcnkgaXRlcmFibGUgJiBjb252ZXJ0aW5nIGl0IGludG9cbiAqIGEgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7SXRlcmFibGV9IGl0ZXJhYmxlICAgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gQXJyYXlDbGFzcyAtIEFycmF5IGNsYXNzIHRvIHVzZS5cbiAqIEBwYXJhbSAge251bWJlcn0gICBjYXBhY2l0eSAgIC0gRGVzaXJlZCBjYXBhY2l0eS5cbiAqIEByZXR1cm4ge0Zpbml0ZVN0YWNrfVxuICovXG5GaXhlZERlcXVlLmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSwgQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgY2FwYWNpdHkgPSBpdGVyYWJsZXMuZ3Vlc3NMZW5ndGgoaXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBjYXBhY2l0eSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5mcm9tOiBjb3VsZCBub3QgZ3Vlc3MgaXRlcmFibGUgbGVuZ3RoLiBQbGVhc2UgcHJvdmlkZSBkZXNpcmVkIGNhcGFjaXR5IGFzIGxhc3QgYXJndW1lbnQuJyk7XG4gIH1cblxuICB2YXIgZGVxdWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheUNsYXNzLCBjYXBhY2l0eSk7XG5cbiAgaWYgKGl0ZXJhYmxlcy5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGZvciAoaSA9IDAsIGwgPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICBkZXF1ZS5pdGVtc1tpXSA9IGl0ZXJhYmxlW2ldO1xuXG4gICAgZGVxdWUuc2l6ZSA9IGw7XG5cbiAgICByZXR1cm4gZGVxdWU7XG4gIH1cblxuICBpdGVyYWJsZXMuZm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBkZXF1ZS5wdXNoKHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRlcXVlO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gRml4ZWREZXF1ZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIFV0aWxzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIHV0aWxzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqL1xuXG5mdW5jdGlvbiBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgZGVwdGgpIHtcbiAgdGhpcy5ub2RlID0gbm9kZTtcbiAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cjtcbiAgdGhpcy5kZXB0aCA9IGRlcHRoO1xufVxuXG5leHBvcnRzLlRyYXZlcnNhbFJlY29yZCA9IFRyYXZlcnNhbFJlY29yZDtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIEJGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEJyZWFkdGgtRmlyc3QgU2VhcmNoIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xudmFyIGlzR3JhcGggPSByZXF1aXJlKCdncmFwaG9sb2d5LXV0aWxzL2lzLWdyYXBoJyk7XG52YXIgRml4ZWREZXF1ZSA9IHJlcXVpcmUoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZScpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2JmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvYmZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgcXVldWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheSwgZ3JhcGgub3JkZXIpO1xuICB2YXIgcmVjb3JkLCBkZXB0aDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgZ3JhcGguZm9yRWFjaE5vZGUoZnVuY3Rpb24obm9kZSwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIHF1ZXVlLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBhdHRyLCAwKSk7XG5cbiAgICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGRlcHRoID0gcmVjb3JkLmRlcHRoO1xuXG4gICAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGgsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIG5vZGUsIHVzaW5nIGFcbiAqIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbm9kZSAgICAgLSBTdGFydGluZyBub2RlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmc0Zyb21Ob2RlKGdyYXBoLCBub2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzR3JhcGgoZ3JhcGgpKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBleHBlY3RpbmcgYSBncmFwaG9sb2d5IGluc3RhbmNlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdncmFwaG9sb2d5LXRyYXZlcnNhbC9kZnM6IGdpdmVuIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xuXG4gIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gIGlmIChncmFwaC5vcmRlciA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgbm9kZSA9ICcnICsgbm9kZTtcblxuICB2YXIgc2VlbiA9IG5ldyBTZXQoKTtcbiAgdmFyIHF1ZXVlID0gbmV3IEZpeGVkRGVxdWUoQXJyYXksIGdyYXBoLm9yZGVyKTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgcXVldWUucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIHNlZW4uYWRkKG5vZGUpO1xuICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgZ3JhcGguZ2V0Tm9kZUF0dHJpYnV0ZXMobm9kZSksIDApKTtcblxuICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgIHJlY29yZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgZGVwdGggPSByZWNvcmQuZGVwdGg7XG5cbiAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnRzLmJmcyA9IGJmcztcbmV4cG9ydHMuYmZzRnJvbU5vZGUgPSBiZnNGcm9tTm9kZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIERGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlcHRoLUZpcnN0IFNlYXJjaCB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cbnZhciBpc0dyYXBoID0gcmVxdWlyZSgnZ3JhcGhvbG9neS11dGlscy9pcy1ncmFwaCcpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogREZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGRmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgc3RhY2sucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIGdyYXBoLmZvckVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUsIGF0dHIpIHtcbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgMCkpO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gc3RhY2sucG9wKCk7XG4gICAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgICAgY2FsbGJhY2socmVjb3JkLm5vZGUsIHJlY29yZC5hdHRyaWJ1dGVzLCBkZXB0aCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERGUyB0cmF2ZXJzYWwgaW4gdGhlIGdpdmVuIGdyYXBoLCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlLCB1c2luZyBhXG4gKiBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBncmFwaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG5vZGUgICAgIC0gU3RhcnRpbmcgbm9kZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gSXRlcmF0aW9uIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBkZnNGcm9tTm9kZShncmFwaCwgbm9kZSwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgdmFyIHNlZW4gPSBuZXcgU2V0KCk7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgZGVwdGgsIHJlY29yZDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgc2Vlbi5hZGQobm9kZSk7XG4gIHN0YWNrLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBncmFwaC5nZXROb2RlQXR0cmlidXRlcyhub2RlKSwgMCkpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggIT09IDApIHtcbiAgICByZWNvcmQgPSBzdGFjay5wb3AoKTtcbiAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgIGNhbGxiYWNrKHJlY29yZC5ub2RlLCByZWNvcmQuYXR0cmlidXRlcywgZGVwdGgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydHMuZGZzID0gZGZzO1xuZXhwb3J0cy5kZnNGcm9tTm9kZSA9IGRmc0Zyb21Ob2RlO1xuIiwgInZhciBiZnNNb2R1bGUgPSByZXF1aXJlKCcuL2Jmcy5qcycpO1xudmFyIGRmc01vZHVsZSA9IHJlcXVpcmUoJy4vZGZzLmpzJyk7XG5cbnZhciBrO1xuXG5mb3IgKGsgaW4gYmZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gYmZzTW9kdWxlW2tdO1xuXG5mb3IgKGsgaW4gZGZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gZGZzTW9kdWxlW2tdO1xuIiwgIi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTHV4b25FcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlVGltZUVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIERhdGVUaW1lOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW50ZXJ2YWxFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBJbnRlcnZhbDogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZER1cmF0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVW5pdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICBzdXBlcihgSW52YWxpZCB1bml0ICR7dW5pdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgWm9uZUlzQWJzdHJhY3RFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3QgbiA9IFwibnVtZXJpY1wiLFxuICBzID0gXCJzaG9ydFwiLFxuICBsID0gXCJsb25nXCI7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHMsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG4iLCAiLypcbiAgVGhpcyBpcyBqdXN0IGEganVuayBkcmF3ZXIsIGNvbnRhaW5pbmcgYW55dGhpbmcgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgY2xhc3Nlcy5cbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcbiAgaXQgdXAgaW50bywgc2F5LCBwYXJzaW5nVXRpbC5qcyBhbmQgYmFzaWNVdGlsLmpzIGFuZCBzbyBvbi4gQnV0IHRoZXkgYXJlIGRpdmlkZWQgdXAgYnkgZmVhdHVyZSBhcmVhLlxuKi9cblxuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBUWVBFU1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIiAmJiBvICUgMSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59XG5cbi8vIENBUEFCSUxJVElFU1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVsYXRpdmUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiICYmICEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuICAgIGlmICghYmVzdCkge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfSBlbHNlIGlmIChjb21wYXJlKGJlc3RbMF0sIHBhaXJbMF0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgoYSwgaykgPT4ge1xuICAgIGFba10gPSBvYmpba107XG4gICAgcmV0dXJuIGE7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbi8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXJCZXR3ZWVuKHRoaW5nLCBib3R0b20sIHRvcCkge1xuICByZXR1cm4gaXNJbnRlZ2VyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufVxuXG4vLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcbmV4cG9ydCBmdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaW5wdXQsIG4gPSAyKSB7XG4gIGNvbnN0IGlzTmVnID0gaW5wdXQgPCAwO1xuICBsZXQgcGFkZGVkO1xuICBpZiAoaXNOZWcpIHtcbiAgICBwYWRkZWQgPSBcIi1cIiArIChcIlwiICsgLWlucHV0KS5wYWRTdGFydChuLCBcIjBcIik7XG4gIH0gZWxzZSB7XG4gICAgcGFkZGVkID0gKFwiXCIgKyBpbnB1dCkucGFkU3RhcnQobiwgXCIwXCIpO1xuICB9XG4gIHJldHVybiBwYWRkZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGbG9hdGluZyhzdHJpbmcpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHN0cmluZykgfHwgc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gXCJcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyaW5nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16MC05XystXXsxLDI1Nn0oXFwvW0EtWmEtejAtOV8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIGZyYWN0aW9uYWwgc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJ1dVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQubWlsbGlzZWNvbmQgLyAxMCksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ1dXVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0Lm1pbGxpc2Vjb25kIC8gMTAwKSk7XG4gICAgICAgICAgLy8gbWludXRlc1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlKTtcbiAgICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMik7XG4gICAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91cik7XG4gICAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciwgMik7XG4gICAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoeyBmb3JtYXQ6IFwibmFycm93XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInNob3J0XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInRlY2hpZVwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJzaG9ydFwiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJsb25nXCIsIGxvY2FsZTogdGhpcy5sb2MubG9jYWxlIH0pO1xuICAgICAgICAgIC8vIHpvbmVcbiAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZU5hbWU7XG4gICAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAgIC8vIGRhdGVzXG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCJudW1lcmljXCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXkpO1xuICAgICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHsgZGF5OiBcIjItZGlnaXRcIiB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG4gICAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIHN0YW5kYWxvbmVcbiAgICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDEsIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCIyLWRpZ2l0XCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIm51bWVyaWNcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgpO1xuICAgICAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyB5ZWFyc1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDIwMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCIyLWRpZ2l0XCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCJudW1lcmljXCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAgIC8vIGVyYXNcbiAgICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuICAgICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG4gICAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuICAgICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLCA0KTtcbiAgICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQub3JkaW5hbCk7XG4gICAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyKTtcbiAgICAgICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiWFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG4gICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC50cyk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgY29uc3QgdG9rZW5Ub0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImRheVwiO1xuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5Ub1N0cmluZyA9IChsaWxkdXIpID0+ICh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKFxuICAgICAgICAoZm91bmQsIHsgbGl0ZXJhbCwgdmFsIH0pID0+IChsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8oLi4ucmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoKHQpID0+IHQpKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWQge1xuICBjb25zdHJ1Y3RvcihyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IFpvbmVJc0Fic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG9mZnNldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnbmFycm93JywgJ3Nob3J0Jywgb3IgJ3RlY2hpZScuIFJldHVybmluZyAnKzYnLCAnKzA2OjAwJywgb3IgJyswNjAwJyByZXNwZWN0aXZlbHlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8gfSBmcm9tIFwiLi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuXG5sZXQgc2luZ2xldG9uID0gbnVsbDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB6b25lIGZvciB0aGlzIEphdmFTY3JpcHQgZW52aXJvbm1lbnQuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBsb2NhbCB6b25lXG4gICAqIEByZXR1cm4ge1N5c3RlbVpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBTeXN0ZW1ab25lKCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJzeXN0ZW1cIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5vZmZzZXQodHMpLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgcGFyc2Vab25lSW5mbywgaXNVbmRlZmluZWQsIGlhbmFSZWdleCwgb2JqVG9Mb2NhbFRTIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuY29uc3QgbWF0Y2hpbmdSZWdleCA9IFJlZ0V4cChgXiR7aWFuYVJlZ2V4LnNvdXJjZX0kYCk7XG5cbmxldCBkdGZDYWNoZSA9IHt9O1xuZnVuY3Rpb24gbWFrZURURih6b25lKSB7XG4gIGlmICghZHRmQ2FjaGVbem9uZV0pIHtcbiAgICBkdGZDYWNoZVt6b25lXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIGlmICghem9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAcHJpdmF0ZSAqKi9cbiAgICB0aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaWFuYVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSh0cywgeyBmb3JtYXQsIGxvY2FsZSB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZSkpIHJldHVybiBOYU47XG5cbiAgICBjb25zdCBkdGYgPSBtYWtlRFRGKHRoaXMubmFtZSksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gZHRmLmZvcm1hdFRvUGFydHNcbiAgICAgICAgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpXG4gICAgICAgIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKTtcblxuICAgIC8vIGJlY2F1c2Ugd2UncmUgdXNpbmcgaG91cjEyIGFuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDI1NTY0JmNhbj0yJnE9JTIyMjQlM0EwMCUyMiUyMGRhdGV0aW1lZm9ybWF0XG4gICAgY29uc3QgYWRqdXN0ZWRIb3VyID0gaG91ciA9PT0gMjQgPyAwIDogaG91cjtcblxuICAgIGNvbnN0IGFzVVRDID0gb2JqVG9Mb2NhbFRTKHtcbiAgICAgIHllYXIsXG4gICAgICBtb250aCxcbiAgICAgIGRheSxcbiAgICAgIGhvdXI6IGFkanVzdGVkSG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICAgIHNlY29uZCxcbiAgICAgIG1pbGxpc2Vjb25kOiAwLFxuICAgIH0pO1xuXG4gICAgbGV0IGFzVFMgPSArZGF0ZTtcbiAgICBjb25zdCBvdmVyID0gYXNUUyAlIDEwMDA7XG4gICAgYXNUUyAtPSBvdmVyID49IDAgPyBvdmVyIDogMTAwMCArIG92ZXI7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUubmFtZSA9PT0gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHNpZ25lZE9mZnNldCB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuXG4vKipcbiAqIEEgem9uZSB3aXRoIGEgZml4ZWQgb2Zmc2V0IChtZWFuaW5nIG5vIERTVClcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXhlZE9mZnNldFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBVVENcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCB1dGNJbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBpbiBtaW51dGVzXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBGaXhlZE9mZnNldFpvbmUgZnJvbSBhIFVUQyBvZmZzZXQgc3RyaW5nLCBsaWtlIFwiVVRDKzZcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBvZmZzZXQgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQys2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQyswNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMtNjowMFwiKVxuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICBjb25zdCByID0gcy5tYXRjaCgvXnV0Yyg/OihbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8pPyQvaSk7XG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMuZml4ZWQgPSBvZmZzZXQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJmaXhlZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogYFVUQyR7Zm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpfWA7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbi8qKlxuICogQSB6b25lIHRoYXQgZmFpbGVkIHRvIHBhcnNlLiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih6b25lTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuem9uZU5hbWUgPSB6b25lTmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuLi96b25lcy9pbnZhbGlkWm9uZS5qc1wiO1xuXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgaXNTdHJpbmcsIGlzTnVtYmVyIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplWm9uZShpbnB1dCwgZGVmYXVsdFpvbmUpIHtcbiAgbGV0IG9mZnNldDtcbiAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSB8fCBpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFpvbmUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgY29uc3QgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09IFwibG9jYWxcIiB8fCBsb3dlcmVkID09PSBcInN5c3RlbVwiKSByZXR1cm4gZGVmYXVsdFpvbmU7XG4gICAgZWxzZSBpZiAobG93ZXJlZCA9PT0gXCJ1dGNcIiB8fCBsb3dlcmVkID09PSBcImdtdFwiKSByZXR1cm4gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBJQU5BWm9uZS5jcmVhdGUoaW5wdXQpO1xuICAgIGVsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxubGV0IG5vdyA9ICgpID0+IERhdGUubm93KCksXG4gIGRlZmF1bHRab25lID0gXCJzeXN0ZW1cIixcbiAgZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBudWxsLFxuICB0aHJvd09uSW52YWxpZDtcblxuLyoqXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqL1xuICBzdGF0aWMgZ2V0IG5vdygpIHtcbiAgICByZXR1cm4gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbnVtYmVyLCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIEVwb2NoIG1pbGxpc2Vjb25kIGNvdW50XG4gICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gRGF0ZS5ub3coKSArIDMwMDAgLy8gcHJldGVuZCBpdCBpcyAzIHNlY29uZHMgaW4gdGhlIGZ1dHVyZVxuICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiAwIC8vIGFsd2F5cyBwcmV0ZW5kIGl0J3MgSmFuIDEsIDE5NzAgYXQgbWlkbmlnaHQgaW4gVVRDIHRpbWVcbiAgICovXG4gIHN0YXRpYyBzZXQgbm93KG4pIHtcbiAgICBub3cgPSBuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVXNlIHRoZSB2YWx1ZSBcInN5c3RlbVwiIHRvIHJlc2V0IHRoaXMgdmFsdWUgdG8gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdFpvbmUoem9uZSkge1xuICAgIGRlZmF1bHRab25lID0gem9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIG9iamVjdCBjdXJyZW50bHkgdXNlZCB0byBjcmVhdGUgRGF0ZVRpbWVzLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc3lzdGVtJ3MgdGltZSB6b25lICh0aGUgb25lIHNldCBvbiB0aGUgbWFjaGluZSB0aGF0IHJ1bnMgdGhpcyBjb2RlKS5cbiAgICogQHR5cGUge1pvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRab25lKCkge1xuICAgIHJldHVybiBub3JtYWxpemVab25lKGRlZmF1bHRab25lLCBTeXN0ZW1ab25lLmluc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZShsb2NhbGUpIHtcbiAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0obnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcihvdXRwdXRDYWxlbmRhcikge1xuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKSB7XG4gICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBzZXQgdGhyb3dPbkludmFsaWQodCkge1xuICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICAgIElBTkFab25lLnJlc2V0Q2FjaGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHBhZFN0YXJ0LCByb3VuZFRvLCBoYXNSZWxhdGl2ZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCAqIGFzIEVuZ2xpc2ggZnJvbSBcIi4vZW5nbGlzaC5qc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuXG4vLyB0b2RvIC0gcmVtYXAgY2FjaGluZ1xuXG5sZXQgaW50bExGQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZExGKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGR0ZiA9IGludGxMRkNhY2hlW2tleV07XG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuTGlzdEZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxMRkNhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHsgcGFkVG8sIGZsb29yLCAuLi5vdGhlck9wdHMgfSA9IG9wdHM7XG5cbiAgICBpZiAoIWZvcmNlU2ltcGxlIHx8IE9iamVjdC5rZXlzKG90aGVyT3B0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSwgLi4ub3B0cyB9O1xuICAgICAgaWYgKG9wdHMucGFkVG8gPiAwKSBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgICB0aGlzLmluZiA9IGdldENhY2hlZElORihpbnRsLCBpbnRsT3B0cyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5mLmZvcm1hdChmaXhlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcbiAgICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBQb2x5RGF0ZUZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcblxuICAgIGxldCB6O1xuICAgIGlmIChkdC56b25lLmlzVW5pdmVyc2FsKSB7XG4gICAgICAvLyBVVEMtOCBvciBFdGMvVVRDLTggYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YSwgb25seSBFdGMvR01UKzggYW5kIHRoZSBsaWtlLlxuICAgICAgLy8gVGhhdCBpcyB3aHkgZml4ZWQtb2Zmc2V0IFRaIGlzIHNldCB0byB0aGF0IHVubGVzcyBpdCBpczpcbiAgICAgIC8vIDEuIFJlcHJlc2VudGluZyBvZmZzZXQgMCB3aGVuIFVUQyBpcyB1c2VkIHRvIG1haW50YWluIHByZXZpb3VzIGJlaGF2aW9yIGFuZCBkb2VzIG5vdCBiZWNvbWUgR01ULlxuICAgICAgLy8gMi4gVW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXI6XG4gICAgICAvLyAgICAtIHNvbWUgZG8gbm90IHN1cHBvcnQgRXRjL1xuICAgICAgLy8gICAgLSA8IEV0Yy9HTVQtMTQsID4gRXRjL0dNVCsxMiwgYW5kIDMwLW1pbnV0ZSBvciA0NS1taW51dGUgb2Zmc2V0cyBhcmUgbm90IHBhcnQgb2YgdHpkYXRhXG4gICAgICBjb25zdCBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG4gICAgICBjb25zdCBvZmZzZXRaID0gZ210T2Zmc2V0ID49IDAgPyBgRXRjL0dNVCske2dtdE9mZnNldH1gIDogYEV0Yy9HTVQke2dtdE9mZnNldH1gO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBJQU5BWm9uZS5jcmVhdGUob2Zmc2V0WikudmFsaWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKCkge1xuICAgIGNvbnN0IGlzQWN0dWFsbHlFbiA9IHRoaXMuaXNFbmdsaXNoKCk7XG4gICAgY29uc3QgaGFzTm9XZWlyZG5lc3MgPVxuICAgICAgKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiZcbiAgICAgICh0aGlzLm91dHB1dENhbGVuZGFyID09PSBudWxsIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IFwiZ3JlZ29yeVwiKTtcbiAgICByZXR1cm4gaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzID8gXCJlblwiIDogXCJpbnRsXCI7XG4gIH1cblxuICBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKFxuICAgICAgICBhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSxcbiAgICAgICAgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZWRlZmF1bHRUb0VOKGFsdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKHsgLi4uYWx0cywgZGVmYXVsdFRvRU46IHRydWUgfSk7XG4gIH1cblxuICByZWRlZmF1bHRUb1N5c3RlbShhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG1vbnRocyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC5tb250aHMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSBmb3JtYXQgPyB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSA6IHsgbW9udGg6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwTW9udGhzKChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIm1vbnRoXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHdlZWtkYXlzKGxlbmd0aCwgZm9ybWF0ID0gZmFsc2UsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLndlZWtkYXlzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0XG4gICAgICAgICAgPyB7IHdlZWtkYXk6IGxlbmd0aCwgeWVhcjogXCJudW1lcmljXCIsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9XG4gICAgICAgICAgOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKChkdCkgPT5cbiAgICAgICAgICB0aGlzLmV4dHJhY3QoZHQsIGludGwsIFwid2Vla2RheVwiKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBtZXJpZGllbXMoZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYoXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdE9LLFxuICAgICAgKCkgPT4gRW5nbGlzaC5tZXJpZGllbXMsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgICAgaWYgKCF0aGlzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBpbnRsID0geyBob3VyOiBcIm51bWVyaWNcIiwgaG91ckN5Y2xlOiBcImgxMlwiIH07XG4gICAgICAgICAgdGhpcy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChcbiAgICAgICAgICAgIChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJpZGllbUNhY2hlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBlcmFzKGxlbmd0aCwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2guZXJhcywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IHsgZXJhOiBsZW5ndGggfTtcblxuICAgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYy4gRGlmZmVyZW50IGNhbGVuZGFycyBhcmUgZ29pbmcgdG8gZGVmaW5lIGVyYXMgdG90YWxseSBkaWZmZXJlbnRseS4gV2hhdCBJIG5lZWQgaXMgdGhlIG1pbmltdW0gc2V0IG9mIGRhdGVzXG4gICAgICAvLyB0byBkZWZpbml0ZWx5IGVudW1lcmF0ZSB0aGVtLlxuICAgICAgaWYgKCF0aGlzLmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy5lcmFDYWNoZVtsZW5ndGhdID0gW0RhdGVUaW1lLnV0YygtNDAsIDEsIDEpLCBEYXRlVGltZS51dGMoMjAxNywgMSwgMSldLm1hcCgoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZCk7XG4gICAgcmV0dXJuIG1hdGNoaW5nID8gbWF0Y2hpbmcudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgbnVtYmVyRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgcmV0dXJuIG5ldyBQb2x5TnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzLCBvcHRzKTtcbiAgfVxuXG4gIGR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH1cblxuICByZWxGb3JtYXR0ZXIob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5UmVsRm9ybWF0dGVyKHRoaXMuaW50bCwgdGhpcy5pc0VuZ2xpc2goKSwgb3B0cyk7XG4gIH1cblxuICBsaXN0Rm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBnZXRDYWNoZWRMRih0aGlzLmludGwsIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbiAgcGFyc2VGbG9hdGluZyxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pWSk/KD86KC0/XFxkezEsOX0oPzpcXC5cXGR7MSw5fSk/KU0pPyg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylXKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pRCk/KD86VCg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylIKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyh5ZWFyU3RyKSksXG4gICAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcobW9udGhTdHIpKSxcbiAgICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcoZGF5U3RyKSksXG4gICAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhob3VyU3RyKSksXG4gICAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhzZWNvbmRTdHIpLCBzZWNvbmRTdHIgPT09IFwiLTBcIiksXG4gICAgICBtaWxsaXNlY29uZHM6IG1heWJlTmVnYXRlKHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0ciksIG5lZ2F0aXZlU2Vjb25kcyksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gVGhlc2UgYXJlIGEgbGl0dGxlIGJyYWluZGVhZC4gRURUICpzaG91bGQqIHRlbGwgdXMgdGhhdCB3ZSdyZSBpbiwgc2F5LCBBbWVyaWNhL05ld19Zb3JrXG4vLyBhbmQgbm90IGp1c3QgdGhhdCB3ZSdyZSBpbiAtMjQwICpyaWdodCBub3cqLiBCdXQgc2luY2UgSSBkb24ndCB0aGluayB0aGVzZSBhcmUgdXNlZCB0aGF0IG9mdGVuXG4vLyBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdFxuY29uc3Qgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MCxcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50ZWdlcih5ZWFyU3RyKSkgOiBwYXJzZUludGVnZXIoeWVhclN0ciksXG4gICAgbW9udGg6IEVuZ2xpc2gubW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnRlZ2VyKGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnRlZ2VyKGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnRlZ2VyKG1pbnV0ZVN0ciksXG4gIH07XG5cbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50ZWdlcihzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID1cbiAgICAgIHdlZWtkYXlTdHIubGVuZ3RoID4gM1xuICAgICAgICA/IEVuZ2xpc2gud2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxXG4gICAgICAgIDogRW5nbGlzaC53ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUkZDIDI4MjIvNTMyMlxuY29uc3QgcmZjMjgyMiA9XG4gIC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgY29uc3QgW1xuICAgICAgLFxuICAgICAgd2Vla2RheVN0cixcbiAgICAgIGRheVN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgeWVhclN0cixcbiAgICAgIGhvdXJTdHIsXG4gICAgICBtaW51dGVTdHIsXG4gICAgICBzZWNvbmRTdHIsXG4gICAgICBvYnNPZmZzZXQsXG4gICAgICBtaWxPZmZzZXQsXG4gICAgICBvZmZIb3VyU3RyLFxuICAgICAgb2ZmTWludXRlU3RyLFxuICAgIF0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgbGV0IG9mZnNldDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xufVxuXG4vLyBodHRwIGRhdGVcblxuY29uc3QgcmZjMTEyMyA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgcmZjODUwID1cbiAgICAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICBhc2NpaSA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBkYXlTdHIsIG1vbnRoU3RyLCB5ZWFyU3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgY29uc3QgWywgd2Vla2RheVN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIsIHllYXJTdHJdID0gbWF0Y2gsXG4gICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuY29uc3QgaXNvWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1ltZFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb1RpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXRcbik7XG5jb25zdCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1dlZWtEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT09yZGluYWxEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb1dlZWtXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXRdLFxuICAgIFtpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZV0sXG4gICAgW2lzb1RpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZUFuZE9mZnNldF1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIVFRQRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbYXNjaWksIGV4dHJhY3RBU0NJSV1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuY29uc3QgZXh0cmFjdElTT1RpbWVPbmx5ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09UaW1lT25seShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvVGltZU9ubHksIGV4dHJhY3RJU09UaW1lT25seV0pO1xufVxuXG5jb25zdCBzcWxZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBzcWxUaW1lQ29tYmluZWRSZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCk7XG5cbmNvbnN0IGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLFxuICAgIFtzcWxUaW1lQ29tYmluZWRSZWdleCwgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZV1cbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW52YWxpZER1cmF0aW9uRXJyb3IsIEludmFsaWRVbml0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ltcGwvaW52YWxpZC5qc1wiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi9pbXBsL2xvY2FsZS5qc1wiO1xuaW1wb3J0IHsgcGFyc2VJU09EdXJhdGlvbiwgcGFyc2VJU09UaW1lT25seSB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7XG4gIGFzTnVtYmVyLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaXNJbnRlZ2VyLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgbG93T3JkZXJNYXRyaXggPSB7XG4gICAgd2Vla3M6IHtcbiAgICAgIGRheXM6IDcsXG4gICAgICBob3VyczogNyAqIDI0LFxuICAgICAgbWludXRlczogNyAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGRheXM6IHtcbiAgICAgIGhvdXJzOiAyNCxcbiAgICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICAgIG1pbnV0ZXM6IHsgc2Vjb25kczogNjAsIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwIH0sXG4gICAgc2Vjb25kczogeyBtaWxsaXNlY29uZHM6IDEwMDAgfSxcbiAgfSxcbiAgY2FzdWFsTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogNTIsXG4gICAgICBkYXlzOiAzNjUsXG4gICAgICBob3VyczogMzY1ICogMjQsXG4gICAgICBtaW51dGVzOiAzNjUgKiAyNCAqIDYwLFxuICAgICAgc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgcXVhcnRlcnM6IHtcbiAgICAgIG1vbnRoczogMyxcbiAgICAgIHdlZWtzOiAxMyxcbiAgICAgIGRheXM6IDkxLFxuICAgICAgaG91cnM6IDkxICogMjQsXG4gICAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgbW9udGhzOiB7XG4gICAgICB3ZWVrczogNCxcbiAgICAgIGRheXM6IDMwLFxuICAgICAgaG91cnM6IDMwICogMjQsXG4gICAgICBtaW51dGVzOiAzMCAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG5cbiAgICAuLi5sb3dPcmRlck1hdHJpeCxcbiAgfSxcbiAgZGF5c0luWWVhckFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0MDAsXG4gIGRheXNJbk1vbnRoQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQ4MDAsXG4gIGFjY3VyYXRlTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDI4LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICAgIGhvdXJzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQpIC8gNCxcbiAgICAgIG1pbnV0ZXM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwKSAvIDQsXG4gICAgICBzZWNvbmRzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwKSAvIDQsXG4gICAgICBtaWxsaXNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSAvIDQsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiBkYXlzSW5Nb250aEFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJbk1vbnRoQWNjdXJhdGUsXG4gICAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9O1xuXG4vLyB1bml0cyBvcmRlcmVkIGJ5IHNpemVcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcbiAgXCJ5ZWFyc1wiLFxuICBcInF1YXJ0ZXJzXCIsXG4gIFwibW9udGhzXCIsXG4gIFwid2Vla3NcIixcbiAgXCJkYXlzXCIsXG4gIFwiaG91cnNcIixcbiAgXCJtaW51dGVzXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcIm1pbGxpc2Vjb25kc1wiLFxuXTtcblxuY29uc3QgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIgPSBmYWxzZSkge1xuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIGNvbnN0IGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogeyAuLi5kdXIudmFsdWVzLCAuLi4oYWx0cy52YWx1ZXMgfHwge30pIH0sXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3ksXG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbmZ1bmN0aW9uIGFudGlUcnVuYyhuKSB7XG4gIHJldHVybiBuIDwgMCA/IE1hdGguZmxvb3IobikgOiBNYXRoLmNlaWwobik7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICBjb25zdCBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgIHJhdyA9IGZyb21NYXBbZnJvbVVuaXRdIC8gY29udixcbiAgICBzYW1lU2lnbiA9IE1hdGguc2lnbihyYXcpID09PSBNYXRoLnNpZ24odG9NYXBbdG9Vbml0XSksXG4gICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICAgIGFkZGVkID1cbiAgICAgICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZSNwbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbiNmcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uI2Zyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT30uXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayBEdXJhdGlvbiN5ZWFyc30sIHtAbGluayBEdXJhdGlvbi5tb250aHN9LCB7QGxpbmsgRHVyYXRpb24jd2Vla3N9LCB7QGxpbmsgRHVyYXRpb24jZGF5c30sIHtAbGluayBEdXJhdGlvbiNob3Vyc30sIHtAbGluayBEdXJhdGlvbiNtaW51dGVzfSwge0BsaW5rIER1cmF0aW9uI3NlY29uZHN9LCB7QGxpbmsgRHVyYXRpb24jbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uI2xvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbiNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIER1cmF0aW9uI3BsdXN9LCB7QGxpbmsgRHVyYXRpb24jbWludXN9LCB7QGxpbmsgRHVyYXRpb24jbm9ybWFsaXplfSwge0BsaW5rIER1cmF0aW9uI3NldH0sIHtAbGluayBEdXJhdGlvbiNyZWNvbmZpZ3VyZX0sIHtAbGluayBEdXJhdGlvbiNzaGlmdFRvfSwgYW5kIHtAbGluayBEdXJhdGlvbiNuZWdhdGV9LlxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIER1cmF0aW9uI2FzfSwge0BsaW5rIER1cmF0aW9uI3RvSVNPfSwge0BsaW5rIER1cmF0aW9uI3RvRm9ybWF0fSwgYW5kIHtAbGluayBEdXJhdGlvbiN0b0pTT059XG4gKlxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3QgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzJy5cbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiBhIHplcm8gbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9W11dIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaiwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7XG4gICAgICAgICAgb2JqID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2Ygb2JqXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gRHVyYXRpb25MaWtlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IG51bWJlciB8IER1cmF0aW9ufSBkdXJhdGlvbkxpa2VcbiAgICogT25lIG9mOlxuICAgKiAtIG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiAtIG51bWJlciByZXByZXNlbnRpbmcgbWlsbGlzZWNvbmRzXG4gICAqIC0gRHVyYXRpb24gaW5zdGFuY2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbkxpa2UpIHtcbiAgICBpZiAoaXNOdW1iZXIoZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb25MaWtlKTtcbiAgICB9IGVsc2UgaWYgKER1cmF0aW9uLmlzRHVyYXRpb24oZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIGR1cmF0aW9uTGlrZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbkxpa2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uTGlrZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbkxpa2V9IG9mIHR5cGUgJHt0eXBlb2YgZHVyYXRpb25MaWtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRHVyYXRpb24gd2l0aCBhbGwgdW5pdHMgaW5jbHVkZWRcbiAgICogVG8gbW9kaWZ5IGl0cyBiZWhhdmlvciB1c2UgdGhlIGBsaXN0U3R5bGVgIGFuZCBhbnkgSW50bC5OdW1iZXJGb3JtYXQgb3B0aW9uLCB0aG91Z2ggYHVuaXREaXNwbGF5YCBpcyBlc3BlY2lhbGx5IHJlbGV2YW50LiBTZWUge0BsaW5rIEludGwuTnVtYmVyRm9ybWF0fS5cbiAgICogQHBhcmFtIG9wdHMgLSBPbiBvcHRpb24gb2JqZWN0IHRvIG92ZXJyaWRlIHRoZSBmb3JtYXR0aW5nLiBBY2NlcHRzIHRoZSBzYW1lIGtleXMgYXMgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIG9mIHRoZSBuYXRpdmUgYEludC5OdW1iZXJGb3JtYXRgIGNvbnN0cnVjdG9yLCBhcyB3ZWxsIGFzIGBsaXN0U3R5bGVgLlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqc1xuICAgKiB2YXIgZHVyID0gRHVyYXRpb24uZnJvbU9iamVjdCh7IGRheXM6IDEsIGhvdXJzOiA1LCBtaW51dGVzOiA2IH0pXG4gICAqIGR1ci50b0h1bWFuKCkgLy89PiAnMSBkYXksIDUgaG91cnMsIDYgbWludXRlcydcbiAgICogZHVyLnRvSHVtYW4oeyBsaXN0U3R5bGU6IFwibG9uZ1wiIH0pIC8vPT4gJzEgZGF5LCA1IGhvdXJzLCBhbmQgNiBtaW51dGVzJ1xuICAgKiBkdXIudG9IdW1hbih7IHVuaXREaXNwbGF5OiBcInNob3J0XCIgfSkgLy89PiAnMSBkYXksIDUgaHIsIDYgbWluJ1xuICAgKiBgYGBcbiAgICovXG4gIHRvSHVtYW4ob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbCA9IG9yZGVyZWRVbml0c1xuICAgICAgLm1hcCgodW5pdCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlc1t1bml0XTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NcbiAgICAgICAgICAubnVtYmVyRm9ybWF0dGVyKHsgc3R5bGU6IFwidW5pdFwiLCB1bml0RGlzcGxheTogXCJsb25nXCIsIC4uLm9wdHMsIHVuaXQ6IHVuaXQuc2xpY2UoMCwgLTEpIH0pXG4gICAgICAgICAgLmZvcm1hdCh2YWwpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG4pID0+IG4pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jXG4gICAgICAubGlzdEZvcm1hdHRlcih7IHR5cGU6IFwiY29uanVuY3Rpb25cIiwgc3R5bGU6IG9wdHMubGlzdFN0eWxlIHx8IFwibmFycm93XCIsIC4uLm9wdHMgfSlcbiAgICAgIC5mb3JtYXQobCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3QoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICByZXR1cm4geyAuLi50aGlzLnZhbHVlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgcyArPSBcIlRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCkgcyArPSB0aGlzLmhvdXJzICsgXCJIXCI7XG4gICAgaWYgKHRoaXMubWludXRlcyAhPT0gMCkgcyArPSB0aGlzLm1pbnV0ZXMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgLy8gdGhpcyB3aWxsIGhhbmRsZSBcImZsb2F0aW5nIHBvaW50IG1hZG5lc3NcIiBieSByZW1vdmluZyBleHRyYSBkZWNpbWFsIHBsYWNlc1xuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTg4MDA0L2lzLWZsb2F0aW5nLXBvaW50LW1hdGgtYnJva2VuXG4gICAgICBzICs9IHJvdW5kVG8odGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwLCAzKSArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIlQwU1wiO1xuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLCBmb3JtYXR0ZWQgYXMgYSB0aW1lIG9mIGRheS5cbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgZHVyYXRpb24gaXMgaW52YWxpZCwgbmVnYXRpdmUsIG9yIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAyNCBob3Vycy5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVByZWZpeD1mYWxzZV0gLSBpbmNsdWRlIHRoZSBgVGAgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSgpIC8vPT4gJzExOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMDowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMTE6MDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcxMTAwMDAuMDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1RpbWUob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWlsbGlzID0gdGhpcy50b01pbGxpcygpO1xuICAgIGlmIChtaWxsaXMgPCAwIHx8IG1pbGxpcyA+PSA4NjQwMDAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBvcHRzID0ge1xuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVQcmVmaXg6IGZhbHNlLFxuICAgICAgZm9ybWF0OiBcImV4dGVuZGVkXCIsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2hpZnRUbyhcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIik7XG5cbiAgICBsZXQgZm10ID0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiaGhtbVwiIDogXCJoaDptbVwiO1xuXG4gICAgaWYgKCFvcHRzLnN1cHByZXNzU2Vjb25kcyB8fCB2YWx1ZS5zZWNvbmRzICE9PSAwIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgZm10ICs9IG9wdHMuZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcInNzXCIgOiBcIjpzc1wiO1xuICAgICAgaWYgKCFvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN0ciA9IHZhbHVlLnRvRm9ybWF0KGZtdCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlUHJlZml4KSB7XG4gICAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcyhcIm1pbGxpc2Vjb25kc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5KGR1ci52YWx1ZXMsIGspIHx8IGhhc093blByb3BlcnR5KHRoaXMudmFsdWVzLCBrKSkge1xuICAgICAgICByZXN1bHRba10gPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIHNob3J0ZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSB0aGlzIER1cmF0aW9uIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB1bml0LiBBcml0eSBpcyAxIG9yIDI6IHRoZSB2YWx1ZSBvZiB0aGUgdW5pdCBhbmQsIG9wdGlvbmFsbHksIHRoZSB1bml0IG5hbWUuIE11c3QgcmV0dXJuIGEgbnVtYmVyLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKHggPT4geCAqIDIpIC8vPT4geyBob3VyczogMiwgbWludXRlczogNjAgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKCh4LCB1KSA9PiB1ID09PSBcImhvdXJcIiA/IHggKiAyIDogeCkgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiAzMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbWFwVW5pdHMoZm4pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgcmVzdWx0W2tdID0gYXNOdW1iZXIoZm4odGhpcy52YWx1ZXNba10sIGspKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCd5ZWFycycpIC8vPT4gMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLmdldCgnbW9udGhzJykgLy89PiAwXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdkYXlzJykgLy89PiAzXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KV07XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IGhvdXJzOiA4LCBtaW51dGVzOiAzMCB9KVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBtaXhlZCA9IHsgLi4udGhpcy52YWx1ZXMsIC4uLm5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpIH07XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBtaXhlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY29udmVyc2lvbkFjY3VyYWN5IH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0gfSksXG4gICAgICBvcHRzID0geyBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmVkdWNlIHRoaXMgRHVyYXRpb24gdG8gaXRzIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBpbiBpdHMgY3VycmVudCB1bml0cy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMiwgbWludXRlczogLTQ1IH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMTUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogdmFscyB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNoaWZ0VG8oLi4udW5pdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1bml0cyA9IHVuaXRzLm1hcCgodSkgPT4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KSk7XG5cbiAgICBjb25zdCBidWlsdCA9IHt9LFxuICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbGV0IGxhc3RVbml0O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG5cbiAgICAgICAgbGV0IG93biA9IDA7XG5cbiAgICAgICAgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG4gICAgICAgIGZvciAoY29uc3QgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgIGFjY3VtdWxhdGVkW2FrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSAob3duICogMTAwMCAtIGkgKiAxMDAwKSAvIDEwMDA7XG5cbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG4gICAgICAgIGZvciAoY29uc3QgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuICAgIGZvciAoY29uc3Qga2V5IGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSAhPT0gMCkge1xuICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz1cbiAgICAgICAgICBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IGJ1aWx0IH0sIHRydWUpLm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBuZWdhdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgbmVnYXRlZFtrXSA9IC10aGlzLnZhbHVlc1trXTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBuZWdhdGVkIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVycy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRocy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2Vla3NcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRheXMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91cnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGVzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xuICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIER1cmF0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bml0cyBhbmQgdGhlIHNhbWUgdmFsdWVzIGZvciBlYWNoIHVuaXQuXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcSh2MSwgdjIpIHtcbiAgICAgIC8vIENvbnNpZGVyIDAgYW5kIHVuZGVmaW5lZCBhcyBlcXVhbFxuICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgfHwgdjEgPT09IDApIHJldHVybiB2MiA9PT0gdW5kZWZpbmVkIHx8IHYyID09PSAwO1xuICAgICAgcmV0dXJuIHYxID09PSB2MjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoIWVxKHRoaXMudmFsdWVzW3VdLCBvdGhlci52YWx1ZXNbdV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUsIHsgZnJpZW5kbHlEYXRlVGltZSB9IGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsI2FmdGVyfSwge0BsaW5rIEludGVydmFsI2JlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbCNmcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZSNmcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUjaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGlmIHRoYXQncyB0aGUgY2FzZS5cbiAgICogS2V5czpcbiAgICogKiBgcmVsYXRpdmVgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgcmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgcmVsYXRpdmU6IGZhbHNlIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGZlYXR1cmVzKCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBoYXNSZWxhdGl2ZSgpIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4uL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIGRheURpZmYoZWFybGllciwgbGF0ZXIpIHtcbiAgY29uc3QgdXRjRGF5U3RhcnQgPSAoZHQpID0+IGR0LnRvVVRDKDAsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKSxcbiAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihEdXJhdGlvbi5mcm9tTWlsbGlzKG1zKS5hcyhcImRheXNcIikpO1xufVxuXG5mdW5jdGlvbiBoaWdoT3JkZXJEaWZmcyhjdXJzb3IsIGxhdGVyLCB1bml0cykge1xuICBjb25zdCBkaWZmZXJzID0gW1xuICAgIFtcInllYXJzXCIsIChhLCBiKSA9PiBiLnllYXIgLSBhLnllYXJdLFxuICAgIFtcInF1YXJ0ZXJzXCIsIChhLCBiKSA9PiBiLnF1YXJ0ZXIgLSBhLnF1YXJ0ZXJdLFxuICAgIFtcIm1vbnRoc1wiLCAoYSwgYikgPT4gYi5tb250aCAtIGEubW9udGggKyAoYi55ZWFyIC0gYS55ZWFyKSAqIDEyXSxcbiAgICBbXG4gICAgICBcIndlZWtzXCIsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICAgICAgcmV0dXJuIChkYXlzIC0gKGRheXMgJSA3KSkgLyA3O1xuICAgICAgfSxcbiAgICBdLFxuICAgIFtcImRheXNcIiwgZGF5RGlmZl0sXG4gIF07XG5cbiAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICBsZXQgbG93ZXN0T3JkZXIsIGhpZ2hXYXRlcjtcblxuICBmb3IgKGNvbnN0IFt1bml0LCBkaWZmZXJdIG9mIGRpZmZlcnMpIHtcbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIGxldCBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSB9KTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSAtIDEgfSk7XG4gICAgICAgIGRlbHRhIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpIHtcbiAgbGV0IFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdID0gaGlnaE9yZGVyRGlmZnMoZWFybGllciwgbGF0ZXIsIHVuaXRzKTtcblxuICBjb25zdCByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICBjb25zdCBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoXG4gICAgKHUpID0+IFtcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl0uaW5kZXhPZih1KSA+PSAwXG4gICk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW2xvd2VzdE9yZGVyXTogMSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHJlc3VsdHMsIG9wdHMpO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKHJlbWFpbmluZ01pbGxpcywgb3B0cylcbiAgICAgIC5zaGlmdFRvKC4uLmxvd2VyT3JkZXJVbml0cylcbiAgICAgIC5wbHVzKGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cbn1cbiIsICJjb25zdCBudW1iZXJpbmdTeXN0ZW1zID0ge1xuICBhcmFiOiBcIltcXHUwNjYwLVxcdTA2NjldXCIsXG4gIGFyYWJleHQ6IFwiW1xcdTA2RjAtXFx1MDZGOV1cIixcbiAgYmFsaTogXCJbXFx1MUI1MC1cXHUxQjU5XVwiLFxuICBiZW5nOiBcIltcXHUwOUU2LVxcdTA5RUZdXCIsXG4gIGRldmE6IFwiW1xcdTA5NjYtXFx1MDk2Rl1cIixcbiAgZnVsbHdpZGU6IFwiW1xcdUZGMTAtXFx1RkYxOV1cIixcbiAgZ3VqcjogXCJbXFx1MEFFNi1cXHUwQUVGXVwiLFxuICBoYW5pZGVjOiBcIltcdTMwMDd8XHU0RTAwfFx1NEU4Q3xcdTRFMDl8XHU1NkRCfFx1NEU5NHxcdTUxNkR8XHU0RTAzfFx1NTE2QnxcdTRFNURdXCIsXG4gIGtobXI6IFwiW1xcdTE3RTAtXFx1MTdFOV1cIixcbiAga25kYTogXCJbXFx1MENFNi1cXHUwQ0VGXVwiLFxuICBsYW9vOiBcIltcXHUwRUQwLVxcdTBFRDldXCIsXG4gIGxpbWI6IFwiW1xcdTE5NDYtXFx1MTk0Rl1cIixcbiAgbWx5bTogXCJbXFx1MEQ2Ni1cXHUwRDZGXVwiLFxuICBtb25nOiBcIltcXHUxODEwLVxcdTE4MTldXCIsXG4gIG15bXI6IFwiW1xcdTEwNDAtXFx1MTA0OV1cIixcbiAgb3J5YTogXCJbXFx1MEI2Ni1cXHUwQjZGXVwiLFxuICB0YW1sZGVjOiBcIltcXHUwQkU2LVxcdTBCRUZdXCIsXG4gIHRlbHU6IFwiW1xcdTBDNjYtXFx1MEM2Rl1cIixcbiAgdGhhaTogXCJbXFx1MEU1MC1cXHUwRTU5XVwiLFxuICB0aWJ0OiBcIltcXHUwRjIwLVxcdTBGMjldXCIsXG4gIGxhdG46IFwiXFxcXGRcIixcbn07XG5cbmNvbnN0IG51bWJlcmluZ1N5c3RlbXNVVEYxNiA9IHtcbiAgYXJhYjogWzE2MzIsIDE2NDFdLFxuICBhcmFiZXh0OiBbMTc3NiwgMTc4NV0sXG4gIGJhbGk6IFs2OTkyLCA3MDAxXSxcbiAgYmVuZzogWzI1MzQsIDI1NDNdLFxuICBkZXZhOiBbMjQwNiwgMjQxNV0sXG4gIGZ1bGx3aWRlOiBbNjUyOTYsIDY1MzAzXSxcbiAgZ3VqcjogWzI3OTAsIDI3OTldLFxuICBraG1yOiBbNjExMiwgNjEyMV0sXG4gIGtuZGE6IFszMzAyLCAzMzExXSxcbiAgbGFvbzogWzM3OTIsIDM4MDFdLFxuICBsaW1iOiBbNjQ3MCwgNjQ3OV0sXG4gIG1seW06IFszNDMwLCAzNDM5XSxcbiAgbW9uZzogWzYxNjAsIDYxNjldLFxuICBteW1yOiBbNDE2MCwgNDE2OV0sXG4gIG9yeWE6IFsyOTE4LCAyOTI3XSxcbiAgdGFtbGRlYzogWzMwNDYsIDMwNTVdLFxuICB0ZWx1OiBbMzE3NCwgMzE4M10sXG4gIHRoYWk6IFszNjY0LCAzNjczXSxcbiAgdGlidDogWzM4NzIsIDM4ODFdLFxufTtcblxuY29uc3QgaGFuaWRlY0NoYXJzID0gbnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjLnJlcGxhY2UoL1tcXFt8XFxdXS9nLCBcIlwiKS5zcGxpdChcIlwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cikge1xuICBsZXQgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgIHZhbHVlID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICBpZiAoc3RyW2ldLnNlYXJjaChudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSArPSBoYW5pZGVjQ2hhcnMuaW5kZXhPZihzdHJbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IG51bWJlcmluZ1N5c3RlbXNVVEYxNltrZXldO1xuICAgICAgICAgIGlmIChjb2RlID49IG1pbiAmJiBjb2RlIDw9IG1heCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gY29kZSAtIG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWdpdFJlZ2V4KHsgbnVtYmVyaW5nU3lzdGVtIH0sIGFwcGVuZCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7bnVtYmVyaW5nU3lzdGVtc1tudW1iZXJpbmdTeXN0ZW0gfHwgXCJsYXRuXCJdfSR7YXBwZW5kfWApO1xufVxuIiwgImltcG9ydCB7IHBhcnNlTWlsbGlzLCBpc1VuZGVmaW5lZCwgdW50cnVuY2F0ZVllYXIsIHNpZ25lZE9mZnNldCwgaGFzT3duUHJvcGVydHkgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgRm9ybWF0dGVyIGZyb20gXCIuL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4uL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4uL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgeyBkaWdpdFJlZ2V4LCBwYXJzZURpZ2l0cyB9IGZyb20gXCIuL2RpZ2l0cy5qc1wiO1xuaW1wb3J0IHsgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmNvbnN0IE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QgPSAoaSkgPT4gaSkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHBvc3QocGFyc2VEaWdpdHMocykpIH07XG59XG5cbmNvbnN0IE5CU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5jb25zdCBzcGFjZU9yTkJTUCA9IGAoIHwke05CU1B9KWA7XG5jb25zdCBzcGFjZU9yTkJTUFJlZ0V4cCA9IG5ldyBSZWdFeHAoc3BhY2VPck5CU1AsIFwiZ1wiKTtcblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIC8vIG1ha2Ugc3BhY2UgYW5kIG5vbiBicmVha2FibGUgc3BhY2UgY2hhcmFjdGVycyBpbnRlcmNoYW5nZWFibGVcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuL2csIFwiXFxcXC4/XCIpLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIHNwYWNlT3JOQlNQKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXC4vZywgXCJcIikgLy8gaWdub3JlIGRvdHMgdGhhdCB3ZXJlIG1hZGUgb3B0aW9uYWxcbiAgICAucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgXCIgXCIpIC8vIGludGVyY2hhbmdlIHNwYWNlIGFuZCBuYnNwXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9uZU9mKHN0cmluZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgaWYgKHN0cmluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChzdHJpbmdzLm1hcChmaXhMaXN0UmVnZXgpLmpvaW4oXCJ8XCIpKSxcbiAgICAgIGRlc2VyOiAoW3NdKSA9PlxuICAgICAgICBzdHJpbmdzLmZpbmRJbmRleCgoaSkgPT4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpKSArIHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbLCBoLCBtXSkgPT4gc2lnbmVkT2Zmc2V0KGgsIG0pLCBncm91cHMgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7IHJlZ2V4LCBkZXNlcjogKFtzXSkgPT4gcyB9O1xufVxuXG5mdW5jdGlvbiBlc2NhcGVUb2tlbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICBjb25zdCBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgdHdvID0gZGlnaXRSZWdleChsb2MsIFwiezJ9XCIpLFxuICAgIHRocmVlID0gZGlnaXRSZWdleChsb2MsIFwiezN9XCIpLFxuICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgc2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezZ9XCIpLFxuICAgIG9uZU9yVHdvID0gZGlnaXRSZWdleChsb2MsIFwiezEsMn1cIiksXG4gICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgIG9uZVRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezEsNn1cIiksXG4gICAgb25lVG9OaW5lID0gZGlnaXRSZWdleChsb2MsIFwiezEsOX1cIiksXG4gICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgZm91clRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezQsNn1cIiksXG4gICAgbGl0ZXJhbCA9ICh0KSA9PiAoeyByZWdleDogUmVnRXhwKGVzY2FwZVRva2VuKHQudmFsKSksIGRlc2VyOiAoW3NdKSA9PiBzLCBsaXRlcmFsOiB0cnVlIH0pLFxuICAgIHVuaXRhdGUgPSAodCkgPT4ge1xuICAgICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAgIC8vIGVyYVxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcInNob3J0XCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1NpeCk7XG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwieXl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoc2l4KTtcbiAgICAgICAgLy8gbW9udGhzXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gb3JkaW5hbHNcbiAgICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcbiAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgICAgLy8gdGltZVxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgcmV0dXJuIHNpbXBsZShvbmVUb05pbmUpO1xuICAgICAgICBjYXNlIFwidXVcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInV1dVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG4gICAgICAgIC8vIG1lcmlkaWVtXG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAgIC8vIHdlZWtZZWFyIChrKVxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIHdlZWtkYXlzXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIC8vIG9mZnNldC96b25lXG4gICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgIGNhc2UgXCJaWlwiOlxuICAgICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKD86Oigke3R3by5zb3VyY2V9KSk/YCksIDIpO1xuICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoJHt0d28uc291cmNlfSk/YCksIDIpO1xuICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcbiAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKC9bYS16XystL117MSwyNTZ9Py9pKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIGNvbnN0IHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFAsXG4gIH07XG5cbiAgdW5pdC50b2tlbiA9IHRva2VuO1xuXG4gIHJldHVybiB1bml0O1xufVxuXG5jb25zdCBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbCA9IHtcbiAgeWVhcjoge1xuICAgIFwiMi1kaWdpdFwiOiBcInl5XCIsXG4gICAgbnVtZXJpYzogXCJ5eXl5eVwiLFxuICB9LFxuICBtb250aDoge1xuICAgIG51bWVyaWM6IFwiTVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIk1NXCIsXG4gICAgc2hvcnQ6IFwiTU1NXCIsXG4gICAgbG9uZzogXCJNTU1NXCIsXG4gIH0sXG4gIGRheToge1xuICAgIG51bWVyaWM6IFwiZFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImRkXCIsXG4gIH0sXG4gIHdlZWtkYXk6IHtcbiAgICBzaG9ydDogXCJFRUVcIixcbiAgICBsb25nOiBcIkVFRUVcIixcbiAgfSxcbiAgZGF5cGVyaW9kOiBcImFcIixcbiAgZGF5UGVyaW9kOiBcImFcIixcbiAgaG91cjoge1xuICAgIG51bWVyaWM6IFwiaFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImhoXCIsXG4gIH0sXG4gIG1pbnV0ZToge1xuICAgIG51bWVyaWM6IFwibVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIm1tXCIsXG4gIH0sXG4gIHNlY29uZDoge1xuICAgIG51bWVyaWM6IFwic1wiLFxuICAgIFwiMi1kaWdpdFwiOiBcInNzXCIsXG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0b2tlbkZvclBhcnQocGFydCwgbG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IHBhcnQ7XG5cbiAgaWYgKHR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IHRydWUsXG4gICAgICB2YWw6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG5cbiAgbGV0IHZhbCA9IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsW3R5cGVdO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2V4KHVuaXRzKSB7XG4gIGNvbnN0IHJlID0gdW5pdHMubWFwKCh1KSA9PiB1LnJlZ2V4KS5yZWR1Y2UoKGYsIHIpID0+IGAke2Z9KCR7ci5zb3VyY2V9KWAsIFwiXCIpO1xuICByZXR1cm4gW2BeJHtyZX0kYCwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBhbGwgPSB7fTtcbiAgICBsZXQgbWF0Y2hJbmRleCA9IDE7XG4gICAgZm9yIChjb25zdCBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoaGFuZGxlcnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG4gICAgICAgIGlmICghaC5saXRlcmFsICYmIGgudG9rZW4pIHtcbiAgICAgICAgICBhbGxbaC50b2tlbi52YWxbMF1dID0gaC5kZXNlcihtYXRjaGVzLnNsaWNlKG1hdGNoSW5kZXgsIG1hdGNoSW5kZXggKyBncm91cHMpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICBjb25zdCB0b0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gXCJvcmRpbmFsXCI7XG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrZGF5XCI7XG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrTnVtYmVyXCI7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFwicXVhcnRlclwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGxldCB6b25lID0gbnVsbDtcbiAgbGV0IHNwZWNpZmljT2Zmc2V0O1xuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICBpZiAoIXpvbmUpIHtcbiAgICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gICAgfVxuICAgIHNwZWNpZmljT2Zmc2V0ID0gbWF0Y2hlcy5aO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZSgociwgaykgPT4ge1xuICAgIGNvbnN0IGYgPSB0b0ZpZWxkKGspO1xuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBbdmFscywgem9uZSwgc3BlY2lmaWNPZmZzZXRdO1xufVxuXG5sZXQgZHVtbXlEYXRlVGltZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0RHVtbXlEYXRlVGltZSgpIHtcbiAgaWYgKCFkdW1teURhdGVUaW1lQ2FjaGUpIHtcbiAgICBkdW1teURhdGVUaW1lQ2FjaGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKDE1NTU1NTU1NTU1NTUpO1xuICB9XG5cbiAgcmV0dXJuIGR1bW15RGF0ZVRpbWVDYWNoZTtcbn1cblxuZnVuY3Rpb24gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHRva2VuLCBsb2NhbGUpIHtcbiAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXRPcHRzID0gRm9ybWF0dGVyLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHModG9rZW4udmFsKTtcblxuICBpZiAoIWZvcm1hdE9wdHMpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuY3JlYXRlKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdERhdGVUaW1lUGFydHMoZ2V0RHVtbXlEYXRlVGltZSgpKTtcblxuICBjb25zdCB0b2tlbnMgPSBwYXJ0cy5tYXAoKHApID0+IHRva2VuRm9yUGFydChwLCBsb2NhbGUsIGZvcm1hdE9wdHMpKTtcblxuICBpZiAodG9rZW5zLmluY2x1ZGVzKHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBleHBhbmRNYWNyb1Rva2Vucyh0b2tlbnMsIGxvY2FsZSkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50b2tlbnMubWFwKCh0KSA9PiBtYXliZUV4cGFuZE1hY3JvVG9rZW4odCwgbG9jYWxlKSkpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB0b2tlbnMgPSBleHBhbmRNYWNyb1Rva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm9ybWF0KSwgbG9jYWxlKSxcbiAgICB1bml0cyA9IHRva2Vucy5tYXAoKHQpID0+IHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpKSxcbiAgICBkaXNxdWFsaWZ5aW5nVW5pdCA9IHVuaXRzLmZpbmQoKHQpID0+IHQuaW52YWxpZFJlYXNvbik7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtyZWdleFN0cmluZywgaGFuZGxlcnNdID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgXCJpXCIpLFxuICAgICAgW3Jhd01hdGNoZXMsIG1hdGNoZXNdID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldF0gPSBtYXRjaGVzXG4gICAgICAgID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKVxuICAgICAgICA6IFtudWxsLCBudWxsLCB1bmRlZmluZWRdO1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcImFcIikgJiYgaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJIXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgcmVnZXgsIHJhd01hdGNoZXMsIG1hdGNoZXMsIHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQsIGludmFsaWRSZWFzb24gfSA9IGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCk7XG4gIHJldHVybiBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldCwgaW52YWxpZFJlYXNvbl07XG59XG4iLCAiaW1wb3J0IHtcbiAgaW50ZWdlckJldHdlZW4sXG4gIGlzTGVhcFllYXIsXG4gIHRpbWVPYmplY3QsXG4gIGRheXNJblllYXIsXG4gIGRheXNJbk1vbnRoLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIGlzSW50ZWdlcixcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW52YWxpZC5qc1wiO1xuXG5jb25zdCBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcbiAgICBcInVuaXQgb3V0IG9mIHJhbmdlXCIsXG4gICAgYHlvdSBzcGVjaWZpZWQgJHt2YWx1ZX0gKG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9KSBhcyBhICR7dW5pdH0sIHdoaWNoIGlzIGludmFsaWRgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIGNvbnN0IGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgY29uc3QgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KChpKSA9PiBpIDwgb3JkaW5hbCksXG4gICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7IG1vbnRoOiBtb250aDAgKyAxLCBkYXkgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdPYmosXG4gICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgIHdlZWtkYXkgPSBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSk7XG5cbiAgbGV0IHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgIHdlZWtZZWFyO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIHsgd2Vla1llYXIsIHdlZWtOdW1iZXIsIHdlZWtkYXksIC4uLnRpbWVPYmplY3QoZ3JlZ09iaikgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICBjb25zdCB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5IH0gPSB3ZWVrRGF0YSxcbiAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICB5ZWFySW5EYXlzID0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG5cbiAgbGV0IG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICB5ZWFyO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIod2Vla1llYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdCh3ZWVrRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdEYXRhO1xuICBjb25zdCBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiB7IHllYXIsIG9yZGluYWwsIC4uLnRpbWVPYmplY3QoZ3JlZ0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsVG9HcmVnb3JpYW4ob3JkaW5hbERhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBvcmRpbmFsIH0gPSBvcmRpbmFsRGF0YTtcbiAgY29uc3QgeyBtb250aCwgZGF5IH0gPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpO1xuICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5LCAuLi50aW1lT2JqZWN0KG9yZGluYWxEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLndlZWtZZWFyKSxcbiAgICB2YWxpZFdlZWsgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai55ZWFyKSxcbiAgICB2YWxpZE9yZGluYWwgPSBpbnRlZ2VyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRNb250aCA9IGludGVnZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgIHZhbGlkRGF5ID0gaW50ZWdlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSA9IG9iajtcbiAgY29uc3QgdmFsaWRIb3VyID1cbiAgICAgIGludGVnZXJCZXR3ZWVuKGhvdXIsIDAsIDIzKSB8fFxuICAgICAgKGhvdXIgPT09IDI0ICYmIG1pbnV0ZSA9PT0gMCAmJiBzZWNvbmQgPT09IDAgJiYgbWlsbGlzZWNvbmQgPT09IDApLFxuICAgIHZhbGlkTWludXRlID0gaW50ZWdlckJldHdlZW4obWludXRlLCAwLCA1OSksXG4gICAgdmFsaWRTZWNvbmQgPSBpbnRlZ2VyQmV0d2VlbihzZWNvbmQsIDAsIDU5KSxcbiAgICB2YWxpZE1pbGxpc2Vjb25kID0gaW50ZWdlckJldHdlZW4obWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIGhvdXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbnV0ZSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBzZWNvbmQpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBJbmZvIGZyb20gXCIuL2luZm8uanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1VuZGVmaW5lZCxcbiAgbWF5YmVBcnJheSxcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgYmVzdEJ5LFxuICBkYXlzSW5Nb250aCxcbiAgZGF5c0luWWVhcixcbiAgaXNMZWFwWWVhcixcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBub3JtYWxpemVPYmplY3QsXG4gIHJvdW5kVG8sXG4gIG9ialRvTG9jYWxUUyxcbiAgcGFkU3RhcnQsXG59IGZyb20gXCIuL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcbmltcG9ydCBkaWZmIGZyb20gXCIuL2ltcGwvZGlmZi5qc1wiO1xuaW1wb3J0IHsgcGFyc2VSRkMyODIyRGF0ZSwgcGFyc2VJU09EYXRlLCBwYXJzZUhUVFBEYXRlLCBwYXJzZVNRTCB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7IHBhcnNlRnJvbVRva2VucywgZXhwbGFpbkZyb21Ub2tlbnMgfSBmcm9tIFwiLi9pbXBsL3Rva2VuUGFyc2VyLmpzXCI7XG5pbXBvcnQge1xuICBncmVnb3JpYW5Ub1dlZWssXG4gIHdlZWtUb0dyZWdvcmlhbixcbiAgZ3JlZ29yaWFuVG9PcmRpbmFsLFxuICBvcmRpbmFsVG9HcmVnb3JpYW4sXG4gIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhLFxuICBoYXNJbnZhbGlkV2Vla0RhdGEsXG4gIGhhc0ludmFsaWRPcmRpbmFsRGF0YSxcbiAgaGFzSW52YWxpZFRpbWVEYXRhLFxufSBmcm9tIFwiLi9pbXBsL2NvbnZlcnNpb25zLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2ltcGwvZm9ybWF0cy5qc1wiO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yLFxuICBJbnZhbGlkVW5pdEVycm9yLFxuICBJbnZhbGlkRGF0ZVRpbWVFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEYXRlVGltZVwiO1xuY29uc3QgTUFYX0RBVEUgPSA4LjY0ZTE1O1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIGB0aGUgem9uZSBcIiR7em9uZS5uYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbn1cblxuLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufVxuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBjbG9uZShpbnN0LCBhbHRzKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgdHM6IGluc3QudHMsXG4gICAgem9uZTogaW5zdC56b25lLFxuICAgIGM6IGluc3QuYyxcbiAgICBvOiBpbnN0Lm8sXG4gICAgbG9jOiBpbnN0LmxvYyxcbiAgICBpbnZhbGlkOiBpbnN0LmludmFsaWQsXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyAuLi5jdXJyZW50LCAuLi5hbHRzLCBvbGQ6IGN1cnJlbnQgfSk7XG59XG5cbi8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcbmZ1bmN0aW9uIGZpeE9mZnNldChsb2NhbFRTLCBvLCB0eikge1xuICAvLyBPdXIgVVRDIHRpbWUgaXMganVzdCBhIGd1ZXNzIGJlY2F1c2Ugb3VyIG9mZnNldCBpcyBqdXN0IGEgZ3Vlc3NcbiAgbGV0IHV0Y0d1ZXNzID0gbG9jYWxUUyAtIG8gKiA2MCAqIDEwMDA7XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuICBjb25zdCBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG5cbiAgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9XG5cbiAgLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcbiAgdXRjR3Vlc3MgLT0gKG8yIC0gbykgKiA2MCAqIDEwMDA7XG5cbiAgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG4gIGNvbnN0IG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGQuZ2V0VVRDTW9udGgoKSArIDEsXG4gICAgZGF5OiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIG1pbGxpc2Vjb25kOiBkLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICB9O1xufVxuXG4vLyBjb252ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgZXBvY2ggdGltZXN0YW1wXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59XG5cbi8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICBjb25zdCBvUHJlID0gaW5zdC5vLFxuICAgIHllYXIgPSBpbnN0LmMueWVhciArIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICBtb250aCA9IGluc3QuYy5tb250aCArIE1hdGgudHJ1bmMoZHVyLm1vbnRocykgKyBNYXRoLnRydW5jKGR1ci5xdWFydGVycykgKiAzLFxuICAgIGMgPSB7XG4gICAgICAuLi5pbnN0LmMsXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXk6XG4gICAgICAgIE1hdGgubWluKGluc3QuYy5kYXksIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSkgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci5kYXlzKSArXG4gICAgICAgIE1hdGgudHJ1bmMoZHVyLndlZWtzKSAqIDcsXG4gICAgfSxcbiAgICBtaWxsaXNUb0FkZCA9IER1cmF0aW9uLmZyb21PYmplY3Qoe1xuICAgICAgeWVhcnM6IGR1ci55ZWFycyAtIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgICBtb250aHM6IGR1ci5tb250aHMgLSBNYXRoLnRydW5jKGR1ci5tb250aHMpLFxuICAgICAgd2Vla3M6IGR1ci53ZWVrcyAtIE1hdGgudHJ1bmMoZHVyLndlZWtzKSxcbiAgICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgICBob3VyczogZHVyLmhvdXJzLFxuICAgICAgbWludXRlczogZHVyLm1pbnV0ZXMsXG4gICAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kcyxcbiAgICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIGxldCBbdHMsIG9dID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSk7XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzLCBvIH07XG59XG5cbi8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuZnVuY3Rpb24gcGFyc2VEYXRhVG9EYXRlVGltZShwYXJzZWQsIHBhcnNlZFpvbmUsIG9wdHMsIGZvcm1hdCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgICAgc3BlY2lmaWNPZmZzZXQsXG4gICAgICB9KTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXG4gICAgICBuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgJHtmb3JtYXR9YClcbiAgICApO1xuICB9XG59XG5cbi8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCwgYWxsb3daID0gdHJ1ZSkge1xuICByZXR1cm4gZHQuaXNWYWxpZFxuICAgID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICAgICAgYWxsb3daLFxuICAgICAgICBmb3JjZVNpbXBsZTogdHJ1ZSxcbiAgICAgIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9JU09EYXRlKG8sIGV4dGVuZGVkKSB7XG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBvLmMueWVhciA+IDk5OTkgfHwgby5jLnllYXIgPCAwO1xuICBsZXQgYyA9IFwiXCI7XG4gIGlmIChsb25nRm9ybWF0ICYmIG8uYy55ZWFyID49IDApIGMgKz0gXCIrXCI7XG4gIGMgKz0gcGFkU3RhcnQoby5jLnllYXIsIGxvbmdGb3JtYXQgPyA2IDogNCk7XG5cbiAgaWYgKGV4dGVuZGVkKSB7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5tb250aCk7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9IGVsc2Uge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLm1vbnRoKTtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiB0b0lTT1RpbWUobywgZXh0ZW5kZWQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpIHtcbiAgbGV0IGMgPSBwYWRTdGFydChvLmMuaG91cik7XG4gIGlmIChleHRlbmRlZCkge1xuICAgIGMgKz0gXCI6XCI7XG4gICAgYyArPSBwYWRTdGFydChvLmMubWludXRlKTtcbiAgICBpZiAoby5jLnNlY29uZCAhPT0gMCB8fCAhc3VwcHJlc3NTZWNvbmRzKSB7XG4gICAgICBjICs9IFwiOlwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5taW51dGUpO1xuICB9XG5cbiAgaWYgKG8uYy5zZWNvbmQgIT09IDAgfHwgIXN1cHByZXNzU2Vjb25kcykge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLnNlY29uZCk7XG5cbiAgICBpZiAoby5jLm1pbGxpc2Vjb25kICE9PSAwIHx8ICFzdXBwcmVzc01pbGxpc2Vjb25kcykge1xuICAgICAgYyArPSBcIi5cIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoby5jLm1pbGxpc2Vjb25kLCAzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGlmIChvLmlzT2Zmc2V0Rml4ZWQgJiYgby5vZmZzZXQgPT09IDApIHtcbiAgICAgIGMgKz0gXCJaXCI7XG4gICAgfSBlbHNlIGlmIChvLm8gPCAwKSB7XG4gICAgICBjICs9IFwiLVwiO1xuICAgICAgYyArPSBwYWRTdGFydChNYXRoLnRydW5jKC1vLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYygtby5vICUgNjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYyArPSBcIitcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gJSA2MCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYztcbn1cblxuLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5jb25zdCBkZWZhdWx0VW5pdFZhbHVlcyA9IHtcbiAgICBtb250aDogMSxcbiAgICBkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gICAgd2Vla051bWJlcjogMSxcbiAgICB3ZWVrZGF5OiAxLFxuICAgIGhvdXI6IDAsXG4gICAgbWludXRlOiAwLFxuICAgIHNlY29uZDogMCxcbiAgICBtaWxsaXNlY29uZDogMCxcbiAgfSxcbiAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICAgIG9yZGluYWw6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9O1xuXG4vLyBVbml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFycywgc29ydGVkIGJ5IGJpZ25lc3NcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgb3JkZXJlZFdlZWtVbml0cyA9IFtcbiAgICBcIndlZWtZZWFyXCIsXG4gICAgXCJ3ZWVrTnVtYmVyXCIsXG4gICAgXCJ3ZWVrZGF5XCIsXG4gICAgXCJob3VyXCIsXG4gICAgXCJtaW51dGVcIixcbiAgICBcInNlY29uZFwiLFxuICAgIFwibWlsbGlzZWNvbmRcIixcbiAgXSxcbiAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiLFxuICB9W3VuaXQudG9Mb3dlckNhc2UoKV07XG5cbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgb3B0cykge1xuICBjb25zdCB6b25lID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKSxcbiAgICB0c05vdyA9IFNldHRpbmdzLm5vdygpO1xuXG4gIGxldCB0cywgbztcblxuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGlmICghaXNVbmRlZmluZWQob2JqLnllYXIpKSB7XG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9ialt1XSkpIHtcbiAgICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG9iaik7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KTtcbiAgICBbdHMsIG9dID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgdHMgPSB0c05vdztcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0cywgem9uZSwgbG9jLCBvIH0pO1xufVxuXG5mdW5jdGlvbiBkaWZmUmVsYXRpdmUoc3RhcnQsIGVuZCwgb3B0cykge1xuICBjb25zdCByb3VuZCA9IGlzVW5kZWZpbmVkKG9wdHMucm91bmQpID8gdHJ1ZSA6IG9wdHMucm91bmQsXG4gICAgZm9ybWF0ID0gKGMsIHVuaXQpID0+IHtcbiAgICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZW5kLmxvYy5jbG9uZShvcHRzKS5yZWxGb3JtYXR0ZXIob3B0cyk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChjLCB1bml0KTtcbiAgICB9LFxuICAgIGRpZmZlciA9ICh1bml0KSA9PiB7XG4gICAgICBpZiAob3B0cy5jYWxlbmRhcnkpIHtcbiAgICAgICAgaWYgKCFlbmQuaGFzU2FtZShzdGFydCwgdW5pdCkpIHtcbiAgICAgICAgICByZXR1cm4gZW5kLnN0YXJ0T2YodW5pdCkuZGlmZihzdGFydC5zdGFydE9mKHVuaXQpLCB1bml0KS5nZXQodW5pdCk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgaWYgKG9wdHMudW5pdCkge1xuICAgIHJldHVybiBmb3JtYXQoZGlmZmVyKG9wdHMudW5pdCksIG9wdHMudW5pdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygb3B0cy51bml0cykge1xuICAgIGNvbnN0IGNvdW50ID0gZGlmZmVyKHVuaXQpO1xuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3RhcnQgPiBlbmQgPyAtMCA6IDAsIG9wdHMudW5pdHNbb3B0cy51bml0cy5sZW5ndGggLSAxXSk7XG59XG5cbmZ1bmN0aW9uIGxhc3RPcHRzKGFyZ0xpc3QpIHtcbiAgbGV0IG9wdHMgPSB7fSxcbiAgICBhcmdzO1xuICBpZiAoYXJnTGlzdC5sZW5ndGggPiAwICYmIHR5cGVvZiBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICBvcHRzID0gYXJnTGlzdFthcmdMaXN0Lmxlbmd0aCAtIDFdO1xuICAgIGFyZ3MgPSBBcnJheS5mcm9tKGFyZ0xpc3QpLnNsaWNlKDAsIGFyZ0xpc3QubGVuZ3RoIC0gMSk7XG4gIH0gZWxzZSB7XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCk7XG4gIH1cbiAgcmV0dXJuIFtvcHRzLCBhcmdzXTtcbn1cblxuLyoqXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XG4gKlxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIERhdGVUaW1lI2xvY2FsfSwge0BsaW5rIERhdGVUaW1lI3V0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIERhdGVUaW1lI2Zyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21JU099LCB7QGxpbmsgRGF0ZVRpbWUjZnJvbUhUVFB9LCBhbmQge0BsaW5rIERhdGVUaW1lI2Zyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21KU0RhdGV9LlxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIERhdGVUaW1lI3RvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3llYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbW9udGh9LFxuICoge0BsaW5rIERhdGVUaW1lI2RheX0sIHtAbGluayBEYXRlVGltZSNob3VyfSwge0BsaW5rIERhdGVUaW1lI21pbnV0ZX0sIHtAbGluayBEYXRlVGltZSNzZWNvbmR9LCB7QGxpbmsgRGF0ZVRpbWUjbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayBEYXRlVGltZSN3ZWVrWWVhcn0sIHtAbGluayBEYXRlVGltZSN3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayBEYXRlVGltZSN3ZWVrZGF5fSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIERhdGVUaW1lI2xvY2FsZX0gYW5kIHtAbGluayBEYXRlVGltZSNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIERhdGVUaW1lI3NldH0sIHtAbGluayBEYXRlVGltZSNyZWNvbmZpZ3VyZX0sIHtAbGluayBEYXRlVGltZSNzZXRab25lfSwge0BsaW5rIERhdGVUaW1lI3NldExvY2FsZX0sIHtAbGluayBEYXRlVGltZS5wbHVzfSwge0BsaW5rIERhdGVUaW1lI21pbnVzfSwge0BsaW5rIERhdGVUaW1lI2VuZE9mfSwge0BsaW5rIERhdGVUaW1lI3N0YXJ0T2Z9LCB7QGxpbmsgRGF0ZVRpbWUjdG9VVEN9LCBhbmQge0BsaW5rIERhdGVUaW1lI3RvTG9jYWx9LlxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3RvUmVsYXRpdmV9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZUNhbGVuZGFyfSwge0BsaW5rIERhdGVUaW1lI3RvSlNPTn0sIHtAbGluayBEYXRlVGltZSN0b0lTT30sIHtAbGluayBEYXRlVGltZSN0b0hUVFB9LCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SRkMyODIyfSwge0BsaW5rIERhdGVUaW1lI3RvU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSwge0BsaW5rIERhdGVUaW1lI3RvTWlsbGlzfSBhbmQge0BsaW5rIERhdGVUaW1lI3RvSlNEYXRlfS5cbiAqXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZSB7XG4gIC8qKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIGNvbnN0IHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZTtcblxuICAgIGxldCBpbnZhbGlkID1cbiAgICAgIGNvbmZpZy5pbnZhbGlkIHx8XG4gICAgICAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fFxuICAgICAgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuXG4gICAgbGV0IGMgPSBudWxsLFxuICAgICAgbyA9IG51bGw7XG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICBjb25zdCB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcblxuICAgICAgaWYgKHVuY2hhbmdlZCkge1xuICAgICAgICBbYywgb10gPSBbY29uZmlnLm9sZC5jLCBjb25maWcub2xkLm9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl96b25lID0gem9uZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy53ZWVrRGF0YSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXNMdXhvbkRhdGVUaW1lID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbG9jYWwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgbG9jYWwoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKHsgem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIgfSkgICAgICAvL34+IG5vdywgaW4gVVMgZWFzdCBjb2FzdCB0aW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDAsIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCB7IHpvbmU6IFwidXRjXCIgfSkgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDAsIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgbG9jYWwoKSB7XG4gICAgY29uc3QgW29wdHMsIGFyZ3NdID0gbGFzdE9wdHMoYXJndW1lbnRzKSxcbiAgICAgIFt5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdID0gYXJncztcbiAgICByZXR1cm4gcXVpY2tEVCh7IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1LCB7IGxvY2FsZTogXCJmclwiIH0pIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVaIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIHV0YygpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuXG4gICAgb3B0cy56b25lID0gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHRzID0gaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU47XG4gICAgaWYgKE51bWJlci5pc05hTih0cykpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0cyxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc051bWJlcihtaWxsaXNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0LCBidXQgcmVjZWl2ZWQgYSAke3R5cGVvZiBtaWxsaXNlY29uZHN9IHdpdGggdmFsdWUgJHttaWxsaXNlY29uZHN9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA8IC1NQVhfREFURSB8fCBtaWxsaXNlY29uZHMgPiBNQVhfREFURSkge1xuICAgICAgLy8gdGhpcyBpc24ndCBwZXJmZWN0IGJlY2F1c2UgYmVjYXVzZSB3ZSBjYW4gc3RpbGwgZW5kIHVwIG91dCBvZiByYW5nZSBiZWNhdXNlIG9mIGFkZGl0aW9uYWwgc2hpZnRpbmcsIGJ1dCBpdCdzIGEgc3RhcnRcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiVGltZXN0YW1wIG91dCBvZiByYW5nZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAobWVhbmluZyBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU2Vjb25kcyhzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICd1dGMnIH0pLFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdsb2NhbCcgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSwgeyB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBvYmogPSBvYmogfHwge307XG4gICAgY29uc3Qgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICBpZiAoIXpvbmVUb1VzZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZVRvVXNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9ICFpc1VuZGVmaW5lZChvcHRzLnNwZWNpZmljT2Zmc2V0KVxuICAgICAgICA/IG9wdHMuc3BlY2lmaWNPZmZzZXRcbiAgICAgICAgOiB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKTtcblxuICAgIC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IChub3JtYWxpemVkLndlZWtkYXkgJiYgIWNvbnRhaW5zR3JlZ29yKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgbGV0IHVuaXRzLFxuICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG4gICAgaWYgKHVzZVdlZWtEYXRhKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRXZWVrVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFdlZWtVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9XZWVrKG9iak5vdyk7XG4gICAgfSBlbHNlIGlmIChjb250YWluc09yZGluYWwpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZE9yZGluYWxVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub09yZGluYWwob2JqTm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgbGV0IGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdW5pdHMpIHtcbiAgICAgIGNvbnN0IHYgPSBub3JtYWxpemVkW3VdO1xuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgd2UgaGF2ZSBhcmUgaW4gcmFuZ2VcbiAgICBjb25zdCBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHRpbWVcbiAgICBjb25zdCBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IG5vcm1hbGl6ZWQsXG4gICAgICBbdHNGaW5hbCwgb2Zmc2V0RmluYWxdID0gb2JqVG9UUyhncmVnb3JpYW4sIG9mZnNldFByb3Zpcywgem9uZVRvVXNlKSxcbiAgICAgIGluc3QgPSBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogdHNGaW5hbCxcbiAgICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgICBvOiBvZmZzZXRGaW5hbCxcbiAgICAgICAgbG9jLFxuICAgICAgfSk7XG5cbiAgICAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcbiAgICBpZiAobm9ybWFsaXplZC53ZWVrZGF5ICYmIGNvbnRhaW5zR3JlZ29yICYmIG9iai53ZWVrZGF5ICE9PSBpbnN0LndlZWtkYXkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFxuICAgICAgICBcIm1pc21hdGNoZWQgd2Vla2RheVwiLFxuICAgICAgICBgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtub3JtYWxpemVkLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtpbnN0LnRvSVNPKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIklTTyA4NjAxXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCdGcmksIDI1IE5vdiAyMDE2IDEzOjIzOjEyICswNjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVJGQzI4MjJEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiUkZDIDI4MjJcIiwgdGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSFRUUCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUhUVFBEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZy5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLiBGb3IgYSB0YWJsZSBvZiB0b2tlbnMgYW5kIHRoZWlyIGludGVycHJldGF0aW9ucywgc2VlIFtoZXJlXShodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9wYXJzaW5nP2lkPXRhYmxlLW9mLXRva2VucykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgdGhlIGxpbmsgYmVsb3cgZm9yIHRoZSBmb3JtYXRzKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdHMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgW3ZhbHMsIHBhcnNlZFpvbmUsIHNwZWNpZmljT2Zmc2V0LCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVNRTCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVNRTCh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4cGxhbmF0aW9uPW51bGxdIC0gbG9uZ2VyIGV4cGxhbmF0aW9uLCBtYXkgaW5jbHVkZSBwYXJhbWV0ZXJzIGFuZCBvdGhlciB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IGludmFsaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIERhdGVUaW1lLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNEYXRlVGltZShvKSB7XG4gICAgcmV0dXJuIChvICYmIG8uaXNMdXhvbkRhdGVUaW1lKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8vIElORk9cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGZyb20gaW52YWxpZCBjYWxlbmRhciBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgMTN0aCBtb250aCBvciBGZWJydWFyeSAzMFxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEYXRlVGltZSBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2NhbGUgb2YgYSBEYXRlVGltZSwgc3VjaCAnZW4tR0InLiBUaGUgbG9jYWxlIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSB6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERhdGVUaW1lLlxuICAgKiBAdHlwZSB7Wm9uZX1cbiAgICovXG4gIGdldCB6b25lKCkge1xuICAgIHJldHVybiB0aGlzLl96b25lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdGltZSB6b25lLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHpvbmVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB5ZWFyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmRheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5zZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMiwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxuICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmRpbmFsIChtZWFuaW5nIHRoZSBkYXkgb2YgdGhlIHllYXIpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XG4gICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgb3JkaW5hbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBtb250aFNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcInNob3J0XCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoTG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJsb25nXCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2Vla2RheVNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5TG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm9mZnNldCAvLz0+IC0yNDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gK3RoaXMubyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgb2Zmc2V0TmFtZVNob3J0KCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lTG9uZygpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICBmb3JtYXQ6IFwibG9uZ1wiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGlzIHpvbmUncyBvZmZzZXQgZXZlciBjaGFuZ2VzLCBhcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNPZmZzZXRGaXhlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLmlzVW5pdmVyc2FsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5EU1QoKSB7XG4gICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHsgbW9udGg6IDEgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogNSB9KS5vZmZzZXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc0luTGVhcFllYXIoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAzKS5kYXlzSW5Nb250aCAvLz0+IDMxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luTW9udGgoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrc0luV2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGZvcm1hdHRpbmcgbWV0aG9kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgcmVzb2x2ZWRMb2NhbGVPcHRpb25zKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBGb3JtYXR0ZXIuY3JlYXRlKFxuICAgICAgdGhpcy5sb2MuY2xvbmUob3B0cyksXG4gICAgICBvcHRzXG4gICAgKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7XG4gICAgcmV0dXJuIHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhciB9O1xuICB9XG5cbiAgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgRGF0ZVRpbWUjc2V0Wm9uZX0oJ3V0YycpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvVVRDKG9mZnNldCA9IDAsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byBgc2V0Wm9uZSgnbG9jYWwnKWBcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBEYXRlVGltZSNwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0gYW5kIHtAbGluayBEYXRlVGltZSN0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAnVVRDKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIERhdGVUaW1lI1pvbmV9IGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXRab25lKHpvbmUsIHsga2VlcExvY2FsVGltZSA9IGZhbHNlLCBrZWVwQ2FsZW5kYXJUaW1lID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdUUyA9IHRoaXMudHM7XG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldEd1ZXNzID0gem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgICAgIGNvbnN0IGFzT2JqID0gdGhpcy50b09iamVjdCgpO1xuICAgICAgICBbbmV3VFNdID0gb2JqVG9UUyhhc09iaiwgb2Zmc2V0R3Vlc3MsIHpvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyB0byBzZXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgbG9jIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBKdXN0IGEgY29udmVuaWVudCBhbGlhcyBmb3IgcmVjb25maWd1cmUoeyBsb2NhbGUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIFlvdSBjYW4gb25seSBzZXQgdW5pdHMgd2l0aCB0aGlzIG1ldGhvZDsgZm9yIFwic2V0dGluZ1wiIG1ldGFkYXRhLCBzZWUge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSBhbmQge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyBob3VyOiA4LCBtaW51dGU6IDMwIH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHdlZWtkYXk6IDUgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPVxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyO1xuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGxldCBtaXhlZDtcbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oeyAuLi5ncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgLi4ubm9ybWFsaXplZCB9KTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IHsgLi4udGhpcy50b09iamVjdCgpLCAuLi5ub3JtYWxpemVkIH07XG5cbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbdHMsIG9dID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHRzLCBvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqXG4gICAqIEFkZGluZyBob3VycywgbWludXRlcywgc2Vjb25kcywgb3IgbWlsbGlzZWNvbmRzIGluY3JlYXNlcyB0aGUgdGltZXN0YW1wIGJ5IHRoZSByaWdodCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBZGRpbmcgZGF5cywgbW9udGhzLCBvciB5ZWFycyBzaGlmdHMgdGhlIGNhbGVuZGFyLCBhY2NvdW50aW5nIGZvciBEU1RzIGFuZCBsZWFwIHllYXJzIGFsb25nIHRoZSB3YXkuIFRodXMsIGBkdC5wbHVzKHsgaG91cnM6IDI0IH0pYCBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHRpbWUgdGhhbiBgZHQucGx1cyh7IGRheXM6IDEgfSlgIGlmIHRoZXJlJ3MgYSBEU1Qgc2hpZnQgaW4gYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKDEyMykgLy9+PiBpbiAxMjMgbWlsbGlzZWNvbmRzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IC0xIH0pIC8vfj4gdGhpcyB0aW1lIHllc3RlcmRheVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBwbHVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0IGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICogU2VlIHtAbGluayBEYXRlVGltZSNwbHVzfVxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbikubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd3ZWVrJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDMnLCB3ZWVrcyBhbHdheXMgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBvID0ge30sXG4gICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInF1YXJ0ZXJzXCI6XG4gICAgICBjYXNlIFwibW9udGhzXCI6XG4gICAgICAgIG8uZGF5ID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwibWludXRlc1wiOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbm8gZGVmYXVsdCwgaW52YWxpZCB1bml0cyB0aHJvdyBpbiBub3JtYWxpemVVbml0KClcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgY29uc3QgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAobWVhbmluZyB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3dlZWsnKS50b0lTTygpOyAvLyA9PiAnMjAxNC0wMy0wOVQyMzo1OTo1OS45OTktMDU6MDAnLCB3ZWVrcyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIGVuZE9mKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IHRoaXMucGx1cyh7IFt1bml0XTogMSB9KVxuICAgICAgICAgIC5zdGFydE9mKHVuaXQpXG4gICAgICAgICAgLm1pbnVzKDEpXG4gICAgICA6IHRoaXM7XG4gIH1cblxuICAvLyBPVVRQVVRcblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvZm9ybWF0dGluZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2ZyJykudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJykgLy89PiAnMjAxNyBhdnIuIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnLCB7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0KGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIGZvcm1hdE9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogJ2VuLWdiJyB9KTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyB3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHVyc2RheSwgQXByaWwgMjAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JywgaG91ckN5Y2xlOiAnaDIzJyB9KTsgLy89PiAnMTE6MzInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvTG9jYWxlU3RyaW5nKGZvcm1hdE9wdHMgPSBGb3JtYXRzLkRBVEVfU0hPUlQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgZm9ybWF0T3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcylcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIG1lYW5pbmcgaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVBhcnRzKCk7IC8vPT4gW1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cbiAgICovXG4gIHRvTG9jYWxlUGFydHMob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODMsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMjAxNzA0MjJUMjA0NzA1LjMzNS0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTyh7XG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gZmFsc2UsXG4gICAgaW5jbHVkZU9mZnNldCA9IHRydWUsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBmb3JtYXQgPT09IFwiZXh0ZW5kZWRcIjtcblxuICAgIGxldCBjID0gdG9JU09EYXRlKHRoaXMsIGV4dCk7XG4gICAgYyArPSBcIlRcIjtcbiAgICBjICs9IHRvSVNPVGltZSh0aGlzLCBleHQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0b0lTT0RhdGUodGhpcywgZm9ybWF0ID09PSBcImV4dGVuZGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3Mgd2VlayBkYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09XZWVrRGF0ZSgpIC8vPT4gJzE5ODItVzIxLTInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPV2Vla0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcImtra2stJ1cnV1ctY1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVQcmVmaXg9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgYFRgIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0LCBzZWNvbmRzOiAwLCBtaWxsaXNlY29uZHM6IDAgfSkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMDczNDE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMDc6MzQ6MTkuMzYxWidcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKHtcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQgPSB0cnVlLFxuICAgIGluY2x1ZGVQcmVmaXggPSBmYWxzZSxcbiAgICBmb3JtYXQgPSBcImV4dGVuZGVkXCIsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgYyA9IGluY2x1ZGVQcmVmaXggPyBcIlRcIiA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgK1xuICAgICAgdG9JU09UaW1lKHRoaXMsIGZvcm1hdCA9PT0gXCJleHRlbmRlZFwiLCBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzLCBpbmNsdWRlT2Zmc2V0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWlpcIiwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy4gVGhlIG91dHB1dCBpcyBhbHdheXMgZXhwcmVzc2VkIGluIEdNVC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdG9JU09EYXRlKHRoaXMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGxldCBmbXQgPSBcIkhIOm1tOnNzLlNTU1wiO1xuXG4gICAgaWYgKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgIGZtdCArPSBcIiBcIjtcbiAgICAgIGlmIChpbmNsdWRlWm9uZSkge1xuICAgICAgICBmbXQgKz0gXCJ6XCI7XG4gICAgICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgICAgZm10ICs9IFwiWlpcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIGZtdCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUwob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKG9wdHMpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayBEYXRlVGltZSN0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvU2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyAvIDEwMDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHRvT2JqZWN0KG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBiYXNlID0geyAuLi50aGlzLmMgfTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9XG4gICAqL1xuICB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH1cblxuICAvLyBDT01QQVJFXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIGFycmF5IG9mIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xuICAgKiBpMi5kaWZmKGkxKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDQzODA3NTAwMDAwIH1cbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XG4gICAqIGkyLmRpZmYoaTEsIFsnbW9udGhzJywgJ2RheXMnLCAnaG91cnMnXSkudG9PYmplY3QoKSAvLz0+IHsgbW9udGhzOiAxNiwgZGF5czogMTksIGhvdXJzOiAwLjc1IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1ck9wdHMgPSB7IGxvY2FsZTogdGhpcy5sb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogdGhpcy5udW1iZXJpbmdTeXN0ZW0sIC4uLm9wdHMgfTtcblxuICAgIGNvbnN0IHVuaXRzID0gbWF5YmVBcnJheSh1bml0KS5tYXAoRHVyYXRpb24ubm9ybWFsaXplVW5pdCksXG4gICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgbGF0ZXIgPSBvdGhlcklzTGF0ZXIgPyBvdGhlckRhdGVUaW1lIDogdGhpcyxcbiAgICAgIGRpZmZlZCA9IGRpZmYoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBkdXJPcHRzKTtcblxuICAgIHJldHVybiBvdGhlcklzTGF0ZXIgPyBkaWZmZWQubmVnYXRlKCkgOiBkaWZmZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgcmlnaHQgbm93LlxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lI2RpZmZ9XG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmTm93KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHVudGlsKG90aGVyRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyh0aGlzLCBvdGhlckRhdGVUaW1lKSA6IHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICBjb25zdCBhZGp1c3RlZFRvWm9uZSA9IHRoaXMuc2V0Wm9uZShvdGhlckRhdGVUaW1lLnpvbmUsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYWRqdXN0ZWRUb1pvbmUuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gYWRqdXN0ZWRUb1pvbmUuZW5kT2YodW5pdCk7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09ICtkdDJgLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlciAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNWYWxpZCAmJlxuICAgICAgb3RoZXIuaXNWYWxpZCAmJlxuICAgICAgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJlxuICAgICAgdGhpcy56b25lLmVxdWFscyhvdGhlci56b25lKSAmJlxuICAgICAgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGlzIHRpbWUgcmVsYXRpdmUgdG8gbm93LCBzdWNoIGFzIFwiaW4gdHdvIGRheXNcIi4gQ2FuIG9ubHkgaW50ZXJuYXRpb25hbGl6ZSBpZiB5b3VyXG4gICAqIHBsYXRmb3JtIHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LiBSb3VuZHMgZG93biBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9XCJsb25nXCJdIC0gdGhlIHN0eWxlIG9mIHVuaXRzLCBtdXN0IGJlIFwibG9uZ1wiLCBcInNob3J0XCIsIG9yIFwibmFycm93XCJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHM7IGlmIG9taXR0ZWQsIG9yIGFuIGFycmF5LCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgYmVzdCB1bml0LiBVc2UgYW4gYXJyYXkgb3Igb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBvciBcInNlY29uZHNcIlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJvdW5kPXRydWVdIC0gd2hldGhlciB0byByb3VuZCB0aGUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSAtIHBhZGRpbmcgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIGFsbG93cyB5b3UgdG8gcm91bmQgdXAgdGhlIHJlc3VsdCBpZiBpdCBmaXRzIGluc2lkZSB0aGUgdGhyZXNob2xkLiBEb24ndCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCB7cm91bmQ6IGZhbHNlfSBiZWNhdXNlIHRoZSBkZWNpbWFsIG91dHB1dCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiaW4gMSBkYXlcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS50b1JlbGF0aXZlKHsgZGF5czogMSB9KSAvLz0+IFwiZGVudHJvIGRlIDEgZFx1MDBFRGFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRhbnMgMjMgaGV1cmVzXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlKHsgdW5pdDogXCJob3Vyc1wiIH0pIC8vPT4gXCI0OCBob3VycyBhZ29cIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGhvdXJzOiAzNiB9KS50b1JlbGF0aXZlKHsgcm91bmQ6IGZhbHNlIH0pIC8vPT4gXCIxLjUgZGF5cyBhZ29cIlxuICAgKi9cbiAgdG9SZWxhdGl2ZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZSA9IG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcgPyAodGhpcyA8IGJhc2UgPyAtb3B0aW9ucy5wYWRkaW5nIDogb3B0aW9ucy5wYWRkaW5nKSA6IDA7XG4gICAgbGV0IHVuaXRzID0gW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXTtcbiAgICBsZXQgdW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnVuaXQpKSB7XG4gICAgICB1bml0cyA9IG9wdGlvbnMudW5pdDtcbiAgICAgIHVuaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkaWZmUmVsYXRpdmUoYmFzZSwgdGhpcy5wbHVzKHBhZGRpbmcpLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbnVtZXJpYzogXCJhbHdheXNcIixcbiAgICAgIHVuaXRzLFxuICAgICAgdW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGF0ZSByZWxhdGl2ZSB0byB0b2RheSwgc3VjaCBhcyBcInllc3RlcmRheVwiIG9yIFwibmV4dCBtb250aFwiLlxuICAgKiBPbmx5IGludGVybmF0aW9uYWxpemVzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sb2NhbGUgLSBvdmVycmlkZSB0aGUgbG9jYWxlIG9mIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQ7IGlmIG9taXR0ZWQsIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSB1bml0LiBVc2Ugb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIG9yIFwiZGF5c1wiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKCkgLy89PiBcInRvbW9ycm93XCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKFwiZXNcIikucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJcIm1hXHUwMEYxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlQ2FsZW5kYXIob3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShvcHRpb25zLmJhc2UgfHwgRGF0ZVRpbWUuZnJvbU9iamVjdCh7fSwgeyB6b25lOiB0aGlzLnpvbmUgfSksIHRoaXMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImF1dG9cIixcbiAgICAgIHVuaXRzOiBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIl0sXG4gICAgICBjYWxlbmRhcnk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1pbiguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1pbik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtYXggb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1heCguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1heCk7XG4gIH1cblxuICAvLyBNSVNDXG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdGlvbnMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlIDEwLzE0LzE5ODNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9TSE9SVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9NRUQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCBPY3QgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9GVUxMKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdUdWVzZGF5LCBPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfU0lNUExFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9MT05HX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgMTQgT2N0IDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9XRUVLREFZO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RGF0ZVRpbWUoZGF0ZVRpbWVpc2gpIHtcbiAgaWYgKERhdGVUaW1lLmlzRGF0ZVRpbWUoZGF0ZVRpbWVpc2gpKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1laXNoO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIGRhdGVUaW1laXNoLnZhbHVlT2YgJiYgaXNOdW1iZXIoZGF0ZVRpbWVpc2gudmFsdWVPZigpKSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiB0eXBlb2YgZGF0ZVRpbWVpc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6ICR7ZGF0ZVRpbWVpc2h9LCBvZiB0eXBlICR7dHlwZW9mIGRhdGVUaW1laXNofWBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBJbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4vem9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5pbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgVkVSU0lPTiA9IFwiMi4zLjBcIjtcblxuZXhwb3J0IHtcbiAgVkVSU0lPTixcbiAgRGF0ZVRpbWUsXG4gIER1cmF0aW9uLFxuICBJbnRlcnZhbCxcbiAgSW5mbyxcbiAgWm9uZSxcbiAgRml4ZWRPZmZzZXRab25lLFxuICBJQU5BWm9uZSxcbiAgSW52YWxpZFpvbmUsXG4gIFN5c3RlbVpvbmUsXG4gIFNldHRpbmdzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkXHUwMEU5alx1MDBFMCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tIFwianVnZ2wtYXBpXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIEV2ZW50UmVmLCBNYXJrZG93blZpZXcsIFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEZlYXRoZXJJY29uLFxyXG4gIG9wZW5WaWV3LFxyXG4gIHdhaXQsXHJcbn0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgeyBCQ0FQSSB9IGZyb20gXCIuL0FQSVwiO1xyXG5pbXBvcnQgeyBEZWJ1Z2dlciB9IGZyb20gXCJzcmMvRGVidWdnZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwgfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJOb3RlTW9kYWxcIjtcclxuaW1wb3J0IHsgZ2V0Q29kZWJsb2NrQ0IgfSBmcm9tIFwiLi9Db2RlYmxvY2tzXCI7XHJcbmltcG9ydCB7IGNvcHlHbG9iYWxJbmRleCwgY29weUxvY2FsSW5kZXggfSBmcm9tIFwiLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgeyBqdW1wVG9GaXJzdERpciB9IGZyb20gXCIuL0NvbW1hbmRzL2p1bXBUb0ZpcnN0RGlyXCI7XHJcbmltcG9ydCB7IHRocmVhZCB9IGZyb20gXCIuL0NvbW1hbmRzL3RocmVhZGluZ1wiO1xyXG5pbXBvcnQgeyB3cml0ZUJDc1RvQWxsRmlsZXMsIHdyaXRlQkNUb0ZpbGUgfSBmcm9tIFwiLi9Db21tYW5kcy9Xcml0ZUJDc1wiO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfU0VUVElOR1MsXHJcbiAgRFVDS19JQ09OLFxyXG4gIERVQ0tfSUNPTl9TVkcsXHJcbiAgRFVDS19WSUVXLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbiAgVFJBSUxfSUNPTl9TVkcsXHJcbiAgVFJFRV9WSUVXLFxyXG4gIEFQSV9OQU1FLFxyXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBGaWVsZFN1Z2dlc3RvciB9IGZyb20gXCIuL0ZpZWxkU3VnZ2VzdG9yXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ0FQSUksXHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIE15VmlldyxcclxuICBWaWV3SW5mbyxcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkQ2xvc2VkRywgYnVpbGRNYWluRywgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IFJlbGF0aW9uU3VnZ2VzdG9yIH0gZnJvbSBcIi4vUmVsYXRpb25TdWdnZXN0b3JcIjtcclxuaW1wb3J0IHsgQkNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vU2V0dGluZ3MvQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyB3YWl0Rm9yQ2FjaGUgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCBEdWNrc1ZpZXcgZnJvbSBcIi4vVmlld3MvRHVja3NWaWV3XCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHsgZHJhd1RyYWlsIH0gZnJvbSBcIi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBUcmVlVmlldyBmcm9tIFwiLi9WaWV3cy9UcmVlVmlld1wiO1xyXG5pbXBvcnQgeyBCQ1N0b3JlIH0gZnJvbSBcIi4vVmlzdWFsaXNhdGlvbnMvSnVnZ2xcIjtcclxuaW1wb3J0IHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG5cclxuICB2aXNpdGVkOiBbc3RyaW5nLCBIVE1MRGl2RWxlbWVudF1bXSA9IFtdO1xyXG5cclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBhY3RpdmVMZWFmQ2hhbmdlOiBFdmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICBsYXlvdXRDaGFuZ2U6IEV2ZW50UmVmID0gdW5kZWZpbmVkO1xyXG5cclxuICBkYjogRGVidWdnZXI7XHJcblxyXG4gIFZJRVdTOiBWaWV3SW5mb1tdO1xyXG5cclxuICBhcGk6IEJDQVBJSTtcclxuICBwcml2YXRlIGJjU3RvcmU6IEJDU3RvcmU7XHJcblxyXG4gIHJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCkge1xyXG4gICAgdGhpcy5hY3RpdmVMZWFmQ2hhbmdlID0gYXBwLndvcmtzcGFjZS5vbihcclxuICAgICAgXCJmaWxlLW9wZW5cIixcclxuICAgICAgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UpIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKTtcclxuICAgICAgICAgIGlmIChhY3RpdmVWaWV3KSBhd2FpdCBhY3RpdmVWaWV3LmRyYXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hY3RpdmVMZWFmQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyTGF5b3V0Q2hhbmdlRXZlbnQoKSB7XHJcbiAgICB0aGlzLmxheW91dENoYW5nZSA9IGFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5sYXlvdXRDaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIGJyZWFkY3J1bWJzIHBsdWdpblwiKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBCQ1NldHRpbmdUYWIodGhpcykpO1xyXG5cclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIodGhpcyk7XHJcblxyXG4gICAgY29uc3QgeyBzZXR0aW5ncyB9ID0gdGhpcztcclxuICAgIGNvbnN0IHtcclxuICAgICAgZmllbGRTdWdnZXN0b3IsXHJcbiAgICAgIGVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yLFxyXG4gICAgICBvcGVuTWF0cml4T25Mb2FkLFxyXG4gICAgICBvcGVuRHVja09uTG9hZCxcclxuICAgICAgb3BlbkRvd25PbkxvYWQsXHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIHVzZXJIaWVycyxcclxuICAgIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZmllbGRTdWdnZXN0b3IpIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBGaWVsZFN1Z2dlc3Rvcih0aGlzKSk7XHJcbiAgICBpZiAoZW5hYmxlUmVsYXRpb25TdWdnZXN0b3IpXHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBSZWxhdGlvblN1Z2dlc3Rvcih0aGlzKSk7XHJcblxyXG5cclxuICAgIC8vIE92ZXJyaWRlIG9sZGVyIHZlcnNpb25zIG9mIHRoZXNlIHNldHRpbmdzXHJcbiAgICBpZiAoc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMubGVuZ3RoID09PSAwKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzLnNob3dBbGwgPT09ICdib29sZWFuJykgc2V0dGluZ3Muc2hvd0FsbCA9IHNldHRpbmdzLnNob3dBbGwgPyAnQWxsJyA6ICdTaG9ydGVzdCdcclxuXHJcbiAgICB0aGlzLlZJRVdTID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgcGxhaW46IFwiTWF0cml4XCIsXHJcbiAgICAgICAgdHlwZTogTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IE1hdHJpeFZpZXcsXHJcbiAgICAgICAgb3Blbk9uTG9hZDogb3Blbk1hdHJpeE9uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkR1Y2tcIixcclxuICAgICAgICB0eXBlOiBEVUNLX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IER1Y2tzVmlldyxcclxuICAgICAgICBvcGVuT25Mb2FkOiBvcGVuRHVja09uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkRvd25cIixcclxuICAgICAgICB0eXBlOiBUUkVFX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IFRyZWVWaWV3LFxyXG4gICAgICAgIG9wZW5PbkxvYWQ6IG9wZW5Eb3duT25Mb2FkLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgY29uc3RydWN0b3IsIHR5cGUgfSBvZiB0aGlzLlZJRVdTKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHR5cGUsIChsZWFmKSA9PiBuZXcgY29uc3RydWN0b3IobGVhZiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEljb24oRFVDS19JQ09OLCBEVUNLX0lDT05fU1ZHKTtcclxuICAgIGFkZEljb24oVFJBSUxfSUNPTiwgVFJBSUxfSUNPTl9TVkcpO1xyXG5cclxuICAgIGF3YWl0IHdhaXRGb3JDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMubWFpbkcgPSBhd2FpdCBidWlsZE1haW5HKHRoaXMpO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG5cclxuICAgIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMubWFpbkc/Lm5vZGVzKCkubGVuZ3RoIDwgbm9GaWxlcykge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoMzAwMCk7XHJcbiAgICAgICAgdGhpcy5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHsgb3Blbk9uTG9hZCwgdHlwZSwgY29uc3RydWN0b3IgfSBvZiB0aGlzLlZJRVdTKVxyXG4gICAgICAgIGlmIChvcGVuT25Mb2FkKSBhd2FpdCBvcGVuVmlldyh0eXBlLCBjb25zdHJ1Y3Rvcik7XHJcblxyXG4gICAgICBpZiAoc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJMYXlvdXRDaGFuZ2VFdmVudCgpO1xyXG5cclxuICAgICAgLy8gU291cmNlIGZvciBzYXZlIHNldHRpbmdcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpcHN0ZXJzbW9vdGhpZS9vYnNpZGlhbi1wbHVnaW4tcHJldHRpZXIvYmxvYi9tYWluL3NyYy9tYWluLnRzXHJcbiAgICAgIGNvbnN0IHNhdmVDb21tYW5kRGVmaW5pdGlvbiA9XHJcbiAgICAgICAgYXBwLmNvbW1hbmRzLmNvbW1hbmRzW1wiZWRpdG9yOnNhdmUtZmlsZVwiXTtcclxuICAgICAgY29uc3Qgc2F2ZSA9IHNhdmVDb21tYW5kRGVmaW5pdGlvbj8uY2FsbGJhY2s7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNhdmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHNhdmVDb21tYW5kRGVmaW5pdGlvbi5jYWxsYmFjayA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGF3YWl0IHNhdmUoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVTYXZlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHRoaXMuZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlVmlldykgYXdhaXQgYWN0aXZlVmlldy5kcmF3KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XHJcbiAgICAgICAgaWYgKGxlYWYgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpXHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIGxlYWYudmlldy5wcmV2aWV3TW9kZS5yZXJlbmRlcih0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgdHlwZSwgcGxhaW4sIGNvbnN0cnVjdG9yIH0gb2YgdGhpcy5WSUVXUykge1xyXG4gICAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICAgIGlkOiBgc2hvdy0ke3R5cGV9LXZpZXdgLFxyXG4gICAgICAgIG5hbWU6IGBPcGVuICR7cGxhaW59IFZpZXdgLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGNoZWNrQ2FsbGJhY2s6IGFzeW5jIChjaGVja2luZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSkubGVuZ3RoID09PSAwO1xyXG4gICAgICAgICAgYXdhaXQgb3BlblZpZXcodHlwZSwgY29uc3RydWN0b3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIm9wZW4tdmlzLW1vZGFsXCIsXHJcbiAgICAgIG5hbWU6IFwiT3BlbiBWaXN1YWxpc2F0aW9uIE1vZGFsXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgVmlzTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwibWFuaXB1bGF0ZS1oaWVyYXJjaHktbm90ZXNcIixcclxuICAgICAgbmFtZTogXCJBZGp1c3QgSGllcmFyY2h5IE5vdGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwiUmVmcmVzaC1CcmVhZGNydW1icy1JbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIlJlZnJlc2ggQnJlYWRjcnVtYnMgSW5kZXhcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIlRvZ2dsZS10cmFpbC1pbi1FZGl0JkxQXCIsXHJcbiAgICAgIG5hbWU6IFwiVG9nZ2xlOiBTaG93IFRyYWlsL0dyaWQgaW4gRWRpdCAmIExQIG1vZGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlID0gIXNldHRpbmdzLnNob3dCQ3NJbkVkaXRMUE1vZGU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwodGhpcyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1DdXJyZW50LUZpbGVcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byBDdXJyZW50IEZpbGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHdyaXRlQkNUb0ZpbGUodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1BbGwtRmlsZXNcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byAqKkFMTCoqIEZpbGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB3cml0ZUJDc1RvQWxsRmlsZXModGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJsb2NhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBMb2NhbCBJbmRleCB0byB0aGUgY2xpcGJvYXJkXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBjb3B5TG9jYWxJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImdsb2JhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBHbG9iYWwgSW5kZXggdG8gdGhlIGNsaXBib2FyZFwiLFxyXG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gYXdhaXQgY29weUdsb2JhbEluZGV4KHRoaXMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgW1widXBcIiwgXCJkb3duXCIsIFwibmV4dFwiLCBcInByZXZcIl0uZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgaWQ6IGBqdW1wLXRvLWZpcnN0LSR7ZGlyfWAsXHJcbiAgICAgICAgbmFtZTogYEp1bXAgdG8gZmlyc3QgJyR7ZGlyfSdgLFxyXG4gICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBqdW1wVG9GaXJzdERpcih0aGlzLCBkaXIpLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgICBpZDogYG5ldy1maWxlLXdpdGgtY3Vyci1hcy0ke2ZpZWxkfWAsXHJcbiAgICAgICAgbmFtZTogYENyZWF0ZSBhIG5ldyAnJHtmaWVsZH0nIGZyb20gdGhlIGN1cnJlbnQgbm90ZWAsXHJcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRocmVhZCh0aGlzLCBmaWVsZCksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFxyXG4gICAgICBhZGRGZWF0aGVySWNvbihcInR2XCIpIGFzIHN0cmluZyxcclxuICAgICAgXCJCcmVhZGNydW1icyBWaXN1YWxpc2F0aW9uXCIsXHJcbiAgICAgICgpID0+IG5ldyBWaXNNb2RhbCh0aGlzKS5vcGVuKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFxyXG4gICAgICBcImJyZWFkY3J1bWJzXCIsXHJcbiAgICAgIGdldENvZGVibG9ja0NCKHRoaXMpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoanVnZ2xQbHVnaW4pIHtcclxuICAgICAgdGhpcy5iY1N0b3JlID0gbmV3IEJDU3RvcmUodGhpcy5tYWluRywgYXBwLm1ldGFkYXRhQ2FjaGUpO1xyXG4gICAgICBqdWdnbFBsdWdpbi5yZWdpc3RlclN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGkgPSBuZXcgQkNBUEkodGhpcyk7XHJcbiAgICAvLyBSZWdpc3RlciBBUEkgdG8gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXHJcbiAgICAod2luZG93W0FQSV9OQU1FXSA9IHRoaXMuYXBpKSAmJlxyXG4gICAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IGRlbGV0ZSB3aW5kb3dbQVBJX05BTUVdKTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVRZUEVWaWV3KHR5cGU6IHN0cmluZyk6IE15VmlldyB8IG51bGwge1xyXG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpcy5WSUVXUy5maW5kKCh2aWV3KSA9PiB2aWV3LnR5cGUgPT09IHR5cGUpO1xyXG4gICAgY29uc3QgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSk7XHJcbiAgICBpZiAobGVhdmVzICYmIGxlYXZlcy5sZW5ndGggPj0gMSkge1xyXG4gICAgICBjb25zdCB7IHZpZXcgfSA9IGxlYXZlc1swXTtcclxuICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikgcmV0dXJuIHZpZXc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWRTZXR0aW5ncyA9IGFzeW5jICgpID0+XHJcbiAgKHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKFxyXG4gICAge30sXHJcbiAgICBERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpXHJcbiAgKSk7XHJcblxyXG4gIHNhdmVTZXR0aW5ncyA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblxyXG4gIG9udW5sb2FkKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJ1bmxvYWRpbmdcIik7XHJcbiAgICB0aGlzLlZJRVdTLmZvckVhY2goYXN5bmMgKHZpZXcpID0+IHtcclxuICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlldy50eXBlKS5mb3JFYWNoKChsZWFmKSA9PiB7XHJcbiAgICAgICAgbGVhZi5kZXRhY2goKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZpc2l0ZWQuZm9yRWFjaCgodmlzaXQpID0+IHZpc2l0WzFdLnJlbW92ZSgpKTtcclxuICAgIGlmICh0aGlzLmJjU3RvcmUpIHtcclxuICAgICAgY29uc3QganVnZ2xQbHVnaW4gPSBnZXRQbHVnaW4oYXBwKTtcclxuICAgICAgaWYgKGp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGp1Z2dsUGx1Z2luLnJlbW92ZVN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXJUYWdzLCBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IENBVF9EQU5HTElORyA9ICdkYW5nbGluZyc7XG5jb25zdCBDT1JFX1NUT1JFX0lEID0gJ2NvcmUnO1xuY2xhc3MgVml6SWQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmVJZDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnN0b3JlSWR9OiR7dGhpcy5pZH1gO1xuICAgIH1cbiAgICB0b0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUlkKGlkKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gaWQuc3BsaXQoJzonKTtcbiAgICAgICAgY29uc3Qgc3RvcmVJZCA9IHNwbGl0WzBdO1xuICAgICAgICBjb25zdCBfaWQgPSBzcGxpdC5zbGljZSgxKS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoX2lkLCBzdG9yZUlkKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZpeklkLmZyb21JZChub2RlLmlkKCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5vZGVzKG5vZGVzKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5tYXAoKG4pID0+IFZpeklkLmZyb21Ob2RlKG4pKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21GaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXpJZChmaWxlLm5hbWUsICdjb3JlJyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0lkKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoaWQsIHN0b3JlSWQpLnRvSWQoKTtcbiAgICB9XG59XG5jb25zdCBfcGFyc2VUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLnRhZ3NcbiAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgIHRhZyA9IHRhZy5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgaFNwbGl0ID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGhTcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgaFRhZyA9IGhTcGxpdC5zbGljZSgwLCBwYXJzZUludChpKSArIDEpLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIHRhZ3MucHVzaChgdGFnLSR7aFRhZ31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9KSk7XG59O1xuY29uc3QgZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uIChmaWxlLCBtZXRhZGF0YUNhY2hlKSB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgICAgICBpZiAoWydwbmcnLCAnanBnJywgJ2pwZWcnLCAnZ2lmJywgJ2JtcCcsICdzdmcnLCAndGlmZiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFsnbXAzJywgJ3dlYm0nLCAnd2F2JywgJ200YScsICdvZ2cnLCAnM2dwJywgJ2ZsYWMnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnYXVkaW8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJ21wNCcsICd3ZWJtJywgJ29ndiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd2aWRlbycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuZXh0ZW5zaW9uID09PSAncGRmJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdwZGYnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIHJlcGxhY2VkIGJ5IHRoZSAncGF0aCcgZGF0YSBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGlmICghKGZpbGUucGFyZW50Lm5hbWUgPT09ICcvJyB8fCBmaWxlLnBhcmVudC5uYW1lID09PSAnJykpIHtcbiAgICAgICAgLy8gICBjbGFzc2VzLnB1c2goYGZvbGRlci0ke2ZpbGUucGFyZW50Lm5hbWVcbiAgICAgICAgLy8gICAgICAgLnJlcGxhY2UoJyAnLCAnXycpfWApO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIGNsYXNzZXMucHVzaCgncm9vdCcpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdub3RlJyk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlPy5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgIGlmICgnaW1hZ2UnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCd0YWdzJyBpbiBjYWNoZS5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gcGFyc2VGcm9udE1hdHRlclRhZ3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3ModGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgnY3NzY2xhc3MnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ZXMgPSBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkoY2FjaGUuZnJvbnRtYXR0ZXIsICdjc3NjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenplcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLmNsYXp6ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhY2hlPy50YWdzKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3MoY2FjaGUudGFncy5tYXAoKHQpID0+IHQudGFnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBbQ0FUX0RBTkdMSU5HXTtcbn07XG5jb25zdCBub2RlRnJvbUZpbGUgPSBhc3luYyBmdW5jdGlvbiAoZmlsZSwgcGx1Z2luLCBzZXR0aW5ncywgaWQpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gVml6SWQudG9JZChmaWxlLm5hbWUsIENPUkVfU1RPUkVfSUQpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICBjb25zdCBjbGFzc2VzID0gZ2V0Q2xhc3NlcyhmaWxlLCBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUpLmpvaW4oJyAnKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgIH07XG4gICAgaWYgKFsncG5nJywgJ2pwZycsICdqcGVnJywgJ2dpZicsICdibXAnLCAnc3ZnJywgJ3RpZmYnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRhdGFbJ3Jlc291cmNlX3VybCddID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoZmlsZS5wYXRoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHsgfVxuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucmVhZENvbnRlbnQgJiYgZmlsZS5leHRlbnNpb24gPT0gJ21kJykge1xuICAgICAgICBkYXRhWydjb250ZW50J10gPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgfVxuICAgIGNvbnN0IGZyb250bWF0dGVyID0gY2FjaGU/LmZyb250bWF0dGVyO1xuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9udG1hdHRlcikuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCEoayA9PT0gJ3Bvc2l0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUZpZWxkID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cmwuIHRocm93cyBlcnJvciBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW1hZ2VGaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gaW1hZ2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoaW1hZ2VGaWVsZCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5jb25zdCBub2RlRGFuZ2xpbmcgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpZDogVml6SWQudG9JZChwYXRoLCBDT1JFX1NUT1JFX0lEKSxcbiAgICAgICAgICAgIG5hbWU6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzZXM6ICdkYW5nbGluZycsXG4gICAgfTtcbn07XG5jb25zdCB3aWtpbGlua1JlZ2V4ID0gJ1xcXFxbXFxcXFsoW15cXFxcXVxcXFxyXFxcXG5dKz8pXFxcXF1cXFxcXSc7XG5jb25zdCBuYW1lUmVnZXggPSAnW15cXFxcV1xcXFxkXVxcXFx3Kic7XG5jb25zdCByZWdleEVzY2FwZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufTtcbmNvbnN0IHBhcnNlVHlwZWRMaW5rID0gZnVuY3Rpb24gKGxpbmssIGxpbmUsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgc29tZXRoaW5nIHNwZWNpZmljIEkgdXNlLCBidXQgc2hvdWxkbid0IGtlZXAgYmVpbmcgaW4gdGhpcyByZXBvLlxuICAgIGNvbnN0IHJlZ2V4UHVibGlzaGVkSW4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleEVzY2FwZSh0eXBlZExpbmtQcmVmaXgpfSAocHVibGlzaGVkSW4pIChcXFxcZFxcXFxkXFxcXGRcXFxcZCkgKCR7d2lraWxpbmtSZWdleH0sPyAqKSskYCk7XG4gICAgY29uc3QgbWF0Y2hQSSA9IHJlZ2V4UHVibGlzaGVkSW4uZXhlYyhsaW5lKTtcbiAgICBpZiAoIShtYXRjaFBJID09PSBudWxsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6ICd0eXBlLXB1Ymxpc2hlZEluJyxcbiAgICAgICAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICB5ZWFyOiBtYXRjaFBJWzJdLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwdWJsaXNoZWRJbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBJbnR1aXRpb246IFN0YXJ0IHdpdGggdGhlIHR5cGVkIGxpbmsgcHJlZml4LiBUaGVuIGEgbmVvNGogbmFtZSAobmFtZVJlZ2V4KS5cbiAgICAvLyBUaGVuIG9uZSBvciBtb3JlIG9mIHRoZSB3aWtpbGluayBncm91cDogd2lraWxpbmsgcmVnZXggc2VwYXJhdGVkIGJ5IG9wdGlvbmFsIGNvbW1hIGFuZCBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4RXNjYXBlKHR5cGVkTGlua1ByZWZpeCl9ICgke25hbWVSZWdleH0pICgke3dpa2lsaW5rUmVnZXh9LD8gKikrJGApO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICBjb25zdCBzcGxpdExpbmsgPSBsaW5rLm9yaWdpbmFsLnNwbGl0KCd8Jyk7XG4gICAgbGV0IGFsaWFzID0gbnVsbDtcbiAgICBpZiAoc3BsaXRMaW5rLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYWxpYXMgPSBzcGxpdExpbmsuc2xpY2UoMSkuam9pbigpLnNsaWNlKDAsIC0yKTtcbiAgICB9XG4gICAgaWYgKCEobWF0Y2ggPT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogYHR5cGUtJHttYXRjaFsxXX1gLFxuICAgICAgICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGFsaWFzOiBhbGlhcyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbmNvbnN0IHBhcnNlUmVmQ2FjaGUgPSBmdW5jdGlvbiAocmVmLCBjb250ZW50LCBpZCwgc291cmNlLCB0YXJnZXQsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W3JlZi5wb3NpdGlvbi5zdGFydC5saW5lXTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbnRleHQ6IGxpbmUsXG4gICAgICAgIGVkZ2VDb3VudDogMSxcbiAgICB9O1xuICAgIGNvbnN0IHNwbGl0TGluayA9IHJlZi5vcmlnaW5hbC5zcGxpdCgnfCcpO1xuICAgIGlmIChzcGxpdExpbmsubGVuZ3RoID4gMSkge1xuICAgICAgICBkYXRhWydhbGlhcyddID0gc3BsaXRMaW5rLnNsaWNlKDEpLmpvaW4oKS5zbGljZSgwLCAtMik7XG4gICAgfVxuICAgIGxldCBjbGFzc2VzID0gJyc7XG4gICAgY29uc3QgdHlwZWRMaW5rID0gcGFyc2VUeXBlZExpbmsocmVmLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xuICAgIGlmICh0eXBlZExpbmsgPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NlcyA9IGAke2NsYXNzZXN9IGlubGluZWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0geyAuLi50eXBlZExpbmsucHJvcGVydGllcywgLi4uZGF0YSB9O1xuICAgICAgICBjbGFzc2VzID0gYCR7Y2xhc3Nlc30gJHt0eXBlZExpbmsuY2xhc3N9YDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5cbmNvbnN0IGdldFBsdWdpbiA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCdqdWdnbCcgaW4gYXBwLnBsdWdpbnMucGx1Z2lucykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBhcHAucGx1Z2lucy5wbHVnaW5zWydqdWdnbCddO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCB7IFZpeklkLCBnZXRDbGFzc2VzLCBnZXRQbHVnaW4sIG5vZGVEYW5nbGluZywgbm9kZUZyb21GaWxlLCBwYXJzZVJlZkNhY2hlLCBwYXJzZVR5cGVkTGluayB9O1xuIiwgIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGNvbW1vbmx5IHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2lucy5cclxuICogQG1vZHVsZSBvYnNpZGlhbi1jb21tdW5pdHktbGliXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBmZWF0aGVyIGZyb20gXCJmZWF0aGVyLWljb25zXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIE1hcmtkb3duUmVuZGVyZXIsIE1hcmtkb3duVmlldywgTW9kYWwsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgcmVxdWVzdCwgVEZpbGUsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbi8qKlxyXG4gKiBZb3UgY2FuIGF3YWl0IHRoaXMgRnVuY3Rpb24gdG8gZGVsYXkgZXhlY3V0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gbXNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0KGRlbGF5KSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcclxufVxyXG4vKipcclxuICogQWRkcyBhbGwgb2ZmaWNpYWwgRmVhdGhlciBJY29ucyB0byBPYnNpZGlhbi5cclxuICogaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tL1xyXG4gKlxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKlxyXG4gKiBAZGVwcmVjYXRlZCBBcyBvZiBPYnNpZGlhbiAwLjEzLjI3IHRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYmVjYXVzZSBPYnNpZGlhbiBzaGlwcyB3aXRoIGBsdWNpZGVgLCBhIG1haW50YWluZWQgZm9yayBvZiBmZWF0aGVyLiAoaHR0cHM6Ly9sdWNpZGUuZGV2LylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxGZWF0aGVySWNvbnMoYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBPYmplY3QudmFsdWVzKGZlYXRoZXIuaWNvbnMpLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgICBjb25zdCBzdmcgPSBpLnRvU3ZnKGF0dHIpO1xyXG4gICAgICAgIGFkZEljb24oYGZlYXRoZXItJHtpLm5hbWV9YCwgc3ZnKTtcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGEgc3BlY2lmaWMgRmVhdGhlciBJY29uIHRvIE9ic2lkaWFuLlxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSBvZmZpY2lhbCBOYW1lIG9mIHRoZSBJY29uIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKVxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJY29uIG5hbWVcclxuICpcclxuICogQGRlcHJlY2F0ZWQgQXMgb2YgT2JzaWRpYW4gMC4xMy4yNyB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIGJlY2F1c2UgT2JzaWRpYW4gc2hpcHMgd2l0aCBgbHVjaWRlYCwgYSBtYWludGFpbmVkIGZvcmsgb2YgZmVhdGhlci4gKGh0dHBzOi8vbHVjaWRlLmRldi8pXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkRmVhdGhlckljb24obmFtZSwgYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBpZiAoZmVhdGhlci5pY29uc1tuYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGljb25OYW1lID0gYGZlYXRoZXItJHtuYW1lfWA7XHJcbiAgICAgICAgYWRkSWNvbihpY29uTmFtZSwgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZyhhdHRyKSk7XHJcbiAgICAgICAgcmV0dXJuIGljb25OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoaXMgSWNvbiAoJHtuYW1lfSkgZG9lc24ndCBleGlzdCBpbiB0aGUgRmVhdGhlciBMaWJyYXJ5LmApO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgYmFzZTY0IFN0cmluZyB0byBhbiBBcnJheUJ1ZmZlci5cclxuICogWW91IGNhbiB0aGVuIHVzZSB0aGUgQXJyYXlCdWZmZXIgdG8gc2F2ZSB0aGUgYXNzZXQgdG8gZGlzay5cclxuICpcclxuICogQHBhcmFtIGJhc2U2NCBiYXNlNjQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHJldHVybnMgQXJyYXlCdWZmZXJcclxuICogQGRlcHJlY2F0ZWQgT2JzaWRpYW4gb2ZmZXJzIGl0J3Mgb3duIG1ldGhvZCBhcyBvZiAwLjE0LjVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xyXG4gICAgY29uc3QgYmluYXJ5X3N0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlfc3RyaW5nLmxlbmd0aDtcclxuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlfc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgYW4gdW5kb2N1bWVudGVkIEFQSSBvZiBPYnNpZGlhbi5cclxuICpcclxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBGaWxlbmFtZSBmb3IgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBmb3JtYXQgVGhlIEZpbGVmb3JtYXQgb2YgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBTb3VyY2VmaWxlIGZyb20gd2hlcmUgdGhlIEF0dGFjaG1lbnQgZ2V0cyBhZGRlZCwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgQXR0YWNobWVudCBGb2xkZXIgbWlnaHQgYmUgZGlmZmVyZW50IGJhc2VkIG9uIHdoZXJlIGl0IGdldHMgaW5zZXJ0ZWQuXHJcbiAqIEByZXR1cm5zIFRoZSBBdHRhY2htZW50IFBhdGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoZmlsZU5hbWUsIGZvcm1hdCwgc291cmNlRmlsZSkge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgZm9ybWF0LCBzb3VyY2VGaWxlKTtcclxufVxyXG4vKipcclxuICogQ29weSBgY29udGVudGAgdG8gdGhlIHVzZXJzIGNsaXBib2FyZC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYmUgY29waWVkIHRvIGNsaXBib2FyZC5cclxuICogQHBhcmFtIHsoKSA9PiBhbnl9IHN1Y2Nlc3MgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHRleHQgaXMgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gRGVmYXVsdCB0aHJvd3MgYSBuZXcgYE5vdGljZWBcclxuICogQHBhcmFtIHsocmVhc29uPykgPT4gYW55fSBmYWlsdXJlIFRoZSBjYWxsYmFjayB0byBydW4gd2hlbiB0ZXh0IHdhcyBub3QgYWJsZSB0byBiZSBjb3BpZWQuIERlZmF1bHQgdGhyb3dzIGEgbmV3IGBOb3RpY2VgLCBhbmQgY29uc29sZSBsb2dzIHRoZSBlcnJvci5gXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weShjb250ZW50LCBzdWNjZXNzID0gKCkgPT4gbmV3IE5vdGljZShcIkNvcGllZCB0byBjbGlwYm9hcmRcIiksIGZhaWx1cmUgPSAocmVhc29uKSA9PiB7XHJcbiAgICBuZXcgTm90aWNlKFwiQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkXCIpO1xyXG4gICAgY29uc29sZS5sb2coeyByZWFzb24gfSk7XHJcbn0pIHtcclxuICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnQpLnRoZW4oc3VjY2VzcywgZmFpbHVyZSk7XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGFuIGVkaXRvciwgY2hlY2sgaWYgc29tZXRoaW5nIGlzIHNlbGVjdGVkIGFuZCByZXR1cm4gdGhhdCBzZWxlY3Rpb24sIG90aGVyd2lzZSByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBlZGl0b3JcclxuICogQHBhcmFtICB7RWRpdG9yfSBlZGl0b3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Gcm9tRWRpdG9yKGVkaXRvcikge1xyXG4gICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKVxyXG4gICAgICAgIHJldHVybiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRWYWx1ZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhbmQgcmV0dXJuIHRoYXQgc2VsZWN0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcGFyYW0gIHtib29sZWFufSBbY2FjaGVkPXRydWVdIFVzZSBgY2FjaGVkUmVhZGAgb3IgYHJlYWRgLiBgY2FjaGVkUmVhZGAgYnkgZGVmYXVsdC5cclxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IGBudWxsYCBpZiBub3QgZm9jdXNzZWQgb24gYSBtYXJrZG93biBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRnJvbUN1cnJGaWxlKGNhY2hlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHRleHQgPSAoX2EgPSB3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRleHQpXHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUZpbGVDb250ZW50KGNhY2hlZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBub3RlTmFtZWAgaXMgdGhlIG5hbWUgb2YgYSBub3RlIHRoYXQgZXhpc3RzIGluIHRoZSB2YXVsdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBub3RlTmFtZSBCYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBzZWFyY2ggZm9yLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtzb3VyY2VQYXRoPVwiXCJdIE9wdGlvbmFsIGZpbGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS4gRGVmYXVsdCBpcyB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcmV0dXJucyBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJblZhdWx0ID0gKG5vdGVOYW1lLCBzb3VyY2VQYXRoID0gXCJcIikgPT4gISFhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlTmFtZSwgc291cmNlUGF0aCk7XHJcbi8qKlxyXG4gKiBXaGVuIGhvdmVyaW5nIGEgbGluayBnb2luZyB0byBgdG9gLCBzaG93IHRoZSBPYnNpZGlhbiBob3Zlci1wcmV2aWV3IG9mIHRoYXQgbm90ZS5cclxuICpcclxuICogWW91IHByb2JhYmx5IGhhdmUgdG8gaG9sZCBkb3duIGBDdHJsYCB3aGVuIGhvdmVyaW5nIHRoZSBsaW5rIGZvciB0aGUgcHJldmlldyB0byBhcHBlYXIhXHJcbiAqIEBwYXJhbSAge01vdXNlRXZlbnR9IGV2ZW50XHJcbiAqIEBwYXJhbSAge1lvdXJWaWV3fSB2aWV3IFRoZSB2aWV3IHdpdGggdGhlIGxpbmsgYmVpbmcgaG92ZXJlZFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIFRoZSBiYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBwcmV2aWV3LlxyXG4gKiBAdGVtcGxhdGUgWW91clZpZXcgVGhlIFZpZXdUeXBlIG9mIHlvdXIgdmlld1xyXG4gKiBAcmV0dXJucyB2b2lkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaG92ZXJQcmV2aWV3KGV2ZW50LCB2aWV3LCB0bykge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICBhcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBzb3VyY2U6IHZpZXcuZ2V0Vmlld1R5cGUoKSxcclxuICAgICAgICBob3ZlclBhcmVudDogdmlldyxcclxuICAgICAgICB0YXJnZXRFbCxcclxuICAgICAgICBsaW5rdGV4dDogdG8sXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hcmtkb3duIG5vdGUgbmFtZWQgYG5ld05hbWVgIGluIHRoZSB1c2VyJ3MgcHJlZmZlcmVkIG5ldy1ub3RlLWZvbGRlci5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuZXdOYW1lIE5hbWUgb2YgbmV3IG5vdGUgKHdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtICB7c3RyaW5nfSBbY3VyckZpbGVQYXRoPVwiXCJdIEZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBub3RlLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBmaWxlLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxURmlsZT59IG5ldyBURmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld01ETm90ZShuZXdOYW1lLCBjdXJyRmlsZVBhdGggPSBcIlwiKSB7XHJcbiAgICBjb25zdCBuZXdGaWxlRm9sZGVyID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGVQYXRoKS5wYXRoO1xyXG4gICAgY29uc3QgbmV3RmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVGb2xkZXJ9JHtuZXdGaWxlRm9sZGVyID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIn0ke2FkZE1EKG5ld05hbWUpfWApO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUobmV3RmlsZVBhdGgsIFwiXCIpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGQgJy5tZCcgdG8gYG5vdGVOYW1lYCBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRoICcubWQnIG9uIHRoZSBlbmQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWRkTUQgPSAobm90ZU5hbWUpID0+IHtcclxuICAgIHJldHVybiBub3RlTmFtZS5tYXRjaCgvXFwuTUQkfFxcLm1kJC9tKSA/IG5vdGVOYW1lIDogbm90ZU5hbWUgKyBcIi5tZFwiO1xyXG59O1xyXG4vKipcclxuICogU3RyaXAgJy5tZCcgb2ZmIHRoZSBlbmQgb2YgYSBub3RlIG5hbWUgdG8gZ2V0IGl0cyBiYXNlbmFtZS5cclxuICpcclxuICogV29ya3Mgd2l0aCB0aGUgZWRnZWNhc2Ugd2hlcmUgYSBub3RlIGhhcyAnLm1kJyBpbiBpdHMgYmFzZW5hbWU6IGBPYnNpZGlhbi5tZC5tZGAsIGZvciBleGFtcGxlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRob3V0ICcubWQnXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaXBNRCA9IChub3RlTmFtZSkgPT4ge1xyXG4gICAgaWYgKG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vdGVOYW1lLnNwbGl0KC9cXC5NRCR8XFwubWQkL20pLnNsaWNlKDAsIC0xKS5qb2luKFwiLm1kXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBub3RlTmFtZTtcclxufTtcclxuLyoqXHJcbiAqIFdoZW4gY2xpY2tpbmcgYSBsaW5rLCBjaGVjayBpZiB0aGF0IG5vdGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgbGVhZiwgYW5kIHN3aXRjaCB0byB0aGF0IGxlYWYsIGlmIHNvLiBPdGhlcndpc2UsIG9wZW4gdGhlIG5vdGUgaW4gYSBuZXcgcGFuZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkZXN0IE5hbWUgb2Ygbm90ZSB0byBvcGVuLiBJZiB5b3Ugd2FudCB0byBvcGVuIGEgbm9uLW1kIG5vdGUsIGJlIHN1cmUgdG8gYWRkIHRoZSBmaWxlIGV4dGVuc2lvbi5cclxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcclxuICogQHBhcmFtICB7e2NyZWF0ZU5ld0ZpbGU6Ym9vbGVhbn19IFtvcHRpb25zPXtjcmVhdGVOZXdGaWxlOnRydWV9XSBXaGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYGRlc3RgIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4gSWYgYGZhbHNlYCwgc2ltcGx5IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbi5cclxuICogQHJldHVybnMgUHJvbWlzZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCwgb3B0aW9ucyA9IHsgY3JlYXRlTmV3RmlsZTogdHJ1ZSB9KSB7XHJcbiAgICBjb25zdCB7IHdvcmtzcGFjZSB9ID0gYXBwO1xyXG4gICAgbGV0IGRlc3RGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVzdCwgXCJcIik7XHJcbiAgICAvLyBJZiBkZXN0IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcclxuICAgIGlmICghZGVzdEZpbGUgJiYgb3B0aW9ucy5jcmVhdGVOZXdGaWxlKSB7XHJcbiAgICAgICAgZGVzdEZpbGUgPSBhd2FpdCBjcmVhdGVOZXdNRE5vdGUoZGVzdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZGVzdEZpbGUgJiYgIW9wdGlvbnMuY3JlYXRlTmV3RmlsZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgb3BlblxyXG4gICAgY29uc3QgbGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlbiA9IFtdO1xyXG4gICAgLy8gRm9yIGFsbCBvcGVuIGxlYXZlcywgaWYgdGhlIGxlYXZlJ3MgYmFzZW5hbWUgaXMgZXF1YWwgdG8gdGhlIGxpbmsgZGVzdGluYXRpb24sIHJhdGhlciBhY3RpdmF0ZSB0aGF0IGxlYWYgaW5zdGVhZCBvZiBvcGVuaW5nIGl0IGluIHR3byBwYW5lc1xyXG4gICAgd29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gKF9hID0gbGVhZi52aWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsZTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgJiYgZmlsZS5iYXNlbmFtZSArIFwiLlwiICsgZmlsZS5leHRlbnNpb24gPT09IGRlc3QpIHtcclxuICAgICAgICAgICAgICAgIGxlYXZlc1dpdGhEZXN0QWxyZWFkeU9wZW4ucHVzaChsZWFmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gUmF0aGVyIHN3aXRjaCB0byBpdCBpZiBpdCBpcyBvcGVuXHJcbiAgICBpZiAobGVhdmVzV2l0aERlc3RBbHJlYWR5T3Blbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlblswXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgbW9kZSA9IGFwcC52YXVsdC5nZXRDb25maWcoXCJkZWZhdWx0Vmlld01vZGVcIik7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk1ldGFcIilcclxuICAgICAgICAgICAgPyB3b3Jrc3BhY2Uuc3BsaXRBY3RpdmVMZWFmKClcclxuICAgICAgICAgICAgOiB3b3Jrc3BhY2UuZ2V0VW5waW5uZWRMZWFmKCk7XHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgYXdhaXQgbGVhZi5vcGVuRmlsZShkZXN0RmlsZSwgeyBhY3RpdmU6IHRydWUsIG1vZGUgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGEgbGlzdCBvZiByZXNvbHZlZCBsaW5rcyBmcm9tIGFwcC5tZXRhZGF0YUNhY2hlLCBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gXHJcbiAqIEBwYXJhbSAge1Jlc29sdmVkTGlua3N9IHJlc29sdmVkTGlua3NcclxuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tIE5vdGUgbmFtZSB3aXRoIGxpbmsgbGVhdmluZyAoV2l0aCBvciB3aXRob3V0ICcubWQnKVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIE5vdGUgbmFtZSB3aXRoIGxpbmsgYXJyaXZpbmcgKFdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0ZWQ9dHJ1ZV0gT25seSBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gLiBJZiBub3QgZGlyZWN0ZWQsIGNoZWNrIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2VkKHJlc29sdmVkTGlua3MsIGZyb20sIHRvLCBkaXJlY3RlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYSwgX2I7XHJcbiAgICBmcm9tID0gYWRkTUQoZnJvbSk7XHJcbiAgICB0byA9IGFkZE1EKHRvKTtcclxuICAgIGNvbnN0IGZyb21UbyA9IChfYSA9IHJlc29sdmVkTGlua3NbZnJvbV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNPd25Qcm9wZXJ0eSh0byk7XHJcbiAgICBpZiAoIWZyb21UbyAmJiAhZGlyZWN0ZWQpIHtcclxuICAgICAgICBjb25zdCB0b0Zyb20gPSAoX2IgPSByZXNvbHZlZExpbmtzW3RvXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc093blByb3BlcnR5KGZyb20pO1xyXG4gICAgICAgIHJldHVybiB0b0Zyb207XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21UbztcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIGxpbmsgYGZyb21gIFx1MjE5MiBgdG9gIGlzIHJlc29sdmVkIG9yIG5vdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZyb21cclxuICogQHJldHVybnMgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQodG8sIGZyb20pIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcbiAgICByZXR1cm4gKChfYSA9IHJlc29sdmVkTGlua3MgPT09IG51bGwgfHwgcmVzb2x2ZWRMaW5rcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzb2x2ZWRMaW5rc1thZGRNRChmcm9tKV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVthZGRNRCh0byldKSA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIE9wZW4geW91ciB2aWV3IG9uIHRoZSBjaG9zZW4gYHNpZGVgIGlmIGl0IGlzbid0IGFscmVhZHkgb3BlblxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdUeXBlXHJcbiAqIEBwYXJhbSAge0NvbnN0cnVjdG9yPFlvdXJWaWV3Pn0gdmlld0NsYXNzIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvZiB5b3VyIHZpZXdcclxuICogQHBhcmFtICB7XCJsZWZ0XCJ8XCJyaWdodFwifSBbc2lkZT1cInJpZ2h0XCJdXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPFlvdXJWaWV3Pn0gVGhlIG9wZW5lZCB2aWV3XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblZpZXcodmlld1R5cGUsIHZpZXdDbGFzcywgc2lkZSA9IFwicmlnaHRcIikge1xyXG4gICAgbGV0IGxlYWYgPSBudWxsO1xyXG4gICAgZm9yIChsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHZpZXdUeXBlKSkge1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiB2aWV3Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlYWYudmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBcImVtcHR5XCIgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBsZWFmID1cclxuICAgICAgICAobGVhZiAhPT0gbnVsbCAmJiBsZWFmICE9PSB2b2lkIDAgPyBsZWFmIDogc2lkZSA9PT0gXCJyaWdodFwiKVxyXG4gICAgICAgICAgICA/IGFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKVxyXG4gICAgICAgICAgICA6IGFwcC53b3Jrc3BhY2UuZ2V0TGVmdExlYWYoZmFsc2UpO1xyXG4gICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xyXG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGxlYWYudmlldztcclxufVxyXG4vKipcclxuICogQ2hlY2sgd2hpY2ggc2lkZSBvZiB0aGUgd29ya3NwYWNlIHlvdXIgYHZpZXdUeXBlYCBpcyBvbiwgYW5kIHNhdmUgaXQgaW50byBgcGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXWAuXHJcbiAqXHJcbiAqICoqVGlwKio6IFJ1biB0aGlzIGZ1bmN0aW9uIG9uIGBwbHVnaW4udW5sb2FkYCB0byBzYXZlIHRoZSBsYXN0IHNpZGUgeW91ciB2aWV3IHdhcyBvbiB3aGVuIGNsb3NpbmcsIHRoZW4ge0BsaW5rIG9wZW5WaWV3fSBvbiB0aGUgc2FtZSBzaWRlIGl0IHdhcyBsYXN0LlxyXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cclxuICogQHBhcmFtICB7c3RyaW5nfSB2aWV3VHlwZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNldHRpbmdOYW1lXHJcbiAqIEByZXR1cm5zIHtcImxlZnRcIiB8IFwicmlnaHRcIn0gYHNpZGVgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVZpZXdTaWRlKHBsdWdpbiwgdmlld1R5cGUsIHNldHRpbmdOYW1lKSB7XHJcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpWzBdO1xyXG4gICAgaWYgKCFsZWFmKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKGBPYnNpZGlhbi1Db21tdW5pdHktTGliOiBObyBpbnN0YW5jZSBvZiAnJHt2aWV3VHlwZX0nIG9wZW4sIGNhbm5vdCBzYXZlIHNpZGVgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBwbHVnaW4uc2V0dGluZ3Nbc2V0dGluZ05hbWVdID0gc2lkZTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgcmV0dXJuIHNpZGU7XHJcbn1cclxuLyoqXHJcbiAqIEEgTW9kYWwgdXNlZCBpbiB7QGxpbmsgYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbn0gdG8gZGlzcGxheSByZW5kZXJlZCBtYXJrZG93biBmcm9tIGEgcmF3IHN0cmluZywgb3IgZmV0Y2hlZCBmcm9tIGEgcHJvdmlkZWQgdXJsLlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9OTXdNNTBFLnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlIFJhdyBtYXJrZG93biBjb250ZW50IG9yIHVybCB0byBmaW5kIHJhdyBtYXJrZG93bi5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gZmV0Y2ggVHJ1ZSBcdTIxOTIgZmV0Y2ggbWFya2Rvd24gZnJvbSBgc291cmNlYCBhcyB1cmwuIEZhbHNlIFx1MjE5MiBgc291cmNlYCBpcyBhbHJlYWR5IGEgbWFya2Rvd24gc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlbmRlcmVkTWFya2Rvd25Nb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbiwgc291cmNlLCBmZXRjaCkge1xyXG4gICAgICAgIHN1cGVyKGFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5mZXRjaCA9IGZldGNoO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25PcGVuKCkge1xyXG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCwgc291cmNlLCBwbHVnaW4sIGZldGNoIH0gPSB0aGlzO1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gc291cmNlO1xyXG4gICAgICAgIGlmIChmZXRjaCkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuY3JlYXRlRGl2KHsgdGV4dDogYFdhaXRpbmcgZm9yIGNvbnRlbnQgZnJvbTogJyR7c291cmNlfSdgIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVxdWVzdCh7IHVybDogc291cmNlIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9nRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJPQ0wtUmVuZGVyZWRNYXJrZG93bk1vZGFsXCIgfSk7XHJcbiAgICAgICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihjb250ZW50LCBsb2dEaXYsIFwiXCIsIHBsdWdpbik7XHJcbiAgICB9XHJcbiAgICBvbkNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFkZCBhIGJ1dHRvbiB0byBhbiBIVE1MRUxlbWVudCwgd2hpY2gsIHdoZW4gY2xpY2tlZCwgcG9wcyB1cCBhIHtAbGluayBSZW5kZXJlZE1hcmtkb3duTW9kYWx9IHNob3dpbmcgcmVuZGVyZWQgbWFya2Rvd24uXHJcbiAqXHJcbiAqIFVzZSBgZmV0Y2hgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcmtkb3duIHN0cmluZyBuZWVkcyB0byBiZSBmZXRjaGVkLCBvciBpZiBpdCBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIHN0cmluZyBhbHJlYWR5LlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9IaTRneXl2LnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBjb250YWluZXJFbCBIVE1MRWxlbWVudCB0byBhZGQgdGhlIGJ1dHRvbiB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZSBSYXcgbWFya2Rvd24gY29udGVudCBvciB1cmwgdG8gZmluZCByYXcgbWFya2Rvd24uXHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IGZldGNoIFRydWUgXHUyMTkyIGZldGNoIG1hcmtkb3duIGZyb20gYHNvdXJjZWAgYXMgdXJsLiBGYWxzZSBcdTIxOTIgYHNvdXJjZWAgaXMgYWxyZWFkeSBhIG1hcmtkb3duIHN0cmluZy5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkaXNwbGF5VGV4dCBUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZW5kZXJlZE1hcmtkb3duQnV0dG9uKHBsdWdpbiwgY29udGFpbmVyRWwsIHNvdXJjZSwgZmV0Y2gsIGRpc3BsYXlUZXh0KSB7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IGRpc3BsYXlUZXh0IH0sIChidXQpID0+IGJ1dC5vbkNsaWNrRXZlbnQoKCkgPT4ge1xyXG4gICAgICAgIG5ldyBSZW5kZXJlZE1hcmtkb3duTW9kYWwocGx1Z2luLCBzb3VyY2UsIGZldGNoKS5vcGVuKCk7XHJcbiAgICB9KSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBhcHAubWV0YWRhdGFDYWNoZS5SZXNvbHZlZExpbmtzYCBoYXZlIGZ1bGx5IGluaXRhbGlzZWQuXHJcbiAqXHJcbiAqIFVzZWQgd2l0aCB7QGxpbmsgd2FpdEZvclJlc29sdmVkTGlua3N9LlxyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG5vRmlsZXMgTnVtYmVyIG9mIGZpbGVzIGluIHlvdXIgdmF1bHQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVkTGlua3NDb21wbGV0ZShub0ZpbGVzKSB7XHJcbiAgICBjb25zdCB7IHJlc29sdmVkTGlua3MgfSA9IGFwcC5tZXRhZGF0YUNhY2hlO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVkTGlua3MpLmxlbmd0aCA9PT0gbm9GaWxlcztcclxufVxyXG4vKipcclxuICogV2FpdCBmb3IgYGFwcC5tZXRhZGF0YUNhY2hlLlJlc29sdmVkTGlua3NgIHRvIGhhdmUgZnVsbHkgaW5pdGlhbGlzZWQuXHJcbiAqIEBwYXJhbSAge251bWJlcn0gW2RlbGF5PTEwMDBdIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTUwXSBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGNoZWNrIGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvciBhbmQgYnJlYWtpbmcgb3V0IG9mIHRoZSBsb29wLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JSZXNvbHZlZExpbmtzKGRlbGF5ID0gMTAwMCwgbWF4ID0gNTApIHtcclxuICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHdoaWxlICghcmVzb2x2ZWRMaW5rc0NvbXBsZXRlKG5vRmlsZXMpICYmIGkgPCBtYXgpIHtcclxuICAgICAgICBhd2FpdCB3YWl0KGRlbGF5KTtcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBpZiAoaSA9PT0gbWF4KSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJPYnNpZGlhbi1Db21tdW5pdHktTGliOiBSZXNvbHZlZExpbmtzIGRpZCBub3QgZmluaXNoIGluaXRpYWxpc2luZy4gYG1heGAgaXRlcmF0aW9ucyB3YXMgcmVhY2hlZCBmaXJzdC5cIik7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBjb250ZW50IG9mIGEgbm90ZSBoYXMgWUFNTC4gSWYgc28sIHJldHVybiBhbiBhcnJheSBvZiB0aGUgWUFNTCBhbmQgdGhlIHJlc3Qgb2YgdGhlIG5vdGUuIElmIG5vdCwgcmV0dXJuIGBbJycsIGNvbnRlbnRdYFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50KSB7XHJcbiAgICBpZiAoIS9eLS0tXFxuLy50ZXN0KGNvbnRlbnQpKVxyXG4gICAgICAgIHJldHVybiBbXCJcIiwgY29udGVudF07XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBjb250ZW50LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHNwbGl0cy5zbGljZSgwLCAyKS5qb2luKFwiLS0tXCIpICsgXCItLS1cIixcclxuICAgICAgICAgICAgc3BsaXRzLnNsaWNlKDIpLmpvaW4oXCItLS1cIiksXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBjYWNoZWQgUmV0dXJuIGNhY2hlZCBmaWxlIGNvbnRlbnQgKipvcioqIHJldHVybiB3aGF0J3Mgb24gZGlzay5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVGaWxlQ29udGVudChjYWNoZWQgPSB0cnVlKSB7XHJcbiAgICBjb25zdCBjdXJyRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgaWYgKCEoY3VyckZpbGUgaW5zdGFuY2VvZiBURmlsZSkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoY2FjaGVkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChjdXJyRmlsZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUge1xyXG4gIEJDU2V0dGluZ3MsXHJcbiAgRGlyZWN0aW9ucyxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IElKdWdnbFNldHRpbmdzIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BVFJJWF9WSUVXID0gXCJCQy1tYXRyaXhcIjtcclxuLy8gZXhwb3J0IGNvbnN0IFNUQVRTX1ZJRVcgPSBcIkJDLXN0YXRzXCI7XHJcbmV4cG9ydCBjb25zdCBEVUNLX1ZJRVcgPSBcIkJDLWR1Y2tzXCI7XHJcbmV4cG9ydCBjb25zdCBUUkVFX1ZJRVcgPSBcIkJDLXRyZWVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OID0gXCJCQy10cmFpbC1pY29uXCI7XHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OX1NWRyA9XHJcbiAgJzxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ4LjgsNGMtNiwwLTEzLjUsMC41LTE5LjcsMy4zUzE3LjksMTUuOSwxNy45LDI1YzAsNSwyLjYsOS43LDYuMSwxMy45czguMSw4LjMsMTIuNiwxMi4zczksNy44LDEyLjIsMTEuNSBjMy4yLDMuNyw1LjEsNy4xLDUuMSwxMC4yYzAsMTQuNC0xMy40LDE5LjMtMTMuNCwxOS4zYy0wLjcsMC4yLTEuMiwwLjgtMS4zLDEuNXMwLjEsMS40LDAuNywxLjljMC42LDAuNSwxLjMsMC42LDIsMC4zIGMwLDAsMTYuMS02LjEsMTYuMS0yM2MwLTQuNi0yLjYtOC44LTYuMS0xMi44Yy0zLjUtNC04LjEtNy45LTEyLjYtMTEuOGMtNC41LTMuOS04LjktNy45LTEyLjItMTEuOGMtMy4yLTMuOS01LjItNy43LTUuMi0xMS40IGMwLTcuOCwzLjYtMTEuNiw4LjgtMTRTNDMsOCw0OC44LDhjNC42LDAsOS4zLDAsMTEsMGMwLjcsMCwxLjQtMC40LDEuNy0xYzAuMy0wLjYsMC4zLTEuNCwwLTJzLTEtMS0xLjctMUM1OC4zLDQsNTMuNCw0LDQ4LjgsNCBMNDguOCw0eiBNNzguMSw0Yy0wLjYsMC0xLjIsMC4yLTEuNiwwLjdsLTguOSw5LjljLTAuNSwwLjYtMC43LDEuNC0wLjMsMi4yYzAuMywwLjcsMSwxLjIsMS44LDEuMmgwLjFsLTIuOCwyLjYgYy0wLjYsMC42LTAuOCwxLjQtMC41LDIuMmMwLjMsMC44LDEsMS4zLDEuOSwxLjNoMS4zbC00LjUsNC42Yy0wLjYsMC42LTAuNywxLjQtMC40LDIuMmMwLjMsMC43LDEsMS4yLDEuOCwxLjJoMTB2NCBjMCwwLjcsMC40LDEuNCwxLDEuOGMwLjYsMC40LDEuNCwwLjQsMiwwYzAuNi0wLjQsMS0xLDEtMS44di00aDEwYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMS0xLjYtMC40LTIuMkw4Ni45LDI0aDEuMyBjMC44LDAsMS42LTAuNSwxLjktMS4zYzAuMy0wLjgsMC4xLTEuNi0wLjUtMi4ybC0yLjgtMi42aDAuMWMwLjgsMCwxLjUtMC41LDEuOC0xLjJjMC4zLTAuNywwLjItMS42LTAuMy0yLjJsLTguOS05LjkgQzc5LjEsNC4zLDc4LjYsNCw3OC4xLDRMNzguMSw0eiBNNzgsOWw0LjQsNC45aC0wLjdjLTAuOCwwLTEuNiwwLjUtMS45LDEuM2MtMC4zLDAuOC0wLjEsMS42LDAuNSwyLjJsMi44LDIuNmgtMS4xIGMtMC44LDAtMS41LDAuNS0xLjgsMS4yYy0wLjMsMC43LTAuMSwxLjYsMC40LDIuMmw0LjUsNC42SDcwLjhsNC41LTQuNmMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0xLjEgbDIuOC0yLjZjMC42LTAuNiwwLjgtMS40LDAuNS0yLjJjLTAuMy0wLjgtMS0xLjMtMS45LTEuM2gtMC43TDc4LDl6IE01Mi40LDEyYy00LjEsMC03LjEsMC41LTkuNCwxLjVjLTIuMywxLTMuOCwyLjUtNC41LDQuMyBjLTAuNywxLjgtMC41LDMuNiwwLjEsNS4yYzAuNiwxLjUsMS41LDIuOSwyLjUsMy45YzUuNCw1LjQsMTguMSwxMi42LDI5LjYsMjFjNS44LDQuMiwxMS4yLDguNiwxNS4xLDEzYzMuOSw0LjQsNi4yLDguNyw2LjIsMTIuNCBjMCwxNC41LTEyLjksMTguNy0xMi45LDE4LjdjLTAuNywwLjItMS4yLDAuOC0xLjQsMS41czAuMSwxLjUsMC43LDEuOWMwLjYsMC41LDEuMywwLjYsMiwwLjNjMCwwLDE1LjYtNS42LDE1LjYtMjIuNSBjMC01LjMtMi45LTEwLjMtNy4yLTE1LjFDODQuNiw1My42LDc5LDQ5LDczLjEsNDQuN2MtMTEuOC04LjYtMjQuOC0xNi4zLTI5LjItMjAuNmMtMC42LTAuNi0xLjItMS41LTEuNi0yLjQgYy0wLjMtMC45LTAuNC0xLjctMC4xLTIuNGMwLjMtMC43LDAuOC0xLjQsMi4zLTJjMS41LTAuNyw0LjEtMS4yLDcuOC0xLjJjNC45LDAsOS40LDAuMSw5LjQsMC4xYzAuNywwLDEuNC0wLjMsMS44LTEgYzAuNC0wLjYsMC40LTEuNCwwLTIuMWMtMC40LTAuNi0xLjEtMS0xLjgtMUM2MS45LDEyLjEsNTcuMywxMiw1Mi40LDEyTDUyLjQsMTJ6IE0yNCw0NmMtMC41LDAtMS4xLDAuMi0xLjQsMC42TDkuMiw2MC41IGMtMC42LDAuNi0wLjcsMS40LTAuNCwyLjJjMC4zLDAuNywxLDEuMiwxLjgsMS4yaDNsLTYuNSw2LjhjLTAuNiwwLjYtMC43LDEuNC0wLjQsMi4yczEsMS4yLDEuOCwxLjJIMTNsLTguNSw4LjYgQzQsODMuMiwzLjgsODQsNC4yLDg0LjhDNC41LDg1LjUsNS4yLDg2LDYsODZoMTZ2NS40YzAsMC43LDAuNCwxLjQsMSwxLjhjMC42LDAuNCwxLjQsMC40LDIsMGMwLjYtMC40LDEtMSwxLTEuOFY4NmgxNiBjMC44LDAsMS41LTAuNSwxLjgtMS4yYzAuMy0wLjcsMC4xLTEuNi0wLjQtMi4yTDM1LDc0aDQuNGMwLjgsMCwxLjUtMC41LDEuOC0xLjJzMC4yLTEuNi0wLjQtMi4ybC02LjUtNi44aDMgYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMi0xLjYtMC40LTIuMkwyNS40LDQ2LjZDMjUuMSw0Ni4yLDI0LjUsNDYsMjQsNDZMMjQsNDZ6IE0yNCw1MC45bDguNyw5aC0zIGMtMC44LDAtMS41LDAuNS0xLjgsMS4ycy0wLjIsMS42LDAuNCwyLjJsNi41LDYuOGgtNC41Yy0wLjgsMC0xLjUsMC41LTEuOCwxLjJjLTAuMywwLjctMC4xLDEuNiwwLjQsMi4ybDguNSw4LjZIMTAuOGw4LjUtOC42IGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC00LjVsNi41LTYuOGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0zTDI0LDUwLjl6XCIvPic7XHJcblxyXG5leHBvcnQgY29uc3QgRFVDS19JQ09OID0gXCJCQy1kdWNrLWljb25cIjtcclxuZXhwb3J0IGNvbnN0IERVQ0tfSUNPTl9TVkcgPVxyXG4gICc8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZD1cIk03MiwzMWMwLTEuNS0xLjItMi44LTIuOC0yLjhjLTEuNSwwLTIuOCwxLjItMi44LDIuOHMxLjIsMi44LDIuOCwyLjhDNzAuOCwzMy44LDcyLDMyLjYsNzIsMzF6IE04MC40LDQ3LjdjMTAuNywwLDE5LjQtOC43LDE5LjQtMTkuNEg4OC40Yy0wLjEtMC42LTAuMS0xLjEtMC4yLTEuN2MtMS42LTcuMS03LjMtMTIuOC0xNC4zLTE0NGMtMS42LTAuNC0zLjEtMC41LTQuNi0wLjVjLTEwLjcsMC0xOS40LDguNy0xOS40LDE5LjR2MTMuOWgtOS40Yy02LjgsMC0xMy42LTIuNC0xOC4yLTcuM2MtMC43LTAuNy0xLjYtMS4xLTIuNC0xMWMtMS43LDAtMy4zLDEuMy0zLjMsMy4zYzAsMTYuNCwxMi41LDMxLDI4LjYsMzIuNmMxLjYsMC4yLDMuMS0xLjEsMy4xLTIuOHYtMi44YzAtMS40LTEtMi42LTIuNC0yLjdjLTcuOS0wOS0xNC44LTYuMi0xOC40LTEzLjVjNC4xLDEuNiw4LjUsMi41LDEzLjEsMi41bDE3LjcsMC4xVjMxYzAtNi4xLDUtMTEuMSwxMS4xLTExLjFjMC45LDAsMS44LDAuMSwyLjcsMC4zYzMuOSwwLjksNy4yLDQuMiw4LjEsOC4xQzgxNCwzNC40LDc4LDM5LjEsNzQsNDFsLTQuNywyLjN2MTIuNGwyLjEsMi40YzEuNSwxLjgsMy40LDQuNywzLjUsOC44YzAuMSwzLjQtMS4zLDYuNy0zLjksOS40Yy0zLDMtNyw0LjgtMTEuMiw0LjhINDMuOWMtMSwwLTIuMS0wMS0zLjItMC4yQzI1LjIsNzkuNSwxMi4zLDY4LjEsOC43LDUzLjJoNS4xYy0xLjItMi43LTItNS41LTIuNS04LjNINS40Yy0zLjMsMC02LDMtNS41LDYuM2MyLjksMjAuMywxOS40LDM2LjEsNDAsMzhjMS4zLDAuMSwyLjYsMDIsNCwwLjJoMTUuOGMxMi41LDAsMjMuNy0xMC4yLDIzLjQtMjIuN2MtMC4xLTUuNC0yLjItMTAuMy01LjYtMTQuMXYtNC45SDgwLjRMODAuNCw0Ny43elwiLz4nO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0TGlua3NSZWdleCA9IG5ldyBSZWdFeHAoL1xcW1xcWyguKz8pXFxdXFxdL2cpO1xyXG5leHBvcnQgY29uc3QgZHJvcEhlYWRlck9yQWxpYXMgPSBuZXcgUmVnRXhwKC9cXFtcXFsoW14jfF0rKVxcXVxcXS8pO1xyXG5cclxuLyoqIEEgbWV0YS1yZWdleCB0aGF0IHRha2VzIGluIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGAvcmVnZXgvZmxhZ3NgLCBhbmQgcmV0dXJucyAyIGdyb3VwcywgdGhlIGlubmVyIGByZWdleGAsIGFuZCB0aGUgYGZsYWdzYC4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZ05GbGFncyA9IG5ldyBSZWdFeHAoL14uKC4qPylcXFcoXFx3KikkLyk7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUlMX0xFTkdUSFMgPSBbXHJcbiAgJ1Nob3J0ZXN0JyxcclxuICAnTG9uZ2VzdCcsXHJcbiAgJ0FsbCdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJU1RZUEVTID0gW1xyXG4gIFwiRm9yY2UgRGlyZWN0ZWQgR3JhcGhcIixcclxuICBcIlRpZHkgVHJlZVwiLFxyXG4gIFwiQ2lyY2xlIFBhY2tpbmdcIixcclxuICBcIkVkZ2UgQnVuZGxpbmdcIixcclxuICBcIkFyYyBEaWFncmFtXCIsXHJcbiAgXCJTdW5idXJzdFwiLFxyXG4gIFwiVHJlZSBNYXBcIixcclxuICBcIkljaWNsZVwiLFxyXG4gIFwiUmFkaWFsIFRyZWVcIixcclxuXSBhcyBjb25zdDtcclxuXHJcbi8qIEFsbCA1IHBvc3NpYmxlIGRpcmVjdGlvbnMuICovXHJcbmV4cG9ydCBjb25zdCBESVJFQ1RJT05TID0gW1widXBcIiwgXCJzYW1lXCIsIFwiZG93blwiLCBcIm5leHRcIiwgXCJwcmV2XCJdIGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEFuIGFycm93IGZvciBlYWNoIHtAbGluayBESVJFQ1RJT05TfSB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBBUlJPV19ESVJFQ1RJT05TOiB7IFtkaXIgaW4gRGlyZWN0aW9uc106IHN0cmluZyB9ID0ge1xyXG4gIHVwOiBcIlx1MjE5MVwiLFxyXG4gIHNhbWU6IFwiXHUyMTk0XCIsXHJcbiAgZG93bjogXCJcdTIxOTNcIixcclxuICBuZXh0OiBcIlx1MjE5MlwiLFxyXG4gIHByZXY6IFwiXHUyMTkwXCIsXHJcbn07XHJcbmV4cG9ydCBjb25zdCBSRUxBVElPTlMgPSBbXCJQYXJlbnRcIiwgXCJTaWJsaW5nXCIsIFwiQ2hpbGRcIl0gYXMgY29uc3Q7XHJcbmV4cG9ydCBjb25zdCBSRUFsQ0xPU0VEID0gW1wiUmVhbFwiLCBcIkNsb3NlZFwiXTtcclxuZXhwb3J0IGNvbnN0IEFMTFVOTElOS0VEID0gW1wiQWxsXCIsIFwiTm8gVW5saW5rZWRcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfVFlQRVMgPSBbXCJ0cmVlXCIsIFwianVnZ2xcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfRklFTERTID0gW1xyXG4gIFwidHlwZVwiLFxyXG4gIFwiZGlyXCIsXHJcbiAgXCJmaWVsZHNcIixcclxuICBcImRlcHRoXCIsXHJcbiAgXCJ0aXRsZVwiLFxyXG4gIFwiZmxhdFwiLFxyXG4gIFwiY29udGVudFwiLFxyXG4gIFwiZnJvbVwiLFxyXG4gIFwiaW1wbGllZFwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX0NCX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IHtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICBhdXRvQWRkTm9kZXM6IGZhbHNlLFxyXG4gIGF1dG9FeHBhbmQ6IGZhbHNlLFxyXG4gIGF1dG9ab29tOiBmYWxzZSxcclxuICBjb3JlU3RvcmU6IFwiY29yZVwiLFxyXG4gIGV4cGFuZEluaXRpYWw6IGZhbHNlLFxyXG4gIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICBmaWx0ZXI6IFwiXCIsXHJcbiAgaGVpZ2h0OiBcIjc1MHB4XCIsXHJcbiAgaG92ZXJFZGdlczogZmFsc2UsXHJcbiAgbGF5b3V0OiBcImZvcmNlLWRpcmVjdGVkXCIsXHJcbiAgbGltaXQ6IDI1MCxcclxuICBtZXJnZUVkZ2VzOiB0cnVlLFxyXG4gIG1ldGFLZXlIb3ZlcjogdHJ1ZSxcclxuICBtb2RlOiBcIndvcmtzcGFjZVwiLFxyXG4gIG5hdmlnYXRvcjogdHJ1ZSxcclxuICBvcGVuV2l0aFNoaWZ0OiBmYWxzZSxcclxuICByZWFkQ29udGVudDogdHJ1ZSxcclxuICBzdHlsZUdyb3VwczogW10sXHJcbiAgdG9vbGJhcjogdHJ1ZSxcclxuICB3aWR0aDogXCIxMDAlXCIsXHJcbiAgem9vbVNwZWVkOiAxLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX1RSQUlMX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgSlVHR0xfQ0JfREVGQVVMVFMsXHJcbiAge1xyXG4gICAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICAgIGF1dG9ab29tOiBmYWxzZSxcclxuICAgIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICAgIGhlaWdodDogXCIzMDBweFwiLFxyXG4gICAgcmVhZENvbnRlbnQ6IGZhbHNlLFxyXG4gICAgdG9vbGJhcjogZmFsc2UsXHJcbiAgICBuYXZpZ2F0b3I6IGZhbHNlLFxyXG4gIH1cclxuKTtcclxuQ09ERUJMT0NLX0ZJRUxEUy5wdXNoKC4uLk9iamVjdC5rZXlzKEpVR0dMX0NCX0RFRkFVTFRTKSk7XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtVc2VySGllciA9ICgpOiBVc2VySGllciA9PiB7XHJcbiAgcmV0dXJuIHsgdXA6IFtdLCBzYW1lOiBbXSwgZG93bjogW10sIG5leHQ6IFtdLCBwcmV2OiBbXSB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYmxhbmtEaXJPYmpzID0gKCk6IHsgW2RpciBpbiBEaXJlY3Rpb25zXToge30gfSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHVwOiB7fSxcclxuICAgIHNhbWU6IHt9LFxyXG4gICAgZG93bjoge30sXHJcbiAgICBuZXh0OiB7fSxcclxuICAgIHByZXY6IHt9LFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtSZWFsTkltcGxpZWQgPSAoKTogUmVhbE5JbXBsaWVkID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgdXA6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIGRvd246IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHNhbWU6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIG5leHQ6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHByZXY6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFtcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfSV9SRUZMRVhJVkUsXHJcbiAgQkNfSV9QQVJFTlQsXHJcbl0gPSBbXHJcbiAgICBcIkJDLUF1bnRcIixcclxuICAgIFwiQkMtQ291c2luXCIsXHJcbiAgICBcIkJDLVNpYmxpbmctMVwiLFxyXG4gICAgXCJCQy1TaWJsaW5nLTJcIixcclxuICAgIFwiQkMtUmVmbGV4aXZlXCIsXHJcbiAgICBcIkJDLVBhcmVudFwiLFxyXG4gIF07XHJcblxyXG5leHBvcnQgY29uc3QgW1xyXG4gIEJDX0ZPTERFUl9OT1RFLFxyXG4gIEJDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlMsXHJcbiAgQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFLFxyXG4gIEJDX1RBR19OT1RFLFxyXG4gIEJDX1RBR19OT1RFX0ZJRUxELFxyXG4gIEJDX1RBR19OT1RFX0VYQUNULFxyXG4gIEJDX0xJTktfTk9URSxcclxuICBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICBCQ19EVl9OT1RFLFxyXG4gIEJDX0RWX05PVEVfRklFTEQsXHJcbiAgQkNfSUdOT1JFLFxyXG4gIEJDX0lHTk9SRV9ERU5EUk9OLFxyXG4gIEJDX0hJREVfVFJBSUwsXHJcbiAgQkNfT1JERVIsXHJcbl0gPSBbXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlXCIsXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlLXN1YmZvbGRlcnNcIixcclxuICAgIFwiQkMtZm9sZGVyLW5vdGUtcmVjdXJzaXZlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWZpZWxkXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWV4YWN0XCIsXHJcbiAgICBcIkJDLWxpbmstbm90ZVwiLFxyXG4gICAgXCJCQy10cmF2ZXJzZS1ub3RlXCIsXHJcbiAgICBcIkJDLXJlZ2V4LW5vdGVcIixcclxuICAgIFwiQkMtcmVnZXgtbm90ZS1maWVsZFwiLFxyXG4gICAgXCJCQy1kYXRhdmlldy1ub3RlXCIsXHJcbiAgICBcIkJDLWRhdGF2aWV3LW5vdGUtZmllbGRcIixcclxuICAgIFwiQkMtaWdub3JlXCIsXHJcbiAgICBcIkJDLWlnbm9yZS1kZW5kcm9uXCIsXHJcbiAgICBcIkJDLWhpZGUtdHJhaWxcIixcclxuICAgIFwiQkMtb3JkZXJcIixcclxuICBdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJDX0ZJRUxEU19JTkZPID0gW1xyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIGZvbGRlci1ub3RlLiBBbGwgb3RoZXIgbm90ZXMgaW4gdGhpcyBmb2xkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JhcGggd2l0aCB0aGUgZmllbGQgbmFtZSBzcGVjaWZpZWQgaW4gdGhpcyBrZXkncyB2YWx1ZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9TVUJGT0xERVJTLFxyXG4gICAgZGVzYzogXCJMaW5rIHRvIG5vdGVzIGluIHN1YmZvbGRlcnMgd2l0aCB0aGUgZ2l2ZW4gZmllbGQuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiBcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IFwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgICBkZXNjOiBcIlJlY3Vyc2l2ZWx5IGFkZCBub3RlcyBpbiBzdWJmb2xkZXJzIHRvIHRoZSBmb2xkZXJub3RlIG9mIF90aGF0XyBzdWJmb2xkZXIuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdGFnLW5vdGUuIEFsbCBvdGhlciBub3RlcyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBUYWcgTm90ZXMgPiBEZWZhdWx0IEZpZWxkYCwgb3IgdXNpbmcgdGhlIGZpZWxkTmFtZSB5b3Ugc3BlY2lmeSB3aXRoIGBCQy10YWctbm90ZS1maWVsZDogZmllbGROYW1lYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJyNcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6ICNcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UQUdfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyB0YWctbm90ZSB0byB1c2VcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFX0VYQUNULFxyXG4gICAgZGVzYzogXCJPbmx5IGxvb2sgZm9yIG5vdGVzIHdpdGggdGhlIGV4YWN0IHRhZy4gaS5lLiBgI0FgIHdvbid0IG1hdGNoIGAjQS9CYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19MSU5LX05PVEUsXHJcbiAgICBkZXNjOiBcIlNldCB0aGlzIG5vdGUgYXMgYSBCcmVhZGNydW1icyBsaW5rLW5vdGUuIEFsbCBsaW5rcyBsZWF2aW5nIHRoaXMgbm90ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBncmFwaCB3aXRoIHRoZSBmaWVsZCBuYW1lIHNwZWNpZmllZCBpbiB0aGlzIGtleSdzIHZhbHVlLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdHJhdmVyc2Utbm90ZS4gU3RhcnRpbmcgZnJvbSB0aGlzIG5vdGUsIHRoZSBPYnNpZGlhbiBncmFwaCB3aWxsIGJlIHRyYXZlcnNlZCBpbiBkZXB0aC1maXJzdCBvcmRlciwgYW5kIGFsbCBub3RlcyBhbG9uZyB0aGUgd2F5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnlcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIHJlZ2V4LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIChvZiB0aGUgZm9ybSAnL3JlZ2V4L2ZsYWdzJykuIEFsbCBub3RlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBSZWdleCBOb3RlcyA+IERlZmF1bHQgRmllbGRgLCBvciB1c2luZyB0aGUgZmllbGROYW1lIHlvdSBzcGVjaWZ5IGluICdCQy1yZWdleC1ub3RlLWZpZWxkJy5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6ICcvXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiAvXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyByZWdleC1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIERhdGF2aWV3LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgRGF0YXZpZXcgYGZyb21gIHF1ZXJ5LiBBbGwgbm90ZXMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgQkMgZ3JhcGggdXNpbmcgdGhlIGRlZmF1bHQgZmllbGROYW1lIHNwZWNpZmllZCBpbiBgU2V0dGluZ3MgPiBBbHRlcm5hdGl2ZSBIaWVyYXJjaGllcyA+IERhdGF2aWV3IE5vdGVzID4gRGVmYXVsdCBGaWVsZGAsIG9yIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnkgaW4gJ0JDLWRhdGF2aWV3LW5vdGUtZmllbGQnLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJ1wiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyBEYXRhdmlldy1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSUdOT1JFLFxyXG4gICAgZGVzYzogXCJUZWxscyBCcmVhZGNydW1icyB0byBpZ25vcmUgYSBub3RlIGZyb20gaXRzIGluZGV4IGVudGlyZWx5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgQnJlYWRjcnVtYnMgdG8gaW5kZXggbm90ZXMsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZW0gaW4gdGhlIGdyYXBoLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19JR05PUkVfREVORFJPTixcclxuICAgIGRlc2M6IFwiVGVsbHMgQnJlYWRjcnVtYnMgdG8gbm90IHRyZWF0IHRoaXMgbm90ZSBhcyBhIGRlbmRyb24gbm90ZSAob25seSB1c2VmdWwgaWYgdGhlIG5vdGUgbmFtZSBoYXMgeW91IGRlbmRyb24gc3BsaXR0ZXIgaW4gaXQsIHVzdWFsbHkgYSBwZXJpb2QgYC5gKS5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6IHRydWVcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IHRydWVcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSElERV9UUkFJTCxcclxuICAgIGRlc2M6IFwiRG9uJ3Qgc2hvdyB0aGUgdHJhaWwgaW4gdGhpcyBub3RlXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX09SREVSLFxyXG4gICAgZGVzYzogXCJTZXQgdGhlIG9yZGVyIG9mIHRoaXMgbm90ZSBpbiB0aGUgTWF0cml4IHZpZXcuIEEgbG93ZXIgdmFsdWUgcGxhY2VzIHRoaXMgbm90ZSBoaWdoZXIgaW4gdGhlIG9yZGVyLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBCQ19BTFRTID0gQkNfRklFTERTX0lORk8uZmlsdGVyKChmKSA9PiBmLmFsdCkubWFwKChmKSA9PiBmLmZpZWxkKTtcclxuXHJcbmV4cG9ydCBjb25zdCBJTExFR0FMX0ZJTEVOQU1FX0NIQVJTID0gW1xyXG4gIFwiXFxcXFwiLFxyXG4gIFwiL1wiLFxyXG4gIFwiOlwiLFxyXG4gIFwiKlwiLFxyXG4gIFwiP1wiLFxyXG4gICdcIicsXHJcbiAgXCI8XCIsXHJcbiAgXCI+XCIsXHJcbiAgXCJ8XCIsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgREFUQVZJRVdfTUlTU0lORyA9XHJcbiAgXCJUaGUgRGF0YXZpZXcgcGx1Z2luIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmtcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfTkFNRSA9IFwiQkNBUElcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBCQ1NldHRpbmdzID0ge1xyXG4gIGFkZERlbmRyb25Ob3RlczogZmFsc2UsXHJcbiAgYWRkRGF0ZU5vdGVzOiBmYWxzZSxcclxuICBhbGlhc2VzSW5JbmRleDogZmFsc2UsXHJcbiAgYWxwaGFTb3J0QXNjOiB0cnVlLFxyXG4gIGFsdExpbmtGaWVsZHM6IFtdLFxyXG4gIENTVlBhdGhzOiBcIlwiLFxyXG4gIGNyZWF0ZUluZGV4SW5kZW50OiAnICAnLFxyXG4gIGRhdGVGb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxyXG4gIGRhdGVOb3RlRm9ybWF0OiBcInl5eXktTU0tZGRcIixcclxuICBkYXRlTm90ZUZpZWxkOiBcIm5leHRcIixcclxuICBkYXRhdmlld05vdGVGaWVsZDogXCJ1cFwiLFxyXG4gIGRhdGVOb3RlQWRkTW9udGg6IFwiXCIsXHJcbiAgZGF0ZU5vdGVBZGRZZWFyOiBcIlwiLFxyXG4gIGRlYnVnTW9kZTogXCJXQVJOXCIsXHJcbiAgZGVuZHJvbk5vdGVEZWxpbWl0ZXI6IFwiLlwiLFxyXG4gIGRlbmRyb25Ob3RlRmllbGQ6IFwidXBcIixcclxuICBkdldhaXRUaW1lOiA1MDAwLFxyXG4gIGVuYWJsZUFscGhhU29ydDogdHJ1ZSxcclxuICBlbmFibGVSZWxhdGlvblN1Z2dlc3RvcjogZmFsc2UsXHJcbiAgZmllbGRTdWdnZXN0b3I6IHRydWUsXHJcbiAgZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlczogZmFsc2UsXHJcbiAganVnZ2xMYXlvdXQ6IFwiaGllcmFyY2h5XCIsXHJcbiAgbGltaXRXcml0ZUJDQ2hlY2tib3hlczogW10sXHJcbiAgQ0hFQ0tCT1hfU1RBVEVTX09WRVJXUklUVEVOOiBmYWxzZSxcclxuICBncmlkRGVmYXVsdERlcHRoOiAyNSxcclxuICBoaWVyYXJjaHlOb3RlczogW1wiXCJdLFxyXG4gIGhpZXJhcmNoeU5vdGVJc1BhcmVudDogZmFsc2UsXHJcbiAgSE5VcEZpZWxkOiBcIlwiLFxyXG4gIGluZGV4Tm90ZXM6IFtcIlwiXSxcclxuICBuYW1pbmdTeXN0ZW1GaWVsZDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1SZWdleDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1TcGxpdDogXCIuXCIsXHJcbiAgbmFtaW5nU3lzdGVtRW5kc1dpdGhEZWxpbWl0ZXI6IGZhbHNlLFxyXG4gIHJlZnJlc2hPbk5vdGVDaGFuZ2U6IGZhbHNlLFxyXG4gIHVzZUFsbE1ldGFkYXRhOiB0cnVlLFxyXG4gIG9wZW5NYXRyaXhPbkxvYWQ6IHRydWUsXHJcbiAgb3BlbkR1Y2tPbkxvYWQ6IGZhbHNlLFxyXG4gIG9wZW5Eb3duT25Mb2FkOiB0cnVlLFxyXG4gIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbDogZmFsc2UsXHJcbiAgc2hvd05hbWVPclR5cGU6IHRydWUsXHJcbiAgc2hvd1JlbGF0aW9uVHlwZTogdHJ1ZSxcclxuICByZWdleE5vdGVGaWVsZDogXCJcIixcclxuICByZWxTdWdnZXN0b3JUcmlnZ2VyOiBcIlxcXFxcIixcclxuICBybExlYWY6IHRydWUsXHJcbiAgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGU6IGZhbHNlLFxyXG4gIHNob3dBbGxBbGlhc2VzOiB0cnVlLFxyXG4gIHNob3dCQ3M6IHRydWUsXHJcbiAgc2hvd0JDc0luRWRpdExQTW9kZTogZmFsc2UsXHJcbiAgc2hvd1JlZnJlc2hOb3RpY2U6IHRydWUsXHJcbiAgc2hvd0ltcGxpZWRSZWxhdGlvbnM6IHRydWUsXHJcbiAgc2hvd1RyYWlsOiB0cnVlLFxyXG4gIHNob3dHcmlkOiB0cnVlLFxyXG4gIHNob3dKdWdnbDogZmFsc2UsXHJcbiAgc2hvd1ByZXZOZXh0OiB0cnVlLFxyXG4gIHNvcnRCeU5hbWVTaG93QWxpYXM6IGZhbHNlLFxyXG4gIHNxdWFyZURpcmVjdGlvbnNPcmRlcjogWzAsIDEsIDIsIDMsIDRdLFxyXG4gIGxpbWl0VHJhaWxDaGVja2JveGVzOiBbXSxcclxuICBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzOiBbXSxcclxuICBzaG93QWxsOiAnQWxsJyxcclxuICBub1BhdGhNZXNzYWdlOiBgVGhpcyBub3RlIGhhcyBubyByZWFsIG9yIGltcGxpZWQgcGFyZW50c2AsXHJcbiAgdGFnTm90ZUZpZWxkOiBcIlwiLFxyXG4gIHRocmVhZEludG9OZXdQYW5lOiBmYWxzZSxcclxuICB0aHJlYWRpbmdUZW1wbGF0ZTogXCJ7e2ZpZWxkfX0gb2Yge3tjdXJyZW50fX1cIixcclxuICB0aHJlYWRpbmdEaXJUZW1wbGF0ZXM6IHsgdXA6IFwiXCIsIHNhbWU6IFwiXCIsIGRvd246IFwiXCIsIG5leHQ6IFwiXCIsIHByZXY6IFwiXCIgfSxcclxuICB0aHJlYWRVbmRlckN1cnNvcjogZmFsc2UsXHJcbiAgdHJhaWxTZXBlcmF0b3I6IFwiXHUyMTkyXCIsXHJcbiAgdHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmc6IGZhbHNlLFxyXG4gIHRyaW1EZW5kcm9uTm90ZXM6IGZhbHNlLFxyXG4gIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGg6IHRydWUsXHJcbiAgdXNlckhpZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHVwOiBbXCJ1cFwiXSxcclxuICAgICAgc2FtZTogW1wic2FtZVwiXSxcclxuICAgICAgZG93bjogW1wiZG93blwiXSxcclxuICAgICAgbmV4dDogW1wibmV4dFwiXSxcclxuICAgICAgcHJldjogW1wicHJldlwiXSxcclxuICAgIH0sXHJcbiAgXSxcclxuICB3cml0ZUJDc0lubGluZTogZmFsc2UsXHJcbiAgc2hvd1dyaXRlQWxsQkNzQ21kOiBmYWxzZSxcclxuICB2aXNHcmFwaDogXCJGb3JjZSBEaXJlY3RlZCBHcmFwaFwiLFxyXG4gIHZpc1JlbGF0aW9uOiBcIlBhcmVudFwiLFxyXG4gIHZpc0Nsb3NlZDogXCJSZWFsXCIsXHJcbiAgdmlzQWxsOiBcIkFsbFwiLFxyXG4gIHdpa2lsaW5rSW5kZXg6IHRydWUsXHJcbiAgaW1wbGllZFJlbGF0aW9uczoge1xyXG4gICAgc2libGluZ0lkZW50aXR5OiBmYWxzZSxcclxuICAgIHNhbWVQYXJlbnRJc1NpYmxpbmc6IHRydWUsXHJcbiAgICBzaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmc6IGZhbHNlLFxyXG4gICAgc2libGluZ3NQYXJlbnRJc1BhcmVudDogZmFsc2UsXHJcbiAgICBwYXJlbnRzU2libGluZ3NJc1BhcmVudHM6IGZhbHNlLFxyXG4gICAgcGFyZW50c1BhcmVudHNJc1BhcmVudDogZmFsc2UsXHJcbiAgICBjb3VzaW5zSXNTaWJsaW5nOiBmYWxzZSxcclxuICB9LFxyXG4gIHJlZnJlc2hPbk5vdGVTYXZlOiBmYWxzZSxcclxuICBzaG93VXBJbkp1Z2dsOiBmYWxzZVxyXG59O1xyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgSXRlbVZpZXcsIFRGaWxlLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IERlYnVnZ2VyIH0gZnJvbSBcInNyYy9EZWJ1Z2dlclwiO1xyXG5pbXBvcnQgTWF0cml4IGZyb20gXCIuLi9Db21wb25lbnRzL01hdHJpeC5zdmVsdGVcIjtcclxuaW1wb3J0IHtcclxuICBBUlJPV19ESVJFQ1RJT05TLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRGlyZWN0aW9ucyxcclxuICBFZGdlQXR0cixcclxuICBpbnRlcm5hbExpbmtPYmosXHJcbiAgU3F1YXJlSXRlbSxcclxuICBTcXVhcmVQcm9wcyxcclxuICBVc2VySGllcixcclxufSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldE9wcERpciwgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0Q3VyckZpbGUsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBjbG9zZWRHLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBuZWlnaGJvdXJzID0gYmxhbmtSZWFsTkltcGxpZWQoKTtcclxuICBpZiAoIWNsb3NlZEcpIHJldHVybiBuZWlnaGJvdXJzO1xyXG5cclxuICBjbG9zZWRHLmZvckVhY2hFZGdlKGN1cnJOb2RlLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyLCBpbXBsaWVkIH0gPSBhIGFzIEVkZ2VBdHRyO1xyXG5cclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZWlnaGJvdXJzW2Rpcl0ucmVhbHMucHVzaCh7IHRvOiB0LCBmaWVsZCwgaW1wbGllZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5laWdoYm91cnNbZ2V0T3BwRGlyKGRpcildLmltcGxpZWRzLnB1c2goe1xyXG4gICAgICAgIHRvOiBzLFxyXG4gICAgICAgIGZpZWxkOiBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXSxcclxuICAgICAgICBpbXBsaWVkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIG5laWdoYm91cnM7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0cml4VmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogTWF0cml4O1xyXG4gIGRiOiBEZWJ1Z2dlcjtcclxuXHJcbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIobGVhZik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLm9ubG9hZCgpO1xyXG4gICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXM7XHJcblxyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dChcclxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyYXcoKSxcclxuICAgICAgICBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3XHJcbiAgICAgICAgICA/IGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IHBsdWdpbi5zZXR0aW5ncy5kdldhaXRUaW1lXHJcbiAgICAgICAgICA6IDMwMDBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gTUFUUklYX1ZJRVc7XHJcbiAgfVxyXG4gIGdldERpc3BsYXlUZXh0KCkge1xyXG4gICAgcmV0dXJuIFwiQnJlYWRjcnVtYnMgTWF0cml4XCI7XHJcbiAgfVxyXG4gIGljb24gPSBUUkFJTF9JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGdldEFsdChub2RlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHsgcGx1Z2luIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgeyBhbHRMaW5rRmllbGRzLCBzaG93QWxsQWxpYXNlcyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gICAgaWYgKCFhbHRMaW5rRmllbGRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gZHYgRmlyc3RcclxuICAgIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICAgIGlmIChkdikge1xyXG4gICAgICBjb25zdCBwYWdlID0gZHYucGFnZShub2RlKTtcclxuICAgICAgaWYgKCFwYWdlKSByZXR1cm4gbnVsbDtcclxuICAgICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGFnZVthbHRdIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm9kZSwgXCJcIik7XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgeyBmcm9udG1hdHRlciB9ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgYWx0RmllbGQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgICBjb25zdCBhcnI6IHN0cmluZ1tdID1cclxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gc3BsaXRBbmRUcmltKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9JbnRlcm5hbExpbmtPYmogPSAoXHJcbiAgICB0bzogc3RyaW5nLFxyXG4gICAgcmVhbFEgPSB0cnVlLFxyXG4gICAgcGFyZW50OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgaW1wbGllZD86IHN0cmluZ1xyXG4gICk6IGludGVybmFsTGlua09iaiA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0byxcclxuICAgICAgY2xzOiBsaW5rQ2xhc3ModG8sIHJlYWxRKSxcclxuICAgICAgYWx0OiB0aGlzLmdldEFsdCh0byksXHJcbiAgICAgIG9yZGVyOiB0aGlzLmdldE9yZGVyKHRvKSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBpbXBsaWVkLFxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICAvLyBBTkNIT1IgUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkIGxpbmtzXHJcblxyXG4gIHJlbW92ZUR1cGxpY2F0ZUltcGxpZWQoXHJcbiAgICByZWFsczogaW50ZXJuYWxMaW5rT2JqW10sXHJcbiAgICBpbXBsaWVkczogaW50ZXJuYWxMaW5rT2JqW11cclxuICApOiBpbnRlcm5hbExpbmtPYmpbXSB7XHJcbiAgICBjb25zdCByZWFsVG9zID0gcmVhbHMubWFwKChyZWFsKSA9PiByZWFsLnRvKTtcclxuICAgIHJldHVybiBpbXBsaWVkcy5maWx0ZXIoKGltcGxpZWQpID0+ICFyZWFsVG9zLmluY2x1ZGVzKGltcGxpZWQudG8pKTtcclxuICB9XHJcblxyXG4gIGdldE9yZGVyID0gKG5vZGU6IHN0cmluZykgPT5cclxuICAgIE51bWJlci5wYXJzZUludCh0aGlzLnBsdWdpbi5tYWluRy5nZXROb2RlQXR0cmlidXRlKG5vZGUsIFwib3JkZXJcIikpO1xyXG5cclxuICBzb3J0SXRlbXNBbHBoYSA9IChhOiBpbnRlcm5hbExpbmtPYmosIGI6IGludGVybmFsTGlua09iaikgPT4ge1xyXG4gICAgY29uc3QgeyBzb3J0QnlOYW1lU2hvd0FsaWFzLCBhbHBoYVNvcnRBc2MgfSA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgY29uc3QgYVRvU29ydCA9IChzb3J0QnlOYW1lU2hvd0FsaWFzID8gYS50byA6IGEuYWx0ID8/IGEudG8pLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBiVG9Tb3J0ID0gKHNvcnRCeU5hbWVTaG93QWxpYXMgPyBiLnRvIDogYi5hbHQgPz8gYi50bykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBsZXNzID0gYWxwaGFTb3J0QXNjID8gLTEgOiAxO1xyXG4gICAgY29uc3QgbW9yZSA9IGFscGhhU29ydEFzYyA/IDEgOiAtMTtcclxuXHJcbiAgICByZXR1cm4gYVRvU29ydCA8IGJUb1NvcnQgPyBsZXNzIDogbW9yZTtcclxuICB9O1xyXG5cclxuICBnZXRIaWVyU3F1YXJlcyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGN1cnJGaWxlOiBURmlsZSk6IFNxdWFyZVByb3BzW11bXSB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IGVuYWJsZUFscGhhU29ydCwgc3F1YXJlRGlyZWN0aW9uc09yZGVyIH0gPSBzZXR0aW5ncztcclxuICAgIGlmICghbWFpbkcpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBjdXJyRmlsZTtcclxuICAgIGlmICghbWFpbkcuaGFzTm9kZShiYXNlbmFtZSkpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IHJlYWxzbkltcGxpZWRzID0gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW4sIGJhc2VuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gdXNlckhpZXJzLm1hcCgoaGllcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlYWxOSW1wbGllZCA9IGJsYW5rUmVhbE5JbXBsaWVkKCkgYXMgdW5rbm93biBhcyB7XHJcbiAgICAgICAgW2RpciBpbiBEaXJlY3Rpb25zXToge1xyXG4gICAgICAgICAgcmVhbHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgICAgaW1wbGllZHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXN1bHRzRmlsdGVyID0gKFxyXG4gICAgICAgIGl0ZW06IFNxdWFyZUl0ZW0sXHJcbiAgICAgICAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gICAgICAgIG9wcERpcjogRGlyZWN0aW9ucyxcclxuICAgICAgICBhcnJvdzogc3RyaW5nXHJcbiAgICAgICkgPT5cclxuICAgICAgICBoaWVyW2Rpcl0uaW5jbHVkZXMoaXRlbS5maWVsZCkgfHxcclxuICAgICAgICAoaXRlbS5maWVsZC5pbmNsdWRlcyhgPCR7YXJyb3d9PmApICYmXHJcbiAgICAgICAgICBoaWVyW29wcERpcl0uaW5jbHVkZXMoaXRlbS5maWVsZC5zcGxpdChcIiA8XCIpWzBdKSk7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRpciBpbiByZWFsc25JbXBsaWVkcykge1xyXG4gICAgICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIgYXMgRGlyZWN0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYXJyb3cgPSBBUlJPV19ESVJFQ1RJT05TW2Rpcl07XHJcbiAgICAgICAgY29uc3QgeyByZWFscywgaW1wbGllZHMgfSA9IHJlYWxzbkltcGxpZWRzW2Rpcl07XHJcblxyXG4gICAgICAgIGZpbHRlcmVkUmVhbE5JbXBsaWVkW2Rpcl0ucmVhbHMgPSByZWFsc1xyXG4gICAgICAgICAgLmZpbHRlcigocmVhbCkgPT5cclxuICAgICAgICAgICAgcmVzdWx0c0ZpbHRlcihyZWFsLCBkaXIgYXMgRGlyZWN0aW9ucywgb3BwRGlyLCBhcnJvdylcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgIHRoaXMudG9JbnRlcm5hbExpbmtPYmooaXRlbS50bywgdHJ1ZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZmlsdGVyZWRSZWFsTkltcGxpZWRbZGlyXS5pbXBsaWVkcyA9IGltcGxpZWRzXHJcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkKSA9PlxyXG4gICAgICAgICAgICByZXN1bHRzRmlsdGVyKGltcGxpZWQsIGRpciBhcyBEaXJlY3Rpb25zLCBvcHBEaXIsIGFycm93KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgICAgdGhpcy50b0ludGVybmFsTGlua09iaihpdGVtLnRvLCBmYWxzZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHtcclxuICAgICAgICB1cDogeyByZWFsczogcnUsIGltcGxpZWRzOiBpdSB9LFxyXG4gICAgICAgIHNhbWU6IHsgcmVhbHM6IHJzLCBpbXBsaWVkczogaXMgfSxcclxuICAgICAgICBkb3duOiB7IHJlYWxzOiByZCwgaW1wbGllZHM6IGlkIH0sXHJcbiAgICAgICAgbmV4dDogeyByZWFsczogcm4sIGltcGxpZWRzOiBpTiB9LFxyXG4gICAgICAgIHByZXY6IHsgcmVhbHM6IHJwLCBpbXBsaWVkczogaXAgfSxcclxuICAgICAgfSA9IGZpbHRlcmVkUmVhbE5JbXBsaWVkO1xyXG5cclxuICAgICAgLy8gIVNFQ1RJT05cclxuXHJcbiAgICAgIFtpdSwgaXMsIGlkLCBpTiwgaXBdID0gW1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChydSwgaXUpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycywgaXMpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChyZCwgaWQpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChybiwgaU4pLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycCwgaXApLFxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgaVNhbWVOb0R1cDogaW50ZXJuYWxMaW5rT2JqW10gPSBbXTtcclxuICAgICAgaXMuZm9yRWFjaCgoaW1wU2liKSA9PiB7XHJcbiAgICAgICAgaWYgKGlTYW1lTm9EdXAuZXZlcnkoKG5vRHVwKSA9PiBub0R1cC50byAhPT0gaW1wU2liLnRvKSkge1xyXG4gICAgICAgICAgaVNhbWVOb0R1cC5wdXNoKGltcFNpYik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXMgPSBpU2FtZU5vRHVwO1xyXG5cclxuICAgICAgY29uc3QgZ2V0RmllbGRJbkhpZXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgICAgIGhpZXJbZGlyXVswXVxyXG4gICAgICAgICAgPyBoaWVyW2Rpcl0uam9pbihcIiwgXCIpXHJcbiAgICAgICAgICA6IGAke2hpZXJbZ2V0T3BwRGlyKGRpcildLmpvaW4oXCIsXCIpfSR7QVJST1dfRElSRUNUSU9OU1tkaXJdfWA7XHJcblxyXG4gICAgICBjb25zdCBzcXVhcmVzID0gW3J1LCBycywgcmQsIHJuLCBycCwgaXUsIGlzLCBpZCwgaU4sIGlwXTtcclxuXHJcbiAgICAgIGlmIChlbmFibGVBbHBoYVNvcnQpXHJcbiAgICAgICAgc3F1YXJlcy5mb3JFYWNoKChzcSkgPT4gc3Euc29ydCh0aGlzLnNvcnRJdGVtc0FscGhhKSk7XHJcblxyXG4gICAgICBzcXVhcmVzLmZvckVhY2goKHNxKSA9PiBzcS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikpO1xyXG5cclxuICAgICAgaW5mbyhbXHJcbiAgICAgICAgeyBydSB9LFxyXG4gICAgICAgIHsgcnMgfSxcclxuICAgICAgICB7IHJkIH0sXHJcbiAgICAgICAgeyBybiB9LFxyXG4gICAgICAgIHsgcnAgfSxcclxuICAgICAgICB7IGl1IH0sXHJcbiAgICAgICAgeyBpcyB9LFxyXG4gICAgICAgIHsgaWQgfSxcclxuICAgICAgICB7IGlOIH0sXHJcbiAgICAgICAgeyBpcCB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGNvbnN0IHNxdWFyZSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJ1LFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpdSxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInVwXCIpLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJlYWxJdGVtczogcnMsXHJcbiAgICAgICAgICBpbXBsaWVkSXRlbXM6IGlzLFxyXG4gICAgICAgICAgZmllbGQ6IGdldEZpZWxkSW5IaWVyKFwic2FtZVwiKSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJkLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpZCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcImRvd25cIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJuLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpTixcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcIm5leHRcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJwLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpcCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInByZXZcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuXHJcbiAgICAgIHJldHVybiBzcXVhcmVEaXJlY3Rpb25zT3JkZXIubWFwKChvcmRlcikgPT4gc3F1YXJlW29yZGVyXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGNvbnRlbnRFbCwgZGIsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgICAgZGIuc3RhcnQyRyhcIkRyYXcgTWF0cml4IFZpZXdcIik7XHJcbiAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgICAgY29uc3QgeyB1c2VySGllcnMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgICAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaGllclNxdWFyZXMgPSB0aGlzLmdldEhpZXJTcXVhcmVzKHVzZXJIaWVycywgY3VyckZpbGUpLmZpbHRlcihcclxuICAgICAgICAoc3F1YXJlQXJyKSA9PlxyXG4gICAgICAgICAgc3F1YXJlQXJyLnNvbWUoXHJcbiAgICAgICAgICAgIChzcSkgPT4gc3EucmVhbEl0ZW1zLmxlbmd0aCArIHNxLmltcGxpZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBuZXcgTWF0cml4KHtcclxuICAgICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgICBwcm9wczogeyBoaWVyU3F1YXJlcywgbWF0cml4VmlldzogdGhpcywgY3VyckZpbGUgfSxcclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgICBkYi5lbmQyRygpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGVycm9yKGVycik7XHJcbiAgICAgIHRoaXMuZGIuZW5kMkcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IGRlYnVnLCBpbmZvLCBsZXZlbHMgfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGVidWdnZXIge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBkZWJ1Z0xlc3NUaGFuID0gKGxldmVsOiBudW1iZXIpID0+XHJcbiAgICBsZXZlbHNbdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlXSA8IGxldmVsO1xyXG5cclxuICBzdGFydDJHKGdyb3VwOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMykpIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoZ3JvdXApO1xyXG4gIH1cclxuICBlbmQyRyguLi5tc2dzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuZGVidWdMZXNzVGhhbigzKSkge1xyXG4gICAgICBpZiAobXNncy5sZW5ndGgpIGluZm8oLi4ubXNncyk7XHJcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnQxRyhncm91cDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z0xlc3NUaGFuKDIpKSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGdyb3VwKTtcclxuICB9XHJcbiAgZW5kMUcoLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMikpIHtcclxuICAgICAgaWYgKG1zZ3MubGVuZ3RoKSBkZWJ1ZyguLi5tc2dzKTtcclxuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRHcyguLi5ncm91cHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnN0YXJ0MkcoZ3JvdXBzWzBdKTtcclxuICAgIGlmIChncm91cHNbMV0pIHRoaXMuc3RhcnQxRyhncm91cHNbMV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIGEgZGVidWcgYW5kIGluZm8gZ3JvdXAsIGxvZ2dpbmcgYG1zZ3NgIGluIGBlbmREZWJ1Z0dyb3VwYFxyXG4gICAqIEBwYXJhbSAgezF8Mn0gY291bnQgVGhlIG51bWJlciBvZiBncm91cHMgdG8gZW5kLiBgMWAgZW5kcyBUcmFjZSwgMiBlbmRzIGJvdGhcclxuICAgKiBAcGFyYW0gIHthbnlbXX0gLi4ubXNnc1xyXG4gICAqL1xyXG4gIGVuZEdzKGNvdW50OiAxIHwgMiwgLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmIChjb3VudCA9PT0gMSkgdGhpcy5lbmQyRyguLi5tc2dzKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZDFHKCk7XHJcbiAgICAgIHRoaXMuZW5kMkcoLi4ubXNncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5sZXQgc3JjX3VybF9lcXVhbF9hbmNob3I7XG5mdW5jdGlvbiBzcmNfdXJsX2VxdWFsKGVsZW1lbnRfc3JjLCB1cmwpIHtcbiAgICBpZiAoIXNyY191cmxfZXF1YWxfYW5jaG9yKSB7XG4gICAgICAgIHNyY191cmxfZXF1YWxfYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIH1cbiAgICBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmID0gdXJsO1xuICAgIHJldHVybiBlbGVtZW50X3NyYyA9PT0gc3JjX3VybF9lcXVhbF9hbmNob3IuaHJlZjtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmIChzdG9yZSAhPSBudWxsICYmIHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgLi4uY2FsbGJhY2tzKSB7XG4gICAgaWYgKHN0b3JlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKC4uLmNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdICYmIGZuXG4gICAgICAgID8gYXNzaWduKCQkc2NvcGUuY3R4LnNsaWNlKCksIGRlZmluaXRpb25bMV0oZm4oY3R4KSkpXG4gICAgICAgIDogJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uWzJdICYmIGZuKSB7XG4gICAgICAgIGNvbnN0IGxldHMgPSBkZWZpbml0aW9uWzJdKGZuKGRpcnR5KSk7XG4gICAgICAgIGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgoJCRzY29wZS5kaXJ0eS5sZW5ndGgsIGxldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRbaV0gPSAkJHNjb3BlLmRpcnR5W2ldIHwgbGV0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuICAgIH1cbiAgICByZXR1cm4gJCRzY29wZS5kaXJ0eTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcbiAgICB1cGRhdGVfc2xvdF9iYXNlKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBzbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHRfZm4pO1xufVxuZnVuY3Rpb24gZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlKCQkc2NvcGUpIHtcbiAgICBpZiAoJCRzY29wZS5jdHgubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgY29uc3QgZGlydHkgPSBbXTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gJCRzY29wZS5jdHgubGVuZ3RoIC8gMzI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRpcnR5W2ldID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICBrZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9zbG90cyhzbG90cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5jb25zdCBoYXNfcHJvcCA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuZnVuY3Rpb24gYWN0aW9uX2Rlc3Ryb3llcihhY3Rpb25fcmVzdWx0KSB7XG4gICAgcmV0dXJuIGFjdGlvbl9yZXN1bHQgJiYgaXNfZnVuY3Rpb24oYWN0aW9uX3Jlc3VsdC5kZXN0cm95KSA/IGFjdGlvbl9yZXN1bHQuZGVzdHJveSA6IG5vb3A7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKG5vdykge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFzay5jKG5vdykpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2suZigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRhc2tzLnNpemUgIT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxuICovXG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICB0YXNrcy5jbGVhcigpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhc2sgdGhhdCBydW5zIG9uIGVhY2ggcmFmIGZyYW1lXG4gKiB1bnRpbCBpdCByZXR1cm5zIGEgZmFsc3kgdmFsdWUgb3IgaXMgYWJvcnRlZFxuICovXG5mdW5jdGlvbiBsb29wKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKHRhc2tzLnNpemUgPT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bGZpbGwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUcmFjayB3aGljaCBub2RlcyBhcmUgY2xhaW1lZCBkdXJpbmcgaHlkcmF0aW9uLiBVbmNsYWltZWQgbm9kZXMgY2FuIHRoZW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cbi8vIGF0IHRoZSBlbmQgb2YgaHlkcmF0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlbWFpbmluZyBub2Rlcy5cbmxldCBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHN0YXJ0X2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gZW5kX2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwcGVyX2JvdW5kKGxvdywgaGlnaCwga2V5LCB2YWx1ZSkge1xuICAgIC8vIFJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZSBsYXJnZXIgdGhhbiBpbnB1dCB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2xvdywgaGlnaClcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuICAgICAgICBpZiAoa2V5KG1pZCkgPD0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG59XG5mdW5jdGlvbiBpbml0X2h5ZHJhdGUodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oeWRyYXRlX2luaXQpXG4gICAgICAgIHJldHVybjtcbiAgICB0YXJnZXQuaHlkcmF0ZV9pbml0ID0gdHJ1ZTtcbiAgICAvLyBXZSBrbm93IHRoYXQgYWxsIGNoaWxkcmVuIGhhdmUgY2xhaW1fb3JkZXIgdmFsdWVzIHNpbmNlIHRoZSB1bmNsYWltZWQgaGF2ZSBiZWVuIGRldGFjaGVkIGlmIHRhcmdldCBpcyBub3QgPGhlYWQ+XG4gICAgbGV0IGNoaWxkcmVuID0gdGFyZ2V0LmNoaWxkTm9kZXM7XG4gICAgLy8gSWYgdGFyZ2V0IGlzIDxoZWFkPiwgdGhlcmUgbWF5IGJlIGNoaWxkcmVuIHdpdGhvdXQgY2xhaW1fb3JkZXJcbiAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAnSEVBRCcpIHtcbiAgICAgICAgY29uc3QgbXlDaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9kZS5jbGFpbV9vcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbXlDaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gbXlDaGlsZHJlbjtcbiAgICB9XG4gICAgLypcbiAgICAqIFJlb3JkZXIgY2xhaW1lZCBjaGlsZHJlbiBvcHRpbWFsbHkuXG4gICAgKiBXZSBjYW4gcmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseSBieSBmaW5kaW5nIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIG9mXG4gICAgKiBub2RlcyB0aGF0IGFyZSBhbHJlYWR5IGNsYWltZWQgaW4gb3JkZXIgYW5kIG9ubHkgbW92aW5nIHRoZSByZXN0LiBUaGUgbG9uZ2VzdFxuICAgICogc3Vic2VxdWVuY2Ugc3Vic2VxdWVuY2Ugb2Ygbm9kZXMgdGhhdCBhcmUgY2xhaW1lZCBpbiBvcmRlciBjYW4gYmUgZm91bmQgYnlcbiAgICAqIGNvbXB1dGluZyB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIC5jbGFpbV9vcmRlciB2YWx1ZXMuXG4gICAgKlxuICAgICogVGhpcyBhbGdvcml0aG0gaXMgb3B0aW1hbCBpbiBnZW5lcmF0aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgcmVvcmRlciBvcGVyYXRpb25zXG4gICAgKiBwb3NzaWJsZS5cbiAgICAqXG4gICAgKiBQcm9vZjpcbiAgICAqIFdlIGtub3cgdGhhdCwgZ2l2ZW4gYSBzZXQgb2YgcmVvcmRlcmluZyBvcGVyYXRpb25zLCB0aGUgbm9kZXMgdGhhdCBkbyBub3QgbW92ZVxuICAgICogYWx3YXlzIGZvcm0gYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSwgc2luY2UgdGhleSBkbyBub3QgbW92ZSBhbW9uZyBlYWNoIG90aGVyXG4gICAgKiBtZWFuaW5nIHRoYXQgdGhleSBtdXN0IGJlIGFscmVhZHkgb3JkZXJlZCBhbW9uZyBlYWNoIG90aGVyLiBUaHVzLCB0aGUgbWF4aW1hbFxuICAgICogc2V0IG9mIG5vZGVzIHRoYXQgZG8gbm90IG1vdmUgZm9ybSBhIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZS5cbiAgICAqL1xuICAgIC8vIENvbXB1dGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgLy8gbTogc3Vic2VxdWVuY2UgbGVuZ3RoIGogPT4gaW5kZXggayBvZiBzbWFsbGVzdCB2YWx1ZSB0aGF0IGVuZHMgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggalxuICAgIGNvbnN0IG0gPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKTtcbiAgICAvLyBQcmVkZWNlc3NvciBpbmRpY2VzICsgMVxuICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGgpO1xuICAgIG1bMF0gPSAtMTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gY2hpbGRyZW5baV0uY2xhaW1fb3JkZXI7XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhcmdlc3Qgc3Vic2VxdWVuY2UgbGVuZ3RoIHN1Y2ggdGhhdCBpdCBlbmRzIGluIGEgdmFsdWUgbGVzcyB0aGFuIG91ciBjdXJyZW50IHZhbHVlXG4gICAgICAgIC8vIHVwcGVyX2JvdW5kIHJldHVybnMgZmlyc3QgZ3JlYXRlciB2YWx1ZSwgc28gd2Ugc3VidHJhY3Qgb25lXG4gICAgICAgIC8vIHdpdGggZmFzdCBwYXRoIGZvciB3aGVuIHdlIGFyZSBvbiB0aGUgY3VycmVudCBsb25nZXN0IHN1YnNlcXVlbmNlXG4gICAgICAgIGNvbnN0IHNlcUxlbiA9ICgobG9uZ2VzdCA+IDAgJiYgY2hpbGRyZW5bbVtsb25nZXN0XV0uY2xhaW1fb3JkZXIgPD0gY3VycmVudCkgPyBsb25nZXN0ICsgMSA6IHVwcGVyX2JvdW5kKDEsIGxvbmdlc3QsIGlkeCA9PiBjaGlsZHJlblttW2lkeF1dLmNsYWltX29yZGVyLCBjdXJyZW50KSkgLSAxO1xuICAgICAgICBwW2ldID0gbVtzZXFMZW5dICsgMTtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gc2VxTGVuICsgMTtcbiAgICAgICAgLy8gV2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN1cnJlbnQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlLiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgZ2VuZXJhdGVkIGEgbG9uZ2VyIHNlcXVlbmNlLlxuICAgICAgICBtW25ld0xlbl0gPSBpO1xuICAgICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmV3TGVuLCBsb25nZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBub2RlcyAoaW5pdGlhbGx5IHJldmVyc2VkKVxuICAgIGNvbnN0IGxpcyA9IFtdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBub2Rlcywgbm9kZXMgdGhhdCB3aWxsIGJlIG1vdmVkXG4gICAgY29uc3QgdG9Nb3ZlID0gW107XG4gICAgbGV0IGxhc3QgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGN1ciA9IG1bbG9uZ2VzdF0gKyAxOyBjdXIgIT0gMDsgY3VyID0gcFtjdXIgLSAxXSkge1xuICAgICAgICBsaXMucHVzaChjaGlsZHJlbltjdXIgLSAxXSk7XG4gICAgICAgIGZvciAoOyBsYXN0ID49IGN1cjsgbGFzdC0tKSB7XG4gICAgICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdC0tO1xuICAgIH1cbiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHtcbiAgICAgICAgdG9Nb3ZlLnB1c2goY2hpbGRyZW5bbGFzdF0pO1xuICAgIH1cbiAgICBsaXMucmV2ZXJzZSgpO1xuICAgIC8vIFdlIHNvcnQgdGhlIG5vZGVzIGJlaW5nIG1vdmVkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZWlyIGluc2VydGlvbiBvcmRlciBtYXRjaGVzIHRoZSBjbGFpbSBvcmRlclxuICAgIHRvTW92ZS5zb3J0KChhLCBiKSA9PiBhLmNsYWltX29yZGVyIC0gYi5jbGFpbV9vcmRlcik7XG4gICAgLy8gRmluYWxseSwgd2UgbW92ZSB0aGUgbm9kZXNcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0b01vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd2hpbGUgKGogPCBsaXMubGVuZ3RoICYmIHRvTW92ZVtpXS5jbGFpbV9vcmRlciA+PSBsaXNbal0uY2xhaW1fb3JkZXIpIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmNob3IgPSBqIDwgbGlzLmxlbmd0aCA/IGxpc1tqXSA6IG51bGw7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUodG9Nb3ZlW2ldLCBhbmNob3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIG5vZGUpIHtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzKHRhcmdldCwgc3R5bGVfc2hlZXRfaWQsIHN0eWxlcykge1xuICAgIGNvbnN0IGFwcGVuZF9zdHlsZXNfdG8gPSBnZXRfcm9vdF9mb3Jfc3R5bGUodGFyZ2V0KTtcbiAgICBpZiAoIWFwcGVuZF9zdHlsZXNfdG8uZ2V0RWxlbWVudEJ5SWQoc3R5bGVfc2hlZXRfaWQpKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZV9zaGVldF9pZDtcbiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgICAgIGFwcGVuZF9zdHlsZXNoZWV0KGFwcGVuZF9zdHlsZXNfdG8sIHN0eWxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSkge1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIGNvbnN0IHJvb3QgPSBub2RlLmdldFJvb3ROb2RlID8gbm9kZS5nZXRSb290Tm9kZSgpIDogbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmIChyb290ICYmIHJvb3QuaG9zdCkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZV9lbGVtZW50ID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICBhcHBlbmRfc3R5bGVzaGVldChnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSksIHN0eWxlX2VsZW1lbnQpO1xuICAgIHJldHVybiBzdHlsZV9lbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX3N0eWxlc2hlZXQobm9kZSwgc3R5bGUpIHtcbiAgICBhcHBlbmQobm9kZS5oZWFkIHx8IG5vZGUsIHN0eWxlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKSB7XG4gICAgaWYgKGlzX2h5ZHJhdGluZykge1xuICAgICAgICBpbml0X2h5ZHJhdGUodGFyZ2V0KTtcbiAgICAgICAgaWYgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9PT0gdW5kZWZpbmVkKSB8fCAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQucGFyZW50RWxlbWVudCAhPT0gdGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBub2RlcyBvZiB1bmRlZmluZWQgb3JkZXJpbmdcbiAgICAgICAgd2hpbGUgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCAhPT0gbnVsbCkgJiYgKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLmNsYWltX29yZGVyID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlICE9PSB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBpbnNlcnQgaWYgdGhlIG9yZGVyaW5nIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUgbW9kaWZpZWQgb3IgdGhlIHBhcmVudCBub2RlIGlzIG5vdCB0YXJnZXRcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQgfHwgbm9kZS5wYXJlbnROb2RlICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nICYmICFhbmNob3IpIHtcbiAgICAgICAgYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9IGFuY2hvcikge1xuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXNfcHJvcChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiB0cnVzdGVkKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC5pc1RydXN0ZWQpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHR5cGVvZiBub2RlW3Byb3BdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICcnID8gdHJ1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBpbml0X2NsYWltX2luZm8obm9kZXMpIHtcbiAgICBpZiAobm9kZXMuY2xhaW1faW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGVzLmNsYWltX2luZm8gPSB7IGxhc3RfaW5kZXg6IDAsIHRvdGFsX2NsYWltZWQ6IDAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGFpbV9ub2RlKG5vZGVzLCBwcmVkaWNhdGUsIHByb2Nlc3NOb2RlLCBjcmVhdGVOb2RlLCBkb250VXBkYXRlTGFzdEluZGV4ID0gZmFsc2UpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBub2RlcyBpbiBhbiBvcmRlciBzdWNoIHRoYXQgd2UgbGVuZ3RoZW4gdGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgcmVzdWx0Tm9kZSA9ICgoKSA9PiB7XG4gICAgICAgIC8vIFdlIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZVxuICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4OyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHByb2Nlc3NOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZG9udFVwZGF0ZUxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHRyeSB0byBmaW5kIG9uZSBiZWZvcmVcbiAgICAgICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIHNvIHRoYXQgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugc3BsaWNlZCBiZWZvcmUgdGhlIGxhc3RfaW5kZXgsIHdlIGRlY3JlYXNlIGl0XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFueSBtYXRjaGluZyBub2RlLCB3ZSBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIHJldHVybiBjcmVhdGVOb2RlKCk7XG4gICAgfSkoKTtcbiAgICByZXN1bHROb2RlLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgIG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZCArPSAxO1xuICAgIHJldHVybiByZXN1bHROb2RlO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBjcmVhdGVfZWxlbWVudCkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlTmFtZSA9PT0gbmFtZSwgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZS5mb3JFYWNoKHYgPT4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUodikpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sICgpID0+IGNyZWF0ZV9lbGVtZW50KG5hbWUpKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGNsYWltX3N2Z19lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgc3ZnX2VsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMywgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9ICcnICsgZGF0YTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YS5zdGFydHNXaXRoKGRhdGFTdHIpKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhLmxlbmd0aCAhPT0gZGF0YVN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zcGxpdFRleHQoZGF0YVN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gZGF0YVN0cjtcbiAgICAgICAgfVxuICAgIH0sICgpID0+IHRleHQoZGF0YSksIHRydWUgLy8gVGV4dCBub2RlcyBzaG91bGQgbm90IHVwZGF0ZSBsYXN0IGluZGV4IHNpbmNlIGl0IGlzIGxpa2VseSBub3Qgd29ydGggaXQgdG8gZWxpbWluYXRlIGFuIGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgYWN0dWFsIGVsZW1lbnRzXG4gICAgKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBmaW5kX2NvbW1lbnQobm9kZXMsIHRleHQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBjb21tZW50IG5vZGUgKi8gJiYgbm9kZS50ZXh0Q29udGVudC50cmltKCkgPT09IHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjbGFpbV9odG1sX3RhZyhub2Rlcykge1xuICAgIC8vIGZpbmQgaHRtbCBvcGVuaW5nIHRhZ1xuICAgIGNvbnN0IHN0YXJ0X2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfU1RBUlQnLCAwKTtcbiAgICBjb25zdCBlbmRfaW5kZXggPSBmaW5kX2NvbW1lbnQobm9kZXMsICdIVE1MX1RBR19FTkQnLCBzdGFydF9pbmRleCk7XG4gICAgaWYgKHN0YXJ0X2luZGV4ID09PSBlbmRfaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKCk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCArIDEpO1xuICAgIGRldGFjaChodG1sX3RhZ19ub2Rlc1swXSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzW2h0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICBjb25zdCBjbGFpbWVkX25vZGVzID0gaHRtbF90YWdfbm9kZXMuc2xpY2UoMSwgaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMSk7XG4gICAgZm9yIChjb25zdCBuIG9mIGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgbi5jbGFpbV9vcmRlciA9IG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZDtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbihjbGFpbWVkX25vZGVzKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIGJ1YmJsZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5X3NlbGVjdG9yX2FsbChzZWxlY3RvciwgcGFyZW50ID0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICB9XG4gICAgbShodG1sLCB0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmUpIHtcbiAgICAgICAgICAgIHRoaXMuZSA9IGVsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuYyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmkoYW5jaG9yKTtcbiAgICB9XG4gICAgaChodG1sKSB7XG4gICAgICAgIHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLm4gPSBBcnJheS5mcm9tKHRoaXMuZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kKCk7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICAgICAgdGhpcy5pKHRoaXMuYSk7XG4gICAgfVxuICAgIGQoKSB7XG4gICAgICAgIHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG4gICAgfVxufVxuY2xhc3MgSHRtbFRhZ0h5ZHJhdGlvbiBleHRlbmRzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sID0gY2xhaW1lZF9ub2RlcztcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmwpIHtcbiAgICAgICAgICAgIHRoaXMubiA9IHRoaXMubDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydF9oeWRyYXRpb24odGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSk7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gZ2V0QWxsQ29udGV4dHMoKSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQ7XG59XG5mdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmhhcyhrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbi5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IChwcm9ncmFtLmIgLSB0KTtcbiAgICAgICAgZHVyYXRpb24gKj0gTWF0aC5hYnMoZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhOiB0LFxuICAgICAgICAgICAgYjogcHJvZ3JhbS5iLFxuICAgICAgICAgICAgZCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHByb2dyYW0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHByb2dyYW0uc3RhcnQgKyBkdXJhdGlvbixcbiAgICAgICAgICAgIGdyb3VwOiBwcm9ncmFtLmdyb3VwXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKGIpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBub3coKSArIGRlbGF5LFxuICAgICAgICAgICAgYlxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBwcm9ncmFtLmdyb3VwID0gb3V0cm9zO1xuICAgICAgICAgICAgb3V0cm9zLnIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW50cm8sIGFuZCB0aGVyZSdzIGEgZGVsYXksIHdlIG5lZWQgdG8gZG9cbiAgICAgICAgICAgIC8vIGFuIGluaXRpYWwgdGljayBhbmQvb3IgYXBwbHkgQ1NTIGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGIsICdzdGFydCcpKTtcbiAgICAgICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ19wcm9ncmFtICYmIG5vdyA+IHBlbmRpbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBydW5uaW5nX3Byb2dyYW0uYiwgcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uLCAwLCBlYXNpbmcsIGNvbmZpZy5jc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQgPSBydW5uaW5nX3Byb2dyYW0uYiwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0uYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRybyBcdTIwMTQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRybyBcdTIwMTQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChydW5uaW5nX3Byb2dyYW0uZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gbm93IC0gcnVubmluZ19wcm9ncmFtLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bm5pbmdfcHJvZ3JhbS5hICsgcnVubmluZ19wcm9ncmFtLmQgKiBlYXNpbmcocCAvIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gISEocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBydW4oYikge1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZV9wcm9taXNlKHByb21pc2UsIGluZm8pIHtcbiAgICBjb25zdCB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZm8udG9rZW4gIT09IHRva2VuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbmZvLnJlc29sdmVkID0gdmFsdWU7XG4gICAgICAgIGxldCBjaGlsZF9jdHggPSBpbmZvLmN0eDtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGlsZF9jdHggPSBjaGlsZF9jdHguc2xpY2UoKTtcbiAgICAgICAgICAgIGNoaWxkX2N0eFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvY2sgPSB0eXBlICYmIChpbmZvLmN1cnJlbnQgPSB0eXBlKShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgbmVlZHNfZmx1c2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKGluZm8uYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrc1tpXSA9PT0gYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibG9ja3NbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2suZCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICAgICAgYmxvY2subShpbmZvLm1vdW50KCksIGluZm8uYW5jaG9yKTtcbiAgICAgICAgICAgIG5lZWRzX2ZsdXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrcylcbiAgICAgICAgICAgIGluZm8uYmxvY2tzW2luZGV4XSA9IGJsb2NrO1xuICAgICAgICBpZiAobmVlZHNfZmx1c2gpIHtcbiAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudF9jb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICAgICAgaWYgKCFpbmZvLmhhc0NhdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBwcmV2aW91c2x5IGhhZCBhIHRoZW4vY2F0Y2ggYmxvY2ssIGRlc3Ryb3kgaXRcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHByb21pc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX2F3YWl0X2Jsb2NrX2JyYW5jaChpbmZvLCBjdHgsIGRpcnR5KSB7XG4gICAgY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gaW5mbztcbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8udmFsdWVdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGlmIChpbmZvLmN1cnJlbnQgPT09IGluZm8uY2F0Y2gpIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8uZXJyb3JdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGluZm8uYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gd2luZG93XG4gICAgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgIDogZ2xvYmFsKTtcblxuZnVuY3Rpb24gZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZCgxKTtcbiAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZml4X2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9rZXllZF9lYWNoKG9sZF9ibG9ja3MsIGRpcnR5LCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfa2V5cyhjdHgsIGxpc3QsIGdldF9jb250ZXh0LCBnZXRfa2V5KSB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcbiAgICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgZHVwbGljYXRlIGtleXMgaW4gYSBrZXllZCBlYWNoJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sXG5jb25zdCBib29sZWFuX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgICAnYWxsb3dmdWxsc2NyZWVuJyxcbiAgICAnYWxsb3dwYXltZW50cmVxdWVzdCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXV0b2ZvY3VzJyxcbiAgICAnYXV0b3BsYXknLFxuICAgICdjaGVja2VkJyxcbiAgICAnY29udHJvbHMnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZXInLFxuICAgICdkaXNhYmxlZCcsXG4gICAgJ2Zvcm1ub3ZhbGlkYXRlJyxcbiAgICAnaGlkZGVuJyxcbiAgICAnaXNtYXAnLFxuICAgICdsb29wJyxcbiAgICAnbXVsdGlwbGUnLFxuICAgICdtdXRlZCcsXG4gICAgJ25vbW9kdWxlJyxcbiAgICAnbm92YWxpZGF0ZScsXG4gICAgJ29wZW4nLFxuICAgICdwbGF5c2lubGluZScsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAncmVxdWlyZWQnLFxuICAgICdyZXZlcnNlZCcsXG4gICAgJ3NlbGVjdGVkJ1xuXSk7XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MsIGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlcy5jbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzICs9ICcgJyArIGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVzY2FwZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9vYmplY3Qob2JqKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBmbikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBmbihpdGVtc1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcbiAgICAkJHJlbmRlcjogKCkgPT4gJydcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZV9jb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudC4kJHJlbmRlcikge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3N2ZWx0ZTpjb21wb25lbnQnKVxuICAgICAgICAgICAgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuICAgIGNvbnNvbGUubG9nKGB7QGRlYnVnfSAke2ZpbGUgPyBmaWxlICsgJyAnIDogJyd9KCR7bGluZX06JHtjb2x1bW59KWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICByZXR1cm4gJyc7XG59XG5sZXQgb25fZGVzdHJveTtcbmZ1bmN0aW9uIGNyZWF0ZV9zc3JfY29tcG9uZW50KGZuKSB7XG4gICAgZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICAgICAgY29uc3QgJCQgPSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LFxuICAgICAgICAgICAgY29udGV4dDogbmV3IE1hcChjb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgeyAkJHNsb3RzID0ge30sIGNvbnRleHQgPSBuZXcgTWFwKCkgfSA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sICQkc2xvdHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IsIGN1c3RvbUVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgaWYgKCFjdXN0b21FbGVtZW50KSB7XG4gICAgICAgIC8vIG9uTW91bnQgaGFwcGVucyBiZWZvcmUgdGhlIGluaXRpYWwgYWZ0ZXJVcGRhdGVcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgICAgICBpZiAob25fZGVzdHJveSkge1xuICAgICAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICAgICAgcnVuX2FsbChuZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJDtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgJCQub25fZGVzdHJveSA9ICQkLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgJCQuY3R4ID0gW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmRpcnR5WzBdID09PSAtMSkge1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5kaXJ0eS5maWxsKDApO1xuICAgIH1cbiAgICBjb21wb25lbnQuJCQuZGlydHlbKGkgLyAzMSkgfCAwXSB8PSAoMSA8PCAoaSAlIDMxKSk7XG59XG5mdW5jdGlvbiBpbml0KGNvbXBvbmVudCwgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCBwcm9wcywgYXBwZW5kX3N0eWxlcywgZGlydHkgPSBbLTFdKSB7XG4gICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIG9uX2Rpc2Nvbm5lY3Q6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChvcHRpb25zLmNvbnRleHQgfHwgKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSkpLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlLFxuICAgICAgICByb290OiBvcHRpb25zLnRhcmdldCB8fCBwYXJlbnRfY29tcG9uZW50LiQkLnJvb3RcbiAgICB9O1xuICAgIGFwcGVuZF9zdHlsZXMgJiYgYXBwZW5kX3N0eWxlcygkJC5yb290KTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgb3B0aW9ucy5wcm9wcyB8fCB7fSwgKGksIHJldCwgLi4ucmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhbaV0sICQkLmN0eFtpXSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghJCQuc2tpcF9ib3VuZCAmJiAkJC5ib3VuZFtpXSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRbaV0odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCA/IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpIDogZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIHN0YXJ0X2h5ZHJhdGluZygpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludHJvKVxuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpO1xuICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IsIG9wdGlvbnMuY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIGVuZF9oeWRyYXRpbmcoKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgU3ZlbHRlRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25fbW91bnQgfSA9IHRoaXMuJCQ7XG4gICAgICAgICAgICB0aGlzLiQkLm9uX2Rpc2Nvbm5lY3QgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIHJ1bl9hbGwodGhpcy4kJC5vbl9kaXNjb25uZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMuIFVzZWQgd2hlbiBkZXY9ZmFsc2UuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuNDMuMCcgfSwgZGV0YWlsKSwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbl9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcbiAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBpbnNlcnRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcbiAgICBpbnNlcnRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlJywgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTtcbiAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdClcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG4gICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKVxuICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTtcbiAgICBlbHNlXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhc2V0JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pO1xuICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7XG4gICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7XG4gICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7XG4gICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcbiAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAkY2FwdHVyZV9zdGF0ZSgpIHsgfVxuICAgICRpbmplY3Rfc3RhdGUoKSB7IH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyB0byBjcmVhdGUgc3Ryb25nbHkgdHlwZWQgU3ZlbHRlIGNvbXBvbmVudHMuXG4gKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0eXBpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBiZSB1c2VkIGluIGAuZC50c2AgZmlsZXMuXG4gKlxuICogIyMjIEV4YW1wbGU6XG4gKlxuICogWW91IGhhdmUgY29tcG9uZW50IGxpYnJhcnkgb24gbnBtIGNhbGxlZCBgY29tcG9uZW50LWxpYnJhcnlgLCBmcm9tIHdoaWNoXG4gKiB5b3UgZXhwb3J0IGEgY29tcG9uZW50IGNhbGxlZCBgTXlDb21wb25lbnRgLiBGb3IgU3ZlbHRlK1R5cGVTY3JpcHQgdXNlcnMsXG4gKiB5b3Ugd2FudCB0byBwcm92aWRlIHR5cGluZ3MuIFRoZXJlZm9yZSB5b3UgY3JlYXRlIGEgYGluZGV4LmQudHNgOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFN2ZWx0ZUNvbXBvbmVudFR5cGVkIH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50VHlwZWQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGBgYFxuICogVHlwaW5nIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIElERXMgbGlrZSBWUyBDb2RlIHdpdGggdGhlIFN2ZWx0ZSBleHRlbnNpb25cbiAqIHRvIHByb3ZpZGUgaW50ZWxsaXNlbnNlIGFuZCB0byB1c2UgdGhlIGNvbXBvbmVudCBsaWtlIHRoaXMgaW4gYSBTdmVsdGUgZmlsZVxuICogd2l0aCBUeXBlU2NyaXB0OlxuICogYGBgc3ZlbHRlXG4gKiA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICogXHRpbXBvcnQgeyBNeUNvbXBvbmVudCB9IGZyb20gXCJjb21wb25lbnQtbGlicmFyeVwiO1xuICogPC9zY3JpcHQ+XG4gKiA8TXlDb21wb25lbnQgZm9vPXsnYmFyJ30gLz5cbiAqIGBgYFxuICpcbiAqICMjIyMgV2h5IG5vdCBtYWtlIHRoaXMgcGFydCBvZiBgU3ZlbHRlQ29tcG9uZW50KERldilgP1xuICogQmVjYXVzZVxuICogYGBgdHNcbiAqIGNsYXNzIEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBjb25zdCBjb21wb25lbnQ6IHR5cGVvZiBTdmVsdGVDb21wb25lbnQgPSBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudDtcbiAqIGBgYFxuICogd2lsbCB0aHJvdyBhIHR5cGUgZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2VwYXJhdGUgdGhlIG1vcmUgc3RyaWN0bHkgdHlwZWQgY2xhc3MuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmZpbml0ZSBsb29wIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgeyBIdG1sVGFnLCBIdG1sVGFnSHlkcmF0aW9uLCBTdmVsdGVDb21wb25lbnQsIFN2ZWx0ZUNvbXBvbmVudERldiwgU3ZlbHRlQ29tcG9uZW50VHlwZWQsIFN2ZWx0ZUVsZW1lbnQsIGFjdGlvbl9kZXN0cm95ZXIsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQsIGFwcGVuZF9oeWRyYXRpb24sIGFwcGVuZF9oeWRyYXRpb25fZGV2LCBhcHBlbmRfc3R5bGVzLCBhc3NpZ24sIGF0dHIsIGF0dHJfZGV2LCBhdHRyaWJ1dGVfdG9fb2JqZWN0LCBiZWZvcmVVcGRhdGUsIGJpbmQsIGJpbmRpbmdfY2FsbGJhY2tzLCBibGFua19vYmplY3QsIGJ1YmJsZSwgY2hlY2tfb3V0cm9zLCBjaGlsZHJlbiwgY2xhaW1fY29tcG9uZW50LCBjbGFpbV9lbGVtZW50LCBjbGFpbV9odG1sX3RhZywgY2xhaW1fc3BhY2UsIGNsYWltX3N2Z19lbGVtZW50LCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY29tcHV0ZV9yZXN0X3Byb3BzLCBjb21wdXRlX3Nsb3RzLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIGNyZWF0ZV9hbmltYXRpb24sIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24sIGNyZWF0ZV9jb21wb25lbnQsIGNyZWF0ZV9pbl90cmFuc2l0aW9uLCBjcmVhdGVfb3V0X3RyYW5zaXRpb24sIGNyZWF0ZV9zbG90LCBjcmVhdGVfc3NyX2NvbXBvbmVudCwgY3VycmVudF9jb21wb25lbnQsIGN1c3RvbV9ldmVudCwgZGF0YXNldF9kZXYsIGRlYnVnLCBkZXN0cm95X2Jsb2NrLCBkZXN0cm95X2NvbXBvbmVudCwgZGVzdHJveV9lYWNoLCBkZXRhY2gsIGRldGFjaF9hZnRlcl9kZXYsIGRldGFjaF9iZWZvcmVfZGV2LCBkZXRhY2hfYmV0d2Vlbl9kZXYsIGRldGFjaF9kZXYsIGRpcnR5X2NvbXBvbmVudHMsIGRpc3BhdGNoX2RldiwgZWFjaCwgZWxlbWVudCwgZWxlbWVudF9pcywgZW1wdHksIGVuZF9oeWRyYXRpbmcsIGVzY2FwZSwgZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSwgZXNjYXBlX29iamVjdCwgZXNjYXBlZCwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcywgZml4X2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfcG9zaXRpb24sIGZsdXNoLCBnZXRBbGxDb250ZXh0cywgZ2V0Q29udGV4dCwgZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlLCBnZXRfYmluZGluZ19ncm91cF92YWx1ZSwgZ2V0X2N1cnJlbnRfY29tcG9uZW50LCBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzLCBnZXRfcm9vdF9mb3Jfc3R5bGUsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBoYXNDb250ZXh0LCBoYXNfcHJvcCwgaWRlbnRpdHksIGluaXQsIGluc2VydCwgaW5zZXJ0X2RldiwgaW5zZXJ0X2h5ZHJhdGlvbiwgaW5zZXJ0X2h5ZHJhdGlvbl9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfY3Jvc3NvcmlnaW4sIGlzX2VtcHR5LCBpc19mdW5jdGlvbiwgaXNfcHJvbWlzZSwgbGlzdGVuLCBsaXN0ZW5fZGV2LCBsb29wLCBsb29wX2d1YXJkLCBtaXNzaW5nX2NvbXBvbmVudCwgbW91bnRfY29tcG9uZW50LCBub29wLCBub3RfZXF1YWwsIG5vdywgbnVsbF90b19lbXB0eSwgb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcywgb25EZXN0cm95LCBvbk1vdW50LCBvbmNlLCBvdXRyb19hbmRfZGVzdHJveV9ibG9jaywgcHJldmVudF9kZWZhdWx0LCBwcm9wX2RldiwgcXVlcnlfc2VsZWN0b3JfYWxsLCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3JjX3VybF9lcXVhbCwgc3RhcnRfaHlkcmF0aW5nLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB0cnVzdGVkLCB1cGRhdGVfYXdhaXRfYmxvY2tfYnJhbmNoLCB1cGRhdGVfa2V5ZWRfZWFjaCwgdXBkYXRlX3Nsb3QsIHVwZGF0ZV9zbG90X2Jhc2UsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfZWFjaF9hcmd1bWVudCwgdmFsaWRhdGVfZWFjaF9rZXlzLCB2YWxpZGF0ZV9zbG90cywgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsICJpbXBvcnQgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGVidWcsIGVycm9yIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgUG9zLCBURmlsZSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHsgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudCwgYWRkU2libGluZ3NQYXJlbnRJc1BhcmVudCwgYWRkQXVudHNVbmNsZXMsIGFkZENvdXNpbnMsIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzIH0gZnJvbSBcIi4vUmVsYXRpb25zXCI7XHJcbmltcG9ydCB7IGFkZENTVkNydW1icywgZ2V0Q1NWUm93cyB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzXCI7XHJcbmltcG9ydCB7IGFkZERhdGF2aWV3Tm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EYXRhdmlld05vdGVzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGVOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGREZW5kcm9uTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EZW5kcm9uTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkRm9sZGVyTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEhOc1RvR3JhcGgsXHJcbiAgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvSGllcmFyY2h5Tm90ZXNcIjtcclxuaW1wb3J0IHtcclxuICBhZGRKdWdnbExpbmtzVG9HcmFwaCxcclxuICBnZXRKdWdnbExpbmtzLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSnVnZ2xMaW5rc1wiO1xyXG5pbXBvcnQgeyBhZGRMaW5rTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9MaW5rTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkUmVnZXhOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1JlZ2V4Tm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkVGFnTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UYWdOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGRUcmF2ZXJzZU5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvVHJhdmVyc2VOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0FMVFMsXHJcbiAgQkNfRFZfTk9URSxcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9QQVJFTlQsXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfTElOS19OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfVEFHX05PVEUsXHJcbiAgQkNfVFJBVkVSU0VfTk9URSxcclxuICBkcm9wSGVhZGVyT3JBbGlhcyxcclxuICBzcGxpdExpbmtzUmVnZXgsXHJcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ1NldHRpbmdzLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBkdkxpbmssXHJcbiAgUmF3VmFsdWUsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgYWRkRWRnZUlmTm90LFxyXG4gIGFkZE5vZGVzSWZOb3QsXHJcbiAgYnVpbGRPYnNHcmFwaCxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGZhbGxiYWNrRmllbGQsIGdldEZpZWxkSW5mbywgaXRlcmF0ZUhpZXJzIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0QmFzZUZyb21NRFBhdGgsXHJcbiAgZ2V0RFZBcGksXHJcbiAgZ2V0RFZCYXNlbmFtZSxcclxufSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCIuL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG5cclxuZnVuY3Rpb24gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbjogQkNQbHVnaW4sIGZpbGVzOiBURmlsZVtdKSB7XHJcbiAgY29uc3QgeyBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgZGIuc3RhcnQxRyhcImdldERWTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gYXBpLnBhZ2UoZmlsZS5wYXRoKSk7XHJcblxyXG4gIGRiLmVuZDFHKHsgZnJvbnRtcyB9KTtcclxuICByZXR1cm4gZnJvbnRtcztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW46IEJDUGx1Z2luLCBmaWxlczogVEZpbGVbXSkge1xyXG4gIGNvbnN0IHsgZGIgfSA9IHBsdWdpbjtcclxuICBkYi5zdGFydDFHKFwiZ2V0T2JzTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10gPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgIHJldHVybiBmcm9udG1hdHRlciA/IHsgZmlsZSwgLi4uZnJvbnRtYXR0ZXIgfSA6IHsgZmlsZSB9O1xyXG4gIH0pO1xyXG5cclxuICBkYi5lbmQxRyh7IGZyb250bXMgfSk7XHJcbiAgcmV0dXJuIGZyb250bXM7XHJcbn1cclxuXHJcbmNvbnN0IGlzRFZQcm94eSA9IChpdGVtOiBSYXdWYWx1ZSkgPT4gdHlwZW9mIGl0ZW0uZGVmYXVsdENvbXBhcmF0b3IgPT09IFwiZnVuY3Rpb25cIlxyXG5cclxuLyoqXHJcbiAqIEtlZXAgdW53cmFwcGluZyBhIHByb3hpZWQgaXRlbSB1bnRpbCBpdCBpc24ndCBvbmUgYW55bW9yZVxyXG4gKiBAcGFyYW0gIHtSYXdWYWx1ZX0gaXRlbVxyXG4gKi9cclxuZnVuY3Rpb24gdW5wcm94eShpdGVtOiBSYXdWYWx1ZSkge1xyXG4gIGNvbnN0IHVucHJveGllZCA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlID0gW2l0ZW1dO1xyXG5cclxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjdXJySXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgaWYgKGlzRFZQcm94eShjdXJySXRlbSkpIHF1ZXVlLnB1c2goLi4uY3Vyckl0ZW0udmFsdWVzKTtcclxuICAgIGVsc2UgdW5wcm94aWVkLnB1c2goY3Vyckl0ZW0pO1xyXG4gIH1cclxuICByZXR1cm4gdW5wcm94aWVkO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgYGR2Q2FjaGVbZmllbGRdYCB2YWx1ZSwgcGFyc2UgdGhlIGxpbmsocykgb3V0IG9mIGl0XHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZX0gdmFsdWVcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRmllbGRWYWx1ZShcclxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZVxyXG4pIHtcclxuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XHJcblxyXG4gIGNvbnN0IHBhcnNlZDogc3RyaW5nW10gPSBbXTtcclxuICB0cnkge1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gdmFsdWUubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KTtcclxuXHJcbiAgICAgIGlmIChzcGxpdHMgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBsaW5rTmFtZXMgPSBzcGxpdHMubWFwKChsaW5rKSA9PlxyXG4gICAgICAgICAgZ2V0QmFzZUZyb21NRFBhdGgobGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcylbMV0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwYXJzZWQucHVzaCguLi5saW5rTmFtZXMpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXM6IFJhd1ZhbHVlW10gPSBbdmFsdWVdLmZsYXQoNCk7XHJcbiAgICAgIGRlYnVnKC4uLnJhd1ZhbHVlcyk7XHJcblxyXG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaCgocmF3SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghcmF3SXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB1blByb3hpZWQgPSB1bnByb3h5KHJhd0l0ZW0pO1xyXG4gICAgICAgIHVuUHJveGllZC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmF3QXNTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHMgPSByYXdBc1N0cmluZy5tYXRjaChzcGxpdExpbmtzUmVnZXgpO1xyXG4gICAgICAgICAgICBpZiAoc3BsaXRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RycyA9IHNwbGl0cy5tYXAoKGxpbmspID0+XHJcbiAgICAgICAgICAgICAgICBnZXRCYXNlRnJvbU1EUGF0aChsaW5rLm1hdGNoKGRyb3BIZWFkZXJPckFsaWFzKVsxXSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKC4uLnN0cnMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0QmFzZUZyb21NRFBhdGgocmF3QXNTdHJpbmcpO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKGJhc2VuYW1lLnNwbGl0KFwiI1wiKVswXS5zcGxpdChcInxcIilbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IGdldEJhc2VGcm9tTURQYXRoKHZhbHVlLnBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoYmFzZW5hbWUgIT09IHVuZGVmaW5lZCkgcGFyc2VkLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcmV0dXJuIHBhcnNlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1haW5HKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPE11bHRpR3JhcGg+IHtcclxuICBjb25zdCBtYWluRyA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MsIGRiIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycywgQ1NWUGF0aHMsIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbCwgaGllcmFyY2h5Tm90ZXMgfSA9XHJcbiAgICAgIHNldHRpbmdzO1xyXG4gICAgZGIuc3RhcnQyRyhcImluaXRHcmFwaHNcIik7XHJcblxyXG4gICAgaWYgKHVzZXJIaWVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgZGIuZW5kMkcoKTtcclxuICAgICAgbmV3IE5vdGljZShcIllvdSBkbyBub3QgaGF2ZSBhbnkgQnJlYWRjcnVtYnMgaGllcmFyY2hpZXMgc2V0IHVwLlwiKTtcclxuICAgICAgcmV0dXJuIG1haW5HO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGNvbnN0IGR2USA9IGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImRhdGF2aWV3XCIpO1xyXG5cclxuICAgIGxldCBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSA9IGR2UVxyXG4gICAgICA/IGdldERWTWV0YWRhdGFDYWNoZShwbHVnaW4sIGZpbGVzKVxyXG4gICAgICA6IGdldE9ic01ldGFkYXRhQ2FjaGUocGx1Z2luLCBmaWxlcyk7XHJcblxyXG4gICAgaWYgKGZyb250bXMuc29tZSgoZnJvbnRtKSA9PiBmcm9udG0gPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgyMDAwKTtcclxuICAgICAgZnJvbnRtcyA9IGR2UVxyXG4gICAgICAgID8gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpXHJcbiAgICAgICAgOiBnZXRPYnNNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENTVlJvd3MgPSBDU1ZQYXRocyAhPT0gXCJcIiA/IGF3YWl0IGdldENTVlJvd3MocGx1Z2luKSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IGVsaWdhYmxlQWx0czogeyBbYWx0RmllbGQ6IHN0cmluZ106IGR2RnJvbnRtYXR0ZXJDYWNoZVtdIH0gPSB7fTtcclxuICAgIEJDX0FMVFMuZm9yRWFjaCgoYWx0KSA9PiAoZWxpZ2FibGVBbHRzW2FsdF0gPSBbXSkpO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJhZGRGcm9udG1hdHRlclRvR3JhcGhcIik7XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgQkNfQUxUUy5mb3JFYWNoKChhbHQpID0+IHtcclxuICAgICAgICBpZiAocGFnZVthbHRdICE9PSB1bmRlZmluZWQgJiYgcGFnZVthbHRdICE9PSBudWxsKVxyXG4gICAgICAgICAgZWxpZ2FibGVBbHRzW2FsdF0ucHVzaChwYWdlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihwYWdlKTtcclxuXHJcbiAgICAgIGl0ZXJhdGVIaWVycyh1c2VySGllcnMsIChoaWVyLCBkaXIsIGZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcGFyc2VGaWVsZFZhbHVlKHBhZ2VbZmllbGRdKTtcclxuXHJcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKFwiPCVcIikgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoXCJ7e1wiKSkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgIHRhcmdldCxcclxuICAgICAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgICAgIHRhcmdldE9yZGVyXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChDU1ZSb3dzLmxlbmd0aCkgYWRkQ1NWQ3J1bWJzKG1haW5HLCBDU1ZSb3dzLCBkaXIsIGZpZWxkKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkYi5lbmQyRygpO1xyXG5cclxuICAgIC8vIFNFQ1RJT04gIEp1Z2dsIExpbmtzXHJcbiAgICBjb25zdCBqdWdnbExpbmtzID1cclxuICAgICAgYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCB8fCBwYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2xcclxuICAgICAgICA/IGF3YWl0IGdldEp1Z2dsTGlua3MocGx1Z2luLCBmaWxlcylcclxuICAgICAgICA6IFtdO1xyXG5cclxuICAgIGlmIChqdWdnbExpbmtzLmxlbmd0aClcclxuICAgICAgYWRkSnVnZ2xMaW5rc1RvR3JhcGgoc2V0dGluZ3MsIGp1Z2dsTGlua3MsIGZyb250bXMsIG1haW5HKTtcclxuXHJcbiAgICAvLyAhU0VDVElPTiAgSnVnZ2wgTGlua3NcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXNcIik7XHJcbiAgICAvLyBTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuICAgIGRiLnN0YXJ0MkcoXCJIaWVyYXJjaHkgTm90ZXNcIik7XHJcblxyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vdGVPckZvbGRlciBvZiBoaWVyYXJjaHlOb3Rlcykge1xyXG4gICAgICAgIGlmIChub3RlT3JGb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICBjb25zdCBmb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKFxyXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoKG5vdGVPckZvbGRlcilcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb2xkZXIuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICBhZGRITnNUb0dyYXBoKFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRIaWVyYXJjaHlOb3RlSXRlbXMoY2hpbGQpLFxyXG4gICAgICAgICAgICAgICAgbWFpbkdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlT3JGb2xkZXIsIFwiXCIpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpXHJcbiAgICAgICAgICAgIGFkZEhOc1RvR3JhcGgoXHJcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGUpLFxyXG4gICAgICAgICAgICAgIG1haW5HXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vICFTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiRm9sZGVyIE5vdGVzXCIpO1xyXG4gICAgYWRkRm9sZGVyTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0ZPTERFUl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJUYWcgTm90ZXNcIik7XHJcbiAgICBhZGRUYWdOb3Rlc1RvR3JhcGgocGx1Z2luLCBlbGlnYWJsZUFsdHNbQkNfVEFHX05PVEVdLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gICAgZGIuc3RhcnQyRyhcIkxpbmsgTm90ZXNcIik7XHJcbiAgICBhZGRMaW5rTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0xJTktfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiUmVnZXggTm90ZXNcIik7XHJcbiAgICBhZGRSZWdleE5vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19SRUdFWF9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vIHBsdWdpbi5hZGROYW1pbmdTeXN0ZW1Ob3Rlc1RvR3JhcGgoZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuc3RhcnQyRyhcIlRyYXZlcnNlIE5vdGVzXCIpO1xyXG4gICAgYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgZWxpZ2FibGVBbHRzW0JDX1RSQVZFUlNFX05PVEVdLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgYnVpbGRPYnNHcmFwaCgpXHJcbiAgICApO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEZW5kcm9uIE5vdGVzXCIpO1xyXG4gICAgYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiRGF0YXZpZXcgTm90ZXNcIik7XHJcbiAgICBhZGREYXRhdmlld05vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19EVl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEYXRlIE5vdGVzXCIpO1xyXG4gICAgYWRkRGF0ZU5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuXHJcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBhZGROb2Rlc0lmTm90KG1haW5HLCBbZmlsZS5iYXNlbmFtZV0pKTtcclxuICAgIGRiLmVuZDJHKFwiZ3JhcGhzIGluaXRlZFwiLCB7IG1haW5HIH0pO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgZXJyb3IoZXJyKTtcclxuICAgIHBsdWdpbi5kYi5lbmQyRygpO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xvc2VkRyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBtYWluRywgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICBpbXBsaWVkUmVsYXRpb25zOiB7XHJcbiAgICAgIHNhbWVQYXJlbnRJc1NpYmxpbmcsXHJcbiAgICAgIHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cyxcclxuICAgICAgY291c2luc0lzU2libGluZyxcclxuICAgICAgc2libGluZ3NTaWJsaW5nSXNTaWJsaW5nLFxyXG4gICAgICBzaWJsaW5nc1BhcmVudElzUGFyZW50LFxyXG4gICAgfSxcclxuICB9ID0gc2V0dGluZ3M7XHJcbiAgbGV0IGNsb3NlZEcgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKG1haW5HLCB1c2VySGllcnMpO1xyXG5cclxuICBpZiAoc2FtZVBhcmVudElzU2libGluZykgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChjbG9zZWRHLCBzZXR0aW5ncyk7XHJcbiAgaWYgKHNpYmxpbmdzUGFyZW50SXNQYXJlbnQpIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoY2xvc2VkRyk7XHJcbiAgaWYgKHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cykgYWRkQXVudHNVbmNsZXMoY2xvc2VkRyk7XHJcbiAgaWYgKGNvdXNpbnNJc1NpYmxpbmcpIGFkZENvdXNpbnMoY2xvc2VkRyk7XHJcbiAgaWYgKHNpYmxpbmdzU2libGluZ0lzU2libGluZykgYWRkU3RydWN0dXJhbEVxdWl2YWxlbmNlU2libGluZ3MoY2xvc2VkRyk7XHJcblxyXG4gIHJldHVybiBjbG9zZWRHO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEluZGV4KHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoIXBsdWdpbi5hY3RpdmVMZWFmQ2hhbmdlKSBwbHVnaW4ucmVnaXN0ZXJBY3RpdmVMZWFmQ2hhbmdlRXZlbnQoKTtcclxuICBpZiAoIXBsdWdpbi5sYXlvdXRDaGFuZ2UpIHBsdWdpbi5yZWdpc3RlckxheW91dENoYW5nZUV2ZW50KCk7XHJcblxyXG4gIHBsdWdpbi5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcocGx1Z2luKTtcclxuICBwbHVnaW4uY2xvc2VkRyA9IGJ1aWxkQ2xvc2VkRyhwbHVnaW4pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgdHlwZSB9IG9mIHBsdWdpbi5WSUVXUylcclxuICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyh0eXBlKT8uZHJhdygpO1xyXG5cclxuICBpZiAocGx1Z2luLnNldHRpbmdzLnNob3dCQ3MpIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gIGlmIChwbHVnaW4uc2V0dGluZ3Muc2hvd1JlZnJlc2hOb3RpY2UpIG5ldyBOb3RpY2UoXCJCQyBJbmRleCByZWZyZXNoZWRcIik7XHJcbn1cclxuIiwgImltcG9ydCBHcmFwaCwgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGZzRnJvbU5vZGUgfSBmcm9tIFwiZ3JhcGhvbG9neS10cmF2ZXJzYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVzIH0gZnJvbSBcImdyYXBob2xvZ3ktdHlwZXNcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lfUkVGTEVYSVZFLFxyXG4gIEJDX09SREVSLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIERJUkVDVElPTlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBFZGdlQXR0cixcclxuICBOb2RlUGF0aCxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRCYXNlRnJvbU1EUGF0aCB9IGZyb20gXCIuL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlYWwgJiBpbXBsaWVkIGdyYXBocyBmb3IgYSBnaXZlbiByZWxhdGlvbiwgYW5kIHJldHVybnMgYSBuZXcgZ3JhcGhzIHdpdGggYm90aC5cclxuLy8gSXQgbWFrZXMgaW1wbGllZCByZWxhdGlvbnMgcmVhbFxyXG4vLyBUT0RPIHVzZSByZWZsZXhpdmVDbG9zdXJlIGluc3RlYWRcclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlSW1wbGllZExpbmtzKFxyXG4gIHJlYWw6IE11bHRpR3JhcGgsXHJcbiAgaW1wbGllZDogTXVsdGlHcmFwaFxyXG4pOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBjbG9zZWRHID0gcmVhbC5jb3B5KCk7XHJcbiAgaW1wbGllZC5mb3JFYWNoRWRnZSgoa2V5LCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjbG9zZWRHLm1lcmdlRWRnZSh0LCBzLCBhKTtcclxuICB9KTtcclxuICByZXR1cm4gY2xvc2VkRztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5saW5rZWROb2RlcyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgY29uc3QgY29weSA9IGcuY29weSgpO1xyXG4gIGNvcHkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgIGlmICghY29weS5kZWdyZWUobm9kZSkpIGNvcHkuZHJvcE5vZGUobm9kZSk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYSBzdWJncmFwaCBvZiBhbGwgbm9kZXMgJiBlZGdlcyB3aXRoIGBkaXJzLmluY2x1ZGVzKGEuZGlyKWBcclxuICpcclxuICogRmlsdGVyIHRoZSBnaXZlbiBncmFwaCB0byBvbmx5IGluY2x1ZGUgZWRnZXMgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbnMuXHJcbiAqIEBwYXJhbSAge011bHRpR3JhcGh9IGdcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc30gZGlyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViSW5EaXJzKGc6IE11bHRpR3JhcGgsIC4uLmRpcnM6IERpcmVjdGlvbnNbXSkge1xyXG4gIGNvbnN0IHN1YiA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgZz8uZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChkaXJzLmluY2x1ZGVzKGEuZGlyKSkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgYWRkTm9kZXNJZk5vdChzdWIsIFtzLCB0XSwgeyBvcmRlcjogYS5vcmRlciB9KTtcclxuICAgICAgc3ViLmFkZEVkZ2UocywgdCwgYSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHN1YjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIHN1YmdyYXBoIG9mIGFsbCBub2RlcyAmIGVkZ2VzIHdpdGggYGZpZWxkcy5pbmNsdWRlcyhhLmZpZWxkKWAuXHJcbiAqXHJcbiAqIEZpbHRlciB0aGUgZ2l2ZW4gZ3JhcGggdG8gb25seSBpbmNsdWRlIGVkZ2VzIHdpdGggdGhlIGdpdmVuIGZpZWxkcy5cclxuICogQHBhcmFtICB7TXVsdGlHcmFwaH0gZ1xyXG4gKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmllbGRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViRm9yRmllbGRzKGc6IE11bHRpR3JhcGgsIGZpZWxkczogc3RyaW5nW10pIHtcclxuICBjb25zdCBzdWIgPSBuZXcgTXVsdGlHcmFwaCgpO1xyXG4gIGcuZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChmaWVsZHMuaW5jbHVkZXMoYS5maWVsZCkpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGFkZE5vZGVzSWZOb3Qoc3ViLCBbcywgdF0sIHsgb3JkZXI6IGEub3JkZXIgfSk7XHJcbiAgICAgIHN1Yi5hZGRFZGdlKHMsIHQsIGEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBzdWI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3IgZXZlcnkgZWRnZSBpbiBgZ2AsIGFkZCB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSB0byBhIGNvcHkgb2YgYGdgLlxyXG4gKlxyXG4gKiBJdCBhbHNvIHNldHMgdGhlIGF0dHJzIG9mIHRoZSByZXZlcnNlIGVkZ2VzIHRvIGBvcHBEaXJgIGFuZCBgb3BwRmllbGRzWzBdYFxyXG4gKiBAcGFyYW0gIHtNdWx0aUdyYXBofSBnXHJcbiAqIEBwYXJhbSAge1VzZXJIaWVyW119IHVzZXJIaWVyc1xyXG4gKiBAcGFyYW0gIHtib29sZWFufSBjbG9zZUFzT3Bwb3NpdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZsZXhpdmVDbG9zdXJlKFxyXG4gIGc6IE11bHRpR3JhcGgsXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdXHJcbik6IE11bHRpR3JhcGgge1xyXG4gIGNvbnN0IGNvcHkgPSBnLmNvcHkoKTtcclxuICBjb3B5LmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9XHJcbiAgICAgIGRpciA9PT0gXCJzYW1lXCIgPyBmaWVsZCA6IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoY29weSwgW3MsIHRdLCB7IG9yZGVyOiA5OTk5IH0pO1xyXG4gICAgYWRkRWRnZUlmTm90KGNvcHksIHQsIHMsIHtcclxuICAgICAgZGlyOiBvcHBEaXIsXHJcbiAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgaW1wbGllZDogQkNfSV9SRUZMRVhJVkUsXHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVzSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBub2Rlczogc3RyaW5nW10sXHJcbiAgYXR0ciA9IHsgb3JkZXI6IDk5OTkgfVxyXG4pIHtcclxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgIGcudXBkYXRlTm9kZShub2RlLCAoZXhzdGFudEF0dHJzOiBBdHRyaWJ1dGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4dGFudE9yZGVyOiBudW1iZXIgfCB1bmRlZmluZWQgPSBleHN0YW50QXR0cnMub3JkZXI7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZXhzdGFudEF0dHJzLFxyXG4gICAgICAgIG9yZGVyOiBleHRhbnRPcmRlciAmJiBleHRhbnRPcmRlciA8IDk5OTkgPyBleHRhbnRPcmRlciA6IGF0dHIub3JkZXIsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRFZGdlSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICB0YXJnZXQ6IHN0cmluZyxcclxuICBhdHRyPzogQXR0cmlidXRlc1xyXG4pIHtcclxuICBpZiAoIWcuaGFzRWRnZShzb3VyY2UsIHRhcmdldCkpIGcuYWRkRWRnZShzb3VyY2UsIHRhcmdldCwgYXR0cik7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTaW5rcyA9IChnOiBNdWx0aUdyYXBoKSA9PlxyXG4gIGcuZmlsdGVyTm9kZXMoKG5vZGUpID0+IGcuaGFzTm9kZShub2RlKSAmJiAhZy5vdXREZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZXMgPSAoZzogTXVsdGlHcmFwaCkgPT5cclxuICBnLmZpbHRlck5vZGVzKChub2RlKSA9PiBnLmhhc05vZGUobm9kZSkgJiYgIWcuaW5EZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE91dE5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcub3V0TmVpZ2hib3JzKG5vZGUpIDogW107XHJcbmV4cG9ydCBjb25zdCBnZXRJbk5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcuaW5OZWlnaGJvcnMobm9kZSkgOiBbXTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyBhbGwgcGF0aHMgZnJvbSBhIHN0YXJ0aW5nIG5vZGUgdG8gYWxsIG90aGVyIHNpbmtzIGluIGEgZ3JhcGguXHJcbiAqXHJcbiAqXHJcbiAqIEBwYXJhbSB7TXVsdGlHcmFwaH0gZyAtIFRoZSBncmFwaCB0byBzZWFyY2hcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIG5vZGVcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJyYXlzLiBFYWNoIGFycmF5IGlzIGEgcGF0aC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNBbGxQYXRocyhnOiBNdWx0aUdyYXBoLCBzdGFydDogc3RyaW5nKTogc3RyaW5nW11bXSB7XHJcbiAgY29uc3QgcXVldWU6IE5vZGVQYXRoW10gPSBbeyBub2RlOiBzdGFydCwgcGF0aDogW10gfV07XHJcbiAgY29uc3QgdmlzaXRlZDogeyBbbm90ZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBjb25zdCBhbGxQYXRoczogc3RyaW5nW11bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDAgJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuICAgIGNvbnN0IHsgbm9kZSwgcGF0aCB9ID0gcXVldWUuc2hpZnQoKTtcclxuXHJcbiAgICBjb25zdCBleHRQYXRoID0gW25vZGUsIC4uLnBhdGhdO1xyXG4gICAgY29uc3Qgc3VjY3NOb3RWaXNpdGVkID0gZy5oYXNOb2RlKG5vZGUpXHJcbiAgICAgID8gZy5maWx0ZXJPdXROZWlnaGJvcnMoXHJcbiAgICAgICAgbm9kZSxcclxuICAgICAgICAoc3VjYykgPT4gIXZpc2l0ZWRbc3VjY10gfHwgdmlzaXRlZFtzdWNjXSA8IDVcclxuICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBzdWNjc05vdFZpc2l0ZWQubWFwKChzdWNjKSA9PiB7XHJcbiAgICAgIHZpc2l0ZWRbc3VjY10gPSB2aXNpdGVkW3N1Y2NdID8gdmlzaXRlZFtzdWNjXSArIDEgOiAxO1xyXG4gICAgICByZXR1cm4geyBub2RlOiBzdWNjLCBwYXRoOiBleHRQYXRoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICBxdWV1ZS51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcclxuXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCAhZy5vdXREZWdyZWUobm9kZSkpIGFsbFBhdGhzLnB1c2goZXh0UGF0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBhbGxQYXRocztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0FsbFBhdGhzKGc6IE11bHRpR3JhcGgsIHN0YXJ0OiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICBjb25zdCBwYXRoc0Fycjogc3RyaW5nW11bXSA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlOiBOb2RlUGF0aFtdID0gW3sgbm9kZTogc3RhcnQsIHBhdGg6IFtdIH1dO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG4gICAgY29uc3QgeyBub2RlLCBwYXRoIH0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgZXh0UGF0aCA9IFtub2RlLCAuLi5wYXRoXTtcclxuXHJcbiAgICBjb25zdCBzdWNjcyA9IGcuaGFzTm9kZShub2RlKVxyXG4gICAgICA/IGcuZmlsdGVyT3V0TmVpZ2hib3JzKG5vZGUsIChuKSA9PiAhcGF0aC5pbmNsdWRlcyhuKSlcclxuICAgICAgOiBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWNjcykge1xyXG4gICAgICBxdWV1ZS5wdXNoKHsgbm9kZSwgcGF0aDogZXh0UGF0aCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXJtaW5hbCBub2RlXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCBzdWNjcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcGF0aHNBcnIucHVzaChleHRQYXRoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gU3BsaWNlIG9mZiB0aGUgY3VycmVudCBub3RlIGZyb20gdGhlIHBhdGhcclxuICBwYXRoc0Fyci5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBpZiAocGF0aC5sZW5ndGgpIHBhdGguc3BsaWNlKHBhdGgubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfSk7XHJcbiAgaW5mbyh7IHBhdGhzQXJyIH0pO1xyXG4gIHJldHVybiBwYXRoc0FycjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUN5Y2xlcyhnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpIHtcclxuICBjb25zdCBjb3B5ID0gZy5jb3B5KCk7XHJcbiAgbGV0IHByZXZOb2RlID0gbnVsbDtcclxuICBkZnNGcm9tTm9kZShjb3B5LCBzdGFydE5vZGUsIChuKSA9PiB7XHJcbiAgICBjb3B5LmZvckVhY2hPdXROZWlnaGJvcihuLCAodCkgPT4ge1xyXG4gICAgICBpZiAodCA9PT0gcHJldk5vZGUgJiYgY29weS5oYXNFZGdlKHQsIHByZXZOb2RlKSkge1xyXG4gICAgICAgIHRyeSB7IGNvcHkuZHJvcEVkZ2UodCwgcHJldk5vZGUpIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcih0LCBwcmV2Tm9kZSwgZXJyb3IpIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHJldk5vZGUgPSBuO1xyXG4gIH0pO1xyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViQ2xvc2VTdWIoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICB1c2VySGllcnM6IFVzZXJIaWVyW10sXHJcbiAgLi4uZGlyczogRGlyZWN0aW9uc1tdXHJcbikge1xyXG4gIGNvbnN0IHN1YiA9IGdldFN1YkluRGlycyhnLCAuLi5kaXJzKTtcclxuICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgdXNlckhpZXJzKTtcclxuICBjb25zdCBjbG9zZWRTdWIgPSBnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXJzWzBdKTtcclxuICByZXR1cm4gY2xvc2VkU3ViO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPYnNHcmFwaCgpOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBPYnNHID0gbmV3IE11bHRpR3JhcGgoKTtcclxuICBjb25zdCB7IHJlc29sdmVkTGlua3MsIHVucmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcblxyXG4gIGZvciAoY29uc3Qgc291cmNlIGluIHJlc29sdmVkTGlua3MpIHtcclxuICAgIGlmICghc291cmNlLmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgIGNvbnN0IHNvdXJjZUJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChzb3VyY2UpO1xyXG4gICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbc291cmNlQmFzZV0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZGVzdCBpbiByZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgaWYgKCFkZXN0LmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yIChjb25zdCBzb3VyY2UgaW4gdW5yZXNvbHZlZExpbmtzKSB7XHJcbiAgICBjb25zdCBzb3VyY2VCYXNlID0gZ2V0QmFzZUZyb21NRFBhdGgoc291cmNlKTtcclxuICAgIGFkZE5vZGVzSWZOb3QoT2JzRywgW3NvdXJjZUJhc2VdKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRlc3QgaW4gdW5yZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgaWYgKHNvdXJjZUJhc2UgPT09IGRlc3RCYXNlKSBjb250aW51ZTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluZm8oeyBPYnNHIH0pO1xyXG4gIHJldHVybiBPYnNHO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVNYWluKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoLFxyXG4gIHNvdXJjZTogc3RyaW5nLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiBzdHJpbmcsXHJcbiAgc291cmNlT3JkZXI6IG51bWJlcixcclxuICB0YXJnZXRPcmRlcjogbnVtYmVyLFxyXG4gIGZpbGxPcHAgPSBmYWxzZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZGlyID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpLmZpZWxkRGlyO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbc291cmNlXSwge1xyXG4gICAgb3JkZXI6IHNvdXJjZU9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbdGFyZ2V0XSwge1xyXG4gICAgb3JkZXI6IHRhcmdldE9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGRFZGdlSWZOb3QobWFpbkcsIHNvdXJjZSwgdGFyZ2V0LCB7XHJcbiAgICBkaXIsXHJcbiAgICBmaWVsZCxcclxuICB9KTtcclxuICBpZiAoZmlsbE9wcCkge1xyXG4gICAgYWRkRWRnZUlmTm90KG1haW5HLCB0YXJnZXQsIHNvdXJjZSwge1xyXG4gICAgICBkaXI6IGdldE9wcERpcihkaXIpLFxyXG4gICAgICBmaWVsZDogZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPcmRlciA9IChmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSwgdGFyZ2V0OiBzdHJpbmcpID0+XHJcbiAgcGFyc2VJbnQoXHJcbiAgICAoZnJvbnRtcy5maW5kKChmZikgPT4gZmY/LmZpbGU/LmJhc2VuYW1lID09PSB0YXJnZXQpPy5bXHJcbiAgICAgIEJDX09SREVSXHJcbiAgICBdIGFzIHN0cmluZykgPz8gXCI5OTk5XCJcclxuICApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZU9yZGVyID0gKGZyb250bTogZHZGcm9udG1hdHRlckNhY2hlKSA9PlxyXG4gIHBhcnNlSW50KChmcm9udG1bQkNfT1JERVJdIGFzIHN0cmluZykgPz8gXCI5OTk5XCIpO1xyXG5cclxuLyoqIFJlbWVtYmVyIHRvIGZpbHRlciBieSBoaWVyYXJjaHkgaW4gTWF0cml4VmlldyEgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWxuSW1wbGllZChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGN1cnJOb2RlOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zID0gbnVsbFxyXG4pOiBSZWFsTkltcGxpZWQge1xyXG4gIGNvbnN0IHJlYWxzbkltcGxpZWRzOiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmICghY2xvc2VkRy5oYXNOb2RlKGN1cnJOb2RlKSkgcmV0dXJuIHJlYWxzbkltcGxpZWRzO1xyXG4gIGNsb3NlZEcuZm9yRWFjaEVkZ2UoY3Vyck5vZGUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkLCBkaXI6IGVkZ2VEaXIsIGltcGxpZWQgfSA9IGEgYXMgRWRnZUF0dHI7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBlZGdlRGlyKVswXTtcclxuXHJcbiAgICAoZGlyID8gW2RpciwgZ2V0T3BwRGlyKGRpcildIDogRElSRUNUSU9OUykuZm9yRWFjaChcclxuICAgICAgKGN1cnJEaXI6IERpcmVjdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBvcHBEaXIgPSBnZXRPcHBEaXIoY3VyckRpcik7XHJcbiAgICAgICAgLy8gUmVhbHNcclxuICAgICAgICBpZiAocyA9PT0gY3Vyck5vZGUgJiYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSkge1xyXG4gICAgICAgICAgY29uc3QgYXJyID0gcmVhbHNuSW1wbGllZHNbZWRnZURpcl0ucmVhbHM7XHJcbiAgICAgICAgICBpZiAoYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS50byA9PT0gdCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHsgdG86IHQsIGZpZWxkLCBpbXBsaWVkIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbXBsaWVkc1xyXG4gICAgICAgIC8vIElmIGBzICE9PSBjdXJyTm9kZWAgdGhlbiBgdGAgbXVzdCBiZVxyXG4gICAgICAgIGVsc2UgaWYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBhcnIgPSByZWFsc25JbXBsaWVkc1tnZXRPcHBEaXIoZWRnZURpcildLmltcGxpZWRzO1xyXG4gICAgICAgICAgaWYgKGFyci5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udG8gPT09IHMpID09PSAtMSkge1xyXG4gICAgICAgICAgICBhcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgdG86IHMsXHJcbiAgICAgICAgICAgICAgZmllbGQ6IG9wcEZpZWxkLFxyXG4gICAgICAgICAgICAgIGltcGxpZWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gcmVhbHNuSW1wbGllZHM7XHJcbn1cclxuIiwgImltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgdGhlIGZpZWxkcyBpbiBgZGlyYC5cclxuICogUmV0dXJucyBhbGwgZmllbGRzIGlmIGBkaXIgPT09ICdhbGwnYFxyXG4gKiBAcGFyYW0gIHtVc2VySGllcltdfSB1c2VySGllcnNcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc3xcImFsbFwifSBkaXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGRpcjogRGlyZWN0aW9ucyB8IFwiYWxsXCIgPSBcImFsbFwiXHJcbikge1xyXG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgaWYgKGRpciA9PT0gXCJhbGxcIikge1xyXG4gICAgICBESVJFQ1RJT05TLmZvckVhY2goKGVhY2hEaXIpID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2VhY2hEaXJdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2Rpcl0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBmaWVsZHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKTogRGlyZWN0aW9ucyA9PiB7XHJcbiAgc3dpdGNoIChkaXIpIHtcclxuICAgIGNhc2UgXCJ1cFwiOlxyXG4gICAgICByZXR1cm4gXCJkb3duXCI7XHJcbiAgICBjYXNlIFwiZG93blwiOlxyXG4gICAgICByZXR1cm4gXCJ1cFwiO1xyXG4gICAgY2FzZSBcInNhbWVcIjpcclxuICAgICAgcmV0dXJuIFwic2FtZVwiO1xyXG4gICAgY2FzZSBcIm5leHRcIjpcclxuICAgICAgcmV0dXJuIFwicHJldlwiO1xyXG4gICAgY2FzZSBcInByZXZcIjpcclxuICAgICAgcmV0dXJuIFwibmV4dFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiAgR2V0IHRoZSBoaWVyYXJjaHkgYW5kIGRpcmVjdGlvbiB0aGF0IGBmaWVsZGAgaXMgaW5cclxuICogKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkSW5mbyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGZpZWxkOiBzdHJpbmcpIHtcclxuICBsZXQgZmllbGREaXI6IERpcmVjdGlvbnM7XHJcbiAgbGV0IGZpZWxkSGllcjogVXNlckhpZXI7XHJcblxyXG4gIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgICBpZiAoaGllcltkaXJdLmluY2x1ZGVzKGZpZWxkKSkge1xyXG4gICAgICAgIGZpZWxkRGlyID0gZGlyO1xyXG4gICAgICAgIGZpZWxkSGllciA9IGhpZXI7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4geyBmaWVsZEhpZXIsIGZpZWxkRGlyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRPcHBGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zXHJcbikge1xyXG4gIC8vIElmIHRoZSBmaWVsZCBlbmRzIHdpdGggYD5gLCBpdCBpcyBhbHJlYWR5IHRoZSBvcHBvc2l0ZSBmaWVsZCB3ZSBuZWVkIChjb21pbmcgZnJvbSBgZ2V0T3BwRmFsbGJhY2tgKVxyXG4gIGlmIChmaWVsZC5lbmRzV2l0aChcIj5cIikpIHJldHVybiBbZmllbGQuc2xpY2UoMCwgLTQpXTtcclxuXHJcbiAgY29uc3Qgb3BwRmllbGRzID0gW2ZhbGxiYWNrT3BwRmllbGQoZmllbGQsIGRpcildO1xyXG4gIGNvbnN0IHsgZmllbGRIaWVyLCBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpO1xyXG4gIGlmICghZmllbGRIaWVyIHx8ICFmaWVsZERpcikgcmV0dXJuIG9wcEZpZWxkcztcclxuXHJcbiAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGZpZWxkRGlyKTtcclxuICBvcHBGaWVsZHMudW5zaGlmdCguLi5maWVsZEhpZXJbb3BwRGlyXSk7XHJcbiAgcmV0dXJuIG9wcEZpZWxkcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGhpZXJUb1N0ciA9IChoaWVyOiBVc2VySGllcikgPT5cclxuICBESVJFQ1RJT05TLm1hcChcclxuICAgIChkaXIpID0+IGAke0FSUk9XX0RJUkVDVElPTlNbZGlyXX06ICR7aGllcltkaXJdLmpvaW4oXCIsIFwiKX1gXHJcbiAgKS5qb2luKFwiXFxuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZhbGxiYWNrRmllbGQgPSAoZmllbGQ6IHN0cmluZywgZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gIGAke2ZpZWxkfSA8JHtBUlJPV19ESVJFQ1RJT05TW2Rpcl19PmA7XHJcbmV4cG9ydCBjb25zdCBmYWxsYmFja09wcEZpZWxkID0gKGZpZWxkOiBzdHJpbmcsIGRpcjogRGlyZWN0aW9ucykgPT5cclxuICBgJHtmaWVsZH0gPCR7QVJST1dfRElSRUNUSU9OU1tnZXRPcHBEaXIoZGlyKV19PmA7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUhpZXJzKFxyXG4gIHVzZXJIaWVyczogVXNlckhpZXJbXSxcclxuICBmbjogKGhpZXI6IFVzZXJIaWVyLCBkaXI6IERpcmVjdGlvbnMsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcclxuKSB7XHJcbiAgdXNlckhpZXJzLmZvckVhY2goKGhpZXIpID0+IHtcclxuICAgIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgIGhpZXJbZGlyXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGZuKGhpZXIsIGRpciwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7XHJcbiAgRnJvbnRNYXR0ZXJDYWNoZSxcclxuICBwYXJzZVlhbWwsXHJcbiAgc3RyaW5naWZ5WWFtbCxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBpc0luVmF1bHQsXHJcbiAgd2FpdCxcclxuICB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyxcclxufSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgTWV0YWVkaXRBcGkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi9nZW5lcmFsVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTZXR0aW5ncyA9ICgpID0+IGFwcC5wbHVnaW5zLnBsdWdpbnMuYnJlYWRjcnVtYnMuc2V0dGluZ3NcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyRmlsZSA9ICgpOiBURmlsZSB8IG51bGwgPT4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClcclxuXHJcbi8qKlxyXG4gKiBHZXQgYmFzZW5hbWUgZnJvbSBhICoqTWFya2Rvd24qKiBgcGF0aGBcclxuICogQHBhcmFtICB7c3RyaW5nfSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0QmFzZUZyb21NRFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3Qgc3BsaXRTbGFzaCA9IHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKTtcclxuICBpZiAoc3BsaXRTbGFzaC5lbmRzV2l0aChcIi5tZFwiKSkge1xyXG4gICAgcmV0dXJuIHNwbGl0U2xhc2guc3BsaXQoXCIubWRcIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG4gIH0gZWxzZSByZXR1cm4gc3BsaXRTbGFzaDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkJhc2VuYW1lID0gKGZpbGU6IFRGaWxlKSA9PiBmaWxlLmJhc2VuYW1lIHx8IGZpbGUubmFtZTtcclxuZXhwb3J0IGNvbnN0IGdldEZvbGRlck5hbWUgPSAoZmlsZTogVEZpbGUpOiBzdHJpbmcgPT5cclxuICAvL0B0cy1pZ25vcmVcclxuICBmaWxlPy5wYXJlbnQ/Lm5hbWUgfHwgZmlsZS5mb2xkZXI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdpa2koc3RyOiBzdHJpbmcsIHdpa2lRID0gdHJ1ZSkge1xyXG4gIGxldCBjb3B5ID0gc3RyLnNsaWNlKCk7XHJcbiAgaWYgKHdpa2lRKSB7XHJcbiAgICBjb3B5ID0gXCJbW1wiICsgY29weTtcclxuICAgIGNvcHkgKz0gXCJdXVwiO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BXaWtpbGlua3Moc3RyOiBzdHJpbmcpIHtcclxuICBsZXQgY29weSA9IHN0ci5zbGljZSgpO1xyXG4gIGlmIChjb3B5LnN0YXJ0c1dpdGgoXCJbW1wiKSAmJiBjb3B5LmVuZHNXaXRoKFwiXV1cIikpIGNvcHkgPSBjb3B5LnNsaWNlKDIsIC0yKTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgb3IgdXBkYXRlcyB0aGUgZ2l2ZW4geWFtbCBga2V5YCB0byBgdmFsdWVgIGluIHRoZSBnaXZlbiBURmlsZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGtleVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlXHJcbiAqIEBwYXJhbSAge1RGaWxlfSBmaWxlXHJcbiAqIEBwYXJhbSAge0Zyb250TWF0dGVyQ2FjaGV8dW5kZWZpbmVkfSBmcm9udG1hdHRlclxyXG4gKiBAcGFyYW0gIHtNZXRhZWRpdEFwaX0gYXBpXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlT3JVcGRhdGVZYW1sID0gYXN5bmMgKFxyXG4gIGtleTogc3RyaW5nLFxyXG4gIHZhbHVlOiBzdHJpbmcsXHJcbiAgZmlsZTogVEZpbGUsXHJcbiAgZnJvbnRtYXR0ZXI6IEZyb250TWF0dGVyQ2FjaGUgfCB1bmRlZmluZWQsXHJcbiAgYXBpOiBNZXRhZWRpdEFwaVxyXG4pID0+IHtcclxuICBjb25zdCB2YWx1ZVN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gIGlmICghZnJvbnRtYXR0ZXIgfHwgZnJvbnRtYXR0ZXJba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBpbmZvKGBDcmVhdGluZzogJHtrZXl9OiAke3ZhbHVlU3RyfWApO1xyXG4gICAgYXdhaXQgYXBpLmNyZWF0ZVlhbWxQcm9wZXJ0eShrZXksIGBbJyR7dmFsdWVTdHJ9J11gLCBmaWxlKTtcclxuICB9IGVsc2UgaWYgKFsuLi5bZnJvbnRtYXR0ZXJba2V5XV1dLmZsYXQoMykuc29tZSgodmFsKSA9PiB2YWwgPT0gdmFsdWVTdHIpKSB7XHJcbiAgICBpbmZvKFwiQWxyZWFkeSBFeGlzdHMhXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvbGRWYWx1ZUZsYXQ6IHN0cmluZ1tdID0gWy4uLltmcm9udG1hdHRlcltrZXldXV0uZmxhdCg0KTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLm9sZFZhbHVlRmxhdCwgYCcke3ZhbHVlU3RyfSdgXTtcclxuICAgIGluZm8oYFVwZGF0aW5nOiAke2tleX06ICR7bmV3VmFsdWV9YCk7XHJcbiAgICBhd2FpdCBhcGkudXBkYXRlKGtleSwgYFske25ld1ZhbHVlLmpvaW4oXCIsIFwiKX1dYCwgZmlsZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVlhbWwoeWFtbDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICh5YW1sID09PSBcIlwiKSB7XHJcbiAgICByZXR1cm4gYCR7a2V5fTogWycke25ld1ZhbH0nXWA7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHBhcnNlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHBhcnNlWWFtbCh5YW1sKTtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW2tleV07XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwYXJzZWRba2V5XSA9IG5ld1ZhbDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICE9PSBuZXdWYWwpIHtcclxuICAgICAgcGFyc2VkW2tleV0gPSBbdmFsdWUsIG5ld1ZhbF07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0eXBlb2YgdmFsdWU/LlswXSA9PT0gXCJzdHJpbmdcIiAmJlxyXG4gICAgICB2YWx1ZS5pbmNsdWRlcyAmJlxyXG4gICAgICAhdmFsdWUuaW5jbHVkZXMobmV3VmFsKVxyXG4gICAgKSB7XHJcbiAgICAgIHBhcnNlZFtrZXldID0gWy4uLnZhbHVlLCBuZXdWYWxdO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSBpZiAob3RoZXIgdHlwZXMgb2YgdmFsdWVzLi4uKVxyXG4gICAgcmV0dXJuIHN0cmluZ2lmeVlhbWwocGFyc2VkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50OiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aChcIi0tLVxcblwiKSkgcmV0dXJuIFtcIlwiLCBjb250ZW50XTtcclxuICBlbHNlIHtcclxuICAgIGNvbnN0IHNwbGl0cyA9IGNvbnRlbnQuc3BsaXQoXCItLS1cIik7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBzcGxpdHMuc2xpY2UoMCwgMikuam9pbihcIi0tLVwiKSArIFwiLS0tXCIsXHJcbiAgICAgIHNwbGl0cy5zbGljZSgyKS5qb2luKFwiLS0tXCIpLFxyXG4gICAgXTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkcm9wSGFzaCA9ICh0YWc6IHN0cmluZykgPT5cclxuICB0YWcuc3RhcnRzV2l0aChcIiNcIikgPyB0YWcuc2xpY2UoMSkgOiB0YWc7XHJcblxyXG5leHBvcnQgY29uc3QgYWRkSGFzaCA9ICh0YWc6IHN0cmluZykgPT4gKHRhZy5zdGFydHNXaXRoKFwiI1wiKSA/IHRhZyA6IGAjJHt0YWd9YCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0KG5vZGU6IHN0cmluZywgcGx1Z2luOiBCQ1BsdWdpbik6IHN0cmluZyB8IG51bGwge1xyXG4gIGNvbnN0IHsgYWx0TGlua0ZpZWxkcywgc2hvd0FsbEFsaWFzZXMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuICBpZiAoYWx0TGlua0ZpZWxkcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlLCBcIlwiKTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFsdEZpZWxkIG9mIGFsdExpbmtGaWVsZHMpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG1ldGFkYXRhPy5mcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNhY2hlKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIikpIHtcclxuICAgIGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gICAgd2hpbGUgKCFiYXNlbmFtZSB8fCAhYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldy5hcGkucGFnZShiYXNlbmFtZSkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBhd2FpdCB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyhhcHApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxpbmtDbGFzcyA9ICh0bzogc3RyaW5nLCByZWFsUSA9IHRydWUpID0+XHJcbiAgYGludGVybmFsLWxpbmsgQkMtTGluayAke2lzSW5WYXVsdCh0bykgPyBcIlwiIDogXCJpcy11bnJlc29sdmVkXCJ9ICR7cmVhbFEgPyBcIlwiIDogXCJCQy1JbXBsaWVkXCJcclxuICB9YDtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkFwaSA9IChwbHVnaW46IEJDUGx1Z2luKSA9PlxyXG4gIGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXc/LmFwaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZVlhbWwoKTogYm9vbGVhbiB8IG51bGwge1xyXG4gIGNvbnN0IHsgd29ya3NwYWNlLCBtZXRhZGF0YUNhY2hlIH0gPSBhcHA7XHJcbiAgY29uc3QgeyBhY3RpdmVMZWFmIH0gPSB3b3Jrc3BhY2U7XHJcbiAgY29uc3Qge1xyXG4gICAgc3RhdGU6IHsgbW9kZSB9LFxyXG4gIH0gPSBhY3RpdmVMZWFmLmdldFZpZXdTdGF0ZSgpO1xyXG5cclxuICBpZiAobW9kZSAhPT0gXCJzb3VyY2VcIikgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZWRpdG9yIH0gPSBhY3RpdmVMZWFmLnZpZXc7XHJcblxyXG4gIGNvbnN0IGZpbGUgPSBnZXRDdXJyRmlsZSgpO1xyXG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBmcm9udG1hdHRlci5wb3NpdGlvbjtcclxuICBjb25zdCBjdXJyT2ZmID0gZWRpdG9yLnBvc1RvT2Zmc2V0KGVkaXRvci5nZXRDdXJzb3IoKSk7XHJcbiAgaWYgKGN1cnJPZmYgPj0gc3RhcnQub2Zmc2V0ICYmIGN1cnJPZmYgPD0gZW5kLm9mZnNldCkgcmV0dXJuIHRydWU7XHJcbiAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbn1cclxuIiwgImltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgZHJvcEhlYWRlck9yQWxpYXMsIHJlZ05GbGFncywgc3BsaXRMaW5rc1JlZ2V4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1bShhcnI6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlKGFycjogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uYXJyKTtcclxuICByZXR1cm4gYXJyLm1hcCgoaXRlbSkgPT4gaXRlbSAvIG1heCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1N1YnNldCA9IDxUPihhcnIxOiBUW10sIGFycjI6IFRbXSk6IGJvb2xlYW4gPT5cclxuICBhcnIxLmV2ZXJ5KCh2YWx1ZSkgPT4gYXJyMi5pbmNsdWRlcyh2YWx1ZSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QW5kRHJvcChzdHI6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gKFxyXG4gICAgc3RyXHJcbiAgICAgID8ubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICA/Lm1hcCgobGluaykgPT4gbGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcyk/LlsxXSkgPz8gW11cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZHJvcFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnJlcGxhY2UoL14uKlxcLy8sIFwiXCIpO1xyXG5leHBvcnQgY29uc3QgZHJvcERlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBzZXR0aW5ncy50cmltRGVuZHJvbk5vdGVzXHJcbiAgICA/IHBhdGguc3BsaXQoc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIpLmxhc3QoKVxyXG4gICAgOiBwYXRoO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BQYXRoTkRlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBkcm9wRGVuZHJvbihkcm9wUGF0aChwYXRoKSwgc2V0dGluZ3MpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BGb2xkZXIgPSAocGF0aDogc3RyaW5nKSA9PlxyXG4gIHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKS5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0QW5kVHJpbSA9IChmaWVsZHM6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcclxuICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMgPT09IFwiXCIpIHJldHVybiBbXTtcclxuICBlbHNlIHJldHVybiBmaWVsZHMuc3BsaXQoXCIsXCIpLm1hcCgoc3RyKSA9PiBzdHIudHJpbSgpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYWQgYW4gYXJyYXkgd2l0aCBhIGZpbGxlciB2YWx1ZSB0byBhIHNwZWNpZmllZCBsZW5ndGguXHJcbiAqIEBwYXJhbSB7VFtdfSBhcnIgLSBUaGUgYXJyYXkgdG8gcGFkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmluYWxMZW5ndGggLSBUaGUgZmluYWwgbGVuZ3RoIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGxlcj1cIlwiXSAtIFRoZSBmaWxsZXIgdG8gdXNlIGlmIHRoZSBhcnJheSBpcyB0b28gc2hvcnQuXHJcbiAqIEByZXR1cm5zIHsoVCB8IHN0cmluZylbXX0gVGhlIGFycmF5IHdpdGggdGhlIG5ldyB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFkQXJyYXk8VD4oXHJcbiAgYXJyOiBUW10sXHJcbiAgZmluYWxMZW5ndGg6IG51bWJlcixcclxuICBmaWxsZXI6IHN0cmluZyA9IFwiXCJcclxuKTogKFQgfCBzdHJpbmcpW10ge1xyXG4gIGNvbnN0IGNvcHk6IChUIHwgc3RyaW5nKVtdID0gWy4uLmFycl07XHJcbiAgY29uc3QgY3Vyckxlbmd0aCA9IGNvcHkubGVuZ3RoO1xyXG4gIGlmIChjdXJyTGVuZ3RoID4gZmluYWxMZW5ndGgpXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDdXJyZW50IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gZmluYWwgbGVuZ3RoXCIpO1xyXG4gIGVsc2UgaWYgKGN1cnJMZW5ndGggPT09IGZpbmFsTGVuZ3RoKSByZXR1cm4gY29weTtcclxuICBlbHNlIHtcclxuICAgIGZvciAobGV0IGkgPSBjdXJyTGVuZ3RoOyBpIDwgZmluYWxMZW5ndGg7IGkrKykgY29weS5wdXNoKGZpbGxlcik7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cmFuc3Bvc2UoQSkgcmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIEEuXHJcbiAqIEBwYXJhbSB7VFtdW119IEEgLSBUaGUgbWF0cml4IHRvIHRyYW5zcG9zZS5cclxuICogQHJldHVybnMge1RbXVtdfSBBIDJEIGFycmF5IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2U8VD4oQTogVFtdW10pOiBUW11bXSB7XHJcbiAgY29uc3QgY29scyA9IEFbMF0ubGVuZ3RoO1xyXG4gIGNvbnN0IEFUOiBUW11bXSA9IFtdO1xyXG5cclxuICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykgQVQucHVzaChBLm1hcCgocm93KSA9PiByb3dbal0pKTtcclxuXHJcbiAgcmV0dXJuIEFUO1xyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIHJ1bnMgb2YgY29uc2VjdXRpdmUgc3RyaW5nc1xyXG4gKiBpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnJcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICpcclxuICogICBgdmFsdWVgOiB0aGUgdmFsdWUgb2YgdGhlIHJ1blxyXG4gKlxyXG4gKiAgIGBmaXJzdGA6IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqXHJcbiAqICAgYGxhc3RgOiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcnVucyhcclxuICBhcnI6IHN0cmluZ1tdXHJcbik6IHsgdmFsdWU6IHN0cmluZzsgZmlyc3Q6IG51bWJlcjsgbGFzdDogbnVtYmVyIH1bXSB7XHJcbiAgY29uc3QgcnVuczogeyB2YWx1ZTogc3RyaW5nOyBmaXJzdDogbnVtYmVyOyBsYXN0OiBudW1iZXIgfVtdID0gW107XHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChpIDwgYXJyLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY3VyclZhbHVlID0gYXJyW2ldO1xyXG4gICAgcnVucy5wdXNoKHsgdmFsdWU6IGN1cnJWYWx1ZSwgZmlyc3Q6IGksIGxhc3Q6IHVuZGVmaW5lZCB9KTtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPT09IGFycltpXSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBydW5zLmxhc3QoKS5sYXN0ID0gaSAtIDE7XHJcbiAgfVxyXG4gIHJldHVybiBydW5zO1xyXG59XHJcblxyXG4vLyBTT1VSQ0UgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTk2MDkwOC9wZXJtdXRhdGlvbnMtaW4tamF2YXNjcmlwdFxyXG4vKipcclxuICogR2l2ZW4gYSBwZXJtdXRhdGlvbiwgcmV0dXJuIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhhdCBwZXJtdXRhdGlvbi5cclxuICogQHBhcmFtIHBlcm11dGF0aW9uIC0gdGhlIGFycmF5IHRvIGJlIHBlcm11dGVkXHJcbiAqIEByZXR1cm5zIGBbIFsgMSwgMiwgMyBdLCBbIDEsIDMsIDIgXSwgWyAyLCAxLCAzIF0sIFsgMiwgMywgMSBdLCBbIDMsIDEsIDIgXSwgWyAzLCAyLCAxIF0gXWBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlKHBlcm11dGF0aW9uOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gIGNvbnN0IGxlbmd0aCA9IHBlcm11dGF0aW9uLmxlbmd0aCxcclxuICAgIHJlc3VsdCA9IFtwZXJtdXRhdGlvbi5zbGljZSgpXSxcclxuICAgIGMgPSBuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApO1xyXG5cclxuICBsZXQgaSA9IDEsXHJcbiAgICBrOiBudW1iZXIsXHJcbiAgICBwOiBudW1iZXI7XHJcblxyXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoY1tpXSA8IGkpIHtcclxuICAgICAgayA9IGkgJSAyICYmIGNbaV07XHJcbiAgICAgIHAgPSBwZXJtdXRhdGlvbltpXTtcclxuICAgICAgcGVybXV0YXRpb25baV0gPSBwZXJtdXRhdGlvbltrXTtcclxuICAgICAgcGVybXV0YXRpb25ba10gPSBwO1xyXG4gICAgICArK2NbaV07XHJcbiAgICAgIGkgPSAxO1xyXG4gICAgICByZXN1bHQucHVzaChwZXJtdXRhdGlvbi5zbGljZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNbaV0gPSAwO1xyXG4gICAgICArK2k7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByYW5nZSA9IChuOiBudW1iZXIpID0+IFsuLi5BcnJheShuKS5rZXlzKCldO1xyXG5cclxuLyoqXHJcbiAqIFwiR2l2ZW4gdHdvIGFycmF5cywgcmV0dXJuIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgYXJyYXkgdGhhdCBhcmUgbm90IGluIHRoZSBzZWNvbmQgYXJyYXkuXCJcclxuICogQHBhcmFtIHtUW119IEEgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgZmlsdGVyZWRcclxuICogQHBhcmFtIHtUW119IEIgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdGhhdCBhcmUgbm90IGluIEFcclxuICogQHJldHVybnMge1RbXX0gTm9uZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXBsZW1lbnQgPSA8VD4oQTogVFtdLCBCOiBUW10pID0+XHJcbiAgQS5maWx0ZXIoKGEpID0+ICFCLmluY2x1ZGVzKGEpKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzd2FwSXRlbXM8VD4oaTogbnVtYmVyLCBqOiBudW1iZXIsIGFycjogVFtdKSB7XHJcbiAgY29uc3QgbWF4ID0gYXJyLmxlbmd0aCAtIDE7XHJcbiAgaWYgKGkgPCAwIHx8IGkgPiBtYXggfHwgaiA8IDAgfHwgaiA+IG1heCkgcmV0dXJuIGFycjtcclxuICBjb25zdCB0bXAgPSBhcnJbaV07XHJcbiAgYXJyW2ldID0gYXJyW2pdO1xyXG4gIGFycltqXSA9IHRtcDtcclxuICByZXR1cm4gYXJyO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBhbiBhcnJheS5cclxuICogQHBhcmFtIHtUW119IGFyciAtIFRoZSBhcnJheSB0byBiZSBmaWx0ZXJlZC5cclxuICogQHJldHVybnMge1RbXX0gVGhlIGFycmF5IHdpdGggZHVwbGljYXRlcyByZW1vdmVkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZUR1cGxpY2F0ZXMgPSA8VD4oYXJyOiBUW10pID0+IFsuLi5uZXcgU2V0KGFycildO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0clRvUmVnZXgoaW5wdXQ6IHN0cmluZykge1xyXG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2gocmVnTkZsYWdzKTtcclxuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcclxuICBjb25zdCBbLCBpbm5lclJlZ2V4LCBmbGFnc10gPSBtYXRjaDtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGlubmVyUmVnZXgsIGZsYWdzKTtcclxuICAgIHJldHVybiByZWdleDtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICB3YXJuKGUpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcclxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHN0cmluZykge1xyXG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgYWRkRWRnZUlmTm90IH0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBCQ19JX0FVTlQsIEJDX0lfQ09VU0lOLCBCQ19JX1BBUkVOVCwgQkNfSV9TSUJMSU5HXzEsIEJDX0lfU0lCTElOR18yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncyB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZmFsbGJhY2tGaWVsZCwgZ2V0RmllbGRJbmZvIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChnOiBNdWx0aUdyYXBoLCBzZXR0aW5nczogQkNTZXR0aW5ncykge1xyXG4gICAgY29uc3QgeyB1c2VySGllcnMsIHRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nIH0gPSBzZXR0aW5ncztcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgLy8gRmluZCBwYXJlbnRzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHBhcmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwidXBcIikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBmaWVsZERpciwgZmllbGRIaWVyIH0gPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCBjdXJyTkF0dHIuZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9XHJcbiAgICAgICAgICAgICAgICBmaWVsZEhpZXIuc2FtZVswXSA/PyBmYWxsYmFja0ZpZWxkKGN1cnJOQXR0ci5maWVsZCwgZmllbGREaXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY2hpbGRyZW4gb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBhLCBzLCBpbXBsaWVkU2libGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY3VycmVudCBub2RlIGlmIHRoZSBzZXR0aW5ncyBzYXkgdG9cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBhLmRpciAhPT0gXCJkb3duXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAoIXRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nICYmIGltcGxpZWRTaWJsaW5nID09PSBjdXJyTilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCBpbXBsaWVkU2libGluZywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJzYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzEsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHNpYmxpbmdzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHNpYmxpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudHMgb2YgdGhvc2Ugc2libGluZ3NcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShzaWJsaW5nLCAoaywgYSwgcywgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHBhcmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJ1cFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfUEFSRU5ULFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFRyYW5zaXRpdmUgY2xvc3VyZSBvZiBzaWJsaW5nc1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2libGluZ3MoZzogTXVsdGlHcmFwaCkgeyB9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQXVudHNVbmNsZXMoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHBhcmVudHMgb2YgY3VycmVudCBub2RlXHJcbiAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShjdXJyTiwgKGssIGN1cnJFQXR0ciwgcywgcGFyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3VyckVBdHRyLmRpciAhPT0gXCJ1cFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHNpYmxpbmdzIG9mIHRob3NlIHBhcmVudHNcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShwYXJlbnROb2RlLCAoaywgYSwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHVuY2xlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyOiBcInVwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzdGFydGluZyBub2RlJ3MgcGFyZW50IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGN1cnJFQXR0ci5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBsaWVkOiBCQ19JX0FVTlQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ291c2lucyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgICBnLmZvckVhY2hOb2RlKChjdXJyTiwgYSkgPT4ge1xyXG4gICAgICAgIC8vIEZpbmQgcGFyZW50cyBvZiBjdXJyZW50IG5vZGVcclxuICAgICAgICBnLmZvckVhY2hPdXRFZGdlKGN1cnJOLCAoaywgY3VyckVBdHRyLCBzLCBwYXJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyRUF0dHIuZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgc2libGluZ3Mgb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBwYXJlbnRTaWJsaW5nQXR0ciwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTaWJsaW5nQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZSh1bmNsZSwgKGssIGEsIHMsIGNvdXNpbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJkb3duXCIgfHwgY3Vyck4gPT09IGNvdXNpbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIGNvdXNpbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcGFyZW50U2libGluZ0F0dHIuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfQ09VU0lOLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFNpcyAtLT4gTWUgPC0tIEJyb1xyXG4vLyBJbXBsaWVzOiBTaXMgPC0tPiBCcm9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzKGc6IE11bHRpR3JhcGgpIHtcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYVNpcywgc2lzLCBfKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhU2lzLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuICAgICAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYUJybywgYnJvLCBfKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5kaXIgIT09IFwic2FtZVwiIHx8IHNpcyA9PT0gYnJvKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5maWVsZCA9PT0gYVNpcy5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZEVkZ2VJZk5vdChnLCBzaXMsIGJybywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYUJyby5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZEVkZ2VJZk5vdCwgYWRkTm9kZXNJZk5vdCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q1NWUm93cyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBDU1ZQYXRocyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGNvbnN0IENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIGlmIChDU1ZQYXRocyA9PT0gXCJcIikgcmV0dXJuIENTVlJvd3M7XHJcblxyXG4gIGNvbnN0IGZ1bGxQYXRoID0gbm9ybWFsaXplUGF0aChDU1ZQYXRocyk7XHJcblxyXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5yZWFkKGZ1bGxQYXRoKTtcclxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoZWFkKSA9PiBoZWFkLnRyaW0oKSk7XHJcbiAgbGluZXMuc2xpY2UoMSkuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICBjb25zdCByb3dPYmogPSB7fTtcclxuICAgIHJvd1xyXG4gICAgICAuc3BsaXQoXCIsXCIpXHJcbiAgICAgIC5tYXAoKGhlYWQpID0+IGRyb3BXaWtpbGlua3MoaGVhZC50cmltKCkpKVxyXG4gICAgICAuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIHJvd09ialtoZWFkZXJzW2ldXSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgZGVidWcoeyByb3dPYmogfSk7XHJcbiAgICBDU1ZSb3dzLnB1c2gocm93T2JqKTtcclxuICB9KTtcclxuICByZXR1cm4gQ1NWUm93cztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENTVkNydW1icyhcclxuICBnOiBNdWx0aUdyYXBoLFxyXG4gIENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcclxuICBkaXI6IERpcmVjdGlvbnMsXHJcbiAgZmllbGQ6IHN0cmluZ1xyXG4pIHtcclxuICBDU1ZSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgYWRkTm9kZXNJZk5vdChnLCBbcm93LmZpbGVdKTtcclxuICAgIGlmIChmaWVsZCA9PT0gXCJcIiB8fCAhcm93W2ZpZWxkXSkgcmV0dXJuO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoZywgW3Jvd1tmaWVsZF1dKTtcclxuICAgIGFkZEVkZ2VJZk5vdChnLCByb3cuZmlsZSwgcm93W2ZpZWxkXSwgeyBkaXIsIGZpZWxkIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBCQ19EVl9OT1RFLCBCQ19EVl9OT1RFX0ZJRUxELCBCQ19JR05PUkUsIERBVEFWSUVXX01JU1NJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YXZpZXdOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBlbGlnYWJsZUFsdHM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycywgZGF0YXZpZXdOb3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICBpZiAoIWR2ICYmIGVsaWdhYmxlQWx0cy5sZW5ndGgpIHtcclxuICAgIG5ldyBOb3RpY2UoREFUQVZJRVdfTUlTU0lORyk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0RFZCYXNlbmFtZShhbHRGaWxlLmZpbGUpO1xyXG5cclxuICAgIGxldCBxdWVyeSA9IGFsdEZpbGVbQkNfRFZfTk9URV0gYXMgKHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG4gICAgaWYgKHF1ZXJ5Lmhhc093blByb3BlcnR5KCdwYXRoJykpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHF1ZXJ5ID0gYFtbJHtxdWVyeS5wYXRofV1dYDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGZpZWxkID1cclxuICAgICAgKGFsdEZpbGVbQkNfRFZfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAoZGF0YXZpZXdOb3RlRmllbGQgfHwgZmllbGRzWzBdKTtcclxuXHJcbiAgICBsZXQgdGFyZ2V0czogZHZGcm9udG1hdHRlckNhY2hlW10gPSBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRhcmdldHMgPSBkdi5wYWdlcyg8c3RyaW5nPnF1ZXJ5KS52YWx1ZXM7XHJcbiAgICB9IGNhdGNoIChlcikge1xyXG4gICAgICBuZXcgTm90aWNlKGAke3F1ZXJ5fSBpcyBub3QgYSB2YWxpZCBEYXRhdmlldyBmcm9tLXF1ZXJ5YCk7XHJcbiAgICAgIHdhcm4oZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgaWYgKHRhcmdldFtCQ19JR05PUkVdKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdGFyZ2V0Qk4gPSBnZXREVkJhc2VuYW1lKHRhcmdldC5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXRCTik7XHJcblxyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0Qk4sXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHBvcHVsYXRlTWFpbiB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldERWQmFzZW5hbWUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgKiBhcyBsdXhvbiBmcm9tIFwibHV4b25cIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHtcclxuICAgIGFkZERhdGVOb3RlcyxcclxuICAgIGRhdGVOb3RlQWRkTW9udGgsXHJcbiAgICBkYXRlTm90ZUFkZFllYXIsXHJcbiAgICBkYXRlTm90ZUZvcm1hdCxcclxuICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGlmICghYWRkRGF0ZU5vdGVzKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IHsgcmVnZXggfSA9IGx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKFwiXCIsIGRhdGVOb3RlRm9ybWF0KTtcclxuICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgIGNvbnN0IHsgZmlsZSB9ID0gcGFnZTtcclxuICAgIGNvbnN0IHsgZGF5IH0gPSBmaWxlO1xyXG4gICAgaWYgKCFkYXkgfHwgIXJlZ2V4LnRlc3QoZ2V0RFZCYXNlbmFtZShmaWxlKSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0b2RheSA9IGdldERWQmFzZW5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b21vcnJvdyA9IGRheS5wbHVzKHsgZGF5czogMSB9KTtcclxuICAgIGNvbnN0IHRvbVN0ciA9IHRvbW9ycm93LnRvRm9ybWF0KGRhdGVOb3RlRm9ybWF0KTtcclxuXHJcbiAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgIHNldHRpbmdzLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgdG9kYXksXHJcbiAgICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgICAgIHRvbVN0cixcclxuICAgICAgOTk5OSxcclxuICAgICAgOTk5OSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfSUdOT1JFLCBCQ19JR05PUkVfREVORFJPTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBkdkZyb250bWF0dGVyQ2FjaGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldERlbmRyb25QYXJlbnQgPSAoZGVuZHJvbjogc3RyaW5nLCBzcGxpdHRlcjogc3RyaW5nKSA9PlxyXG4gIGRlbmRyb24uc3BsaXQoc3BsaXR0ZXIpLnNsaWNlKDAsIC0xKS5qb2luKHNwbGl0dGVyKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgYWRkRGVuZHJvbk5vdGVzLCBkZW5kcm9uTm90ZURlbGltaXRlciwgZGVuZHJvbk5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgaWYgKCFhZGREZW5kcm9uTm90ZXMpIHJldHVybjtcclxuXHJcbiAgZm9yIChjb25zdCBmcm9udG0gb2YgZnJvbnRtcykge1xyXG4gICAgaWYgKGZyb250bVtCQ19JR05PUkVfREVORFJPTl0gfHwgZnJvbnRtW0JDX0lHTk9SRV0pIGNvbnRpbnVlO1xyXG5cclxuICAgIGxldCBjdXJyID0gZ2V0RFZCYXNlbmFtZShmcm9udG0uZmlsZSk7XHJcbiAgICBsZXQgcGFyZW50ID0gZ2V0RGVuZHJvblBhcmVudChjdXJyLCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCAhPT0gXCJcIikge1xyXG4gICAgICBjb25zdCBwYXJlbnRGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4gICAgICAgIChmbSkgPT4gZ2V0RFZCYXNlbmFtZShmbS5maWxlKSA9PT0gcGFyZW50XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyAhcGFyZW50RmlsZSBpbXBsaWVzIGEgXCJzdHViXCJcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAoIXBhcmVudEZpbGUgfHwgcGFyZW50RmlsZVtCQ19JR05PUkVfREVORFJPTl0gIT09IHRydWUpIHtcclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgY3VycixcclxuICAgICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbiAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgOTk5OSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnIgPSBwYXJlbnQ7XHJcbiAgICAgIHBhcmVudCA9IGdldERlbmRyb25QYXJlbnQocGFyZW50LCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChcclxuLy8gICBwbHVnaW46IEJDUGx1Z2luLFxyXG4vLyAgIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4vLyAgIG1haW5HOiBNdWx0aUdyYXBoXHJcbi8vICkge1xyXG4vLyAgIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuLy8gICBjb25zdCB7IGFkZERlbmRyb25Ob3RlcywgZGVuZHJvbk5vdGVEZWxpbWl0ZXIsIGRlbmRyb25Ob3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4vLyAgIGlmICghYWRkRGVuZHJvbk5vdGVzKSByZXR1cm47XHJcblxyXG4vLyAgIGZvciAoY29uc3QgZnJvbnRtIG9mIGZyb250bXMpIHtcclxuLy8gICAgIGlmIChmcm9udG1bQkNfSUdOT1JFX0RFTkRST05dKSBjb250aW51ZTtcclxuXHJcbi8vICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZnJvbnRtLmZpbGUpO1xyXG5cclxuLy8gICAgIGNvbnN0IHNwbGl0cyA9IGJhc2VuYW1lLnNwbGl0KGRlbmRyb25Ob3RlRGVsaW1pdGVyKTtcclxuLy8gICAgIGlmIChzcGxpdHMubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IG5leHRTbGljZSA9IHNwbGl0cy5zbGljZSgwLCAtMSkuam9pbihkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbi8vICAgICBpZiAoIW5leHRTbGljZSkgY29udGludWU7XHJcbi8vICAgICBjb25zdCBuZXh0U2xpY2VGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4vLyAgICAgICAoZm0pID0+IGdldERWQmFzZW5hbWUoZm0uZmlsZSkgPT09IG5leHRTbGljZVxyXG4vLyAgICAgKTtcclxuXHJcbi8vICAgICBpZiAoIW5leHRTbGljZUZpbGUgfHwgbmV4dFNsaWNlRmlsZVtCQ19JR05PUkVfREVORFJPTl0pIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gZ2V0U291cmNlT3JkZXIoZnJvbnRtKTtcclxuLy8gICAgIGNvbnN0IHRhcmdldE9yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbmV4dFNsaWNlKTtcclxuXHJcbi8vICAgICBwb3B1bGF0ZU1haW4oXHJcbi8vICAgICAgIHNldHRpbmdzLFxyXG4vLyAgICAgICBtYWluRyxcclxuLy8gICAgICAgYmFzZW5hbWUsXHJcbi8vICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbi8vICAgICAgIG5leHRTbGljZSxcclxuLy8gICAgICAgc291cmNlT3JkZXIsXHJcbi8vICAgICAgIHRhcmdldE9yZGVyLFxyXG4vLyAgICAgICB0cnVlXHJcbi8vICAgICApO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgQkNfRk9MREVSX05PVEVfU1VCRk9MREVSUyxcclxuICBCQ19JR05PUkUsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSwgZ2V0Rm9sZGVyTmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCBnZXRTdWJzRnJvbUZvbGRlciA9IChmb2xkZXI6IFRGb2xkZXIpID0+IHtcclxuICBjb25zdCBvdGhlck5vdGVzOiBURmlsZVtdID0gW10sXHJcbiAgICBzdWJGb2xkZXJzOiBURm9sZGVyW10gPSBbXTtcclxuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgodEFic3RyYWN0KSA9PiB7XHJcbiAgICBpZiAodEFic3RyYWN0IGluc3RhbmNlb2YgVEZpbGUpIG90aGVyTm90ZXMucHVzaCh0QWJzdHJhY3QpO1xyXG4gICAgZWxzZSBzdWJGb2xkZXJzLnB1c2godEFic3RyYWN0IGFzIFRGb2xkZXIpO1xyXG4gIH0pO1xyXG4gIHJldHVybiB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRGb2xkZXJOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBmb2xkZXJOb3RlczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZm9sZGVyTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3QgdG9wRm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b3BGb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRvcEZvbGRlck5hbWUpIGFzIFRGb2xkZXI7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG90aGVyKSA9PlxyXG4gICAgICAgICAgZ2V0Rm9sZGVyTmFtZShvdGhlcikgPT09IHRvcEZvbGRlck5hbWUgJiYgb3RoZXIucGF0aCAhPT0gZmlsZS5wYXRoICYmICFvdGhlcltCQ19JR05PUkVdXHJcbiAgICAgIClcclxuICAgICAgLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICBjb25zdCBmaWVsZCA9IGFsdEZpbGVbQkNfRk9MREVSX05PVEVdIGFzIHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgZmllbGQgIT09IFwic3RyaW5nXCIgfHwgIWZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpIHJldHVybjtcclxuXHJcbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAvLyBUaGlzIGlzIGdldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmb2xkZXIgbm90ZSwgbm90IHRoZSBzb3VyY2UgcG9pbnRpbmcgdXAgdG8gaXRcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICBtYWluRyxcclxuICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfU1VCRk9MREVSU10pIHtcclxuICAgICAgY29uc3Qgc3ViZm9sZGVyRmllbGQgPSBhbHRGaWxlW0JDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlNdIGFzIHN0cmluZztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBzdWJmb2xkZXJGaWVsZCAhPT0gXCJzdHJpbmdcIiB8fFxyXG4gICAgICAgICFmaWVsZHMuaW5jbHVkZXMoc3ViZm9sZGVyRmllbGQpXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcblxyXG4gICAgICBzdWJGb2xkZXJzLmZvckVhY2goKHN1YkZvbGRlcikgPT4ge1xyXG4gICAgICAgIHN1YkZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICAgIGJhc2VuYW1lLFxyXG4gICAgICAgICAgICAgIHN1YmZvbGRlckZpZWxkLFxyXG4gICAgICAgICAgICAgIGNoaWxkQmFzZW5hbWUsXHJcbiAgICAgICAgICAgICAgOTk5OSxcclxuICAgICAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFXSkge1xyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcbiAgICAgIGNvbnN0IGZvbGRlclF1ZXVlOiBURm9sZGVyW10gPSBbLi4uc3ViRm9sZGVyc107XHJcblxyXG4gICAgICBsZXQgY3VyckZvbGRlciA9IGZvbGRlclF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgIHdoaWxlIChjdXJyRm9sZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKGN1cnJGb2xkZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb2xkZXJOb3RlID0gY3VyckZvbGRlci5uYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBvdGhlck5vdGVzLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKCFpc0luVmF1bHQoIGZvbGRlck5vdGUsIGZvbGRlck5vdGUpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSA5OTk5OyAvLyBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEZvbGRlck5vdGUgPSBjdXJyRm9sZGVyLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgcGFyZW50Rm9sZGVyTm90ZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgZm9sZGVyTm90ZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IGZvbGRlck5vdGUpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gOTk5OTsgLy8gZ2V0U291cmNlT3JkZXIoYWx0RmlsZSk7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICAgIGZvbGRlck5vdGUsXHJcbiAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9sZGVyUXVldWUucHVzaCguLi5zdWJGb2xkZXJzKTtcclxuICAgICAgICBjdXJyRm9sZGVyID0gZm9sZGVyUXVldWUuc2hpZnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpcnN0IGFkZCBvdGhlck5vdGVzIHRvIGdyYXBoXHJcblxyXG4gICAgLy8gVGhlbiBpdGVyYXRlIHN1YkZvbGRlcnMgZG9pbmcgdGhlIHNhbWVcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lLCBnZXRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncywgSGllcmFyY2h5Tm90ZUl0ZW0gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBhZGRFZGdlSWZOb3QsIGFkZE5vZGVzSWZOb3QgfSBmcm9tIFwiLi4vLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcywgZ2V0T3BwRGlyLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGU6IFRGaWxlKSB7XHJcbiAgY29uc3QgeyBsaXN0SXRlbXMgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICBpZiAoIWxpc3RJdGVtcykgcmV0dXJuIFtdO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZmlsZSlcclxuICBjb25zdCB7IGhpZXJhcmNoeU5vdGVJc1BhcmVudCB9ID0gZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgY29uc3QgbGluZXMgPSAoYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHlOb3RlSXRlbXM6IEhpZXJhcmNoeU5vdGVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3QgYWZ0ZXJCdWxsZXRSZWcgPSBuZXcgUmVnRXhwKC9cXHMqWysqLV1cXHMoLiokKS8pO1xyXG4gIGNvbnN0IGRyb3BXaWtpTGlua3NSZWcgPSBuZXcgUmVnRXhwKC9cXFtcXFsoLio/KVxcXVxcXS8pO1xyXG4gIGNvbnN0IGZpZWxkUmVnID0gbmV3IFJlZ0V4cCgvKC4qPylcXFtcXFsuKj9cXF1cXF0vKTtcclxuXHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3RJdGVtcykge1xyXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2l0ZW0ucG9zaXRpb24uc3RhcnQubGluZV07XHJcblxyXG4gICAgY29uc3QgYWZ0ZXJCdWxsZXRDdXJyID0gYWZ0ZXJCdWxsZXRSZWcuZXhlYyhsaW5lKVsxXTtcclxuICAgIGNvbnN0IG5vdGUgPSBkcm9wV2lraUxpbmtzUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXTtcclxuICAgIGxldCBmaWVsZCA9IGZpZWxkUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXS50cmltKCkgfHwgbnVsbDtcclxuXHJcbiAgICBjb25zdCB7IHBhcmVudCB9ID0gaXRlbTtcclxuICAgIGlmIChwYXJlbnQgPj0gMCkge1xyXG4gICAgICBjb25zdCBwYXJlbnROb3RlID0gbGluZXNbcGFyZW50XTtcclxuICAgICAgY29uc3QgYWZ0ZXJCdWxsZXRQYXJlbnQgPSBhZnRlckJ1bGxldFJlZy5leGVjKHBhcmVudE5vdGUpWzFdO1xyXG4gICAgICBjb25zdCBkcm9wV2lraVBhcmVudCA9IGRyb3BXaWtpTGlua3NSZWcuZXhlYyhhZnRlckJ1bGxldFBhcmVudClbMV07XHJcblxyXG4gICAgICBoaWVyYXJjaHlOb3RlSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbm90ZSxcclxuICAgICAgICBwYXJlbnQ6IGRyb3BXaWtpUGFyZW50LFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhpZXJhcmNoeU5vdGVJdGVtcy5wdXNoKHtcclxuICAgICAgICBub3RlLFxyXG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5Tm90ZUlzUGFyZW50ID8gYmFzZW5hbWUgOiBudWxsLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGhpZXJhcmNoeU5vdGVJdGVtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhOc1RvR3JhcGgoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgaG5BcnI6IEhpZXJhcmNoeU5vdGVJdGVtW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBITlVwRmllbGQsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgdXBGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzLCBcInVwXCIpO1xyXG5cclxuICBobkFyci5mb3JFYWNoKChobkl0ZW0sIGkpID0+IHtcclxuICAgIGNvbnN0IHsgbm90ZSwgZmllbGQsIHBhcmVudCB9ID0gaG5JdGVtO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEZpZWxkID0gZmllbGQgPz8gKEhOVXBGaWVsZCB8fCB1cEZpZWxkc1swXSk7XHJcbiAgICBjb25zdCBkaXIgPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCB0YXJnZXRGaWVsZCk/LmZpZWxkRGlyO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIHRhcmdldEZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcyA9IG5vdGU7XHJcbiAgICAgIGNvbnN0IHQgPSBobkFycltpICsgMV0/Lm5vdGU7XHJcblxyXG4gICAgICBhZGROb2Rlc0lmTm90KG1haW5HLCBbcywgdF0pO1xyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHMsIHQsIHsgZGlyOiBvcHBEaXIsIGZpZWxkOiBvcHBGaWVsZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkZE5vZGVzSWZOb3QobWFpbkcsIFtub3RlLCBwYXJlbnRdKTtcclxuICAgICAgaWYgKHNldHRpbmdzLnNob3dVcEluSnVnZ2wpIHtcclxuICAgICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIG5vdGUsIHBhcmVudCwge1xyXG4gICAgICAgICAgZGlyLFxyXG4gICAgICAgICAgZmllbGQ6IHRhcmdldEZpZWxkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHBhcmVudCwgbm90ZSwge1xyXG4gICAgICAgIGRpcjogb3BwRGlyLFxyXG4gICAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IHBhcnNlVHlwZWRMaW5rIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHNwbGl0TGlua3NSZWdleCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBkdkZyb250bWF0dGVyQ2FjaGUsIEp1Z2dsTGluayB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFRhcmdldE9yZGVyLCBwb3B1bGF0ZU1haW4gfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbi8vIFRPRE8gSSB0aGluayBpdCdkIGJlIGJldHRlciB0byBkbyB0aGlzIHdob2xlIHRoaW5nIGFzIGFuIG9iaiBpbnN0ZWFkIG9mIEp1Z2dsTGlua1tdXHJcbi8vID0+IHtbbm90ZTogc3RyaW5nXToge3R5cGU6IHN0cmluZywgbGlua3NJbkxpbmU6IHN0cmluZ1tdfVtdfVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SnVnZ2xMaW5rcyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGZpbGVzOiBURmlsZVtdXHJcbik6IFByb21pc2U8SnVnZ2xMaW5rW10+IHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGRiLnN0YXJ0MkcoXCJnZXRKdWdnbExpbmtzXCIpO1xyXG5cclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIC8vIEFkZCBKdWdnbCBsaW5rc1xyXG4gIGNvbnN0IHR5cGVkTGlua3NBcnI6IEp1Z2dsTGlua1tdID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgY29uc3QganVnZ2xMaW5rOiBKdWdnbExpbmsgPSB7IGZpbGUsIGxpbmtzOiBbXSB9O1xyXG5cclxuICAgICAgLy8gVXNlIE9icyBtZXRhZGF0YWNhY2hlIHRvIGdldCB0aGUgbGlua3MgaW4gdGhlIGN1cnJlbnQgZmlsZVxyXG4gICAgICBjb25zdCBsaW5rcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKT8ubGlua3MgPz8gW107XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gbGlua3MubGVuZ3RoID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiBcIlwiO1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluZU5vID0gbGluay5wb3NpdGlvbi5zdGFydC5saW5lO1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsaW5lTm9dO1xyXG5cclxuICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBmb3Igd2lraWxpbmtzLCBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGxpbmsuaW5uZXJUZXh0XHJcbiAgICAgICAgY29uc3QgbGlua3NJbkxpbmUgPVxyXG4gICAgICAgICAgbGluZVxyXG4gICAgICAgICAgICAubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICAgICAgICA/Lm1hcCgobGluaykgPT4gbGluay5zbGljZSgyLCBsaW5rLmxlbmd0aCAtIDIpKVxyXG4gICAgICAgICAgICA/Lm1hcCgoaW5uZXJUZXh0KSA9PiBpbm5lclRleHQuc3BsaXQoXCJ8XCIpWzBdKSA/PyBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZWRMaW5rUHJlZml4ID1cclxuICAgICAgICAgIGFwcC5wbHVnaW5zLnBsdWdpbnMuanVnZ2w/LnNldHRpbmdzLnR5cGVkTGlua1ByZWZpeCA/PyBcIi1cIjtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyc2VkTGlua3MgPSBwYXJzZVR5cGVkTGluayhsaW5rLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHBhcnNlZExpbmtzPy5wcm9wZXJ0aWVzPy50eXBlID8/IFwiXCI7XHJcbiAgICAgICAgaWYgKGZpZWxkID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgeyBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpIHx8IHt9O1xyXG4gICAgICAgIGlmICghZmllbGREaXIpIHJldHVybjtcclxuXHJcbiAgICAgICAganVnZ2xMaW5rLmxpbmtzLnB1c2goe1xyXG4gICAgICAgICAgZGlyOiBmaWVsZERpcixcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua3NJbkxpbmUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgY29uc3QgZmlsdGVyZWRMaW5rcyA9IHR5cGVkTGlua3NBcnIubWFwKChqdWdnbExpbmspID0+IHtcclxuICAgIC8vIEZpbHRlciBvdXQgbGlua3Mgd2hvc2UgdHlwZSBpcyBub3QgaW4gYWxsRmllbGRzXHJcbiAgICBqdWdnbExpbmsubGlua3MgPSBqdWdnbExpbmsubGlua3MuZmlsdGVyKChsaW5rKSA9PlxyXG4gICAgICBhbGxGaWVsZHMuaW5jbHVkZXMobGluay5maWVsZClcclxuICAgICk7XHJcbiAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gIH0pO1xyXG4gIGRiLmVuZDJHKHsgZmlsdGVyZWRMaW5rcyB9KTtcclxuICByZXR1cm4gZmlsdGVyZWRMaW5rcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1Z2dsTGlua3NUb0dyYXBoKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIGp1Z2dsTGlua3M6IEp1Z2dsTGlua1tdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGp1Z2dsTGlua3MuZm9yRWFjaCgoanVnZ2xMaW5rKSA9PiB7XHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBqdWdnbExpbmsuZmlsZTtcclxuICAgIGp1Z2dsTGluay5saW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgbGlua3NJbkxpbmUgfSA9IGxpbms7XHJcbiAgICAgIGlmIChkaXIgPT09IFwiXCIpIHJldHVybjtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIGxpbmtzSW5MaW5lLmZvckVhY2goKGxpbmtJbkxpbmUpID0+IHtcclxuICAgICAgICAvLyBJcyB0aGlzIGEgYnVnPyBXaHkgbm90IGBnZXRTb3VyY2VPcmRlcmA/XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0c09yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbGlua0luTGluZSk7XHJcblxyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua0luTGluZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0c09yZGVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfTElOS19OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTGlua05vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBlbGlnYWJsZUFsdHMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgbGlua05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgbGlua05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUobGlua05vdGVGaWxlKTtcclxuXHJcbiAgICBsZXQgZmllbGQgPSBhbHRGaWxlW0JDX0xJTktfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8ubGlua3M/Lm1hcCgobCkgPT4gbC5saW5rLm1hdGNoKC9bXiN8XSsvKVswXSk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8uZW1iZWRzPy5tYXAoKGwpID0+IGwubGluay5tYXRjaCgvW14jfF0rLylbMF0pO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uKGxpbmtzID8/IFtdKSwgLi4uKGVtYmVkcyA/PyBbXSldO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBsaW5rTm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIGxpbmtOb3RlQmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0LFxyXG4gICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgIHRhcmdldE9yZGVyLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19JR05PUkUsIEJDX1JFR0VYX05PVEUsIEJDX1JFR0VYX05PVEVfRklFTEQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3RyVG9SZWdleCB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCByZWdleE5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIGVsaWdhYmxlQWx0cy5mb3JFYWNoKChhbHRGaWxlKSA9PiB7XHJcbiAgICBjb25zdCByZWdleE5vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgcmVnZXhOb3RlQmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKHJlZ2V4Tm90ZUZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gc3RyVG9SZWdleChhbHRGaWxlW0JDX1JFR0VYX05PVEVdIGFzIHN0cmluZyk7XHJcbiAgICBpbmZvKHsgcmVnZXggfSk7XHJcblxyXG4gICAgbGV0IGZpZWxkID0gYWx0RmlsZVtCQ19SRUdFWF9OT1RFX0ZJRUxEXSBhcyBzdHJpbmc7XHJcbiAgICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiIHx8ICFmaWVsZHMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICAgICBmaWVsZCA9IHJlZ2V4Tm90ZUZpZWxkIHx8IGZpZWxkc1swXTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXRzID0gW107XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgaWYgKHBhZ2VbQkNfSUdOT1JFXSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgaWYgKGJhc2VuYW1lICE9PSByZWdleE5vdGVCYXNlbmFtZSAmJiByZWdleC50ZXN0KGJhc2VuYW1lKSlcclxuICAgICAgICB0YXJnZXRzLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IGdldFNvdXJjZU9yZGVyKGFsdEZpbGUpO1xyXG4gICAgICBjb25zdCB0YXJnZXRPcmRlciA9IGdldFRhcmdldE9yZGVyKGZyb250bXMsIHJlZ2V4Tm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIHJlZ2V4Tm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lHTk9SRSxcclxuICBCQ19UQUdfTk9URSxcclxuICBCQ19UQUdfTk9URV9FWEFDVCxcclxuICBCQ19UQUdfTk9URV9GSUVMRCxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGFkZEhhc2gsIGRyb3BIYXNoLCBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldEFsbFRhZ3MgPSAoZmlsZTogVEZpbGUsIHdpdGhIYXNoID0gdHJ1ZSk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCB7IHRhZ3MsIGZyb250bWF0dGVyIH0gPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgY29uc3QgYWxsVGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgdGFncz8uZm9yRWFjaCgodCkgPT4gYWxsVGFncy5wdXNoKGRyb3BIYXNoKHQudGFnKSkpO1xyXG5cclxuICBbZnJvbnRtYXR0ZXI/LnRhZ3MgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcbiAgW2Zyb250bWF0dGVyPy50YWcgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBhbGxUYWdzLm1hcCgodCkgPT4gKHdpdGhIYXNoID8gXCIjXCIgOiBcIlwiKSArIHQudG9Mb3dlckNhc2UoKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZWxpZ2FibGVBbHRzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMsIHRhZ05vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHRhZ05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG5cclxuICAgIGNvbnN0IHRhZ05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUodGFnTm90ZUZpbGUpO1xyXG4gICAgY29uc3QgdGFnID0gYWRkSGFzaCgoYWx0RmlsZVtCQ19UQUdfTk9URV0gYXMgc3RyaW5nKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpbmZvKHsgdGFnIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhc1RoaXNUYWcgPSAoZmlsZTogVEZpbGUpID0+IHtcclxuICAgICAgY29uc3QgYWxsVGFncyA9IGdldEFsbFRhZ3MoZmlsZSk7XHJcbiAgICAgIHJldHVybiBhbHRGaWxlW0JDX1RBR19OT1RFX0VYQUNUXSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBhbGxUYWdzLmluY2x1ZGVzKHRhZylcclxuICAgICAgICA6IGFsbFRhZ3Muc29tZSgodCkgPT4gdC5pbmNsdWRlcyh0YWcpKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucGF0aCAhPT0gdGFnTm90ZUZpbGUucGF0aCAmJiBoYXNUaGlzVGFnKGZpbGUpICYmICFmaWxlW0JDX0lHTk9SRV0pXHJcbiAgICAgIC5tYXAoZ2V0RFZCYXNlbmFtZSk7XHJcbiAgICBpbmZvKHsgdGFyZ2V0cyB9KTtcclxuXHJcbiAgICBsZXQgZmllbGQgPVxyXG4gICAgICAoYWx0RmlsZVtCQ19UQUdfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAodGFnTm90ZUZpZWxkIHx8IGZpZWxkc1swXSk7XHJcblxyXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YWdOb3RlQmFzZW5hbWUpO1xyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgdGFnTm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19UUkFWRVJTRV9OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRmc0FsbFBhdGhzLCBwb3B1bGF0ZU1haW4sIHJlbW92ZUN5Y2xlcyB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0cmF2ZXJzZU5vdGVzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaCxcclxuICBvYnNHOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIHRyYXZlcnNlTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3Qgbm9DeWNsZXMgPSByZW1vdmVDeWNsZXMob2JzRywgYmFzZW5hbWUpO1xyXG5cclxuICAgIGxldCBmaWVsZCA9IGFsdEZpbGVbQkNfVFJBVkVSU0VfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbFBhdGhzID0gZGZzQWxsUGF0aHMobm9DeWNsZXMsIGJhc2VuYW1lKTtcclxuICAgIGluZm8oYWxsUGF0aHMpO1xyXG4gICAgY29uc3QgcmV2ZXJzZWQgPSBbLi4uYWxsUGF0aHNdLm1hcCgocGF0aCkgPT4gcGF0aC5yZXZlcnNlKCkpO1xyXG4gICAgcmV2ZXJzZWQuZm9yRWFjaCgocGF0aCkgPT4ge1xyXG4gICAgICBwYXRoLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gcGF0aFtpICsgMV07XHJcbiAgICAgICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgbmV4dCxcclxuICAgICAgICAgIDk5OTksXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGVycm9yLCBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duVmlldywgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IE5leHRQcmV2IGZyb20gXCIuLi9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZVwiO1xyXG5pbXBvcnQgVHJhaWxHcmlkIGZyb20gXCIuLi9Db21wb25lbnRzL1RyYWlsR3JpZC5zdmVsdGVcIjtcclxuaW1wb3J0IFRyYWlsUGF0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlXCI7XHJcbmltcG9ydCB7XHJcbiAgQkNfSElERV9UUkFJTCxcclxuICBibGFua1JlYWxOSW1wbGllZCxcclxuICBKVUdHTF9UUkFJTF9ERUZBVUxUUyxcclxuICBUUkFJTF9MRU5HVEhTLFxyXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBFZGdlQXR0ciwgUmVhbE5JbXBsaWVkIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBiZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2xUcmFpbCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZnVuY3Rpb24gZ2V0TGltaXRlZFRyYWlsU3ViKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBtYWluRywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgbGltaXRUcmFpbENoZWNrYm94ZXMsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmIChcclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmV2ZXJ5KChmaWVsZCkgPT4gbGltaXRUcmFpbENoZWNrYm94ZXMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGdldFN1YkluRGlycyhjbG9zZWRHLCBcInVwXCIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvcHBGaWVsZHMgPSBsaW1pdFRyYWlsQ2hlY2tib3hlc1xyXG4gICAgICAubWFwKChmaWVsZCkgPT4gZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIFwidXBcIik/LlswXSlcclxuICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xyXG4gICAgY29uc3Qgc3ViR3JhcGggPSBnZXRTdWJGb3JGaWVsZHMobWFpbkcsIFtcclxuICAgICAgLi4ubGltaXRUcmFpbENoZWNrYm94ZXMsXHJcbiAgICAgIC4uLm9wcEZpZWxkcyxcclxuICAgIF0pO1xyXG4gICAgY29uc3QgY2xvc2VkID0gZ2V0UmVmbGV4aXZlQ2xvc3VyZShzdWJHcmFwaCwgdXNlckhpZXJzKTtcclxuICAgIHJldHVybiBnZXRTdWJJbkRpcnMoY2xvc2VkLCBcInVwXCIpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnMoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGVcclxuKTogc3RyaW5nW11bXSB8IG51bGwge1xyXG4gIGNvbnN0IHsgYmFzZW5hbWUsIGV4dGVuc2lvbiB9ID0gY3VyckZpbGU7XHJcbiAgaWYgKGV4dGVuc2lvbiAhPT0gXCJtZFwiKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgY29uc3QgYWxsVHJhaWxzID0gYmZzQWxsUGF0aHMoZywgYmFzZW5hbWUpO1xyXG4gIGxldCBmaWx0ZXJlZFRyYWlscyA9IFsuLi5hbGxUcmFpbHNdO1xyXG5cclxuICBjb25zdCB7IGluZGV4Tm90ZXMsIHNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlIH0gPSBzZXR0aW5ncztcclxuICAvLyBGaWx0ZXIgZm9yIGluZGV4IG5vdGVzXHJcbiAgaWYgKFxyXG4gICAgLy8gV29ya3MgZm9yIGB1bmRlZmluZWRgIGFuZCBgXCJcImBcclxuICAgIGluZGV4Tm90ZXNbMF0gJiZcclxuICAgIGZpbHRlcmVkVHJhaWxzLmxlbmd0aFxyXG4gICkge1xyXG4gICAgZmlsdGVyZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlscy5maWx0ZXIoKHRyYWlsKSA9PlxyXG4gICAgICBpbmRleE5vdGVzLmluY2x1ZGVzKHRyYWlsWzBdKVxyXG4gICAgKTtcclxuICAgIGlmIChmaWx0ZXJlZFRyYWlscy5sZW5ndGggPT09IDAgJiYgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGUpXHJcbiAgICAgIGZpbHRlcmVkVHJhaWxzID0gWy4uLmFsbFRyYWlsc107XHJcbiAgfVxyXG5cclxuICBjb25zdCBzb3J0ZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlsc1xyXG4gICAgLmZpbHRlcigodHJhaWwpID0+IHRyYWlsLmxlbmd0aCA+IDApXHJcbiAgICAuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XHJcblxyXG4gIHJldHVybiBzb3J0ZWRUcmFpbHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5leHROUHJldihwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgaWYgKCFtYWluRykgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgbmV4dE5QcmV2OiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG5cclxuICBtYWluRy5mb3JFYWNoRWRnZShjdXJyTm9kZSwgKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgaW1wbGllZCB9ID0gYSBhcyBFZGdlQXR0cjtcclxuICAgIGlmIChkaXIgIT09IFwibmV4dFwiICYmIGRpciAhPT0gXCJwcmV2XCIpIHJldHVybjtcclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZXh0TlByZXZbZGlyXS5yZWFscy5wdXNoKHsgZmllbGQsIHRvOiB0LCBpbXBsaWVkIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgICAgbmV4dE5QcmV2W2dldE9wcERpcihkaXIpXS5pbXBsaWVkcy5wdXNoKHtcclxuICAgICAgICBmaWVsZDogb3BwRmllbGQsXHJcbiAgICAgICAgdG86IHMsXHJcbiAgICAgICAgaW1wbGllZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG5leHROUHJldjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWlsTGVuZ3RoKGN1cnI6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIgPSAxKSB7XHJcbiAgY29uc3QgaW5kZXggPVxyXG4gICAgKFRSQUlMX0xFTkdUSFMuaW5kZXhPZihjdXJyKSArIG9mZnNldCkgJSBUUkFJTF9MRU5HVEhTLmxlbmd0aDtcclxuICByZXR1cm4gVFJBSUxfTEVOR1RIU1tpbmRleCA8IDAgPyBUUkFJTF9MRU5HVEhTLmxlbmd0aCArIGluZGV4IDogaW5kZXhdO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHJhd1RyYWlsKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBzZXR0aW5ncywgZGIsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIG5vUGF0aE1lc3NhZ2UsXHJcbiAgICAgIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgsXHJcbiAgICAgIHNob3dUcmFpbCxcclxuICAgICAgc2hvd0dyaWQsXHJcbiAgICAgIHNob3dKdWdnbCxcclxuICAgICAgc2hvd1ByZXZOZXh0LFxyXG4gICAgICBzaG93QkNzSW5FZGl0TFBNb2RlLFxyXG4gICAgfSA9IHNldHRpbmdzO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJkcmF3VHJhaWxcIik7XHJcblxyXG4gICAgY29uc3QgYWN0aXZlTURWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcbiAgICBjb25zdCBtb2RlID0gYWN0aXZlTURWaWV3Py5nZXRNb2RlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhc2hvd0JDcyB8fFxyXG4gICAgICAhYWN0aXZlTURWaWV3IHx8XHJcbiAgICAgIChtb2RlICE9PSBcInByZXZpZXdcIiAmJiAhc2hvd0JDc0luRWRpdExQTW9kZSlcclxuICAgICkge1xyXG4gICAgICBhY3RpdmVNRFZpZXc/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoXCIuQkMtdHJhaWxcIik/LnJlbW92ZSgpO1xyXG4gICAgICByZXR1cm4gZGIuZW5kMkcoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGZpbGUgfSA9IGFjdGl2ZU1EVmlldztcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKSA/PyB7fTtcclxuXHJcblxyXG4gICAgaWYgKGZyb250bWF0dGVyPy5bQkNfSElERV9UUkFJTF0gfHwgZnJvbnRtYXR0ZXI/LltcImthbmJhbi1wbHVnaW5cIl0pIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHsgYmFzZW5hbWUgfSA9IGZpbGU7XHJcbiAgICBpZiAoIW1haW5HLmhhc05vZGUoYmFzZW5hbWUpKSByZXR1cm4gZGIuZW5kMkcoKTtcclxuXHJcbiAgICBjb25zdCB2aWV3ID1cclxuICAgICAgbW9kZSA9PT0gXCJwcmV2aWV3XCJcclxuICAgICAgICA/IGFjdGl2ZU1EVmlldy5wcmV2aWV3TW9kZS5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgXCJkaXYubWFya2Rvd24tcHJldmlldy12aWV3XCJcclxuICAgICAgICApXHJcbiAgICAgICAgOiBhY3RpdmVNRFZpZXcuY29udGVudEVsLnF1ZXJ5U2VsZWN0b3IoXCJkaXYubWFya2Rvd24tc291cmNlLXZpZXdcIik7XHJcblxyXG4gICAgYWN0aXZlTURWaWV3LmNvbnRhaW5lckVsXHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLkJDLXRyYWlsXCIpXHJcbiAgICAgID8uZm9yRWFjaCgodHJhaWwpID0+IHRyYWlsLnJlbW92ZSgpKTtcclxuXHJcbiAgICBjb25zdCBjbG9zZWRVcCA9IGdldExpbWl0ZWRUcmFpbFN1YihwbHVnaW4pO1xyXG4gICAgY29uc3Qgc29ydGVkVHJhaWxzID0gZ2V0QnJlYWRjcnVtYnMoc2V0dGluZ3MsIGNsb3NlZFVwLCBmaWxlKTtcclxuICAgIGluZm8oeyBzb3J0ZWRUcmFpbHMgfSk7XHJcblxyXG4gICAgY29uc3Qge1xyXG4gICAgICBuZXh0OiB7IHJlYWxzOiByTmV4dCwgaW1wbGllZHM6IGlOZXh0IH0sXHJcbiAgICAgIHByZXY6IHsgcmVhbHM6IHJQcmV2LCBpbXBsaWVkczogaVByZXYgfSxcclxuICAgIH0gPSBnZXROZXh0TlByZXYocGx1Z2luLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkXHJcbiAgICBjb25zdCBuZXh0ID0gWy4uLnJOZXh0XTtcclxuICAgIGlOZXh0LmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKG5leHQuZmluZEluZGV4KChuKSA9PiBuLnRvID09PSBpLnRvKSA9PT0gLTEpXHJcbiAgICAgICAgbmV4dC5wdXNoKGkpXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHByZXYgPSBbLi4uclByZXZdO1xyXG4gICAgaVByZXYuZm9yRWFjaCgoaSkgPT4ge1xyXG4gICAgICBpZiAocHJldi5maW5kSW5kZXgoKG4pID0+IG4udG8gPT09IGkudG8pID09PSAtMSlcclxuICAgICAgICBwcmV2LnB1c2goaSlcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG5vSXRlbXMgPSAhc29ydGVkVHJhaWxzLmxlbmd0aCAmJiAhbmV4dC5sZW5ndGggJiYgIXByZXYubGVuZ3RoO1xyXG5cclxuICAgIGlmIChub0l0ZW1zICYmIG5vUGF0aE1lc3NhZ2UgPT09IFwiXCIpIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdG9yRm9yTWF4V2lkdGggPVxyXG4gICAgICBtb2RlID09PSBcInByZXZpZXdcIlxyXG4gICAgICAgID8gXCIubWFya2Rvd24tcHJldmlldy12aWV3LmlzLXJlYWRhYmxlLWxpbmUtd2lkdGggLm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIlxyXG4gICAgICAgIDogXCJcIjtcclxuXHJcbiAgICBjb25zdCBlbEZvck1heFdpZHRoID1cclxuICAgICAgc2VsZWN0b3JGb3JNYXhXaWR0aCAhPT0gXCJcIlxyXG4gICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvckZvck1heFdpZHRoKVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IG1heF93aWR0aCA9IGVsRm9yTWF4V2lkdGhcclxuICAgICAgPyBnZXRDb21wdXRlZFN0eWxlKGVsRm9yTWF4V2lkdGgpLmdldFByb3BlcnR5VmFsdWUoXCJtYXgtd2lkdGhcIilcclxuICAgICAgOiBcIjEwMCVcIjtcclxuXHJcbiAgICBjb25zdCB0cmFpbERpdiA9IGNyZWF0ZURpdih7XHJcbiAgICAgIGNsczogYEJDLXRyYWlsICR7cmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aFxyXG4gICAgICAgID8gXCJpcy1yZWFkYWJsZS1saW5lLXdpZHRoIG1hcmtkb3duLXByZXZpZXctc2l6ZXIgbWFya2Rvd24tcHJldmlldy1zZWN0aW9uXCJcclxuICAgICAgICA6IFwiXCJcclxuICAgICAgICB9YCxcclxuICAgICAgYXR0cjoge1xyXG4gICAgICAgIHN0eWxlOlxyXG4gICAgICAgICAgKG1vZGUgIT09IFwicHJldmlld1wiID8gYG1heC13aWR0aDogJHttYXhfd2lkdGh9O2AgOiBcIlwiKSArXHJcbiAgICAgICAgICBcIm1hcmdpbjogMCBhdXRvOyB3aWR0aDogMTAwJTtcIixcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHBsdWdpbi52aXNpdGVkLnB1c2goW2ZpbGUucGF0aCwgdHJhaWxEaXZdKTtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gXCJwcmV2aWV3XCIpIHtcclxuICAgICAgdmlldy5xdWVyeVNlbGVjdG9yKFwiZGl2Lm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIikuYmVmb3JlKHRyYWlsRGl2KTtcclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItd3JhcHBlcicpXHJcbiAgICAgIC8vIGlmIChiYW5uZXIpIHtcclxuICAgICAgLy8gICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAvLyAgICAgY29uc3QgYmFubmVyTWFyZ2luID0gZ2V0Q29tcHV0ZWRTdHlsZShiYW5uZXIpLm1hcmdpblRvcFxyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2coYmFubmVyTWFyZ2luKVxyXG4gICAgICAvLyAgICAgdHJhaWxEaXYuc3R5bGUubWFyZ2luVG9wID0gYmFubmVyTWFyZ2luO1xyXG4gICAgICAvLyAgICAgYmFubmVyLnN0eWxlLm1hcmdpblRvcCA9ICcwcHgnXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLy8gfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY21HdXR0ZXIgPSB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tZ3V0dGVyc1wiKTtcclxuICAgICAgaWYgKGNtR3V0dGVyKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGd1dHRlckhlaWdodCA9IHRyYWlsRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuICAgICAgICAgIC8vIHNldCBwYWRkaW5nIHRvcCBvZiBndXR0ZXIgdG8gbWF0Y2ggaGVpZ2h0IG9mIHRyYWlsRGl2XHJcbiAgICAgICAgICBjbUd1dHRlci5zdHlsZS5wYWRkaW5nVG9wID0gYCR7Z3V0dGVySGVpZ2h0ICsgNH1weGA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItc3BhY2VyJylcclxuICAgICAgLy8gaWYgKGJhbm5lcikge1xyXG4gICAgICAvLyAgIGNvbnNvbGUubG9nKHsgYmFubmVyIH0pXHJcbiAgICAgIC8vICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnN0IGJhbm5lck1hcmdpbiA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYmFubmVyKS5oZWlnaHQpXHJcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZyhiYW5uZXJNYXJnaW4pXHJcbiAgICAgIC8vICAgICB0cmFpbERpdi5zdHlsZS5tYXJnaW5Ub3AgPSBgJHtiYW5uZXJNYXJnaW4gKyAxMH1weGA7XHJcbiAgICAgIC8vICAgICBiYW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCdcclxuICAgICAgLy8gICB9KVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tY29udGVudENvbnRhaW5lclwiKT8uYmVmb3JlKHRyYWlsRGl2KVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdHJhaWxEaXYuZW1wdHkoKTtcclxuICAgIGlmIChzZXR0aW5ncy5pbmRleE5vdGVzLmluY2x1ZGVzKGJhc2VuYW1lKSkge1xyXG4gICAgICB0cmFpbERpdi5pbm5lclRleHQgPSBcIkluZGV4IE5vdGVcIjtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vSXRlbXMpIHtcclxuICAgICAgdHJhaWxEaXYuaW5uZXJUZXh0ID0gbm9QYXRoTWVzc2FnZTtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0UHJvcHMgPSB7XHJcbiAgICAgIHRhcmdldDogdHJhaWxEaXYsXHJcbiAgICAgIHByb3BzOiB7IHNvcnRlZFRyYWlscywgcGx1Z2luIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChzaG93VHJhaWwgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsUGF0aCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd0dyaWQgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsR3JpZCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd1ByZXZOZXh0ICYmIChuZXh0Lmxlbmd0aCB8fCBwcmV2Lmxlbmd0aCkpIHtcclxuICAgICAgbmV3IE5leHRQcmV2KHtcclxuICAgICAgICB0YXJnZXQ6IHRyYWlsRGl2LFxyXG4gICAgICAgIHByb3BzOiB7IHBsdWdpbiwgbmV4dCwgcHJldiB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzaG93SnVnZ2wgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkge1xyXG4gICAgICBjcmVhdGVKdWdnbFRyYWlsKFxyXG4gICAgICAgIHBsdWdpbixcclxuICAgICAgICB0cmFpbERpdixcclxuICAgICAgICBzb3J0ZWRUcmFpbHMsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgSlVHR0xfVFJBSUxfREVGQVVMVFNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcGx1Z2luLmRiLmVuZDJHKCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IG9wZW5PclN3aXRjaCwgaG92ZXJQcmV2aWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuICBpbXBvcnQgdHlwZSB7IFNxdWFyZUl0ZW0gfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgbGlua0NsYXNzIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgbmV4dDogU3F1YXJlSXRlbVtdO1xyXG4gIGV4cG9ydCBsZXQgcHJldjogU3F1YXJlSXRlbVtdO1xyXG5cclxuICBjb25zdCBhY3RpdmVMZWFmVmlldyA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3O1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1OZXh0UHJldi1Db250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtcHJldnNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggcHJldiBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLXByZXZcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN0cm9uZz57ZmllbGR9PC9zdHJvbmc+XHJcbiAgICAgICAgICB7dG99XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtbmV4dHNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggbmV4dCBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLW5leHRcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3RvfSA8c3Ryb25nPntmaWVsZH08L3N0cm9uZz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtbmV4dHMgZGl2IHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgLkJDLW5leHRzIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuICAuQkMtcHJldnMge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuXHJcbiAgLkJDLU5leHRQcmV2LUNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7XHJcbiAgICBkcm9wRGVuZHJvbixcclxuICAgIHBhZEFycmF5LFxyXG4gICAgcnVucyxcclxuICAgIHRyYW5zcG9zZSxcclxuICB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBnZXRBbHQsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgc29ydGVkVHJhaWxzOiBzdHJpbmdbXVtdO1xyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgZ3JpZERlZmF1bHREZXB0aCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGFjdGl2ZUxlYWZWaWV3ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgY29uc3QgbWF4TGVuZ3RoID0gc29ydGVkVHJhaWxzLmxhc3QoKS5sZW5ndGg7XHJcblxyXG4gIC8vIFVzZSB0aGUgdXNlciBzZXR0aW5nIHRvIGxpbWl0IHRoZSBpbml0aWFsIGRlcHRoXHJcbiAgbGV0IGRlcHRoID0gTWF0aC5taW4obWF4TGVuZ3RoLCBncmlkRGVmYXVsdERlcHRoKTtcclxuXHJcbiAgbGV0IHNsaWNlZFRyYWlscyA9IHNvcnRlZFRyYWlscztcclxuICAkOiB7XHJcbiAgICBzbGljZWRUcmFpbHMgPSBbXTtcclxuICAgIHNvcnRlZFRyYWlscy5mb3JFYWNoKCh0cmFpbCkgPT4ge1xyXG4gICAgICBjb25zdCBzbGljZSA9IHRyYWlsLnNsaWNlKG1heExlbmd0aCAtIGRlcHRoKTtcclxuICAgICAgaWYgKHNsaWNlLmxlbmd0aCkgc2xpY2VkVHJhaWxzLnB1c2goc2xpY2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAkOiBwYWRkZWRUcmFpbHMgPSBzbGljZWRUcmFpbHMubWFwKCh0cmFpbCkgPT4gcGFkQXJyYXkodHJhaWwsIGRlcHRoKSk7XHJcblxyXG4gICQ6IHRyYW5zcG9zZWRUcmFpbHMgPSB0cmFuc3Bvc2UocGFkZGVkVHJhaWxzKTtcclxuICAkOiBhbGxSdW5zID0gdHJhbnNwb3NlZFRyYWlscy5tYXAocnVucyk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLWdyaWQtd3JhcHBlclwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiQkMtdHJhaWwtZ3JpZFwiXHJcbiAgICBzdHlsZT1cIlxyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHsnMWZyICcucmVwZWF0KHRyYW5zcG9zZWRUcmFpbHMubGVuZ3RoKX07XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogeycxZnIgJy5yZXBlYXQoc2xpY2VkVHJhaWxzLmxlbmd0aCl9XCJcclxuICA+XHJcbiAgICB7I2VhY2ggdHJhbnNwb3NlZFRyYWlscyBhcyBjb2wsIGl9XHJcbiAgICAgIHsjZWFjaCBhbGxSdW5zW2ldIGFzIHsgdmFsdWUsIGZpcnN0LCBsYXN0IH19XHJcbiAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIkJDLXRyYWlsLWdyaWQtaXRlbSB7dmFsdWUgPT09ICcnID8gJ0JDLWZpbGxlcicgOiAnJ31cIlxyXG4gICAgICAgICAgc3R5bGU9XCJcclxuICAgICAgICAgICAgICBncmlkLWFyZWE6IHtmaXJzdCArIDF9IC8ge2kgKyAxfSAvXHJcbiAgICAgICAgICAgICAgICAgIHtsYXN0ICsgMn0gLyB7aSArIDJ9O1wiXHJcbiAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaCh2YWx1ZSwgZSl9XHJcbiAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIHZhbHVlKX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPXtsaW5rQ2xhc3ModmFsdWUpfT5cclxuICAgICAgICAgICAge2dldEFsdCh2YWx1ZSwgcGx1Z2luKSA/PyBkcm9wRGVuZHJvbih2YWx1ZSwgc2V0dGluZ3MpfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIHsvZWFjaH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIkJDLWdyaWQtb3B0aW9uc1wiPlxyXG4gICAgPHNwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiQkMtZ3JpZC1vcHRpb25zLWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBjbGFzcz1cIkJDLWdyaWQtb3B0aW9ucy1vcHRpb25zXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJCQy1kZXB0aC1idXR0b25cIlxyXG4gICAgICAgICAgZGlzYWJsZWQ9e2RlcHRoID09PSAxfVxyXG4gICAgICAgICAgb246Y2xpY2s9eygpID0+IChkZXB0aCAtPSAxKX0+LTwvYnV0dG9uXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1pdGVtLWZsYWlyXCI+e2RlcHRofTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cIkJDLWRlcHRoLWJ1dHRvblwiXHJcbiAgICAgICAgICBkaXNhYmxlZD17ZGVwdGggPT09IG1heExlbmd0aH1cclxuICAgICAgICAgIG9uOmNsaWNrPXsoKSA9PiAoZGVwdGggKz0gMSl9Pis8L2J1dHRvblxyXG4gICAgICAgID5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBkaXYuQkMtZ3JpZC13cmFwcGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB9XHJcblxyXG4gIGRpdi5CQy10cmFpbC1ncmlkIHtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgLkJDLWdyaWQtb3B0aW9ucyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDBweDtcclxuICAgIHJpZ2h0OiAwcHg7XHJcbiAgICBoZWlnaHQ6IDM1cHg7XHJcbiAgICB3aWR0aDogMzJweDtcclxuXHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG5cclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1xyXG4gICAgb3ZlcmZsb3ctd3JhcDogbm9ybWFsO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcbiAgZGl2LkJDLWdyaWQtb3B0aW9uczpob3ZlciB7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XHJcbiAgfVxyXG4gIGRpdi5CQy1ncmlkLW9wdGlvbnM6aG92ZXIgLkJDLWdyaWQtb3B0aW9ucy1pY29uIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAuQkMtZ3JpZC1vcHRpb25zLW9wdGlvbnMge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbiAgZGl2LkJDLWdyaWQtb3B0aW9uczpob3ZlciAuQkMtZ3JpZC1vcHRpb25zLW9wdGlvbnMge1xyXG4gICAgZGlzcGxheTogdW5zZXQ7XHJcbiAgfVxyXG5cclxuICAuQkMtZGVwdGgtYnV0dG9uIHtcclxuICAgIHBhZGRpbmc6IDNweCA1cHg7XHJcbiAgfVxyXG5cclxuICBkaXYuQkMtdHJhaWwtZ3JpZC1pdGVtIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgcGFkZGluZzogMnB4O1xyXG4gICAgZm9udC1zaXplOiBzbWFsbGVyO1xyXG4gIH1cclxuXHJcbiAgZGl2LkJDLXRyYWlsLWdyaWQtaXRlbS5CQy1maWxsZXIge1xyXG4gICAgb3BhY2l0eTogMC43O1xyXG4gIH1cclxuXHJcbiAgLyogLmRvdCB7XHJcbiAgICBoZWlnaHQ6IDVweDtcclxuICAgIHdpZHRoOiA1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfSAqL1xyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQge1xyXG4gICAgaG92ZXJQcmV2aWV3LFxyXG4gICAgb3Blbk9yU3dpdGNoLFxyXG4gIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG4gIGltcG9ydCB7IGdldFRyYWlsTGVuZ3RoIH0gZnJvbSBcIi4uL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgZHJvcERlbmRyb24gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbiAgaW1wb3J0IHsgZ2V0QWx0IH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBzb3J0ZWRUcmFpbHM6IHN0cmluZ1tdW107XHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB2aWV3IH0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XHJcbiAgbGV0IHsgc2hvd0FsbCwgbm9QYXRoTWVzc2FnZSwgdHJhaWxTZXBlcmF0b3IgfSA9IHNldHRpbmdzO1xyXG5cclxuICBsZXQgdHJhaWxfbGVuZ3RoID0gc2hvd0FsbDtcclxuXHJcbiAgJDogdHJhaWxzVG9TaG93ID1cclxuICAgIHRyYWlsX2xlbmd0aCA9PSBcIkFsbFwiXHJcbiAgICAgID8gc29ydGVkVHJhaWxzXHJcbiAgICAgIDogdHJhaWxfbGVuZ3RoID09IFwiU2hvcnRlc3RcIlxyXG4gICAgICA/IFtzb3J0ZWRUcmFpbHNbMF1dXHJcbiAgICAgIDogW3NvcnRlZFRyYWlscy5sYXN0KCldO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzcGFuIGNsYXNzPVwiQkMtdHJhaWwtcGF0aC1jb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwidHJhaWxzLWRpdlwiPlxyXG4gICAgeyNlYWNoIHRyYWlsc1RvU2hvdyBhcyB0cmFpbH1cclxuICAgICAgPGRpdj5cclxuICAgICAgICB7I2lmICF0cmFpbC5sZW5ndGh9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLWVtcHR5LXRyYWlsXCI+e25vUGF0aE1lc3NhZ2V9PC9zcGFuPlxyXG4gICAgICAgIHs6ZWxzZX1cclxuICAgICAgICAgIHsjZWFjaCB0cmFpbCBhcyBjcnVtYiwgaX1cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmsgQkMtTGlua1wiXHJcbiAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goY3J1bWIsIGUpfVxyXG4gICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCB2aWV3LCBjcnVtYil9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7Z2V0QWx0KGNydW1iLCBwbHVnaW4pID8/IGRyb3BEZW5kcm9uKGNydW1iLCBzZXR0aW5ncyl9XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgeyNpZiBpIDwgdHJhaWwubGVuZ3RoIC0gMX1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLXRyYWlsLXNlcFwiPntcIiBcIiArIHRyYWlsU2VwZXJhdG9yICsgXCIgXCJ9PC9zcGFuPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgey9lYWNofVxyXG4gICAgICAgIHsvaWZ9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9lYWNofVxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2lmIHNvcnRlZFRyYWlscy5sZW5ndGggPiAxfVxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnV0dG9uLWRpdlwiXHJcbiAgICAgICAgb246Y2xpY2s9eygpID0+ICh0cmFpbF9sZW5ndGggPSBnZXRUcmFpbExlbmd0aCh0cmFpbF9sZW5ndGgpKX1cclxuICAgICAgICBvbjpjb250ZXh0bWVudT17KGUpID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRyYWlsX2xlbmd0aCA9IGdldFRyYWlsTGVuZ3RoKHRyYWlsX2xlbmd0aCwgLTEpO1xyXG4gICAgICAgIH19XHJcbiAgICAgID5cclxuICAgICAgICB7dHJhaWxfbGVuZ3RofVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIHsvaWZ9XHJcbjwvc3Bhbj5cclxuXHJcbjxzdHlsZT5cclxuICBzcGFuLkJDLXRyYWlsLXBhdGgtY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBFZGdlRGVmaW5pdGlvbiwgTm9kZVNpbmd1bGFyIH0gZnJvbSBcImN5dG9zY2FwZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQge1xyXG4gIERhdGFTdG9yZUV2ZW50cyxcclxuICBnZXRQbHVnaW4sXHJcbiAgSUNvcmVEYXRhU3RvcmUsXHJcbiAgSUp1Z2dsLFxyXG4gIElKdWdnbFNldHRpbmdzLFxyXG4gIElKdWdnbFN0b3JlcyxcclxuICBub2RlRGFuZ2xpbmcsXHJcbiAgbm9kZUZyb21GaWxlLFxyXG4gIFZpeklkLFxyXG59IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgaW5mbywgd2FybiB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50cywgTWV0YWRhdGFDYWNoZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgY3JlYXRlSW5kZXggfSBmcm9tIFwiLi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IEp1Z2dsQnV0dG9uIGZyb20gXCIuLi9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgSnVnZ2xEZXB0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9KdWdnbERlcHRoLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgeyBKVUdHTF9DQl9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBkZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5jb25zdCBTVE9SRV9JRCA9IFwiY29yZVwiO1xyXG5cclxuY2xhc3MgQkNTdG9yZUV2ZW50cyBleHRlbmRzIEV2ZW50cyBpbXBsZW1lbnRzIERhdGFTdG9yZUV2ZW50cyB7IH1cclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1N0b3JlIGV4dGVuZHMgQ29tcG9uZW50IGltcGxlbWVudHMgSUNvcmVEYXRhU3RvcmUge1xyXG4gIGdyYXBoOiBNdWx0aUdyYXBoO1xyXG4gIGNhY2hlOiBNZXRhZGF0YUNhY2hlO1xyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBncmFwaDogTXVsdGlHcmFwaCxcclxuICAgIG1ldGFkYXRhOiBNZXRhZGF0YUNhY2hlLFxyXG4gICAgZGVwdGhNYXA/OiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH1cclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XHJcbiAgICB0aGlzLmNhY2hlID0gbWV0YWRhdGE7XHJcbiAgICB0aGlzLmRlcHRoTWFwID0gZGVwdGhNYXA7XHJcbiAgfVxyXG5cclxuICBhc1N0cmluZyhub2RlOiBOb2RlU2luZ3VsYXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSBWaXpJZC5mcm9tTm9kZShub2RlKTtcclxuICAgIHJldHVybiBpZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlKG5vZGVJZDogVml6SWQpOiBURmlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlSWQuaWQsIFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29ubmVjdE5vZGVzKFxyXG4gICAgYWxsTm9kZXM6IGN5dG9zY2FwZS5Ob2RlQ29sbGVjdGlvbixcclxuICAgIG5ld05vZGVzOiBjeXRvc2NhcGUuTm9kZUNvbGxlY3Rpb24sXHJcbiAgICBncmFwaDogSUp1Z2dsXHJcbiAgKTogUHJvbWlzZTxjeXRvc2NhcGUuRWRnZURlZmluaXRpb25bXT4ge1xyXG4gICAgY29uc3QgZWRnZXM6IEVkZ2VEZWZpbml0aW9uW10gPSBbXTtcclxuICAgIGNvbnN0IG5vZGVzTGlzdFMgPSBuZXcgU2V0KFxyXG4gICAgICBhbGxOb2Rlcy5tYXAoKG5vZGUpID0+IHRoaXMuYXNTdHJpbmcobm9kZSkpLmZpbHRlcigocykgPT4gcylcclxuICAgICk7XHJcbiAgICBuZXdOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmFzU3RyaW5nKG5vZGUpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JhcGguaGFzTm9kZShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyYXBoLmZvckVhY2hPdXRFZGdlKFxyXG4gICAgICAgIHRoaXMuYXNTdHJpbmcobm9kZSksXHJcbiAgICAgICAgKGtleSwgYXR0ciwgc291cmNlLCB0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmIChub2Rlc0xpc3RTLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIGVkZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGlkOiBgQkM6JHtzb3VyY2V9LT4ke3RhcmdldH1gLFxyXG4gICAgICAgICAgICAgICAgc291cmNlOiBWaXpJZC50b0lkKHNvdXJjZSwgU1RPUkVfSUQpICsgXCIubWRcIixcclxuICAgICAgICAgICAgICAgIHRhcmdldDogVml6SWQudG9JZCh0YXJnZXQsIFNUT1JFX0lEKSArIFwiLm1kXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhdHRyLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgZGlyOiBhdHRyLmRpcixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNsYXNzZXM6IGB0eXBlLSR7YXR0ci5maWVsZH0gZGlyLSR7YXR0ci5kaXJ9IGJyZWFkY3J1bWJzJGAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZGdlcyk7XHJcbiAgfVxyXG5cclxuICBnZXRFdmVudHModmlldzogSUp1Z2dsKTogRGF0YVN0b3JlRXZlbnRzIHtcclxuICAgIHJldHVybiBuZXcgQkNTdG9yZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TmVpZ2hib3VyaG9vZChcclxuICAgIG5vZGVJZHM6IFZpeklkW10sXHJcbiAgICB2aWV3OiBJSnVnZ2xcclxuICApOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbltdPiB7XHJcbiAgICBjb25zdCBuZXdfbm9kZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIG5vZGVJZHMpIHtcclxuICAgICAgY29uc3QgbmFtZSA9IG5vZGVJZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgICAgIGlmICghdGhpcy5ncmFwaC5oYXNOb2RlKG5hbWUpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBuZXdfbm9kZSBvZiB0aGlzLmdyYXBoLm5laWdoYm9ycyhuYW1lKSkge1xyXG4gICAgICAgIG5ld19ub2Rlcy5wdXNoKFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXQobmV3IFZpeklkKG5ld19ub2RlICsgXCIubWRcIiwgU1RPUkVfSUQpLCB2aWV3KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXdfbm9kZXM7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoTm9kZShpZDogVml6SWQsIHZpZXc6IElKdWdnbCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHN0b3JlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTVE9SRV9JRDtcclxuICB9XHJcblxyXG4gIGdldChub2RlSWQ6IFZpeklkLCB2aWV3OiBJSnVnZ2wpOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbj4ge1xyXG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZ2V0RmlsZShub2RlSWQpO1xyXG4gICAgbGV0IGRlcHRoID0gMDtcclxuICAgIGlmICh0aGlzLmRlcHRoTWFwICYmIG5vZGVJZC5pZCBpbiB0aGlzLmRlcHRoTWFwKSB7XHJcbiAgICAgIGRlcHRoID0gdGhpcy5kZXB0aE1hcFtub2RlSWQuaWRdO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZGFuZ2xpbmcgPSBub2RlRGFuZ2xpbmcobm9kZUlkLmlkKTtcclxuICAgICAgZGFuZ2xpbmcuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhbmdsaW5nKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcclxuICAgICAgaW5mbyhcInJldHVybmluZyBlbXB0eSBjYWNoZVwiLCBub2RlSWQpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGVEYW5nbGluZyhub2RlSWQuaWQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZUZyb21GaWxlKGZpbGUsIHZpZXcucGx1Z2luLCB2aWV3LnNldHRpbmdzLCBub2RlSWQudG9JZCgpKS50aGVuKFxyXG4gICAgICAobm9kZSkgPT4ge1xyXG4gICAgICAgIG5vZGUuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUp1Z2dsKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBpbml0aWFsTm9kZXM6IHN0cmluZ1tdLFxyXG4gIGFyZ3M6IElKdWdnbFNldHRpbmdzLFxyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH0gPSBudWxsXHJcbik6IElKdWdnbCB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoIWp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgIC8vIFRPRE86IEVycm9yIGhhbmRsaW5nXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGtleSBpbiBKVUdHTF9DQl9ERUZBVUxUUykge1xyXG4gICAgICBpZiAoa2V5IGluIGFyZ3MgJiYgYXJnc1trZXldID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgYXJnc1trZXldID0gSlVHR0xfQ0JfREVGQVVMVFNba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiY1N0b3JlID0gbmV3IEJDU3RvcmUoXHJcbiAgICAgIHBsdWdpbi5tYWluRyxcclxuICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUsXHJcbiAgICAgIGRlcHRoTWFwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc3RvcmVzOiBJSnVnZ2xTdG9yZXMgPSB7XHJcbiAgICAgIGNvcmVTdG9yZTogYmNTdG9yZSxcclxuICAgICAgZGF0YVN0b3JlczogW2JjU3RvcmVdLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBqdWdnbCA9IGp1Z2dsUGx1Z2luLmNyZWF0ZUp1Z2dsKHRhcmdldCwgYXJncywgc3RvcmVzLCBpbml0aWFsTm9kZXMpO1xyXG4gICAgcGx1Z2luLmFkZENoaWxkKGp1Z2dsKTtcclxuICAgIGluZm8oeyBqdWdnbCB9KTtcclxuICAgIHJldHVybiBqdWdnbDtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgd2Fybih7IGVycm9yIH0pO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9Tb3VyY2UoanVnZ2w6IElKdWdnbCwgc291cmNlOiBzdHJpbmcpIHtcclxuICBpZiAoIWp1Z2dsKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGp1Z2dsLm9uKFwidml6UmVhZHlcIiwgKHZpeikgPT4ge1xyXG4gICAgLy8gQWZ0ZXIgbGF5b3V0IGlzIGRvbmUsIGNlbnRlciBvbiBzb3VyY2Ugbm9kZVxyXG4gICAgdml6Lm9uZShcImxheW91dHN0b3BcIiwgKGUpID0+IHtcclxuICAgICAgY29uc3Qgdml6ID0gZS5jeTtcclxuICAgICAgY29uc3Qgbm9kZSA9IHZpei4kaWQoVml6SWQudG9JZChzb3VyY2UgKyBcIi5tZFwiLCBTVE9SRV9JRCkpO1xyXG4gICAgICB2aXouYW5pbWF0ZSh7XHJcbiAgICAgICAgY2VudGVyOiB7XHJcbiAgICAgICAgICBlbGVzOiBub2RlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IDI1MCxcclxuICAgICAgICBxdWV1ZTogZmFsc2UsXHJcbiAgICAgICAgem9vbTogMS43LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9HcmFwaChqdWdnbDogSUp1Z2dsKSB7XHJcbiAganVnZ2wub24oXCJ2aXpSZWFkeVwiLCAodml6KSA9PiB7XHJcbiAgICB2aXouZml0KHZpei5ub2RlcygpKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRGVwdGhNYXAoXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgb2Zmc2V0ID0gMFxyXG4pOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSB7XHJcbiAgLy8gVE9ETzogSXMgdGhlcmUgYSBCQyBmdW5jdGlvbiBmb3IgdGhpcyBhbHJlYWR5P1xyXG4gIGxldCBkZXB0aE1hcDogeyBbdmFsdWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgZGVwdGhNYXBbc291cmNlICsgXCIubWRcIl0gPSAwO1xyXG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBuYW1lID0gcGF0aFtpXSArIFwiLm1kXCI7XHJcbiAgICAgIGNvbnN0IGRlcHRoID0gcGF0aC5sZW5ndGggLSBpIC0gMSArIG9mZnNldDtcclxuICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXApIHtcclxuICAgICAgICBkZXB0aE1hcFtuYW1lXSA9IE1hdGgubWluKGRlcHRoTWFwW25hbWVdLCBkZXB0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVwdGhNYXBbbmFtZV0gPSBkZXB0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBkZXB0aE1hcDtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRGVwdGgoanVnZ2w6IElKdWdnbCwgZGVwdGg6IG51bWJlcikge1xyXG4gIGp1Z2dsLnZpei4kKGBbZGVwdGg+JHtkZXB0aH1dYCkuYWRkQ2xhc3MoXCJmaWx0ZXJlZFwiKTtcclxuICBqdWdnbC52aXouJChgW2RlcHRoPD0ke2RlcHRofV1gKS5yZW1vdmVDbGFzcyhcImZpbHRlcmVkXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnVnZ2xUcmFpbChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgYXJnczogSUp1Z2dsU2V0dGluZ3NcclxuKSB7XHJcbiAgY29uc3QgdG9vbGJhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgdG9vbGJhckRpdi5hZGRDbGFzcyhcImN5LXRvb2xiYXJcIik7XHJcbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHRvb2xiYXJEaXYpO1xyXG5cclxuICBjb25zdCBzZWN0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBzZWN0RGl2LmFkZENsYXNzKFwiY3ktdG9vbGJhci1zZWN0aW9uXCIpO1xyXG4gIHRvb2xiYXJEaXYuYXBwZW5kQ2hpbGQoc2VjdERpdik7XHJcblxyXG4gIGNvbnN0IGFtdENoaWxkcmVuID0gdGFyZ2V0LmNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgbGV0IGp1Z2dsVXA6IElKdWdnbCA9IG51bGw7XHJcbiAgbGV0IGp1Z2dsRG93bjogSUp1Z2dsID0gbnVsbDtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkxXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xVcCkge1xyXG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqdWdnbERvd24pIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbiArIDFdLmNsYXNzTGlzdC5hZGQoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgdGl0bGU6IFwiU2hvdyB1cCBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkzXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xEb3duKSB7XHJcbiAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bYW10Q2hpbGRyZW4gKyAxXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QuYWRkKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWIgPSBnZXRTdWJJbkRpcnMocGx1Z2luLm1haW5HLCBcImRvd25cIiwgXCJ1cFwiKTtcclxuICAgICAgICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyk7XHJcbiAgICAgICAgY29uc3Qgc3ViQ2xvc2VkID0gZ2V0U3ViSW5EaXJzKGNsb3NlZCwgXCJkb3duXCIpO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3QgeyBjcmVhdGVJbmRleEluZGVudCB9ID0gcGx1Z2luLnNldHRpbmdzXHJcbiAgICAgICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhzdWJDbG9zZWQsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGluZGV4XHJcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZmlsdGVyKChwYWlyKSA9PiBwYWlyKTtcclxuICAgICAgICBsZXQgZGVwdGhNYXBEb3duID0gY3JlYXRlRGVwdGhNYXAoYWxsUGF0aHMsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgbWF4RGVwdGhEb3duID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhkZXB0aE1hcERvd24pKTtcclxuXHJcbiAgICAgICAgZGVwdGhEb3duID0gbmV3IEp1Z2dsRGVwdGgoe1xyXG4gICAgICAgICAgdGFyZ2V0OiB0b29sYmFyRGl2LFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgbWF4RGVwdGg6IG1heERlcHRoRG93bixcclxuICAgICAgICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICAgICAgICB1cGRhdGVEZXB0aChqdWdnbERvd24sIGQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgbm9kZXNTID0gbmV3IFNldChsaW5lcyk7XHJcbiAgICAgICAgbm9kZXNTLmFkZChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShub2Rlc1MpLm1hcCgocykgPT4gcyArIFwiLm1kXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBhcmdzRG93biA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHBsdWdpbi5zZXR0aW5ncy5qdWdnbExheW91dDtcclxuICAgICAgICBpZiAobGF5b3V0ID09PSBcImhpZXJhcmNoeVwiKSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5sYXlvdXQgPSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbmFtZTogXCJkYWdyZVwiLFxyXG4gICAgICAgICAgICBhbmltYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmFua2VyOiAoZ3JhcGgpID0+IHtcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhncmFwaC5fbm9kZXMpLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gVml6SWQuZnJvbUlkKGlkKS5pZDtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIGRlcHRoTWFwRG93bikge1xyXG4gICAgICAgICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBkZXB0aE1hcERvd25bbmFtZV0gKyAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZ3JhcGguX25vZGVzW2lkXS5yYW5rID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFyZ3NEb3duLmxheW91dCA9IGxheW91dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNGZGdkID0gbGF5b3V0ID09PSBcImNvbGFcIiB8fCBsYXlvdXQgPT09IFwiZDMtZm9yY2VcIjtcclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICBhcmdzRG93bi5mZGdkTGF5b3V0ID0gbGF5b3V0O1xyXG4gICAgICAgICAgYXJnc0Rvd24ubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5hdXRvWm9vbSA9IHRydWU7XHJcbiAgICAgICAgICBhcmdzRG93bi5hbmltYXRlTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqdWdnbERvd24gPSBjcmVhdGVKdWdnbChwbHVnaW4sIHRhcmdldCwgbm9kZXMsIGFyZ3NEb3duLCBkZXB0aE1hcERvd24pO1xyXG5cclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICB6b29tVG9Tb3VyY2UoanVnZ2xEb3duLCBzb3VyY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB6b29tVG9HcmFwaChqdWdnbERvd24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbl0uYWRkQ2xhc3MoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhVcC4kc2V0KHsgdmlzaWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIHRpdGxlOiBcIlNob3cgZG93biBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuICBjb25zdCBkZXB0aE1hcFVwID0gY3JlYXRlRGVwdGhNYXAocGF0aHMsIHNvdXJjZSwgMSk7XHJcbiAgY29uc3QgbWF4RGVwdGhVcCA9IE1hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMoZGVwdGhNYXBVcCkpO1xyXG5cclxuICBsZXQgZGVwdGhEb3duOiBKdWdnbERlcHRoO1xyXG4gIGNvbnN0IGRlcHRoVXAgPSBuZXcgSnVnZ2xEZXB0aCh7XHJcbiAgICB0YXJnZXQ6IHRvb2xiYXJEaXYsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICBtYXhEZXB0aDogbWF4RGVwdGhVcCxcclxuICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICB1cGRhdGVEZXB0aChqdWdnbFVwLCBkKTtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIC8vIG5ldyBKdWdnbEJ1dHRvbih7XHJcbiAgLy8gICAgIHRhcmdldDogc2VjdERpdixcclxuICAvLyAgICAgcHJvcHM6IHtcclxuICAvLyAgICAgICAgIGljb246IFwiXHUyNkY2XCIsXHJcbiAgLy8gICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZXJlXCIpXHJcbiAgLy8gICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuWzFdLmFkZENsYXNzKFwianVnZ2wtZnVsbC1zY3JlZW5cIilcclxuICAvLyAgICAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bMV0uc2V0QXR0cihcInN0eWxlXCIsIFwiXCIpO1xyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAvLyAgICAgICAgIHRpdGxlOiBcIkZ1bGwgaGVpZ2h0XCJcclxuICAvLyAgICAgfVxyXG4gIC8vIH0pO1xyXG4gIGxldCBub2RlcyA9IEFycmF5LmZyb20oXHJcbiAgICBuZXcgU2V0KHBhdGhzLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldi5jb25jYXQoY3VyciksIFtdKSlcclxuICApO1xyXG5cclxuICBub2Rlcy5wdXNoKHNvdXJjZSk7XHJcbiAgbm9kZXMgPSBub2Rlcy5tYXAoKHMpID0+IHMgKyBcIi5tZFwiKTtcclxuXHJcbiAgY29uc3QgYXJnc1VwOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG5cclxuICBjb25zdCBsYXlvdXQgPSBwbHVnaW4uc2V0dGluZ3MuanVnZ2xMYXlvdXQ7XHJcbiAgaWYgKGxheW91dCA9PT0gXCJoaWVyYXJjaHlcIikge1xyXG4gICAgYXJnc1VwLmxheW91dCA9IHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBuYW1lOiBcImRhZ3JlXCIsXHJcbiAgICAgIGFuaW1hdGU6IGZhbHNlLFxyXG4gICAgICByYW5rZXI6IChncmFwaCkgPT4ge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGdyYXBoLl9ub2RlcykuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBWaXpJZC5mcm9tSWQoaWQpLmlkO1xyXG4gICAgICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXBVcCkge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwIC0gZGVwdGhNYXBVcFtuYW1lXSArIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwICsgMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGFyZ3NVcC5sYXlvdXQgPSBsYXlvdXQ7XHJcbiAgfVxyXG4gIGNvbnN0IGlzRmRnZCA9IGxheW91dCA9PT0gXCJjb2xhXCIgfHwgbGF5b3V0ID09PSBcImQzLWZvcmNlXCI7XHJcbiAgaWYgKGlzRmRnZCkge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmZkZ2RMYXlvdXQgPSBsYXlvdXQ7XHJcbiAgICBhcmdzVXAubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBhcmdzVXAuYXV0b1pvb20gPSB0cnVlO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmFuaW1hdGVMYXlvdXQgPSBmYWxzZTtcclxuICB9XHJcbiAganVnZ2xVcCA9IGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJnc1VwLCBkZXB0aE1hcFVwKTtcclxuICBpZiAoaXNGZGdkKSB7XHJcbiAgICB6b29tVG9Tb3VyY2UoanVnZ2xVcCwgc291cmNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgem9vbVRvR3JhcGgoanVnZ2xVcCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgY29weSB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZGZzQWxsUGF0aHMsIGdldFNpbmtzLCBnZXRTdWJJbkRpcnMgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRDdXJyRmlsZSwgbWFrZVdpa2kgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBjb3B5IG9mIGBpbmRleGAsIGRvZXNuJ3QgbXV0YXRlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluZGV4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxpYXNlc1RvSW5kZXgocGx1Z2luOiBCQ1BsdWdpbiwgaW5kZXg6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgYWxpYXNlc0luSW5kZXggfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgY29uc3QgbGluZXMgPSBpbmRleC5zbGljZSgpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBpZiAoYWxpYXNlc0luSW5kZXgpIHtcclxuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgaWYgKCFub3RlKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm90ZSwgXCJcIik7XHJcblxyXG4gICAgICBpZiAoY3VyckZpbGUgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsaWFzOiBzdHJpbmdbXSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uYWxpYXMgPz8gW107XHJcbiAgICAgICAgY29uc3QgYWxpYXNlczogc3RyaW5nW10gPSBjYWNoZT8uZnJvbnRtYXR0ZXI/LmFsaWFzZXMgPz8gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbEFsaWFzZXM6IHN0cmluZ1tdID0gWy4uLlthbGlhc10uZmxhdCgzKSwgLi4uW2FsaWFzZXNdLmZsYXQoMyldO1xyXG4gICAgICAgIGlmIChhbGxBbGlhc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGluZSArPSBgICgke2FsbEFsaWFzZXMuam9pbihcIiwgXCIpfSlgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBpbmRleCBvZiBhbGwgdGhlIHBhdGhzIGluIHRoZSBncmFwaC5cclxuICogQHBhcmFtIGFsbFBhdGhzIC0gQSBsaXN0IG9mIGFsbCBwYXRocyBmcm9tIHRoZSByb290IHRvIHRoZSBsZWF2ZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXNXaWtpbGlua3MgLSBXaGV0aGVyIHRvIHVzZSB3aWtpbGlua3MgaW5zdGVhZCBvZiBwbGFpbiB0ZXh0LlxyXG4gKiBAcmV0dXJucyBBIHN0cmluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleChcclxuICBhbGxQYXRoczogc3RyaW5nW11bXSxcclxuICBhc1dpa2lsaW5rczogYm9vbGVhbixcclxuICBpbmRlbnQgPSBcIiAgXCJcclxuKTogc3RyaW5nIHtcclxuICBsZXQgaW5kZXggPSBcIlwiO1xyXG4gIGNvbnN0IGNvcHkgPSBjbG9uZURlZXAoYWxsUGF0aHMpO1xyXG4gIGNvbnN0IHJldmVyc2VkID0gY29weS5tYXAoKHBhdGgpID0+IHBhdGgucmV2ZXJzZSgpKTtcclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNoaWZ0KCkpO1xyXG5cclxuICBjb25zdCByZWFsSW5kZW50ID0gaW5kZW50ID09PSAnXFxcXHQnID8gJ1xcdCcgOiBpbmRlbnQ7XHJcblxyXG4gIGNvbnN0IHZpc2l0ZWQ6IHtcclxuICAgIFtub2RlOiBzdHJpbmddOiAvKiogVGhlIGRlcHRocyBhdCB3aGljaCBgbm9kZWAgd2FzIHZpc2l0ZWQgKi8gbnVtYmVyW107XHJcbiAgfSA9IHt9O1xyXG5cclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgcGF0aC5sZW5ndGg7IGRlcHRoKyspIHtcclxuICAgICAgY29uc3QgY3Vyck5vZGUgPSBwYXRoW2RlcHRoXTtcclxuXHJcbiAgICAgIC8vIElmIHRoYXQgbm9kZSBoYXMgYmVlbiB2aXNpdGVkIGJlZm9yZSBhdCB0aGUgY3VycmVudCBkZXB0aFxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShjdXJyTm9kZSkgJiZcclxuICAgICAgICB2aXNpdGVkW2N1cnJOb2RlXS5pbmNsdWRlcyhkZXB0aClcclxuICAgICAgKSBjb250aW51ZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpbmRleCArPSBgJHtyZWFsSW5kZW50LnJlcGVhdChkZXB0aCl9LSAke2FzV2lraWxpbmtzID8gbWFrZVdpa2koY3Vyck5vZGUpIDogY3Vyck5vZGVcclxuICAgICAgICAgIH1cXG5gO1xyXG5cclxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzT3duUHJvcGVydHkoY3Vyck5vZGUpKSB2aXNpdGVkW2N1cnJOb2RlXSA9IFtdO1xyXG4gICAgICAgIHZpc2l0ZWRbY3Vyck5vZGVdLnB1c2goZGVwdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGluZGV4O1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUxvY2FsSW5kZXgocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBnZXRDdXJyRmlsZSgpXHJcblxyXG4gIGNvbnN0IG9ubHlEb3ducyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBcImRvd25cIik7XHJcbiAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIGJhc2VuYW1lKTtcclxuICBjb25zdCBpbmRleCA9IGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSk7XHJcblxyXG4gIGluZm8oeyBpbmRleCB9KTtcclxuICBhd2FpdCBjb3B5KGluZGV4KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlHbG9iYWxJbmRleChwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBvbmx5RG93bnMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJkb3duXCIpO1xyXG4gIGNvbnN0IG9ubHlVcHMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJ1cFwiKTtcclxuXHJcbiAgY29uc3Qgc2lua3MgPSBnZXRTaW5rcyhvbmx5VXBzKTtcclxuXHJcbiAgbGV0IGdsb2JhbEluZGV4ID0gXCJcIjtcclxuICBzaW5rcy5mb3JFYWNoKCh0ZXJtaW5hbCkgPT4ge1xyXG4gICAgZ2xvYmFsSW5kZXggKz0gdGVybWluYWwgKyBcIlxcblwiO1xyXG4gICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIHRlcm1pbmFsKTtcclxuICAgIGdsb2JhbEluZGV4ICs9XHJcbiAgICAgIGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSkgKyBcIlxcblwiO1xyXG4gIH0pO1xyXG5cclxuICBpbmZvKHsgZ2xvYmFsSW5kZXggfSk7XHJcbiAgYXdhaXQgY29weShnbG9iYWxJbmRleCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRvTGluZVBhaXJzID0gKFxyXG4gIGluZGV4OiBzdHJpbmcsXHJcbiAgZmxhdCA9IGZhbHNlXHJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PlxyXG4gIGluZGV4XHJcbiAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIHJldHVybiBbZmxhdCA/IFwiXCIgOiBpbmRlbnQsIGNvbnRlbnQuam9pbihcIi0gXCIpXSBhcyBbXHJcbiAgICAgICAgc3RyaW5nLFxyXG4gICAgICAgIHN0cmluZ1xyXG4gICAgICBdO1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKHBhaXIpID0+IHBhaXJbMV0gIT09IFwiXCIpO1xyXG4iLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBleHBvcnQgbGV0IGljb247XHJcbiAgZXhwb3J0IGxldCBvbkNsaWNrOiAoKSA9PiB2b2lkO1xyXG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBleHBvcnQgbGV0IHRpdGxlID0gXCJcIjtcclxuXHJcbiAgJDogcmVuZGVyZWRJY29uID0gaWNvbjtcclxuPC9zY3JpcHQ+XHJcblxyXG48YnV0dG9uXHJcbiAgdHlwZT1cImJ1dHRvblwiXHJcbiAgY2xhc3M9XCJqdWdnbC1idXR0b25cIlxyXG4gIG9uOmNsaWNrPXtvbkNsaWNrfVxyXG4gIGFyaWEtbGFiZWw9e3RpdGxlfVxyXG4gIHtkaXNhYmxlZH1cclxuPlxyXG4gIHtyZW5kZXJlZEljb259XHJcbjwvYnV0dG9uPlxyXG4iLCBudWxsLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgSnVnZ2xCdXR0b24gZnJvbSBcIi4vSnVnZ2xCdXR0b24uc3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgdmlzaWJsZSA9IHRydWU7XHJcbiAgZXhwb3J0IGxldCBtYXhEZXB0aDogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgb25VcGRhdGVEZXB0aDogKGRlcHRoOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG4gIGxldCBkZXB0aCA9IG1heERlcHRoO1xyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgdmlzaWJsZX1cclxuICA8ZGl2IGNsYXNzPVwiY3ktdG9vbGJhci1zZWN0aW9uXCI+XHJcbiAgICA8SnVnZ2xCdXR0b25cclxuICAgICAgaWNvbj1cIi1cIlxyXG4gICAgICBkaXNhYmxlZD17ZGVwdGggPD0gMH1cclxuICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgIGRlcHRoIC09IDE7XHJcbiAgICAgICAgb25VcGRhdGVEZXB0aChkZXB0aCk7XHJcbiAgICAgIH19XHJcbiAgICAvPlxyXG5cclxuICAgIDxKdWdnbEJ1dHRvbiBpY29uPXtkZXB0aH0gZGlzYWJsZWQ9e3RydWV9IG9uQ2xpY2s9e251bGx9IC8+XHJcblxyXG4gICAgPEp1Z2dsQnV0dG9uXHJcbiAgICAgIGljb249XCIrXCJcclxuICAgICAgZGlzYWJsZWQ9e2RlcHRoID49IG1heERlcHRofVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgZGVwdGggKz0gMTtcclxuICAgICAgICBvblVwZGF0ZURlcHRoKGRlcHRoKTtcclxuICAgICAgfX1cclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbnsvaWZ9XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbWF0cml4VmlldzogTWF0cml4VmlldztcclxuXHJcbiAgY29uc3QgeyBwbHVnaW4gfSA9IG1hdHJpeFZpZXc7XHJcbiAgY29uc3QgeyBhbHBoYVNvcnRBc2MsIGVuYWJsZUFscGhhU29ydCB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxidXR0b25cclxuICBjbGFzcz1cIkJDLXJlZnJlc2gtYnV0dG9uXCJcclxuICBhcmlhLWxhYmVsPVwiUmVmcmVzaCBJbmRleFwiXHJcbiAgb246Y2xpY2s9e2FzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pfVxyXG4+XHJcbiAgXHUyMUJCXHJcbjwvYnV0dG9uPlxyXG5cclxueyNpZiBlbmFibGVBbHBoYVNvcnR9XHJcbiAgPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJCQy1zb3J0LWJ1dHRvblwiXHJcbiAgICBhcmlhLWxhYmVsPVwiQWxwaGFiZXRpY2FsIFNvcnRpbmcgT3JkZXJcIlxyXG4gICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgcGx1Z2luLnNldHRpbmdzLmFscGhhU29ydEFzYyA9ICFhbHBoYVNvcnRBc2M7XHJcbiAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgYXdhaXQgbWF0cml4Vmlldy5kcmF3KCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIHthbHBoYVNvcnRBc2MgPyBcIlx1MjE5N1wiIDogXCJcdTIxOThcIn1cclxuICA8L2J1dHRvbj5cclxuey9pZn1cclxuXHJcbjxzdHlsZT5cclxuICBidXR0b24ge1xyXG4gICAgcGFkZGluZzogMXB4IDZweCAycHggNnB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBNYXRyaXhCdXR0b25zIGZyb20gXCIuL01hdHJpeEJ1dHRvbnMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBTcXVhcmVQcm9wcyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHsgZHJvcFBhdGhORGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgaGllclNxdWFyZXM6IFNxdWFyZVByb3BzW11bXTtcclxuICBleHBvcnQgbGV0IGN1cnJGaWxlOiBURmlsZTtcclxuICBleHBvcnQgbGV0IG1hdHJpeFZpZXc6IE1hdHJpeFZpZXc7XHJcblxyXG4gIGNvbnN0IHsgcGx1Z2luIH0gPSBtYXRyaXhWaWV3O1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgc2hvd0ltcGxpZWRSZWxhdGlvbnMsXHJcbiAgICBybExlYWYsXHJcbiAgICB0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyxcclxuICAgIHNob3dSZWxhdGlvblR5cGUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtYnV0dG9uc1wiPlxyXG4gIDxNYXRyaXhCdXR0b25zIHttYXRyaXhWaWV3fSAvPlxyXG48L2Rpdj5cclxuXHJcbjxkaXZcclxuICBjbGFzcz1cIkJDLU1hdHJpeCAgbWFya2Rvd24tcHJldmlldy12aWV3IHtoaWVyU3F1YXJlcy5sZW5ndGhcclxuICAgID8gJydcclxuICAgIDogJ0JDLWVtcHR5LXZpZXcnfVwiXHJcbj5cclxuICB7I2VhY2ggaGllclNxdWFyZXMgYXMgc3F1YXJlc31cclxuICAgIDxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtaGllclwiPlxyXG4gICAgICB7I2VhY2ggc3F1YXJlcyBhcyB7IGZpZWxkLCBpbXBsaWVkSXRlbXMsIHJlYWxJdGVtcyB9fVxyXG4gICAgICAgIHsjaWYgcmVhbEl0ZW1zLmxlbmd0aCB8fCAoc2hvd0ltcGxpZWRSZWxhdGlvbnMgJiYgaW1wbGllZEl0ZW1zLmxlbmd0aCl9XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LXNxdWFyZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlcnNcIj5cclxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+e2ZpZWxkfTwvaDQ+XHJcblxyXG4gICAgICAgICAgICAgIHsjaWYgc2hvd1JlbGF0aW9uVHlwZX1cclxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAge3JlYWxJdGVtcy5sZW5ndGggPyBcIlJlYWxcIiA6IFwiSW1wbGllZFwifVxyXG4gICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgeyNpZiByZWFsSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxvbD5cclxuICAgICAgICAgICAgICAgIHsjZWFjaCByZWFsSXRlbXMgYXMgeyBhbHQsIGNscywgaW1wbGllZCwgdG8gfX1cclxuICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LXVua25vd24tYXJpYS1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIntjbHN9IHtpbXBsaWVkID8/ICcnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaCh0bywgZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhldmVudCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJQcmV2aWV3KGV2ZW50LCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXthbHQgPyB0byA6IFwiXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG5cclxuICAgICAgICAgICAgeyNpZiBzaG93SW1wbGllZFJlbGF0aW9ucyAmJiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlclwiPntcIiBcIn08L2g0PlxyXG4gICAgICAgICAgICAgICAgeyNpZiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgICAgICB7I2lmIHNob3dSZWxhdGlvblR5cGUgJiYgcmVhbEl0ZW1zLmxlbmd0aH1cclxuICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+SW1wbGllZDwvaDY+XHJcbiAgICAgICAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxvbCBzdGFydD17cmVhbEl0ZW1zLmxlbmd0aCArIDF9PlxyXG4gICAgICAgICAgICAgICAgeyNlYWNoIGltcGxpZWRJdGVtcyBhcyB7IGFsdCwgY2xzLCBpbXBsaWVkLCB0bywgcGFyZW50IH19XHJcbiAgICAgICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiQkMtSW1wbGllZCB7dHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgJiZcclxuICAgICAgICAgICAgICAgICAgICB0byA9PT0gY3VyckZpbGUuYmFzZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgID8gJ0JDLWFjdGl2ZS1ub3RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie2Nsc30ge2ltcGxpZWQgPz8gJyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXsoYWx0ID8gYCR7dG99XFxuYCA6IFwiXCIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudCA/IFwiXHUyMTkxIFwiICsgcGFyZW50IDogXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgey9pZn1cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtTWF0cml4IHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XHJcbiAgICBsaW5lLWhlaWdodDogMS41O1xyXG4gIH1cclxuICAuQkMtTWF0cml4ID4gZGl2IHtcclxuICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIC8qIHRleHQtYWxpZ246IGNlbnRlcjsgKi9cclxuICAgIG1hcmdpbjogM3B4O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICB9XHJcblxyXG4gIC8qIC5CQy1tYXRyaXggZGl2IHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgfSAqL1xyXG5cclxuICAuQkMtTWF0cml4LXNxdWFyZSB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4LWhlYWRlcnMge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfVxyXG4gIC5CQy1NYXRyaXgtaGVhZGVyIHtcclxuICAgIG1hcmdpbjogMnB4O1xyXG4gICAgcGFkZGluZzogMHB4IDEwcHg7XHJcbiAgfVxyXG4gIGg0LkJDLU1hdHJpeC1oZWFkZXI6Zmlyc3QtbGV0dGVyIHtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG4gIH1cclxuXHJcbiAgb2wge1xyXG4gICAgbWFyZ2luOiAzcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4IGxpIHtcclxuICAgIG1hcmdpbjogMC4xZW07XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQVJST1dfRElSRUNUSU9OUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDQVBJSSwgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0TWF0cml4TmVpZ2hib3VycyB9IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHtcclxuICBidWlsZE9ic0dyYXBoLFxyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldEZpZWxkSW5mbyxcclxuICBnZXRGaWVsZHMsXHJcbiAgZ2V0T3BwRGlyLFxyXG4gIGdldE9wcEZpZWxkcyxcclxuICBpdGVyYXRlSGllcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUluZGV4IH0gZnJvbSBcIi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJDQVBJIGltcGxlbWVudHMgQkNBUElJIHtcclxuXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG5cclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5tYWluRyA9IHRoaXMucGx1Z2luLm1haW5HO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gdGhpcy5wbHVnaW4uY2xvc2VkRztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBESVJFQ1RJT05TID0gRElSRUNUSU9OUztcclxuICBwdWJsaWMgQVJST1dfRElSRUNUSU9OUyA9IEFSUk9XX0RJUkVDVElPTlM7XHJcblxyXG4gIHB1YmxpYyBidWlsZE9ic0dyYXBoID0gYnVpbGRPYnNHcmFwaDtcclxuXHJcbiAgcHVibGljIHJlZnJlc2hJbmRleCA9IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzLnBsdWdpbilcclxuXHJcbiAgcHVibGljIGdldFN1YkluRGlycyA9IChkaXJzOiBEaXJlY3Rpb25zW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViSW5EaXJzKGcsIC4uLmRpcnMpO1xyXG5cclxuICBwdWJsaWMgZ2V0U3ViRm9yRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViRm9yRmllbGRzKGcsIGZpZWxkcyk7XHJcblxyXG4gIHB1YmxpYyBkZnNBbGxQYXRocyA9IChcclxuICAgIGZyb21Ob2RlID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWUsXHJcbiAgICBnID0gdGhpcy5tYWluR1xyXG4gICkgPT4gZGZzQWxsUGF0aHMoZywgZnJvbU5vZGUpO1xyXG5cclxuICBwdWJsaWMgY3JlYXRlSW5kZXggPSAoYWxsUGF0aHM6IHN0cmluZ1tdW10sIHdpa2lsaW5rcyA9IGZhbHNlLCBpbmRlbnQgPSAnICAnKSA9PlxyXG4gICAgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rcywgaW5kZW50KTtcclxuXHJcbiAgcHVibGljIGdldE1hdHJpeE5laWdoYm91cnMgPSAoXHJcbiAgICBmcm9tTm9kZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lXHJcbiAgKSA9PiBnZXRNYXRyaXhOZWlnaGJvdXJzKHRoaXMucGx1Z2luLCBmcm9tTm9kZSk7XHJcblxyXG4gIHB1YmxpYyBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PiBnZXRPcHBEaXIoZGlyKTtcclxuXHJcbiAgcHVibGljIGdldE9wcEZpZWxkcyA9IChmaWVsZDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkRGlyIH0gPSBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgICByZXR1cm4gZ2V0T3BwRmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZmllbGQsIGZpZWxkRGlyKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgZ2V0RmllbGRJbmZvID0gKGZpZWxkOiBzdHJpbmcpID0+XHJcbiAgICBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgcHVibGljIGdldEZpZWxkcyA9IChkaXI/OiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgZ2V0RmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZGlyID8/IFwiYWxsXCIpO1xyXG5cclxuICBwdWJsaWMgaXRlcmF0ZUhpZXJzKFxyXG4gICAgY2I6IChoaWVyOiBVc2VySGllciwgZGlyOiBEaXJlY3Rpb25zLCBmaWVsZDogc3RyaW5nKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBpdGVyYXRlSGllcnModGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBjYik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBGdXp6eU1hdGNoLCBGdXp6eVN1Z2dlc3RNb2RhbCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciB9IGZyb20gXCIuL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvclwiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVTZWxlY3Rvck1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcihcIkhOIENob29zZXJcIik7XHJcbiAgICBjb25zdCB7IGhpZXJhcmNoeU5vdGVzIH0gPSB0aGlzLnNldHRpbmdzO1xyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIG5ldyBOb3RpY2UoXCJObyBoaWVyYXJjaHkgbm90ZXMgZm91bmRcIik7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgIWhpZXJhcmNoeU5vdGVzWzBdLmVuZHNXaXRoKFwiL1wiKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcihcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBoaWVyYXJjaHlOb3Rlc1swXVxyXG4gICAgICApLm9wZW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgeyBoaWVyYXJjaHlOb3RlcyB9ID0gdGhpcy5zZXR0aW5ncztcclxuICAgIGlmIChoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT0gMSAmJiBoaWVyYXJjaHlOb3Rlc1swXS5lbmRzV2l0aChcIi9cIikpIHtcclxuICAgICAgLy8gdGhpcyBpcyBhIGZvbGRlclxyXG4gICAgICBsZXQgZm9sZGVyID0gaGllcmFyY2h5Tm90ZXNbMF0uc2xpY2UoMCwgLTEpO1xyXG4gICAgICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgcGFnZXMgPSBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3LmFwaS5wYWdlcyhcclxuICAgICAgICAgIGBcIiR7Zm9sZGVyfVwiYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VzLnZhbHVlcy5tYXAoKHBhZ2UpID0+IHBhZ2UuZmlsZS5wYXRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXcgTm90aWNlKFwibWFrZSBzdXJlIHlvdSBoYXZlIGRhdGF2aWV3IGVuYWJsZWRcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSByZXR1cm4gaGllcmFyY2h5Tm90ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtVGV4dChpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2l0ZW19YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxzdHJpbmc+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IHN0cmluZywgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcih0aGlzLnBsdWdpbiwgaXRlbSkub3BlbigpO1xyXG4gICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHtcclxuICBGdXp6eU1hdGNoLFxyXG4gIEZ1enp5U3VnZ2VzdE1vZGFsLFxyXG4gIExpc3RJdGVtQ2FjaGUsXHJcbiAgTWFya2Rvd25WaWV3LFxyXG4gIE5vdGljZSxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IE1vZGlmeUhpZXJJdGVtTW9kYWwgfSBmcm9tIFwiLi9Nb2RpZnlIaWVySXRlbU1vZGFsXCI7XHJcblxyXG5pbnRlcmZhY2UgSE5JdGVtIHtcclxuICBkZXB0aDogbnVtYmVyO1xyXG4gIGxpbmU6IHN0cmluZztcclxuICBsaW5lTm86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPEhOSXRlbT4ge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3M7XHJcbiAgaGllck5vdGVOYW1lOiBzdHJpbmc7XHJcbiAgbGluZXM6IHN0cmluZ1tdO1xyXG4gIGxpc3RJdGVtczogTGlzdEl0ZW1DYWNoZVtdO1xyXG4gIGZpbGU6IFRGaWxlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luLCBoaWVyTm90ZU5hbWU6IHN0cmluZykge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgdGhpcy5oaWVyTm90ZU5hbWUgPSBoaWVyTm90ZU5hbWU7XHJcblxyXG4gICAgY29uc3QgY2hvb3NlT3ZlcnJpZGUgPSAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5jaG9vc2VyLnVzZVNlbGVjdGVkSXRlbShldnQpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXSwgXCJEZWxldGVcIiwgY2hvb3NlT3ZlcnJpZGUpO1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJTaGlmdFwiXSwgXCJBcnJvd1VwXCIsIGNob29zZU92ZXJyaWRlKTtcclxuICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiQXJyb3dSaWdodFwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIlNoaWZ0XCJdLCBcIkFycm93RG93blwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiSE4gTWFuaXB1bGF0b3JcIik7XHJcbiAgICB0aGlzLnNldEluc3RydWN0aW9ucyhbXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIEVudGVyXCIsIHB1cnBvc2U6IFwiSnVtcCB0byBpdGVtXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkxXCIsIHB1cnBvc2U6IFwiQWRkIHBhcmVudFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIFx1MjE5MlwiLCBwdXJwb3NlOiBcIkFkZCBzaWJsaW5nXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkzIC8gRW50ZXIgLyBDbGlja1wiLCBwdXJwb3NlOiBcIkFkZCBjaGlsZFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJEZWxldGVcIiwgcHVycG9zZTogXCJEZWxldGUgaXRlbVwiIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICB0aGlzLmZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0aGlzLmhpZXJOb3RlTmFtZSwgXCJcIik7XHJcbiAgICBpZiAoIXRoaXMuZmlsZSkgdGhpcy5saW5lcyA9IFtdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKHRoaXMuZmlsZSk7XHJcbiAgICB0aGlzLmxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICB0aGlzLmxpc3RJdGVtcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh0aGlzLmZpbGUpLmxpc3RJdGVtcztcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzKTtcclxuICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogSE5JdGVtW10ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmxpc3RJdGVtc1xyXG4gICAgICAubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaSA9IGl0ZW0ucG9zaXRpb24uc3RhcnQubGluZTtcclxuICAgICAgICByZXR1cm4geyBpLCBsaW5lOiB0aGlzLmxpbmVzW2ldIH07XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBpdGVtLmxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgICBjb25zdCBkZXB0aCA9IHNwbGl0c1swXS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0cy5zbGljZSgxKS5qb2luKFwiLSBcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGRlcHRoLCBsaW5lLCBsaW5lTm86IGl0ZW0uaSB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBpbmZvKGl0ZW1zKTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1UZXh0KGl0ZW06IEhOSXRlbSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7XCIgXCIucmVwZWF0KGl0ZW0uZGVwdGgpfS0gJHtkcm9wV2lraWxpbmtzKGl0ZW0ubGluZSl9YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxITkl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gICAgZWwuaW5uZXJUZXh0ID0gYCR7XCIgXCIucmVwZWF0KGl0ZW0uaXRlbS5kZXB0aCl9LSAke2Ryb3BXaWtpbGlua3MoXHJcbiAgICAgIGl0ZW0uaXRlbS5saW5lXHJcbiAgICApfWA7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVJdGVtKGl0ZW06IEhOSXRlbSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5saW5lcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICB0aGlzLmxpc3RJdGVtcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KHRoaXMuZmlsZSwgdGhpcy5saW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgbmV3IE5vdGljZShcIkl0ZW0gZGVsZXRlZCBTdWNjZXNmdWxseVwiKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBlcnJvcihlcnIpO1xyXG4gICAgICBuZXcgTm90aWNlKFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IEhOSXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgZXZ0LmtleSA9PT0gXCJEZWxldGVcIikge1xyXG4gICAgICB0aGlzLmRlbGV0ZUl0ZW0oaXRlbSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmXHJcbiAgICAgIGV2dC5rZXkgPT0gXCJFbnRlclwiICYmXHJcbiAgICAgIGV2dC5zaGlmdEtleVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuICAgICAgY29uc3QgeyBlZGl0b3IgfSA9IHZpZXcgPz8ge307XHJcbiAgICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICB2aWV3LmxlYWYub3BlbkZpbGUodGhpcy5maWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuICAgICAgZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGl0ZW0ubGluZU5vLCBjaDogaXRlbS5kZXB0aCArIDIgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgfHwgZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICBsZXQgcmVsOiBcInVwXCIgfCBcImRvd25cIiB8IFwic2FtZVwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBldnQudHlwZSA9PSBcImNsaWNrXCIpIHJlbCA9IFwiZG93blwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkgaWYgKGV2dC5rZXkgPT09IFwiRW50ZXJcIikgcmVsID0gXCJkb3duXCI7XHJcbiAgICAgIGlmIChldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2dC5zaGlmdEtleSkge1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93VXBcIikgcmVsID0gXCJ1cFwiO1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93RG93blwiKSByZWwgPSBcImRvd25cIjtcclxuICAgICAgICBpZiAoZXZ0LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHJlbCA9IFwic2FtZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXcgTW9kaWZ5SGllckl0ZW1Nb2RhbChcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIHRoaXMuZmlsZSxcclxuICAgICAgICByZWxcclxuICAgICAgKS5vcGVuKCk7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IE1vZGFsLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgTW9kaWZ5SE5JdGVtQ29tcCBmcm9tIFwiLi4vLi4vQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuaW50ZXJmYWNlIEhOSXRlbSB7XHJcbiAgZGVwdGg6IG51bWJlcjtcclxuICBsaW5lOiBzdHJpbmc7XHJcbiAgbGluZU5vOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNb2RpZnlIaWVySXRlbU1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gIG1vdW50OiBNb2RpZnlITkl0ZW1Db21wO1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgaG5JdGVtOiBITkl0ZW07XHJcbiAgZmlsZTogVEZpbGU7XHJcbiAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgICBobkl0ZW06IEhOSXRlbSxcclxuICAgIGZpbGU6IFRGaWxlLFxyXG4gICAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiXHJcbiAgKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLm1vZGFsID0gdGhpcztcclxuICAgIHRoaXMuaG5JdGVtID0gaG5JdGVtO1xyXG4gICAgdGhpcy5maWxlID0gZmlsZTtcclxuICAgIHRoaXMucmVsID0gcmVsO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcbiAgICB0aGlzLm1vdW50ID0gbmV3IE1vZGlmeUhOSXRlbUNvbXAoe1xyXG4gICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHtcclxuICAgICAgICBtb2RhbDogdGhpcyxcclxuICAgICAgICBzZXR0aW5nczogdGhpcy5wbHVnaW4uc2V0dGluZ3MsXHJcbiAgICAgICAgaG5JdGVtOiB0aGlzLmhuSXRlbSxcclxuICAgICAgICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAgICAgcmVsOiB0aGlzLnJlbCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMubW91bnQuJGRlc3Ryb3koKTtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuICBpbXBvcnQgeyBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBNb2RpZnlIaWVySXRlbU1vZGFsIH0gZnJvbSBcIi4uL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvTW9kaWZ5SGllckl0ZW1Nb2RhbFwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgeyBkcm9wV2lraWxpbmtzLCBtYWtlV2lraSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgZXhwb3J0IGxldCBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuICBleHBvcnQgbGV0IGhuSXRlbTogSE5JdGVtO1xyXG4gIGV4cG9ydCBsZXQgZmlsZTogVEZpbGU7XHJcbiAgZXhwb3J0IGxldCByZWw6IFwidXBcIiB8IFwic2FtZVwiIHwgXCJkb3duXCI7XHJcblxyXG4gIGludGVyZmFjZSBITkl0ZW0ge1xyXG4gICAgZGVwdGg6IG51bWJlcjtcclxuICAgIGxpbmU6IHN0cmluZztcclxuICAgIGxpbmVObzogbnVtYmVyO1xyXG4gIH1cclxuICBsZXQgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgLy9AdHMtaWdub3JlXHJcbiAgbGV0IG5ld0l0ZW0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldy5maWxlLmJhc2VuYW1lO1xyXG5cclxuICBjb25zdCBidWlsZE5ld0l0ZW0gPSAoXHJcbiAgICBuZXdJdGVtOiBzdHJpbmcsXHJcbiAgICBkZXB0aCA9IGhuSXRlbS5kZXB0aCxcclxuICAgIHByZXZpZXcgPSBmYWxzZVxyXG4gICkgPT5cclxuICAgIGAke1wiIFwiLnJlcGVhdChNYXRoLnJvdW5kKGRlcHRoIC8gKHByZXZpZXcgPyAyIDogMSkpKX0tICR7XHJcbiAgICAgIHByZXZpZXcgPyBuZXdJdGVtIHx8IFwiPEVtcHR5PlwiIDogbWFrZVdpa2kobmV3SXRlbSlcclxuICAgIH1gO1xyXG5cclxuICAvLyBvbk1vdW50KGlucHV0RWwuZm9jdXMpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxoNT5BZGQgYW4ge0FSUk9XX0RJUkVDVElPTlNbcmVsXX0gdG8ge2Ryb3BXaWtpbGlua3MoaG5JdGVtLmxpbmUpfTwvaDU+XHJcbjxkaXY+XHJcbiAgeyNpZiByZWwgPT09IFwidXBcIn1cclxuICAgIHsjaWYgaG5JdGVtLmRlcHRoID09PSAwfVxyXG4gICAgICA8ZGl2PkNhbid0IGFkZCBwYXJlbnQgdG8gdG9wIGxldmVsIGl0ZW0sIGNob29zZSBhbm90aGVyIGRpcmVjdGlvbjwvZGl2PlxyXG4gICAgezplbHNlfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxwcmU+XHJcbiAgICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCAtIDQsIHRydWUpfVxyXG4gICAgICAgIDwvcHJlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIHsvaWZ9XHJcbiAgey9pZn1cclxuICA8ZGl2PlxyXG4gICAgPHByZT5cclxuICAgICAgICA8c3Ryb25nXHJcbiAgICAgICAgPntidWlsZE5ld0l0ZW0oZHJvcFdpa2lsaW5rcyhobkl0ZW0ubGluZSksIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9PC9zdHJvbmdcclxuICAgICAgPlxyXG4gICAgPC9wcmU+XHJcbiAgPC9kaXY+XHJcbiAgeyNpZiByZWwgPT09IFwic2FtZVwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9XHJcbiAgICA8L3ByZT5cclxuICAgIDwvZGl2PlxyXG4gIHs6ZWxzZSBpZiByZWwgPT09IFwiZG93blwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCArIDQsIHRydWUpfVxyXG4gICAgPC9wcmU+XHJcbiAgICA8L2Rpdj5cclxuICB7L2lmfVxyXG5cclxuICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1vbmNoYW5nZSAtLT5cclxuICA8c2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIiB3aWR0aD1cIjFcIiBiaW5kOnZhbHVlPXtyZWx9PlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cInVwXCI+dXA8L29wdGlvbj5cclxuICAgIDxvcHRpb24gdmFsdWU9XCJzYW1lXCI+c2FtZTwvb3B0aW9uPlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cImRvd25cIj5kb3duPC9vcHRpb24+XHJcbiAgPC9zZWxlY3Q+XHJcblxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cInRleHRcIlxyXG4gICAgcGxhY2Vob2xkZXI9XCJOZXcgaXRlbVwiXHJcbiAgICBiaW5kOnRoaXM9e2lucHV0RWx9XHJcbiAgICBiaW5kOnZhbHVlPXtuZXdJdGVtfVxyXG4gIC8+XHJcblxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4ge1xyXG4gICAgICBpZiAocmVsID09PSBcInVwXCIgJiYgaG5JdGVtLmRlcHRoID09PSAwKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgIFwiQ2FuJ3QgYWRkIHBhcmVudCB0byB0b3AgbGV2ZWwgaXRlbSwgY2hvb3NlIGFub3RoZXIgZGlyZWN0aW9uXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgICAgY29uc3QgbGluZU5vID0gcmVsID09PSBcInVwXCIgPyBobkl0ZW0ubGluZU5vIDogaG5JdGVtLmxpbmVObyArIDE7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAgICAgICByZWwgPT09IFwidXBcIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoIC0gNFxyXG4gICAgICAgICAgICAgIDogcmVsID09PSBcImRvd25cIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoICsgNFxyXG4gICAgICAgICAgICAgIDogaG5JdGVtLmRlcHRoO1xyXG5cclxuICAgICAgICAgIGxpbmVzLnNwbGljZShsaW5lTm8sIDAsIGJ1aWxkTmV3SXRlbShuZXdJdGVtLCBkZXB0aCkpO1xyXG4gICAgICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBlcnJvcihlcnIpO1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcIkFuIGVycm9yIG9jY3VyZWQsIHBsZWFzZSBjaGVjayB0aGUgY29uc29sZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH19PkFkZDwvYnV0dG9uXHJcbiAgPlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBwcmUge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGdldERWQXBpIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuL0NvbW1hbmRzL0NyZWF0ZUluZGV4XCI7XHJcbmltcG9ydCBDQlRyZWUgZnJvbSBcIi4vQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IENPREVCTE9DS19GSUVMRFMsIENPREVCTE9DS19UWVBFUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IENvZGVibG9ja0ZpZWxkcywgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7IGRyb3BGb2xkZXIsIHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFJlZmxleGl2ZUNsb3N1cmUsXHJcbiAgZ2V0U3ViRm9yRmllbGRzLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0RmllbGRzLCBnZXRPcHBEaXIgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2wgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvZGVibG9ja0NCKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCBjcmVhdGVJbmRleEluZGVudCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIGVsOiBIVE1MRWxlbWVudCxcclxuICAgIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dFxyXG4gICkgPT4ge1xyXG4gICAgZGIuc3RhcnQyRyhcIkNvZGVibG9ja1wiKTtcclxuICAgIGNvbnN0IHBhcnNlZFNvdXJjZSA9IHBhcnNlQ29kZUJsb2NrU291cmNlKHNvdXJjZSk7XHJcbiAgICBjb25zdCBlcnIgPSBjb2RlYmxvY2tFcnJvcihwbHVnaW4sIHBhcnNlZFNvdXJjZSk7XHJcblxyXG4gICAgaWYgKGVyciAhPT0gXCJcIikge1xyXG4gICAgICBlbC5pbm5lckhUTUwgPSBlcnI7XHJcbiAgICAgIGRiLmVuZDJHKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWluID0gMCxcclxuICAgICAgbWF4ID0gSW5maW5pdHk7XHJcbiAgICBsZXQgeyBkZXB0aCwgZGlyLCBmaWVsZHMsIGZyb20sIGltcGxpZWQsIGZsYXQgfSA9IHBhcnNlZFNvdXJjZTtcclxuICAgIGlmIChkZXB0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IG1pbk51bSA9IHBhcnNlSW50KGRlcHRoWzBdKTtcclxuICAgICAgaWYgKCFpc05hTihtaW5OdW0pKSBtaW4gPSBtaW5OdW07XHJcbiAgICAgIGNvbnN0IG1heE51bSA9IHBhcnNlSW50KGRlcHRoWzFdKTtcclxuICAgICAgaWYgKCFpc05hTihtYXhOdW0pKSBtYXggPSBtYXhOdW07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXHJcbiAgICAgIGN0eC5zb3VyY2VQYXRoLFxyXG4gICAgICBcIlwiXHJcbiAgICApO1xyXG4gICAgY29uc3QgeyBiYXNlbmFtZSB9ID0gY3VyckZpbGU7XHJcblxyXG4gICAgbGV0IGZyb21zID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgICAgICAgaWYgKGFwaSkge1xyXG4gICAgICAgICAgY29uc3QgcGFnZXMgPSBhcGkucGFnZVBhdGhzKGZyb20pPy52YWx1ZXM7XHJcbiAgICAgICAgICBmcm9tcyA9IHBhZ2VzLm1hcChkcm9wRm9sZGVyKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkRhdGF2aWV3IG11c3QgYmUgZW5hYmxlZCBmb3IgYGZyb21gIHRvIHdvcmsuXCIpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShgVGhlIHF1ZXJ5IFwiJHtmcm9tfVwiIGZhaWxlZC5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIpO1xyXG4gICAgY29uc3Qgc3ViID1cclxuICAgICAgaW1wbGllZCA9PT0gZmFsc2VcclxuICAgICAgICA/IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpcilcclxuICAgICAgICA6IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpciwgb3BwRGlyKTtcclxuICAgIGNvbnN0IGNsb3NlZCA9IGdldFJlZmxleGl2ZUNsb3N1cmUoc3ViLCB1c2VySGllcnMpO1xyXG5cclxuICAgIGNvbnN0IHN1YkZpZWxkcyA9IGZpZWxkcyA/PyBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICAgIGNvbnN0IHN1YkNsb3NlZCA9IGdldFN1YkZvckZpZWxkcyhnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXIpLCBzdWJGaWVsZHMpO1xyXG5cclxuXHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKHN1YkNsb3NlZCwgYmFzZW5hbWUpO1xyXG4gICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgIGluZm8oeyBhbGxQYXRocywgaW5kZXggfSk7XHJcblxyXG4gICAgY29uc3QgbGluZXMgPSBpbmRleFRvTGluZVBhaXJzKGluZGV4LCBmbGF0KTtcclxuXHJcbiAgICBzd2l0Y2ggKHBhcnNlZFNvdXJjZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJ0cmVlXCI6XHJcbiAgICAgICAgbmV3IENCVHJlZSh7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVsLFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgICBlbCxcclxuICAgICAgICAgICAgbWluLFxyXG4gICAgICAgICAgICBtYXgsXHJcbiAgICAgICAgICAgIGxpbmVzLFxyXG4gICAgICAgICAgICBmcm9tcyxcclxuICAgICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICAgIHBhcnNlZFNvdXJjZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJqdWdnbFwiOlxyXG4gICAgICAgIGNyZWF0ZWRKdWdnbENCKFxyXG4gICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgZWwsXHJcbiAgICAgICAgICBwYXJzZWRTb3VyY2UsXHJcbiAgICAgICAgICBsaW5lcyxcclxuICAgICAgICAgIGZyb21zLFxyXG4gICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICBtaW4sXHJcbiAgICAgICAgICBtYXhcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcnNlIGEgc3RyaW5nIGFzIGEgYm9vbGVhbiB2YWx1ZS4gSWYgbm90IFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiwgcmV0dXJuIGB2YWx1ZWAuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgYm9vbGVhbn1cclxuICovXHJcbmNvbnN0IHBhcnNlQXNCb29sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBib29sZWFuID0+XHJcbiAgdmFsdWUgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IHZhbHVlID09PSBcImZhbHNlXCIgPyBmYWxzZSA6IHZhbHVlO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VDb2RlQmxvY2tTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBQYXJzZWRDb2RlYmxvY2sge1xyXG4gIGNvbnN0IGxpbmVzID0gc291cmNlLnNwbGl0KFwiXFxuXCIpO1xyXG4gIGNvbnN0IGdldFZhbHVlID0gKHR5cGU6IHN0cmluZykgPT5cclxuICAgIGxpbmVzXHJcbiAgICAgIC5maW5kKChsKSA9PiBsLnN0YXJ0c1dpdGgoYCR7dHlwZX06YCkpXHJcbiAgICAgID8uc3BsaXQoXCI6XCIpPy5bMV1cclxuICAgICAgPy50cmltKCk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdHM6IHsgW2ZpZWxkIGluIENvZGVibG9ja0ZpZWxkc106IHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXSB9ID1cclxuICAgIHt9O1xyXG5cclxuICBDT0RFQkxPQ0tfRklFTERTLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGZpZWxkKTtcclxuICAgIHJlc3VsdHNbZmllbGRdID0gcGFyc2VBc0Jvb2wodmFsdWUpO1xyXG4gIH0pO1xyXG5cclxuICByZXN1bHRzLmZpZWxkcyA9IHJlc3VsdHMuZmllbGRzXHJcbiAgICA/IHNwbGl0QW5kVHJpbShyZXN1bHRzLmZpZWxkcyBhcyBzdHJpbmcpXHJcbiAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgaWYgKHJlc3VsdHMuZGVwdGgpIHtcclxuICAgIGNvbnN0IG1hdGNoID0gKHJlc3VsdHMuZGVwdGggYXMgc3RyaW5nKS5tYXRjaCgvKFxcZCopLT8oXFxkKikvKTtcclxuICAgIHJlc3VsdHMuZGVwdGggPSBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUGFyc2VkQ29kZWJsb2NrO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb2RlYmxvY2tFcnJvcihwbHVnaW46IEJDUGx1Z2luLCBwYXJzZWRTb3VyY2U6IFBhcnNlZENvZGVibG9jaykge1xyXG4gIGNvbnN0IHsgZGlyLCBmaWVsZHMsIHR5cGUsIHRpdGxlLCBkZXB0aCwgZmxhdCwgY29udGVudCwgZnJvbSwgaW1wbGllZCB9ID1cclxuICAgIHBhcnNlZFNvdXJjZTtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGxldCBlcnIgPSBcIlwiO1xyXG5cclxuICBpZiAoIUNPREVCTE9DS19UWVBFUy5pbmNsdWRlcyh0eXBlKSlcclxuICAgIGVyciArPSBgPGNvZGU+dHlwZTogJHt0eXBlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdHlwZS4gSXQgbXVzdCBiZSBvbmUgb2Y6ICR7Q09ERUJMT0NLX1RZUEVTLm1hcChcclxuICAgICAgKHR5cGUpID0+IGA8Y29kZT4ke3R5cGV9PC9jb2RlPmBcclxuICAgICkuam9pbihcIiwgXCIpfS48L2JyPmA7XHJcblxyXG4gIGNvbnN0IHZhbGlkRGlyID0gRElSRUNUSU9OUy5pbmNsdWRlcyhkaXIpO1xyXG4gIGlmICghdmFsaWREaXIpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRpcjogJHtkaXJ9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBkaXJlY3Rpb24uPC9icj5gO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBbZmllbGRzXS5mbGF0KCk/LmZvckVhY2goKGYpID0+IHtcclxuICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgIWFsbEZpZWxkcy5pbmNsdWRlcyhmKSlcclxuICAgICAgZXJyICs9IGA8Y29kZT5maWVsZHM6ICR7Zn08L2NvZGU+IGlzIG5vdCBhIGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMuPC9icj5gO1xyXG4gIH0pO1xyXG5cclxuICBpZiAodGl0bGUgIT09IHVuZGVmaW5lZCAmJiB0aXRsZSAhPT0gZmFsc2UpXHJcbiAgICBlcnIgKz0gYDxjb2RlPnRpdGxlOiAke3RpdGxlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIGxlYXZlIHRoZSBlbnRpcmUgbGluZSBvdXQuPC9icj5gO1xyXG5cclxuICBpZiAoZGVwdGggIT09IHVuZGVmaW5lZCAmJiBkZXB0aC5ldmVyeSgobnVtKSA9PiBpc05hTihwYXJzZUludChudW0pKSkpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRlcHRoOiAke2RlcHRofTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSBhIG51bWJlci48L2JyPmA7XHJcblxyXG4gIGlmIChmbGF0ICE9PSB1bmRlZmluZWQgJiYgZmxhdCAhPT0gdHJ1ZSlcclxuICAgIGVyciArPSBgPGNvZGU+ZmxhdDogJHtmbGF0fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT50cnVlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQgJiYgY29udGVudCAhPT0gXCJvcGVuXCIgJiYgY29udGVudCAhPT0gXCJjbG9zZWRcIilcclxuICAgIGVyciArPSBgPGNvZGU+Y29udGVudDogJHtjb250ZW50fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5vcGVuPC9jb2RlPiBvciA8Y29kZT5jbG9zZWQ8L2NvZGU+LCBvciBsZWF2ZSB0aGUgZW50aXJlIGxpbmUgb3V0LjwvYnI+YDtcclxuXHJcbiAgaWYgKFxyXG4gICAgZnJvbSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAhYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIilcclxuICApIHtcclxuICAgIGVyciArPSBgRGF0YXZpZXcgbXVzdCBiZSBlbmFibGVkIHRvIHVzZSA8Y29kZT5mcm9tPC9jb2RlPi48L2JyPmA7XHJcbiAgfVxyXG5cclxuICBpZiAoaW1wbGllZCAhPT0gdW5kZWZpbmVkICYmIGltcGxpZWQgIT09IGZhbHNlKVxyXG4gICAgZXJyICs9IGA8Y29kZT5pbXBsaWVkOiAke2ltcGxpZWR9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIHJldHVybiBlcnIgPT09IFwiXCJcclxuICAgID8gXCJcIlxyXG4gICAgOiBgJHtlcnJ9PC9icj5cclxuICAgIEEgdmFsaWQgZXhhbXBsZSB3b3VsZCBiZTpcclxuICAgIDxwcmU+PGNvZGU+XHJcbiAgICAgIHR5cGU6IHRyZWVcclxuICAgICAgZGlyOiAke3ZhbGlkRGlyID8gZGlyIDogXCJkb3duXCJ9XHJcbiAgICAgIGZpZWxkczogJHthbGxGaWVsZHNcclxuICAgICAgLm1hcCgoZikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IGYsIGRpcjogZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZikuZmllbGREaXIgfTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoaW5mbykgPT4gaW5mby5kaXIgPT09IGRpcilcclxuICAgICAgLm1hcCgoaW5mbykgPT4gaW5mby5mKVxyXG4gICAgICAuam9pbihcIiwgXCIpIHx8IFwiY2hpbGRcIlxyXG4gICAgfVxyXG4gICAgICBkZXB0aDogM1xyXG4gICAgICA8L2NvZGU+PC9wcmU+YDtcclxufVxyXG5cclxuY29uc3QgaW5kZW50VG9EZXB0aCA9IChpbmRlbnQ6IHN0cmluZykgPT4gaW5kZW50Lmxlbmd0aCAvIDIgKyAxO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lZXRzQ29uZGl0aW9ucyhcclxuICBpbmRlbnQ6IHN0cmluZyxcclxuICBub2RlOiBzdHJpbmcsXHJcbiAgZnJvbXM6IHN0cmluZ1tdLFxyXG4gIG1pbjogbnVtYmVyLFxyXG4gIG1heDogbnVtYmVyXHJcbikge1xyXG4gIGNvbnN0IGRlcHRoID0gaW5kZW50VG9EZXB0aChpbmRlbnQpO1xyXG4gIHJldHVybiAoXHJcbiAgICBkZXB0aCA+PSBtaW4gJiZcclxuICAgIGRlcHRoIDw9IG1heCAmJlxyXG4gICAgKGZyb21zID09PSB1bmRlZmluZWQgfHwgZnJvbXMuaW5jbHVkZXMobm9kZSkpXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRKdWdnbENCKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBhcmdzOiBQYXJzZWRDb2RlYmxvY2ssXHJcbiAgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcclxuICBmcm9tczogc3RyaW5nW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgbWluOiBudW1iZXIsXHJcbiAgbWF4OiBudW1iZXJcclxuKSB7XHJcbiAgY29uc3Qgbm9kZXMgPSBsaW5lc1xyXG4gICAgLmZpbHRlcigoW2luZGVudCwgbm9kZV0pID0+IG1lZXRzQ29uZGl0aW9ucyhpbmRlbnQsIG5vZGUsIGZyb21zLCBtaW4sIG1heCkpXHJcbiAgICAubWFwKChbXywgbm9kZV0pID0+IG5vZGUgKyBcIi5tZFwiKTtcclxuICBpZiAobWluIDw9IDApIG5vZGVzLnB1c2goc291cmNlICsgXCIubWRcIik7XHJcblxyXG4gIGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJncyk7XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCB7IG9uTW91bnQgfSBmcm9tIFwic3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGF0aDogc3RyaW5nO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50KG5vdGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5vdGUsIFwiXCIpO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGVsOiBIVE1MRWxlbWVudDtcclxuICBvbk1vdW50KGFzeW5jICgpID0+IHtcclxuICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oYXdhaXQgZ2V0Q29udGVudChwYXRoKSwgZWwsIHBhdGgsIG51bGwpO1xyXG4gIH0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1ub3RlLWNvbnRlbnRcIiBiaW5kOnRoaXM9e2VsfSAvPlxyXG5cclxuPHN0eWxlPlxyXG4gIGRpdi5CQy1ub3RlLWNvbnRlbnQge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICAgIGhvdmVyUHJldmlldyxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgeyBtZWV0c0NvbmRpdGlvbnMgfSBmcm9tIFwiLi4vQ29kZWJsb2Nrc1wiO1xyXG4gIGltcG9ydCB0eXBlIHsgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IGRyb3BEZW5kcm9uIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCBSZW5kZXJNYXJrZG93biBmcm9tIFwiLi9SZW5kZXJNYXJrZG93bi5zdmVsdGVcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgZWw6IEhUTUxFbGVtZW50O1xyXG4gIGV4cG9ydCBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICBleHBvcnQgbGV0IGZyb21zOiBzdHJpbmdbXTtcclxuICBleHBvcnQgbGV0IG1pbjogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgbWF4OiBudW1iZXI7XHJcbiAgZXhwb3J0IGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGV4cG9ydCBsZXQgcGFyc2VkU291cmNlOiBQYXJzZWRDb2RlYmxvY2s7XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHRpdGxlLCBjb250ZW50LCBkaXIgfSA9IHBhcnNlZFNvdXJjZTtcclxuXHJcbiAgY29uc3QgYWN0aXZlTGVhZlZpZXcgPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldztcclxuPC9zY3JpcHQ+XHJcblxyXG57I2lmIHRpdGxlICE9PSBmYWxzZX1cclxuICA8aDM+e2Rpcn0gb2Yge2Jhc2VuYW1lfTwvaDM+XHJcbnsvaWZ9XHJcbjxkaXYgY2xhc3M9XCJCQy10cmVlXCI+XHJcbiAgeyNlYWNoIGxpbmVzIGFzIFtpbmRlbnQsIGxpbmtdfVxyXG4gICAgeyNpZiBtZWV0c0NvbmRpdGlvbnMoaW5kZW50LCBsaW5rLCBmcm9tcywgbWluLCBtYXgpfVxyXG4gICAgICB7I2lmIGNvbnRlbnQgPT09IFwib3BlblwiIHx8IGNvbnRlbnQgPT09IFwiY2xvc2VkXCJ9XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJpbmRlbnRcIj57aW5kZW50fTwvcHJlPlxyXG4gICAgICAgICAgPGRldGFpbHMgb3Blbj17Y29udGVudCA9PT0gXCJvcGVuXCJ9PlxyXG4gICAgICAgICAgICA8c3VtbWFyeT5cclxuICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2gobGluaywgZSl9XHJcbiAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIGxpbmspfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluaykgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+e2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX08L2FcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgICAgICAgPFJlbmRlck1hcmtkb3duIHBhdGg9e2xpbmt9IC8+XHJcbiAgICAgICAgICA8L2RldGFpbHM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHs6ZWxzZX1cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImluZGVudFwiPntpbmRlbnQgKyBcIi1cIn08L3ByZT5cclxuICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChsaW5rLCBlKX1cclxuICAgICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCBsaW5rKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbWlzc2luZy1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaW50ZXJuYWwtbGluayB7aXNJblZhdWx0KGxpbmspID8gJycgOiAnaXMtdW5yZXNvbHZlZCd9XCI+XHJcbiAgICAgICAgICAgICAge2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2lmfVxyXG4gICAgey9pZn1cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIC5CQy10cmVlIHtcclxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gIH1cclxuICAvKiAuQkMtdHJlZSA+IGRpdiB7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIH0gKi9cclxuICBwcmUuaW5kZW50IHtcclxuICAgIGRpc3BsYXk6IGlubGluZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gICAgcG9zaXRpb246IHRvcDtcclxuICB9XHJcbiAgZGV0YWlscyB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfVxyXG5cclxuICAuaXMtdW5yZXNvbHZlZCB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFJlYWxuSW1wbGllZCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7Z2V0Q3VyckZpbGV9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ganVtcFRvRmlyc3REaXIocGx1Z2luOiBCQ1BsdWdpbiwgZGlyOiBEaXJlY3Rpb25zKSB7XHJcbiAgY29uc3QgeyBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgY29uc3QgZmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFmaWxlKSB7XHJcbiAgICBuZXcgTm90aWNlKFwiWW91IG5lZWQgdG8gYmUgZm9jdXNzZWQgb24gYSBNYXJrZG93biBmaWxlXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBmaWxlO1xyXG5cclxuICBjb25zdCByZWFsc05JbXBsaWVkcyA9IGdldFJlYWxuSW1wbGllZChwbHVnaW4sIGJhc2VuYW1lLCBkaXIpW2Rpcl07XHJcbiAgY29uc3QgYWxsQkNzID0gWy4uLnJlYWxzTkltcGxpZWRzLnJlYWxzLCAuLi5yZWFsc05JbXBsaWVkcy5pbXBsaWVkc107XHJcbiAgaWYgKGFsbEJDcy5sZW5ndGggPT09IDApIHtcclxuICAgIG5ldyBOb3RpY2UoYE5vICR7ZGlyfSBmb3VuZGApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9Ob2RlID0gYWxsQkNzLmZpbmQoKGJjKSA9PlxyXG4gICAgbGltaXRKdW1wVG9GaXJzdEZpZWxkcy5pbmNsdWRlcyhiYy5maWVsZClcclxuICApPy50bztcclxuXHJcbiAgaWYgKCF0b05vZGUpIHtcclxuICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgIGBObyBub3RlIHdhcyBmb3VuZCBpbiAke2Rpcn0gZ2l2ZW4gdGhlIGxpbWl0ZWQgZmllbGRzIGFsbG93ZWQ6ICR7bGltaXRKdW1wVG9GaXJzdEZpZWxkcy5qb2luKFxyXG4gICAgICAgIFwiLCBcIlxyXG4gICAgICApfWBcclxuICAgICk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCB0b0ZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0b05vZGUsIFwiXCIpO1xyXG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi5vcGVuRmlsZSh0b0ZpbGUpO1xyXG59XHJcbiIsICJpbXBvcnQgeyBub3JtYWxpemVQYXRoLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVPclVwZGF0ZVlhbWwsIGdldEN1cnJGaWxlLCBzcGxpdEF0WWFtbCB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlID0gKFxyXG4gIHRlbXBsYXRlOiBzdHJpbmcsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gIGRhdGVGb3JtYXQ6IHN0cmluZ1xyXG4pID0+XHJcbiAgdGVtcGxhdGVcclxuICAgID8gdGVtcGxhdGVcclxuICAgICAgLnJlcGxhY2UoXCJ7e2N1cnJlbnR9fVwiLCBjdXJyRmlsZS5iYXNlbmFtZSlcclxuICAgICAgLnJlcGxhY2UoXCJ7e2ZpZWxkfX1cIiwgZmllbGQpXHJcbiAgICAgIC5yZXBsYWNlKFwie3tkaXJ9fVwiLCBkaXIpXHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIG1vbWVudCgpLmZvcm1hdChkYXRlRm9ybWF0KSlcclxuICAgIDogXCJVbnRpdGxlZFwiO1xyXG5cclxuZnVuY3Rpb24gbWFrZUZpbGVuYW1lVW5pcXVlKGZpbGVuYW1lOiBzdHJpbmcpIHtcclxuICBsZXQgaSA9IDEsXHJcbiAgICBuZXdOYW1lID0gZmlsZW5hbWU7XHJcbiAgd2hpbGUgKGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5ld05hbWUsIFwiXCIpKSB7XHJcbiAgICBpZiAoaSA9PT0gMSkgbmV3TmFtZSArPSBgICR7aX1gO1xyXG4gICAgZWxzZSBuZXdOYW1lID0gbmV3TmFtZS5zbGljZSgwLCAtMikgKyBgICR7aX1gO1xyXG4gICAgaSsrO1xyXG4gIH1cclxuICByZXR1cm4gbmV3TmFtZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICB3cml0ZUJDc0lubGluZTogYm9vbGVhbixcclxuICB0ZW1wbGF0ZVBhdGg6IHN0cmluZyxcclxuICBvcHBGaWVsZDogc3RyaW5nLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBjcnVtYjogc3RyaW5nXHJcbikge1xyXG4gIGxldCBuZXdDb250ZW50ID0gY3J1bWI7XHJcblxyXG4gIGlmICh0ZW1wbGF0ZVBhdGgpIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KFxyXG4gICAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICAgIFwiXCJcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZCh0ZW1wbGF0ZUZpbGUpO1xyXG4gICAgbmV3Q29udGVudCA9IHRlbXBsYXRlLnJlcGxhY2UoXHJcbiAgICAgIC9cXHtcXHtCQy10aHJlYWQtY3J1bWJcXH1cXH0vaSxcclxuICAgICAgd3JpdGVCQ3NJbmxpbmVcclxuICAgICAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgICAgICA6IGAke29wcEZpZWxkfTogWycke2N1cnJGaWxlLmJhc2VuYW1lfSddYFxyXG4gICAgKTtcclxuICB9XHJcbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aHJlYWQocGx1Z2luOiBCQ1BsdWdpbiwgZmllbGQ6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICB0aHJlYWRpbmdUZW1wbGF0ZSxcclxuICAgIGRhdGVGb3JtYXQsXHJcbiAgICB0aHJlYWRJbnRvTmV3UGFuZSxcclxuICAgIHRocmVhZGluZ0RpclRlbXBsYXRlcyxcclxuICAgIHRocmVhZFVuZGVyQ3Vyc29yLFxyXG4gICAgd3JpdGVCQ3NJbmxpbmUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBjdXJyRmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBuZXdGaWxlUGFyZW50ID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGUucGF0aCk7XHJcblxyXG4gIGNvbnN0IGRpciA9IGdldEZpZWxkSW5mbyh1c2VySGllcnMsIGZpZWxkKS5maWVsZERpcjtcclxuICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICBsZXQgbmV3QmFzZW5hbWUgPSByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlKFxyXG4gICAgdGhyZWFkaW5nVGVtcGxhdGUsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIGZpZWxkLFxyXG4gICAgZGlyLFxyXG4gICAgZGF0ZUZvcm1hdFxyXG4gICk7XHJcbiAgbmV3QmFzZW5hbWUgPSBtYWtlRmlsZW5hbWVVbmlxdWUobmV3QmFzZW5hbWUpO1xyXG5cclxuICBjb25zdCBvcHBDcnVtYiA9IHdyaXRlQkNzSW5saW5lXHJcbiAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgIDogYC0tLVxcbiR7b3BwRmllbGR9OiBbJyR7Y3VyckZpbGUuYmFzZW5hbWV9J11cXG4tLS1gO1xyXG5cclxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSB0aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXTtcclxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICAgIHdyaXRlQkNzSW5saW5lLFxyXG4gICAgdGVtcGxhdGVQYXRoLFxyXG4gICAgb3BwRmllbGQsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIG9wcENydW1iXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgbmV3RmlsZSA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoXHJcbiAgICBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVQYXJlbnQucGF0aH0vJHtuZXdCYXNlbmFtZX0ubWRgKSxcclxuICAgIG5ld0NvbnRlbnRcclxuICApO1xyXG5cclxuICBpZiAoIXdyaXRlQkNzSW5saW5lKSB7XHJcbiAgICBjb25zdCB7IGFwaSB9ID0gYXBwLnBsdWdpbnMucGx1Z2lucy5tZXRhZWRpdCA/PyB7fTtcclxuICAgIGlmICghYXBpKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJNZXRhZWRpdCBtdXN0IGJlIGVuYWJsZWQgdG8gd3JpdGUgdG8geWFtbC4gQWx0ZXJuYXRpdmVseSwgdG9nZ2xlIHRoZSBzZXR0aW5nIGBXcml0ZSBCcmVhZGNydW1icyBJbmxpbmVgIHRvIHVzZSBEYXRhdmlldyBpbmxpbmUgZmllbGRzIGluc3RlYWQuXCJcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgY3JlYXRlT3JVcGRhdGVZYW1sKFxyXG4gICAgICBmaWVsZCxcclxuICAgICAgbmV3RmlsZS5iYXNlbmFtZSxcclxuICAgICAgY3VyckZpbGUsXHJcbiAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSkuZnJvbnRtYXR0ZXIsXHJcbiAgICAgIGFwaVxyXG4gICAgKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY3J1bWIgPSBgJHtmaWVsZH06OiBbWyR7bmV3RmlsZS5iYXNlbmFtZX1dXWA7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgICBpZiAodGhyZWFkVW5kZXJDdXJzb3IgfHwgIWVkaXRvcikge1xyXG4gICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKGNydW1iLCBlZGl0b3IuZ2V0Q3Vyc29yKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETyBDaGVjayBpZiB0aGlzIG5vdGUgYWxyZWFkeSBoYXMgdGhpcyBmaWVsZFxyXG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcbiAgICAgIGNvbnRlbnQgPVxyXG4gICAgICAgIHNwbGl0c1swXSArXHJcbiAgICAgICAgKHNwbGl0c1swXS5sZW5ndGggPyBcIlxcblwiIDogXCJcIikgK1xyXG4gICAgICAgIGNydW1iICtcclxuICAgICAgICAoc3BsaXRzWzFdLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgc3BsaXRzWzFdO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShjdXJyRmlsZSwgY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBsZWFmID0gdGhyZWFkSW50b05ld1BhbmVcclxuICAgID8gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpXHJcbiAgICA6IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuXHJcbiAgYXdhaXQgbGVhZi5vcGVuRmlsZShuZXdGaWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuXHJcbiAgaWYgKHRlbXBsYXRlUGF0aCkge1xyXG4gICAgaWYgKGFwcC5wbHVnaW5zLnBsdWdpbnNbXCJ0ZW1wbGF0ZXItb2JzaWRpYW5cIl0pIHtcclxuICAgICAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChcclxuICAgICAgICBcInRlbXBsYXRlci1vYnNpZGlhbjpyZXBsYWNlLWluLWZpbGUtdGVtcGxhdGVyXCJcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJUaGUgVGVtcGxhdGVyIHBsdWdpbiBtdXN0IGJlIGVuYWJsZWQgdG8gcmVzb2x2ZSB0aGUgdGVtcGxhdGVzIGluIHRoZSBuZXcgbm90ZVwiXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAodGhyZWFkaW5nVGVtcGxhdGUpIHtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGNvbnN0IGVkaXRvciA9IGxlYWYudmlldy5lZGl0b3IgYXMgRWRpdG9yO1xyXG4gICAgZWRpdG9yLnNldEN1cnNvcihlZGl0b3IuZ2V0VmFsdWUoKS5sZW5ndGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBub3RlTmFtZUlucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJ2aWV3LWhlYWRlci10aXRsZVwiKTtcclxuXHJcbiAgICBjb25zdCBuZXdOb3RlSW5wdXRFbCA9IEFycmF5LmZyb20obm90ZU5hbWVJbnB1dHMpLmZpbmQoXHJcbiAgICAgIChpbnB1dDogSFRNTElucHV0RWxlbWVudCkgPT4gaW5wdXQuaW5uZXJUZXh0ID09PSBuZXdCYXNlbmFtZVxyXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbmV3Tm90ZUlucHV0RWwuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIG5ld05vdGVJbnB1dEVsLmZvY3VzKCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjaGFuZ2VZYW1sLCBnZXRDdXJyRmlsZSwgc3BsaXRBdFlhbWwgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQkNUb0ZpbGUocGx1Z2luOiBCQ1BsdWdpbiwgY3VyckZpbGU/OiBURmlsZSkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgZmlsZSA9IGN1cnJGaWxlID8/IGdldEN1cnJGaWxlKCk7XHJcblxyXG4gIGNvbnN0IHsgbGltaXRXcml0ZUJDQ2hlY2tib3hlcywgd3JpdGVCQ3NJbmxpbmUsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IHN1Y2NJbmZvID0gbWFpbkcubWFwSW5FZGdlcyhmaWxlLmJhc2VuYW1lLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyIH0gPSBhO1xyXG4gICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgIHJldHVybiB7IHN1Y2M6IHMsIGZpZWxkOiBvcHBGaWVsZCB9O1xyXG4gIH0pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgc3VjYywgZmllbGQgfSBvZiBzdWNjSW5mbykge1xyXG4gICAgaWYgKCFsaW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuICAgIGNvbnN0IFt5YW1sLCBhZnRlcllhbWxdID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcblxyXG4gICAgaWYgKCF3cml0ZUJDc0lubGluZSkge1xyXG4gICAgICBjb25zdCBpbm5lciA9IHlhbWwgPT09IFwiXCIgPyB5YW1sIDogeWFtbC5zbGljZSg0LCAtNCk7XHJcbiAgICAgIGNvbnN0IG5ld1lhbWwgPSBjaGFuZ2VZYW1sKGlubmVyLCBmaWVsZCwgc3VjYyk7XHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgLS0tXFxuJHtuZXdZYW1sfVxcbi0tLSR7YWZ0ZXJZYW1sfWA7XHJcbiAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPIENoZWNrIGlmIHRoaXMgbm90ZSBhbHJlYWR5IGhhcyB0aGlzIGZpZWxkXHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPVxyXG4gICAgICAgIHlhbWwgK1xyXG4gICAgICAgICh5YW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYCR7ZmllbGR9OjogW1ske3N1Y2N9XV1gICtcclxuICAgICAgICAoYWZ0ZXJZYW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYWZ0ZXJZYW1sO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJDc1RvQWxsRmlsZXMocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGlmICghcGx1Z2luLnNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgXCJZb3UgZmlyc3QgbmVlZCB0byBlbmFibGUgdGhpcyBjb21tYW5kIGluIEJyZWFkY3J1bWJzJyBzZXR0aW5ncy5cIlxyXG4gICAgKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKFxyXG4gICAgd2luZG93LmNvbmZpcm0oXHJcbiAgICAgIFwiVGhpcyBhY3Rpb24gd2lsbCB3cml0ZSB0aGUgaW1wbGllZCBCcmVhZGNydW1icyBvZiBlYWNoIGZpbGUgdG8gdGhhdCBmaWxlLlxcbkl0IHVzZXMgdGhlIE1ldGFFZGl0IHBsdWdpbnMgQVBJIHRvIHVwZGF0ZSB0aGUgWUFNTCwgc28gaXQgc2hvdWxkIG9ubHkgYWZmZWN0IHRoYXQgZnJvbnRtYXR0ZXIgb2YgeW91ciBub3RlLlxcbkkgY2FuJ3QgcHJvbWlzZSB0aGF0IG5vdGhpbmcgYmFkIHdpbGwgaGFwcGVuLiAqKlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUqKi5cIlxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgaWYgKFxyXG4gICAgICB3aW5kb3cuY29uZmlybShcclxuICAgICAgICBcIkFyZSB5b3Ugc3VyZT8gWW91IGhhdmUgYmVlbiB3YXJuZWQgdGhhdCB0aGlzIG9wZXJhdGlvbiB3aWxsIGF0dGVtcHQgdG8gdXBkYXRlIGFsbCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMuXCJcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh3aW5kb3cuY29uZmlybShcIkZvciByZWFsLCBwbGVhc2UgbWFrZSBhIGJhY2sgdXAgYmVmb3JlLlwiKSkge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBOb3RpY2UoXCJPcGVyYXRpb24gU3RhcnRlZFwiKTtcclxuICAgICAgICBjb25zdCBwcm9ibGVtRmlsZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgd3JpdGVCQ1RvRmlsZShwbHVnaW4sIGZpbGUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBwcm9ibGVtRmlsZXMucHVzaChmaWxlLnBhdGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpY2Uuc2V0TWVzc2FnZShcIk9wZXJhdGlvbiBDb21wbGV0ZVwiKTtcclxuICAgICAgICBpZiAocHJvYmxlbUZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgXCJTb21lIGZpbGVzIHdlcmUgbm90IHVwZGF0ZWQgZHVlIHRvIGVycm9ycy4gQ2hlY2sgdGhlIGNvbnNvbGUgdG8gc2VlIHdoaWNoIG9uZXMuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB3YXJuKHsgcHJvYmxlbUZpbGVzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHsgQkNfRklFTERTX0lORk8gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpZWxkU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxzdHJpbmc+IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXIoXHJcbiAgICBjdXJzb3I6IEVkaXRvclBvc2l0aW9uLFxyXG4gICAgZWRpdG9yOiBFZGl0b3IsXHJcbiAgICBfOiBURmlsZVxyXG4gICk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG4gICAgY29uc3QgbWF0Y2ggPSBzdWIubWF0Y2goL15CQy0oLiopJC8pPy5bMV07XHJcbiAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICBjaDogc3ViLmxhc3RJbmRleE9mKG1hdGNoKSxcclxuICAgICAgICAgIGxpbmU6IGN1cnNvci5saW5lLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcXVlcnk6IG1hdGNoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICByZXR1cm4gQkNfRklFTERTX0lORk8ubWFwKChzdWcpID0+IHN1Zy5maWVsZCkuZmlsdGVyKChzdWcpID0+XHJcbiAgICAgIHN1Zy5pbmNsdWRlcyhxdWVyeSlcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgZWwuY3JlYXRlRGl2KHtcclxuICAgICAgdGV4dDogc3VnZ2VzdGlvbi5yZXBsYWNlKFwiQkMtXCIsIFwiXCIpLFxyXG4gICAgICBjbHM6IFwiQkMtc3VnZ2VzdGVyLWNvbnRhaW5lclwiLFxyXG4gICAgICBhdHRyOiB7XHJcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEJDX0ZJRUxEU19JTkZPLmZpbmQoKGYpID0+IGYuZmllbGQgPT09IHN1Z2dlc3Rpb24pPy5kZXNjLFxyXG4gICAgICAgIFwiYXJpYS1sYWJlbC1wb3NpdGlvblwiOiBcInJpZ2h0XCIsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGNvbnRleHQsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpZWxkID0gQkNfRklFTERTX0lORk8uZmluZCgoZikgPT4gZi5maWVsZCA9PT0gc3VnZ2VzdGlvbik7XHJcbiAgICBjb25zdCByZXBsYWNlbWVudCA9IGAke3N1Z2dlc3Rpb259JHtmaWVsZD8uW2lzSW5zaWRlWWFtbChhcHApID8gXCJhZnRlcllhbWxcIiA6IFwiYWZ0ZXJJbmxpbmVcIl1cclxuICAgICAgfWA7XHJcblxyXG4gICAgY29udGV4dC5lZGl0b3IucmVwbGFjZVJhbmdlKFxyXG4gICAgICByZXBsYWNlbWVudCxcclxuICAgICAgeyBjaDogMCwgbGluZTogY29udGV4dC5zdGFydC5saW5lIH0sXHJcbiAgICAgIGNvbnRleHQuZW5kXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBlc2NhcGVSZWdleCB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZWxhdGlvblN1Z2dlc3RvciBleHRlbmRzIEVkaXRvclN1Z2dlc3Q8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgb25UcmlnZ2VyKFxyXG4gICAgY3Vyc29yOiBFZGl0b3JQb3NpdGlvbixcclxuICAgIGVkaXRvcjogRWRpdG9yLFxyXG4gICAgXzogVEZpbGVcclxuICApOiBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8gfCBudWxsIHtcclxuICAgIGNvbnN0IHRyaWcgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyO1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgLio/JHtlc2NhcGVSZWdleCh0cmlnKX0oLiopJGApO1xyXG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN1Yik/LlsxXTtcclxuXHJcbiAgICBpZiAobWF0Y2ggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGFydDoge1xyXG4gICAgICAgIGNoOiBzdWIubGFzdEluZGV4T2YodHJpZyksXHJcbiAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICBxdWVyeTogbWF0Y2gsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycyB9ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgICByZXR1cm4gZ2V0RmllbGRzKHVzZXJIaWVycykuZmlsdGVyKChzdWcpID0+IHN1Zy5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gIH07XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGVsLmNyZWF0ZURpdih7XHJcbiAgICAgIHRleHQ6IHN1Z2dlc3Rpb24sXHJcbiAgICAgIGNsczogXCJjb2RlYmxvY2stc3VnZ2VzdGlvblwiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBjb250ZXh0LCBwbHVnaW4gfSA9IHRoaXM7XHJcbiAgICBpZiAoIWNvbnRleHQpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHRyaWcgPSBwbHVnaW4uc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcjtcclxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCwgZWRpdG9yIH0gPSBjb250ZXh0O1xyXG5cclxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gc3VnZ2VzdGlvbiArIChpc0luc2lkZVlhbWwoYXBwKSA/IFwiOiBcIiA6IFwiOjogXCIpICsgJ1tbJztcclxuICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcbiAgICAgIHJlcGxhY2VtZW50LFxyXG4gICAgICB7IGNoOiBzdGFydC5jaCArIDEgLSB0cmlnLmxlbmd0aCwgbGluZTogc3RhcnQubGluZSB9LFxyXG4gICAgICBlbmRcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCJzcmMvVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBLb0ZpIGZyb20gXCIuLi9Db21wb25lbnRzL0tvRmkuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZENyZWF0ZUluZGV4U2V0dGluZ3MgfSBmcm9tIFwiLi9DcmVhdGVJbmRleFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZENTVlNldHRpbmdzIH0gZnJvbSBcIi4vQ1NWU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGF0YXZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL0RhdGF2aWV3Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3RlU2V0dGluZ3MgfSBmcm9tIFwiLi9EYXRlTm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlYnVnZ2luZ3NTZXR0aW5ncyB9IGZyb20gXCIuL0RlYnVnZ2luZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlbmRyb25TZXR0aW5ncyB9IGZyb20gXCIuL0RlbmRyb25TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRHZW5lcmFsU2V0dGluZ3MgfSBmcm9tIFwiLi9HZW5lcmFsU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSGllcmFyY2h5Tm90ZVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZEhpZXJhcmNoeVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSnVtcFRvTmV4dFNldHRpbmdzIH0gZnJvbSBcIi4vSnVtcFRvTmV4dFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZE1hdHJpeFZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL01hdHJpeFZpZXdTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGROb1N5c3RlbVNldHRpbmdzIH0gZnJvbSBcIi4vTm9TeXN0ZW1TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRSZWdleE5vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1JlZ2V4Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFJlbGF0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9SZWxhdGlvblNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRhZ05vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1RhZ05vdGVTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRUaHJlYWRpbmdTZXR0aW5ncyB9IGZyb20gXCIuL1RocmVhZGluZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRyYWlsVmlld1NldHRpbmdzIH0gZnJvbSBcIi4vVHJhaWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRWaXNNb2RhbFNldHRpbmdzIH0gZnJvbSBcIi4vVmlzTW9kYWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRXcml0ZUJDc1NldHRpbmdzIH0gZnJvbSBcIi4vV3JpdGVCQ3NTZXR0aW5nc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9IChodG1sOiBzdHJpbmcpID0+XHJcbiAgY3JlYXRlRnJhZ21lbnQoKGZyYWcpID0+IChmcmFnLmNyZWF0ZURpdigpLmlubmVySFRNTCA9IGh0bWwpKTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRWxlbWVudCkgPT5cclxuICBwYXJlbnQuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdWJEZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQpID0+XHJcbiAgcGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICBhdHRyOiB7IHN0eWxlOiBcInBhZGRpbmctbGVmdDogMTBweDtcIiB9LFxyXG4gIH0pXHJcbiAgICAuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiwgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW5cclxuXHJcbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiQnJlYWRjcnVtYnMgU2V0dGluZ3NcIiB9KTtcclxuICAgIGNvbnRhaW5lckVsLmFkZENsYXNzKFwiQkMtc2V0dGluZ3MtdGFiXCIpO1xyXG5cclxuICAgIGFkZEhpZXJhcmNoeVNldHRpbmdzKHBsdWdpbiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkUmVsYXRpb25TZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuICAgIGFkZEdlbmVyYWxTZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgICBjb25zdCB2aWV3RGV0YWlscyA9IGRldGFpbHMoXCJWaWV3c1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcodmlld0RldGFpbHMpXHJcbiAgICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3cyBieSBEZWZhdWx0XCIpXHJcbiAgICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gb3BlbiBvbmxvYWQ8YnIvPk9yZGVyIGlzOiBUcmFpbC9HcmlkL0p1Z2dsLCBNYXRyaXgsIER1Y2tzLCBUcmVlXCIpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsL0dyaWQvSnVnZ2xcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QkNzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5zaG93QkNzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJNYXRyaXggVmlld1wiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJEdWNrcyBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkR1Y2tPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5EdWNrT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgICB0b2dnbGVcclxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiVHJlZSBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkRvd25PbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5Eb3duT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB2aWV3RGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG5cclxuICAgIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIGFkZFRyYWlsVmlld1NldHRpbmdzKHBsdWdpbiwgdmlld0RldGFpbHMpO1xyXG4gICAgYWRkVmlzTW9kYWxTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIC8vIGFkZFRyZWVWaWV3U2V0dGluZ3MocGx1Z2luLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzID0gZGV0YWlscyhcclxuICAgICAgXCJBbHRlcm5hdGl2ZSBIaWVyYXJjaGllc1wiLFxyXG4gICAgICBjb250YWluZXJFbFxyXG4gICAgKTtcclxuXHJcbiAgICBhZGRUYWdOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkUmVnZXhOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkTm9TeXN0ZW1TZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGRIaWVyYXJjaHlOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkQ1NWU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGVuZHJvblNldHRpbmdzKHBsdWdpbiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuICAgIGFkZERhdGF2aWV3U2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGF0ZU5vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgY21kc0RldGFpbHMgPSBkZXRhaWxzKFwiQ29tbWFuZHNcIiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkV3JpdGVCQ3NTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MocGx1Z2luLCBjbWRzRGV0YWlscyk7XHJcbiAgICBhZGRUaHJlYWRpbmdTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZEp1bXBUb05leHRTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgICBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MocGx1Z2luLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IEtvRmkoeyB0YXJnZXQ6IGNvbnRhaW5lckVsIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiPCEtLSBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9IRW1pbGUvanVnZ2wvYmxvYi9tYWluL2p1Z2dsL3VpL0tvRmkuc3ZlbHRlIC0tPlxyXG48c2NyaXB0PlxyXG4gIGxldCBidXR0b247XHJcbiAgY29uc3QgaW5pdGlhbGl6ZUtvZmkgPSAoKSA9PiB7XHJcbiAgICBrb2Zpd2lkZ2V0Mi5pbml0KFxyXG4gICAgICBcIlN1cHBvcnQgQnJlYWRjcnVtYnMgZGV2ZWxvcG1lbnQhXCIsXHJcbiAgICAgIFwiIzI5YWJlMFwiLFxyXG4gICAgICBcIkcyRzQ1NFRaRlwiXHJcbiAgICApO1xyXG4gICAgYnV0dG9uLmlubmVySFRNTCA9IGtvZml3aWRnZXQyLmdldEhUTUwoKTtcclxuICB9O1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdmVsdGU6aGVhZD5cclxuICA8c2NyaXB0XHJcbiAgICB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcclxuICAgIHNyYz1cImh0dHBzOi8va28tZmkuY29tL3dpZGdldHMvd2lkZ2V0XzIuanNcIlxyXG4gICAgb246bG9hZD17aW5pdGlhbGl6ZUtvZml9PlxyXG4gIDwvc2NyaXB0PlxyXG48L3N2ZWx0ZTpoZWFkPlxyXG48ZGl2IGNsYXNzPVwiQkMtS29maS1idXR0b25cIiBiaW5kOnRoaXM9e2J1dHRvbn0gLz5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtS29maS1idXR0b24ge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjbWRzRGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBjcmVhdGVJbmRleERldGFpbHMgPSBzdWJEZXRhaWxzKFwiQ3JlYXRlIEluZGV4XCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3JlYXRlSW5kZXhEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgd2lrbGluayBicmFja2V0c1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gY3JlYXRpbmcgYW4gaW5kZXgsIHNob3VsZCBpdCB3cmFwIHRoZSBub3RlIG5hbWUgaW4gd2lraWxpbmtzIDxjb2RlPltbXV08L2NvZGU+IG9yIG5vdC5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLndpa2lsaW5rSW5kZXgpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLndpa2lsaW5rSW5kZXggPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkluZGVudCBDaGFyYWN0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgJ1RoZSBjaGFyYWN0ZXIocykgdXNlZCB0byBpbmRlbnQgdGhlIGluZGV4LiBUaGVzZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgZWl0aGVyIHNwYWNlcyBvciB0YWJzLiBFbnRlciA8Y29kZT5cXFxcdDwvY29kZT4gdG8gdXNlIHRhYnMuJ1xyXG4gICAgICApKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgYWxpYXNlcyBvZiBub3RlcyBpbiBpbmRleFwiKVxyXG4gICAgLnNldERlc2MoXCJTaG93IHRoZSBhbGlhc2VzIG9mIGVhY2ggbm90ZSBpbiBicmFja2V0cy5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWxpYXNlc0luSW5kZXgpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmFsaWFzZXNJbkluZGV4ID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ1NWU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgY3N2RGV0YWlscyA9IHN1YkRldGFpbHMoXCJDU1YgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3N2RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiQ1NWIEJyZWFkY3J1bWIgUGF0aHNcIilcclxuICAgIC5zZXREZXNjKFwiVGhlIGZpbGUgcGF0aCBvZiBhIGNzdiBmaWxlcyB3aXRoIGJyZWFkY3J1bWJzIGluZm9ybWF0aW9uLlwiKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5DU1ZQYXRocyk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuQ1NWUGF0aHMgPSB0ZXh0LmlucHV0RWwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRhdmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBkdkRldGFpbHMgPSBzdWJEZXRhaWxzKFwiRGF0YXZpZXcgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZHZEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IERhdGF2aWV3IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBEYXRhdmlldyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtZGF0YXZpZXctbm90ZS1maWVsZDoge2ZpZWxkfTwvY29kZT4uPC9icj5JZiB5b3UgZG9uJ3Qgd2FudCB0byBjaG9vc2UgYSBkZWZhdWx0LCBzZWxlY3QgdGhlIGJsYW5rIG9wdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5hZGRPcHRpb24oXCJcIiwgXCJcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7IFwiXCI6IFwiXCIgfTtcclxuICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IChmaWVsZE9wdGlvbnNbZmllbGRdID0gZmllbGQpKTtcclxuXHJcbiAgY29uc3QgZGF0ZU5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIkRhdGUgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGF0ZU5vdGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgRGF0ZSBOb3RlcyB0byBHcmFwaFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiQnJlYWRjcnVtYnMgd2lsbCB0cnkgdG8gbGluayBlYWNoIGRhaWx5IG5vdGUgdG8gdGhlIG5leHQgb25lIHVzaW5nIHRoZSBkYXRlIGZvcm1hdCB5b3UgcHJvdmlkZSBpbiB0aGUgc2V0dGluZ3MgYmVsb3cuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWRkRGF0ZU5vdGVzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hZGREYXRlTm90ZXMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGFpbHkgTm90ZSBGb3JtYXRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgYFRoZSBMdXhvbiBkYXRlIGZvcm1hdCBvZiB5b3VyIGRhaWx5IG5vdGVzLjwvYnI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBMdXhvbiB1c2VzIGRpZmZlcmVudCBmb3JtYXRzIHRvIE1vbWVudCwgc28geW91ciBmb3JtYXQgZm9yIHRoZSBEYWlseSBOb3RlcyBwbHVnaW4gbWF5IG5vdCB3b3JrIGhlcmUuIEJlIHN1cmUgdG8gY2hlY2sgb3V0IDxhIGhyZWY9XCJodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9mb3JtYXR0aW5nP2lkPXRhYmxlLW9mLXRva2Vuc1wiPnRoZSBkb2NzPC9hPiB0byBmaW5kIHRoZSByaWdodCBmb3JtYXQuPGJyPllvdSBjYW4gZXNjYXBlIGNoYXJhY3RlcnMgYnkgd3JhcHBpbmcgdGhlbSBpbiBzaW5nbGUgcXVvdGVzIChlLmcuIDxjb2RlPnl5eXktTU0tZGQgJ0RhaWx5IE5vdGUnPC9jb2RlPilgXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGb3JtYXQpO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRhdGVOb3RlRm9ybWF0ID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHRvIHRvbW9ycm93J3Mgbm90ZSBmcm9tIHRoZSBjdXJyZW50IG5vdGUuIFRoZSBvcHBvc2l0ZSBmaWVsZCB3aWxsIGJlIHVzZWQgdG8gcG9pbnQgdG8geWVzdGVyZGF5J3Mgbm90ZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucylcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAvLyBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgLy8gICAuc2V0TmFtZShcIlBvaW50IHVwIHRvIE1vbnRoXCIpXHJcbiAgLy8gICAuc2V0RGVzYyhcclxuICAvLyAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gIC8vICAgICAgIFwiU2VsZWN0IGEgZmllbGQgdG8gcG9pbnQgdXB3YXJkcyB0byB0aGUgY29ycmVzcG9uZGluZyBtb250aCAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgbW9udGgpLjxicj5MZWF2ZSB0aGUgZHJvcGRvd24gYmxhbmsgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXCJcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAvLyAgICAgZGQuYWRkT3B0aW9ucyhmaWVsZE9wdGlvbnMpO1xyXG4gIC8vICAgICBkZC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAvLyAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUFkZE1vbnRoID0gZmllbGQ7XHJcbiAgLy8gICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gIC8vICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG4gIC8vIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAvLyAgIC5zZXROYW1lKFwiUG9pbnQgdXAgdG8gWWVhclwiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHVwd2FyZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeWVhciAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgeWVhcikuPGJyPkxlYXZlIHRoZSBkcm9wZG93biBibGFuayB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cIlxyXG4gIC8vICAgICApXHJcbiAgLy8gICApXHJcbiAgLy8gICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gIC8vICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucyk7XHJcbiAgLy8gICAgIGRkLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gIC8vICAgICAgIHNldHRpbmdzLmRhdGVOb3RlQWRkWWVhciA9IGZpZWxkO1xyXG4gIC8vICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAvLyAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IGxvZyBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IERlYnVnTGV2ZWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkZXRhaWxzLCBmcmFnV2l0aEhUTUwgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGRlYnVnRGV0YWlscyA9IGRldGFpbHMoXCJEZWJ1Z2dpbmdcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhkZWJ1Z0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlYnVnIE1vZGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTZXQgdGhlIG1pbmltdW0gbGV2ZWwgb2YgZGVidWcgbWVzc2FnZXMgdG8gY29uc29sZSBsb2cuIElmIHlvdSBjaG9vc2UgPGNvZGU+VFJBQ0U8L2NvZGU+LCB0aGVuIGV2ZXJ5dGhpbmcgd2lsbCBiZSBsb2dnZWQuIElmIHlvdSBjaG9vc2UgPGNvZGU+RVJST1I8L2NvZGU+LCB0aGVuIG9ubHkgdGhlIG1vc3QgbmVjZXNzYXJ5IGlzc3VlcyB3aWxsIGJlIGxvZ2dlZC4gPGNvZGU+U0lMRU5UPC9jb2RlPiB3aWxsIHR1cm4gb2ZmIGFsbCBsb2dzLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQpID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMobG9nLmxldmVscykuZm9yRWFjaCgoa2V5KSA9PiBkZC5hZGRPcHRpb24oa2V5LCBrZXkpKTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MuZGVidWdNb2RlKS5vbkNoYW5nZShhc3luYyAodmFsdWU6IERlYnVnTGV2ZWwpID0+IHtcclxuICAgICAgICBsb2cuc2V0TGV2ZWwodmFsdWUpO1xyXG4gICAgICAgIHNldHRpbmdzLmRlYnVnTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgZGVidWdEZXRhaWxzLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogXCJDb25zb2xlIGxvZyBzZXR0aW5nc1wiIH0sIChlbCkgPT4ge1xyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGNvbnNvbGUubG9nKHNldHRpbmdzKSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBNQVRSSVhfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIGNvbnN0IGRlbmRyb25EZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiRGVuZHJvbiBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGVuZHJvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFkZCBEZW5kcm9uIG5vdGVzIHRvIGdyYXBoXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiRGVuZHJvbiBub3RlcyBjcmVhdGUgYSBoaWVyYXJjaHkgdXNpbmcgbm90ZSBuYW1lcy48L2JyPjxjb2RlPm5tYXRoLmFsZ2VicmE8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBhbGdlYnJhLCB3aG9zZSBwYXJlbnQgaXMgPGNvZGU+bWF0aDwvY29kZT4uPC9icj48Y29kZT5ubWF0aC5jYWxjdWx1cy5saW1pdHM8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBsaW1pdHMgd2hvc2UgcGFyZW50IGlzIHRoZSBub3RlIDxjb2RlPm1hdGguY2FsY3VsdXM8L2NvZGU+LCB0aGUgcGFyZW50IG9mIHdoaWNoIGlzIDxjb2RlPm1hdGg8L2NvZGU+LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFkZERlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWRkRGVuZHJvbk5vdGVzID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhkZW5kcm9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVsaW1pdGVyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiV2hpY2ggZGVsaW1pdGVyIHNob3VsZCBCcmVhZGNydW1icyBsb29rIGZvcj8gVGhlIGRlZmF1bHQgaXMgPGNvZGU+LjwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRlbGltaXRlclwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICh2YWx1ZSkgc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIgPSB2YWx1ZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoYFRoZSBkZWxpbWl0ZXIgY2FuJ3QgYmUgYmxhbmtgKTtcclxuICAgICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRGVsaW1pdGVyID0gREVGQVVMVF9TRVRUSU5HUy5kZW5kcm9uTm90ZURlbGltaXRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJUcmltIERlbmRyb24gTm90ZSBOYW1lc1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gZGlzcGxheWluZyBhIGRlbmRyb24gbm90ZSBuYW1lLCBzaG91bGQgaXQgYmUgdHJpbW1lZCB0byBvbmx5IHNob3cgdGhlIGxhc3QgaXRlbSBpbiB0aGUgY2hhaW4/PC9icj5lLmcuIDxjb2RlPkEuQi5DPC9jb2RlPiBcdTIxOTIgPGNvZGU+QzwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudHJpbURlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudHJpbURlbmRyb25Ob3RlcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZW5kcm9uIE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFwiV2hpY2ggZmllbGQgc2hvdWxkIEJyZWFkY3J1bWJzIHVzZSBmb3IgRGVuZHJvbiBub3Rlcz9cIilcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZUZpZWxkKTtcclxuXHJcbiAgICAgIGRkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRmllbGQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZGV0YWlscywgZnJhZ1dpdGhIVE1MIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkR2VuZXJhbFNldHRpbmdzKHBsdWdpbjogQkNQbHVnaW4sIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBnZW5lcmFsRGV0YWlscyA9IGRldGFpbHMoXCJHZW5lcmFsIE9wdGlvbnNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiUmVmcmVzaCBJbmRleCBvbiBOb3RlIENoYW5nZVwiKVxyXG4gICAgLnNldERlc2MoZnJhZ1dpdGhIVE1MKFxyXG4gICAgICBcIlJlZnJlc2ggdGhlIEJyZWFkY3J1bWJzIGluZGV4IGRhdGEgZXZlcnl0aW1lIHlvdSBjaGFuZ2Ugbm90ZXMuPC9icj48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgY2FuIGJlIHZlcnkgc2xvdyBvbiBsYXJnZSB2YXVsdHMuXCIpXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlZnJlc2ggSW5kZXggT24gTm90ZSBTYXZlXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlU2F2ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVmcmVzaE9uTm90ZVNhdmUgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBSZWZyZXNoIEluZGV4IE5vdGljZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBSZWZyZXNoaW5nIEluZGV4LCBzaG91bGQgaXQgc2hvdyBhIG5vdGljZSBvbmNlIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dSZWZyZXNoTm90aWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVmcmVzaE5vdGljZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBbGlhcyBGaWVsZHNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpZWxkcyB1c2VkIHRvIHNwZWNpZnkgYWxpYXNlcy4gVGhlc2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCwgaW4gb3JkZXIsIHRvIGRpc3BsYXkgYW4gYWx0ZXJuYXRlIG5vdGUgdGl0bGUgaW4gZGlmZmVyZW50IHZpZXdzLjwvYnI+VGhpcyBmaWVsZCB3aWxsIHByb2JhYmx5IGJlIDxjb2RlPmFsaWFzPC9jb2RlPiBvciA8Y29kZT5hbGlhc2VzPC9jb2RlPiwgYnV0IGl0IGNhbiBiZSBhbnl0aGluZywgbGlrZSA8Y29kZT50aXRsZTwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5hbHRMaW5rRmllbGRzLmpvaW4oXCIsIFwiKSk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWx0TGlua0ZpZWxkcyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT25seSBzaG93IGZpcnN0IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJJZiBhIG5vdGUgaGFzIGFuIGFsaWFzICh1c2luZyB0aGUgZmllbGRzIGluIHRoZSBzZXR0aW5nIGFib3ZlKSwgc2hvdWxkIG9ubHkgdGhlIGZpcnN0IG9uZSBiZSBzaG93bj9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoIXNldHRpbmdzLnNob3dBbGxBbGlhc2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QWxsQWxpYXNlcyA9ICF2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVXNlIHlhbWwgb3IgaW5saW5lIGZpZWxkcyBmb3IgaGllcmFyY2h5IGRhdGFcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgbWFrZSBpdCdzIGhpZXJhcmNoeSB1c2luZyB5YW1sIGZpZWxkcywgYW5kIGlubGluZSBEYXRhdmlldyBmaWVsZHMuXFxuSWYgdGhpcyBpcyBkaXNhYmxlZCwgaXQgd2lsbCBvbmx5IHVzZSBKdWdnbCBsaW5rcyAoU2VlIGJlbG93KS5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudXNlQWxsTWV0YWRhdGEpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnVzZUFsbE1ldGFkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlVzZSBKdWdnbCBsaW5rIHN5bnRheCB3aXRob3V0IGhhdmluZyBKdWdnbCBpbnN0YWxsZWQuXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdTaG91bGQgQnJlYWRjcnVtYnMgbG9vayBmb3IgPGEgaHJlZj1cImh0dHBzOi8vanVnZ2wuaW8vTGluaytUeXBlc1wiIGFyaWEtbGFiZWw9XCJodHRwczovL2p1Z2dsLmlvL0xpbmsrVHlwZXNcIj5KdWdnbCBsaW5rczwvYT4gZXZlbiBpZiB5b3UgZG9uXFwndCBoYXZlIEp1Z2dsIGluc3RhbGxlZD8gSWYgeW91IGRvIGhhdmUgSnVnZ2wgaW5zdGFsbGVkLCBpdCB3aWxsIGFsd2F5cyBsb29rIGZvciBKdWdnbCBsaW5rcy4nXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5wYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgRmllbGQgU3VnZ2VzdG9yXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdBbG90IG9mIEJyZWFkY3J1bWJzIGZlYXR1cmVzIHJlcXVpcmUgYSBtZXRhZGF0YSAob3IgaW5saW5lIERhdGF2aWV3KSBmaWVsZCB0byB3b3JrLiBGb3IgZXhhbXBsZSwgYEJDLWZvbGRlci1ub3RlYC48L2JyPlRoZSBGaWVsZCBTdWdnZXN0b3Igd2lsbCBzaG93IGFuIGF1dG9jb21wbGV0ZSBtZW51IHdpdGggYWxsIGF2YWlsYWJsZSBCcmVhZGNydW1icyBmaWVsZCBvcHRpb25zIHdoZW4geW91IHR5cGUgPGNvZGU+QkMtPC9jb2RlPiBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLidcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuZmllbGRTdWdnZXN0b3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmZpZWxkU3VnZ2VzdG9yID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRW5hYmxlIFJlbGF0aW9uIFN1Z2dlc3RvclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkVuYWJsZSBhbiBlZGl0b3Igc3VnZ2VzdG9yIHdoaWNoIGdldHMgdHJpZ2dlcmVkIGJ5IGEgY3VzdG9tIHN0cmluZyB0byBzaG93IGEgbGlzdCBvZiByZWxhdGlvbnMgZnJvbSB5b3VyIGhpZXJhcmNoaWVzIHRvIGluc2VydC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJSZWxhdGlvbiBTdWdnZXN0b3IgVHJpZ2dlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBzdHJpbmcgdXNlZCB0byB0cmlnZ2VyIHRoZSByZWxhdGlvbiBzdWdnZXN0b3IuIERlZmF1bHQgaXMgPGNvZGU+XFxcXDwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIGlmIChhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3ICE9PSB1bmRlZmluZWQpIHtcclxuICAgIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgICAuc2V0TmFtZShcIkRhdGF2aWV3IFdhaXQgVGltZVwiKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICAnRW50ZXIgYW4gaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgRGF0YXZpZXcgSW5kZXggdG8gbG9hZC4gVGhlIGxhcmdlciB5b3VyIHZhdWx0LCB0aGUgbG9uZ2VyIGl0IHdpbGwgdGFrZS4gVGhlIGRlZmF1bHQgaXMgNSBzZWNvbmRzLidcclxuICAgICAgKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWNvbmRzXCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoKHNldHRpbmdzLmR2V2FpdFRpbWUgLyAxMDAwKS50b1N0cmluZygpKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG51bSA+IDApIHtcclxuICAgICAgICAgICAgICBzZXR0aW5ncy5kdldhaXRUaW1lID0gbnVtICogMTAwMDtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlRoZSBpbnRlcnZhbCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhpZXJhcmNoeU5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBoaWVyYXJjaHlOb3RlRGV0YWlscyA9IHN1YkRldGFpbHMoXHJcbiAgICBcIkhpZXJhcmNoeSBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBub3RlcyB1c2VkIHRvIGNyZWF0ZSBleHRlcm5hbCBCcmVhZGNydW1iIHN0cnVjdHVyZXMuPGJyPllvdSBjYW4gYWxzbyBwb2ludCB0byBhIDxlbT5mb2xkZXI8L2VtPiBvZiBoaWVyYXJjaHkgbm90ZXMgYnkgZW50ZXJpbmcgPGNvZGU+Zm9sZGVyTmFtZS88L2NvZGU+IChlbmRpbmcgd2l0aCBhIDxjb2RlPi88L2NvZGU+KS48YnI+SGllcmFyY2h5IG5vdGUgbmFtZXMgYW5kIGZvbGRlcnMgb2YgaGllcmFyY2h5IG5vdGVzIGNhbiBib3RoIGJlIGVudGVyZWQgaW4gdGhlIHNhbWUgY29tbWEtc2VwYXJhdGVkIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmhpZXJhcmNoeU5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG5cclxuICAgICAgICBzZXR0aW5ncy5oaWVyYXJjaHlOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZSgnSGllcmFyY2h5IG5vdGUgaXMgcGFyZW50IG9mIHRvcC1sZXZlbCBpdGVtcycpXHJcbiAgICAuc2V0RGVzYygnU2hvdWxkIHRoZSBhY3R1YWwgaGllcmFyY2h5IG5vdGUgYmUgdHJlYXRlZCBhcyB0aGUgcGFyZW50IG9mIGFsbCB0aGUgdG9wLWxldmVsIGl0ZW1zIGluIHRoZSBsaXN0PyBcdTI3MDUgPSBZZXMsIFx1Mjc0QyA9IE5vJylcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaGllcmFyY2h5Tm90ZUlzUGFyZW50KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmhpZXJhcmNoeU5vdGVJc1BhcmVudCA9IHZhbHVlXHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgSGllcmFyY2h5IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBoaWVyYXJjaHkgbm90ZXMgdXNlIHRoZSBmaXJzdCA8Y29kZT51cDwvY29kZT4gZmllbGQgaW4geW91ciBoaWVyYXJjaGllcy4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdC4gSWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBjb25zdCB1cEZpZWxkcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMsIFwidXBcIik7XHJcblxyXG4gICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgIHVwRmllbGRzLmZvckVhY2goXHJcbiAgICAgICAgKGZpZWxkKSA9PiAob3B0aW9uc1tmaWVsZF0gPSBmaWVsZClcclxuICAgICAgKTtcclxuICAgICAgZGQuYWRkT3B0aW9ucyhvcHRpb25zKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ITlVwRmllbGQgfHwgdXBGaWVsZHNbMF0pXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuSE5VcEZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCBGYUxpc3RVbCBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhTGlzdFVsLnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCBGYVBsdXMgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVBsdXMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IEZhUmVnVHJhc2hBbHQgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1RyYXNoQWx0LnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIGJsYW5rVXNlckhpZXIsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBVc2VySGllciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgeyBzcGxpdEFuZFRyaW0sIHN3YXBJdGVtcyB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBoaWVyVG9TdHIgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBjdXJySGllcnMgPSBbLi4ucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVyc107XHJcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKGN1cnJIaWVyczogVXNlckhpZXJbXSkge1xyXG4gICAgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyA9IGN1cnJIaWVycztcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtQnV0dG9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBhcmlhLWxhYmVsPVwiQWRkIE5ldyBIaWVyYXJjaHlcIlxyXG4gICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4gKGN1cnJIaWVycyA9IFsuLi5jdXJySGllcnMsIGJsYW5rVXNlckhpZXIoKV0pfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVBsdXMgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgYXJpYS1sYWJlbD1cIlJlc2V0IEFsbCBIaWVyYXJjaGllc1wiXHJcbiAgICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IGFsbCBoaWVyYXJjaGllcz9cIikpIHtcclxuICAgICAgICAgIGN1cnJIaWVycyA9IFtdO1xyXG4gICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVJlZ1RyYXNoQWx0IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJTaG93IEhpZXJhcmNoaWVzXCJcclxuICAgICAgb246Y2xpY2s9eygpID0+IG5ldyBOb3RpY2UoY3VyckhpZXJzLm1hcChoaWVyVG9TdHIpLmpvaW4oXCJcXG5cXG5cIikpfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYUxpc3RVbCAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2VhY2ggY3VyckhpZXJzIGFzIGhpZXIsIGl9XHJcbiAgICA8ZGV0YWlscyBjbGFzcz1cIkJDLUhpZXItRGV0YWlsc1wiPlxyXG4gICAgICA8c3VtbWFyeT5cclxuICAgICAgICB7RElSRUNUSU9OUy5tYXAoKGRpcikgPT4gaGllcltkaXJdPy5qb2luKFwiLCBcIikgPz8gXCJcIilcclxuICAgICAgICAgIC5tYXAoKGRpckZpZWxkcykgPT4gYCgke2RpckZpZWxkc30pYClcclxuICAgICAgICAgIC5qb2luKFwiIFwiKX1cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJCQy1CdXR0b25zXCI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEFib3ZlXCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSAtIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5MVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEJlbG93XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSArIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5M1xyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgSGllcmFyY2h5XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRIaWVyID0gY3VyckhpZXJzLnNwbGljZShpLCAxKVswXTtcclxuICAgICAgICAgICAgICBvbGRIaWVyLnVwLmZvckVhY2goKHVwRmllbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMuaW5kZXhPZih1cEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBESVJFQ1RJT05TLmZvckVhY2goKGRpcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2xkSGllcltkaXJdLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4SSA9IHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5kZXhPZihmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleEkgPiAtMSlcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnNwbGljZShpbmRleEksIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhKID0gc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5pbmRleE9mKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SiA+IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuc3BsaWNlKGluZGV4SiwgMSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgY3VyckhpZXJzID0gY3VyckhpZXJzO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZShjdXJySGllcnMpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBYXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgeyNlYWNoIERJUkVDVElPTlMgYXMgZGlyfVxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJCQy1BcnJvdy1MYWJlbFwiIGZvcj17ZGlyfT5cclxuICAgICAgICAgICAge0FSUk9XX0RJUkVDVElPTlNbZGlyXX1cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBzaXplPVwiMjBcIlxyXG4gICAgICAgICAgICBuYW1lPXtkaXJ9XHJcbiAgICAgICAgICAgIHZhbHVlPXtoaWVyW2Rpcl0/LmpvaW4oXCIsIFwiKSA/PyBcIlwifVxyXG4gICAgICAgICAgICBvbjpjaGFuZ2U9e2FzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBbmRUcmltKHZhbHVlKTtcclxuICAgICAgICAgICAgICBjdXJySGllcnNbaV1bZGlyXSA9IHNwbGl0cztcclxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuXHJcbiAgICAgICAgICAgICAgc3BsaXRzLmZvckVhY2goKHNwbGl0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIGRpciA9PT0gXCJ1cFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICFzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5pbmNsdWRlcyhzcGxpdClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMucHVzaChzcGxpdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5jbHVkZXMoc3BsaXQpKVxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnB1c2goc3BsaXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5saW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKHNwbGl0KSlcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5wdXNoKHNwbGl0KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2VhY2h9XHJcbiAgICA8L2RldGFpbHM+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBsYWJlbC5CQy1BcnJvdy1MYWJlbCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMjBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuICBkaXYuQkMtQnV0dG9ucyB7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xyXG4gIH1cclxuXHJcbiAgZGV0YWlscy5CQy1IaWVyLURldGFpbHMge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHggNXB4IDEwcHggMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XHJcbiAgfVxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeTo6bWFya2VyIHtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICB9XHJcblxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeSBidXR0b24ge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDNweDtcclxuICAgIHdpZHRoOiAxN3B4O1xyXG4gICAgaGVpZ2h0OiAxN3B4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgIjxzY3JpcHQ+XG4gIGV4cG9ydCBsZXQgdGl0bGUgPSBudWxsO1xuICBleHBvcnQgbGV0IHZpZXdCb3g7XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuICBzdmcge1xuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcbiAgICBzdHJva2Utd2lkdGg6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH0gIFxuPC9zdHlsZT5cblxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIge3ZpZXdCb3h9PlxuICB7I2lmIHRpdGxlfVxuICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT5cbiAgey9pZn1cbiAgPHNsb3QgLz5cbjwvc3ZnPlxuIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDggNDhhNDggNDggMCAxIDAgNDggNDggNDggNDggMCAwIDAtNDgtNDh6bTAgMTYwYTQ4IDQ4IDAgMSAwIDQ4IDQ4IDQ4IDQ4IDAgMCAwLTQ4LTQ4em0wIDE2MGE0OCA0OCAwIDEgMCA0OCA0OCA0OCA0OCAwIDAgMC00OC00OHptNDQ4IDE2SDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZ2LTMyYTE2IDE2IDAgMCAwLTE2LTE2em0wLTMyMEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2VjgwYTE2IDE2IDAgMCAwLTE2LTE2em0wIDE2MEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2di0zMmExNiAxNiAwIDAgMC0xNi0xNnpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA0NDggNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDE2IDIwOEgyNzJWNjRjMC0xNy42Ny0xNC4zMy0zMi0zMi0zMmgtMzJjLTE3LjY3IDAtMzIgMTQuMzMtMzIgMzJ2MTQ0SDMyYy0xNy42NyAwLTMyIDE0LjMzLTMyIDMydjMyYzAgMTcuNjcgMTQuMzMgMzIgMzIgMzJoMTQ0djE0NGMwIDE3LjY3IDE0LjMzIDMyIDMyIDMyaDMyYzE3LjY3IDAgMzItMTQuMzMgMzItMzJWMzA0aDE0NGMxNy42NyAwIDMyLTE0LjMzIDMyLTMydi0zMmMwLTE3LjY3LTE0LjMzLTMyLTMyLTMyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk0yNjggNDE2aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyek00MzIgODBoLTgyLjQxbC0zNC01Ni43QTQ4IDQ4IDAgMCAwIDI3NC40MSAwSDE3My41OWE0OCA0OCAwIDAgMC00MS4xNiAyMy4zTDk4LjQxIDgwSDE2QTE2IDE2IDAgMCAwIDAgOTZ2MTZhMTYgMTYgMCAwIDAgMTYgMTZoMTZ2MzM2YTQ4IDQ4IDAgMCAwIDQ4IDQ4aDI4OGE0OCA0OCAwIDAgMCA0OC00OFYxMjhoMTZhMTYgMTYgMCAwIDAgMTYtMTZWOTZhMTYgMTYgMCAwIDAtMTYtMTZ6TTE3MS44NCA1MC45MUE2IDYgMCAwIDEgMTc3IDQ4aDk0YTYgNiAwIDAgMSA1LjE1IDIuOTFMMjkzLjYxIDgwSDE1NC4zOXpNMzY4IDQ2NEg4MFYxMjhoMjg4em0tMjEyLTQ4aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiaW1wb3J0IFVzZXJIaWVyYXJjaGllcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9Vc2VySGllcmFyY2hpZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRIaWVyYXJjaHlTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCBmaWVsZERldGFpbHMgPSBkZXRhaWxzKFwiSGllcmFyY2hpZXNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiSGVyZSB5b3UgY2FuIHNldCB1cCBkaWZmZXJlbnQgaGllcmFyY2hpZXMgeW91IHVzZSBpbiB5b3VyIHZhdWx0LiBUbyBhZGQgYSBuZXcgaGllcmFyY2h5LCBjbGljayB0aGUgcGx1cyBidXR0b24uIFRoZW4sIGZpbGwgaW4gdGhlIGZpZWxkIG5hbWVzIG9mIHlvdXIgaGllcmFjaHkgaW50byB0aGUgNSBib3hlcyB0aGF0IGFwcGVhci5cIixcclxuICB9KTtcclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiRm9yIGVhY2ggZGlyZWN0aW9uLCB5b3UgY2FuIGVudGVyIG11bHRpcGxlIGZpZWxkIG5hbWVzIGluIGEgY29tbWEtc2VwZXJhdGVkIGxpc3QuIEZvciBleGFtcGxlOiBgcGFyZW50LCBicm9hZGVyLCB1cHBlcmBcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IFVzZXJIaWVyYXJjaGllcyh7XHJcbiAgICB0YXJnZXQ6IGZpZWxkRGV0YWlscyxcclxuICAgIHByb3BzOiB7IHBsdWdpbiB9LFxyXG4gIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgc2V0dGluZ05hbWU6IHN0cmluZztcclxuICBleHBvcnQgbGV0IG9wdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBzZWxlY3RlZCA9IHNldHRpbmdzW3NldHRpbmdOYW1lXTtcclxuXHJcbiAgJDogdG9Ob25lID0gc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBzYXZlKCkge1xyXG4gICAgaWYgKHNldHRpbmdzW3NldHRpbmdOYW1lXSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICByZXR1cm4gd2FybihzZXR0aW5nTmFtZSArIFwiIG5vdCBmb3VuZCBpbiBCQyBzZXR0aW5nc1wiKTtcclxuXHJcbiAgICBzZXR0aW5nc1tzZXR0aW5nTmFtZV0gPSBzZWxlY3RlZDtcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2PlxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0b05vbmUpIHNlbGVjdGVkID0gW107XHJcbiAgICAgIGVsc2Ugc2VsZWN0ZWQgPSBvcHRpb25zO1xyXG4gICAgICBhd2FpdCBzYXZlKCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIFNlbGVjdCB7dG9Ob25lID8gXCJOb25lXCIgOiBcIkFsbFwifVxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgeyNlYWNoIG9wdGlvbnMgYXMgb3B0aW9ufVxyXG4gICAgPGRpdj5cclxuICAgICAgPGxhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIHZhbHVlPXtvcHRpb259XHJcbiAgICAgICAgICBiaW5kOmdyb3VwPXtzZWxlY3RlZH1cclxuICAgICAgICAgIG9uOmNoYW5nZT17YXN5bmMgKCkgPT4gYXdhaXQgc2F2ZSgpfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge29wdGlvbn1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLmdyaWQge1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTAwcHgsIDFmcikpO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1bXBUb05leHRTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGp1bXBUb0RpckRldGFpbHMgPSBzdWJEZXRhaWxzKFwiSnVtcCB0byBOZXh0IERpcmVjdGlvblwiLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gIGp1bXBUb0RpckRldGFpbHMuY3JlYXRlRGl2KHsgY2xzOiAnc2V0dGluZy1pdGVtLW5hbWUnLCB0ZXh0OiAnTGltaXQgd2hpY2ggZmllbGRzIHRvIGp1bXAgdG8nIH0pXHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDoganVtcFRvRGlyRGV0YWlscyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRKdW1wVG9GaXJzdEZpZWxkc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuVmlldyB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHsgTUFUUklYX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IE1MVmlld0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiTWF0cml4IFZpZXdcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93IGFsbCBmaWVsZCBuYW1lcyBvciBqdXN0IHJlbGF0aW9uIHR5cGVzXCIpXHJcbiAgICAuc2V0RGVzYyhmcmFnV2l0aEhUTUwoXHJcbiAgICAgIFwiU2hvdyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBmaWVsZHMgZm9yIGVhY2ggcmVsYXRpb24gdHlwZSAoZS5nLiA8Y29kZT5wYXJlbnQsIGJyb2FkZXIsIHVwcGVyPC9jb2RlPiksIG9yIGp1c3QgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHR5cGUsIGkuZS4gJzxjb2RlPlBhcmVudDwvY29kZT4nLCAnPGNvZGU+U2libGluZzwvY29kZT4nLCAnPGNvZGU+Q2hpbGQ8L2NvZGU+Jy48L2JyPlx1MjcwNSA9IHNob3cgdGhlIGZ1bGwgbGlzdC5cIilcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dOYW1lT3JUeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93TmFtZU9yVHlwZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgUmVsYXRpb25zaGlwIFR5cGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHdoZXRoZXIgYSBsaW5rIGlzIHJlYWwgb3IgaW1wbGllZC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGlyZWN0aW9ucyBPcmRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgQ2hhbmdlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aW9ucyBhcHBlYXIgaW4gdGhlIE1hdHJpeCB2aWV3LjwvYnI+VGhlIGRlZmF1bHQgaXMgXCJ1cCwgc2FtZSwgZG93biwgbmV4dCwgcHJldlwiICg8Y29kZT4wMTIzNDwvY29kZT4pLlxyXG4gICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICA8bGk+MCBcdTIxOTIgdXA8L2xpPlxyXG4gICAgICAgICAgICA8bGk+MSBcdTIxOTIgc2FtZTwvbGk+XHJcbiAgICAgICAgICAgIDxsaT4yIFx1MjE5MiBkb3duPC9saT5cclxuICAgICAgICAgICAgPGxpPjMgXHUyMTkyIG5leHQ8L2xpPlxyXG4gICAgICAgICAgICA8bGk+NCBcdTIxOTIgcHJldjwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgY2FuIHJlbW92ZSBudW1iZXJzIHRvIGhpZGUgdGhvc2UgZGlyZWN0aW9ucyBpbiB0aGUgTWF0cml4IFZpZXcuIEZvciBleGFtcGxlLCA8Y29kZT4wMjwvY29kZT4gd2lsbCBvbmx5IHNob3cgdXAgYW5kIGRvd24sIGluIHRoYXQgb3JkZXIuYFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnNxdWFyZURpcmVjdGlvbnNPcmRlci5qb2luKFwiXCIpKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdChcIlwiKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPD0gNSAmJlxyXG4gICAgICAgICAgdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gW1wiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0uaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc3F1YXJlRGlyZWN0aW9uc09yZGVyID0gdmFsdWVzLm1hcCgob3JkZXIpID0+XHJcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUludChvcmRlcilcclxuICAgICAgICAgICkgYXMgKDAgfCAxIHwgMiB8IDMgfCA0KVtdO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgICdUaGUgdmFsdWUgbXVzdCBiZSBhIDUgZGlnaXQgbnVtYmVyIHVzaW5nIG9ubHkgdGhlIGRpZ2l0cyBcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCInXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgQWxwYWhlYnRpY2FsIFNvcnRpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkJ5IGRlZmF1bHQsIGl0ZW1zIGluIHRoZSBNYXRyaXggdmlldyBhcmUgc29ydGVkIGJ5IHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB5b3VyIG5vdGVzLiBUb2dnbGUgdGhpcyBvbiB0byBlbmFibGUgYWxwaGFiZXRpY2FsIHNvcnRpbmcuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZUFscGhhU29ydCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZW5hYmxlQWxwaGFTb3J0ID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgLy8gVE9ETyBoaWRlIHRoaXMgc2V0dGluZyBpZiAhZW5hYmxlQWxwaGFTb3J0XHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBBbHBoYWJldGljYWxseSBBc2NlbmRpbmcvRGVzY2VuZGluZ1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiU29ydCBzcXVhcmUgaXRlbXMgYWxwaGFiZXRpY2FsbHkgaW4gQXNjZW5kaW5nIChcdTI3MDUpIG9yIERlc2NlbmRpbmcgKFx1Mjc0Qykgb3JkZXIuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFscGhhU29ydEFzYykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWxwaGFTb3J0QXNjID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBieSBub3RlIG5hbWUsIGJ1dCBzaG93IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJXaGVuIHRoaXMgaXMgdHVybmVkIG9mZiwgbm90ZXMgd2lsbCBmaXJzdCBiZSBzb3J0ZWQgYnkgdGhlaXIgYWxpYXMsIGFuZCB0aGVuIGJ5IHRoZWlyIG5hbWUgaWYgbm8gYWxpYXMgaXMgZm91bmQuIFR1cm4gdGhpcyBvbiB0byBzb3J0IGJ5IG5vdGUgbmFtZSBhbHdheXMsIGJ1dCBzdGlsbCBzaG93IHRoZSBhbGlhcyBpbiB0aGUgcmVzdWx0cy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgSW1wbGllZCBSZWxhdGlvbnNcIilcclxuICAgIC5zZXREZXNjKFwiV2hldGhlciBvciBub3QgdG8gc2hvdyBpbXBsaWVkIHJlbGF0aW9ucyBhdCBhbGwuXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93SW1wbGllZFJlbGF0aW9ucykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0ltcGxpZWRSZWxhdGlvbnMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAvLyBUT0RPIEkgZG9uJ3QgdGhpbmsgdGhpcyBzZXR0aW5nIHdvcmtzIGFueW1vcmUuIEkgcmVtb3ZlZCBpdCdzIGZ1bmN0aW9uYWxpdHkgd2hlbiBhZGRpbmcgbXVsdGlwbGUgaGllcmFyY2hpZXNcclxuICAvLyBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gIC8vICAgLnNldE5hbWUoXCJGaWx0ZXIgSW1wbGllZCBTaWJsaW5nc1wiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBgSW1wbGllZCBzaWJsaW5ncyBhcmU6XHJcbiAgLy8gICAgICAgICA8b2w+XHJcbiAgLy8gICAgICAgICAgIDxsaT5ub3RlcyB3aXRoIHRoZSBzYW1lIHBhcmVudCwgb3I8L2xpPlxyXG4gIC8vICAgICAgICAgICA8bGk+bm90ZXMgdGhhdCBhcmUgcmVhbCBzaWJsaW5ncy48L2xpPlxyXG4gIC8vICAgICAgICAgPC9vbD5cclxuICAvLyAgICAgICAgIFRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gdHlwZSAxIGltcGxpZWQgc2libGluZ3MuIElmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgZmlsdGVyIHR5cGUgMSBpbXBsaWVkIHNpYmxpbmdzIHNvIHRoYXQgdGhleSBub3Qgb25seSBzaGFyZSB0aGUgc2FtZSBwYXJlbnQsIGJ1dCB0aGUgcGFyZW50IHJlbGF0aW9uIGhhcyB0aGUgZXhhY3Qgc2FtZSB0eXBlLiBGb3IgZXhhbXBsZSwgdGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXBhcmVudC0+IEE8L2NvZGU+IGNyZWF0ZSBhbiBpbXBsaWVkIHNpYmxpbmcgYmV0d2VlbiBCIGFuZCBDICh0aGV5IGhhdmUgdGhlIHNhbWUgcGFyZW50LCBBKS4gVGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXVwLT4gQTwvY29kZT4gY3JlYXRlIGFuIGltcGxpZWQgc2libGluZyBiZXR3ZWVuIEIgYW5kIEMgKHRoZXkgYWxzbyBoYXZlIHRoZSBzYW1lIHBhcmVudCwgQSkuIEJ1dCBpZiB0aGlzIHNldHRpbmcgaXMgdHVybmVkIG9uLCB0aGUgc2Vjb25kIGltcGxpZWQgc2libGluZyB3b3VsZCBub3Qgc2hvdywgYmVjYXVzZSB0aGUgcGFyZW50IHR5cGVzIGFyZSBkaWZmZXJuZXQgKHBhcmVudCB2ZXJzdXMgdXApLmBcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gIC8vICAgICB0b2dnbGVcclxuICAvLyAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlcylcclxuICAvLyAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgLy8gICAgICAgICBzZXR0aW5ncy5maWx0ZXJJbXBsaWVkU2libGluZ3NPZkRpZmZlcmVudFR5cGVzID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3IGluIFJpZ2h0IG9yIExlZnQgc2lkZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBsb2FkaW5nIHRoZSBtYXRyaXggdmlldywgc2hvdWxkIGl0IG9wZW4gb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBsZWFmPyBcdTI3MDUgPSBSaWdodCwgXHUyNzRDID0gTGVmdC5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucmxMZWFmKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5ybExlYWYgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXBwLndvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgIGF3YWl0IG9wZW5WaWV3KFxyXG4gICAgICAgICAgYXBwLFxyXG4gICAgICAgICAgTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgICBNYXRyaXhWaWV3LFxyXG4gICAgICAgICAgdmFsdWUgPyBcInJpZ2h0XCIgOiBcImxlZnRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBzdHJUb1JlZ2V4IH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vU3lzdGVtU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG5cclxuICBjb25zdCBub1N5c3RlbURldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJOYW1pbmcgU3lzdGVtXCIsXHJcbiAgICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHNcclxuICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gUmVnZXhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB5b3UgbmFtZSB5b3VyIG5vdGVzIHVzaW5nIHRoZSBKb2hubnkgRGVjaW1hbCBTeXN0ZW0gb3IgYSByZWxhdGVkIHN5c3RlbSwgZW50ZXIgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgbmFtaW5nIHN5c3RlbSB5b3UgdXNlLiBUaGUgcmVnZXggc2hvdWxkIG9ubHkgbWF0Y2ggdGhlIG5hbWluZyBzeXN0ZW0gcGFydCBvZiB0aGUgbmFtZSwgbm90IHRoZSBhY3R1YWwgbm90ZSB0aXRsZS48L2JyPiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSB0aGUgSm9obm55IERlY2ltYWwgU3lzdGVtLCB5b3UgbWlnaHQgdXNlIDxjb2RlPi9eXFxcXGRcXFxcLlxcXFxkXFxcXC5cXFxcdy9nPC9jb2RlPiB0byBtYXRjaCB0aGUgbm90ZSBuYW1lZCA8Y29kZT4xLjIuYSBDYXJzPC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHN0clRvUmVnZXgodmFsdWUpKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXCJJbnZhbGlkIFJlZ2V4XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKG5vU3lzdGVtRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmFtaW5nIFN5c3RlbSBEZWxpbWl0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJXaGF0IGNoYXJhY3RlciBkbyB5b3UgdXNlIHRvIHNwbGl0IHVwIHlvdXIgbmFtaW5nIGNvbnZlbnRpb24/IEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIDxjb2RlPjEuMi5hLmI8L2NvZGU+LCB0aGVuIHlvdXIgZGVsaW1pdGVyIGlzIGEgcGVyaW9kICg8Y29kZT4uPC9jb2RlPikuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1TcGxpdCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgc2V0dGluZ3MubmFtaW5nU3lzdGVtU3BsaXQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcobm9TeXN0ZW1EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJOYW1pbmcgU3lzdGVtIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcIldoaWNoIGZpZWxkIHNob3VsZCBCcmVhZGNydW1icyB1c2UgZm9yIE5hbWluZyBTeXN0ZW0gbm90ZXM/XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkKSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGRkLmFkZE9wdGlvbihmaWVsZCwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MubmFtaW5nU3lzdGVtRmllbGQpO1xyXG4gICAgICBkZC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gRW5kcyB3aXRoIERlbGltaXRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkRvZXMgeW91ciBuYW1pbmcgY29udmVudGlvbiBlbmQgd2l0aCB0aGUgZGVsaW1pdGVyPyBGb3IgZXhhbXBsZSwgPGNvZGU+MS4yLiBOb3RlPC9jb2RlPiBkb2VzIGVuZCB3aXRoIHRoZSBkZWxpbWl0ZXIsIGJ1dCA8Y29kZT4xLjIgTm90ZTwvY29kZT4gZG9lcyBub3QuPC9icj5Gb3IgbWF0Y2hpbmcgcHVycG9zZXMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBuYW1lIHlvdXIgbm90ZXMgd2l0aCB0aGUgZGVsaW1pdGVyIG9uIHRoZSBlbmQuIE9ubHkgdHVybiB0aGlzIHNldHRpbmcgb24gaWYgeW91IGRvIG5hbWUgeW91ciBub3RlcyB0aGlzIHdheSwgYnV0IGtub3cgdGhhdCB0aGUgcmVzdWx0cyBtYXkgbm90IGJlIGFzIGFjY3VyYXRlIGlmIHlvdSBkb24ndC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+XHJcbiAgICAgIHRvZ1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWdleE5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiUmVnZXggTm90ZXNcIixcclxuICAgIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsc1xyXG4gICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlZ2V4Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVnZXggTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHJlZ2V4IG5vdGVzIHVzZSB0aGUgZmlyc3QgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcyAodXN1YWxseSBhbiA8Y29kZT5cdTIxOTE8L2NvZGU+IGZpZWxkKS4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdCwgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSA8Y29kZT5CQy1yZWdleC1ub3RlLWZpZWxkOiB7ZmllbGR9PC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBkZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duUmVuZGVyZXIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWxhdGlvblNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWxhdGlvbkRldGFpbHMgPSBkZXRhaWxzKFwiUmVsYXRpb25zaGlwc1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIGZ1bmN0aW9uIG1lcm1haWREaWFncmFtKGRpYWdyYW1TdHI6IHN0cmluZykge1xyXG4gICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuICAgICAgZGlhZ3JhbVN0cixcclxuICAgICAgcmVsYXRpb25EZXRhaWxzLmNyZWF0ZURpdigpLFxyXG4gICAgICBcIlwiLFxyXG4gICAgICBudWxsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIHJlbGF0aW9uRGV0YWlscy5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgdGV4dDogXCJIZXJlIHlvdSBjYW4gdG9nZ2xlIG9uL29mZiBkaWZmZXJlbnQgdHlwZXMgb2YgaW1wbGllZCByZWxhdGlvbnNoaXBzLiBBbGwgb2YgeW91ciBleHBsaWNpdCAocmVhbCkgcmVsYXRpb25zaGlwcyB3aWxsIHN0aWxsIHNob3csIGJ1dCB5b3UgY2FuIGNob29zZSB3aGljaCBpbXBsaWVkIG9uZXMgZ2V0IGZpbGxlZCBpbi5cXG5BbGwgaW1wbGllZCByZWxhdGlvbnNoaXBzIGFyZSBnaXZlbiBhIENTUyBjbGFzcyBvZiB0aGUgdHlwZSBvZiBpbXBsaWVkIHJlbGF0aW9uLCBzbyB5b3UgY2FuIHN0eWxlIHRoZW0gZGlmZmVyZW50bHkuIEZvciBleGFtcGxlIGAuQkMtQXVudGAuXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2FtZSBQYXJlbnQgaXMgU2libGluZ3NcIilcclxuICAgIC5zZXREZXNjKFwiSWYgb25lIG5vdGUgc2hhcmVzIGEgcGFyZW50IHdpdGggYW5vdGhlciwgdHJlYXQgdGhlbSBhcyBzaWJsaW5nc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2FtZVBhcmVudElzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zYW1lUGFyZW50SXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuU2lzdGVyIC0tPnx1cHwgRGFkXFxuTWUgPC0uLT58c2FtZXwgU2lzdGVyXFxuYGBgXCIpXHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2libGluZ3MnIFNpYmxpbmdzXCIpXHJcbiAgICAuc2V0RGVzYyhcIlRyZWF0IHlvdXIgc2libGluZ3MnIHNpYmxpbmdzIGFzIHlvdXIgc2libGluZ3NcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzU2libGluZ0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmcgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHNhbWV8IFNpc3Rlclxcbk1lIC0tPnxzYW1lfCBCcm90aGVyXFxuU2lzdGVyIDwtLi0+fHNhbWV8IEJyb3RoZXJcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaWJsaW5ncycgUGFyZW50IGlzIFBhcmVudFwiKVxyXG4gICAgLnNldERlc2MoXCJZb3VyIHNpYmxpbmdzJyBwYXJlbnRzIGFyZSB5b3VyIHBhcmVudHNcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzUGFyZW50SXNQYXJlbnQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWwpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2libGluZ3NQYXJlbnRJc1BhcmVudCA9IHZhbDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBtZXJtYWlkRGlhZ3JhbShcImBgYG1lcm1haWRcXG5mbG93Y2hhcnQgTFJcXG5TaXN0ZXIgLS0+fHVwfCBEYWRcXG5TaXN0ZXIgPC0tPnxzYW1lfCBNZVxcbk1lIC0uLT58dXB8IERhZFxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkF1bnQvVW5jbGVcIilcclxuICAgIC5zZXREZXNjKFwiVHJlYXQgeW91ciBwYXJlbnQncyBzaWJsaW5ncyBhcyB5b3VyIHBhcmVudHMgKGF1bnRzL3VuY2xlcylcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnBhcmVudHNTaWJsaW5nc0lzUGFyZW50cylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5wYXJlbnRzU2libGluZ3NJc1BhcmVudHMgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHVwfCBEYWRcXG5EYWQgLS0+fHNhbWV8IFVuY2xlXFxuTWUgLS4tPnx1cHwgVW5jbGVcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJDb3VzaW5zXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUcmVhdCB0aGUgY291c2lucyBvZiBhIG5vdGUgYXMgc2libGluZ3MgKHBhcmVudHMnIHNpYmxpbmdzJyBjaGlsZHJlbiBhcmUgY291c2lucylcIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuY291c2luc0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5jb3VzaW5zSXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuRGFkIC0tPnxzYW1lfCBVbmNsZVxcblVuY2xlIC0tPnxkb3dufCBDb3VzaW5cXG5NZSA8LS4tPnxzYW1lfCBDb3VzaW5cXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJNYWtlIEN1cnJlbnQgTm90ZSBhbiBJbXBsaWVkIFNpYmxpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRlY2hpbmNhbGx5LCB0aGUgY3VycmVudCBub3RlIGlzIGFsd2F5cyBpdCdzIG93biBpbXBsaWVkIHNpYmxpbmcuIEJ5IGRlZmF1bHQsIGl0IGlzIG5vdCBzaG93IGFzIHN1Y2guIFRvZ2dsZSB0aGlzIG9uIHRvIG1ha2UgaXQgc2hvdy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRhZ05vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRhZyBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0YWdOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBUYWcgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHRhZyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtdGFnLW5vdGUtZmllbGQ6IHtmaWVsZH08L2NvZGU+LjwvYnI+SWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG5cclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRhZ05vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50YWdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEFSUk9XX0RJUkVDVElPTlMsXHJcbiAgREVGQVVMVF9TRVRUSU5HUyxcclxuICBESVJFQ1RJT05TLFxyXG4gIElMTEVHQUxfRklMRU5BTUVfQ0hBUlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUaHJlYWRpbmdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNtZHNEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRocmVhZGluZ0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiVGhyZWFkaW5nXCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgdGhyZWFkaW5nRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgdGV4dDogXCJTZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmRzIGBDcmVhdGUgbmV3IDxmaWVsZD4gZnJvbSBjdXJyZW50IG5vdGVgXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk9wZW4gbmV3IHRocmVhZHMgaW4gbmV3IHBhbmUgb3IgY3VycmVudCBwYW5lXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+IHtcclxuICAgICAgdG9nLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lKTtcclxuICAgICAgdG9nLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlRocmVhZCB1bmRlciBDdXJzb3JcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB0aGUgc2V0dGluZyA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyBJbmxpbmU8L2NvZGU+IGlzIGVuYWJsZWQsIHdoZXJlIHNob3VsZCB0aGUgbmV3IEJyZWFkY3J1bWIgYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgbm90ZT8gXHUyNzA1ID0gVW5kZXIgdGhlIGN1cnNvciwgXHUyNzRDID0gQXQgdGhlIHRvcCBvZiB0aGUgbm90ZSAodW5kZXIgdGhlIHlhbWwsIGlmIGFwcGxpY2FibGUpXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nKSA9PiB7XHJcbiAgICAgIHRvZy5zZXRWYWx1ZShzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvcik7XHJcbiAgICAgIHRvZy5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmV3IE5vdGUgTmFtZSBUZW1wbGF0ZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgV2hlbiB0aHJlYWRpbmcgaW50byBhIG5ldyBub3RlLCBjaG9vc2UgdGhlIHRlbXBsYXRlIGZvciB0aGUgbmV3IG5vdGUgbmFtZS48L2JyPlxyXG4gICAgICAgIE9wdGlvbnMgaW5jbHVkZTo8L2JyPlxyXG4gICAgICAgIDx1bD5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2ZpZWxkfX08L2NvZGU+OiB0aGUgZmllbGQgYmVpbmcgdGhyZWFkIGludG88L2xpPlxyXG4gICAgICAgICAgPGxpPjxjb2RlPnt7ZGlyfX08L2NvZGU+OiB0aGUgZGlyZWN0aW9uIGJlaW5nIHRocmVhZCBpbnRvPC9saT5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2N1cnJlbnR9fTwvY29kZT46IHRoZSBjdXJyZW50IG5vdGUgbmFtZTwvbGk+XHJcbiAgICAgICAgICA8bGk+PGNvZGU+e3tkYXRlfX08L2NvZGU+OiB0aGUgY3VycmVudCBkYXRlIChTZXQgdGhlIGZvcm1hdCBpbiB0aGUgc2V0dGluZyBiZWxvdyk8L2xpPlxyXG4gICAgICAgIDwvdWw+YFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ1RlbXBsYXRlKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoSUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5zb21lKChjaGFyKSA9PiB2YWx1ZS5pbmNsdWRlcyhjaGFyKSkpIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgIGBGaWxlIG5hbWUgY2Fubm90IGNvbnRhaW4gYW55IG9mIHRoZXNlIGNoYXJhY3RlcnM6ICR7SUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5qb2luKFxyXG4gICAgICAgICAgICAgIFwiIFwiXHJcbiAgICAgICAgICAgICl9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkaW5nVGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdUZW1wbGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgRm9ybWF0XCIpXHJcbiAgICAuc2V0RGVzYyhcIlRoZSBkYXRlIGZvcm1hdCB1c2VkIGluIHRoZSBUaHJlYWRpbmcgVGVtcGxhdGUgKHNldHRpbmcgYWJvdmUpXCIpXHJcbiAgICAuYWRkTW9tZW50Rm9ybWF0KChmb3JtYXQpID0+IHtcclxuICAgICAgZm9ybWF0XHJcbiAgICAgICAgLnNldERlZmF1bHRGb3JtYXQoREVGQVVMVF9TRVRUSU5HUy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmRhdGVGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nID0gbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXRDbGFzcyhcInRocmVhZC1kaXItdGVtcGxhdGVzXCIpXHJcbiAgICAuc2V0TmFtZShcIlRlbXBsYXRlciBUZW1wbGF0ZSBwZXIgRGlyZWN0aW9uXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIGBGb3IgZWFjaCBkaXJlY3Rpb24gdG8gYmUgdGhyZWFkIGludG8sIGNob29zZSBhIFRlbXBsYXRlciB0ZW1wbGF0ZSB0byBpbnNlcnQgaW50byB0aGUgbmV3IG5vdGUuPC9icj5cclxuICAgICAgICAgIEdpdmUgdGhlIGJhc2VuYW1lLCBvciB0aGUgZnVsbCBmaWxlIHBhdGggKGUuZy4gPGNvZGU+VGVtcGxhdGVzL1BhcmVudCBUZW1wbGF0ZTwvY29kZT4pLmBcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgRElSRUNUSU9OUy5mb3JFYWNoKChkaXIpID0+XHJcbiAgICB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihBUlJPV19ESVJFQ1RJT05TW2Rpcl0pXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ0RpclRlbXBsYXRlc1tkaXJdKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IEp1Z2dsTGF5b3V0cyB9IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBpc0luVmF1bHQgfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB7IFRSQUlMX0xFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBkcmF3VHJhaWwgfSBmcm9tIFwiLi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYWlsVmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdHJhaWxEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRyYWlsL0dyaWQvSnVnZ2xcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgQnJlYWRjcnVtYnMgaW4gRWRpdC9MaXZlLVByZXZpZXcgTW9kZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSXQgYWx3YXlzIHNob3dzIGluIHByZXZpZXcgbW9kZSwgYnV0IHNob3VsZCBpdCBhbHNvIHNob3cgaW4gdGhlIG90aGVyIHR3bz9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgY2xzOiBcInNldHRpbmctaXRlbS1uYW1lXCIsXHJcbiAgICB0ZXh0OiBcIkxpbWl0IFRyYWlsIFZpZXcgdG8gb25seSBzaG93IGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogdHJhaWxEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBzZXR0aW5nTmFtZTogXCJsaW1pdFRyYWlsQ2hlY2tib3hlc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzLCBcInVwXCIpLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgY29uc3Qgdmlld3NUb1Nob3cgPSBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlZpZXdzIHRvIHNob3dcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gc2hvdyBhdCB0aGUgdG9wIG9mIHRoZSBub3RlLiBKdWdnbCBWaWV3IHJlcXVpcmVzIHRoZSBKdWdnbCBwbHVnaW4uXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1RyYWlsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dUcmFpbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRUb29sdGlwKFwiR3JpZCB2aWV3XCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dHcmlkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dHcmlkID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFRvb2x0aXAoXCJOZXh0L1ByZXZpb3VzIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1ByZXZOZXh0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dQcmV2TmV4dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG5cclxuICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB2aWV3c1RvU2hvdy5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIkp1Z2dsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0p1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dKdWdnbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoJ0dyaWQgdmlldyBkZXB0aCcpXHJcbiAgICAuc2V0RGVzYygnTGltaXQgdGhlIGluaXRpYWwgZGVwdGggb2YgdGhlIGdyaWQgdmlldycpXHJcbiAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcclxuICAgICAgc2xpZGVyXHJcbiAgICAgICAgLnNldExpbWl0cygwLCAyNSwgMSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aClcclxuICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKTtcclxuXHJcbiAgICAgIHNsaWRlci5zbGlkZXJFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aCA9IHNsaWRlci5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSW5kZXggTm90ZShzKVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBub3RlIHRoYXQgYWxsIG9mIHlvdXIgb3RoZXIgbm90ZXMgbGVhZCBiYWNrIHRvLiBUaGUgcGFyZW50IG9mIGFsbCB5b3VyIHBhcmVudCBub3Rlcy4gSnVzdCBlbnRlciB0aGUgYmFzZW5hbWUuPC9icj5Zb3UgY2FuIGFsc28gaGF2ZSBtdWx0aXBsZSBpbmRleCBub3RlcyAoY29tbWEtc2VwYXJhdGVkIGxpc3QpLjwvYnI+TGVhdmluZyB0aGlzIGZpZWxkIGVtcHR5IHdpbGwgbWFrZSB0aGUgdHJhaWwgc2hvdyBhbGwgcGF0aHMgZ29pbmcgYXMgZmFyIHVwIHRoZSBwYXJlbnQtdHJlZSBhcyBwb3NzaWJsZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiSW5kZXggTm90ZVwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbmRleE5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHNwbGl0c1swXSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICBzcGxpdHMuZXZlcnkoKGluZGV4KSA9PiBpc0luVmF1bHQoaW5kZXgpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW5kZXhOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkF0bGVhc3Qgb25lIG9mIHRoZSBub3RlcyBpcyBub3QgaW4geW91ciB2YXVsdFwiKTtcclxuXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93cyBhbGwgcGF0aHMgaWYgbm9uZSB0byBpbmRleCBub3RlIGFyZSBmb3VuZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSWYgeW91IGhhdmUgYW4gaW5kZXggbm90ZSBjaG9zZW4sIGJ1dCB0aGUgdHJhaWwgdmlldyBoYXMgbm8gcGF0aHMgZ29pbmcgdXAgdG8gdGhvc2UgaW5kZXggbm90ZXMsIHNob3VsZCBpdCBzaG93IGFsbCBwYXRocyBpbnN0ZWFkP1wiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSlcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQ6IEFsbCwgTG9uZ2VzdCwgb3IgU2hvcnRlc3RcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIG11bHRpcGxlIHBhdGhzIGFyZSBmb3VuZCBnb2luZyB1cCB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIG9mIHRoZW0gc2hvdWxkIHNob3c/XCJcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bihkZCA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fVxyXG4gICAgICBUUkFJTF9MRU5HVEhTLmZvckVhY2gobGVuZ3RoID0+IHtcclxuICAgICAgICBvcHRpb25zW2xlbmd0aF0gPSBsZW5ndGg7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBkZC5hZGRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsKTtcclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dBbGwgPSB2YWw7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTZXBlcmF0b3JcIilcclxuICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcclxuICAgICAgXCJUaGUgY2hhcmFjdGVyIHRvIHNob3cgYmV0d2VlbiBjcnVtYnMgaW4gdGhlIGJyZWFkY3J1bWIgdHJhaWwuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPlx1MjE5MjwvY29kZT5cIilcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiXHUyMTkyXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJObyBwYXRoIGZvdW5kIG1lc3NhZ2VcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBwYXRoIHRvIHRoZSBpbmRleCBub3RlIGlzIGZvdW5kLCBvciB0aGUgY3VycmVudCBub3RlIGhhcyBubyBwYXJlbnQuXCJcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiTm8gcGF0aCB0byBpbmRleCBub3RlIHdhcyBmb3VuZFwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ub1BhdGhNZXNzYWdlKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLm5vUGF0aE1lc3NhZ2UgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlc3BlY3QgUmVhZGFibGUgTGluZSBMZW5ndGhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlNob3VsZCB0aGUgYnJlYWRjcnVtYnMgdHJhaWwgYWRqdXN0IGl0cyB3aWR0aCB0byB0aGUgcmVhZGFibGUgbGluZSBsZW5ndGgsIG9yIHVzZSBhcyBtdWNoIHNwYWNlIGFzIHBvc3NpYmxlPyBcdTI3MDUgPSB1c2UgcmVhZGFibGUgbGluZSBsZW5ndGguXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MucmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgdXAgZmllbGRzIGluIEp1Z2dsXCIpXHJcbiAgICAuc2V0RGVzYyhcIkp1Z2dsIHdpbGwgc2hvdyBib3RoIHVwIGFuZCBkb3duIGZpZWxkc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93VXBJbkp1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dVcEluSnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkp1Z2dsIHZpZXcgbGF5b3V0XCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiVGhlIGxheW91dCB0eXBlIHRvIHVzZSBmb3IgdGhlIEp1Z2dsIHZpZXcuPGJyPlRoZSBoaWVyYXJjaHkgbGF5b3V0IGlzIG1vc3QgbmF0dXJhbCBmb3IgQnJlYWRjcnVtYnMsIGJ1dCBmb3IgbGFyZ2UgZ3JhcGhzIEQzIEZvcmNlIGlzIHJlY29tbWVuZGVkLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGM6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImhpZXJhcmNoeVwiLCBcIkhpZXJhcmNoeVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiZDMtZm9yY2VcIiwgXCJEMyBGb3JjZVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiY29sYVwiLCBcIkNvbGEgRm9yY2VcIik7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImdyaWRcIiwgXCJHcmlkXCIpO1xyXG4gICAgICBkYy5hZGRPcHRpb24oXCJjb25jZW50cmljXCIsIFwiQ29uY2VudHJpY1wiKTtcclxuXHJcbiAgICAgIGRjLnNldFZhbHVlKHNldHRpbmdzLmp1Z2dsTGF5b3V0KTtcclxuICAgICAgZGMub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuanVnZ2xMYXlvdXQgPSB2YWx1ZSBhcyBKdWdnbExheW91dHM7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBBTExVTkxJTktFRCwgUkVBbENMT1NFRCwgUkVMQVRJT05TLCBWSVNUWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBSZWxhdGlvbnMsIFZpc1R5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVmlzTW9kYWxTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHZpc01vZGFsRGV0YWlscyA9IHN1YkRldGFpbHMoXCJWaXN1YWxpc2F0aW9uIE1vZGFsXCIsIHZpZXdEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFZpc3VhbGlzYXRpb24gVHlwZVwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCB2aXN1YWxpc2F0aW9uIHRvIHNob3cgYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgVklTVFlQRVMuZm9yRWFjaCgob3B0aW9uOiBWaXNUeXBlKSA9PiB7XHJcbiAgICAgICAgY2IuYWRkT3B0aW9uKG9wdGlvbiwgb3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNiLnNldFZhbHVlKHNldHRpbmdzLnZpc0dyYXBoKTtcclxuXHJcbiAgICAgIGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogVmlzVHlwZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc0dyYXBoID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHZpc01vZGFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBSZWxhdGlvblwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCByZWxhdGlvbiB0eXBlIHRvIHNob3cgZmlyc3Qgd2hlbiBvcGVuaW5nIHRoZSBtb2RhbFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZCkgPT4ge1xyXG4gICAgICBSRUxBVElPTlMuZm9yRWFjaCgob3B0aW9uOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBkZC5hZGRPcHRpb24ob3B0aW9uLCBvcHRpb24pO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MudmlzUmVsYXRpb24pO1xyXG5cclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNSZWxhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyh2aXNNb2RhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVhbC9DbG9zZWRcIilcclxuICAgIC5zZXREZXNjKFwiU2hvdyB0aGUgcmVhbCBvciBjbG9zZWQgZ3JhcGggYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgUkVBbENMT1NFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNDbG9zZWQpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNDbG9zZWQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFVubGlua2VkXCIpXHJcbiAgICAuc2V0RGVzYyhcIlNob3cgYWxsIG5vZGVzIG9yIG9ubHkgdGhvc2Ugd2hpY2ggaGF2ZSBsaW5rcyBieSBkZWZhdWx0XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGNiOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBBTExVTkxJTktFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNBbGwpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNBbGwgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IENoZWNrYm94ZXMgZnJvbSBcIi4uL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRXcml0ZUJDc1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY21kc0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3Qgd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiV3JpdGUgQnJlYWRjcnVtYnMgdG8gRmlsZVwiLFxyXG4gICAgY21kc0RldGFpbHNcclxuICApO1xyXG5cclxuICB3cml0ZUJDc1RvRmlsZURldGFpbHMuY3JlYXRlRGl2KHtcclxuICAgIGNsczogXCJzZXR0aW5nLWl0ZW0tbmFtZVwiLFxyXG4gICAgdGV4dDogXCJMaW1pdCB0byBvbmx5IHdyaXRlIGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRXcml0ZUJDQ2hlY2tib3hlc1wiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcod3JpdGVCQ3NUb0ZpbGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJXcml0ZSBJbmxpbmVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIldoZW4gd3JpdGluZyBCQ3MgdG8gZmlsZSwgc2hvdWxkIHRoZXkgYmUgd3JpdHRlbiBpbmxpbmUgKHVzaW5nIERhdGF2aWV3IHN5bnRheCksIG9yIGludG8gdGhlIFlBTUwgb2YgdGhlIG5vdGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLndyaXRlQkNzSW5saW5lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy53cml0ZUJDc0lubGluZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHdyaXRlQkNzVG9GaWxlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHRoZSA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyB0byBBTEwgRmlsZXM8L2NvZGU+IGNvbW1hbmRcIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUaGlzIGNvbW1hbmQgYXR0ZW1wdHMgdG8gdXBkYXRlIEFMTCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMgcG9pbnRpbmcgdG8gdGhlbS4gU28sIGl0IGlzIG5vdCBzaG93biBieSBkZWZhdWx0IChldmVuIHRob3VnaCBpdCBoYXMgMyBjb25maXJtYXRpb24gYm94ZXMgdG8gZW5zdXJlIHlvdSB3YW50IHRvIHJ1biBpdFwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93V3JpdGVBbGxCQ3NDbWQpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IEl0ZW1WaWV3LCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBEdWNrcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9EdWNrcy5zdmVsdGVcIjtcclxuaW1wb3J0IHsgRFVDS19JQ09OLCBEVUNLX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdWNrc1ZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcHJpdmF0ZSBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogRHVja3M7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGxlYWYpO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBzdXBlci5vbmxvYWQoKTtcclxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5kcmF3KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFZpZXdUeXBlKCkge1xyXG4gICAgcmV0dXJuIERVQ0tfVklFVztcclxuICB9XHJcbiAgZ2V0RGlzcGxheVRleHQoKSB7XHJcbiAgICByZXR1cm4gXCJCcmVhZGNydW1icyBEdWNrc1wiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyBEdWNrIGljb25cclxuICBpY29uID0gRFVDS19JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBEdWNrcyh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIGR1Y2tzVmlldzogdGhpcyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgMTkyIDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIwIDQyNC4yMjloMjBWMjc5Ljc3MUgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjBWMjEyYzAtMTEuMDQ2IDguOTU0LTIwIDIwLTIwaDExMmMxMS4wNDYgMCAyMCA4Ljk1NCAyMCAyMHYyMTIuMjI5aDIwYzExLjA0NiAwIDIwIDguOTU0IDIwIDIwVjQ5MmMwIDExLjA0Ni04Ljk1NCAyMC0yMCAyMEgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjB2LTQ3Ljc3MWMwLTExLjA0NiA4Ljk1NC0yMCAyMC0yMHpNOTYgMEM1Ni4yMzUgMCAyNCAzMi4yMzUgMjQgNzJzMzIuMjM1IDcyIDcyIDcyIDcyLTMyLjIzNSA3Mi03MlMxMzUuNzY0IDAgOTYgMHpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBGYUluZm8gZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYUluZm8uc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgdHlwZSBEdWNrc1ZpZXcgZnJvbSBcIi4uL1ZpZXdzL0R1Y2tzVmlld1wiO1xyXG5cclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcbiAgZXhwb3J0IGxldCBkdWNrc1ZpZXc6IER1Y2tzVmlldztcclxuXHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHJcbiAgbGV0IHF1ZXJ5OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxldCByZWdleCA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICBsZXQgaW5jbHVkZSA9IHRydWU7XHJcblxyXG4gICQ6IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG5ld1JlZyA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICAgICAgcmVnZXggPSBuZXdSZWc7XHJcbiAgICB9IGNhdGNoIChlKSB7fVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0RHVja3MgPSAocmVnZXg6IFJlZ0V4cCkgPT4ge1xyXG4gICAgaWYgKCFyZWdleCkgcmV0dXJuO1xyXG4gICAgcmV0dXJuIGZpbGVzXHJcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG5hbWUpID0+ICFtYWluRy5uZWlnaGJvcnMobmFtZSkubGVuZ3RoICYmIGluY2x1ZGUgPT09IHJlZ2V4LnRlc3QobmFtZSlcclxuICAgICAgKTtcclxuICB9O1xyXG5cclxuICAkOiBkdWNrcyA9IGdldER1Y2tzKHJlZ2V4KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtRHVja3MgbWFya2Rvd24tcHJldmlldy12aWV3XCI+XHJcbiAgPGg2Pk5vdGVzIHdpdGhvdXQgQnJlYWRjcnVtYnM8L2g2PlxyXG4gIDxzcGFuXHJcbiAgICBjbGFzcz1cImljb25cIlxyXG4gICAgYXJpYS1sYWJlbD17YEEgUmVnZXggdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXFxuSWYgJ0luY2x1ZGUnIGlzIGNoZWNrZWQsIGl0IHdpbGwgb25seSBzaG93IG5vdGVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4LlxcbklmICdJbmNsdWRlJyBpcyBub3QgY2hlY2tlZCwgdGhpcyByZWdleCB3aWxsIGZpbHRlciBvdXQgbm90ZXMgdGhhdCBtYXRjaCBpdC5gfVxyXG4gID5cclxuICAgIDxGYUluZm8gLz5cclxuICA8L3NwYW4+XHJcbiAgPGxhYmVsPlxyXG4gICAgRmlsdGVyOlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSZWdleFwiIGJpbmQ6dmFsdWU9e3F1ZXJ5fSAvPlxyXG4gIDwvbGFiZWw+XHJcbiAgPGlucHV0IGFyaWEtbGFiZWw9XCJJbmNsdWRlXCIgdHlwZT1cImNoZWNrYm94XCIgYmluZDpjaGVja2VkPXtpbmNsdWRlfSAvPlxyXG5cclxuICB7I2VhY2ggZHVja3MgYXMgZHVja31cclxuICAgIDxkaXZcclxuICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goZHVjaywgZSl9XHJcbiAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBkdWNrc1ZpZXcsIGR1Y2spfVxyXG4gICAgPlxyXG4gICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1taXNzaW5nLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCI+e2R1Y2t9PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYWRkRmVhdGhlckljb24gfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgU2lkZVRyZWUgZnJvbSBcIi4uL0NvbXBvbmVudHMvU2lkZVRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IFRSRUVfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyZWVWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG4gIHByaXZhdGUgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBwcml2YXRlIHZpZXc6IFNpZGVUcmVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihsZWFmKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgc3VwZXIub25sb2FkKCk7XHJcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmRyYXcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gVFJFRV9WSUVXO1xyXG4gIH1cclxuICBnZXREaXNwbGF5VGV4dCgpIHtcclxuICAgIHJldHVybiBcIkJyZWFkY3J1bWJzIERvd25cIjtcclxuICB9XHJcblxyXG4gIGljb24gPSBhZGRGZWF0aGVySWNvbihcImNvcm5lci1yaWdodC1kb3duXCIpIGFzIHN0cmluZztcclxuXHJcbiAgYXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge31cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBTaWRlVHJlZSh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIHZpZXc6IHRoaXMgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IEZhRmlyZSBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhRmlyZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgRmFSZWdTbm93Zmxha2UgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1Nub3dmbGFrZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG4gIGltcG9ydCB7IERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgeyBkcm9wRGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBkZnNBbGxQYXRocywgZ2V0U3ViSW5EaXJzIH0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBUcmVlVmlldyBmcm9tIFwiLi4vVmlld3MvVHJlZVZpZXdcIjtcclxuICBpbXBvcnQgeyBnZXRDdXJyRmlsZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBleHBvcnQgbGV0IHZpZXc6IFRyZWVWaWV3O1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzLCBhcHAsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuXHJcbiAgbGV0IGRpcjogRGlyZWN0aW9ucyA9IFwiZG93blwiO1xyXG4gIGxldCBmcm96ZW4gPSBmYWxzZTtcclxuICBsZXQgeyBiYXNlbmFtZSB9ID0gZ2V0Q3VyckZpbGUoKTtcclxuXHJcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICBhcHAud29ya3NwYWNlLm9uKFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgaWYgKGZyb3plbikgcmV0dXJuO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAkOiB7XHJcbiAgICBjb25zdCBkb3duRyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBkaXIpO1xyXG4gICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhkb3duRywgYmFzZW5hbWUpO1xyXG4gICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgIGluZm8oeyBhbGxQYXRocywgaW5kZXggfSk7XHJcblxyXG4gICAgbGluZXMgPSBpbmRleFRvTGluZVBhaXJzKGluZGV4KTtcclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuPHNwYW5cclxuICBjbGFzcz1cImljb25cIlxyXG4gIGFyaWEtbGFiZWw9e2Zyb3plbiA/IGBGcm96ZW4gb246ICR7YmFzZW5hbWV9YCA6IFwiVW5mcm96ZW5cIn1cclxuICBhcmlhLWxhYmVsLXBvc2l0aW9uPVwibGVmdFwiXHJcbiAgb246Y2xpY2s9eygpID0+IHtcclxuICAgIGZyb3plbiA9ICFmcm96ZW47XHJcbiAgICBpZiAoIWZyb3plbikgYmFzZW5hbWUgPSBnZXRDdXJyRmlsZSgpPy5iYXNlbmFtZTtcclxuICB9fVxyXG4+XHJcbiAgeyNpZiBmcm96ZW59XHJcbiAgICA8RmFSZWdTbm93Zmxha2UgLz5cclxuICB7OmVsc2V9XHJcbiAgICA8RmFGaXJlIC8+XHJcbiAgey9pZn1cclxuPC9zcGFuPlxyXG5cclxuPGJ1dHRvblxyXG4gIGFyaWEtbGFiZWw9XCJSZWZyZXNoIFN0YXRzIFZpZXcgKGFsc28gcmVmcmVzaGVzIEJyZWFkY3J1bWJzIEluZGV4KVwiXHJcbiAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgYXdhaXQgdmlldy5kcmF3KCk7XHJcbiAgfX1cclxuPlxyXG4gIFx1MjFCQlxyXG48L2J1dHRvbj5cclxuXHJcbjxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIGJpbmQ6dmFsdWU9e2Rpcn0+XHJcbiAgeyNlYWNoIERJUkVDVElPTlMgYXMgZGlyZWN0aW9ufVxyXG4gICAgPG9wdGlvbiB2YWx1ZT17ZGlyZWN0aW9ufT57ZGlyZWN0aW9ufTwvb3B0aW9uPlxyXG4gIHsvZWFjaH1cclxuPC9zZWxlY3Q+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtZG93bnNcIj5cclxuICB7I2VhY2ggbGluZXMgYXMgbGluZX1cclxuICAgIHsjaWYgbGluZS5sZW5ndGggPiAxfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxwcmU+e2xpbmVbMF0gKyBcIi1cIn08L3ByZT5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCJcclxuICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKGxpbmVbMV0sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIHZpZXcsIGxpbmVbMV0pfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluZVsxXSkgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIlxyXG4gICAgICAgICAgICA+e2Ryb3BEZW5kcm9uKGxpbmVbMV0sIHNldHRpbmdzKX08L2FcclxuICAgICAgICAgID5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9pZn1cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIGJ1dHRvbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgICBwYWRkaW5nOiAxcHggNnB4IDJweCA2cHg7XHJcbiAgfVxyXG5cclxuICAuQkMtZG93bnMge1xyXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XHJcbiAgfVxyXG4gIHByZSB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgfVxyXG5cclxuICAuaXMtdW5yZXNvbHZlZCB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XHJcbiAgfVxyXG5cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDM4NCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk0yMTYgMjMuODZjMC0yMy44LTMwLjY1LTMyLjc3LTQ0LjE1LTEzLjA0QzQ4IDE5MS44NSAyMjQgMjAwIDIyNCAyODhjMCAzNS42My0yOS4xMSA2NC40Ni02NC44NSA2My45OS0zNS4xNy0uNDUtNjMuMTUtMjkuNzctNjMuMTUtNjQuOTR2LTg1LjUxYzAtMjEuNy0yNi40Ny0zMi4yMy00MS40My0xNi41QzI3LjggMjEzLjE2IDAgMjYxLjMzIDAgMzIwYzAgMTA1Ljg3IDg2LjEzIDE5MiAxOTIgMTkyczE5Mi04Ni4xMyAxOTItMTkyYzAtMTcwLjI5LTE2OC0xOTMtMTY4LTI5Ni4xNHpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA0NDggNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDQwLjEgMzU1LjJsLTM5LjItMjMgMzQuMS05LjNjOC40LTIuMyAxMy40LTExLjEgMTEuMS0xOS42bC00LjEtMTUuNWMtMi4yLTguNS0xMC45LTEzLjYtMTkuMy0xMS4zTDM0MyAyOTguMiAyNzEuMiAyNTZsNzEuOS00Mi4yIDc5LjcgMjEuN2M4LjQgMi4zIDE3LTIuOCAxOS4zLTExLjNsNC4xLTE1LjVjMi4yLTguNS0yLjctMTcuMy0xMS4xLTE5LjZsLTM0LjEtOS4zIDM5LjItMjNjNy41LTQuNCAxMC4xLTE0LjIgNS44LTIxLjlsLTcuOS0xMy45Yy00LjMtNy43LTE0LTEwLjMtMjEuNS01LjlsLTM5LjIgMjMgOS4xLTM0LjdjMi4yLTguNS0yLjctMTcuMy0xMS4xLTE5LjZsLTE1LjItNC4xYy04LjQtMi4zLTE3IDIuOC0xOS4zIDExLjNsLTIxLjMgODEtNzEuOSA0Mi4ydi04NC41TDMwNiA3MC40YzYuMS02LjIgNi4xLTE2LjQgMC0yMi42bC0xMS4xLTExLjNjLTYuMS02LjItMTYuMS02LjItMjIuMiAwbC0yNC45IDI1LjRWMTZjMC04LjgtNy0xNi0xNS43LTE2aC0xNS43Yy04LjcgMC0xNS43IDcuMi0xNS43IDE2djQ2LjFsLTI0LjktMjUuNGMtNi4xLTYuMi0xNi4xLTYuMi0yMi4yIDBMMTQyLjEgNDhjLTYuMSA2LjItNi4xIDE2LjQgMCAyMi42bDU4LjMgNTkuM3Y4NC41bC03MS45LTQyLjItMjEuMy04MWMtMi4yLTguNS0xMC45LTEzLjYtMTkuMy0xMS4zTDcyLjcgODRjLTguNCAyLjMtMTMuNCAxMS4xLTExLjEgMTkuNmw5LjEgMzQuNy0zOS4yLTIzYy03LjUtNC40LTE3LjEtMS44LTIxLjUgNS45bC03LjkgMTMuOWMtNC4zIDcuNy0xLjggMTcuNCA1LjggMjEuOWwzOS4yIDIzLTM0LjEgOS4xYy04LjQgMi4zLTEzLjQgMTEuMS0xMS4xIDE5LjZMNiAyMjQuMmMyLjIgOC41IDEwLjkgMTMuNiAxOS4zIDExLjNsNzkuNy0yMS43IDcxLjkgNDIuMi03MS45IDQyLjItNzkuNy0yMS43Yy04LjQtMi4zLTE3IDIuOC0xOS4zIDExLjNsLTQuMSAxNS41Yy0yLjIgOC41IDIuNyAxNy4zIDExLjEgMTkuNmwzNC4xIDkuMy0zOS4yIDIzYy03LjUgNC40LTEwLjEgMTQuMi01LjggMjEuOUwxMCAzOTFjNC4zIDcuNyAxNCAxMC4zIDIxLjUgNS45bDM5LjItMjMtOS4xIDM0LjdjLTIuMiA4LjUgMi43IDE3LjMgMTEuMSAxOS42bDE1LjIgNC4xYzguNCAyLjMgMTctMi44IDE5LjMtMTEuM2wyMS4zLTgxIDcxLjktNDIuMnY4NC41bC01OC4zIDU5LjNjLTYuMSA2LjItNi4xIDE2LjQgMCAyMi42bDExLjEgMTEuM2M2LjEgNi4yIDE2LjEgNi4yIDIyLjIgMGwyNC45LTI1LjRWNDk2YzAgOC44IDcgMTYgMTUuNyAxNmgxNS43YzguNyAwIDE1LjctNy4yIDE1LjctMTZ2LTQ2LjFsMjQuOSAyNS40YzYuMSA2LjIgMTYuMSA2LjIgMjIuMiAwbDExLjEtMTEuM2M2LjEtNi4yIDYuMS0xNi40IDAtMjIuNmwtNTguMy01OS4zdi04NC41bDcxLjkgNDIuMiAyMS4zIDgxYzIuMiA4LjUgMTAuOSAxMy42IDE5LjMgMTEuM0wzNzUgNDI4YzguNC0yLjMgMTMuNC0xMS4xIDExLjEtMTkuNmwtOS4xLTM0LjcgMzkuMiAyM2M3LjUgNC40IDE3LjEgMS44IDIxLjUtNS45bDcuOS0xMy45YzQuNi03LjUgMi4xLTE3LjMtNS41LTIxLjd6XCIgLz5cbiAgICAgICAgPC9JY29uQmFzZT5cbiAgICAgICIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsICJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihmKSB7XG4gIGxldCBkZWx0YSA9IGY7XG4gIGxldCBjb21wYXJlID0gZjtcblxuICBpZiAoZi5sZW5ndGggPT09IDEpIHtcbiAgICBkZWx0YSA9IChkLCB4KSA9PiBmKGQpIC0geDtcbiAgICBjb21wYXJlID0gYXNjZW5kaW5nQ29tcGFyYXRvcihmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlZnQoYSwgeCwgbG8sIGhpKSB7XG4gICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJpZ2h0KGEsIHgsIGxvLCBoaSkge1xuICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDtcbiAgICAgIGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8sIGhpKSB7XG4gICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikge1xuICByZXR1cm4gKGQsIHgpID0+IGFzY2VuZGluZyhmKGQpLCB4KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgYmlzZWN0b3IgZnJvbSBcIi4vYmlzZWN0b3IuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbmNvbnN0IGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7XG5leHBvcnQgY29uc3QgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7XG5leHBvcnQgY29uc3QgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdENlbnRlciA9IGJpc2VjdG9yKG51bWJlcikuY2VudGVyO1xuZXhwb3J0IGRlZmF1bHQgYmlzZWN0UmlnaHQ7XG4iLCAidmFyIGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHJldmVyc2UsXG4gICAgICBpID0gLTEsXG4gICAgICBuLFxuICAgICAgdGlja3MsXG4gICAgICBzdGVwO1xuXG4gIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50O1xuICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTtcbiAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjtcbiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTtcblxuICBpZiAoc3RlcCA+IDApIHtcbiAgICBsZXQgcjAgPSBNYXRoLnJvdW5kKHN0YXJ0IC8gc3RlcCksIHIxID0gTWF0aC5yb3VuZChzdG9wIC8gc3RlcCk7XG4gICAgaWYgKHIwICogc3RlcCA8IHN0YXJ0KSArK3IwO1xuICAgIGlmIChyMSAqIHN0ZXAgPiBzdG9wKSAtLXIxO1xuICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSByMSAtIHIwICsgMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHIwICsgaSkgKiBzdGVwO1xuICB9IGVsc2Uge1xuICAgIHN0ZXAgPSAtc3RlcDtcbiAgICBsZXQgcjAgPSBNYXRoLnJvdW5kKHN0YXJ0ICogc3RlcCksIHIxID0gTWF0aC5yb3VuZChzdG9wICogc3RlcCk7XG4gICAgaWYgKHIwIC8gc3RlcCA8IHN0YXJ0KSArK3IwO1xuICAgIGlmIChyMSAvIHN0ZXAgPiBzdG9wKSAtLXIxO1xuICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSByMSAtIHIwICsgMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHIwICsgaSkgLyBzdGVwO1xuICB9XG5cbiAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTtcblxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSxcbiAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7XG4gIHJldHVybiBwb3dlciA+PSAwXG4gICAgICA/IChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKVxuICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSxcbiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTtcbiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7XG4gIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1O1xuICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjtcbiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7XG5cbiAgdmFyIGkgPSAtMSxcbiAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSkgfCAwLFxuICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICByYW5nZVtpXSA9IHN0YXJ0ICsgaSAqIHN0ZXA7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59XG4iLCAidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCAiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwgImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsICJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwgImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiB4XG4gICAgPyB4IC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbSh4KTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsICJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdyb3VwID0gc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGdyb3VwID09IG51bGwgPyBbXSA6IGFycmF5KGdyb3VwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiB0aGlzLmNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9uXHUyMDE5dCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5KHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuIiwgImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBlbnRlciA9IHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIgPyBvbmVudGVyKGVudGVyKSA6IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rpb24pIHtcbiAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBtZXJnZVwiKTtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCAiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsICJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsICJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwgImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwgImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsICJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwgImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCAiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgdHJ1ZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRHJhZ0V2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHN1YmplY3QsXG4gIHRhcmdldCxcbiAgaWRlbnRpZmllcixcbiAgYWN0aXZlLFxuICB4LCB5LCBkeCwgZHksXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc3ViamVjdDoge3ZhbHVlOiBzdWJqZWN0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgaWRlbnRpZmllcjoge3ZhbHVlOiBpZGVudGlmaWVyLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGFjdGl2ZToge3ZhbHVlOiBhY3RpdmUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgeDoge3ZhbHVlOiB4LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHk6IHt2YWx1ZTogeSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBkeDoge3ZhbHVlOiBkeCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBkeToge3ZhbHVlOiBkeSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cblxuRHJhZ0V2ZW50LnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdmFsdWUgPSB0aGlzLl8ub24uYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdmFsdWUgPT09IHRoaXMuXyA/IHRoaXMgOiB2YWx1ZTtcbn07XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZHJhZywge3llc2RyYWd9IGZyb20gXCIuL25vZHJhZy5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBEcmFnRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnROb2RlO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3ViamVjdChldmVudCwgZCkge1xuICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV2ZW50LngsIHk6IGV2ZW50Lnl9IDogZDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lcixcbiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBnZXN0dXJlcyA9IHt9LFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImRyYWdcIiwgXCJlbmRcIiksXG4gICAgICBhY3RpdmUgPSAwLFxuICAgICAgbW91c2Vkb3dueCxcbiAgICAgIG1vdXNlZG93bnksXG4gICAgICBtb3VzZW1vdmluZyxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwO1xuXG4gIGZ1bmN0aW9uIGRyYWcoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi5kcmFnXCIsIG1vdXNlZG93bmVkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5kcmFnXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZ1wiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgZCkge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjb250YWluZXIuY2FsbCh0aGlzLCBldmVudCwgZCksIGV2ZW50LCBkLCBcIm1vdXNlXCIpO1xuICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuO1xuICAgIHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS5kcmFnXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC5kcmFnXCIsIG1vdXNldXBwZWQsIHRydWUpO1xuICAgIG5vZHJhZyhldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBtb3VzZW1vdmluZyA9IGZhbHNlO1xuICAgIG1vdXNlZG93bnggPSBldmVudC5jbGllbnRYO1xuICAgIG1vdXNlZG93bnkgPSBldmVudC5jbGllbnRZO1xuICAgIGdlc3R1cmUoXCJzdGFydFwiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKCFtb3VzZW1vdmluZykge1xuICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIG1vdXNlZG93bngsIGR5ID0gZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7XG4gICAgICBtb3VzZW1vdmluZyA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgfVxuICAgIGdlc3R1cmVzLm1vdXNlKFwiZHJhZ1wiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnXCIsIG51bGwpO1xuICAgIHllc2RyYWcoZXZlbnQudmlldywgbW91c2Vtb3ZpbmcpO1xuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGdlc3R1cmVzLm1vdXNlKFwiZW5kXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgZCkge1xuICAgIGlmICghZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgYyA9IGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjLCBldmVudCwgZCwgdG91Y2hlc1tpXS5pZGVudGlmaWVyLCB0b3VjaGVzW2ldKSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZHJhZ1wiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIVxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcImVuZFwiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYmVmb3Jlc3RhcnQodGhhdCwgY29udGFpbmVyLCBldmVudCwgZCwgaWRlbnRpZmllciwgdG91Y2gpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBsaXN0ZW5lcnMuY29weSgpLFxuICAgICAgICBwID0gcG9pbnRlcih0b3VjaCB8fCBldmVudCwgY29udGFpbmVyKSwgZHgsIGR5LFxuICAgICAgICBzO1xuXG4gICAgaWYgKChzID0gc3ViamVjdC5jYWxsKHRoYXQsIG5ldyBEcmFnRXZlbnQoXCJiZWZvcmVzdGFydFwiLCB7XG4gICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIHg6IHBbMF0sXG4gICAgICAgIHk6IHBbMV0sXG4gICAgICAgIGR4OiAwLFxuICAgICAgICBkeTogMCxcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgIH0pLCBkKSkgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgZHggPSBzLnggLSBwWzBdIHx8IDA7XG4gICAgZHkgPSBzLnkgLSBwWzFdIHx8IDA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VzdHVyZSh0eXBlLCBldmVudCwgdG91Y2gpIHtcbiAgICAgIHZhciBwMCA9IHAsIG47XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXJ0XCI6IGdlc3R1cmVzW2lkZW50aWZpZXJdID0gZ2VzdHVyZSwgbiA9IGFjdGl2ZSsrOyBicmVhaztcbiAgICAgICAgY2FzZSBcImVuZFwiOiBkZWxldGUgZ2VzdHVyZXNbaWRlbnRpZmllcl0sIC0tYWN0aXZlOyAvLyBub2JyZWFrXG4gICAgICAgIGNhc2UgXCJkcmFnXCI6IHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBuID0gYWN0aXZlOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoYXQsXG4gICAgICAgIG5ldyBEcmFnRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICBzdWJqZWN0OiBzLFxuICAgICAgICAgIHRhcmdldDogZHJhZyxcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGFjdGl2ZTogbixcbiAgICAgICAgICB4OiBwWzBdICsgZHgsXG4gICAgICAgICAgeTogcFsxXSArIGR5LFxuICAgICAgICAgIGR4OiBwWzBdIC0gcDBbMF0sXG4gICAgICAgICAgZHk6IHBbMV0gLSBwMFsxXSxcbiAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgZHJhZy5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBkcmFnKSA6IGZpbHRlcjtcbiAgfTtcblxuICBkcmFnLmNvbnRhaW5lciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBkcmFnKSA6IGNvbnRhaW5lcjtcbiAgfTtcblxuICBkcmFnLnN1YmplY3QgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ViamVjdCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogc3ViamVjdDtcbiAgfTtcblxuICBkcmFnLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIGRyYWcub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gZHJhZyA6IHZhbHVlO1xuICB9O1xuXG4gIGRyYWcuY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgZHJhZykgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHJldHVybiBkcmFnO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwgImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZUksIHJlSSwgcmVJXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xcXFxcKFwiICsgW3JlTiwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsYVxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBcIiNcIiArIGhleCh0aGlzLnIpICsgaGV4KHRoaXMuZykgKyBoZXgodGhpcy5iKTtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7XG4gIHJldHVybiAoYSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwiKVxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgXCIsIFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKVxuICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgICByZXR1cm4gKGEgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIilcbiAgICAgICAgKyAodGhpcy5oIHx8IDApICsgXCIsIFwiXG4gICAgICAgICsgKHRoaXMucyB8fCAwKSAqIDEwMCArIFwiJSwgXCJcbiAgICAgICAgKyAodGhpcy5sIHx8IDApICogMTAwICsgXCIlXCJcbiAgICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbiAgfVxufSkpO1xuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCAiZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuIiwgImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdiLCBkYXJrZXIsIGJyaWdodGVyfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWdyZWVzLCByYWRpYW5zfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbnZhciBBID0gLTAuMTQ4NjEsXG4gICAgQiA9ICsxLjc4Mjc3LFxuICAgIEMgPSAtMC4yOTIyNyxcbiAgICBEID0gLTAuOTA2NDksXG4gICAgRSA9ICsxLjk3Mjk0LFxuICAgIEVEID0gRSAqIEQsXG4gICAgRUIgPSBFICogQixcbiAgICBCQ19EQSA9IEIgKiBDIC0gRCAqIEE7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCkgcmV0dXJuIG5ldyBDdWJlaGVsaXgoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbCA9IChCQ19EQSAqIGIgKyBFRCAqIHIgLSBFQiAqIGcpIC8gKEJDX0RBICsgRUQgLSBFQiksXG4gICAgICBibCA9IGIgLSBsLFxuICAgICAgayA9IChFICogKGcgLSBsKSAtIEMgKiBibCkgLyBELFxuICAgICAgcyA9IE1hdGguc3FydChrICogayArIGJsICogYmwpIC8gKEUgKiBsICogKDEgLSBsKSksIC8vIE5hTiBpZiBsPTAgb3IgbD0xXG4gICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogZGVncmVlcyAtIDEyMCA6IE5hTjtcbiAgcmV0dXJuIG5ldyBDdWJlaGVsaXgoaCA8IDAgPyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjdWJlaGVsaXhDb252ZXJ0KGgpIDogbmV3IEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIHJhZGlhbnMsXG4gICAgICAgIGwgPSArdGhpcy5sLFxuICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSxcbiAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLFxuICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsICJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIGlmICghYikgYiA9IFtdO1xuICB2YXIgbiA9IGEgPyBNYXRoLm1pbihiLmxlbmd0aCwgYS5sZW5ndGgpIDogMCxcbiAgICAgIGMgPSBiLnNsaWNlKCksXG4gICAgICBpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0O1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7XG4gIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoeCkgJiYgISh4IGluc3RhbmNlb2YgRGF0YVZpZXcpO1xufVxuIiwgImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gKGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheSA6IGdlbmVyaWNBcnJheSkoYSwgYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljQXJyYXkoYSwgYikge1xuICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLFxuICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsXG4gICAgICB4ID0gbmV3IEFycmF5KG5hKSxcbiAgICAgIGMgPSBuZXcgQXJyYXkobmIpLFxuICAgICAgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9IHZhbHVlKGFbaV0sIGJbaV0pO1xuICBmb3IgKDsgaSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldO1xuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZTtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGQuc2V0VGltZShhICogKDEgLSB0KSArIGIgKiB0KSwgZDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwgImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBpID0ge30sXG4gICAgICBjID0ge30sXG4gICAgICBrO1xuXG4gIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSBcIm9iamVjdFwiKSBhID0ge307XG4gIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSBiID0ge307XG5cbiAgZm9yIChrIGluIGIpIHtcbiAgICBpZiAoayBpbiBhKSB7XG4gICAgICBpW2tdID0gdmFsdWUoYVtrXSwgYltrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCAiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgcmdiIGZyb20gXCIuL3JnYi5qc1wiO1xuaW1wb3J0IHtnZW5lcmljQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCI7XG5pbXBvcnQgZGF0ZSBmcm9tIFwiLi9kYXRlLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IG9iamVjdCBmcm9tIFwiLi9vYmplY3QuanNcIjtcbmltcG9ydCBzdHJpbmcgZnJvbSBcIi4vc3RyaW5nLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBudW1iZXJBcnJheSwge2lzTnVtYmVyQXJyYXl9IGZyb20gXCIuL251bWJlckFycmF5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIHQgPSB0eXBlb2YgYiwgYztcbiAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSBcImJvb2xlYW5cIiA/IGNvbnN0YW50KGIpXG4gICAgICA6ICh0ID09PSBcIm51bWJlclwiID8gbnVtYmVyXG4gICAgICA6IHQgPT09IFwic3RyaW5nXCIgPyAoKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIHJnYikgOiBzdHJpbmcpXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IHJnYlxuICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVcbiAgICAgIDogaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5XG4gICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJyYXlcbiAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSBcImZ1bmN0aW9uXCIgfHwgaXNOYU4oYikgPyBvYmplY3RcbiAgICAgIDogbnVtYmVyKShhLCBiKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKiAoMSAtIHQpICsgYiAqIHQpO1xuICB9O1xufVxuIiwgInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwgImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsICJpbXBvcnQgbnVtYmVyIGZyb20gXCIuLi9udW1iZXIuanNcIjtcbmltcG9ydCB7cGFyc2VDc3MsIHBhcnNlU3ZnfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgXCJweCwgXCIsIFwicHgpXCIsIFwiZGVnKVwiKTtcbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgXCIsIFwiLCBcIilcIiwgXCIpXCIpO1xuIiwgInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAgXHUyMjQ1IHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCAiaW1wb3J0IHtjdWJlaGVsaXggYXMgY29sb3JDdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXgoaHVlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gY3ViZWhlbGl4R2FtbWEoeSkge1xuICAgIHkgPSAreTtcblxuICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjb2xvckN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBjb2xvckN1YmVoZWxpeChlbmQpKS5oKSxcbiAgICAgICAgICBzID0gY29sb3Ioc3RhcnQucywgZW5kLnMpLFxuICAgICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgICBzdGFydC5zID0gcyh0KTtcbiAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpO1xuICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7XG5cbiAgICByZXR1cm4gY3ViZWhlbGl4O1xuICB9KSgxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3ViZWhlbGl4KGh1ZSk7XG5leHBvcnQgdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgoY29sb3IpO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikge1xuICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNhbXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpO1xuICByZXR1cm4gc2FtcGxlcztcbn1cbiIsICJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2VcdTIwMTl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVuXHUyMDE5dCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1RpbWVyfSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7XG4gIHQucmVzdGFydChlbGFwc2VkID0+IHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsICJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUmdiLCBpbnRlcnBvbGF0ZVN0cmluZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGM7XG4gIHJldHVybiAodHlwZW9mIGIgPT09IFwibnVtYmVyXCIgPyBpbnRlcnBvbGF0ZU51bWJlclxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYlxuICAgICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpXG4gICAgICA6IGludGVycG9sYXRlU3RyaW5nKShhLCBiKTtcbn1cbiIsICJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsICJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCAiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdG9yQWxsfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkge1xuICAgICAgICAgICAgc2NoZWR1bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCAiZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaS5jYWxsKHRoaXMsIHQpLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciB0LCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwgImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsICJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCAiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsXG4gIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sXG4gIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLFxuICBvbjogdHJhbnNpdGlvbl9vbixcbiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLFxuICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLFxuICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSxcbiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLFxuICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsXG4gIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sXG4gIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsXG4gIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLFxuICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sXG4gIGVhc2U6IHRyYW5zaXRpb25fZWFzZSxcbiAgZWFzZVZhcnlpbmc6IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcsXG4gIGVuZDogdHJhbnNpdGlvbl9lbmQsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25fcHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1cbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3BvaW50ZXIsIHNlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBCcnVzaEV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxudmFyIE1PREVfRFJBRyA9IHtuYW1lOiBcImRyYWdcIn0sXG4gICAgTU9ERV9TUEFDRSA9IHtuYW1lOiBcInNwYWNlXCJ9LFxuICAgIE1PREVfSEFORExFID0ge25hbWU6IFwiaGFuZGxlXCJ9LFxuICAgIE1PREVfQ0VOVEVSID0ge25hbWU6IFwiY2VudGVyXCJ9O1xuXG5jb25zdCB7YWJzLCBtYXgsIG1pbn0gPSBNYXRoO1xuXG5mdW5jdGlvbiBudW1iZXIxKGUpIHtcbiAgcmV0dXJuIFsrZVswXSwgK2VbMV1dO1xufVxuXG5mdW5jdGlvbiBudW1iZXIyKGUpIHtcbiAgcmV0dXJuIFtudW1iZXIxKGVbMF0pLCBudW1iZXIxKGVbMV0pXTtcbn1cblxudmFyIFggPSB7XG4gIG5hbWU6IFwieFwiLFxuICBoYW5kbGVzOiBbXCJ3XCIsIFwiZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4LCBlKSB7IHJldHVybiB4ID09IG51bGwgPyBudWxsIDogW1sreFswXSwgZVswXVsxXV0sIFsreFsxXSwgZVsxXVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfVxufTtcblxudmFyIFkgPSB7XG4gIG5hbWU6IFwieVwiLFxuICBoYW5kbGVzOiBbXCJuXCIsIFwic1wiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0sIFtlWzFdWzBdLCAreVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMV0sIHh5WzFdWzFdXTsgfVxufTtcblxudmFyIFhZID0ge1xuICBuYW1lOiBcInh5XCIsXG4gIGhhbmRsZXM6IFtcIm5cIiwgXCJ3XCIsIFwiZVwiLCBcInNcIiwgXCJud1wiLCBcIm5lXCIsIFwic3dcIiwgXCJzZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgPT0gbnVsbCA/IG51bGwgOiBudW1iZXIyKHh5KTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH1cbn07XG5cbnZhciBjdXJzb3JzID0ge1xuICBvdmVybGF5OiBcImNyb3NzaGFpclwiLFxuICBzZWxlY3Rpb246IFwibW92ZVwiLFxuICBuOiBcIm5zLXJlc2l6ZVwiLFxuICBlOiBcImV3LXJlc2l6ZVwiLFxuICBzOiBcIm5zLXJlc2l6ZVwiLFxuICB3OiBcImV3LXJlc2l6ZVwiLFxuICBudzogXCJud3NlLXJlc2l6ZVwiLFxuICBuZTogXCJuZXN3LXJlc2l6ZVwiLFxuICBzZTogXCJud3NlLXJlc2l6ZVwiLFxuICBzdzogXCJuZXN3LXJlc2l6ZVwiXG59O1xuXG52YXIgZmxpcFggPSB7XG4gIGU6IFwid1wiLFxuICB3OiBcImVcIixcbiAgbnc6IFwibmVcIixcbiAgbmU6IFwibndcIixcbiAgc2U6IFwic3dcIixcbiAgc3c6IFwic2VcIlxufTtcblxudmFyIGZsaXBZID0ge1xuICBuOiBcInNcIixcbiAgczogXCJuXCIsXG4gIG53OiBcInN3XCIsXG4gIG5lOiBcInNlXCIsXG4gIHNlOiBcIm5lXCIsXG4gIHN3OiBcIm53XCJcbn07XG5cbnZhciBzaWduc1ggPSB7XG4gIG92ZXJsYXk6ICsxLFxuICBzZWxlY3Rpb246ICsxLFxuICBuOiBudWxsLFxuICBlOiArMSxcbiAgczogbnVsbCxcbiAgdzogLTEsXG4gIG53OiAtMSxcbiAgbmU6ICsxLFxuICBzZTogKzEsXG4gIHN3OiAtMVxufTtcblxudmFyIHNpZ25zWSA9IHtcbiAgb3ZlcmxheTogKzEsXG4gIHNlbGVjdGlvbjogKzEsXG4gIG46IC0xLFxuICBlOiBudWxsLFxuICBzOiArMSxcbiAgdzogbnVsbCxcbiAgbnc6IC0xLFxuICBuZTogLTEsXG4gIHNlOiArMSxcbiAgc3c6ICsxXG59O1xuXG5mdW5jdGlvbiB0eXBlKHQpIHtcbiAgcmV0dXJuIHt0eXBlOiB0fTtcbn1cblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpcztcbiAgaWYgKHN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgc3ZnID0gc3ZnLnZpZXdCb3guYmFzZVZhbDtcbiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBzdmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG4vLyBMaWtlIGQzLmxvY2FsLCBidXQgd2l0aCB0aGUgbmFtZSBcdTIwMUNfX2JydXNoXHUyMDFEIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVkLlxuZnVuY3Rpb24gbG9jYWwobm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjtcbiAgcmV0dXJuIG5vZGUuX19icnVzaDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoZXh0ZW50KSB7XG4gIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4dGVudFsxXVswXVxuICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWCgpIHtcbiAgcmV0dXJuIGJydXNoKFgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hZKCkge1xuICByZXR1cm4gYnJ1c2goWSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gYnJ1c2goWFkpO1xufVxuXG5mdW5jdGlvbiBicnVzaChkaW0pIHtcbiAgdmFyIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGtleXMgPSB0cnVlLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImJydXNoXCIsIFwiZW5kXCIpLFxuICAgICAgaGFuZGxlU2l6ZSA9IDYsXG4gICAgICB0b3VjaGVuZGluZztcblxuICBmdW5jdGlvbiBicnVzaChncm91cCkge1xuICAgIHZhciBvdmVybGF5ID0gZ3JvdXBcbiAgICAgICAgLnByb3BlcnR5KFwiX19icnVzaFwiLCBpbml0aWFsaXplKVxuICAgICAgLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAuZGF0YShbdHlwZShcIm92ZXJsYXlcIildKTtcblxuICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJvdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KVxuICAgICAgLm1lcmdlKG92ZXJsYXkpXG4gICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBleHRlbnQgPSBsb2NhbCh0aGlzKS5leHRlbnQ7XG4gICAgICAgICAgc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAgIC5hdHRyKFwieFwiLCBleHRlbnRbMF1bMF0pXG4gICAgICAgICAgICAgIC5hdHRyKFwieVwiLCBleHRlbnRbMF1bMV0pXG4gICAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pO1xuICAgICAgICB9KTtcblxuICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgIC5kYXRhKFt0eXBlKFwic2VsZWN0aW9uXCIpXSlcbiAgICAgIC5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcInNlbGVjdGlvblwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiIzc3N1wiKVxuICAgICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjMpXG4gICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiI2ZmZlwiKVxuICAgICAgICAuYXR0cihcInNoYXBlLXJlbmRlcmluZ1wiLCBcImNyaXNwRWRnZXNcIik7XG5cbiAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgLmRhdGEoZGltLmhhbmRsZXMsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZTsgfSk7XG5cbiAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpO1xuXG4gICAgaGFuZGxlLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwiaGFuZGxlIGhhbmRsZS0tXCIgKyBkLnR5cGU7IH0pXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7XG5cbiAgICBncm91cFxuICAgICAgICAuZWFjaChyZWRyYXcpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uYnJ1c2hcIiwgc3RhcnRlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5icnVzaFwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaFwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBicnVzaC5tb3ZlID0gZnVuY3Rpb24oZ3JvdXAsIHNlbGVjdGlvbikge1xuICAgIGlmIChncm91cC50d2Vlbikge1xuICAgICAgZ3JvdXBcbiAgICAgICAgICAub24oXCJzdGFydC5icnVzaFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydChldmVudCk7IH0pXG4gICAgICAgICAgLm9uKFwiaW50ZXJydXB0LmJydXNoIGVuZC5icnVzaFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuZW5kKGV2ZW50KTsgfSlcbiAgICAgICAgICAudHdlZW4oXCJicnVzaFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCxcbiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjAgPSBzdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSxcbiAgICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoc2VsZWN0aW9uMCwgc2VsZWN0aW9uMSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHR3ZWVuKHQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gdCA9PT0gMSAmJiBzZWxlY3Rpb24xID09PSBudWxsID8gbnVsbCA6IGkodCk7XG4gICAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgICBlbWl0LmJydXNoKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24wICE9PSBudWxsICYmIHNlbGVjdGlvbjEgIT09IG51bGwgPyB0d2VlbiA6IHR3ZWVuKDEpO1xuICAgICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cFxuICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3Rpb24uYXBwbHkodGhhdCwgYXJncykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksXG4gICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJncykuYmVmb3Jlc3RhcnQoKTtcblxuICAgICAgICAgICAgaW50ZXJydXB0KHRoYXQpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uMSA9PT0gbnVsbCA/IG51bGwgOiBzZWxlY3Rpb24xO1xuICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgICAgICBlbWl0LnN0YXJ0KCkuYnJ1c2goKS5lbmQoKTtcbiAgICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkge1xuICAgIGJydXNoLm1vdmUoZ3JvdXAsIG51bGwpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhpcyksXG4gICAgICAgIHNlbGVjdGlvbiA9IGxvY2FsKHRoaXMpLnNlbGVjdGlvbjtcblxuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIHNlbGVjdGlvblswXVswXSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgc2VsZWN0aW9uWzBdWzFdKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7XG5cbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVtkLnR5cGUubGVuZ3RoIC0gMV0gPT09IFwiZVwiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlWzBdID09PSBcInNcIiA/IHNlbGVjdGlvblsxXVsxXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uWzBdWzFdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiblwiIHx8IGQudHlwZSA9PT0gXCJzXCIgPyBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSlcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiZVwiIHx8IGQudHlwZSA9PT0gXCJ3XCIgPyBzZWxlY3Rpb25bMV1bMV0gLSBzZWxlY3Rpb25bMF1bMV0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSk7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uLC5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIFwibm9uZVwiKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdmFyIGVtaXQgPSB0aGF0Ll9fYnJ1c2guZW1pdHRlcjtcbiAgICByZXR1cm4gZW1pdCAmJiAoIWNsZWFuIHx8ICFlbWl0LmNsZWFuKSA/IGVtaXQgOiBuZXcgRW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbik7XG4gIH1cblxuICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuc3RhdGUgPSB0aGF0Ll9fYnJ1c2g7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuY2xlYW4gPSBjbGVhbjtcbiAgfVxuXG4gIEVtaXR0ZXIucHJvdG90eXBlID0ge1xuICAgIGJlZm9yZXN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydGluZykgdGhpcy5zdGFydGluZyA9IGZhbHNlLCB0aGlzLmVtaXQoXCJzdGFydFwiLCBldmVudCwgbW9kZSk7XG4gICAgICBlbHNlIHRoaXMuZW1pdChcImJydXNoXCIsIGV2ZW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYnJ1c2g6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICB0aGlzLmVtaXQoXCJicnVzaFwiLCBldmVudCwgbW9kZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oZXZlbnQsIG1vZGUpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSBkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLCB0aGlzLmVtaXQoXCJlbmRcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlLCBldmVudCwgbW9kZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IEJydXNoRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICB0YXJnZXQ6IGJydXNoLFxuICAgICAgICAgIHNlbGVjdGlvbjogZGltLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbiksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBzdGFydGVkKGV2ZW50KSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICB0eXBlID0gZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsXG4gICAgICAgIG1vZGUgPSAoa2V5cyAmJiBldmVudC5tZXRhS2V5ID8gdHlwZSA9IFwib3ZlcmxheVwiIDogdHlwZSkgPT09IFwic2VsZWN0aW9uXCIgPyBNT0RFX0RSQUcgOiAoa2V5cyAmJiBldmVudC5hbHRLZXkgPyBNT0RFX0NFTlRFUiA6IE1PREVfSEFORExFKSxcbiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVdLFxuICAgICAgICBzaWduWSA9IGRpbSA9PT0gWCA/IG51bGwgOiBzaWduc1lbdHlwZV0sXG4gICAgICAgIHN0YXRlID0gbG9jYWwodGhhdCksXG4gICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCxcbiAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsXG4gICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSxcbiAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLFxuICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsXG4gICAgICAgIGR4ID0gMCxcbiAgICAgICAgZHkgPSAwLFxuICAgICAgICBtb3ZpbmcsXG4gICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYga2V5cyAmJiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgbG9ja1gsXG4gICAgICAgIGxvY2tZLFxuICAgICAgICBwb2ludHMgPSBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMgfHwgW2V2ZW50XSwgdCA9PiB7XG4gICAgICAgICAgY29uc3QgaSA9IHQuaWRlbnRpZmllcjtcbiAgICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGF0KTtcbiAgICAgICAgICB0LnBvaW50MCA9IHQuc2xpY2UoKTtcbiAgICAgICAgICB0LmlkZW50aWZpZXIgPSBpO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KTtcblxuICAgIGlmICh0eXBlID09PSBcIm92ZXJsYXlcIikge1xuICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHB0cyA9IFtwb2ludHNbMF0sIHBvaW50c1sxXSB8fCBwb2ludHNbMF1dO1xuICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uID0gW1tcbiAgICAgICAgICB3MCA9IGRpbSA9PT0gWSA/IFcgOiBtaW4ocHRzWzBdWzBdLCBwdHNbMV1bMF0pLFxuICAgICAgICAgIG4wID0gZGltID09PSBYID8gTiA6IG1pbihwdHNbMF1bMV0sIHB0c1sxXVsxXSlcbiAgICAgICAgXSwgW1xuICAgICAgICAgIGUwID0gZGltID09PSBZID8gRSA6IG1heChwdHNbMF1bMF0sIHB0c1sxXVswXSksXG4gICAgICAgICAgczAgPSBkaW0gPT09IFggPyBTIDogbWF4KHB0c1swXVsxXSwgcHRzWzFdWzFdKVxuICAgICAgICBdXTtcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoID4gMSkgbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3MCA9IHNlbGVjdGlvblswXVswXTtcbiAgICAgIG4wID0gc2VsZWN0aW9uWzBdWzFdO1xuICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07XG4gICAgICBzMCA9IHNlbGVjdGlvblsxXVsxXTtcbiAgICB9XG5cbiAgICB3MSA9IHcwO1xuICAgIG4xID0gbjA7XG4gICAgZTEgPSBlMDtcbiAgICBzMSA9IHMwO1xuXG4gICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoYXQpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xuXG4gICAgdmFyIG92ZXJsYXkgPSBncm91cC5zZWxlY3RBbGwoXCIub3ZlcmxheVwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGVdKTtcblxuICAgIGludGVycnVwdCh0aGF0KTtcbiAgICB2YXIgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzLCB0cnVlKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDtcbiAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXZlbnQudmlldylcbiAgICAgICAgICAub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgbW92ZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwibW91c2V1cC5icnVzaFwiLCBlbmRlZCwgdHJ1ZSk7XG4gICAgICBpZiAoa2V5cykgdmlld1xuICAgICAgICAgIC5vbihcImtleWRvd24uYnJ1c2hcIiwga2V5ZG93bmVkLCB0cnVlKVxuICAgICAgICAgIC5vbihcImtleXVwLmJydXNoXCIsIGtleXVwcGVkLCB0cnVlKVxuXG4gICAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICB9XG5cbiAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICBlbWl0LnN0YXJ0KGV2ZW50LCBtb2RlLm5hbWUpO1xuXG4gICAgZnVuY3Rpb24gbW92ZWQoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcyB8fCBbZXZlbnRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBwb2ludHMpXG4gICAgICAgICAgaWYgKGQuaWRlbnRpZmllciA9PT0gcC5pZGVudGlmaWVyKSBkLmN1ciA9IHBvaW50ZXIocCwgdGhhdCk7XG4gICAgICB9XG4gICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSAmJiBwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICBpZiAoYWJzKHBvaW50LmN1clswXSAtIHBvaW50WzBdKSA+IGFicyhwb2ludC5jdXJbMV0gLSBwb2ludFsxXSkpXG4gICAgICAgICAgbG9ja1kgPSB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbG9ja1ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpXG4gICAgICAgIGlmIChwb2ludC5jdXIpIHBvaW50WzBdID0gcG9pbnQuY3VyWzBdLCBwb2ludFsxXSA9IHBvaW50LmN1clsxXTtcbiAgICAgIG1vdmluZyA9IHRydWU7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIG1vdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdLCBwb2ludDAgPSBwb2ludC5wb2ludDA7XG4gICAgICB2YXIgdDtcblxuICAgICAgZHggPSBwb2ludFswXSAtIHBvaW50MFswXTtcbiAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIE1PREVfU1BBQ0U6XG4gICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7XG4gICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMCArIGR4O1xuICAgICAgICAgIGlmIChzaWduWSkgZHkgPSBtYXgoTiAtIG4wLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wICsgZHksIHMxID0gczAgKyBkeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1PREVfSEFORExFOiB7XG4gICAgICAgICAgaWYgKHBvaW50c1sxXSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IG1heChXLCBtaW4oRSwgcG9pbnRzWzBdWzBdKSksIGUxID0gbWF4KFcsIG1pbihFLCBwb2ludHNbMV1bMF0pKSwgc2lnblggPSAxO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IG1heChOLCBtaW4oUywgcG9pbnRzWzBdWzFdKSksIHMxID0gbWF4KE4sIG1pbihTLCBwb2ludHNbMV1bMV0pKSwgc2lnblkgPSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25YID4gMCkgZHggPSBtYXgoVyAtIGUwLCBtaW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBkeSA9IG1heChOIC0gbjAsIG1pbihTIC0gbjAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBtYXgoTiAtIHMwLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIHcxID0gbWF4KFcsIG1pbihFLCB3MCAtIGR4ICogc2lnblgpKSwgZTEgPSBtYXgoVywgbWluKEUsIGUwICsgZHggKiBzaWduWCkpO1xuICAgICAgICAgIGlmIChzaWduWSkgbjEgPSBtYXgoTiwgbWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IG1heChOLCBtaW4oUywgczAgKyBkeSAqIHNpZ25ZKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUxIDwgdzEpIHtcbiAgICAgICAgc2lnblggKj0gLTE7XG4gICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0O1xuICAgICAgICB0ID0gdzEsIHcxID0gZTEsIGUxID0gdDtcbiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFgpIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWFt0eXBlXV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoczEgPCBuMSkge1xuICAgICAgICBzaWduWSAqPSAtMTtcbiAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7XG4gICAgICAgIHQgPSBuMSwgbjEgPSBzMSwgczEgPSB0O1xuICAgICAgICBpZiAodHlwZSBpbiBmbGlwWSkgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZSA9IGZsaXBZW3R5cGVdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIVxuICAgICAgaWYgKGxvY2tYKSB3MSA9IHNlbGVjdGlvblswXVswXSwgZTEgPSBzZWxlY3Rpb25bMV1bMF07XG4gICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTtcblxuICAgICAgaWYgKHNlbGVjdGlvblswXVswXSAhPT0gdzFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1bMV0gIT09IG4xXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzBdICE9PSBlMVxuICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVsxXSAhPT0gczEpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3MSwgbjFdLCBbZTEsIHMxXV07XG4gICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICBlbWl0LmJydXNoKGV2ZW50LCBtb2RlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZGVkKGV2ZW50KSB7XG4gICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIG1vdmluZyk7XG4gICAgICAgIHZpZXcub24oXCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoXCIsIG51bGwpO1xuICAgICAgfVxuICAgICAgZ3JvdXAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpO1xuICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMub3ZlcmxheSk7XG4gICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSAob24gc3RhcnQpIVxuICAgICAgaWYgKGVtcHR5KHNlbGVjdGlvbikpIHN0YXRlLnNlbGVjdGlvbiA9IG51bGwsIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgZW1pdC5lbmQoZXZlbnQsIG1vZGUubmFtZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5ZG93bmVkKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0U7IHRha2VzIHByaW9yaXR5IG92ZXIgQUxUXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFIHx8IG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxIC0gZHg7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MSAtIGR4O1xuICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMSAtIGR5OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjEgLSBkeTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX1NQQUNFO1xuICAgICAgICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5dXBwZWQoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgaWYgKHNoaWZ0aW5nKSB7XG4gICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hBTkRMRTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMjogeyAvLyBTUEFDRVxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX1NQQUNFKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YO1xuICAgICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTtcbiAgICAgICAgICAgICAgbW9kZSA9IE1PREVfQ0VOVEVSO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxO1xuICAgICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxOyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7XG4gICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hBTkRMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGVdKTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZGVkKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fX2JydXNoIHx8IHtzZWxlY3Rpb246IG51bGx9O1xuICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIHN0YXRlLmRpbSA9IGRpbTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50O1xuICB9O1xuXG4gIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGJydXNoKSA6IGZpbHRlcjtcbiAgfTtcblxuICBicnVzaC50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgYnJ1c2guaGFuZGxlU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7XG4gIH07XG5cbiAgYnJ1c2gua2V5TW9kaWZpZXJzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSAhIV8sIGJydXNoKSA6IGtleXM7XG4gIH07XG5cbiAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gYnJ1c2g7XG59XG4iLCAiY29uc3QgcGkgPSBNYXRoLlBJLFxuICAgIHRhdSA9IDIgKiBwaSxcbiAgICBlcHNpbG9uID0gMWUtNixcbiAgICB0YXVFcHNpbG9uID0gdGF1IC0gZXBzaWxvbjtcblxuZnVuY3Rpb24gUGF0aCgpIHtcbiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl94MSA9IHRoaXMuX3kxID0gbnVsbDsgLy8gZW5kIG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl8gPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gbmV3IFBhdGg7XG59XG5cblBhdGgucHJvdG90eXBlID0gcGF0aC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQYXRoLFxuICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3gxICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl94MSA9IHRoaXMuX3gwLCB0aGlzLl95MSA9IHRoaXMuX3kwO1xuICAgICAgdGhpcy5fICs9IFwiWlwiO1xuICAgIH1cbiAgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiTFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIlFcIiArICgreDEpICsgXCIsXCIgKyAoK3kxKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiQ1wiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAoK3gyKSArIFwiLFwiICsgKCt5MikgKyBcIixcIiArICh0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHtcbiAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyO1xuICAgIHZhciB4MCA9IHRoaXMuX3gxLFxuICAgICAgICB5MCA9IHRoaXMuX3kxLFxuICAgICAgICB4MjEgPSB4MiAtIHgxLFxuICAgICAgICB5MjEgPSB5MiAtIHkxLFxuICAgICAgICB4MDEgPSB4MCAtIHgxLFxuICAgICAgICB5MDEgPSB5MCAtIHkxLFxuICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTtcblxuICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLlxuICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibmVnYXRpdmUgcmFkaXVzOiBcIiArIHIpO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy5cbiAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbikpO1xuXG4gICAgLy8gT3IsIGFyZSAoeDAseTApLCAoeDEseTEpIGFuZCAoeDIseTIpIGNvbGxpbmVhcj9cbiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4Mix5Mik/XG4gICAgLy8gT3IsIGlzIHRoZSByYWRpdXMgemVybz8gTGluZSB0byAoeDEseTEpLlxuICAgIGVsc2UgaWYgKCEoTWF0aC5hYnMoeTAxICogeDIxIC0geTIxICogeDAxKSA+IGVwc2lsb24pIHx8ICFyKSB7XG4gICAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHgyMCA9IHgyIC0geDAsXG4gICAgICAgICAgeTIwID0geTIgLSB5MCxcbiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSxcbiAgICAgICAgICBsMjBfMiA9IHgyMCAqIHgyMCArIHkyMCAqIHkyMCxcbiAgICAgICAgICBsMjEgPSBNYXRoLnNxcnQobDIxXzIpLFxuICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksXG4gICAgICAgICAgbCA9IHIgKiBNYXRoLnRhbigocGkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLFxuICAgICAgICAgIHQwMSA9IGwgLyBsMDEsXG4gICAgICAgICAgdDIxID0gbCAvIGwyMTtcblxuICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLlxuICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbikge1xuICAgICAgICB0aGlzLl8gKz0gXCJMXCIgKyAoeDEgKyB0MDEgKiB4MDEpICsgXCIsXCIgKyAoeTEgKyB0MDEgKiB5MDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwwLFwiICsgKCsoeTAxICogeDIwID4geDAxICogeTIwKSkgKyBcIixcIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEgKyB0MjEgKiB5MjEpO1xuICAgIH1cbiAgfSxcbiAgYXJjOiBmdW5jdGlvbih4LCB5LCByLCBhMCwgYTEsIGNjdykge1xuICAgIHggPSAreCwgeSA9ICt5LCByID0gK3IsIGNjdyA9ICEhY2N3O1xuICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksXG4gICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSxcbiAgICAgICAgeDAgPSB4ICsgZHgsXG4gICAgICAgIHkwID0geSArIGR5LFxuICAgICAgICBjdyA9IDEgXiBjY3csXG4gICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihcIm5lZ2F0aXZlIHJhZGl1czogXCIgKyByKTtcblxuICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDAseTApLlxuICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fICs9IFwiTVwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuXG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiTFwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZVx1MjAxOXJlIGRvbmUuXG4gICAgaWYgKCFyKSByZXR1cm47XG5cbiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uXG4gICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSArIHRhdTtcblxuICAgIC8vIElzIHRoaXMgYSBjb21wbGV0ZSBjaXJjbGU/IERyYXcgdHdvIGFyY3MgdG8gY29tcGxldGUgdGhlIGNpcmNsZS5cbiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwxLFwiICsgY3cgKyBcIixcIiArICh4IC0gZHgpICsgXCIsXCIgKyAoeSAtIGR5KSArIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMSxcIiArIGN3ICsgXCIsXCIgKyAodGhpcy5feDEgPSB4MCkgKyBcIixcIiArICh0aGlzLl95MSA9IHkwKTtcbiAgICB9XG5cbiAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIVxuICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsXCIgKyAoKyhkYSA+PSBwaSkpICsgXCIsXCIgKyBjdyArIFwiLFwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5ICsgciAqIE1hdGguc2luKGExKSk7XG4gICAgfVxuICB9LFxuICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy5fICs9IFwiTVwiICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgXCJoXCIgKyAoK3cpICsgXCJ2XCIgKyAoK2gpICsgXCJoXCIgKyAoLXcpICsgXCJaXCI7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIG5vZGVzLCBzdHJlbmd0aCA9IDE7XG5cbiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7XG4gIGlmICh5ID09IG51bGwpIHkgPSAwO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBub2RlLFxuICAgICAgICBzeCA9IDAsXG4gICAgICAgIHN5ID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgc3ggKz0gbm9kZS54LCBzeSArPSBub2RlLnk7XG4gICAgfVxuXG4gICAgZm9yIChzeCA9IChzeCAvIG4gLSB4KSAqIHN0cmVuZ3RoLCBzeSA9IChzeSAvIG4gLSB5KSAqIHN0cmVuZ3RoLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnggLT0gc3gsIG5vZGUueSAtPSBzeTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDtcbiAgfTtcblxuICBmb3JjZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywgZm9yY2UpIDogeTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBjb25zdCB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSxcbiAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpO1xuICByZXR1cm4gYWRkKHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpO1xufVxuXG5mdW5jdGlvbiBhZGQodHJlZSwgeCwgeSwgZCkge1xuICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiB0cmVlOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgcGFyZW50LFxuICAgICAgbm9kZSA9IHRyZWUuX3Jvb3QsXG4gICAgICBsZWFmID0ge2RhdGE6IGR9LFxuICAgICAgeDAgPSB0cmVlLl94MCxcbiAgICAgIHkwID0gdHJlZS5feTAsXG4gICAgICB4MSA9IHRyZWUuX3gxLFxuICAgICAgeTEgPSB0cmVlLl95MSxcbiAgICAgIHhtLFxuICAgICAgeW0sXG4gICAgICB4cCxcbiAgICAgIHlwLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIEZpbmQgdGhlIGV4aXN0aW5nIGxlYWYgZm9yIHRoZSBuZXcgcG9pbnQsIG9yIGFkZCBpdC5cbiAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7XG4gIH1cblxuICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD9cbiAgeHAgPSArdHJlZS5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSk7XG4gIHlwID0gK3RyZWUuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7XG5cbiAgLy8gT3RoZXJ3aXNlLCBzcGxpdCB0aGUgbGVhZiBub2RlIHVudGlsIHRoZSBvbGQgYW5kIG5ldyBwb2ludCBhcmUgc2VwYXJhdGVkLlxuICBkbyB7XG4gICAgcGFyZW50ID0gcGFyZW50ID8gcGFyZW50W2ldID0gbmV3IEFycmF5KDQpIDogdHJlZS5fcm9vdCA9IG5ldyBBcnJheSg0KTtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgfSB3aGlsZSAoKGkgPSBib3R0b20gPDwgMSB8IHJpZ2h0KSA9PT0gKGogPSAoeXAgPj0geW0pIDw8IDEgfCAoeHAgPj0geG0pKSk7XG4gIHJldHVybiBwYXJlbnRbal0gPSBub2RlLCBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHtcbiAgdmFyIGQsIGksIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeHogPSBuZXcgQXJyYXkobiksXG4gICAgICB5eiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHgwID0gSW5maW5pdHksXG4gICAgICB5MCA9IEluZmluaXR5LFxuICAgICAgeDEgPSAtSW5maW5pdHksXG4gICAgICB5MSA9IC1JbmZpbml0eTtcblxuICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7XG4gICAgeHpbaV0gPSB4O1xuICAgIHl6W2ldID0geTtcbiAgICBpZiAoeCA8IHgwKSB4MCA9IHg7XG4gICAgaWYgKHggPiB4MSkgeDEgPSB4O1xuICAgIGlmICh5IDwgeTApIHkwID0geTtcbiAgICBpZiAoeSA+IHkxKSB5MSA9IHk7XG4gIH1cblxuICAvLyBJZiB0aGVyZSB3ZXJlIG5vICh2YWxpZCkgcG9pbnRzLCBhYm9ydC5cbiAgaWYgKHgwID4geDEgfHwgeTAgPiB5MSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRXhwYW5kIHRoZSB0cmVlIHRvIGNvdmVyIHRoZSBuZXcgcG9pbnRzLlxuICB0aGlzLmNvdmVyKHgwLCB5MCkuY292ZXIoeDEsIHkxKTtcblxuICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgaWYgKGlzTmFOKHggPSAreCkgfHwgaXNOYU4oeSA9ICt5KSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxO1xuXG4gIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uXG4gIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCxcbiAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9uXHUyMDE5dCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIVxuICBpZiAoaXNOYU4oeDApKSB7XG4gICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7XG4gICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIGRvdWJsZSByZXBlYXRlZGx5IHRvIGNvdmVyLlxuICBlbHNlIHtcbiAgICB2YXIgeiA9IHgxIC0geDAgfHwgMSxcbiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlICh4MCA+IHggfHwgeCA+PSB4MSB8fCB5MCA+IHkgfHwgeSA+PSB5MSkge1xuICAgICAgaSA9ICh5IDwgeTApIDw8IDEgfCAoeCA8IHgwKTtcbiAgICAgIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyO1xuICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgIGNhc2UgMDogeDEgPSB4MCArIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IHgxID0geDAgKyB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogeDAgPSB4MSAtIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGEgPSBbXTtcbiAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gZGF0YS5wdXNoKG5vZGUuZGF0YSk7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmNvdmVyKCtfWzBdWzBdLCArX1swXVsxXSkuY292ZXIoK19bMV1bMF0sICtfWzFdWzFdKVxuICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLngwID0geDA7XG4gIHRoaXMueTAgPSB5MDtcbiAgdGhpcy54MSA9IHgxO1xuICB0aGlzLnkxID0geTE7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgdmFyIGRhdGEsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxLFxuICAgICAgeTEsXG4gICAgICB4MixcbiAgICAgIHkyLFxuICAgICAgeDMgPSB0aGlzLl94MSxcbiAgICAgIHkzID0gdGhpcy5feTEsXG4gICAgICBxdWFkcyA9IFtdLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBxLFxuICAgICAgaTtcblxuICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB4MCwgeTAsIHgzLCB5MykpO1xuICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5O1xuICBlbHNlIHtcbiAgICB4MCA9IHggLSByYWRpdXMsIHkwID0geSAtIHJhZGl1cztcbiAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1cztcbiAgICByYWRpdXMgKj0gcmFkaXVzO1xuICB9XG5cbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuXG4gICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhpcyBxdWFkcmFudCBjYW5cdTIwMTl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS5cbiAgICBpZiAoIShub2RlID0gcS5ub2RlKVxuICAgICAgICB8fCAoeDEgPSBxLngwKSA+IHgzXG4gICAgICAgIHx8ICh5MSA9IHEueTApID4geTNcbiAgICAgICAgfHwgKHgyID0gcS54MSkgPCB4MFxuICAgICAgICB8fCAoeTIgPSBxLnkxKSA8IHkwKSBjb250aW51ZTtcblxuICAgIC8vIEJpc2VjdCB0aGUgY3VycmVudCBxdWFkcmFudC5cbiAgICBpZiAobm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsXG4gICAgICAgICAgeW0gPSAoeTEgKyB5MikgLyAyO1xuXG4gICAgICBxdWFkcy5wdXNoKFxuICAgICAgICBuZXcgUXVhZChub2RlWzNdLCB4bSwgeW0sIHgyLCB5MiksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMl0sIHgxLCB5bSwgeG0sIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0pLFxuICAgICAgICBuZXcgUXVhZChub2RlWzBdLCB4MSwgeTEsIHhtLCB5bSlcbiAgICAgICk7XG5cbiAgICAgIC8vIFZpc2l0IHRoZSBjbG9zZXN0IHF1YWRyYW50IGZpcnN0LlxuICAgICAgaWYgKGkgPSAoeSA+PSB5bSkgPDwgMSB8ICh4ID49IHhtKSkge1xuICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV0gPSBxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50IHBvaW50cyBpc25cdTIwMTl0IG5lY2Vzc2FyeSEpXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZHggPSB4IC0gK3RoaXMuX3guY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGR5ID0geSAtICt0aGlzLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSxcbiAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGQyIDwgcmFkaXVzKSB7XG4gICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJhZGl1cyA9IGQyKTtcbiAgICAgICAgeDAgPSB4IC0gZCwgeTAgPSB5IC0gZDtcbiAgICAgICAgeDMgPSB4ICsgZCwgeTMgPSB5ICsgZDtcbiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkKSB7XG4gIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHBhcmVudCxcbiAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgcmV0YWluZXIsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIG5leHQsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB4bSxcbiAgICAgIHltLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRmluZCB0aGUgbGVhZiBub2RlIGZvciB0aGUgcG9pbnQuXG4gIC8vIFdoaWxlIGRlc2NlbmRpbmcsIGFsc28gcmV0YWluIHRoZSBkZWVwZXN0IHBhcmVudCB3aXRoIGEgbm9uLXJlbW92ZWQgc2libGluZy5cbiAgaWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICAgIGlmICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiB0aGlzO1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGJyZWFrO1xuICAgIGlmIChwYXJlbnRbKGkgKyAxKSAmIDNdIHx8IHBhcmVudFsoaSArIDIpICYgM10gfHwgcGFyZW50WyhpICsgMykgJiAzXSkgcmV0YWluZXIgPSBwYXJlbnQsIGogPSBpO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcG9pbnQgdG8gcmVtb3ZlLlxuICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpcztcbiAgaWYgKG5leHQgPSBub2RlLm5leHQpIGRlbGV0ZSBub2RlLm5leHQ7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuXG4gIGlmIChwcmV2aW91cykgcmV0dXJuIChuZXh0ID8gcHJldmlvdXMubmV4dCA9IG5leHQgOiBkZWxldGUgcHJldmlvdXMubmV4dCksIHRoaXM7XG5cbiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LlxuICBpZiAoIXBhcmVudCkgcmV0dXJuIHRoaXMuX3Jvb3QgPSBuZXh0LCB0aGlzO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlYWYuXG4gIG5leHQgPyBwYXJlbnRbaV0gPSBuZXh0IDogZGVsZXRlIHBhcmVudFtpXTtcblxuICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLlxuICBpZiAoKG5vZGUgPSBwYXJlbnRbMF0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbM10pXG4gICAgICAmJiBub2RlID09PSAocGFyZW50WzNdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzBdKVxuICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJldGFpbmVyKSByZXRhaW5lcltqXSA9IG5vZGU7XG4gICAgZWxzZSB0aGlzLl9yb290ID0gbm9kZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBkYXRhLmxlbmd0aDsgaSA8IG47ICsraSkgdGhpcy5yZW1vdmUoZGF0YVtpXSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcm9vdDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSAwO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyArK3NpemU7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIHNpemU7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgcSwgbm9kZSA9IHRoaXMuX3Jvb3QsIGNoaWxkLCB4MCwgeTAsIHgxLCB5MTtcbiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTtcbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuICAgIGlmICghY2FsbGJhY2sobm9kZSA9IHEubm9kZSwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxKSAmJiBub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzFdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeTAsIHgxLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxO1xuICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgdmFyIG5vZGUgPSBxLm5vZGU7XG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgIH1cbiAgICBuZXh0LnB1c2gocSk7XG4gIH1cbiAgd2hpbGUgKHEgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFgoZCkge1xuICByZXR1cm4gZFswXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl94ID0gXywgdGhpcykgOiB0aGlzLl94O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WShkKSB7XG4gIHJldHVybiBkWzFdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6IHRoaXMuX3k7XG59XG4iLCAiaW1wb3J0IHRyZWVfYWRkLCB7YWRkQWxsIGFzIHRyZWVfYWRkQWxsfSBmcm9tIFwiLi9hZGQuanNcIjtcbmltcG9ydCB0cmVlX2NvdmVyIGZyb20gXCIuL2NvdmVyLmpzXCI7XG5pbXBvcnQgdHJlZV9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB0cmVlX2V4dGVudCBmcm9tIFwiLi9leHRlbnQuanNcIjtcbmltcG9ydCB0cmVlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IHRyZWVfcmVtb3ZlLCB7cmVtb3ZlQWxsIGFzIHRyZWVfcmVtb3ZlQWxsfSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmVlX3Jvb3QgZnJvbSBcIi4vcm9vdC5qc1wiO1xuaW1wb3J0IHRyZWVfc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdCBmcm9tIFwiLi92aXNpdC5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXRBZnRlciBmcm9tIFwiLi92aXNpdEFmdGVyLmpzXCI7XG5pbXBvcnQgdHJlZV94LCB7ZGVmYXVsdFh9IGZyb20gXCIuL3guanNcIjtcbmltcG9ydCB0cmVlX3ksIHtkZWZhdWx0WX0gZnJvbSBcIi4veS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFkdHJlZShub2RlcywgeCwgeSkge1xuICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTtcbiAgcmV0dXJuIG5vZGVzID09IG51bGwgPyB0cmVlIDogdHJlZS5hZGRBbGwobm9kZXMpO1xufVxuXG5mdW5jdGlvbiBRdWFkdHJlZSh4LCB5LCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLl94ID0geDtcbiAgdGhpcy5feSA9IHk7XG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7XG4gIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5O1xuICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9O1xuICByZXR1cm4gY29weTtcbn1cblxudmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0cmVlLnByb3RvdHlwZTtcblxudHJlZVByb3RvLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBub2RlcyxcbiAgICAgIGNoaWxkO1xuXG4gIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7XG5cbiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7XG5cbiAgbm9kZXMgPSBbe3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pO1xuICAgICAgICBlbHNlIG5vZGUudGFyZ2V0W2ldID0gbGVhZl9jb3B5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDtcbnRyZWVQcm90by5hZGRBbGwgPSB0cmVlX2FkZEFsbDtcbnRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7XG50cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTtcbnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDtcbnRyZWVQcm90by5maW5kID0gdHJlZV9maW5kO1xudHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlO1xudHJlZVByb3RvLnJlbW92ZUFsbCA9IHRyZWVfcmVtb3ZlQWxsO1xudHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7XG50cmVlUHJvdG8uc2l6ZSA9IHRyZWVfc2l6ZTtcbnRyZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7XG50cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjtcbnRyZWVQcm90by54ID0gdHJlZV94O1xudHJlZVByb3RvLnkgPSB0cmVlX3k7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFuZG9tKSB7XG4gIHJldHVybiAocmFuZG9tKCkgLSAwLjUpICogMWUtNjtcbn1cbiIsICJpbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcblxuZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkLnggKyBkLnZ4O1xufVxuXG5mdW5jdGlvbiB5KGQpIHtcbiAgcmV0dXJuIGQueSArIGQudnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhZGl1cykge1xuICB2YXIgbm9kZXMsXG4gICAgICByYWRpaSxcbiAgICAgIHJhbmRvbSxcbiAgICAgIHN0cmVuZ3RoID0gMSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIHJhZGl1cyA9IGNvbnN0YW50KHJhZGl1cyA9PSBudWxsID8gMSA6ICtyYWRpdXMpO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICB0cmVlLFxuICAgICAgICBub2RlLFxuICAgICAgICB4aSxcbiAgICAgICAgeWksXG4gICAgICAgIHJpLFxuICAgICAgICByaTI7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKHByZXBhcmUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHJpID0gcmFkaWlbbm9kZS5pbmRleF0sIHJpMiA9IHJpICogcmk7XG4gICAgICAgIHhpID0gbm9kZS54ICsgbm9kZS52eDtcbiAgICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5O1xuICAgICAgICB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmluZGV4ID4gbm9kZS5pbmRleCkge1xuICAgICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LFxuICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LFxuICAgICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTtcbiAgICAgICAgICBpZiAobCA8IHIgKiByKSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBsICogc3RyZW5ndGg7XG4gICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7XG4gICAgICAgICAgICBub2RlLnZ5ICs9ICh5ICo9IGwpICogcjtcbiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpO1xuICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyByIHx8IHkxIDwgeWkgLSByO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmUocXVhZCkge1xuICAgIGlmIChxdWFkLmRhdGEpIHJldHVybiBxdWFkLnIgPSByYWRpaVtxdWFkLmRhdGEuaW5kZXhdO1xuICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBpZiAocXVhZFtpXSAmJiBxdWFkW2ldLnIgPiBxdWFkLnIpIHtcbiAgICAgICAgcXVhZC5yID0gcXVhZFtpXS5yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHJhZGlpID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgcmFkaWlbbm9kZS5pbmRleF0gPSArcmFkaXVzKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogcmFkaXVzO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5cbmZ1bmN0aW9uIGluZGV4KGQpIHtcbiAgcmV0dXJuIGQuaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGZpbmQobm9kZUJ5SWQsIG5vZGVJZCkge1xuICB2YXIgbm9kZSA9IG5vZGVCeUlkLmdldChub2RlSWQpO1xuICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihcIm5vZGUgbm90IGZvdW5kOiBcIiArIG5vZGVJZCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaW5rcykge1xuICB2YXIgaWQgPSBpbmRleCxcbiAgICAgIHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCgzMCksXG4gICAgICBkaXN0YW5jZXMsXG4gICAgICBub2RlcyxcbiAgICAgIGNvdW50LFxuICAgICAgYmlhcyxcbiAgICAgIHJhbmRvbSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmIChsaW5rcyA9PSBudWxsKSBsaW5rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7XG4gICAgcmV0dXJuIDEgLyBNYXRoLm1pbihjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGsgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbGluayA9IGxpbmtzW2ldLCBzb3VyY2UgPSBsaW5rLnNvdXJjZSwgdGFyZ2V0ID0gbGluay50YXJnZXQ7XG4gICAgICAgIHggPSB0YXJnZXQueCArIHRhcmdldC52eCAtIHNvdXJjZS54IC0gc291cmNlLnZ4IHx8IGppZ2dsZShyYW5kb20pO1xuICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUocmFuZG9tKTtcbiAgICAgICAgbCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgICAgbCA9IChsIC0gZGlzdGFuY2VzW2ldKSAvIGwgKiBhbHBoYSAqIHN0cmVuZ3Roc1tpXTtcbiAgICAgICAgeCAqPSBsLCB5ICo9IGw7XG4gICAgICAgIHRhcmdldC52eCAtPSB4ICogKGIgPSBiaWFzW2ldKTtcbiAgICAgICAgdGFyZ2V0LnZ5IC09IHkgKiBiO1xuICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpO1xuICAgICAgICBzb3VyY2UudnkgKz0geSAqIGI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCxcbiAgICAgICAgbm9kZUJ5SWQgPSBuZXcgTWFwKG5vZGVzLm1hcCgoZCwgaSkgPT4gW2lkKGQsIGksIG5vZGVzKSwgZF0pKSxcbiAgICAgICAgbGluaztcblxuICAgIGZvciAoaSA9IDAsIGNvdW50ID0gbmV3IEFycmF5KG4pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGxpbmsuaW5kZXggPSBpO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gXCJvYmplY3RcIikgbGluay5zb3VyY2UgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnNvdXJjZSk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsudGFyZ2V0ICE9PSBcIm9iamVjdFwiKSBsaW5rLnRhcmdldCA9IGZpbmQobm9kZUJ5SWQsIGxpbmsudGFyZ2V0KTtcbiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gfHwgMCkgKyAxO1xuICAgICAgY291bnRbbGluay50YXJnZXQuaW5kZXhdID0gKGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkge1xuICAgICAgbGluayA9IGxpbmtzW2ldLCBiaWFzW2ldID0gY291bnRbbGluay5zb3VyY2UuaW5kZXhdIC8gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSArIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gICAgfVxuXG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplU3RyZW5ndGgoKTtcbiAgICBkaXN0YW5jZXMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRGlzdGFuY2UoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGRpc3RhbmNlc1tpXSA9ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5rcyA9IF8sIGluaXRpYWxpemUoKSwgZm9yY2UpIDogbGlua3M7XG4gIH07XG5cbiAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSBfLCBmb3JjZSkgOiBpZDtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplU3RyZW5ndGgoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2UgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCksIGZvcmNlKSA6IGRpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICIvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfY29uZ3J1ZW50aWFsX2dlbmVyYXRvciNQYXJhbWV0ZXJzX2luX2NvbW1vbl91c2VcbmNvbnN0IGEgPSAxNjY0NTI1O1xuY29uc3QgYyA9IDEwMTM5MDQyMjM7XG5jb25zdCBtID0gNDI5NDk2NzI5NjsgLy8gMl4zMlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHMgPSAxO1xuICByZXR1cm4gKCkgPT4gKHMgPSAoYSAqIHMgKyBjKSAlIG0pIC8gbTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXJ9IGZyb20gXCJkMy10aW1lclwiO1xuaW1wb3J0IGxjZyBmcm9tIFwiLi9sY2cuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54O1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnk7XG59XG5cbnZhciBpbml0aWFsUmFkaXVzID0gMTAsXG4gICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZXMpIHtcbiAgdmFyIHNpbXVsYXRpb24sXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBhbHBoYU1pbiA9IDAuMDAxLFxuICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksXG4gICAgICBhbHBoYVRhcmdldCA9IDAsXG4gICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LFxuICAgICAgZm9yY2VzID0gbmV3IE1hcCgpLFxuICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLFxuICAgICAgZXZlbnQgPSBkaXNwYXRjaChcInRpY2tcIiwgXCJlbmRcIiksXG4gICAgICByYW5kb20gPSBsY2coKTtcblxuICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwKCkge1xuICAgIHRpY2soKTtcbiAgICBldmVudC5jYWxsKFwidGlja1wiLCBzaW11bGF0aW9uKTtcbiAgICBpZiAoYWxwaGEgPCBhbHBoYU1pbikge1xuICAgICAgc3RlcHBlci5zdG9wKCk7XG4gICAgICBldmVudC5jYWxsKFwiZW5kXCIsIHNpbXVsYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soaXRlcmF0aW9ucykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgaXRlcmF0aW9ucyA9IDE7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTtcblxuICAgICAgZm9yY2VzLmZvckVhY2goZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgZm9yY2UoYWxwaGEpO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5meCA9PSBudWxsKSBub2RlLnggKz0gbm9kZS52eCAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueCA9IG5vZGUuZngsIG5vZGUudnggPSAwO1xuICAgICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueSA9IG5vZGUuZnksIG5vZGUudnkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaW11bGF0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUuaW5kZXggPSBpO1xuICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0gbm9kZS5meDtcbiAgICAgIGlmIChub2RlLmZ5ICE9IG51bGwpIG5vZGUueSA9IG5vZGUuZnk7XG4gICAgICBpZiAoaXNOYU4obm9kZS54KSB8fCBpc05hTihub2RlLnkpKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KDAuNSArIGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7XG4gICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7XG4gICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICBpZiAoZm9yY2UuaW5pdGlhbGl6ZSkgZm9yY2UuaW5pdGlhbGl6ZShub2RlcywgcmFuZG9tKTtcbiAgICByZXR1cm4gZm9yY2U7XG4gIH1cblxuICBpbml0aWFsaXplTm9kZXMoKTtcblxuICByZXR1cm4gc2ltdWxhdGlvbiA9IHtcbiAgICB0aWNrOiB0aWNrLFxuXG4gICAgcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjtcbiAgICB9LFxuXG4gICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVzID0gXywgaW5pdGlhbGl6ZU5vZGVzKCksIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogbm9kZXM7XG4gICAgfSxcblxuICAgIGFscGhhOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhO1xuICAgIH0sXG5cbiAgICBhbHBoYU1pbjogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYU1pbjtcbiAgICB9LFxuXG4gICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFEZWNheSA9ICtfLCBzaW11bGF0aW9uKSA6ICthbHBoYURlY2F5O1xuICAgIH0sXG5cbiAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDtcbiAgICB9LFxuXG4gICAgdmVsb2NpdHlEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBzaW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5O1xuICAgIH0sXG5cbiAgICByYW5kb21Tb3VyY2U6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmRvbSA9IF8sIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogcmFuZG9tO1xuICAgIH0sXG5cbiAgICBmb3JjZTogZnVuY3Rpb24obmFtZSwgXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gKChfID09IG51bGwgPyBmb3JjZXMuZGVsZXRlKG5hbWUpIDogZm9yY2VzLnNldChuYW1lLCBpbml0aWFsaXplRm9yY2UoXykpKSwgc2ltdWxhdGlvbikgOiBmb3JjZXMuZ2V0KG5hbWUpO1xuICAgIH0sXG5cbiAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICAgIGR4LFxuICAgICAgICAgIGR5LFxuICAgICAgICAgIGQyLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2xvc2VzdDtcblxuICAgICAgaWYgKHJhZGl1cyA9PSBudWxsKSByYWRpdXMgPSBJbmZpbml0eTtcbiAgICAgIGVsc2UgcmFkaXVzICo9IHJhZGl1cztcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGR4ID0geCAtIG5vZGUueDtcbiAgICAgICAgZHkgPSB5IC0gbm9kZS55O1xuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3QgPSBub2RlLCByYWRpdXMgPSBkMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb3Nlc3Q7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoZXZlbnQub24obmFtZSwgXyksIHNpbXVsYXRpb24pIDogZXZlbnQub24obmFtZSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7cXVhZHRyZWV9IGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgamlnZ2xlIGZyb20gXCIuL2ppZ2dsZS5qc1wiO1xuaW1wb3J0IHt4LCB5fSBmcm9tIFwiLi9zaW11bGF0aW9uLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZXMsXG4gICAgICBub2RlLFxuICAgICAgcmFuZG9tLFxuICAgICAgYWxwaGEsXG4gICAgICBzdHJlbmd0aCA9IGNvbnN0YW50KC0zMCksXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICBkaXN0YW5jZU1pbjIgPSAxLFxuICAgICAgZGlzdGFuY2VNYXgyID0gSW5maW5pdHksXG4gICAgICB0aGV0YTIgPSAwLjgxO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKF8pIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKGFjY3VtdWxhdGUpO1xuICAgIGZvciAoYWxwaGEgPSBfLCBpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmluZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBhY2N1bXVsYXRlKHF1YWQpIHtcbiAgICB2YXIgc3RyZW5ndGggPSAwLCBxLCBjLCB3ZWlnaHQgPSAwLCB4LCB5LCBpO1xuXG4gICAgLy8gRm9yIGludGVybmFsIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNoaWxkIHF1YWRyYW50cy5cbiAgICBpZiAocXVhZC5sZW5ndGgpIHtcbiAgICAgIGZvciAoeCA9IHkgPSBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICBpZiAoKHEgPSBxdWFkW2ldKSAmJiAoYyA9IE1hdGguYWJzKHEudmFsdWUpKSkge1xuICAgICAgICAgIHN0cmVuZ3RoICs9IHEudmFsdWUsIHdlaWdodCArPSBjLCB4ICs9IGMgKiBxLngsIHkgKz0gYyAqIHEueTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVhZC54ID0geCAvIHdlaWdodDtcbiAgICAgIHF1YWQueSA9IHkgLyB3ZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gRm9yIGxlYWYgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY29pbmNpZGVudCBxdWFkcmFudHMuXG4gICAgZWxzZSB7XG4gICAgICBxID0gcXVhZDtcbiAgICAgIHEueCA9IHEuZGF0YS54O1xuICAgICAgcS55ID0gcS5kYXRhLnk7XG4gICAgICBkbyBzdHJlbmd0aCArPSBzdHJlbmd0aHNbcS5kYXRhLmluZGV4XTtcbiAgICAgIHdoaWxlIChxID0gcS5uZXh0KTtcbiAgICB9XG5cbiAgICBxdWFkLnZhbHVlID0gc3RyZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MSwgXywgeDIpIHtcbiAgICBpZiAoIXF1YWQudmFsdWUpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHggPSBxdWFkLnggLSBub2RlLngsXG4gICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksXG4gICAgICAgIHcgPSB4MiAtIHgxLFxuICAgICAgICBsID0geCAqIHggKyB5ICogeTtcblxuICAgIC8vIEFwcGx5IHRoZSBCYXJuZXMtSHV0IGFwcHJveGltYXRpb24gaWYgcG9zc2libGUuXG4gICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuXG4gICAgaWYgKHcgKiB3IC8gdGhldGEyIDwgbCkge1xuICAgICAgaWYgKGwgPCBkaXN0YW5jZU1heDIpIHtcbiAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7XG4gICAgICAgIG5vZGUudnggKz0geCAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICAgIG5vZGUudnkgKz0geSAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgcG9pbnRzIGRpcmVjdGx5LlxuICAgIGVsc2UgaWYgKHF1YWQubGVuZ3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47XG5cbiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC5cbiAgICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkge1xuICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTtcbiAgICB9XG5cbiAgICBkbyBpZiAocXVhZC5kYXRhICE9PSBub2RlKSB7XG4gICAgICB3ID0gc3RyZW5ndGhzW3F1YWQuZGF0YS5pbmRleF0gKiBhbHBoYSAvIGw7XG4gICAgICBub2RlLnZ4ICs9IHggKiB3O1xuICAgICAgbm9kZS52eSArPSB5ICogdztcbiAgICB9IHdoaWxlIChxdWFkID0gcXVhZC5uZXh0KTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlTWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlTWluMiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yKTtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZU1heCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1heDIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mik7XG4gIH07XG5cbiAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgXHUwMEIxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsICIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwgIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwgImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiXHUwMEI1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwiXHUyMjEyXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciBcdTIwMUN2YWx1ZVx1MjAxRCBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIFx1MjAxQ3N1ZmZpeFx1MjAxRCBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsICJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIG1heCkge1xuICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG59XG4iLCAiZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24oYSwgYikge1xuICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7XG59XG5cbmZ1bmN0aW9uIG1lYW5YKGNoaWxkcmVuKSB7XG4gIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBtZWFuWFJlZHVjZSh4LCBjKSB7XG4gIHJldHVybiB4ICsgYy54O1xufVxuXG5mdW5jdGlvbiBtYXhZKGNoaWxkcmVuKSB7XG4gIHJldHVybiAxICsgY2hpbGRyZW4ucmVkdWNlKG1heFlSZWR1Y2UsIDApO1xufVxuXG5mdW5jdGlvbiBtYXhZUmVkdWNlKHksIGMpIHtcbiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7XG59XG5cbmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuO1xuICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bMF07XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkge1xuICB2YXIgY2hpbGRyZW47XG4gIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBjbHVzdGVyKHJvb3QpIHtcbiAgICB2YXIgcHJldmlvdXNOb2RlLFxuICAgICAgICB4ID0gMDtcblxuICAgIC8vIEZpcnN0IHdhbGssIGNvbXB1dGluZyB0aGUgaW5pdGlhbCB4ICYgeSB2YWx1ZXMuXG4gICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7XG4gICAgICAgIG5vZGUueSA9IG1heFkoY2hpbGRyZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwO1xuICAgICAgICBub2RlLnkgPSAwO1xuICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSxcbiAgICAgICAgcmlnaHQgPSBsZWFmUmlnaHQocm9vdCksXG4gICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7XG5cbiAgICAvLyBTZWNvbmQgd2Fsaywgbm9ybWFsaXppbmcgeCAmIHkgdG8gdGhlIGRlc2lyZWQgc2l6ZS5cbiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlLnggPSAobm9kZS54IC0gcm9vdC54KSAqIGR4O1xuICAgICAgbm9kZS55ID0gKHJvb3QueSAtIG5vZGUueSkgKiBkeTtcbiAgICB9IDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHgwKSAvICh4MSAtIHgwKSAqIGR4O1xuICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogZHk7XG4gICAgfSk7XG4gIH1cblxuICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIGNsdXN0ZXIpIDogc2VwYXJhdGlvbjtcbiAgfTtcblxuICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pO1xuICB9O1xuXG4gIGNsdXN0ZXIubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIGNsdXN0ZXI7XG59XG4iLCAiZnVuY3Rpb24gY291bnQobm9kZSkge1xuICB2YXIgc3VtID0gMCxcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmICghaSkgc3VtID0gMTtcbiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgbm9kZS52YWx1ZSA9IHN1bTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihjb3VudCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIHRoYXQpIHtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSB7XG4gICAgY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBjaGlsZHJlbiwgaSwgaW5kZXggPSAtMTtcbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGNhbGxiYWNrLmNhbGwodGhhdCwgbm9kZSwgKytpbmRleCwgdGhpcyk7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGF0KSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIG5leHQgPSBbXSwgY2hpbGRyZW4sIGksIG4sIGluZGV4ID0gLTE7XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBuZXh0LnB1c2gobm9kZSk7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICBsZXQgaW5kZXggPSAtMTtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpIHtcbiAgICBpZiAoY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgc3VtID0gK3ZhbHVlKG5vZGUuZGF0YSkgfHwgMCxcbiAgICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLFxuICAgICAgICBpID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHdoaWxlICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlO1xuICAgIG5vZGUudmFsdWUgPSBzdW07XG4gIH0pO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVuZCkge1xuICB2YXIgc3RhcnQgPSB0aGlzLFxuICAgICAgYW5jZXN0b3IgPSBsZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLFxuICAgICAgbm9kZXMgPSBbc3RhcnRdO1xuICB3aGlsZSAoc3RhcnQgIT09IGFuY2VzdG9yKSB7XG4gICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7XG4gICAgbm9kZXMucHVzaChzdGFydCk7XG4gIH1cbiAgdmFyIGsgPSBub2Rlcy5sZW5ndGg7XG4gIHdoaWxlIChlbmQgIT09IGFuY2VzdG9yKSB7XG4gICAgbm9kZXMuc3BsaWNlKGssIDAsIGVuZCk7XG4gICAgZW5kID0gZW5kLnBhcmVudDtcbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbmZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7XG4gIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLFxuICAgICAgYk5vZGVzID0gYi5hbmNlc3RvcnMoKSxcbiAgICAgIGMgPSBudWxsO1xuICBhID0gYU5vZGVzLnBvcCgpO1xuICBiID0gYk5vZGVzLnBvcCgpO1xuICB3aGlsZSAoYSA9PT0gYikge1xuICAgIGMgPSBhO1xuICAgIGEgPSBhTm9kZXMucG9wKCk7XG4gICAgYiA9IGJOb2Rlcy5wb3AoKTtcbiAgfVxuICByZXR1cm4gYztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXTtcbiAgd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudCkge1xuICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGxlYXZlcyA9IFtdO1xuICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgbGVhdmVzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxlYXZlcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3QgPSB0aGlzLCBsaW5rcyA9IFtdO1xuICByb290LmVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICE9PSByb290KSB7IC8vIERvblx1MjAxOXQgaW5jbHVkZSB0aGUgcm9vdFx1MjAxOXMgcGFyZW50LCBpZiBhbnkuXG4gICAgICBsaW5rcy5wdXNoKHtzb3VyY2U6IG5vZGUucGFyZW50LCB0YXJnZXQ6IG5vZGV9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGlua3M7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuO1xuICBkbyB7XG4gICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107XG4gICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7XG4gICAgICB5aWVsZCBub2RlO1xuICAgICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgbmV4dC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAobmV4dC5sZW5ndGgpO1xufVxuIiwgImltcG9ydCBub2RlX2NvdW50IGZyb20gXCIuL2NvdW50LmpzXCI7XG5pbXBvcnQgbm9kZV9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBub2RlX2VhY2hCZWZvcmUgZnJvbSBcIi4vZWFjaEJlZm9yZS5qc1wiO1xuaW1wb3J0IG5vZGVfZWFjaEFmdGVyIGZyb20gXCIuL2VhY2hBZnRlci5qc1wiO1xuaW1wb3J0IG5vZGVfZmluZCBmcm9tIFwiLi9maW5kLmpzXCI7XG5pbXBvcnQgbm9kZV9zdW0gZnJvbSBcIi4vc3VtLmpzXCI7XG5pbXBvcnQgbm9kZV9zb3J0IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBub2RlX3BhdGggZnJvbSBcIi4vcGF0aC5qc1wiO1xuaW1wb3J0IG5vZGVfYW5jZXN0b3JzIGZyb20gXCIuL2FuY2VzdG9ycy5qc1wiO1xuaW1wb3J0IG5vZGVfZGVzY2VuZGFudHMgZnJvbSBcIi4vZGVzY2VuZGFudHMuanNcIjtcbmltcG9ydCBub2RlX2xlYXZlcyBmcm9tIFwiLi9sZWF2ZXMuanNcIjtcbmltcG9ydCBub2RlX2xpbmtzIGZyb20gXCIuL2xpbmtzLmpzXCI7XG5pbXBvcnQgbm9kZV9pdGVyYXRvciBmcm9tIFwiLi9pdGVyYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoaWVyYXJjaHkoZGF0YSwgY2hpbGRyZW4pIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBkYXRhID0gW3VuZGVmaW5lZCwgZGF0YV07XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIGNoaWxkcmVuID0gbWFwQ2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIGNoaWxkcmVuID0gb2JqZWN0Q2hpbGRyZW47XG4gIH1cblxuICB2YXIgcm9vdCA9IG5ldyBOb2RlKGRhdGEpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3Jvb3RdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHMsXG4gICAgICBpLFxuICAgICAgbjtcblxuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbihub2RlLmRhdGEpKSAmJiAobiA9IChjaGlsZHMgPSBBcnJheS5mcm9tKGNoaWxkcykpLmxlbmd0aCkpIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHM7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IGNoaWxkc1tpXSA9IG5ldyBOb2RlKGNoaWxkc1tpXSkpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xuICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIG5vZGVfY29weSgpIHtcbiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0Q2hpbGRyZW4oZCkge1xuICByZXR1cm4gZC5jaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oZCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShkKSA/IGRbMV0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7XG4gIGlmIChub2RlLmRhdGEudmFsdWUgIT09IHVuZGVmaW5lZCkgbm9kZS52YWx1ZSA9IG5vZGUuZGF0YS52YWx1ZTtcbiAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVpZ2h0KG5vZGUpIHtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgJiYgKG5vZGUuaGVpZ2h0IDwgKytoZWlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vZGUoZGF0YSkge1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmRlcHRoID1cbiAgdGhpcy5oZWlnaHQgPSAwO1xuICB0aGlzLnBhcmVudCA9IG51bGw7XG59XG5cbk5vZGUucHJvdG90eXBlID0gaGllcmFyY2h5LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE5vZGUsXG4gIGNvdW50OiBub2RlX2NvdW50LFxuICBlYWNoOiBub2RlX2VhY2gsXG4gIGVhY2hBZnRlcjogbm9kZV9lYWNoQWZ0ZXIsXG4gIGVhY2hCZWZvcmU6IG5vZGVfZWFjaEJlZm9yZSxcbiAgZmluZDogbm9kZV9maW5kLFxuICBzdW06IG5vZGVfc3VtLFxuICBzb3J0OiBub2RlX3NvcnQsXG4gIHBhdGg6IG5vZGVfcGF0aCxcbiAgYW5jZXN0b3JzOiBub2RlX2FuY2VzdG9ycyxcbiAgZGVzY2VuZGFudHM6IG5vZGVfZGVzY2VuZGFudHMsXG4gIGxlYXZlczogbm9kZV9sZWF2ZXMsXG4gIGxpbmtzOiBub2RlX2xpbmtzLFxuICBjb3B5OiBub2RlX2NvcHksXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBub2RlX2l0ZXJhdG9yXG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbChmKSB7XG4gIHJldHVybiBmID09IG51bGwgPyBudWxsIDogcmVxdWlyZWQoZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChmKSB7XG4gIGlmICh0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBjb25zdGFudFplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIG5vZGUueDAgPSBNYXRoLnJvdW5kKG5vZGUueDApO1xuICBub2RlLnkwID0gTWF0aC5yb3VuZChub2RlLnkwKTtcbiAgbm9kZS54MSA9IE1hdGgucm91bmQobm9kZS54MSk7XG4gIG5vZGUueTEgPSBNYXRoLnJvdW5kKG5vZGUueTEpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgbm9kZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBrID0gcGFyZW50LnZhbHVlICYmICh4MSAtIHgwKSAvIHBhcmVudC52YWx1ZTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS55MCA9IHkwLCBub2RlLnkxID0geTE7XG4gICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9kZS52YWx1ZSAqIGs7XG4gIH1cbn1cbiIsICJpbXBvcnQgcm91bmROb2RlIGZyb20gXCIuL3RyZWVtYXAvcm91bmQuanNcIjtcbmltcG9ydCB0cmVlbWFwRGljZSBmcm9tIFwiLi90cmVlbWFwL2RpY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBwYWRkaW5nID0gMCxcbiAgICAgIHJvdW5kID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHtcbiAgICB2YXIgbiA9IHJvb3QuaGVpZ2h0ICsgMTtcbiAgICByb290LngwID1cbiAgICByb290LnkwID0gcGFkZGluZztcbiAgICByb290LngxID0gZHg7XG4gICAgcm9vdC55MSA9IGR5IC8gbjtcbiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7XG4gICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShkeSwgbikge1xuICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0cmVlbWFwRGljZShub2RlLCBub2RlLngwLCBkeSAqIChub2RlLmRlcHRoICsgMSkgLyBuLCBub2RlLngxLCBkeSAqIChub2RlLmRlcHRoICsgMikgLyBuKTtcbiAgICAgIH1cbiAgICAgIHZhciB4MCA9IG5vZGUueDAsXG4gICAgICAgICAgeTAgPSBub2RlLnkwLFxuICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRpbmcsXG4gICAgICAgICAgeTEgPSBub2RlLnkxIC0gcGFkZGluZztcbiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjtcbiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIG5vZGUueDAgPSB4MDtcbiAgICAgIG5vZGUueTAgPSB5MDtcbiAgICAgIG5vZGUueDEgPSB4MTtcbiAgICAgIG5vZGUueTEgPSB5MTtcbiAgICB9O1xuICB9XG5cbiAgcGFydGl0aW9uLnJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7XG4gIH07XG5cbiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldO1xuICB9O1xuXG4gIHBhcnRpdGlvbi5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSAreCwgcGFydGl0aW9uKSA6IHBhZGRpbmc7XG4gIH07XG5cbiAgcmV0dXJuIHBhcnRpdGlvbjtcbn1cbiIsICJpbXBvcnQge3JlcXVpcmVkfSBmcm9tIFwiLi9hY2Nlc3NvcnMuanNcIjtcbmltcG9ydCB7Tm9kZSwgY29tcHV0ZUhlaWdodH0gZnJvbSBcIi4vaGllcmFyY2h5L2luZGV4LmpzXCI7XG5cbnZhciBwcmVyb290ID0ge2RlcHRoOiAtMX0sXG4gICAgYW1iaWd1b3VzID0ge307XG5cbmZ1bmN0aW9uIGRlZmF1bHRJZChkKSB7XG4gIHJldHVybiBkLmlkO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UGFyZW50SWQoZCkge1xuICByZXR1cm4gZC5wYXJlbnRJZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBpZCA9IGRlZmF1bHRJZCxcbiAgICAgIHBhcmVudElkID0gZGVmYXVsdFBhcmVudElkO1xuXG4gIGZ1bmN0aW9uIHN0cmF0aWZ5KGRhdGEpIHtcbiAgICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKGRhdGEpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBkLFxuICAgICAgICBpLFxuICAgICAgICByb290LFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgbm9kZUtleSxcbiAgICAgICAgbm9kZUJ5S2V5ID0gbmV3IE1hcDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGQgPSBub2Rlc1tpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3IE5vZGUoZCk7XG4gICAgICBpZiAoKG5vZGVJZCA9IGlkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgbm9kZUtleSA9IG5vZGUuaWQgPSBub2RlSWQ7XG4gICAgICAgIG5vZGVCeUtleS5zZXQobm9kZUtleSwgbm9kZUJ5S2V5Lmhhcyhub2RlS2V5KSA/IGFtYmlndW91cyA6IG5vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKChub2RlSWQgPSBwYXJlbnRJZChkLCBpLCBkYXRhKSkgIT0gbnVsbCAmJiAobm9kZUlkICs9IFwiXCIpKSB7XG4gICAgICAgIG5vZGUucGFyZW50ID0gbm9kZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmIChub2RlSWQgPSBub2RlLnBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBub2RlQnlLZXkuZ2V0KG5vZGVJZCk7XG4gICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nOiBcIiArIG5vZGVJZCk7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IGFtYmlndW91cykgdGhyb3cgbmV3IEVycm9yKFwiYW1iaWd1b3VzOiBcIiArIG5vZGVJZCk7XG4gICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICBlbHNlIHBhcmVudC5jaGlsZHJlbiA9IFtub2RlXTtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibXVsdGlwbGUgcm9vdHNcIik7XG4gICAgICAgIHJvb3QgPSBub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibm8gcm9vdFwiKTtcbiAgICByb290LnBhcmVudCA9IHByZXJvb3Q7XG4gICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xuICAgIHJvb3QucGFyZW50ID0gbnVsbDtcbiAgICBpZiAobiA+IDApIHRocm93IG5ldyBFcnJvcihcImN5Y2xlXCIpO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDtcbiAgfTtcblxuICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDtcbiAgfTtcblxuICByZXR1cm4gc3RyYXRpZnk7XG59XG4iLCAiaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi9oaWVyYXJjaHkvaW5kZXguanNcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24oYSwgYikge1xuICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7XG59XG5cbi8vIGZ1bmN0aW9uIHJhZGlhbFNlcGFyYXRpb24oYSwgYikge1xuLy8gICByZXR1cm4gKGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyKSAvIGEuZGVwdGg7XG4vLyB9XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmF2ZXJzZSB0aGUgbGVmdCBjb250b3VyIG9mIGEgc3VidHJlZSAob3Jcbi8vIHN1YmZvcmVzdCkuIEl0IHJldHVybnMgdGhlIHN1Y2Nlc3NvciBvZiB2IG9uIHRoaXMgY29udG91ci4gVGhpcyBzdWNjZXNzb3IgaXNcbi8vIGVpdGhlciBnaXZlbiBieSB0aGUgbGVmdG1vc3QgY2hpbGQgb2YgdiBvciBieSB0aGUgdGhyZWFkIG9mIHYuIFRoZSBmdW5jdGlvblxuLy8gcmV0dXJucyBudWxsIGlmIGFuZCBvbmx5IGlmIHYgaXMgb24gdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaXRzIHN1YnRyZWUuXG5mdW5jdGlvbiBuZXh0TGVmdCh2KSB7XG4gIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuWzBdIDogdi50O1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFuYWxvZ291c2x5IHRvIG5leHRMZWZ0LlxuZnVuY3Rpb24gbmV4dFJpZ2h0KHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0gOiB2LnQ7XG59XG5cbi8vIFNoaWZ0cyB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3RlZCBhdCB3Ky4gVGhpcyBpcyBkb25lIGJ5IGluY3JlYXNpbmdcbi8vIHByZWxpbSh3KykgYW5kIG1vZCh3KykgYnkgc2hpZnQuXG5mdW5jdGlvbiBtb3ZlU3VidHJlZSh3bSwgd3AsIHNoaWZ0KSB7XG4gIHZhciBjaGFuZ2UgPSBzaGlmdCAvICh3cC5pIC0gd20uaSk7XG4gIHdwLmMgLT0gY2hhbmdlO1xuICB3cC5zICs9IHNoaWZ0O1xuICB3bS5jICs9IGNoYW5nZTtcbiAgd3AueiArPSBzaGlmdDtcbiAgd3AubSArPSBzaGlmdDtcbn1cblxuLy8gQWxsIG90aGVyIHNoaWZ0cywgYXBwbGllZCB0byB0aGUgc21hbGxlciBzdWJ0cmVlcyBiZXR3ZWVuIHctIGFuZCB3KywgYXJlXG4vLyBwZXJmb3JtZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gcHJlcGFyZSB0aGUgc2hpZnRzLCB3ZSBoYXZlIHRvIGFkanVzdFxuLy8gY2hhbmdlKHcrKSwgc2hpZnQodyspLCBhbmQgY2hhbmdlKHctKS5cbmZ1bmN0aW9uIGV4ZWN1dGVTaGlmdHModikge1xuICB2YXIgc2hpZnQgPSAwLFxuICAgICAgY2hhbmdlID0gMCxcbiAgICAgIGNoaWxkcmVuID0gdi5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICB3O1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICB3ID0gY2hpbGRyZW5baV07XG4gICAgdy56ICs9IHNoaWZ0O1xuICAgIHcubSArPSBzaGlmdDtcbiAgICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7XG4gIH1cbn1cblxuLy8gSWYgdmktXHUyMDE5cyBhbmNlc3RvciBpcyBhIHNpYmxpbmcgb2YgdiwgcmV0dXJucyB2aS1cdTIwMTlzIGFuY2VzdG9yLiBPdGhlcndpc2UsXG4vLyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgKGRlZmF1bHQpIGFuY2VzdG9yLlxuZnVuY3Rpb24gbmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpIHtcbiAgcmV0dXJuIHZpbS5hLnBhcmVudCA9PT0gdi5wYXJlbnQgPyB2aW0uYSA6IGFuY2VzdG9yO1xufVxuXG5mdW5jdGlvbiBUcmVlTm9kZShub2RlLCBpKSB7XG4gIHRoaXMuXyA9IG5vZGU7XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgdGhpcy5jaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuQSA9IG51bGw7IC8vIGRlZmF1bHQgYW5jZXN0b3JcbiAgdGhpcy5hID0gdGhpczsgLy8gYW5jZXN0b3JcbiAgdGhpcy56ID0gMDsgLy8gcHJlbGltXG4gIHRoaXMubSA9IDA7IC8vIG1vZFxuICB0aGlzLmMgPSAwOyAvLyBjaGFuZ2VcbiAgdGhpcy5zID0gMDsgLy8gc2hpZnRcbiAgdGhpcy50ID0gbnVsbDsgLy8gdGhyZWFkXG4gIHRoaXMuaSA9IGk7IC8vIG51bWJlclxufVxuXG5UcmVlTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5vZGUucHJvdG90eXBlKTtcblxuZnVuY3Rpb24gdHJlZVJvb3Qocm9vdCkge1xuICB2YXIgdHJlZSA9IG5ldyBUcmVlTm9kZShyb290LCAwKSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlcyA9IFt0cmVlXSxcbiAgICAgIGNoaWxkLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpLFxuICAgICAgbjtcblxuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5fLmNoaWxkcmVuKSB7XG4gICAgICBub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KG4gPSBjaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldID0gbmV3IFRyZWVOb2RlKGNoaWxkcmVuW2ldLCBpKSk7XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKHRyZWUucGFyZW50ID0gbmV3IFRyZWVOb2RlKG51bGwsIDApKS5jaGlsZHJlbiA9IFt0cmVlXTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8vIE5vZGUtbGluayB0cmVlIGRpYWdyYW0gdXNpbmcgdGhlIFJlaW5nb2xkLVRpbGZvcmQgXCJ0aWR5XCIgYWxnb3JpdGhtXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbixcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIG5vZGVTaXplID0gbnVsbDtcblxuICBmdW5jdGlvbiB0cmVlKHJvb3QpIHtcbiAgICB2YXIgdCA9IHRyZWVSb290KHJvb3QpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLlx1MjAxOXMgYWxnb3JpdGhtLlxuICAgIHQuZWFjaEFmdGVyKGZpcnN0V2FsayksIHQucGFyZW50Lm0gPSAtdC56O1xuICAgIHQuZWFjaEJlZm9yZShzZWNvbmRXYWxrKTtcblxuICAgIC8vIElmIGEgZml4ZWQgbm9kZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeS5cbiAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7XG5cbiAgICAvLyBJZiBhIGZpeGVkIHRyZWUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkgYmFzZWQgb24gdGhlIGV4dGVudC5cbiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGxlZnQgPSByb290LFxuICAgICAgICAgIHJpZ2h0ID0gcm9vdCxcbiAgICAgICAgICBib3R0b20gPSByb290O1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7XG4gICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7XG4gICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlO1xuICAgICAgfSk7XG4gICAgICB2YXIgcyA9IGxlZnQgPT09IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMixcbiAgICAgICAgICB0eCA9IHMgLSBsZWZ0LngsXG4gICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSxcbiAgICAgICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTtcbiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDtcbiAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvLyBDb21wdXRlcyBhIHByZWxpbWluYXJ5IHgtY29vcmRpbmF0ZSBmb3Igdi4gQmVmb3JlIHRoYXQsIEZJUlNUIFdBTEsgaXNcbiAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb25cbiAgLy8gQVBQT1JUSU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNISUZUUywgdGhlXG4gIC8vIG5vZGUgdiBpcyBwbGFjZWQgdG8gdGhlIG1pZHBvaW50IG9mIGl0cyBvdXRlcm1vc3QgY2hpbGRyZW4uXG4gIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbixcbiAgICAgICAgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbixcbiAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGV4ZWN1dGVTaGlmdHModik7XG4gICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjtcbiAgICAgIGlmICh3KSB7XG4gICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xuICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHYueiA9IG1pZHBvaW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodykge1xuICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgfVxuICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7XG4gIH1cblxuICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNvb3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS5cbiAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7XG4gICAgdi5fLnggPSB2LnogKyB2LnBhcmVudC5tO1xuICAgIHYubSArPSB2LnBhcmVudC5tO1xuICB9XG5cbiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVyZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZVxuICAvLyBwcmV2aW91cyBzdWJ0cmVlcy4gVGhyZWFkcyBhcmUgdXNlZCB0byB0cmF2ZXJzZSB0aGUgaW5zaWRlIGFuZCBvdXRzaWRlXG4gIC8vIGNvbnRvdXJzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHVwIHRvIHRoZSBoaWdoZXN0IGNvbW1vbiBsZXZlbC4gVGhlXG4gIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGVcbiAgLy8gc3VwZXJzY3JpcHQgbyBtZWFucyBvdXRzaWRlIGFuZCBpIG1lYW5zIGluc2lkZSwgdGhlIHN1YnNjcmlwdCAtIG1lYW5zIGxlZnRcbiAgLy8gc3VidHJlZSBhbmQgKyBtZWFucyByaWdodCBzdWJ0cmVlLiBGb3Igc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIGFsb25nIHRoZVxuICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVjdGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvXG4gIC8vIG5vZGVzIG9mIHRoZSBpbnNpZGUgY29udG91cnMgY29uZmxpY3QsIHdlIGNvbXB1dGUgdGhlIGxlZnQgb25lIG9mIHRoZVxuICAvLyBncmVhdGVzdCB1bmNvbW1vbiBhbmNlc3RvcnMgdXNpbmcgdGhlIGZ1bmN0aW9uIEFOQ0VTVE9SIGFuZCBjYWxsIE1PVkVcbiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUgc3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuXG4gIC8vIEZpbmFsbHksIHdlIGFkZCBhIG5ldyB0aHJlYWQgKGlmIG5lY2Vzc2FyeSkuXG4gIGZ1bmN0aW9uIGFwcG9ydGlvbih2LCB3LCBhbmNlc3Rvcikge1xuICAgIGlmICh3KSB7XG4gICAgICB2YXIgdmlwID0gdixcbiAgICAgICAgICB2b3AgPSB2LFxuICAgICAgICAgIHZpbSA9IHcsXG4gICAgICAgICAgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSxcbiAgICAgICAgICBzaXAgPSB2aXAubSxcbiAgICAgICAgICBzb3AgPSB2b3AubSxcbiAgICAgICAgICBzaW0gPSB2aW0ubSxcbiAgICAgICAgICBzb20gPSB2b20ubSxcbiAgICAgICAgICBzaGlmdDtcbiAgICAgIHdoaWxlICh2aW0gPSBuZXh0UmlnaHQodmltKSwgdmlwID0gbmV4dExlZnQodmlwKSwgdmltICYmIHZpcCkge1xuICAgICAgICB2b20gPSBuZXh0TGVmdCh2b20pO1xuICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTtcbiAgICAgICAgdm9wLmEgPSB2O1xuICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7XG4gICAgICAgIGlmIChzaGlmdCA+IDApIHtcbiAgICAgICAgICBtb3ZlU3VidHJlZShuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTtcbiAgICAgICAgICBzaXAgKz0gc2hpZnQ7XG4gICAgICAgICAgc29wICs9IHNoaWZ0O1xuICAgICAgICB9XG4gICAgICAgIHNpbSArPSB2aW0ubTtcbiAgICAgICAgc2lwICs9IHZpcC5tO1xuICAgICAgICBzb20gKz0gdm9tLm07XG4gICAgICAgIHNvcCArPSB2b3AubTtcbiAgICAgIH1cbiAgICAgIGlmICh2aW0gJiYgIW5leHRSaWdodCh2b3ApKSB7XG4gICAgICAgIHZvcC50ID0gdmltO1xuICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7XG4gICAgICB9XG4gICAgICBpZiAodmlwICYmICFuZXh0TGVmdCh2b20pKSB7XG4gICAgICAgIHZvbS50ID0gdmlwO1xuICAgICAgICB2b20ubSArPSBzaXAgLSBzb207XG4gICAgICAgIGFuY2VzdG9yID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkge1xuICAgIG5vZGUueCAqPSBkeDtcbiAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7XG4gIH1cblxuICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjtcbiAgfTtcblxuICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pO1xuICB9O1xuXG4gIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIHRyZWU7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBub2RlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogaztcbiAgfVxufVxuIiwgImltcG9ydCB0cmVlbWFwRGljZSBmcm9tIFwiLi9kaWNlLmpzXCI7XG5pbXBvcnQgdHJlZW1hcFNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG5cbmV4cG9ydCB2YXIgcGhpID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHJvd3MgPSBbXSxcbiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgcm93LFxuICAgICAgbm9kZVZhbHVlLFxuICAgICAgaTAgPSAwLFxuICAgICAgaTEgPSAwLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGR4LCBkeSxcbiAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLFxuICAgICAgc3VtVmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbmV3UmF0aW8sXG4gICAgICBtaW5SYXRpbyxcbiAgICAgIGFscGhhLFxuICAgICAgYmV0YTtcblxuICB3aGlsZSAoaTAgPCBuKSB7XG4gICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7XG5cbiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLlxuICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTtcbiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7XG4gICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTtcbiAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpO1xuXG4gICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuXG4gICAgZm9yICg7IGkxIDwgbjsgKytpMSkge1xuICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlO1xuICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7XG4gICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7XG4gICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9XG4gICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmllbnRhdGlvbi5cbiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTtcbiAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgdmFsdWUgPyB5MCArPSBkeSAqIHN1bVZhbHVlIC8gdmFsdWUgOiB5MSk7XG4gICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTtcbiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTtcbiAgfVxuXG4gIHJldHVybiByb3dzO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7XG5cbiAgZnVuY3Rpb24gc3F1YXJpZnkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICAgIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpO1xuICB9XG5cbiAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7XG4gIH07XG5cbiAgcmV0dXJuIHNxdWFyaWZ5O1xufSkocGhpKTtcbiIsICJpbXBvcnQgcm91bmROb2RlIGZyb20gXCIuL3JvdW5kLmpzXCI7XG5pbXBvcnQgc3F1YXJpZnkgZnJvbSBcIi4vc3F1YXJpZnkuanNcIjtcbmltcG9ydCB7cmVxdWlyZWR9IGZyb20gXCIuLi9hY2Nlc3NvcnMuanNcIjtcbmltcG9ydCBjb25zdGFudCwge2NvbnN0YW50WmVyb30gZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdGlsZSA9IHNxdWFyaWZ5LFxuICAgICAgcm91bmQgPSBmYWxzZSxcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmdTdGFjayA9IFswXSxcbiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdUb3AgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ0xlZnQgPSBjb25zdGFudFplcm87XG5cbiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7XG4gICAgcm9vdC54MCA9XG4gICAgcm9vdC55MCA9IDA7XG4gICAgcm9vdC54MSA9IGR4O1xuICAgIHJvb3QueTEgPSBkeTtcbiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTtcbiAgICBwYWRkaW5nU3RhY2sgPSBbMF07XG4gICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7XG4gICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sXG4gICAgICAgIHgwID0gbm9kZS54MCArIHAsXG4gICAgICAgIHkwID0gbm9kZS55MCArIHAsXG4gICAgICAgIHgxID0gbm9kZS54MSAtIHAsXG4gICAgICAgIHkxID0gbm9kZS55MSAtIHA7XG4gICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICBub2RlLngwID0geDA7XG4gICAgbm9kZS55MCA9IHkwO1xuICAgIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkxID0geTE7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjtcbiAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDtcbiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwO1xuICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDtcbiAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7XG4gICAgfVxuICB9XG5cbiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDtcbiAgfTtcblxuICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZW1hcCkgOiBbZHgsIGR5XTtcbiAgfTtcblxuICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRpbmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdUb3AgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1RvcCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdUb3A7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nUmlnaHQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1JpZ2h0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1JpZ2h0O1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0JvdHRvbTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdMZWZ0ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdMZWZ0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0xlZnQ7XG4gIH07XG5cbiAgcmV0dXJuIHRyZWVtYXA7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgc3VtLCBzdW1zID0gbmV3IEFycmF5KG4gKyAxKTtcblxuICBmb3IgKHN1bXNbMF0gPSBzdW0gPSBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHN1bXNbaSArIDFdID0gc3VtICs9IG5vZGVzW2ldLnZhbHVlO1xuICB9XG5cbiAgcGFydGl0aW9uKDAsIG4sIHBhcmVudC52YWx1ZSwgeDAsIHkwLCB4MSwgeTEpO1xuXG4gIGZ1bmN0aW9uIHBhcnRpdGlvbihpLCBqLCB2YWx1ZSwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBpZiAoaSA+PSBqIC0gMSkge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIG5vZGUueDAgPSB4MCwgbm9kZS55MCA9IHkwO1xuICAgICAgbm9kZS54MSA9IHgxLCBub2RlLnkxID0geTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlT2Zmc2V0ID0gc3Vtc1tpXSxcbiAgICAgICAgdmFsdWVUYXJnZXQgPSAodmFsdWUgLyAyKSArIHZhbHVlT2Zmc2V0LFxuICAgICAgICBrID0gaSArIDEsXG4gICAgICAgIGhpID0gaiAtIDE7XG5cbiAgICB3aGlsZSAoayA8IGhpKSB7XG4gICAgICB2YXIgbWlkID0gayArIGhpID4+PiAxO1xuICAgICAgaWYgKHN1bXNbbWlkXSA8IHZhbHVlVGFyZ2V0KSBrID0gbWlkICsgMTtcbiAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZVRhcmdldCAtIHN1bXNbayAtIDFdKSA8IChzdW1zW2tdIC0gdmFsdWVUYXJnZXQpICYmIGkgKyAxIDwgaykgLS1rO1xuXG4gICAgdmFyIHZhbHVlTGVmdCA9IHN1bXNba10gLSB2YWx1ZU9mZnNldCxcbiAgICAgICAgdmFsdWVSaWdodCA9IHZhbHVlIC0gdmFsdWVMZWZ0O1xuXG4gICAgaWYgKCh4MSAtIHgwKSA+ICh5MSAtIHkwKSkge1xuICAgICAgdmFyIHhrID0gdmFsdWUgPyAoeDAgKiB2YWx1ZVJpZ2h0ICsgeDEgKiB2YWx1ZUxlZnQpIC8gdmFsdWUgOiB4MTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeGssIHkxKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4aywgeTAsIHgxLCB5MSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB5ayA9IHZhbHVlID8gKHkwICogdmFsdWVSaWdodCArIHkxICogdmFsdWVMZWZ0KSAvIHZhbHVlIDogeTE7XG4gICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7XG4gICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5leHBvcnQgY29uc3QgaW1wbGljaXQgPSBTeW1ib2woXCJpbXBsaWNpdFwiKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkaW5hbCgpIHtcbiAgdmFyIGluZGV4ID0gbmV3IE1hcCgpLFxuICAgICAgZG9tYWluID0gW10sXG4gICAgICByYW5nZSA9IFtdLFxuICAgICAgdW5rbm93biA9IGltcGxpY2l0O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKGQpIHtcbiAgICB2YXIga2V5ID0gZCArIFwiXCIsIGkgPSBpbmRleC5nZXQoa2V5KTtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247XG4gICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VbKGkgLSAxKSAlIHJhbmdlLmxlbmd0aF07XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7XG4gICAgZG9tYWluID0gW10sIGluZGV4ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgXykge1xuICAgICAgY29uc3Qga2V5ID0gdmFsdWUgKyBcIlwiO1xuICAgICAgaWYgKGluZGV4LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGluYWwoZG9tYWluLCByYW5nZSkudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuIiwgImltcG9ydCB7cmFuZ2UgYXMgc2VxdWVuY2V9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCBvcmRpbmFsIGZyb20gXCIuL29yZGluYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmFuZCgpIHtcbiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSxcbiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbixcbiAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLFxuICAgICAgcjAgPSAwLFxuICAgICAgcjEgPSAxLFxuICAgICAgc3RlcCxcbiAgICAgIGJhbmR3aWR0aCxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBwYWRkaW5nSW5uZXIgPSAwLFxuICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgIGFsaWduID0gMC41O1xuXG4gIGRlbGV0ZSBzY2FsZS51bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgPSByMSA8IHIwLFxuICAgICAgICBzdGFydCA9IHJldmVyc2UgPyByMSA6IHIwLFxuICAgICAgICBzdG9wID0gcmV2ZXJzZSA/IHIwIDogcjE7XG4gICAgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMSwgbiAtIHBhZGRpbmdJbm5lciArIHBhZGRpbmdPdXRlciAqIDIpO1xuICAgIGlmIChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgc3RhcnQgKz0gKHN0b3AgLSBzdGFydCAtIHN0ZXAgKiAobiAtIHBhZGRpbmdJbm5lcikpICogYWxpZ247XG4gICAgYmFuZHdpZHRoID0gc3RlcCAqICgxIC0gcGFkZGluZ0lubmVyKTtcbiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5yb3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTtcbiAgICB2YXIgdmFsdWVzID0gc2VxdWVuY2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pO1xuICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKFtyMCwgcjFdID0gXywgcjAgPSArcjAsIHIxID0gK3IxLCByZXNjYWxlKCkpIDogW3IwLCByMV07XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gW3IwLCByMV0gPSBfLCByMCA9ICtyMCwgcjEgPSArcjEsIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiYW5kd2lkdGg7XG4gIH07XG5cbiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzdGVwO1xuICB9O1xuXG4gIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1pbigxLCBwYWRkaW5nT3V0ZXIgPSArXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIF8pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSArXywgcmVzY2FsZSgpKSA6IHBhZGRpbmdPdXRlcjtcbiAgfTtcblxuICBzY2FsZS5hbGlnbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYmFuZChkb21haW4oKSwgW3IwLCByMV0pXG4gICAgICAgIC5yb3VuZChyb3VuZClcbiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKVxuICAgICAgICAuYWxpZ24oYWxpZ24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkocmVzY2FsZSgpLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBwb2ludGlzaChzY2FsZSkge1xuICB2YXIgY29weSA9IHNjYWxlLmNvcHk7XG5cbiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHJldHVybiBwb2ludGlzaChiYW5kLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFkZGluZ0lubmVyKDEpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25zdGFudHMoeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuICt4O1xufVxuIiwgImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGUgYXMgaW50ZXJwb2xhdGVWYWx1ZSwgaW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUm91bmR9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgdW5pdCA9IFswLCAxXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhLCBiKSB7XG4gIHJldHVybiAoYiAtPSAoYSA9ICthKSlcbiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAvIGI7IH1cbiAgICAgIDogY29uc3RhbnQoaXNOYU4oYikgPyBOYU4gOiAwLjUpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGVyKGEsIGIpIHtcbiAgdmFyIHQ7XG4gIGlmIChhID4gYikgdCA9IGEsIGEgPSBiLCBiID0gdDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgpKTsgfTtcbn1cblxuLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uXG4vLyBpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIHZhbHVlIHggaW4gW2EsYl0uXG5mdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdO1xuICBpZiAoZDEgPCBkMCkgZDAgPSBub3JtYWxpemUoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApO1xuICBlbHNlIGQwID0gbm9ybWFsaXplKGQwLCBkMSksIHIwID0gaW50ZXJwb2xhdGUocjAsIHIxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTtcbn1cblxuZnVuY3Rpb24gcG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLFxuICAgICAgZCA9IG5ldyBBcnJheShqKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICBpID0gLTE7XG5cbiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuXG4gIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgZFtpXSA9IG5vcm1hbGl6ZShkb21haW5baV0sIGRvbWFpbltpICsgMV0pO1xuICAgIHJbaV0gPSBpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGkgPSBiaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7XG4gICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKVxuICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHtcbiAgdmFyIGRvbWFpbiA9IHVuaXQsXG4gICAgICByYW5nZSA9IHVuaXQsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB1bnRyYW5zZm9ybSxcbiAgICAgIHVua25vd24sXG4gICAgICBjbGFtcCA9IGlkZW50aXR5LFxuICAgICAgcGllY2V3aXNlLFxuICAgICAgb3V0cHV0LFxuICAgICAgaW5wdXQ7XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCk7XG4gICAgaWYgKGNsYW1wICE9PSBpZGVudGl0eSkgY2xhbXAgPSBjbGFtcGVyKGRvbWFpblswXSwgZG9tYWluW24gLSAxXSk7XG4gICAgcGllY2V3aXNlID0gbiA+IDIgPyBwb2x5bWFwIDogYmltYXA7XG4gICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogKG91dHB1dCB8fCAob3V0cHV0ID0gcGllY2V3aXNlKGRvbWFpbi5tYXAodHJhbnNmb3JtKSwgcmFuZ2UsIGludGVycG9sYXRlKSkpKHRyYW5zZm9ybShjbGFtcCh4KSkpO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiBjbGFtcCh1bnRyYW5zZm9ybSgoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4ubWFwKHRyYW5zZm9ybSksIGludGVycG9sYXRlTnVtYmVyKSkpKHkpKSk7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IEFycmF5LmZyb20oXywgbnVtYmVyKSwgcmVzY2FsZSgpKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBBcnJheS5mcm9tKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyB0cnVlIDogaWRlbnRpdHksIHJlc2NhbGUoKSkgOiBjbGFtcCAhPT0gaWRlbnRpdHk7XG4gIH07XG5cbiAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24odCwgdSkge1xuICAgIHRyYW5zZm9ybSA9IHQsIHVudHJhbnNmb3JtID0gdTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250aW51b3VzKCkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoKShpZGVudGl0eSwgaWRlbnRpdHkpO1xufVxuIiwgImltcG9ydCB7dGlja1N0ZXB9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtmb3JtYXQsIGZvcm1hdFByZWZpeCwgZm9ybWF0U3BlY2lmaWVyLCBwcmVjaXNpb25GaXhlZCwgcHJlY2lzaW9uUHJlZml4LCBwcmVjaXNpb25Sb3VuZH0gZnJvbSBcImQzLWZvcm1hdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWNrRm9ybWF0KHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7XG4gIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSxcbiAgICAgIHByZWNpc2lvbjtcbiAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gXCIsZlwiIDogc3BlY2lmaWVyKTtcbiAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkge1xuICAgIGNhc2UgXCJzXCI6IHtcbiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpO1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247XG4gICAgICByZXR1cm4gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpO1xuICAgIH1cbiAgICBjYXNlIFwiXCI6XG4gICAgY2FzZSBcImVcIjpcbiAgICBjYXNlIFwiZ1wiOlxuICAgIGNhc2UgXCJwXCI6XG4gICAgY2FzZSBcInJcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUm91bmQoc3RlcCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCJlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmXCI6XG4gICAgY2FzZSBcIiVcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uRml4ZWQoc3RlcCkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSBcIiVcIikgKiAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3BlY2lmaWVyKTtcbn1cbiIsICJpbXBvcnQge3RpY2tzLCB0aWNrSW5jcmVtZW50fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCBjb250aW51b3VzLCB7Y29weX0gZnJvbSBcIi4vY29udGludW91cy5qc1wiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCB0aWNrRm9ybWF0IGZyb20gXCIuL3RpY2tGb3JtYXQuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkge1xuICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tGb3JtYXQoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCwgc3BlY2lmaWVyKTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDtcblxuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgdmFyIGkwID0gMDtcbiAgICB2YXIgaTEgPSBkLmxlbmd0aCAtIDE7XG4gICAgdmFyIHN0YXJ0ID0gZFtpMF07XG4gICAgdmFyIHN0b3AgPSBkW2kxXTtcbiAgICB2YXIgcHJlc3RlcDtcbiAgICB2YXIgc3RlcDtcbiAgICB2YXIgbWF4SXRlciA9IDEwO1xuXG4gICAgaWYgKHN0b3AgPCBzdGFydCkge1xuICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwO1xuICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7XG4gICAgfVxuICAgIFxuICAgIHdoaWxlIChtYXhJdGVyLS0gPiAwKSB7XG4gICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpO1xuICAgICAgaWYgKHN0ZXAgPT09IHByZXN0ZXApIHtcbiAgICAgICAgZFtpMF0gPSBzdGFydFxuICAgICAgICBkW2kxXSA9IHN0b3BcbiAgICAgICAgcmV0dXJuIGRvbWFpbihkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVzdGVwID0gc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5lYXIoKSB7XG4gIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gIHZhciBuID0gc3BlY2lmaWVyLmxlbmd0aCAvIDYgfCAwLCBjb2xvcnMgPSBuZXcgQXJyYXkobiksIGkgPSAwO1xuICB3aGlsZSAoaSA8IG4pIGNvbG9yc1tpXSA9IFwiI1wiICsgc3BlY2lmaWVyLnNsaWNlKGkgKiA2LCArK2kgKiA2KTtcbiAgcmV0dXJuIGNvbG9ycztcbn1cbiIsICJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY29sb3JzKFwiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmXCIpO1xuIiwgImltcG9ydCB7Y3ViZWhlbGl4fSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IHZhciB3YXJtID0gaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgtMTAwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTtcblxuZXhwb3J0IHZhciBjb29sID0gaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpO1xuXG52YXIgYyA9IGN1YmVoZWxpeCgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0KSB7XG4gIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpO1xuICB2YXIgdHMgPSBNYXRoLmFicyh0IC0gMC41KTtcbiAgYy5oID0gMzYwICogdCAtIDEwMDtcbiAgYy5zID0gMS41IC0gMS41ICogdHM7XG4gIGMubCA9IDAuOCAtIDAuOSAqIHRzO1xuICByZXR1cm4gYyArIFwiXCI7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IHZhciBhYnMgPSBNYXRoLmFicztcbmV4cG9ydCB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuZXhwb3J0IHZhciBjb3MgPSBNYXRoLmNvcztcbmV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciBzaW4gPSBNYXRoLnNpbjtcbmV4cG9ydCB2YXIgc3FydCA9IE1hdGguc3FydDtcblxuZXhwb3J0IHZhciBlcHNpbG9uID0gMWUtMTI7XG5leHBvcnQgdmFyIHBpID0gTWF0aC5QSTtcbmV4cG9ydCB2YXIgaGFsZlBpID0gcGkgLyAyO1xuZXhwb3J0IHZhciB0YXUgPSAyICogcGk7XG5cbmV4cG9ydCBmdW5jdGlvbiBhY29zKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpIDogTWF0aC5hY29zKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiB4ID49IDEgPyBoYWxmUGkgOiB4IDw9IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTtcbn1cbiIsICJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7YWJzLCBhY29zLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCBoYWxmUGksIG1heCwgbWluLCBwaSwgc2luLCBzcXJ0LCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxuZnVuY3Rpb24gYXJjSW5uZXJSYWRpdXMoZCkge1xuICByZXR1cm4gZC5pbm5lclJhZGl1cztcbn1cblxuZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMoZCkge1xuICByZXR1cm4gZC5vdXRlclJhZGl1cztcbn1cblxuZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7XG4gIHJldHVybiBkLnN0YXJ0QW5nbGU7XG59XG5cbmZ1bmN0aW9uIGFyY0VuZEFuZ2xlKGQpIHtcbiAgcmV0dXJuIGQuZW5kQW5nbGU7XG59XG5cbmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHtcbiAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgdmFyIHgxMCA9IHgxIC0geDAsIHkxMCA9IHkxIC0geTAsXG4gICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLFxuICAgICAgdCA9IHkzMiAqIHgxMCAtIHgzMiAqIHkxMDtcbiAgaWYgKHQgKiB0IDwgZXBzaWxvbikgcmV0dXJuO1xuICB0ID0gKHgzMiAqICh5MCAtIHkyKSAtIHkzMiAqICh4MCAtIHgyKSkgLyB0O1xuICByZXR1cm4gW3gwICsgdCAqIHgxMCwgeTAgKyB0ICogeTEwXTtcbn1cblxuLy8gQ29tcHV0ZSBwZXJwZW5kaWN1bGFyIG9mZnNldCBsaW5lIG9mIGxlbmd0aCByYy5cbi8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vQ2lyY2xlLUxpbmVJbnRlcnNlY3Rpb24uaHRtbFxuZnVuY3Rpb24gY29ybmVyVGFuZ2VudHMoeDAsIHkwLCB4MSwgeTEsIHIxLCByYywgY3cpIHtcbiAgdmFyIHgwMSA9IHgwIC0geDEsXG4gICAgICB5MDEgPSB5MCAtIHkxLFxuICAgICAgbG8gPSAoY3cgPyByYyA6IC1yYykgLyBzcXJ0KHgwMSAqIHgwMSArIHkwMSAqIHkwMSksXG4gICAgICBveCA9IGxvICogeTAxLFxuICAgICAgb3kgPSAtbG8gKiB4MDEsXG4gICAgICB4MTEgPSB4MCArIG94LFxuICAgICAgeTExID0geTAgKyBveSxcbiAgICAgIHgxMCA9IHgxICsgb3gsXG4gICAgICB5MTAgPSB5MSArIG95LFxuICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAyLFxuICAgICAgeTAwID0gKHkxMSArIHkxMCkgLyAyLFxuICAgICAgZHggPSB4MTAgLSB4MTEsXG4gICAgICBkeSA9IHkxMCAtIHkxMSxcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICByID0gcjEgLSByYyxcbiAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsXG4gICAgICBkID0gKGR5IDwgMCA/IC0xIDogMSkgKiBzcXJ0KG1heCgwLCByICogciAqIGQyIC0gRCAqIEQpKSxcbiAgICAgIGN4MCA9IChEICogZHkgLSBkeCAqIGQpIC8gZDIsXG4gICAgICBjeTAgPSAoLUQgKiBkeCAtIGR5ICogZCkgLyBkMixcbiAgICAgIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsXG4gICAgICBjeTEgPSAoLUQgKiBkeCArIGR5ICogZCkgLyBkMixcbiAgICAgIGR4MCA9IGN4MCAtIHgwMCxcbiAgICAgIGR5MCA9IGN5MCAtIHkwMCxcbiAgICAgIGR4MSA9IGN4MSAtIHgwMCxcbiAgICAgIGR5MSA9IGN5MSAtIHkwMDtcblxuICAvLyBQaWNrIHRoZSBjbG9zZXIgb2YgdGhlIHR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLlxuICAvLyBUT0RPIElzIHRoZXJlIGEgZmFzdGVyIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggaW50ZXJzZWN0aW9uIHRvIHVzZT9cbiAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7XG5cbiAgcmV0dXJuIHtcbiAgICBjeDogY3gwLFxuICAgIGN5OiBjeTAsXG4gICAgeDAxOiAtb3gsXG4gICAgeTAxOiAtb3ksXG4gICAgeDExOiBjeDAgKiAocjEgLyByIC0gMSksXG4gICAgeTExOiBjeTAgKiAocjEgLyByIC0gMSlcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXMgPSBhcmNPdXRlclJhZGl1cyxcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvbnN0YW50KDApLFxuICAgICAgcGFkUmFkaXVzID0gbnVsbCxcbiAgICAgIHN0YXJ0QW5nbGUgPSBhcmNTdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSxcbiAgICAgIHBhZEFuZ2xlID0gYXJjUGFkQW5nbGUsXG4gICAgICBjb250ZXh0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBhcmMoKSB7XG4gICAgdmFyIGJ1ZmZlcixcbiAgICAgICAgcixcbiAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSxcbiAgICAgICAgZGEgPSBhYnMoYTEgLSBhMCksXG4gICAgICAgIGN3ID0gYTEgPiBhMDtcblxuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvdXRlciByYWRpdXMgaXMgYWx3YXlzIGxhcmdlciB0aGFuIHRoZSBpbm5lciByYWRpdXMuXG4gICAgaWYgKHIxIDwgcjApIHIgPSByMSwgcjEgPSByMCwgcjAgPSByO1xuXG4gICAgLy8gSXMgaXQgYSBwb2ludD9cbiAgICBpZiAoIShyMSA+IGVwc2lsb24pKSBjb250ZXh0Lm1vdmVUbygwLCAwKTtcblxuICAgIC8vIE9yIGlzIGl0IGEgY2lyY2xlIG9yIGFubnVsdXM/XG4gICAgZWxzZSBpZiAoZGEgPiB0YXUgLSBlcHNpbG9uKSB7XG4gICAgICBjb250ZXh0Lm1vdmVUbyhyMSAqIGNvcyhhMCksIHIxICogc2luKGEwKSk7XG4gICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAsIGExLCAhY3cpO1xuICAgICAgaWYgKHIwID4gZXBzaWxvbikge1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyhyMCAqIGNvcyhhMSksIHIwICogc2luKGExKSk7XG4gICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmN1bGFyIG9yIGFubnVsYXIgc2VjdG9yP1xuICAgIGVsc2Uge1xuICAgICAgdmFyIGEwMSA9IGEwLFxuICAgICAgICAgIGExMSA9IGExLFxuICAgICAgICAgIGEwMCA9IGEwLFxuICAgICAgICAgIGExMCA9IGExLFxuICAgICAgICAgIGRhMCA9IGRhLFxuICAgICAgICAgIGRhMSA9IGRhLFxuICAgICAgICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsXG4gICAgICAgICAgcnAgPSAoYXAgPiBlcHNpbG9uKSAmJiAocGFkUmFkaXVzID8gK3BhZFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc3FydChyMCAqIHIwICsgcjEgKiByMSkpLFxuICAgICAgICAgIHJjID0gbWluKGFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksXG4gICAgICAgICAgcmMwID0gcmMsXG4gICAgICAgICAgcmMxID0gcmMsXG4gICAgICAgICAgdDAsXG4gICAgICAgICAgdDE7XG5cbiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBzaW5jZSByMSBcdTIyNjUgcjAsIGRhMSBcdTIyNjUgZGEwLlxuICAgICAgaWYgKHJwID4gZXBzaWxvbikge1xuICAgICAgICB2YXIgcDAgPSBhc2luKHJwIC8gcjAgKiBzaW4oYXApKSxcbiAgICAgICAgICAgIHAxID0gYXNpbihycCAvIHIxICogc2luKGFwKSk7XG4gICAgICAgIGlmICgoZGEwIC09IHAwICogMikgPiBlcHNpbG9uKSBwMCAqPSAoY3cgPyAxIDogLTEpLCBhMDAgKz0gcDAsIGExMCAtPSBwMDtcbiAgICAgICAgZWxzZSBkYTAgPSAwLCBhMDAgPSBhMTAgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbikgcDEgKj0gKGN3ID8gMSA6IC0xKSwgYTAxICs9IHAxLCBhMTEgLT0gcDE7XG4gICAgICAgIGVsc2UgZGExID0gMCwgYTAxID0gYTExID0gKGEwICsgYTEpIC8gMjtcbiAgICAgIH1cblxuICAgICAgdmFyIHgwMSA9IHIxICogY29zKGEwMSksXG4gICAgICAgICAgeTAxID0gcjEgKiBzaW4oYTAxKSxcbiAgICAgICAgICB4MTAgPSByMCAqIGNvcyhhMTApLFxuICAgICAgICAgIHkxMCA9IHIwICogc2luKGExMCk7XG5cbiAgICAgIC8vIEFwcGx5IHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGlmIChyYyA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHgxMSA9IHIxICogY29zKGExMSksXG4gICAgICAgICAgICB5MTEgPSByMSAqIHNpbihhMTEpLFxuICAgICAgICAgICAgeDAwID0gcjAgKiBjb3MoYTAwKSxcbiAgICAgICAgICAgIHkwMCA9IHIwICogc2luKGEwMCksXG4gICAgICAgICAgICBvYztcblxuICAgICAgICAvLyBSZXN0cmljdCB0aGUgY29ybmVyIHJhZGl1cyBhY2NvcmRpbmcgdG8gdGhlIHNlY3RvciBhbmdsZS5cbiAgICAgICAgaWYgKGRhIDwgcGkgJiYgKG9jID0gaW50ZXJzZWN0KHgwMSwgeTAxLCB4MDAsIHkwMCwgeDExLCB5MTEsIHgxMCwgeTEwKSkpIHtcbiAgICAgICAgICB2YXIgYXggPSB4MDEgLSBvY1swXSxcbiAgICAgICAgICAgICAgYXkgPSB5MDEgLSBvY1sxXSxcbiAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSxcbiAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSxcbiAgICAgICAgICAgICAga2MgPSAxIC8gc2luKGFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0KGF4ICogYXggKyBheSAqIGF5KSAqIHNxcnQoYnggKiBieCArIGJ5ICogYnkpKSkgLyAyKSxcbiAgICAgICAgICAgICAgbGMgPSBzcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTtcbiAgICAgICAgICByYzAgPSBtaW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTtcbiAgICAgICAgICByYzEgPSBtaW4ocmMsIChyMSAtIGxjKSAvIChrYyArIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJcyB0aGUgc2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/XG4gICAgICBpZiAoIShkYTEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpO1xuXG4gICAgICAvLyBEb2VzIHRoZSBzZWN0b3JcdTIwMTlzIG91dGVyIHJpbmcgaGF2ZSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBlbHNlIGlmIChyYzEgPiBlcHNpbG9uKSB7XG4gICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDAwLCB5MDAsIHgwMSwgeTAxLCByMSwgcmMxLCBjdyk7XG4gICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDExLCB5MTEsIHgxMCwgeTEwLCByMSwgcmMxLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5tb3ZlVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMSwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgaXMgdGhlIG91dGVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz9cbiAgICAgIGVsc2UgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpLCBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAxLCBhMTEsICFjdyk7XG5cbiAgICAgIC8vIElzIHRoZXJlIG5vIGlubmVyIHJpbmcsIGFuZCBpdFx1MjAxOXMgYSBjaXJjdWxhciBzZWN0b3I/XG4gICAgICAvLyBPciBwZXJoYXBzIGl0XHUyMDE5cyBhbiBhbm51bGFyIHNlY3RvciBjb2xsYXBzZWQgZHVlIHRvIHBhZGRpbmc/XG4gICAgICBpZiAoIShyMCA+IGVwc2lsb24pIHx8ICEoZGEwID4gZXBzaWxvbikpIGNvbnRleHQubGluZVRvKHgxMCwgeTEwKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9yXHUyMDE5cyBpbm5lciByaW5nIChvciBwb2ludCkgaGF2ZSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBlbHNlIGlmIChyYzAgPiBlcHNpbG9uKSB7XG4gICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDEwLCB5MTAsIHgxMSwgeTExLCByMCwgLXJjMCwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgwMSwgeTAxLCB4MDAsIHkwMCwgcjAsIC1yYzAsIGN3KTtcblxuICAgICAgICBjb250ZXh0LmxpbmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpO1xuXG4gICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkP1xuICAgICAgICBpZiAocmMwIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy5cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzAsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBpbm5lciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMTAsIGEwMCwgY3cpO1xuICAgIH1cblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByID0gKCtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMixcbiAgICAgICAgYSA9ICgrc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK2VuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiAtIHBpIC8gMjtcbiAgICByZXR1cm4gW2NvcyhhKSAqIHIsIHNpbihhKSAqIHJdO1xuICB9O1xuXG4gIGFyYy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogaW5uZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG91dGVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBvdXRlclJhZGl1cztcbiAgfTtcblxuICBhcmMuY29ybmVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogY29ybmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkUmFkaXVzID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBlbmRBbmdsZTtcbiAgfTtcblxuICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCBhcmMpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gYXJjO1xufVxuIiwgImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4geFxuICAgID8geCAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oeCk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCAiZnVuY3Rpb24gTGluZWFyKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhci5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhcihjb250ZXh0KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24geChwKSB7XG4gIHJldHVybiBwWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShwKSB7XG4gIHJldHVybiBwWzFdO1xufVxuIiwgImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLFxuICAgICAgb3V0cHV0ID0gbnVsbDtcblxuICB4ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAoeCA9PT0gdW5kZWZpbmVkKSA/IHBvaW50WCA6IGNvbnN0YW50KHgpO1xuICB5ID0gdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkgOiAoeSA9PT0gdW5kZWZpbmVkKSA/IHBvaW50WSA6IGNvbnN0YW50KHkpO1xuXG4gIGZ1bmN0aW9uIGxpbmUoZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gKGRhdGEgPSBhcnJheShkYXRhKSkubGVuZ3RoLFxuICAgICAgICBkLFxuICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLFxuICAgICAgICBidWZmZXI7XG5cbiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHtcbiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHtcbiAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSBvdXRwdXQubGluZVN0YXJ0KCk7XG4gICAgICAgIGVsc2Ugb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZpbmVkMCkgb3V0cHV0LnBvaW50KCt4KGQsIGksIGRhdGEpLCAreShkLCBpLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeDtcbiAgfTtcblxuICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHk7XG4gIH07XG5cbiAgbGluZS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGxpbmUpIDogZGVmaW5lZDtcbiAgfTtcblxuICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7XG4gIH07XG5cbiAgbGluZS5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF8gPT0gbnVsbCA/IGNvbnRleHQgPSBvdXRwdXQgPSBudWxsIDogb3V0cHV0ID0gY3VydmUoY29udGV4dCA9IF8pLCBsaW5lKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGxpbmU7XG59XG4iLCAiaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2xpbmVhci5qc1wiO1xuXG5leHBvcnQgdmFyIGN1cnZlUmFkaWFsTGluZWFyID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpO1xuXG5mdW5jdGlvbiBSYWRpYWwoY3VydmUpIHtcbiAgdGhpcy5fY3VydmUgPSBjdXJ2ZTtcbn1cblxuUmFkaWFsLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKTtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUuYXJlYUVuZCgpO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5saW5lRW5kKCk7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbihhLCByKSB7XG4gICAgdGhpcy5fY3VydmUucG9pbnQociAqIE1hdGguc2luKGEpLCByICogLU1hdGguY29zKGEpKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHtcblxuICBmdW5jdGlvbiByYWRpYWwoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZlKGNvbnRleHQpKTtcbiAgfVxuXG4gIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTtcblxuICByZXR1cm4gcmFkaWFsO1xufVxuIiwgImltcG9ydCBjdXJ2ZVJhZGlhbCwge2N1cnZlUmFkaWFsTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9yYWRpYWwuanNcIjtcbmltcG9ydCBsaW5lIGZyb20gXCIuL2xpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVSYWRpYWwobCkge1xuICB2YXIgYyA9IGwuY3VydmU7XG5cbiAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDtcbiAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7XG5cbiAgbC5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGMoY3VydmVSYWRpYWwoXykpIDogYygpLl9jdXJ2ZTtcbiAgfTtcblxuICByZXR1cm4gbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBsaW5lUmFkaWFsKGxpbmUoKS5jdXJ2ZShjdXJ2ZVJhZGlhbExpbmVhcikpO1xufVxuIiwgImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuLi9wb2ludC5qc1wiO1xuaW1wb3J0IHBvaW50UmFkaWFsIGZyb20gXCIuLi9wb2ludFJhZGlhbC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5rU291cmNlKGQpIHtcbiAgcmV0dXJuIGQuc291cmNlO1xufVxuXG5mdW5jdGlvbiBsaW5rVGFyZ2V0KGQpIHtcbiAgcmV0dXJuIGQudGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBsaW5rKGN1cnZlKSB7XG4gIHZhciBzb3VyY2UgPSBsaW5rU291cmNlLFxuICAgICAgdGFyZ2V0ID0gbGlua1RhcmdldCxcbiAgICAgIHggPSBwb2ludFgsXG4gICAgICB5ID0gcG9pbnRZLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gbGluaygpIHtcbiAgICB2YXIgYnVmZmVyLCBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpO1xuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcbiAgICBjdXJ2ZShjb250ZXh0LCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndiksICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gdCwgYXJndikpLCAreS5hcHBseSh0aGlzLCBhcmd2KSk7XG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5rLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3VyY2UgPSBfLCBsaW5rKSA6IHNvdXJjZTtcbiAgfTtcblxuICBsaW5rLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDtcbiAgfTtcblxuICBsaW5rLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHg7XG4gIH07XG5cbiAgbGluay55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB5O1xuICB9O1xuXG4gIGxpbmsuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUhvcml6b250YWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwID0gKHgwICsgeDEpIC8gMiwgeTAsIHgwLCB5MSwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVWZXJ0aWNhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICBjb250ZXh0LmJlemllckN1cnZlVG8oeDAsIHkwID0gKHkwICsgeTEpIC8gMiwgeDEsIHkwLCB4MSwgeTEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVJhZGlhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLFxuICAgICAgcDEgPSBwb2ludFJhZGlhbCh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyKSxcbiAgICAgIHAyID0gcG9pbnRSYWRpYWwoeDEsIHkwKSxcbiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTtcbiAgY29udGV4dC5tb3ZlVG8ocDBbMF0sIHAwWzFdKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHAxWzBdLCBwMVsxXSwgcDJbMF0sIHAyWzFdLCBwM1swXSwgcDNbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua0hvcml6b250YWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlSG9yaXpvbnRhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVmVydGljYWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlVmVydGljYWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1JhZGlhbCgpIHtcbiAgdmFyIGwgPSBsaW5rKGN1cnZlUmFkaWFsKTtcbiAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDtcbiAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7XG4gIHJldHVybiBsO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwb2ludCh0aGF0LCB4LCB5KSB7XG4gIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhcbiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMyxcbiAgICAoMiAqIHRoYXQuX3kwICsgdGhhdC5feTEpIC8gMyxcbiAgICAodGhhdC5feDAgKyAyICogdGhhdC5feDEpIC8gMyxcbiAgICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMyxcbiAgICAodGhhdC5feDAgKyA0ICogdGhhdC5feDEgKyB4KSAvIDYsXG4gICAgKHRoYXQuX3kwICsgNCAqIHRoYXQuX3kxICsgeSkgLyA2XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCYXNpcyhjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5CYXNpcy5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5feDEsIHRoaXMuX3kxKTsgLy8gcHJvY2VlZFxuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2NvbnRleHQubGluZVRvKCg1ICogdGhpcy5feDAgKyB0aGlzLl94MSkgLyA2LCAoNSAqIHRoaXMuX3kwICsgdGhpcy5feTEpIC8gNik7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IEJhc2lzKGNvbnRleHQpO1xufVxuIiwgImltcG9ydCB7QmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7XG4gIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpO1xuICB0aGlzLl9iZXRhID0gYmV0YTtcbn1cblxuQnVuZGxlLnByb3RvdHlwZSA9IHtcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94ID0gW107XG4gICAgdGhpcy5feSA9IFtdO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuX3gsXG4gICAgICAgIHkgPSB0aGlzLl95LFxuICAgICAgICBqID0geC5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGogPiAwKSB7XG4gICAgICB2YXIgeDAgPSB4WzBdLFxuICAgICAgICAgIHkwID0geVswXSxcbiAgICAgICAgICBkeCA9IHhbal0gLSB4MCxcbiAgICAgICAgICBkeSA9IHlbal0gLSB5MCxcbiAgICAgICAgICBpID0gLTEsXG4gICAgICAgICAgdDtcblxuICAgICAgd2hpbGUgKCsraSA8PSBqKSB7XG4gICAgICAgIHQgPSBpIC8gajtcbiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoXG4gICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSxcbiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl94LnB1c2goK3gpO1xuICAgIHRoaXMuX3kucHVzaCgreSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYmV0YSkge1xuXG4gIGZ1bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMoY29udGV4dCkgOiBuZXcgQnVuZGxlKGNvbnRleHQsIGJldGEpO1xuICB9XG5cbiAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYmV0YSk7XG4gIH07XG5cbiAgcmV0dXJuIGJ1bmRsZTtcbn0pKDAuODUpO1xuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQpXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b25cdTIwMTl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgTW9kYWwsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgVmlzQ29tcCBmcm9tIFwiLi4vQ29tcG9uZW50cy9WaXNDb21wLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSB7IEFkakxpc3RJdGVtLCBkM0dyYXBoIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRJbk5laWdoYm91cnMsXHJcbiAgZ2V0T3V0TmVpZ2hib3VycyxcclxuICBnZXRTaW5rcyxcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyYXBobGliVG9EMyhnOiBHcmFwaCk6IGQzR3JhcGgge1xyXG4gIGNvbnN0IGQzR3JhcGg6IGQzR3JhcGggPSB7IG5vZGVzOiBbXSwgbGlua3M6IFtdIH07XHJcbiAgY29uc3Qgbm9kZUlEcyA9IHt9O1xyXG5cclxuICBnLm5vZGVzKCkuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xyXG4gICAgZDNHcmFwaC5ub2Rlcy5wdXNoKHsgaWQ6IGksIG5hbWU6IG5vZGUgfSk7XHJcbiAgICBub2RlSURzW25vZGVdID0gaTtcclxuICB9KTtcclxuICBnLmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBkM0dyYXBoLmxpbmtzLnB1c2goe1xyXG4gICAgICBzb3VyY2U6IG5vZGVJRHNbc10sXHJcbiAgICAgIHRhcmdldDogbm9kZUlEc1t0XSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gZDNHcmFwaDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0Zyb21BbGxTaW5rcyhnOiBHcmFwaCkge1xyXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IGdldFNpbmtzKGcpO1xyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBbXTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZXdOb2RlcyA9IGdldEluTmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5ld05vZGVzLmxlbmd0aCkge1xyXG4gICAgICBuZXdOb2Rlcy5mb3JFYWNoKChwcmUpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0OiBBZGpMaXN0SXRlbSA9IHtcclxuICAgICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgICAgcGFyZW50SWQ6IHByZSxcclxuICAgICAgICAgIGRlcHRoOiBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcXVldWUucHVzaChwcmUpO1xyXG4gICAgICAgIGFkakxpc3QucHVzaChuZXh0KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgIHBhcmVudElkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbWF4RGVwdGggPSBhZGpMaXN0LnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKS5sYXN0KCkuZGVwdGg7XHJcbiAgYWRqTGlzdC5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5oZWlnaHQgPSBtYXhEZXB0aCAtIGl0ZW0uZGVwdGgpKTtcclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRmc0Fkakxpc3QoZzogR3JhcGgsIHN0YXJ0Tm9kZTogc3RyaW5nKTogQWRqTGlzdEl0ZW1bXSB7XHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5ld05vZGVzID0gZ2V0T3V0TmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5ld05vZGVzLmxlbmd0aCkge1xyXG4gICAgICBuZXdOb2Rlcy5mb3JFYWNoKChzdWNjKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV4dDogQWRqTGlzdEl0ZW0gPSB7XHJcbiAgICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICAgIHBhcmVudElkOiBzdWNjLFxyXG4gICAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBxdWV1ZS5wdXNoKHN1Y2MpO1xyXG4gICAgICAgIGFkakxpc3QucHVzaChuZXh0KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgIHBhcmVudElkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG5cclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0Fkakxpc3QoZzogR3JhcGgsIHN0YXJ0Tm9kZTogc3RyaW5nKTogQWRqTGlzdEl0ZW1bXSB7XHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5laWdoYm91cnMgPSB7XHJcbiAgICAgIHN1Y2NzOiBnZXRPdXROZWlnaGJvdXJzKGcsIGN1cnJOb2RlKSxcclxuICAgICAgcHJlczogZ2V0SW5OZWlnaGJvdXJzKGcsIGN1cnJOb2RlKSxcclxuICAgIH07XHJcbiAgICBjb25zb2xlLmxvZyh7IGN1cnJOb2RlLCBuZWlnaGJvdXJzIH0pO1xyXG5cclxuICAgIGNvbnN0IG5leHQ6IEFkakxpc3RJdGVtID0ge1xyXG4gICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgcHJlczogdW5kZWZpbmVkLFxyXG4gICAgICBzdWNjczogdW5kZWZpbmVkLFxyXG4gICAgICBwYXJlbnRJZDogaSxcclxuICAgICAgZGVwdGg6IGksXHJcbiAgICB9O1xyXG4gICAgaWYgKG5laWdoYm91cnMuc3VjY3MubGVuZ3RoKSB7XHJcbiAgICAgIG5leHQuc3VjY3MgPSBuZWlnaGJvdXJzLnN1Y2NzO1xyXG4gICAgICBxdWV1ZS5wdXNoKC4uLm5laWdoYm91cnMuc3VjY3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5laWdoYm91cnMucHJlcy5sZW5ndGgpIHtcclxuICAgICAgbmV4dC5wcmVzID0gbmVpZ2hib3Vycy5wcmVzO1xyXG4gICAgfVxyXG4gICAgYWRqTGlzdC5wdXNoKG5leHQpO1xyXG4gIH1cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG5cclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRmc0ZsYXRBZGpMaXN0KGc6IEdyYXBoLCBzdGFydE5vZGU6IHN0cmluZykge1xyXG4gIGNvbnN0IG5vZGVzID0gZy5ub2RlcygpO1xyXG4gIGNvbnN0IG5vZGVDb3VudCA9IG5vZGVzLmxlbmd0aDtcclxuICBjb25zdCB2aXNpdHMgPSB7fTtcclxuICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XHJcbiAgICB2aXNpdHNbbm9kZV0gPSBub2RlQ291bnQgKiBpO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGxldCBkZXB0aCA9IDE7XHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZXh0ID0gZ2V0T3V0TmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5leHQubGVuZ3RoKSB7XHJcbiAgICAgIHF1ZXVlLnVuc2hpZnQoLi4ubmV4dCk7XHJcbiAgICAgIG5leHQuZm9yRWFjaCgoc3VjYykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gbm9kZUNvdW50ICogbm9kZXMuaW5kZXhPZihzdWNjKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhYWRqTGlzdC5zb21lKFxyXG4gICAgICAgICAgICAoYWRqSXRlbSkgPT5cclxuICAgICAgICAgICAgICBhZGpJdGVtLm5hbWUgPT09IGN1cnJOb2RlICYmIGFkakl0ZW0ucGFyZW50SWQgPT09IHBhcmVudElkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICBpZDogdmlzaXRzW2N1cnJOb2RlXSBhcyBudW1iZXIsXHJcbiAgICAgICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgICAgICBwYXJlbnRJZCxcclxuICAgICAgICAgICAgZGVwdGgsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHZpc2l0c1tjdXJyTm9kZV0rKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZXB0aCsrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWRqTGlzdC5wdXNoKHtcclxuICAgICAgICBpZDogdmlzaXRzW2N1cnJOb2RlXSBhcyBudW1iZXIsXHJcbiAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgcGFyZW50SWQ6IDk5OTk5OTk5OSxcclxuICAgICAgICBkZXB0aCxcclxuICAgICAgfSk7XHJcbiAgICAgIGRlcHRoID0gMTtcclxuICAgICAgdmlzaXRzW2N1cnJOb2RlXSsrO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGpMaXN0LnB1c2goe1xyXG4gICAgaWQ6IDk5OTk5OTk5OSxcclxuICAgIG5hbWU6IFwiQ09OVEFJTkVSXCIsXHJcbiAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgZGVwdGg6IDAsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG1heERlcHRoID0gYWRqTGlzdC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCkubGFzdCgpLmRlcHRoO1xyXG4gIGFkakxpc3QuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaGVpZ2h0ID0gbWF4RGVwdGggLSBpdGVtLmRlcHRoKSk7XHJcblxyXG4gIGNvbnNvbGUubG9nKHsgdmlzaXRzIH0pO1xyXG4gIHJldHVybiBhZGpMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc3RyYXRpZnkgPSBkM1xyXG4gIC5zdHJhdGlmeSgpXHJcbiAgLmlkKGZ1bmN0aW9uIChkOiBBZGpMaXN0SXRlbSkge1xyXG4gICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gICAgcmV0dXJuIGQubmFtZTtcclxuICB9KVxyXG4gIC5wYXJlbnRJZChmdW5jdGlvbiAoZDogQWRqTGlzdEl0ZW0pIHtcclxuICAgIHJldHVybiBkLnBhcmVudElkO1xyXG4gIH0pO1xyXG5leHBvcnQgY2xhc3MgVmlzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtb2RhbDogVmlzTW9kYWw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCk7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMubW9kYWwgPSB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgXCJBbG90IG9mIHRoZXNlIGZlYXR1cmVzIG1heSBub3Qgd29yaywgaXQgaXMgc3RpbGwgdmVyeSBleHBlcmltZW50YWwuXCJcclxuICAgICk7XHJcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIG5ldyBWaXNDb21wKHtcclxuICAgICAgdGFyZ2V0OiBjb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgbW9kYWw6IHRoaXMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbiAgaW1wb3J0IHsgQUxMVU5MSU5LRUQsIFJFQWxDTE9TRUQsIFJFTEFUSU9OUywgVklTVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBWaXNHcmFwaHMsIFZpc1R5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB7XHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyxcclxuICAgIGdldFN1YkluRGlycyxcclxuICAgIHJlbW92ZVVubGlua2VkTm9kZXMsXHJcbiAgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG4gIGltcG9ydCB7IGFyY0RpYWdyYW0gfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvQXJjRGlhZ3JhbVwiO1xyXG4gIGltcG9ydCB7IGNpcmNsZVBhY2tpbmcgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvQ2lyY2xlUGFja2luZ1wiO1xyXG4gIGltcG9ydCB7IGVkZ2VCdW5kbGluZyB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmdcIjtcclxuICBpbXBvcnQgeyBmb3JjZURpcmVjdGVkRyB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9Gb3JjZURpcmVjdGVkR1wiO1xyXG4gIGltcG9ydCB7IGljaWNsZSB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9JY2ljbGVcIjtcclxuICBpbXBvcnQgeyByYWRpYWxUcmVlIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWVcIjtcclxuICBpbXBvcnQgeyBzdW5idXJzdCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9TdW5idXJzdFwiO1xyXG4gIGltcG9ydCB7IHRpZHlUcmVlIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1RpZHlUcmVlXCI7XHJcbiAgaW1wb3J0IHsgdHJlZU1hcCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9UcmVlTWFwXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBWaXNNb2RhbCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG4gIGltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBtb2RhbDogVmlzTW9kYWw7XHJcblxyXG4gIGNvbnN0IHsgcGx1Z2luIH0gPSBtb2RhbDtcclxuICBjb25zdCB7IG1haW5HLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdmlzR3JhcGgsIHZpc1JlbGF0aW9uLCB2aXNDbG9zZWQsIHZpc0FsbCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuXHJcbiAgY29uc3Qgc2VsZWN0b3JzID0gW1xyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIlR5cGVcIixcclxuICAgICAgb3B0aW9uczogVklTVFlQRVMsXHJcbiAgICAgIHZhbDogdmlzR3JhcGgsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIlJlbGF0aW9uXCIsXHJcbiAgICAgIG9wdGlvbnM6IFJFTEFUSU9OUyxcclxuICAgICAgdmFsOiB2aXNSZWxhdGlvbixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiQ2xvc2UgSW1wbGllZFwiLFxyXG4gICAgICBvcHRpb25zOiBSRUFsQ0xPU0VELFxyXG4gICAgICB2YWw6IHZpc0Nsb3NlZCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiTm8gVW5saW5rZWRcIixcclxuICAgICAgb3B0aW9uczogQUxMVU5MSU5LRUQsXHJcbiAgICAgIHZhbDogdmlzQWxsLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBbXHJcbiAgICBNYXRoLnJvdW5kKHdpbmRvdy5pbm5lcldpZHRoIC8gMS4zKSxcclxuICAgIE1hdGgucm91bmQod2luZG93LmlubmVySGVpZ2h0IC8gMS4zKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbdXAsIHNhbWUsIGRvd25dID0gW1xyXG4gICAgZ2V0U3ViSW5EaXJzKG1haW5HLCBcInVwXCIpLFxyXG4gICAgZ2V0U3ViSW5EaXJzKG1haW5HLCBcInNhbWVcIiksXHJcbiAgICBnZXRTdWJJbkRpcnMobWFpbkcsIFwiZG93blwiKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbY2xvc2VkUGFyZW50Tm9TaW5nbGUsIGNsb3NlZFNpYmxpbmdOb1NpbmdsZSwgY2xvc2VkQ2hpbGROb1NpbmdsZV0gPSBbXHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyh1cCwgZG93biksXHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyhzYW1lLCBzYW1lKSxcclxuICAgIGNsb3NlSW1wbGllZExpbmtzKGRvd24sIHVwKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBncmFwaHM6IFZpc0dyYXBocyA9IHtcclxuICAgIFBhcmVudDoge1xyXG4gICAgICBSZWFsOiB7XHJcbiAgICAgICAgQWxsOiB1cCxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXModXApLFxyXG4gICAgICB9LFxyXG4gICAgICBDbG9zZWQ6IHtcclxuICAgICAgICBBbGw6IGNsb3NlZFBhcmVudE5vU2luZ2xlLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhjbG9zZWRQYXJlbnROb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgU2libGluZzoge1xyXG4gICAgICBSZWFsOiB7XHJcbiAgICAgICAgQWxsOiBzYW1lLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhzYW1lKSxcclxuICAgICAgfSxcclxuICAgICAgQ2xvc2VkOiB7XHJcbiAgICAgICAgQWxsOiBjbG9zZWRTaWJsaW5nTm9TaW5nbGUsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKGNsb3NlZFNpYmxpbmdOb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgQ2hpbGQ6IHtcclxuICAgICAgUmVhbDoge1xyXG4gICAgICAgIEFsbDogZG93bixcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoZG93biksXHJcbiAgICAgIH0sXHJcbiAgICAgIENsb3NlZDoge1xyXG4gICAgICAgIEFsbDogY2xvc2VkQ2hpbGROb1NpbmdsZSxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoY2xvc2VkQ2hpbGROb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gICQ6IGFyZ0FyciA9IFtcclxuICAgIGdyYXBoc1tzZWxlY3RvcnNbMV0udmFsXVtzZWxlY3RvcnNbMl0udmFsXVtzZWxlY3RvcnNbM10udmFsXSxcclxuICAgIGFwcCxcclxuICAgIGN1cnJGaWxlLFxyXG4gICAgbW9kYWwsXHJcbiAgICB3aWR0aCxcclxuICAgIGhlaWdodCxcclxuICBdO1xyXG5cclxuICBjb25zdCB0eXBlczoge1xyXG4gICAgW3ZpcyBpbiBWaXNUeXBlXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xyXG4gIH0gPSB7XHJcbiAgICBcIkZvcmNlIERpcmVjdGVkIEdyYXBoXCI6IGZvcmNlRGlyZWN0ZWRHLFxyXG4gICAgXCJUaWR5IFRyZWVcIjogdGlkeVRyZWUsXHJcbiAgICBcIkNpcmNsZSBQYWNraW5nXCI6IGNpcmNsZVBhY2tpbmcsXHJcbiAgICBcIkVkZ2UgQnVuZGxpbmdcIjogZWRnZUJ1bmRsaW5nLFxyXG4gICAgXCJBcmMgRGlhZ3JhbVwiOiBhcmNEaWFncmFtLFxyXG4gICAgU3VuYnVyc3Q6IHN1bmJ1cnN0LFxyXG4gICAgXCJUcmVlIE1hcFwiOiB0cmVlTWFwLFxyXG4gICAgSWNpY2xlOiBpY2ljbGUsXHJcbiAgICBcIlJhZGlhbCBUcmVlXCI6IHJhZGlhbFRyZWUsXHJcbiAgfTtcclxuXHJcbiAgZnVuY3Rpb24gZHJhdyh0eXBlOiBWaXNUeXBlKSB7XHJcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZDMtZ3JhcGhcIikpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5kMy1ncmFwaFwiKT8uZW1wdHkoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdHlwZXNbdHlwZV0oLi4uYXJnQXJyKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgd2FybihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmQzLWdyYXBoXCIpLmVtcHR5KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdHlwZXNbdHlwZV0oLi4uYXJnQXJyKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICB3YXJuKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJDogZHJhdyhzZWxlY3RvcnNbMF0udmFsIGFzIFZpc1R5cGUpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXY+XHJcbiAgeyNlYWNoIHNlbGVjdG9ycyBhcyB7IHRleHQsIG9wdGlvbnMsIHZhbCB9fVxyXG4gICAgPHNwYW4+XHJcbiAgICAgIHt0ZXh0fTpcclxuICAgICAgPHNlbGVjdCBiaW5kOnZhbHVlPXt2YWx9PlxyXG4gICAgICAgIHsjZWFjaCBvcHRpb25zIGFzIG9wfVxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT17b3B9PntvcH08L29wdGlvbj5cclxuICAgICAgICB7L2VhY2h9XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgPC9zcGFuPlxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiZDMtZ3JhcGhcIiAvPlxyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBkM05vZGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBncmFwaGxpYlRvRDMsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBhcmNEaWFncmFtID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZGF0YSA9IGdyYXBobGliVG9EMyhncmFwaCk7XHJcblxyXG4gIGNvbnN0IG1hcmdpbiA9IHsgdG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAxNTAgfTtcclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IG5vZGVzID0gZGF0YS5ub2Rlcy5tYXAoKHsgaWQsIG5hbWUgfSkgPT4gKHtcclxuICAgIGlkLFxyXG4gICAgbmFtZSxcclxuICAgIHNvdXJjZUxpbmtzOiBbXSxcclxuICAgIHRhcmdldExpbmtzOiBbXSxcclxuICB9KSk7XHJcblxyXG4gIGNvbnN0IG5vZGVCeUlkID0gbmV3IE1hcChub2Rlcy5tYXAoKGQpID0+IFtkLmlkLCBkXSkpO1xyXG5cclxuICBjb25zdCBsaW5rcyA9IGRhdGEubGlua3MubWFwKCh7IHNvdXJjZSwgdGFyZ2V0IH0pID0+ICh7XHJcbiAgICBzb3VyY2U6IG5vZGVCeUlkLmdldChzb3VyY2UgYXMgbnVtYmVyKSxcclxuICAgIHRhcmdldDogbm9kZUJ5SWQuZ2V0KHRhcmdldCBhcyBudW1iZXIpLFxyXG4gIH0pKTtcclxuXHJcbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XHJcbiAgICBjb25zdCB7IHNvdXJjZSwgdGFyZ2V0IH0gPSBsaW5rO1xyXG4gICAgc291cmNlLnNvdXJjZUxpbmtzLnB1c2gobGluayk7XHJcbiAgICB0YXJnZXQudGFyZ2V0TGlua3MucHVzaChsaW5rKTtcclxuICB9XHJcblxyXG4gIHN2Zy5hcHBlbmQoXCJzdHlsZVwiKS50ZXh0KGBcclxuXHJcbnBhdGgge1xyXG4gIHN0cm9rZTogIzgwODA4MDtcclxuICBvcGFjaXR5OiAwLjg7XHJcbn1cclxuXHJcbnRleHQge1xyXG4gIHN0cm9rZTogdmFyKC0tdGV4dC1hKTtcclxuICBvcGFjaXR5OiAwLjg7XHJcbn1cclxuXHJcblxyXG4uaG92ZXIgZy5wcmltYXJ5IHRleHQge1xyXG4gIGZpbGw6IGJsYWNrO1xyXG59XHJcblxyXG4uaG92ZXIgZy5zZWNvbmRhcnkgdGV4dCB7XHJcbiAgZmlsbDogIzMzMztcclxufVxyXG5cclxuLmhvdmVyIC5zZWNvbmRhcnkge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLmhvdmVyIHBhdGgucHJpbWFyeSB7XHJcbiAgc3Ryb2tlOiAjMzMzO1xyXG4gIHN0cm9rZS1vcGFjaXR5OiAxO1xyXG59XHJcblxyXG4uaG92ZXIgcmVjdCB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG5gKTtcclxuXHJcbiAgY29uc3QgeSA9IGQzLnNjYWxlUG9pbnQobm9kZXMubWFwKChkKSA9PiBkLm5hbWUpLnNvcnQoZDMuYXNjZW5kaW5nKSwgW1xyXG4gICAgbWFyZ2luLnRvcCxcclxuICAgIGhlaWdodCAtIG1hcmdpbi5ib3R0b20sXHJcbiAgXSk7XHJcblxyXG4gIGNvbnN0IGxhYmVsID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmb250LWZhbWlseVwiLCBcInNhbnMtc2VyaWZcIilcclxuICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIDEwKVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcImVuZFwiKVxyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKG5vZGVzKVxyXG4gICAgLmpvaW4oXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0fSwkeyhkLnkgPSB5KGQubmFtZSkpfSlgKVxyXG4gICAgLmNhbGwoKGcpID0+XHJcbiAgICAgIGdcclxuICAgICAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgICAgIC5hdHRyKFwieFwiLCAtNilcclxuICAgICAgICAuYXR0cihcImR5XCIsIFwiMC4zNWVtXCIpXHJcbiAgICAgICAgLy8gLmF0dHIoXCJmaWxsXCIsIChkKSA9PiBkMy5sYWIoY29sb3IoZC5ncm91cCkpLmRhcmtlcigyKSlcclxuICAgICAgICAudGV4dCgoZCkgPT4gZC5uYW1lKVxyXG4gICAgKVxyXG4gICAgLmNhbGwoXHJcbiAgICAgIChnKSA9PiBnLmFwcGVuZChcImNpcmNsZVwiKS5hdHRyKFwiclwiLCAzKVxyXG4gICAgICAvLyAuYXR0cihcImZpbGxcIiwgKGQpID0+IGNvbG9yKGQuZ3JvdXApKVxyXG4gICAgKTtcclxuXHJcbiAgY29uc3QgcGF0aCA9IHN2Z1xyXG4gICAgLmluc2VydChcImdcIiwgXCIqXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDEuNSlcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLy8gLmF0dHIoXCJzdHJva2VcIiwgKGQpID0+XHJcbiAgICAvLyAgIGQuc291cmNlLmdyb3VwID09PSBkLnRhcmdldC5ncm91cCA/IGNvbG9yKGQuc291cmNlLmdyb3VwKSA6IFwiI2FhYVwiXHJcbiAgICAvLyApXHJcbiAgICAuYXR0cihcImRcIiwgYXJjKTtcclxuXHJcbiAgY29uc3Qgc3RlcCA9IDEwNDtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG92ZXJsYXkgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwicmVjdFwiKVxyXG4gICAgLmRhdGEobm9kZXMpXHJcbiAgICAuam9pbihcInJlY3RcIilcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgbWFyZ2luLmxlZnQgKyA0MClcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHN0ZXApXHJcbiAgICAuYXR0cihcInlcIiwgKGQpID0+IHkoZC5uYW1lKSAtIHN0ZXAgLyAyKVxyXG4gICAgLm9uKFwibW91c2VvdmVyXCIsIChkKSA9PiB7XHJcbiAgICAgIHN2Zy5jbGFzc2VkKFwiaG92ZXJcIiwgdHJ1ZSk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXCJwcmltYXJ5XCIsIChuKSA9PiBuID09PSBkKTtcclxuICAgICAgbGFiZWwuY2xhc3NlZChcclxuICAgICAgICBcInNlY29uZGFyeVwiLFxyXG4gICAgICAgIChuKSA9PlxyXG4gICAgICAgICAgbi5zb3VyY2VMaW5rcy5zb21lKChsKSA9PiBsLnRhcmdldCA9PT0gZCkgfHxcclxuICAgICAgICAgIG4udGFyZ2V0TGlua3Muc29tZSgobCkgPT4gbC5zb3VyY2UgPT09IGQpXHJcbiAgICAgICk7XHJcbiAgICAgIHBhdGhcclxuICAgICAgICAuY2xhc3NlZChcInByaW1hcnlcIiwgKGwpID0+IGwuc291cmNlID09PSBkIHx8IGwudGFyZ2V0ID09PSBkKVxyXG4gICAgICAgIC5maWx0ZXIoXCIucHJpbWFyeVwiKVxyXG4gICAgICAgIC5yYWlzZSgpO1xyXG4gICAgfSlcclxuICAgIC5vbihcIm1vdXNlb3V0XCIsIChkKSA9PiB7XHJcbiAgICAgIHN2Zy5jbGFzc2VkKFwiaG92ZXJcIiwgZmFsc2UpO1xyXG4gICAgICBsYWJlbC5jbGFzc2VkKFwicHJpbWFyeVwiLCBmYWxzZSk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXCJzZWNvbmRhcnlcIiwgZmFsc2UpO1xyXG4gICAgICBwYXRoLmNsYXNzZWQoXCJwcmltYXJ5XCIsIGZhbHNlKS5vcmRlcigpO1xyXG4gICAgfSlcclxuICAgIC5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZDogZDNOb2RlKSA9PiB7XHJcbiAgICAgIG5vZGVDbGljayhldmVudCwgZC5uYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAvLyAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAvLyAgICAgeS5kb21haW4obm9kZXMuc29ydCh2aWV3b2Ygb3JkZXIudmFsdWUpLm1hcChkID0+IGQuaWQpKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IHQgPSBzdmcudHJhbnNpdGlvbigpXHJcbiAgLy8gICAgICAgICAuZHVyYXRpb24oNzUwKTtcclxuXHJcbiAgLy8gICAgIGxhYmVsLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAgIC5kZWxheSgoZCwgaSkgPT4gaSAqIDIwKVxyXG4gIC8vICAgICAgICAgLmF0dHJUd2VlbihcInRyYW5zZm9ybVwiLCBkID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc3QgaSA9IGQzLmludGVycG9sYXRlTnVtYmVyKGQueSwgeShkLmlkKSk7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiB0ID0+IGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdH0sJHtkLnkgPSBpKHQpfSlgO1xyXG4gIC8vICAgICAgICAgfSk7XHJcblxyXG4gIC8vICAgICBwYXRoLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAgIC5kdXJhdGlvbig3NTAgKyBub2Rlcy5sZW5ndGggKiAyMClcclxuICAvLyAgICAgICAgIC5hdHRyVHdlZW4oXCJkXCIsIGQgPT4gKCkgPT4gYXJjKGQpKTtcclxuXHJcbiAgLy8gICAgIG92ZXJsYXkudHJhbnNpdGlvbih0KVxyXG4gIC8vICAgICAgICAgLmRlbGF5KChkLCBpKSA9PiBpICogMjApXHJcbiAgLy8gICAgICAgICAuYXR0cihcInlcIiwgZCA9PiB5KGQuaWQpIC0gc3RlcCAvIDIpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHZpZXdvZiBvcmRlci5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdXBkYXRlKTtcclxuICAvLyAgIGludmFsaWRhdGlvbi50aGVuKCgpID0+IHZpZXdvZiBvcmRlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdXBkYXRlKSk7XHJcblxyXG4gIGZ1bmN0aW9uIGFyYyhkOiB7IHNvdXJjZTogeyB5OiBudW1iZXIgfTsgdGFyZ2V0OiB7IHk6IG51bWJlciB9IH0pIHtcclxuICAgIGNvbnN0IHkxID0gZC5zb3VyY2UueTtcclxuICAgIGNvbnN0IHkyID0gZC50YXJnZXQueTtcclxuICAgIGNvbnN0IHIgPSBNYXRoLmFicyh5MiAtIHkxKSAvIDI7XHJcbiAgICByZXR1cm4gYE0ke21hcmdpbi5sZWZ0fSwke3kxfUEke3J9LCR7cn0gMCwwLCR7eTEgPCB5MiA/IDEgOiAwfSAke21hcmdpbi5sZWZ0XHJcbiAgICAgIH0sJHt5Mn1gO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIHN2Zy5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IEFkakxpc3RJdGVtLCBkM0xpbmssIGQzTm9kZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJmc0Fkakxpc3QsIGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjaXJjbGVQYWNraW5nID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gYmZzQWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgYWRqTGlzdCB9KTtcclxuXHJcbiAgY29uc3Qgbm9Eb3VibGVzID0gWy4uLmFkakxpc3RdO1xyXG4gIG5vRG91Ymxlcy5mb3JFYWNoKChhLCBpKSA9PiB7XHJcbiAgICBpZiAobm9Eb3VibGVzLnNvbWUoKGIsIGopID0+IGkgIT09IGogJiYgYS5uYW1lID09PSBiLm5hbWUpKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gbm9Eb3VibGVzLmZpbmRJbmRleCgoYiwgaikgPT4gaSAhPT0gaiAmJiBhLm5hbWUgPT09IGIubmFtZSk7XHJcbiAgICAgIG5vRG91Ymxlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvLyBjb25zdCBub0RvdWJsZXMgPSBhZGpMaXN0LmZpbHRlcigoYSkgPT4ge1xyXG4gIC8vICAgIWFkakxpc3Quc29tZSgoYikgPT4ge1xyXG4gIC8vICAgICBjb25zb2xlLmxvZyh7IGEsIGIgfSk7XHJcbiAgLy8gICAgIHJldHVybiBhLm5hbWUgIT09IGIubmFtZSAmJiBhLnBhcmVudElkID09PSBiLnBhcmVudElkO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gfSk7XHJcbiAgY29uc29sZS5sb2coeyBub0RvdWJsZXMgfSk7XHJcblxyXG4gIC8vIGNvbnN0IHJvb3QgPSBzdHJhdGlmeShub0RvdWJsZXMpO1xyXG4gIC8vIGNvbnNvbGUubG9nKHJvb3QpO1xyXG5cclxuICAvLyBjb25zdCBoaWVyYXJjaHk6IGQzVHJlZSA9IGNyZWF0ZVRyZWVIaWVyYXJjaHkobm9Eb3VibGVzLCB7XHJcbiAgLy8gICBpZDogXCJuYW1lXCIsXHJcbiAgLy8gICBleGNsdWRlUGFyZW50OiB0cnVlLFxyXG4gIC8vIH0pO1xyXG5cclxuICAvLyBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3QgbGlua0FycjogZDNMaW5rW10gPSBub0RvdWJsZXMubWFwKChkKSA9PiB7XHJcbiAgICByZXR1cm4geyBzb3VyY2U6IGQubmFtZSwgdGFyZ2V0OiBkLnBhcmVudElkIH07XHJcbiAgfSk7XHJcbiAgY29uc3QgbGlua3MgPSBsaW5rQXJyLm1hcCgoZCkgPT4gT2JqZWN0LmNyZWF0ZShkKSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNvbG91ciA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgIFwiLS10ZXh0LWFjY2VudFwiXHJcbiAgKTtcclxuXHJcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgY2lyY2xlOiBhbGwgbG9jYXRlZCBhdCB0aGUgY2VudGVyIG9mIHRoZSBzdmcgYXJlYVxyXG4gIGNvbnN0IG5vZGUgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwiY2lyY2xlXCIpXHJcbiAgICAuZGF0YShub0RvdWJsZXMpXHJcbiAgICAuam9pbihcImNpcmNsZVwiKVxyXG4gICAgLmF0dHIoXCJyXCIsIChkKSA9PiBNYXRoLnJvdW5kKGQuaGVpZ2h0IC8gMTApICsgMTApXHJcbiAgICAuYXR0cihcImN4XCIsIHdpZHRoIC8gMilcclxuICAgIC5hdHRyKFwiY3lcIiwgaGVpZ2h0IC8gMilcclxuICAgIC5zdHlsZShcImZpbGxcIiwgbm9kZUNvbG91cilcclxuICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBub2RlQ29sb3VyKVxyXG4gICAgLnN0eWxlKFwic3Ryb2tlLXdpZHRoXCIsIDQpO1xyXG5cclxuICBub2RlLmF0dHIoXCJhcmlhLWxhYmVsXCIsIChkOiBBZGpMaXN0SXRlbSkgPT4gZC5uYW1lKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcbiAgbm9kZS5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZDogZDNOb2RlKSA9PiB7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGxpbmsgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiM4NjgyODJcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLnNlbGVjdEFsbChcImxpbmVcIilcclxuICAgIC5kYXRhKGxpbmtzKVxyXG4gICAgLmpvaW4oXCJsaW5lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwLjgpO1xyXG5cclxuICAvLyBGZWF0dXJlcyBvZiB0aGUgZm9yY2VzIGFwcGxpZWQgdG8gdGhlIG5vZGVzOlxyXG4gIGNvbnN0IHNpbXVsYXRpb24gPSBkM1xyXG4gICAgLmZvcmNlU2ltdWxhdGlvbigpXHJcbiAgICAuZm9yY2UoXHJcbiAgICAgIFwiY2VudGVyXCIsXHJcbiAgICAgIGQzXHJcbiAgICAgICAgLmZvcmNlQ2VudGVyKClcclxuICAgICAgICAueCh3aWR0aCAvIDIpXHJcbiAgICAgICAgLnkoaGVpZ2h0IC8gMilcclxuICAgICkgLy8gQXR0cmFjdGlvbiB0byB0aGUgY2VudGVyIG9mIHRoZSBzdmcgYXJlYVxyXG4gICAgLmZvcmNlKFwiY2hhcmdlXCIsIGQzLmZvcmNlTWFueUJvZHkoKS5zdHJlbmd0aCgwLjUpKSAvLyBOb2RlcyBhcmUgYXR0cmFjdGVkIG9uZSBlYWNoIG90aGVyIG9mIHZhbHVlIGlzID4gMFxyXG4gICAgLmZvcmNlKFxyXG4gICAgICBcImNvbGxpZGVcIixcclxuICAgICAgZDMuZm9yY2VDb2xsaWRlKCkuc3RyZW5ndGgoMC4wMjUpLnJhZGl1cygzMCkuaXRlcmF0aW9ucygxKVxyXG4gICAgKTsgLy8gRm9yY2UgdGhhdCBhdm9pZHMgY2lyY2xlIG92ZXJsYXBwaW5nXHJcblxyXG4gIC8vIEFwcGx5IHRoZXNlIGZvcmNlcyB0byB0aGUgbm9kZXMgYW5kIHVwZGF0ZSB0aGVpciBwb3NpdGlvbnMuXHJcbiAgLy8gT25jZSB0aGUgZm9yY2UgYWxnb3JpdGhtIGlzIGhhcHB5IHdpdGggcG9zaXRpb25zICgnYWxwaGEnIHZhbHVlIGlzIGxvdyBlbm91Z2gpLCBzaW11bGF0aW9ucyB3aWxsIHN0b3AuXHJcbiAgc2ltdWxhdGlvbi5ub2Rlcyhub0RvdWJsZXMpLm9uKFwidGlja1wiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgbm9kZS5hdHRyKFwiY3hcIiwgKGQpID0+IGQueCkuYXR0cihcImN5XCIsIChkKSA9PiBkLnkpO1xyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgbm9kZS5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGRyYWcgPSAoXHJcbiAgICBzaW11bGF0aW9uOiBkMy5TaW11bGF0aW9uPGQzLlNpbXVsYXRpb25Ob2RlRGF0dW0sIHVuZGVmaW5lZD5cclxuICApID0+IHtcclxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xyXG4gICAgICBkLmZ4ID0gZC54O1xyXG4gICAgICBkLmZ5ID0gZC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdnZWQoZXZlbnQsIGQpIHtcclxuICAgICAgZC5meCA9IGV2ZW50Lng7XHJcbiAgICAgIGQuZnkgPSBldmVudC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdlbmRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwKTtcclxuICAgICAgZC5meCA9IG51bGw7XHJcbiAgICAgIGQuZnkgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkM1xyXG4gICAgICAuZHJhZygpXHJcbiAgICAgIC5vbihcInN0YXJ0XCIsIGRyYWdzdGFydGVkKVxyXG4gICAgICAub24oXCJkcmFnXCIsIGRyYWdnZWQpXHJcbiAgICAgIC5vbihcImVuZFwiLCBkcmFnZW5kZWQpO1xyXG4gIH07XHJcblxyXG4gIG5vZGUuY2FsbChkcmFnKHNpbXVsYXRpb24pKTtcclxuXHJcbiAgLy8gICBjb25zdCBwYWNrID0gKGRhdGEpID0+XHJcbiAgLy8gICAgIGQzLnBhY2soKS5zaXplKFt3aWR0aCwgaGVpZ2h0XSkucGFkZGluZygzKShcclxuICAvLyAgICAgICBkM1xyXG4gIC8vICAgICAgICAgLmhpZXJhcmNoeShkYXRhKVxyXG4gIC8vICAgICAgICAgLnN1bSgoZCkgPT4gZC52YWx1ZSlcclxuICAvLyAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnZhbHVlIC0gYS52YWx1ZSlcclxuICAvLyAgICAgKTtcclxuXHJcbiAgLy8gICBjb25zdCByb290ID0gcGFjayhoaWVyYXJjaHkpO1xyXG5cclxuICAvLyAgIGNvbnN0IHN2ZyA9IGQzXHJcbiAgLy8gICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAvLyAgICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gIC8vICAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgLy8gICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgLy8gICAgIC5zdHlsZShcImZvbnRcIiwgXCIxMHB4IHNhbnMtc2VyaWZcIilcclxuICAvLyAgICAgLnN0eWxlKFwib3ZlcmZsb3dcIiwgXCJ2aXNpYmxlXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XHJcblxyXG4gIC8vICAgY29uc3Qgbm9kZSA9IHN2Z1xyXG4gIC8vICAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gIC8vICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXHJcbiAgLy8gICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgLy8gICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSlcclxuICAvLyAgICAgLmpvaW4oXCJnXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54fSwke2QueX0pYCk7XHJcblxyXG4gIC8vICAgbm9kZVxyXG4gIC8vICAgICAuYXBwZW5kKFwiY2lyY2xlXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwiclwiLCAoZCkgPT4gZC5yKVxyXG4gIC8vICAgICAuYXR0cihcInN0cm9rZVwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcIiNiYmJcIiA6IFwibm9uZVwiKSlcclxuICAvLyAgICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IFwibm9uZVwiIDogXCIjZGRkXCIpKTtcclxuXHJcbiAgLy8gICBjb25zdCBsZWFmID0gbm9kZS5maWx0ZXIoKGQpID0+ICFkLmNoaWxkcmVuKTtcclxuXHJcbiAgLy8gICBsZWFmLnNlbGVjdChcImNpcmNsZVwiKTtcclxuXHJcbiAgLy8gICAvLyBsZWFmXHJcbiAgLy8gICAvLyAgIC5hcHBlbmQoXCJjbGlwUGF0aFwiKVxyXG4gIC8vICAgLy8gICAuYXR0cihcImlkXCIsIChkKSA9PiAoZC5jbGlwVWlkID0gRE9NLnVpZChcImNsaXBcIikpLmlkKVxyXG4gIC8vICAgLy8gICAuYXBwZW5kKFwidXNlXCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwieGxpbms6aHJlZlwiLCAoZCkgPT4gZC5sZWFmVWlkLmhyZWYpO1xyXG5cclxuICAvLyAgIC8vIGxlYWZcclxuICAvLyAgIC8vICAgLmFwcGVuZChcInRleHRcIilcclxuICAvLyAgIC8vICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgKGQpID0+IGQuY2xpcFVpZClcclxuICAvLyAgIC8vICAgLnNlbGVjdEFsbChcInRzcGFuXCIpXHJcbiAgLy8gICAvLyAgIC5kYXRhKChkKSA9PiBkLmRhdGEubmFtZS5zcGxpdCgvKD89W0EtWl1bXkEtWl0pL2cpKVxyXG4gIC8vICAgLy8gICAuam9pbihcInRzcGFuXCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwieFwiLCAwKVxyXG4gIC8vICAgLy8gICAuYXR0cihcInlcIiwgKGQsIGksIG5vZGVzKSA9PiBgJHtpIC0gbm9kZXMubGVuZ3RoIC8gMiArIDAuOH1lbWApXHJcbiAgLy8gICAvLyAgIC50ZXh0KChkKSA9PiBkKTtcclxuXHJcbiAgLy8gICBub2RlLmFwcGVuZChcInRpdGxlXCIpLnRleHQoXHJcbiAgLy8gICAgIChkKSA9PiBgJHtkXHJcbiAgLy8gICAgICAgLmFuY2VzdG9ycygpXHJcbiAgLy8gICAgICAgLm1hcCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAvLyAgICAgICAucmV2ZXJzZSgpXHJcbiAgLy8gICAgICAgLmpvaW4oXCIvXCIpfVxyXG4gIC8vICR7ZC52YWx1ZS50b0xvY2FsZVN0cmluZygpfWBcclxuICAvLyAgICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVkZ2VCdW5kbGluZyA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllciA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyIH0pO1xyXG5cclxuICBjb25zdCBQQURESU5HX0JVQkJMRSA9IDE1OyAvLyBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2UgZW5kIGFuZCBidWJibGVcclxuICBjb25zdCBQQURESU5HX0xBQkVMID0gMzA7IC8vIGRpc3RhbmNlIGJldHdlZW4gZWRnZSBlbmQgYW5kIGVuZ2luZWVyIG5hbWVcclxuICBjb25zdCBCVUJCTEVfU0laRV9NSU4gPSA0O1xyXG4gIGNvbnN0IEJVQkJMRV9TSVpFX01BWCA9IDIwO1xyXG5cclxuICB2YXIgZGlhbWV0ZXIgPSA1NjAsXHJcbiAgICByYWRpdXMgPSBkaWFtZXRlciAvIDIsXHJcbiAgICBpbm5lclJhZGl1cyA9IHJhZGl1cyAtIDE3MDsgLy8gYmV0d2VlbiBjZW50ZXIgYW5kIGVkZ2UgZW5kXHJcblxyXG4gIC8vIFRoZSAnY2x1c3RlcicgZnVuY3Rpb24gdGFrZXMgMSBhcmd1bWVudCBhcyBpbnB1dC4gSXQgYWxzbyBoYXMgbWV0aG9kcyAoPz8pIGxpa2UgY2x1c3Rlci5zZXBhcmF0aW9uKCksIGNsdXN0ZXIuc2l6ZSgpIGFuZCBjbHVzdGVyLm5vZGVTaXplKClcclxuICB2YXIgY2x1c3RlciA9IGQzLmNsdXN0ZXIoKS5zaXplKFszNjAsIGlubmVyUmFkaXVzXSk7XHJcblxyXG4gIHZhciBsaW5lID0gZDNcclxuICAgIC5saW5lUmFkaWFsKClcclxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJ1bmRsZS5iZXRhKDAuODUpKVxyXG4gICAgLnJhZGl1cyhmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZFsxXTtcclxuICAgIH0pXHJcbiAgICAuYW5nbGUoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIChkWzBdIC8gMTgwKSAqIE1hdGguUEk7XHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyByYWRpdXMgKyBcIixcIiArIHJhZGl1cyArIFwiKVwiKTtcclxuXHJcbiAgdmFyIGxpbmsgPSBzdmcuYXBwZW5kKFwiZ1wiKS5zZWxlY3RBbGwoXCIubGlua1wiKSxcclxuICAgIGxhYmVsID0gc3ZnLmFwcGVuZChcImdcIikuc2VsZWN0QWxsKFwiLmxhYmVsXCIpLFxyXG4gICAgYnViYmxlID0gc3ZnLmFwcGVuZChcImdcIikuc2VsZWN0QWxsKFwiLmJ1YmJsZVwiKTtcclxuXHJcbiAgLy8gQWRkIGEgc2NhbGUgZm9yIGJ1YmJsZSBzaXplXHJcbiAgdmFyIGJ1YmJsZVNpemVTY2FsZSA9IGQzXHJcbiAgICAuc2NhbGVMaW5lYXIoKVxyXG4gICAgLmRvbWFpbihbMCwgMTAwXSlcclxuICAgIC5yYW5nZShbQlVCQkxFX1NJWkVfTUlOLCBCVUJCTEVfU0laRV9NQVhdKTtcclxuXHJcbiAgLy8gU2NhbGUgZm9yIHRoZSBidWJibGUgc2l6ZVxyXG5cclxuICAvLyBJZiB3YW5uYSBzZWUgeW91ciBkYXRhXHJcbiAgLy8gY29uc29sZS5sb2coaGllcmFyY2hpY2FsRGF0YSlcclxuXHJcbiAgLy8gUmVmb3JtYXQgdGhlIGRhdGFcclxuICB2YXIgcm9vdCA9IHBhY2thZ2VIaWVyYXJjaHkoaGllcilcclxuICAgIC8vZGVidWdnZXI7XHJcbiAgICAuc3VtKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGQpO1xyXG4gICAgICByZXR1cm4gZC5oZWlnaHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgLy8gY29uc29sZS5sb2cocm9vdClcclxuXHJcbiAgLy8gQnVpbGQgYW4gb2JqZWN0IHRoYXQgZ2l2ZXMgZmVhdHVyZSBvZiBlYWNoIGxlYXZlc1xyXG4gIGNsdXN0ZXIocm9vdCk7XHJcbiAgY29uc3QgbGVhdmVzID0gcm9vdC5sZWF2ZXMoKTtcclxuXHJcbiAgLy8gTGVhdmVzIGlzIGFuIGFycmF5IG9mIE9iamVjdHMuIDEgaXRlbSA9IG9uZSBsZWFmLiBQcm92aWRlcyB4IGFuZCB5IGZvciBsZWFmIHBvc2l0aW9uIGluIHRoZSBzdmcuIEFsc28gZ2l2ZXMgZGV0YWlscyBhYm91dCBpdHMgcGFyZW50LlxyXG4gIGNvbnN0IF9saW5rID0gbGlua1xyXG4gICAgLmRhdGEocGFja2FnZUltcG9ydHMobGVhdmVzKSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwicGF0aFwiKVxyXG4gICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgKGQuc291cmNlID0gZFswXSksIChkLnRhcmdldCA9IGRbZC5sZW5ndGggLSAxXSk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImxpbmtcIilcclxuICAgIC5hdHRyKFwiZFwiLCBsaW5lKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCJibGFja1wiKTtcclxuXHJcbiAgY29uc3QgX2xhYmVsID0gbGFiZWxcclxuICAgIC5kYXRhKGxlYXZlcylcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImxhYmVsXCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiMC4zMWVtXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIFwicm90YXRlKFwiICtcclxuICAgICAgICAoZC54IC0gOTApICtcclxuICAgICAgICBcIil0cmFuc2xhdGUoXCIgK1xyXG4gICAgICAgIChkLnkgKyBQQURESU5HX0xBQkVMKSArXHJcbiAgICAgICAgXCIsMClcIiArXHJcbiAgICAgICAgKGQueCA8IDE4MCA/IFwiXCIgOiBcInJvdGF0ZSgxODApXCIpXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC54IDwgMTgwID8gXCJzdGFydFwiIDogXCJlbmRcIjtcclxuICAgIH0pXHJcbiAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC5kYXRhLmtleTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCBfYnViYmxlID0gYnViYmxlXHJcbiAgICAuZGF0YShsZWF2ZXMpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcImNpcmNsZVwiKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImJ1YmJsZVwiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBcInJvdGF0ZShcIiArIChkLnggLSA5MCkgKyBcIil0cmFuc2xhdGUoXCIgKyAoZC55ICsgUEFERElOR19CVUJCTEUpICsgXCIsMClcIlxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiclwiLCAoZCkgPT4gYnViYmxlU2l6ZVNjYWxlKGQudmFsdWUpKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCJibGFja1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwiIzY5YTNiMlwiKVxyXG4gICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwLjIpO1xyXG5cclxuICAvLyBMYXppbHkgY29uc3RydWN0IHRoZSBwYWNrYWdlIGhpZXJhcmNoeSBmcm9tIGNsYXNzIG5hbWVzLlxyXG4gIGZ1bmN0aW9uIHBhY2thZ2VIaWVyYXJjaHkoY2xhc3Nlcykge1xyXG4gICAgdmFyIG1hcCA9IHt9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGZpbmQobmFtZSwgZGF0YSkge1xyXG4gICAgICB2YXIgbm9kZSA9IG1hcFtuYW1lXSxcclxuICAgICAgICBpO1xyXG4gICAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgICBub2RlID0gbWFwW25hbWVdID0gZGF0YSB8fCB7IG5hbWU6IG5hbWUsIGNoaWxkcmVuOiBbXSB9O1xyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgbm9kZS5wYXJlbnQgPSBmaW5kKG5hbWUuc3Vic3RyaW5nKDAsIChpID0gbmFtZS5sYXN0SW5kZXhPZihcIi5cIikpKSk7XHJcbiAgICAgICAgICBub2RlLnBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgbm9kZS5rZXkgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBmaW5kKGQubmFtZSwgZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZDMuaGllcmFyY2h5KG1hcFtcIlwiXSk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm4gYSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBub2Rlcy5cclxuICBmdW5jdGlvbiBwYWNrYWdlSW1wb3J0cyhub2Rlcykge1xyXG4gICAgdmFyIG1hcCA9IHt9LFxyXG4gICAgICBpbXBvcnRzID0gW107XHJcblxyXG4gICAgLy8gQ29tcHV0ZSBhIG1hcCBmcm9tIG5hbWUgdG8gbm9kZS5cclxuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgbWFwW2QuZGF0YS5uYW1lXSA9IGQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGb3IgZWFjaCBpbXBvcnQsIGNvbnN0cnVjdCBhIGxpbmsgZnJvbSB0aGUgc291cmNlIHRvIHRhcmdldCBub2RlLlxyXG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBpZiAoZC5kYXRhLmltcG9ydHMpXHJcbiAgICAgICAgZC5kYXRhLmltcG9ydHMuZm9yRWFjaChmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgICAgaW1wb3J0cy5wdXNoKG1hcFtkLmRhdGEubmFtZV0ucGF0aChtYXBbaV0pKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpbXBvcnRzO1xyXG4gIH1cclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgdHlwZSB7IGQzTm9kZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGdyYXBobGliVG9EMywgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZm9yY2VEaXJlY3RlZEcgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBtb2RhbC5wbHVnaW47XHJcbiAgbGV0IG5vZGVUb0dldFRvID0gY3VyckZpbGUuYmFzZW5hbWU7XHJcbiAgY29uc29sZS5sb2coeyBub2RlVG9HZXRUbyB9KTtcclxuXHJcbiAgY29uc29sZS50aW1lKFwiRmluZCBhbGwgcGF0aHNcIik7XHJcbiAgLy8gbGV0IHBhdGhzRnJvbU5vZGVUb0dldFRvID0gZ3JhcGhsaWIuYWxnLmRpamtzdHJhKGdyYXBoLCBub2RlVG9HZXRUbyk7XHJcbiAgY29uc29sZS50aW1lRW5kKFwiRmluZCBhbGwgcGF0aHNcIik7XHJcblxyXG4gIGNvbnN0IGRlZmF1bHROb2RlQ29sb3VyID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgXCItLXRleHQtYWNjZW50XCJcclxuICApO1xyXG4gIGxldCBjdXJyTm9kZUNvbG91ciA9IGRlZmF1bHROb2RlQ29sb3VyO1xyXG5cclxuICBjb25zdCBjb2xvdXJDaGFuZ2VJbnB1dCA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwiaW5wdXRcIilcclxuICAgIC5hdHRyKFwidHlwZVwiLCBcImNvbG9yXCIpO1xyXG5cclxuICBjb2xvdXJDaGFuZ2VJbnB1dC5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiBjaGFuZ2VDb2xvcihlbCkge1xyXG4gICAgY3Vyck5vZGVDb2xvdXIgPSBlbC50YXJnZXQudmFsdWU7XHJcbiAgICBub2RlXHJcbiAgICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgLmR1cmF0aW9uKDMwMClcclxuICAgICAgLnN0eWxlKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICAgIGlmIChkLmluZGV4ID09PSBjdXJyTm9kZUluZGV4KSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgLy8gY29uc3Qgc2F2ZUxheW91dEJ1dHRvbiA9IG1vZGFsLmNvbnRlbnRFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyB0ZXh0OiAnU2F2ZSBMYXlvdXQnIH0pXHJcbiAgLy8gICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlR3JhcGgpXHJcblxyXG4gIGNvbnN0IGRhdGEgPSBncmFwaGxpYlRvRDMoZ3JhcGgpO1xyXG5cclxuICBjb25zdCBsaW5rczoge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIHNvdXJjZTogeyBpbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gICAgdGFyZ2V0OiB7IGluZGV4OiBudW1iZXI7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgfVtdID0gZGF0YS5saW5rcy5tYXAoKGQpID0+IE9iamVjdC5jcmVhdGUoZCkpO1xyXG5cclxuICBjb25zdCBjdXJyTm9kZSA9IGRhdGEubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5uYW1lID09PSBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgbGV0IGN1cnJOb2RlSW5kZXg6IG51bWJlcjtcclxuICBpZiAoIWN1cnJOb2RlKSB7XHJcbiAgICBjb25zdCBpZCA9IGRhdGEubm9kZXMubGVuZ3RoO1xyXG4gICAgZGF0YS5ub2Rlcy5wdXNoKHsgaWQsIG5hbWU6IGN1cnJGaWxlLmJhc2VuYW1lIH0pO1xyXG4gICAgY3Vyck5vZGVJbmRleCA9IGlkO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjdXJyTm9kZUluZGV4ID0gY3Vyck5vZGUuaWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBub2RlcyA9IGRhdGEubm9kZXMubWFwKChkKSA9PiBPYmplY3QuY3JlYXRlKGQpKTtcclxuXHJcbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGQzXHJcbiAgICAuZm9yY2VTaW11bGF0aW9uKG5vZGVzKVxyXG4gICAgLmZvcmNlKFxyXG4gICAgICBcImxpbmtcIixcclxuICAgICAgZDMuZm9yY2VMaW5rKGxpbmtzKS5pZCgoZCkgPT4gZC5pZClcclxuICAgIClcclxuICAgIC5mb3JjZShcImNoYXJnZVwiLCBkMy5mb3JjZU1hbnlCb2R5KCkuc3RyZW5ndGgoLTgpKVxyXG4gICAgLmZvcmNlKFwiY2VudGVyXCIsIGQzLmZvcmNlQ2VudGVyKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMikuc3RyZW5ndGgoMC41KSk7XHJcblxyXG4gIGNvbnN0IGRyYWcgPSAoc2ltdWxhdGlvbjogZDMuU2ltdWxhdGlvbjxhbnksIHVuZGVmaW5lZD4pID0+IHtcclxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xyXG4gICAgICBkLmZ4ID0gZC54O1xyXG4gICAgICBkLmZ5ID0gZC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdnZWQoZXZlbnQsIGQpIHtcclxuICAgICAgZC5meCA9IGV2ZW50Lng7XHJcbiAgICAgIGQuZnkgPSBldmVudC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdlbmRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwKTtcclxuICAgICAgZC5meCA9IG51bGw7XHJcbiAgICAgIGQuZnkgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkM1xyXG4gICAgICAuZHJhZygpXHJcbiAgICAgIC5vbihcInN0YXJ0XCIsIGRyYWdzdGFydGVkKVxyXG4gICAgICAub24oXCJkcmFnXCIsIGRyYWdnZWQpXHJcbiAgICAgIC5vbihcImVuZFwiLCBkcmFnZW5kZWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImZvcmNlRGlyZWN0ZWRHXCIpO1xyXG5cclxuICBjb25zdCBsaW5rID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjODY4MjgyXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5zZWxlY3RBbGwoXCJsaW5lXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5qb2luKFwibGluZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMC44KVxyXG4gICAgLmF0dHIoXCJtYXJrZXItZW5kXCIsIFwidXJsKCNlbmQpXCIpO1xyXG5cclxuICB2YXIgcGF0aCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcInN2ZzpnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEobGlua3MpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcInN2ZzpwYXRoXCIpXHJcbiAgICAvLyAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwibGluayBcIiArIGQudHlwZTsgfSlcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJsaW5rXCIpXHJcbiAgICAuYXR0cihcIm1hcmtlci1lbmRcIiwgXCJ1cmwoI2VuZClcIik7XHJcblxyXG4gIGNvbnN0IGFycm93SGVhZCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcInN2ZzpkZWZzXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwibWFya2VyXCIpXHJcbiAgICAuZGF0YShbXCJlbmRcIl0pIC8vIERpZmZlcmVudCBsaW5rL3BhdGggdHlwZXMgY2FuIGJlIGRlZmluZWQgaGVyZVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJzdmc6bWFya2VyXCIpIC8vIFRoaXMgc2VjdGlvbiBhZGRzIGluIHRoZSBhcnJvd3NcclxuICAgIC5hdHRyKFwiaWRcIiwgU3RyaW5nKVxyXG4gICAgLmF0dHIoXCJ2aWV3Qm94XCIsIFwiMCAtNSAxMCAxMFwiKVxyXG4gICAgLmF0dHIoXCJyZWZYXCIsIDIwKVxyXG4gICAgLmF0dHIoXCJyZWZZXCIsIDAuMSlcclxuICAgIC5hdHRyKFwibWFya2VyV2lkdGhcIiwgNilcclxuICAgIC5hdHRyKFwibWFya2VySGVpZ2h0XCIsIDYpXHJcbiAgICAuYXR0cihcIm9yaWVudFwiLCBcImF1dG9cIilcclxuICAgIC8vIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzg2ODI4MlwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMTApXHJcbiAgICAuYXBwZW5kKFwic3ZnOnBhdGhcIilcclxuICAgIC5hdHRyKFwiZFwiLCBcIk0wLC01TDEwLDBMMCw1XCIpO1xyXG5cclxuICBjb25zdCBuYW1lRnJvbUluZGV4ID0gKGQ6IHsgaW5kZXg6IG51bWJlciB9KSA9PlxyXG4gICAgZGF0YS5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSBkLmluZGV4KS5uYW1lO1xyXG5cclxuICBjb25zdCBpbmRleEZyb21OYW1lID0gKG5hbWU6IHN0cmluZyk6IG51bWJlciA9PlxyXG4gICAgZGF0YS5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLm5hbWUgPT09IG5hbWUpLmlkO1xyXG5cclxuICBjb25zdCBub2RlOiBkMy5TZWxlY3Rpb248XHJcbiAgICBkMy5CYXNlVHlwZSB8IFNWR0NpcmNsZUVsZW1lbnQsXHJcbiAgICBhbnksXHJcbiAgICBTVkdHRWxlbWVudCxcclxuICAgIHVua25vd25cclxuICA+ID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLnNlbGVjdEFsbChcImNpcmNsZVwiKVxyXG4gICAgLmRhdGEobm9kZXMpXHJcbiAgICAuam9pbihcImNpcmNsZVwiKVxyXG5cclxuICAgIC5hdHRyKFwiclwiLCA1KVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgIGlmIChuYW1lRnJvbUluZGV4KGQpID09PSBjdXJyRmlsZS5iYXNlbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBcIiNmZmZmZmZcIjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY3Vyck5vZGVDb2xvdXI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuY2FsbChkcmFnKHNpbXVsYXRpb24pKTtcclxuXHJcbiAgbm9kZS5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZDogZDNOb2RlKSA9PiBkLm5hbWUpO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBub2RlLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBkM05vZGUpID0+IHtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgbm9kZS5vbihcIm1vdXNlZG93blwiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQpID0+IHtcclxuICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcclxuICAgICAgbm9kZVRvR2V0VG8gPSBkLm5hbWU7XHJcblxyXG4gICAgICBub2RlLnN0eWxlKFwiZmlsbFwiLCAobikgPT4ge1xyXG4gICAgICAgIGlmIChuLm5hbWUgPT09IG5vZGVUb0dldFRvKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCIjZmYwMDAwXCI7XHJcbiAgICAgICAgfSBlbHNlIHJldHVybiBjdXJyTm9kZUNvbG91cjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBwYXRoc0Zyb21Ob2RlVG9HZXRUbyA9IGdyYXBobGliLmFsZy5kaWprc3RyYShncmFwaCwgbm9kZVRvR2V0VG8pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiBsaW5rZWQoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcclxuICAgIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IGxpbmtlZEFyciA9IGxpbmtzLmZpbmQoXHJcbiAgICAgIChsaW5rKSA9PlxyXG4gICAgICAgIChsaW5rLnNvdXJjZS5pbmRleCA9PT0gYSAmJiBsaW5rLnRhcmdldC5pbmRleCA9PT0gYikgfHxcclxuICAgICAgICAobGluay50YXJnZXQuaW5kZXggPT09IGEgJiYgbGluay5zb3VyY2UuaW5kZXggPT09IGIpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAhIWxpbmtlZEFycjtcclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHdhbGtEaWprc3RyYVBhdGhzKFxyXG4gIC8vICAgcGF0aHM6IHsgW25vZGU6IHN0cmluZ106IGdyYXBobGliLlBhdGggfSxcclxuICAvLyAgIHN0YXJ0Tm9kZTogc3RyaW5nXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAoc3RhcnROb2RlID09PSBub2RlVG9HZXRUbyB8fCBwYXRoc1tzdGFydE5vZGVdLmRpc3RhbmNlID09PSBJbmZpbml0eSlcclxuICAvLyAgICAgcmV0dXJuIFtdO1xyXG4gIC8vICAgbGV0IHN0ZXAgPSBzdGFydE5vZGU7XHJcblxyXG4gIC8vICAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICAvLyAgIGxldCBpID0gMDtcclxuICAvLyAgIGNvbnN0IE1BWCA9IDMwMDtcclxuICAvLyAgIHdoaWxlIChwYXRoc1tzdGVwXS5wcmVkZWNlc3NvciAhPT0gbm9kZVRvR2V0VG8gJiYgaSA8IE1BWCkge1xyXG4gIC8vICAgICBpKys7XHJcbiAgLy8gICAgIHN0ZXAgPSBwYXRoc1tzdGVwXS5wcmVkZWNlc3NvcjtcclxuICAvLyAgICAgcGF0aC5wdXNoKHN0ZXApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKGkgPj0gTUFYKSByZXR1cm4gW107XHJcbiAgLy8gICBwYXRoLnB1c2gobm9kZVRvR2V0VG8pO1xyXG4gIC8vICAgcmV0dXJuIHBhdGg7XHJcbiAgLy8gfVxyXG5cclxuICBub2RlXHJcbiAgICAub24oXCJtb3VzZW92ZXJcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiB7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xyXG4gICAgICBub2RlXHJcbiAgICAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAgIC5kdXJhdGlvbigxNTApXHJcbiAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAobykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGxpbmtlZChkLmluZGV4LCBvLmluZGV4KSA/IDEgOiAwLjI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIGxpbmtcclxuICAgICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgICAgLmR1cmF0aW9uKDE1MClcclxuICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgICByZXR1cm4gby5zb3VyY2UuaW5kZXggPT09IGQuaW5kZXggfHwgby50YXJnZXQuaW5kZXggPT09IGQuaW5kZXhcclxuICAgICAgICAgICAgPyAxXHJcbiAgICAgICAgICAgIDogMC4yO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gSGlnaGxpZ2h0IHBhdGggZnJvbSBob3ZlcmVkIG5vZGUgdG8gY3Vyck5vZGVcclxuICAgICAgY29uc3QgaG92ZXJlZE5vZGUgPSBuYW1lRnJvbUluZGV4KGQpO1xyXG4gICAgICAvLyBjb25zdCBwYXRoID0gd2Fsa0RpamtzdHJhUGF0aHMocGF0aHNGcm9tTm9kZVRvR2V0VG8sIGhvdmVyZWROb2RlKTtcclxuICAgICAgLy8gaWYgKHBhdGgubGVuZ3RoKSB7XHJcbiAgICAgIC8vICAgbGlua1xyXG4gICAgICAvLyAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAvLyAgICAgLmR1cmF0aW9uKDE1MClcclxuICAgICAgLy8gICAgIC5zdHlsZShcInN0cm9rZVwiLCBmdW5jdGlvbiAobGluaykge1xyXG4gICAgICAvLyAgICAgICBpZiAoXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsuc291cmNlKSkgJiZcclxuICAgICAgLy8gICAgICAgICBwYXRoLmluY2x1ZGVzKG5hbWVGcm9tSW5kZXgobGluay50YXJnZXQpKVxyXG4gICAgICAvLyAgICAgICApXHJcbiAgICAgIC8vICAgICAgICAgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICAvLyAgICAgfSlcclxuICAgICAgLy8gICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZnVuY3Rpb24gKGxpbmspIHtcclxuICAgICAgLy8gICAgICAgaWYgKFxyXG4gICAgICAvLyAgICAgICAgIHBhdGguaW5jbHVkZXMobmFtZUZyb21JbmRleChsaW5rLnNvdXJjZSkpICYmXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsudGFyZ2V0KSlcclxuICAgICAgLy8gICAgICAgKVxyXG4gICAgICAvLyAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAvLyAgICAgfSk7XHJcbiAgICAgIC8vIH1cclxuICAgIH0pXHJcbiAgICAub24oXCJtb3VzZW91dFwiLCB1bmZvY3VzKTtcclxuXHJcbiAgZnVuY3Rpb24gZm9jdXNOZWlnaGJvdXJzKGQsIGV2ZW50OiBNb3VzZUV2ZW50KSB7IH1cclxuXHJcbiAgZnVuY3Rpb24gdW5mb2N1cygpIHtcclxuICAgIC8vIGxhYmVsTm9kZS5hdHRyKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xyXG4gICAgbm9kZS5zdHlsZShcIm9wYWNpdHlcIiwgMSk7XHJcbiAgICBsaW5rLnN0eWxlKFwib3BhY2l0eVwiLCAxKS5zdHlsZShcInN0cm9rZVwiLCBcIiM4NjgyODJcIik7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0aW9uLm9uKFwidGlja1wiLCAoKSA9PiB7XHJcbiAgICBsaW5rXHJcbiAgICAgIC5hdHRyKFwieDFcIiwgKGQpID0+IGQuc291cmNlLngpXHJcbiAgICAgIC5hdHRyKFwieTFcIiwgKGQpID0+IGQuc291cmNlLnkpXHJcbiAgICAgIC5hdHRyKFwieDJcIiwgKGQpID0+IGQudGFyZ2V0LngpXHJcbiAgICAgIC5hdHRyKFwieTJcIiwgKGQpID0+IGQudGFyZ2V0LnkpO1xyXG5cclxuICAgIG5vZGUuYXR0cihcImN4XCIsIChkKSA9PiBkLngpLmF0dHIoXCJjeVwiLCAoZCkgPT4gZC55KTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIG5vZGUuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgbGluay5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgMTBdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG5cclxuICBmdW5jdGlvbiBzYXZlR3JhcGgoKSB7XHJcbiAgICBjb25zdCBjbG9uZSA9IHN2Zy5jbG9uZSh0cnVlKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiRkRHXCIsIEpTT04uc3RyaW5naWZ5KGNsb25lKSk7XHJcbiAgfVxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBpY2ljbGUgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICB2aWV3SGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXIgfSk7XHJcblxyXG4gIGNvbnN0IGZvcm1hdCA9IGQzLmZvcm1hdChcIixkXCIpO1xyXG5cclxuICBjb25zdCBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbChcclxuICAgIGQzLnF1YW50aXplKGQzLmludGVycG9sYXRlUmFpbmJvdywgaGllci5jaGlsZHJlbi5sZW5ndGggKyAxKVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IHBhcnRpdGlvbiA9IChkYXRhKSA9PiB7XHJcbiAgICBjb25zdCByb290ID0gZDNcclxuICAgICAgLmhpZXJhcmNoeShkYXRhKVxyXG4gICAgICAuc3VtKChkKSA9PiBkLnZhbHVlKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5oZWlnaHQgLSBhLmhlaWdodCB8fCBiLnZhbHVlIC0gYS52YWx1ZSk7XHJcbiAgICByZXR1cm4gZDMucGFydGl0aW9uKCkuc2l6ZShbdmlld0hlaWdodCwgKChyb290LmhlaWdodCArIDEpICogd2lkdGgpIC8gM10pKFxyXG4gICAgICByb290XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHJvb3QgPSBwYXJ0aXRpb24oaGllcik7XHJcbiAgbGV0IGZvY3VzID0gcm9vdDtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHZpZXdIZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLnN0eWxlKFwiZm9udFwiLCBcIjEwcHggc2Fucy1zZXJpZlwiKTtcclxuXHJcbiAgY29uc3QgY2VsbCA9IHN2Z1xyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSlcclxuICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLnkwfSwke2QueDB9KWApO1xyXG5cclxuICBjb25zdCByZWN0ID0gY2VsbFxyXG4gICAgLmFwcGVuZChcInJlY3RcIilcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgKGQpID0+IGQueTEgLSBkLnkwIC0gMSlcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIChkKSA9PiByZWN0SGVpZ2h0KGQpKVxyXG4gICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgIGlmICghZC5kZXB0aCkgcmV0dXJuIFwiI2NjY1wiO1xyXG4gICAgICB3aGlsZSAoZC5kZXB0aCA+IDEpIGQgPSBkLnBhcmVudDtcclxuICAgICAgcmV0dXJuIGNvbG9yKGQuZGF0YS5kYXRhLm5hbWUpO1xyXG4gICAgfSlcclxuICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIilcclxuICAgIC5vbihcImNsaWNrXCIsIGNsaWNrZWQpO1xyXG5cclxuICBjb25zdCB0ZXh0ID0gY2VsbFxyXG4gICAgLmFwcGVuZChcInRleHRcIilcclxuICAgIC5zdHlsZShcInVzZXItc2VsZWN0XCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwieFwiLCA0KVxyXG4gICAgLmF0dHIoXCJ5XCIsIDEzKTtcclxuICAvLyAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gK2xhYmVsVmlzaWJsZShkKSk7XHJcblxyXG4gIHRleHQuYXBwZW5kKFwidHNwYW5cIikudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSk7XHJcblxyXG4gIGNvbnN0IHRzcGFuID0gdGV4dFxyXG4gICAgLmFwcGVuZChcInRzcGFuXCIpXHJcbiAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gKGxhYmVsVmlzaWJsZShkKSA/IDEgOiAwKSAqIDAuNylcclxuICAgIC50ZXh0KChkKSA9PiBgICR7Zm9ybWF0KGQudmFsdWUpfWApO1xyXG5cclxuICBjZWxsLmFwcGVuZChcInRpdGxlXCIpLnRleHQoXHJcbiAgICAoZCkgPT5cclxuICAgICAgYCR7ZC5hbmNlc3RvcnMoKS5tYXAoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpXHJcbiAgICAgIC8vIC5yZXZlcnNlKClcclxuICAgICAgLy8gLmpvaW4oXCIvXCIpfVxcbiR7Zm9ybWF0KGQudmFsdWUpXHJcbiAgICAgIH1gXHJcbiAgKTtcclxuXHJcbiAgZnVuY3Rpb24gY2xpY2tlZChldmVudCwgcCkge1xyXG4gICAgY29uc29sZS5sb2coeyBwIH0pO1xyXG4gICAgZm9jdXMgPSBmb2N1cyA9PT0gcCA/IChwID0gcC5wYXJlbnQpIDogcDtcclxuXHJcbiAgICByb290LmVhY2goKGQpID0+IHtcclxuICAgICAgZC50YXJnZXQgPSB7XHJcbiAgICAgICAgeDA6ICgoZC54MCAtIHAueDApIC8gKHAueDEgLSBwLngwKSkgKiB2aWV3SGVpZ2h0LFxyXG4gICAgICAgIHgxOiAoKGQueDEgLSBwLngwKSAvIChwLngxIC0gcC54MCkpICogdmlld0hlaWdodCxcclxuICAgICAgICB5MDogZC55MCAtIHAueTAsXHJcbiAgICAgICAgeTE6IGQueTEgLSBwLnkwLFxyXG4gICAgICB9O1xyXG4gICAgICBjb25zb2xlLmxvZyhkLnRhcmdldC54MCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ID0gY2VsbFxyXG4gICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgIC5kdXJhdGlvbig3NTApXHJcbiAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC50YXJnZXQueTB9LCR7ZC50YXJnZXQueDB9KWApO1xyXG5cclxuICAgIHJlY3QudHJhbnNpdGlvbih0KS5hdHRyKFwiaGVpZ2h0XCIsIChkKSA9PiByZWN0SGVpZ2h0KGQudGFyZ2V0KSk7XHJcbiAgICB0ZXh0LnRyYW5zaXRpb24odCkuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gK2xhYmVsVmlzaWJsZShkLnRhcmdldCkpO1xyXG4gICAgdHNwYW5cclxuICAgICAgLnRyYW5zaXRpb24odClcclxuICAgICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQpID0+IChsYWJlbFZpc2libGUoZCkgPyAxIDogMCkgKiAwLjcpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVjdEhlaWdodChkKSB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICByZXR1cm4gZC54MSAtIGQueDAgLSBNYXRoLm1pbigxLCAoZC54MSAtIGQueDApIC8gMik7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsYWJlbFZpc2libGUoZCkge1xyXG4gICAgcmV0dXJuIGQueTEgPD0gd2lkdGggJiYgZC55MCA+PSAwICYmIGQueDEgLSBkLngwID4gMTY7XHJcbiAgfVxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCByYWRpYWxUcmVlID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IHJvb3QgPSBkM1xyXG4gICAgLmhpZXJhcmNoeShoaWVyYXJjaHksIChkKSA9PiBkLmNoaWxkcmVuKVxyXG4gICAgLnN1bSgoZCkgPT4gKGQuY2hpbGRyZW4gPyAwIDogMSkpXHJcbiAgICAuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xyXG5cclxuICBjb25zdCBvdXRlclJhZGl1cyA9IHdpZHRoIC8gMjtcclxuICBjb25zdCBpbm5lclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gMTcwO1xyXG5cclxuICBjb25zdCBjbHVzdGVyID0gZDNcclxuICAgIC5jbHVzdGVyKClcclxuICAgIC5zaXplKFszNjAsIGlubmVyUmFkaXVzXSlcclxuICAgIC5zZXBhcmF0aW9uKChhLCBiKSA9PiAxKTtcclxuXHJcbiAgY29uc3QgY29sb3IgPSBkM1xyXG4gICAgLnNjYWxlT3JkaW5hbCgpXHJcbiAgICAuZG9tYWluKGdyYXBoLm5vZGVzKCkpXHJcbiAgICAucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XHJcblxyXG4gIGZ1bmN0aW9uIG1heExlbmd0aChkOiBkMy5IaWVyYXJjaHlOb2RlPHVua25vd24+KSB7XHJcbiAgICByZXR1cm4gZC5kYXRhLmRhdGEuZGVwdGggKyAoZC5jaGlsZHJlbiA/IGQzLm1heChkLmNoaWxkcmVuLCBtYXhMZW5ndGgpIDogMCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzZXRSYWRpdXMoZDogZDMuSGllcmFyY2h5Tm9kZTx1bmtub3duPiwgeTA6IG51bWJlciwgazogbnVtYmVyKSB7XHJcbiAgICBkLnJhZGl1cyA9ICh5MCArPSBkLmRhdGEuZGF0YS5kZXB0aCkgKiBrO1xyXG4gICAgaWYgKGQuY2hpbGRyZW4pIGQuY2hpbGRyZW4uZm9yRWFjaCgoZCkgPT4gc2V0UmFkaXVzKGQsIHkwLCBrKSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzZXRDb2xvcihkOiBkMy5IaWVyYXJjaHlOb2RlPHVua25vd24+KSB7XHJcbiAgICB2YXIgbmFtZSA9IGQuZGF0YS5kYXRhLm5hbWU7XHJcbiAgICBkLmNvbG9yID1cclxuICAgICAgY29sb3IuZG9tYWluKCkuaW5kZXhPZihuYW1lKSA+PSAwXHJcbiAgICAgICAgPyBjb2xvcihuYW1lKVxyXG4gICAgICAgIDogZC5wYXJlbnRcclxuICAgICAgICAgID8gZC5wYXJlbnQuY29sb3JcclxuICAgICAgICAgIDogbnVsbDtcclxuICAgIGlmIChkLmNoaWxkcmVuKSBkLmNoaWxkcmVuLmZvckVhY2goc2V0Q29sb3IpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua1ZhcmlhYmxlKGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnNvdXJjZS54LCBkLnNvdXJjZS5yYWRpdXMsIGQudGFyZ2V0LngsIGQudGFyZ2V0LnJhZGl1cyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rQ29uc3RhbnQoZCkge1xyXG4gICAgcmV0dXJuIGxpbmtTdGVwKGQuc291cmNlLngsIGQuc291cmNlLnksIGQudGFyZ2V0LngsIGQudGFyZ2V0LnkpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua0V4dGVuc2lvblZhcmlhYmxlKGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnRhcmdldC54LCBkLnRhcmdldC5yYWRpdXMsIGQudGFyZ2V0LngsIGlubmVyUmFkaXVzKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtFeHRlbnNpb25Db25zdGFudChkKSB7XHJcbiAgICByZXR1cm4gbGlua1N0ZXAoZC50YXJnZXQueCwgZC50YXJnZXQueSwgZC50YXJnZXQueCwgaW5uZXJSYWRpdXMpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua1N0ZXAoXHJcbiAgICBzdGFydEFuZ2xlOiBudW1iZXIsXHJcbiAgICBzdGFydFJhZGl1czogbnVtYmVyLFxyXG4gICAgZW5kQW5nbGU6IG51bWJlcixcclxuICAgIGVuZFJhZGl1czogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjMCA9IE1hdGguY29zKChzdGFydEFuZ2xlID0gKChzdGFydEFuZ2xlIC0gOTApIC8gMTgwKSAqIE1hdGguUEkpKTtcclxuICAgIGNvbnN0IHMwID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XHJcbiAgICBjb25zdCBjMSA9IE1hdGguY29zKChlbmRBbmdsZSA9ICgoZW5kQW5nbGUgLSA5MCkgLyAxODApICogTWF0aC5QSSkpO1xyXG4gICAgY29uc3QgczEgPSBNYXRoLnNpbihlbmRBbmdsZSk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBcIk1cIiArXHJcbiAgICAgIHN0YXJ0UmFkaXVzICogYzAgK1xyXG4gICAgICBcIixcIiArXHJcbiAgICAgIHN0YXJ0UmFkaXVzICogczAgK1xyXG4gICAgICAoZW5kQW5nbGUgPT09IHN0YXJ0QW5nbGVcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IFwiQVwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyArXHJcbiAgICAgICAgXCIsXCIgK1xyXG4gICAgICAgIHN0YXJ0UmFkaXVzICtcclxuICAgICAgICBcIiAwIDAgXCIgK1xyXG4gICAgICAgIChlbmRBbmdsZSA+IHN0YXJ0QW5nbGUgPyAxIDogMCkgK1xyXG4gICAgICAgIFwiIFwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyAqIGMxICtcclxuICAgICAgICBcIixcIiArXHJcbiAgICAgICAgc3RhcnRSYWRpdXMgKiBzMSkgK1xyXG4gICAgICBcIkxcIiArXHJcbiAgICAgIGVuZFJhZGl1cyAqIGMxICtcclxuICAgICAgXCIsXCIgK1xyXG4gICAgICBlbmRSYWRpdXMgKiBzMVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGxlZ2VuZCA9IChzdmcpID0+IHtcclxuICAgIGNvbnN0IGcgPSBzdmdcclxuICAgICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgICAgLmRhdGEoY29sb3IuZG9tYWluKCkpXHJcbiAgICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICBcInRyYW5zZm9ybVwiLFxyXG4gICAgICAgIChkLCBpKSA9PiBgdHJhbnNsYXRlKCR7LW91dGVyUmFkaXVzfSwkey1vdXRlclJhZGl1cyArIGkgKiAyMH0pYFxyXG4gICAgICApO1xyXG5cclxuICAgIGcuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwid2lkdGhcIiwgMTgpLmF0dHIoXCJoZWlnaHRcIiwgMTgpLmF0dHIoXCJmaWxsXCIsIGNvbG9yKTtcclxuXHJcbiAgICBnLmFwcGVuZChcInRleHRcIilcclxuICAgICAgLmF0dHIoXCJ4XCIsIDI0KVxyXG4gICAgICAuYXR0cihcInlcIiwgOSlcclxuICAgICAgLmF0dHIoXCJkeVwiLCBcIjAuMzVlbVwiKVxyXG4gICAgICAudGV4dCgoZCkgPT4gZCk7XHJcbiAgfTtcclxuXHJcbiAgY2x1c3Rlcihyb290KTtcclxuICBzZXRSYWRpdXMocm9vdCwgKHJvb3QuZGF0YS5kYXRhLmRlcHRoID0gMCksIGlubmVyUmFkaXVzIC8gbWF4TGVuZ3RoKHJvb3QpKTtcclxuICBzZXRDb2xvcihyb290KTtcclxuXHJcbiAgc3ZnLmFwcGVuZChcImdcIikuY2FsbChsZWdlbmQpO1xyXG5cclxuICBzdmcuYXBwZW5kKFwic3R5bGVcIikudGV4dChgXHJcblxyXG4ubGluay0tYWN0aXZlIHtcclxuc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7XHJcbnN0cm9rZS13aWR0aDogMS41cHg7XHJcbn1cclxuXHJcbi5saW5rLWV4dGVuc2lvbi0tYWN0aXZlIHtcclxuc3Ryb2tlLW9wYWNpdHk6IC42O1xyXG59XHJcblxyXG4ubGFiZWwtLWFjdGl2ZSB7XHJcbmZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG5gKTtcclxuXHJcbiAgY29uc3QgbGlua0V4dGVuc2lvbiA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzAwMFwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjI1KVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKS5maWx0ZXIoKGQpID0+ICFkLnRhcmdldC5jaGlsZHJlbikpXHJcbiAgICAuam9pbihcInBhdGhcIilcclxuICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGQudGFyZ2V0LmxpbmtFeHRlbnNpb25Ob2RlID0gdGhpcztcclxuICAgIH0pXHJcbiAgICAuYXR0cihcImRcIiwgbGlua0V4dGVuc2lvbkNvbnN0YW50KTtcclxuXHJcbiAgY29uc3QgbGluayA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzAwMFwiKVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKSlcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgZC50YXJnZXQubGlua05vZGUgPSB0aGlzO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiZFwiLCBsaW5rQ29uc3RhbnQpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCAoZCkgPT4gZC50YXJnZXQuY29sb3IpO1xyXG5cclxuICBjb25zdCBsYWJlbCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5zZWxlY3RBbGwoXCJ0ZXh0XCIpXHJcbiAgICAuZGF0YShyb290LmxlYXZlcygpKVxyXG4gICAgLmpvaW4oXCJ0ZXh0XCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiLjMxZW1cIilcclxuICAgIC5hdHRyKFxyXG4gICAgICBcInRyYW5zZm9ybVwiLFxyXG4gICAgICAoZCkgPT5cclxuICAgICAgICBgcm90YXRlKCR7ZC54IC0gOTB9KSB0cmFuc2xhdGUoJHtpbm5lclJhZGl1cyArIDR9LDApJHtkLnggPCAxODAgPyBcIlwiIDogXCIgcm90YXRlKDE4MClcIlxyXG4gICAgICAgIH1gXHJcbiAgICApXHJcbiAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIChkKSA9PiAoZC54IDwgMTgwID8gXCJzdGFydFwiIDogXCJlbmRcIikpXHJcbiAgICAudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAgIC5vbihcIm1vdXNlb3ZlclwiLCBtb3VzZW92ZXJlZCh0cnVlKSlcclxuICAgIC5vbihcIm1vdXNlb3V0XCIsIG1vdXNlb3ZlcmVkKGZhbHNlKSk7XHJcblxyXG4gIC8vICAgZnVuY3Rpb24gdXBkYXRlKGNoZWNrZWQpIHtcclxuICAvLyAgICAgY29uc3QgdCA9IGQzLnRyYW5zaXRpb24oKS5kdXJhdGlvbig3NTApO1xyXG4gIC8vICAgICBsaW5rRXh0ZW5zaW9uXHJcbiAgLy8gICAgICAgLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAuYXR0cihcImRcIiwgY2hlY2tlZCA/IGxpbmtFeHRlbnNpb25WYXJpYWJsZSA6IGxpbmtFeHRlbnNpb25Db25zdGFudCk7XHJcbiAgLy8gICAgIGxpbmsudHJhbnNpdGlvbih0KS5hdHRyKFwiZFwiLCBjaGVja2VkID8gbGlua1ZhcmlhYmxlIDogbGlua0NvbnN0YW50KTtcclxuICAvLyAgIH1cclxuXHJcbiAgZnVuY3Rpb24gbW91c2VvdmVyZWQoYWN0aXZlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBkKSB7XHJcbiAgICAgIGQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKFwibGFiZWwtLWFjdGl2ZVwiLCBhY3RpdmUpO1xyXG4gICAgICBkMy5zZWxlY3QoZC5saW5rRXh0ZW5zaW9uTm9kZSlcclxuICAgICAgICAuY2xhc3NlZChcImxpbmstZXh0ZW5zaW9uLS1hY3RpdmVcIiwgYWN0aXZlKVxyXG4gICAgICAgIC5yYWlzZSgpO1xyXG4gICAgICBkbyBkMy5zZWxlY3QoZC5saW5rTm9kZSkuY2xhc3NlZChcImxpbmstLWFjdGl2ZVwiLCBhY3RpdmUpLnJhaXNlKCk7XHJcbiAgICAgIHdoaWxlICgoZCA9IGQucGFyZW50KSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIGxpbmtFeHRlbnNpb24uYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgbGluay5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgICBsYWJlbC5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN1bmJ1cnN0ID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICB2YXIgcmFkaXVzID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyOyAvLyA8IC0tIDJcclxuICB2YXIgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XHJcblxyXG4gIHZhciBnID0gZDNcclxuICAgIC5zZWxlY3QoXCJzdmdcIikgLy8gPC0tIDFcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpIC8vIDwtLSAyXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXBwZW5kKFwiZ1wiKSAvLyA8LS0gM1xyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCAvIDIgKyBcIilcIik7IC8vIDwtLSA0XHJcblxyXG4gIHZhciBnID0gZDNcclxuICAgIC5zZWxlY3QoXCJzdmdcIikgLy8gcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgPHN2Zz4gZWxlbWVudFxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCkgLy8gc2V0cyB0aGUgd2lkdGggb2YgPHN2Zz4gYW5kIHRoZW4gcmV0dXJucyB0aGUgPHN2Zz4gZWxlbWVudCBhZ2FpblxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KSAvLyAoc2FtZSBhcyB3aWR0aClcclxuICAgIC5hcHBlbmQoXCJnXCIpIC8vIGFkZHMgYSA8Zz4gZWxlbWVudCB0byB0aGUgPHN2Zz4gZWxlbWVudC4gSXQgcmV0dXJucyB0aGUgPGc+IGVsZW1lbnRcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgLyAyICsgXCIpXCIpOyAvLyB0YWtlcyB0aGUgPGc+IGVsZW1lbnQgYW5kIG1vdmVzIHRoZSBbMCwwXSBjZW50ZXIgb3ZlciBhbmQgZG93blxyXG5cclxuICB2YXIgZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwic3ZnXCIpIC8vIC0tPiA8c3ZnPjwvc3ZnPlxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCkgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIj48L3N2Zz5cclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodCkgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCI1MDBcIj48L3N2Zz5cclxuICAgIC5hcHBlbmQoXCJnXCIpIC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiNTAwXCI+PGc+PC9nPjwvc3ZnPlxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCAvIDIgKyBcIilcIik7IC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiNTAwXCI+PGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDI1MCwyNTApXCI+PC9nPjwvc3ZnPlxyXG5cclxuICB2YXIgcGFydGl0aW9uID0gZDNcclxuICAgIC5wYXJ0aXRpb24oKSAvLyA8LS0gMVxyXG4gICAgLnNpemUoWzIgKiBNYXRoLlBJLCByYWRpdXNdKTsgLy8gPC0tIDJcclxuXHJcbiAgdmFyIHJvb3QgPSBkM1xyXG4gICAgLmhpZXJhcmNoeShoaWVyYXJjaHkpIC8vIDwtLSAxXHJcbiAgICAuc3VtKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLmhlaWdodDtcclxuICAgIH0pOyAvLyA8LS0gMlxyXG5cclxuICBwYXJ0aXRpb24ocm9vdCk7IC8vIDwtLSAxXHJcbiAgdmFyIGFyYyA9IGQzXHJcbiAgICAuYXJjKCkgLy8gPC0tIDJcclxuICAgIC5zdGFydEFuZ2xlKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLngwO1xyXG4gICAgfSlcclxuICAgIC5lbmRBbmdsZShmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC54MTtcclxuICAgIH0pXHJcbiAgICAuaW5uZXJSYWRpdXMoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueTA7XHJcbiAgICB9KVxyXG4gICAgLm91dGVyUmFkaXVzKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLnkxO1xyXG4gICAgfSk7XHJcblxyXG4gIGcuc2VsZWN0QWxsKFwicGF0aFwiKSAvLyA8LS0gMVxyXG4gICAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKSAvLyA8LS0gMlxyXG4gICAgLmVudGVyKCkgLy8gPC0tIDNcclxuICAgIC5hcHBlbmQoXCJwYXRoXCIpIC8vIDwtLSA0XHJcbiAgICAuYXR0cihcImRpc3BsYXlcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQuZGVwdGggPyBudWxsIDogXCJub25lXCI7XHJcbiAgICB9KSAvLyA8LS0gNVxyXG4gICAgLmF0dHIoXCJkXCIsIGFyYykgLy8gPC0tIDZcclxuICAgIC5zdHlsZShcInN0cm9rZVwiLCBcIiNmZmZcIikgLy8gPC0tIDdcclxuICAgIC5zdHlsZShcImZpbGxcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGNvbG9yKChkLmNoaWxkcmVuID8gZCA6IGQucGFyZW50KS5kYXRhLm5hbWUpO1xyXG4gICAgfSk7IC8vIDwtLSA4XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHRpZHlUcmVlID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgLy8gY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IGJmc0Fkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICAvLyBjb25zb2xlLmxvZyh7IGFkakxpc3QgfSk7XHJcblxyXG4gIC8vIGNvbnN0IG5vRG91YmxlcyA9IFsuLi5hZGpMaXN0XTtcclxuICAvLyBub0RvdWJsZXMuZm9yRWFjaCgoYSwgaSwgbGlzdCkgPT4ge1xyXG4gIC8vICAgaWYgKGxpc3Quc29tZSgoYiwgaikgPT4gaSAhPT0gaiAmJiBhLnBhcmVudElkID09PSBiLnBhcmVudElkKSkge1xyXG4gIC8vICAgICBub0RvdWJsZXMuc3BsaWNlKGksIDEpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH0pO1xyXG4gIC8vIGNvbnNvbGUubG9nKHsgbm9Eb3VibGVzIH0pO1xyXG5cclxuICBjb25zdCB0cmVlID0gKGRhdGEpID0+IHtcclxuICAgIGNvbnN0IHJvb3QgPSBkMy5oaWVyYXJjaHkoZGF0YSk7XHJcbiAgICByb290LmR4ID0gMTA7XHJcbiAgICByb290LmR5ID0gd2lkdGggLyAocm9vdC5oZWlnaHQgKyAxKTtcclxuICAgIHJldHVybiBkMy50cmVlKCkubm9kZVNpemUoW3Jvb3QuZHgsIHJvb3QuZHldKShyb290KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IHJvb3QgPSB0cmVlKGhpZXJhcmNoeSk7XHJcbiAgY29uc29sZS5sb2cocm9vdCk7XHJcblxyXG4gIGxldCB4MCA9IEluZmluaXR5O1xyXG4gIGxldCB4MSA9IC14MDtcclxuICByb290LmVhY2goKGQpID0+IHtcclxuICAgIGlmIChkLnggPiB4MSkgeDEgPSBkLng7XHJcbiAgICBpZiAoZC54IDwgeDApIHgwID0gZC54O1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IGcgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIFwic2Fucy1zZXJpZlwiKVxyXG4gICAgLmF0dHIoXCJmb250LXNpemVcIiwgMTApXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cm9vdC5keSAvIDN9LCR7cm9vdC5keCAtIHgwfSlgKTtcclxuXHJcbiAgY29uc3QgbGluayA9IGdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiM1NTVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC40KVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMS41KVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKSlcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLmF0dHIoXHJcbiAgICAgIFwiZFwiLFxyXG4gICAgICBkM1xyXG4gICAgICAgIC5saW5rSG9yaXpvbnRhbCgpXHJcbiAgICAgICAgLngoKGQpID0+IGQueSlcclxuICAgICAgICAueSgoZCkgPT4gZC54KVxyXG4gICAgKTtcclxuXHJcbiAgY29uc3Qgbm9kZSA9IGdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1saW5lam9pblwiLCBcInJvdW5kXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAxMClcclxuICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAuZGF0YShyb290LmRlc2NlbmRhbnRzKCkpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC55fSwke2QueH0pYCk7XHJcblxyXG4gIG5vZGVcclxuICAgIC5hcHBlbmQoXCJjaXJjbGVcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcIiM1NTVcIiA6IFwiIzk5OVwiKSlcclxuICAgIC5hdHRyKFwiclwiLCAxMCk7XHJcblxyXG4gIG5vZGUuYXR0cihcImFyaWEtbGFiZWxcIiwgKGQpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKGQpO1xyXG4gICAgcmV0dXJuIGQuZGF0YS5kYXRhLm5hbWU7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG4gIG5vZGUub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5kYXRhLmRhdGEubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIG5vZGVcclxuICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiMC4zMWVtXCIpXHJcbiAgICAuYXR0cihcInhcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gLTYgOiA2KSlcclxuICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gXCJlbmRcIiA6IFwic3RhcnRcIikpXHJcbiAgICAudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAgIC5jbG9uZSh0cnVlKVxyXG4gICAgLmxvd2VyKClcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwid2hpdGVcIik7XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBzdmcuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHR5cGUgeyBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0IH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCB0cmVlTWFwID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCByb290ID0gZDNcclxuICAgIC50cmVlbWFwKClcclxuICAgIC50aWxlKGQzLnRyZWVtYXBCaW5hcnkpXHJcbiAgICAuc2l6ZShbd2lkdGgsIGhlaWdodF0pXHJcbiAgICAucGFkZGluZygxKVxyXG4gICAgLnJvdW5kKHRydWUpKFxyXG4gICAgICBoaWVyYXJjaHkuc3VtKChkKSA9PiBkLmhlaWdodCkuc29ydCgoYSwgYikgPT4gYi5oZWlnaHQgLSBhLmhlaWdodClcclxuICAgICk7XHJcblxyXG4gIC8vICAgY29uc3Qgcm9vdCA9IHRyZWVtYXAoZGF0YSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLnN0eWxlKFwiZm9udFwiLCBcIjEwcHggc2Fucy1zZXJpZlwiKTtcclxuXHJcbiAgY29uc3QgbGVhZiA9IHN2Z1xyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKHJvb3QubGVhdmVzKCkpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54MH0sJHtkLnkwfSlgKTtcclxuXHJcbiAgbGVhZi5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZCkgPT4gZC5kYXRhLm5hbWUpO1xyXG5cclxuICAvLyAgIGxlYWYuYXBwZW5kKFwidGl0bGVcIikudGV4dChcclxuICAvLyAgICAgKGQpID0+XHJcbiAgLy8gICAgICAgYCR7ZFxyXG4gIC8vICAgICAgICAgLmFuY2VzdG9ycygpXHJcbiAgLy8gICAgICAgICAucmV2ZXJzZSgpXHJcbiAgLy8gICAgICAgICAubWFwKChkKSA9PiBkLmRhdGEuaWQpXHJcbiAgLy8gICAgICAgICAuam9pbihcIi9cIil9XFxuJHtmb3JtYXQoZC5oZWlnaHQpfWBcclxuICAvLyAgICk7XHJcblxyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApO1xyXG5cclxuICBsZWFmXHJcbiAgICAuYXBwZW5kKFwicmVjdFwiKVxyXG4gICAgLy8gLmF0dHIoXCJpZFwiLCAoZCkgPT4gKGQubGVhZlVpZCA9IERPTS51aWQoXCJsZWFmXCIpKS5pZClcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICB3aGlsZSAoZC5kZXB0aCA+IDEpIGQgPSBkLnBhcmVudDtcclxuICAgICAgcmV0dXJuIGNvbG9yKGQuZGF0YS5pZCk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCAoZCkgPT4gZC54MSAtIGQueDApXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCAoZCkgPT4gZC55MSAtIGQueTApO1xyXG5cclxuICBsZWFmXHJcbiAgICAuYXBwZW5kKFwiY2xpcFBhdGhcIilcclxuICAgIC8vIC5hdHRyKFwiaWRcIiwgKGQpID0+IChkLmNsaXBVaWQgPSBET00udWlkKFwiY2xpcFwiKSkuaWQpXHJcbiAgICAuYXBwZW5kKFwidXNlXCIpO1xyXG4gIC8vIC5hdHRyKFwieGxpbms6aHJlZlwiLCAoZCkgPT4gZC5sZWFmVWlkLmhyZWYpO1xyXG5cclxuICAvLyAgIGxlYWZcclxuICAvLyAgICAgLmFwcGVuZChcInRleHRcIilcclxuICAvLyAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgKGQpID0+IGQuY2xpcFVpZClcclxuICAvLyAgICAgLnNlbGVjdEFsbChcInRzcGFuXCIpXHJcbiAgLy8gICAgIC5kYXRhKChkKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gIC8vICAgICAgIHJldHVybiBkLmRhdGEubmFtZS5zcGxpdCgvKD89W0EtWl1bXkEtWl0pL2cpLmNvbmNhdChmb3JtYXQoZC5oZWlnaHQpKTtcclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgLmpvaW4oXCJ0c3BhblwiKVxyXG4gIC8vICAgICAuYXR0cihcInhcIiwgMylcclxuICAvLyAgICAgLmF0dHIoXHJcbiAgLy8gICAgICAgXCJ5XCIsXHJcbiAgLy8gICAgICAgKGQsIGksIG5vZGVzKSA9PiBgJHsoaSA9PT0gbm9kZXMubGVuZ3RoIC0gMSkgKiAwLjMgKyAxLjEgKyBpICogMC45fWVtYFxyXG4gIC8vICAgICApXHJcbiAgLy8gICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkLCBpLCBub2RlcykgPT5cclxuICAvLyAgICAgICBpID09PSBub2Rlcy5sZW5ndGggLSAxID8gMC43IDogbnVsbFxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgLy8gLnRleHQoKGQpID0+IGQpO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBsZWFmLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQuZGF0YS5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIHN2Zy5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDaEQsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUMxRSxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDMUUsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDbkMsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFFUixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEs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QzVCO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixX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LEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBLEVBQ1YsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsc0JBQXNCO0FBQUEsRUFDdEIsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsZUFBZTtBQUFBLEVBQ2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1Isa0JBQWtCO0FBQUEsRUFDbEIsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIs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 diff --git a/notes/.obsidian/plugins/breadcrumbs/manifest.json b/notes/.obsidian/plugins/breadcrumbs/manifest.json new file mode 100644 index 0000000..f4c46c6 --- /dev/null +++ b/notes/.obsidian/plugins/breadcrumbs/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "breadcrumbs", + "name": "Breadcrumbs", + "version": "3.6.2", + "minAppVersion": "0.15.2", + "description": "Visualise & navigate your vault's structure", + "author": "SkepticMystic", + "authorUrl": "https://github.com/SkepticMystic/breadcrumbs", + "isDesktopOnly": false +} diff --git a/notes/.obsidian/plugins/breadcrumbs/styles.css b/notes/.obsidian/plugins/breadcrumbs/styles.css new file mode 100644 index 0000000..51a6a96 --- /dev/null +++ b/notes/.obsidian/plugins/breadcrumbs/styles.css @@ -0,0 +1,113 @@ +.BC-trail { + border: 1px solid var(--background-modifier-border); + border-radius: 5px; + padding: 5px; + margin-bottom: 5px !important; +} + +/* completely hides the trail when "no path found message" is left empty and no path is found */ +.BC-trail:empty { + display: none; +} + +.BC-matrix-square li { + text-align: left; +} + +/* ensure empty headers not leaving an element */ +.BC-Matrix .BC-Matrix-square .BC-Matrix-header:empty { + display: none; +} + +.internal-link.BC-Link { + color: var(--text-accent); +} + +.internal-link.BC-Link:hover { + color: var(--text-accent-hover, var(--text-accent)); +} + +.vis-view-options > * { + padding: 5px; +} + +/* Source: https://svelte.dev/repl/3153faf7584d40bd8ddebecf39f24ac1?version=3.41.0 */ +[data-tooltip] { + position: relative; + /* z-index: 2; */ + /* display: block; */ +} + +[data-tooltip]:before, +[data-tooltip]:after { + visibility: hidden; + opacity: 0; + pointer-events: none; + transition: 0.2s ease-out; + transform: translate(-50%, 5px); +} + +[data-tooltip]:before { + position: absolute; + top: 80%; + /* bottom: 100%; */ + left: 50%; + margin-bottom: 5px; + padding: 7px; + width: fit-content; + height: fit-content; + min-width: 200px; + min-height: 200px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: var(--background-primary); + color: var(--text-normal); + content: attr(data-tooltip); + text-align: center; + font-size: var(--font-medium); + line-height: 1.2; + transition: 0.2s ease-out; + white-space: pre-line; + z-index: 100; +} + +/* [data-tooltip]:after { + position: absolute; + top: 80%; + left: 50%; + width: 0; + border-top: 5px solid #000; + border-top: 5px solid hsla(0, 0%, 20%, 0.9); + border-right: 5px solid transparent; + border-left: 5px solid transparent; + background-color: red; + content: " "; + font-size: 0; + line-height: 0; +} */ + +[data-tooltip]:hover:before, +[data-tooltip]:hover:after { + visibility: visible; + opacity: 1; + transform: translate(-50%, 0); +} +[data-tooltip="false"]:hover:before, +[data-tooltip="false"]:hover:after { + visibility: hidden; + opacity: 0; +} + +.thread-dir-templates .setting-item-control { + display: flex; + flex-direction: column; +} + +.juggl-hide { + display: none; +} + +[data-type="BC-matrix"] div.view-content { + overflow: hidden !important; +} diff --git a/notes/.obsidian/plugins/highlightr-plugin/main.js b/notes/.obsidian/plugins/highlightr-plugin/main.js new file mode 100644 index 0000000..3ecf5e1 --- /dev/null +++ b/notes/.obsidian/plugins/highlightr-plugin/main.js @@ -0,0 +1,3635 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +if you want to view the source visit the plugins github repository +*/ + +'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. +***************************************************************************** */ + +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 wait(delay) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => setTimeout(resolve, delay)); + }); +} + +const icons = { + "highlightr-eraser": ``, + "highlightr-pen": ``, + "highlightr-add": ``, + "highlightr-save": ``, + "highlightr-delete": ``, + "highlightr-copy": `copy`, +}; +function createHighlighterIcons(settings, plugin) { + const highlighterIcons = {}; + for (const key of plugin.settings.highlighterOrder) { + let highlighterpen = `highlightr-pen-${key}`.toLowerCase(); + highlighterIcons[highlighterpen] = ``; + } + Object.keys(highlighterIcons).forEach((key) => { + obsidian.addIcon(key, highlighterIcons[key]); + }); + return highlighterIcons; +} +function addIcons() { + Object.keys(icons).forEach((key) => { + obsidian.addIcon(key, icons[key]); + }); +} + +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +function createCommonjsModule(fn) { + var module = { exports: {} }; + return fn(module, module.exports), module.exports; +} + +/*! Pickr 1.8.2 MIT | https://github.com/Simonwep/pickr */ + +var pickr_min = createCommonjsModule(function (module, exports) { +!function(t,e){module.exports=e();}(self,(function(){return (()=>{var t={d:(e,o)=>{for(var n in o)t.o(o,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:o[n]});},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0});}},e={};t.d(e,{default:()=>L});var o={};function n(t,e,o,n,i={}){e instanceof HTMLCollection||e instanceof NodeList?e=Array.from(e):Array.isArray(e)||(e=[e]),Array.isArray(o)||(o=[o]);for(const s of e)for(const e of o)s[t](e,n,{capture:!1,...i});return Array.prototype.slice.call(arguments,1)}t.r(o),t.d(o,{adjustableInputNumbers:()=>p,createElementFromString:()=>r,createFromTemplate:()=>a,eventPath:()=>l,off:()=>s,on:()=>i,resolveElement:()=>c});const i=n.bind(null,"addEventListener"),s=n.bind(null,"removeEventListener");function r(t){const e=document.createElement("div");return e.innerHTML=t.trim(),e.firstElementChild}function a(t){const e=(t,e)=>{const o=t.getAttribute(e);return t.removeAttribute(e),o},o=(t,n={})=>{const i=e(t,":obj"),s=e(t,":ref"),r=i?n[i]={}:n;s&&(n[s]=t);for(const n of Array.from(t.children)){const t=e(n,":arr"),i=o(n,t?{}:r);t&&(r[t]||(r[t]=[])).push(Object.keys(i).length?i:n);}return n};return o(r(t))}function l(t){let e=t.path||t.composedPath&&t.composedPath();if(e)return e;let o=t.target.parentElement;for(e=[t.target,o];o=o.parentElement;)e.push(o);return e.push(document,window),e}function c(t){return t instanceof Element?t:"string"==typeof t?t.split(/>>/g).reduce(((t,e,o,n)=>(t=t.querySelector(e),ot)){function o(o){const n=[.001,.01,.1][Number(o.shiftKey||2*o.ctrlKey)]*(o.deltaY<0?1:-1);let i=0,s=t.selectionStart;t.value=t.value.replace(/[\d.]+/g,((t,o)=>o<=s&&o+t.length>=s?(s=o,e(Number(t),n,i)):(i++,t))),t.focus(),t.setSelectionRange(s,s),o.preventDefault(),t.dispatchEvent(new Event("input"));}i(t,"focus",(()=>i(window,"wheel",o,{passive:!1}))),i(t,"blur",(()=>s(window,"wheel",o)));}const{min:u,max:h,floor:d,round:m}=Math;function f(t,e,o){e/=100,o/=100;const n=d(t=t/360*6),i=t-n,s=o*(1-e),r=o*(1-i*e),a=o*(1-(1-i)*e),l=n%6;return [255*[o,r,s,s,a,o][l],255*[a,o,o,r,s,s][l],255*[s,s,a,o,o,r][l]]}function v(t,e,o){const n=(2-(e/=100))*(o/=100)/2;return 0!==n&&(e=1===n?0:n<.5?e*o/(2*n):e*o/(2-2*n)),[t,100*e,100*n]}function b(t,e,o){const n=u(t/=255,e/=255,o/=255),i=h(t,e,o),s=i-n;let r,a;if(0===s)r=a=0;else {a=s/i;const n=((i-t)/6+s/2)/s,l=((i-e)/6+s/2)/s,c=((i-o)/6+s/2)/s;t===i?r=c-l:e===i?r=1/3+n-c:o===i&&(r=2/3+l-n),r<0?r+=1:r>1&&(r-=1);}return [360*r,100*a,100*i]}function y(t,e,o,n){e/=100,o/=100;return [...b(255*(1-u(1,(t/=100)*(1-(n/=100))+n)),255*(1-u(1,e*(1-n)+n)),255*(1-u(1,o*(1-n)+n)))]}function g(t,e,o){e/=100;const n=2*(e*=(o/=100)<.5?o:1-o)/(o+e)*100,i=100*(o+e);return [t,isNaN(n)?0:n,i]}function _(t){return b(...t.match(/.{2}/g).map((t=>parseInt(t,16))))}function w(t){t=t.match(/^[a-zA-Z]+$/)?function(t){if("black"===t.toLowerCase())return "#000";const e=document.createElement("canvas").getContext("2d");return e.fillStyle=t,"#000"===e.fillStyle?null:e.fillStyle}(t):t;const e={cmyk:/^cmyk[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)/i,rgba:/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsla:/^((hsla)|hsl)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsva:/^((hsva)|hsv)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hexa:/^#?(([\dA-Fa-f]{3,4})|([\dA-Fa-f]{6})|([\dA-Fa-f]{8}))$/i},o=t=>t.map((t=>/^(|\d+)\.\d+|\d+$/.test(t)?Number(t):void 0));let n;t:for(const i in e){if(!(n=e[i].exec(t)))continue;const s=t=>!!n[2]==("number"==typeof t);switch(i){case"cmyk":{const[,t,e,s,r]=o(n);if(t>100||e>100||s>100||r>100)break t;return {values:y(t,e,s,r),type:i}}case"rgba":{const[,,,t,e,r,a]=o(n);if(t>255||e>255||r>255||a<0||a>1||!s(a))break t;return {values:[...b(t,e,r),a],a,type:i}}case"hexa":{let[,t]=n;4!==t.length&&3!==t.length||(t=t.split("").map((t=>t+t)).join(""));const e=t.substring(0,6);let o=t.substring(6);return o=o?parseInt(o,16)/255:void 0,{values:[..._(e),o],a:o,type:i}}case"hsla":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[...g(t,e,r),a],a,type:i}}case"hsva":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[t,e,r,a],a,type:i}}}}return {values:null,type:null}}function A(t=0,e=0,o=0,n=1){const i=(t,e)=>(o=-1)=>e(~o?t.map((t=>Number(t.toFixed(o)))):t),s={h:t,s:e,v:o,a:n,toHSVA(){const t=[s.h,s.s,s.v,s.a];return t.toString=i(t,(t=>`hsva(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toHSLA(){const t=[...v(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`hsla(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toRGBA(){const t=[...f(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`rgba(${t[0]}, ${t[1]}, ${t[2]}, ${s.a})`)),t},toCMYK(){const t=function(t,e,o){const n=f(t,e,o),i=n[0]/255,s=n[1]/255,r=n[2]/255,a=u(1-i,1-s,1-r);return [100*(1===a?0:(1-i-a)/(1-a)),100*(1===a?0:(1-s-a)/(1-a)),100*(1===a?0:(1-r-a)/(1-a)),100*a]}(s.h,s.s,s.v);return t.toString=i(t,(t=>`cmyk(${t[0]}%, ${t[1]}%, ${t[2]}%, ${t[3]}%)`)),t},toHEXA(){const t=function(t,e,o){return f(t,e,o).map((t=>m(t).toString(16).padStart(2,"0")))}(s.h,s.s,s.v),e=s.a>=1?"":Number((255*s.a).toFixed(0)).toString(16).toUpperCase().padStart(2,"0");return e&&t.push(e),t.toString=()=>`#${t.join("").toUpperCase()}`,t},clone:()=>A(s.h,s.s,s.v,s.a)};return s}const C=t=>Math.max(Math.min(t,1),0);function $(t){const e={options:Object.assign({lock:null,onchange:()=>0,onstop:()=>0},t),_keyboard(t){const{options:o}=e,{type:n,key:i}=t;if(document.activeElement===o.wrapper){const{lock:o}=e.options,s="ArrowUp"===i,r="ArrowRight"===i,a="ArrowDown"===i,l="ArrowLeft"===i;if("keydown"===n&&(s||r||a||l)){let n=0,i=0;"v"===o?n=s||r?1:-1:"h"===o?n=s||r?-1:1:(i=s?-1:a?1:0,n=l?-1:r?1:0),e.update(C(e.cache.x+.01*n),C(e.cache.y+.01*i)),t.preventDefault();}else i.startsWith("Arrow")&&(e.options.onstop(),t.preventDefault());}},_tapstart(t){i(document,["mouseup","touchend","touchcancel"],e._tapstop),i(document,["mousemove","touchmove"],e._tapmove),t.cancelable&&t.preventDefault(),e._tapmove(t);},_tapmove(t){const{options:o,cache:n}=e,{lock:i,element:s,wrapper:r}=o,a=r.getBoundingClientRect();let l=0,c=0;if(t){const e=t&&t.touches&&t.touches[0];l=t?(e||t).clientX:0,c=t?(e||t).clientY:0,la.left+a.width&&(l=a.left+a.width),ca.top+a.height&&(c=a.top+a.height),l-=a.left,c-=a.top;}else n&&(l=n.x*a.width,c=n.y*a.height);"h"!==i&&(s.style.left=`calc(${l/a.width*100}% - ${s.offsetWidth/2}px)`),"v"!==i&&(s.style.top=`calc(${c/a.height*100}% - ${s.offsetHeight/2}px)`),e.cache={x:l/a.width,y:c/a.height};const p=C(l/a.width),u=C(c/a.height);switch(i){case"v":return o.onchange(p);case"h":return o.onchange(u);default:return o.onchange(p,u)}},_tapstop(){e.options.onstop(),s(document,["mouseup","touchend","touchcancel"],e._tapstop),s(document,["mousemove","touchmove"],e._tapmove);},trigger(){e._tapmove();},update(t=0,o=0){const{left:n,top:i,width:s,height:r}=e.options.wrapper.getBoundingClientRect();"h"===e.options.lock&&(o=t),e._tapmove({clientX:n+s*t,clientY:i+r*o});},destroy(){const{options:t,_tapstart:o,_keyboard:n}=e;s(document,["keydown","keyup"],n),s([t.wrapper,t.element],"mousedown",o),s([t.wrapper,t.element],"touchstart",o,{passive:!1});}},{options:o,_tapstart:n,_keyboard:r}=e;return i([o.wrapper,o.element],"mousedown",n),i([o.wrapper,o.element],"touchstart",n,{passive:!1}),i(document,["keydown","keyup"],r),e}function k(t={}){t=Object.assign({onchange:()=>0,className:"",elements:[]},t);const e=i(t.elements,"click",(e=>{t.elements.forEach((o=>o.classList[e.target===o?"add":"remove"](t.className))),t.onchange(e),e.stopPropagation();}));return {destroy:()=>s(...e)}}const S={variantFlipOrder:{start:"sme",middle:"mse",end:"ems"},positionFlipOrder:{top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"},position:"bottom",margin:8},O=(t,e,o)=>{const{container:n,margin:i,position:s,variantFlipOrder:r,positionFlipOrder:a}={container:document.documentElement.getBoundingClientRect(),...S,...o},{left:l,top:c}=e.style;e.style.left="0",e.style.top="0";const p=t.getBoundingClientRect(),u=e.getBoundingClientRect(),h={t:p.top-u.height-i,b:p.bottom+i,r:p.right+i,l:p.left-u.width-i},d={vs:p.left,vm:p.left+p.width/2+-u.width/2,ve:p.left+p.width-u.width,hs:p.top,hm:p.bottom-p.height/2-u.height/2,he:p.bottom-u.height},[m,f="middle"]=s.split("-"),v=a[m],b=r[f],{top:y,left:g,bottom:_,right:w}=n;for(const t of v){const o="t"===t||"b"===t,n=h[t],[i,s]=o?["top","left"]:["left","top"],[r,a]=o?[u.height,u.width]:[u.width,u.height],[l,c]=o?[_,w]:[w,_],[p,m]=o?[y,g]:[g,y];if(!(nl))for(const r of b){const l=d[(o?"v":"h")+r];if(!(lc))return e.style[s]=l-u[s]+"px",e.style[i]=n-u[i]+"px",t+r}}return e.style.left=l,e.style.top=c,null};function E(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}class L{constructor(t){E(this,"_initializingActive",!0),E(this,"_recalc",!0),E(this,"_nanopop",null),E(this,"_root",null),E(this,"_color",A()),E(this,"_lastColor",A()),E(this,"_swatchColors",[]),E(this,"_setupAnimationFrame",null),E(this,"_eventListener",{init:[],save:[],hide:[],show:[],clear:[],change:[],changestop:[],cancel:[],swatchselect:[]}),this.options=t=Object.assign({...L.DEFAULT_OPTIONS},t);const{swatches:e,components:o,theme:n,sliders:i,lockOpacity:s,padding:r}=t;["nano","monolith"].includes(n)&&!i&&(t.sliders="h"),o.interaction||(o.interaction={});const{preview:a,opacity:l,hue:c,palette:p}=o;o.opacity=!s&&l,o.palette=p||a||l||c,this._preBuild(),this._buildComponents(),this._bindEvents(),this._finalBuild(),e&&e.length&&e.forEach((t=>this.addSwatch(t)));const{button:u,app:h}=this._root;this._nanopop=((t,e,o)=>{const n="object"!=typeof t||t instanceof HTMLElement?{reference:t,popper:e,...o}:t;return {update(t=n){const{reference:e,popper:o}=Object.assign(n,t);if(!o||!e)throw new Error("Popper- or reference-element missing.");return O(e,o,n)}}})(u,h,{margin:r}),u.setAttribute("role","button"),u.setAttribute("aria-label",this._t("btn:toggle"));const d=this;this._setupAnimationFrame=requestAnimationFrame((function e(){if(!h.offsetWidth)return requestAnimationFrame(e);d.setColor(t.default),d._rePositioningPicker(),t.defaultRepresentation&&(d._representation=t.defaultRepresentation,d.setColorRepresentation(d._representation)),t.showAlways&&d.show(),d._initializingActive=!1,d._emit("init");}));}_preBuild(){const{options:t}=this;for(const e of ["el","container"])t[e]=c(t[e]);this._root=(t=>{const{components:e,useAsButton:o,inline:n,appClass:i,theme:s,lockOpacity:r}=t.options,l=t=>t?"":'style="display:none" hidden',c=e=>t._t(e),p=a(`\n
\n\n ${o?"":''}\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n\n
\n\n
\n \n\n \n \n \n \n \n\n \n \n \n
\n
\n
\n `),u=p.interaction;return u.options.find((t=>!t.hidden&&!t.classList.add("active"))),u.type=()=>u.options.find((t=>t.classList.contains("active"))),p})(this),t.useAsButton&&(this._root.button=t.el),t.container.appendChild(this._root.root);}_finalBuild(){const t=this.options,e=this._root;if(t.container.removeChild(e.root),t.inline){const o=t.el.parentElement;t.el.nextSibling?o.insertBefore(e.app,t.el.nextSibling):o.appendChild(e.app);}else t.container.appendChild(e.app);t.useAsButton?t.inline&&t.el.remove():t.el.parentNode.replaceChild(e.root,t.el),t.disabled&&this.disable(),t.comparison||(e.button.style.transition="none",t.useAsButton||(e.preview.lastColor.style.transition="none")),this.hide();}_buildComponents(){const t=this,e=this.options.components,o=(t.options.sliders||"v").repeat(2),[n,i]=o.match(/^[vh]+$/g)?o:[],s=()=>this._color||(this._color=this._lastColor.clone()),r={palette:$({element:t._root.palette.picker,wrapper:t._root.palette.palette,onstop:()=>t._emit("changestop","slider",t),onchange(o,n){if(!e.palette)return;const i=s(),{_root:r,options:a}=t,{lastColor:l,currentColor:c}=r.preview;t._recalc&&(i.s=100*o,i.v=100-100*n,i.v<0&&(i.v=0),t._updateOutput("slider"));const p=i.toRGBA().toString(0);this.element.style.background=p,this.wrapper.style.background=`\n linear-gradient(to top, rgba(0, 0, 0, ${i.a}), transparent),\n linear-gradient(to left, hsla(${i.h}, 100%, 50%, ${i.a}), rgba(255, 255, 255, ${i.a}))\n `,a.comparison?a.useAsButton||t._lastColor||l.style.setProperty("--pcr-color",p):(r.button.style.setProperty("--pcr-color",p),r.button.classList.remove("clear"));const u=i.toHEXA().toString();for(const{el:e,color:o}of t._swatchColors)e.classList[u===o.toHEXA().toString()?"add":"remove"]("pcr-active");c.style.setProperty("--pcr-color",p);}}),hue:$({lock:"v"===i?"h":"v",element:t._root.hue.picker,wrapper:t._root.hue.slider,onstop:()=>t._emit("changestop","slider",t),onchange(o){if(!e.hue||!e.palette)return;const n=s();t._recalc&&(n.h=360*o),this.element.style.backgroundColor=`hsl(${n.h}, 100%, 50%)`,r.palette.trigger();}}),opacity:$({lock:"v"===n?"h":"v",element:t._root.opacity.picker,wrapper:t._root.opacity.slider,onstop:()=>t._emit("changestop","slider",t),onchange(o){if(!e.opacity||!e.palette)return;const n=s();t._recalc&&(n.a=Math.round(100*o)/100),this.element.style.background=`rgba(0, 0, 0, ${n.a})`,r.palette.trigger();}}),selectable:k({elements:t._root.interaction.options,className:"active",onchange(e){t._representation=e.target.getAttribute("data-type").toUpperCase(),t._recalc&&t._updateOutput("swatch");}})};this._components=r;}_bindEvents(){const{_root:t,options:e}=this,o=[i(t.interaction.clear,"click",(()=>this._clearColor())),i([t.interaction.cancel,t.preview.lastColor],"click",(()=>{this.setHSVA(...(this._lastColor||this._color).toHSVA(),!0),this._emit("cancel");})),i(t.interaction.save,"click",(()=>{!this.applyColor()&&!e.showAlways&&this.hide();})),i(t.interaction.result,["keyup","input"],(t=>{this.setColor(t.target.value,!0)&&!this._initializingActive&&(this._emit("change",this._color,"input",this),this._emit("changestop","input",this)),t.stopImmediatePropagation();})),i(t.interaction.result,["focus","blur"],(t=>{this._recalc="blur"===t.type,this._recalc&&this._updateOutput(null);})),i([t.palette.palette,t.palette.picker,t.hue.slider,t.hue.picker,t.opacity.slider,t.opacity.picker],["mousedown","touchstart"],(()=>this._recalc=!0),{passive:!0})];if(!e.showAlways){const n=e.closeWithKey;o.push(i(t.button,"click",(()=>this.isOpen()?this.hide():this.show())),i(document,"keyup",(t=>this.isOpen()&&(t.key===n||t.code===n)&&this.hide())),i(document,["touchstart","mousedown"],(e=>{this.isOpen()&&!l(e).some((e=>e===t.app||e===t.button))&&this.hide();}),{capture:!0}));}if(e.adjustableNumbers){const e={rgba:[255,255,255,1],hsva:[360,100,100,1],hsla:[360,100,100,1],cmyk:[100,100,100,100]};p(t.interaction.result,((t,o,n)=>{const i=e[this.getColorRepresentation().toLowerCase()];if(i){const e=i[n],s=t+(e>=100?1e3*o:o);return s<=0?0:Number((s{n.isOpen()&&(e.closeOnScroll&&n.hide(),null===t?(t=setTimeout((()=>t=null),100),requestAnimationFrame((function e(){n._rePositioningPicker(),null!==t&&requestAnimationFrame(e);}))):(clearTimeout(t),t=setTimeout((()=>t=null),100)));}),{capture:!0}));}this._eventBindings=o;}_rePositioningPicker(){const{options:t}=this;if(!t.inline){if(!this._nanopop.update({container:document.body.getBoundingClientRect(),position:t.position})){const t=this._root.app,e=t.getBoundingClientRect();t.style.top=(window.innerHeight-e.height)/2+"px",t.style.left=(window.innerWidth-e.width)/2+"px";}}}_updateOutput(t){const{_root:e,_color:o,options:n}=this;if(e.interaction.type()){const t=`to${e.interaction.type().getAttribute("data-type")}`;e.interaction.result.value="function"==typeof o[t]?o[t]().toString(n.outputPrecision):"";}!this._initializingActive&&this._recalc&&this._emit("change",o,t,this);}_clearColor(t=!1){const{_root:e,options:o}=this;o.useAsButton||e.button.style.setProperty("--pcr-color","rgba(0, 0, 0, 0.15)"),e.button.classList.add("clear"),o.showAlways||this.hide(),this._lastColor=null,this._initializingActive||t||(this._emit("save",null),this._emit("clear"));}_parseLocalColor(t){const{values:e,type:o,a:n}=w(t),{lockOpacity:i}=this.options,s=void 0!==n&&1!==n;return e&&3===e.length&&(e[3]=void 0),{values:!e||i&&s?null:e,type:o}}_t(t){return this.options.i18n[t]||L.I18N_DEFAULTS[t]}_emit(t,...e){this._eventListener[t].forEach((t=>t(...e,this)));}on(t,e){return this._eventListener[t].push(e),this}off(t,e){const o=this._eventListener[t]||[],n=o.indexOf(e);return ~n&&o.splice(n,1),this}addSwatch(t){const{values:e}=this._parseLocalColor(t);if(e){const{_swatchColors:t,_root:o}=this,n=A(...e),s=r(``); + + return names + .map(parse(buttons)) + .join(''); +} + +function showDialog(title, msg, value, buttons, options) { + const ok = fullstore(); + const cancel = fullstore(); + + const closeButtons = [ + 'cancel', + 'close', + 'ok', + ]; + + const promise = new Promise((resolve, reject) => { + const noCancel = options && options.cancel === false; + const empty = () => {}; + const rejectError = () => reject(Error()); + + ok(resolve); + cancel(noCancel ? empty : rejectError); + }); + + const innerHTML = getTemplate(title, msg, value, buttons); + + const dialog = createElement('div', { + innerHTML, + className: 'smalltalk', + style: `z-index: ${zIndex(zIndex() + 1)}`, + }); + + for (const el of find(dialog, ['ok', 'input'])) + el.focus(); + + for (const el of find(dialog, ['input'])) { + el.setSelectionRange(0, value.length); + } + + addListenerAll('click', dialog, closeButtons, (event) => { + closeDialog(event.target, dialog, ok(), cancel()); + }); + + for (const event of ['click', 'contextmenu']) + dialog.addEventListener(event, (e) => { + e.stopPropagation(); + for (const el of find(dialog, ['ok', 'input'])) + el.focus(); + }); + + dialog.addEventListener('keydown', keyDown(dialog, ok(), cancel())); + + return Object.assign(promise, { + dialog, + ok, + }); +} + +function keyDown_(dialog, ok, cancel, event) { + const KEY = { + ENTER : 13, + ESC : 27, + TAB : 9, + LEFT : 37, + UP : 38, + RIGHT : 39, + DOWN : 40, + }; + + const {keyCode} = event; + const el = event.target; + + const namesAll = ['ok', 'cancel', 'input']; + const names = find(dialog, namesAll) + .map(getDataName); + + switch(keyCode) { + case KEY.ENTER: + closeDialog(el, dialog, ok, cancel); + event.preventDefault(); + break; + + case KEY.ESC: + remove(dialog); + cancel(); + break; + + case KEY.TAB: + if (event.shiftKey) + tab(dialog, names); + + tab(dialog, names); + event.preventDefault(); + break; + + default: + ['left', 'right', 'up', 'down'].filter((name) => { + return keyCode === KEY[name.toUpperCase()]; + }).forEach(() => { + changeButtonFocus(dialog, names); + }); + + break; + } + + event.stopPropagation(); +} + +function getDataName(el) { + return el + .getAttribute('data-name') + .replace('js-', ''); +} + +const getName = (activeName) => { + if (activeName === 'cancel') + return 'ok'; + + return 'cancel'; +}; + +function changeButtonFocus(dialog, names) { + const active = document.activeElement; + const activeName = getDataName(active); + const isButton = /ok|cancel/.test(activeName); + const count = names.length - 1; + + if (activeName === 'input' || !count || !isButton) + return; + + const name = getName(activeName); + + for (const el of find(dialog, [name])) { + el.focus(); + } +} + +const getIndex = (count, index) => { + if (index === count) + return 0; + + return index + 1; +}; + +function tab(dialog, names) { + const active = document.activeElement; + const activeName = getDataName(active); + const count = names.length - 1; + + const activeIndex = names.indexOf(activeName); + const index = getIndex(count, activeIndex); + + const name = names[index]; + + for (const el of find(dialog, [name])) + el.focus(); +} + +function closeDialog(el, dialog, ok, cancel) { + const name = el + .getAttribute('data-name') + .replace('js-', ''); + + if (/close|cancel/.test(name)) { + cancel(); + remove(dialog); + return; + } + + const value = find(dialog, ['input']) + .reduce((value, el) => el.value, null); + + ok(value); + remove(dialog); +} + +const query = currify_1((element, name) => element.querySelector(`[data-name="js-${ name }"]`)); + +function find(element, names) { + const elements = names + .map(query(element)) + .filter(Boolean); + + return elements; +} + +function addListenerAll(event, parent, elements, fn) { + for (const el of find(parent, elements)) { + el.addEventListener(event, fn); + } +} + +function remove(dialog) { + const {parentElement} = dialog; + + if (parentElement) + parentElement.removeChild(dialog); +} + +class Progress { + + constructor(title, message) { + this.progress = progress(title, message); + this.progress.catch(e => { + this.aborted = true; + if (e && (e.constructor !== Error || e.message !== "")) console.error(e); + }); + this.dialog = this.progress.dialog; + this.aborted = false; + } + + async forEach(collection, func) { + try { + if (this.aborted) + return; + let processed = 0, range = collection.length, accum = 0, pct = 0; + for (const item of collection) { + await func(item, processed++, collection, this); + if (this.aborted) + return; + accum += 100; + if (accum > range) { + const remainder = accum % range, step = (accum - remainder) / range; + this.progress.setProgress(pct += step); + accum = remainder; + } + } + if (pct < 100) + this.progress.setProgress(100); + return this; + } finally { + this.progress.remove(); + } + } + + set title(text) { this.dialog.querySelector("header").textContent = text; } + get title() { return this.dialog.querySelector("header").textContent; } + + set message(text) { + this.dialog.querySelector(".content-area").childNodes[0].textContent = text; + } + + get message() { + return this.dialog.querySelector(".content-area").childNodes[0].textContent; + } +} + +async function validatedInput(title, message, value = "", regex = ".*", what = "entry") { + while (true) { + const input = prompt(title, message, value); + const inputField = input.dialog.find("input"); + const isValid = (t) => new RegExp(`^${regex}$`).test(t); + + inputField.setSelectionRange(value.length, value.length); + inputField.pattern = regex; + inputField.oninput = () => inputField.setAttribute("aria-invalid", !isValid(inputField.value)); + + const result = await input; + if (isValid(result)) return result; + + new obsidian.Notice(`"${result}" is not a valid ${what}`); + } +} + +const tagBody = /^#[^\u2000-\u206F\u2E00-\u2E7F'!"#$%&()*+,.:;<=>?@^`{|}~\[\]\\\s]+$/; + +class Tag { + constructor(name) { + const + hashed = this.tag = Tag.toTag(name), + canonical = this.canonical = hashed.toLowerCase(), + canonical_prefix = this.canonical_prefix = canonical + "/"; + this.name = hashed.slice(1); + this.matches = function (text) { + text = text.toLowerCase(); + return text == canonical || text.startsWith(canonical_prefix); + }; + } + toString() { return this.tag; } + + static isTag(s) { return tagBody.test(s); } + + static toTag(name) { + while (name.startsWith("##")) name = name.slice(1); + return name.startsWith("#") ? name : "#"+name; + } + + static canonical(name) { + return Tag.toTag(name).toLowerCase(); + } +} + +class Replacement { + + constructor(fromTag, toTag) { + const cache = Object.assign( + Object.create(null), { + [fromTag.tag]: toTag.tag, + [fromTag.name]: toTag.name, + } + ); + + this.inString = function(text, pos = 0) { + return text.slice(0, pos) + toTag.tag + text.slice(pos + fromTag.tag.length); + }; + + this.inArray = (tags, skipOdd, isAlias) => { + return tags.map((t, i) => { + if (skipOdd && (i & 1)) return t; // leave odd entries (separators) alone + // Obsidian allows spaces as separators within array elements + if (!t) return t; + // Skip non-tag parts + if (isAlias) { + if (!t.startsWith("#") || !Tag.isTag(t)) return t; + } else if (/[ ,\n]/.test(t)) { + return this.inArray(t.split(/([, \n]+)/), true).join(""); + } + if (cache[t]) return cache[t]; + const lc = t.toLowerCase(); + if (cache[lc]) { + return cache[t] = cache[lc]; + } else if (lc.startsWith(fromTag.canonical_prefix)) { + return cache[t] = cache[lc] = this.inString(t); + } else if (("#" + lc).startsWith(fromTag.canonical_prefix)) { + return cache[t] = cache[lc] = this.inString("#" + t).slice(1); + } + return cache[t] = cache[lc] = t; + }); + }; + + this.willMergeTags = function (tagNames) { + // Renaming to change case doesn't lose info, so ignore it + if (fromTag.canonical === toTag.canonical) return; + + const existing = new Set(tagNames.map(s => s.toLowerCase())); + + for (const tagName of tagNames.filter(fromTag.matches)) { + const changed = this.inString(tagName); + if (existing.has(changed.toLowerCase())) + return [new Tag(tagName), new Tag(changed)]; + } + + }; + } +} + +const ALIAS = Symbol.for('yaml.alias'); +const DOC = Symbol.for('yaml.document'); +const MAP = Symbol.for('yaml.map'); +const PAIR = Symbol.for('yaml.pair'); +const SCALAR$1 = Symbol.for('yaml.scalar'); +const SEQ = Symbol.for('yaml.seq'); +const NODE_TYPE = Symbol.for('yaml.node.type'); +const isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS; +const isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC; +const isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP; +const isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR; +const isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR$1; +const isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ; +function isCollection(node) { + if (node && typeof node === 'object') + switch (node[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; +} +function isNode(node) { + if (node && typeof node === 'object') + switch (node[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR$1: + case SEQ: + return true; + } + return false; +} +const hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor; +class NodeBase { + constructor(type) { + Object.defineProperty(this, NODE_TYPE, { value: type }); + } + /** Create a copy of this node. */ + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } +} + +const BREAK = Symbol('break visit'); +const SKIP = Symbol('skip children'); +const REMOVE = Symbol('remove node'); +/** + * Apply a visitor to an AST node or document. + * + * Walks through the tree (depth-first) starting from `node`, calling a + * `visitor` function with three arguments: + * - `key`: For sequence values and map `Pair`, the node's index in the + * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly. + * `null` for the root node. + * - `node`: The current node. + * - `path`: The ancestry of the current node. + * + * The return value of the visitor may be used to control the traversal: + * - `undefined` (default): Do nothing and continue + * - `visit.SKIP`: Do not visit the children of this node, continue with next + * sibling + * - `visit.BREAK`: Terminate traversal completely + * - `visit.REMOVE`: Remove the current node, then continue with the next one + * - `Node`: Replace the current node, then continue by visiting it + * - `number`: While iterating the items of a sequence or map, set the index + * of the next step. This is useful especially if the index of the current + * node has changed. + * + * If `visitor` is a single function, it will be called with all values + * encountered in the tree, including e.g. `null` values. Alternatively, + * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`, + * `Alias` and `Scalar` node. To define the same visitor function for more than + * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar) + * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most + * specific defined one will be used for each node. + */ +function visit(node, visitor) { + if (typeof visitor === 'object' && + (visitor.Collection || visitor.Node || visitor.Value)) { + visitor = Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + if (isDocument(node)) { + const cd = _visit(null, node.contents, visitor, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } + else + _visit(null, node, visitor, Object.freeze([])); +} +// Without the `as symbol` casts, TS declares these in the `visit` +// namespace using `var`, but then complains about that because +// `unique symbol` must be `const`. +/** Terminate visit traversal completely */ +visit.BREAK = BREAK; +/** Do not visit the children of the current node */ +visit.SKIP = SKIP; +/** Remove the current node */ +visit.REMOVE = REMOVE; +function _visit(key, node, visitor, path) { + let ctrl = undefined; + if (typeof visitor === 'function') + ctrl = visitor(key, node, path); + else if (isMap(node)) { + if (visitor.Map) + ctrl = visitor.Map(key, node, path); + } + else if (isSeq(node)) { + if (visitor.Seq) + ctrl = visitor.Seq(key, node, path); + } + else if (isPair(node)) { + if (visitor.Pair) + ctrl = visitor.Pair(key, node, path); + } + else if (isScalar(node)) { + if (visitor.Scalar) + ctrl = visitor.Scalar(key, node, path); + } + else if (isAlias(node)) { + if (visitor.Alias) + ctrl = visitor.Alias(key, node, path); + } + if (isNode(ctrl) || isPair(ctrl)) { + const parent = path[path.length - 1]; + if (isCollection(parent)) { + parent.items[key] = ctrl; + } + else if (isPair(parent)) { + if (key === 'key') + parent.key = ctrl; + else + parent.value = ctrl; + } + else if (isDocument(parent)) { + parent.contents = ctrl; + } + else { + const pt = isAlias(parent) ? 'alias' : 'scalar'; + throw new Error(`Cannot replace node with ${pt} parent`); + } + return _visit(key, ctrl, visitor, path); + } + if (typeof ctrl !== 'symbol') { + if (isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = _visit(i, node.items[i], visitor, path); + if (typeof ci === 'number') + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i, 1); + i -= 1; + } + } + } + else if (isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = _visit('key', node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = _visit('value', node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; +} + +const escapeChars = { + '!': '%21', + ',': '%2C', + '[': '%5B', + ']': '%5D', + '{': '%7B', + '}': '%7D' +}; +const escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, ch => escapeChars[ch]); +class Directives { + constructor(yaml, tags) { + /** + * The directives-end/doc-start marker `---`. If `null`, a marker may still be + * included in the document's stringified representation. + */ + this.marker = null; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.marker = this.marker; + return copy; + } + /** + * During parsing, get a Directives instance for the current document and + * update the stream state according to the current version's spec. + */ + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case '1.1': + this.atNextDocument = true; + break; + case '1.2': + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: '1.2' + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + /** + * @param onError - May be called even if the action was successful + * @returns `true` on success + */ + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: '1.1' }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case '%TAG': { + if (parts.length !== 2) { + onError(0, '%TAG directive should contain exactly two parts'); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case '%YAML': { + this.yaml.explicit = true; + if (parts.length < 1) { + onError(0, '%YAML directive should contain exactly one part'); + return false; + } + const [version] = parts; + if (version === '1.1' || version === '1.2') { + this.yaml.version = version; + return true; + } + else { + onError(6, `Unsupported YAML version ${version}`, true); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + /** + * Resolves a tag, matching handles to those defined in %TAG directives. + * + * @returns Resolved tag, which may also be the non-specific tag `'!'` or a + * `'!local'` tag, or `null` if unresolvable. + */ + tagName(source, onError) { + if (source === '!') + return '!'; // non-specific tag + if (source[0] !== '!') { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === '<') { + const verbatim = source.slice(2, -1); + if (verbatim === '!' || verbatim === '!!') { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== '>') + onError('Verbatim tags must end with a >'); + return verbatim; + } + const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) + return prefix + decodeURIComponent(suffix); + if (handle === '!') + return source; // local tag + onError(`Could not resolve tag: ${source}`); + return null; + } + /** + * Given a fully resolved tag, returns its printable string form, + * taking into account current tag prefixes and defaults. + */ + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === '!' ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit + ? [`%YAML ${this.yaml.version || '1.2'}`] + : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && isNode(doc.contents)) { + const tags = {}; + visit(doc.contents, (_key, node) => { + if (isNode(node) && node.tag) + tags[node.tag] = true; + }); + tagNames = Object.keys(tags); + } + else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === '!!' && prefix === 'tag:yaml.org,2002:') + continue; + if (!doc || tagNames.some(tn => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join('\n'); + } +} +Directives.defaultYaml = { explicit: false, version: '1.2' }; +Directives.defaultTags = { '!!': 'tag:yaml.org,2002:' }; + +/** + * Verify that the input string is a valid anchor. + * + * Will throw on errors. + */ +function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; +} +function anchorNames(root) { + const anchors = new Set(); + visit(root, { + Value(_key, node) { + if (node.anchor) + anchors.add(node.anchor); + } + }); + return anchors; +} +/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */ +function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name = `${prefix}${i}`; + if (!exclude.has(name)) + return name; + } +} +function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = new Map(); + let prevAnchors = null; + return { + onAnchor(source) { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + /** + * With circular references, the source node is only resolved after all + * of its child nodes are. This is why anchors are set only after all of + * the nodes have been created. + */ + setAnchors() { + for (const source of aliasObjects) { + const ref = sourceObjects.get(source); + if (typeof ref === 'object' && + ref.anchor && + (isScalar(ref.node) || isCollection(ref.node))) { + ref.node.anchor = ref.anchor; + } + else { + const error = new Error('Failed to resolve repeated object (this should not happen)'); + error.source = source; + throw error; + } + } + }, + sourceObjects + }; +} + +class Alias extends NodeBase { + constructor(source) { + super(ALIAS); + this.source = source; + Object.defineProperty(this, 'tag', { + set() { + throw new Error('Alias nodes cannot have tags'); + } + }); + } + /** + * Resolve the value of this alias within `doc`, finding the last + * instance of the `source` anchor before this node. + */ + resolve(doc) { + let found = undefined; + visit(doc, { + Node: (_key, node) => { + if (node === this) + return visit.BREAK; + if (node.anchor === this.source) + found = node; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + const data = anchors.get(source); + /* istanbul ignore if */ + if (!data || data.res === undefined) { + const msg = 'This should not happen: Alias anchor was not resolved?'; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data.count += 1; + if (data.aliasCount === 0) + data.aliasCount = getAliasCount(doc, source, anchors); + if (data.count * data.aliasCount > maxAliasCount) { + const msg = 'Excessive alias count indicates a resource exhaustion attack'; + throw new ReferenceError(msg); + } + } + return data.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src = `*${this.source}`; + if (ctx) { + anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src} `; + } + return src; + } +} +function getAliasCount(doc, node, anchors) { + if (isAlias(node)) { + const source = node.resolve(doc); + const anchor = anchors && source && anchors.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } + else if (isCollection(node)) { + let count = 0; + for (const item of node.items) { + const c = getAliasCount(doc, item, anchors); + if (c > count) + count = c; + } + return count; + } + else if (isPair(node)) { + const kc = getAliasCount(doc, node.key, anchors); + const vc = getAliasCount(doc, node.value, anchors); + return Math.max(kc, vc); + } + return 1; +} + +/** + * Recursively convert any node or its contents to native JavaScript + * + * @param value - The input value + * @param arg - If `value` defines a `toJSON()` method, use this + * as its first argument + * @param ctx - Conversion context, originally set in Document#toJS(). If + * `{ keep: true }` is not set, output should be suitable for JSON + * stringification. + */ +function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v, i) => toJS(v, String(i), ctx)); + if (value && typeof value.toJSON === 'function') { + if (!ctx || !hasAnchor(value)) + return value.toJSON(arg, ctx); + const data = { aliasCount: 0, count: 1, res: undefined }; + ctx.anchors.set(value, data); + ctx.onCreate = res => { + data.res = res; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === 'bigint' && !(ctx && ctx.keep)) + return Number(value); + return value; +} + +const isScalarValue = (value) => !value || (typeof value !== 'function' && typeof value !== 'object'); +class Scalar extends NodeBase { + constructor(value) { + super(SCALAR$1); + this.value = value; + } + toJSON(arg, ctx) { + return ctx && ctx.keep ? this.value : toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } +} +Scalar.BLOCK_FOLDED = 'BLOCK_FOLDED'; +Scalar.BLOCK_LITERAL = 'BLOCK_LITERAL'; +Scalar.PLAIN = 'PLAIN'; +Scalar.QUOTE_DOUBLE = 'QUOTE_DOUBLE'; +Scalar.QUOTE_SINGLE = 'QUOTE_SINGLE'; + +const defaultTagPrefix = 'tag:yaml.org,2002:'; +function findTagObject(value, tagName, tags) { + if (tagName) { + const match = tags.filter(t => t.tag === tagName); + const tagObj = match.find(t => !t.format) || match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find(t => t.identify && t.identify(value) && !t.format); +} +function createNode(value, tagName, ctx) { + var _a, _b; + if (isDocument(value)) + value = value.contents; + if (isNode(value)) + return value; + if (isPair(value)) { + const map = (_b = (_a = ctx.schema[MAP]).createNode) === null || _b === void 0 ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map.items.push(value); + return map; + } + if (value instanceof String || + value instanceof Number || + value instanceof Boolean || + (typeof BigInt === 'function' && value instanceof BigInt) // not supported everywhere + ) { + // https://tc39.es/ecma262/#sec-serializejsonproperty + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx; + // Detect duplicate references to the same object & use Alias nodes for all + // after first. The `ref` wrapper allows for circular references to resolve. + let ref = undefined; + if (aliasDuplicateObjects && value && typeof value === 'object') { + ref = sourceObjects.get(value); + if (ref) { + if (!ref.anchor) + ref.anchor = onAnchor(value); + return new Alias(ref.anchor); + } + else { + ref = { anchor: null, node: null }; + sourceObjects.set(value, ref); + } + } + if (tagName && tagName.startsWith('!!')) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema.tags); + if (!tagObj) { + if (value && typeof value.toJSON === 'function') + value = value.toJSON(); + if (!value || typeof value !== 'object') { + const node = new Scalar(value); + if (ref) + ref.node = node; + return node; + } + tagObj = + value instanceof Map + ? schema[MAP] + : Symbol.iterator in Object(value) + ? schema[SEQ] + : schema[MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node = (tagObj === null || tagObj === void 0 ? void 0 : tagObj.createNode) + ? tagObj.createNode(ctx.schema, value, ctx) + : new Scalar(value); + if (tagName) + node.tag = tagName; + if (ref) + ref.node = node; + return node; +} + +function collectionFromPath(schema, path, value) { + let v = value; + for (let i = path.length - 1; i >= 0; --i) { + const k = path[i]; + if (typeof k === 'number' && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } + else { + v = new Map([[k, v]]); + } + } + return createNode(v, undefined, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error('This should not happen, please report a bug.'); + }, + schema, + sourceObjects: new Map() + }); +} +// null, undefined, or an empty non-string iterable (e.g. []) +const isEmptyPath = (path) => path == null || + (typeof path === 'object' && !!path[Symbol.iterator]().next().done); +class Collection extends NodeBase { + constructor(type, schema) { + super(type); + Object.defineProperty(this, 'schema', { + value: schema, + configurable: true, + enumerable: false, + writable: true + }); + } + /** + * Create a copy of this collection. + * + * @param schema - If defined, overwrites the original's schema + */ + clone(schema) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema) + copy.schema = schema; + copy.items = copy.items.map(it => isNode(it) || isPair(it) ? it.clone(schema) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** + * Adds a value to the collection. For `!!map` and `!!omap` the value must + * be a Pair instance or a `{ key, value }` object, which may not have a key + * that already exists in the map. + */ + addIn(path, value) { + if (isEmptyPath(path)) + this.add(value); + else { + const [key, ...rest] = path; + const node = this.get(key, true); + if (isCollection(node)) + node.addIn(rest, value); + else if (node === undefined && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + /** + * Removes a value from the collection. + * @returns `true` if the item was found and removed. + */ + deleteIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.delete(key); + const node = this.get(key, true); + if (isCollection(node)) + return node.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path, keepScalar) { + const [key, ...rest] = path; + const node = this.get(key, true); + if (rest.length === 0) + return !keepScalar && isScalar(node) ? node.value : node; + else + return isCollection(node) ? node.getIn(rest, keepScalar) : undefined; + } + hasAllNullValues(allowScalar) { + return this.items.every(node => { + if (!isPair(node)) + return false; + const n = node.value; + return (n == null || + (allowScalar && + isScalar(n) && + n.value == null && + !n.commentBefore && + !n.comment && + !n.tag)); + }); + } + /** + * Checks if the collection includes a value with the key `key`. + */ + hasIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.has(key); + const node = this.get(key, true); + return isCollection(node) ? node.hasIn(rest) : false; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path, value) { + const [key, ...rest] = path; + if (rest.length === 0) { + this.set(key, value); + } + else { + const node = this.get(key, true); + if (isCollection(node)) + node.setIn(rest, value); + else if (node === undefined && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } +} +Collection.maxFlowStringSingleLineLength = 60; + +/** + * Stringifies a comment. + * + * Empty comment lines are left empty, + * lines consisting of a single space are replaced by `#`, + * and all other lines are prefixed with a `#`. + */ +const stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#'); +function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; +} +const lineComment = (str, indent, comment) => comment.includes('\n') + ? '\n' + indentComment(comment, indent) + : (str.endsWith(' ') ? '' : ' ') + comment; + +const FOLD_FLOW = 'flow'; +const FOLD_BLOCK = 'block'; +const FOLD_QUOTED = 'quoted'; +/** + * Tries to keep input at up to `lineWidth` characters, splitting only on spaces + * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are + * terminated with `\n` and started with `indent`. + */ +function foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === 'number') { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = undefined; + let prev = undefined; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i); + if (i !== -1) + end = i + endStep; + } + for (let ch; (ch = text[(i += 1)]);) { + if (mode === FOLD_QUOTED && ch === '\\') { + escStart = i; + switch (text[i + 1]) { + case 'x': + i += 3; + break; + case 'u': + i += 5; + break; + case 'U': + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === '\n') { + if (mode === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i); + end = i + endStep; + split = undefined; + } + else { + if (ch === ' ' && + prev && + prev !== ' ' && + prev !== '\n' && + prev !== '\t') { + // space surrounded by non-space can be replaced with newline + indent + const next = text[i + 1]; + if (next && next !== ' ' && next !== '\n' && next !== '\t') + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = undefined; + } + else if (mode === FOLD_QUOTED) { + // white-space collected at end may stretch past lineWidth + while (prev === ' ' || prev === '\t') { + prev = ch; + ch = text[(i += 1)]; + overflow = true; + } + // Account for newline escape, but don't break preceding escape + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + // Bail out if lineWidth & minContentWidth are shorter than an escape string + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = undefined; + } + else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i = 0; i < folds.length; ++i) { + const fold = folds[i]; + const end = folds[i + 1] || text.length; + if (fold === 0) + res = `\n${indent}${text.slice(0, end)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += `\n${indent}${text.slice(fold + 1, end)}`; + } + } + return res; +} +/** + * Presumes `i + 1` is at the start of a line + * @returns index of last newline in more-indented block + */ +function consumeMoreIndentedLines(text, i) { + let ch = text[i + 1]; + while (ch === ' ' || ch === '\t') { + do { + ch = text[(i += 1)]; + } while (ch && ch !== '\n'); + ch = text[i + 1]; + } + return i; +} + +const getFoldOptions = (ctx) => ({ + indentAtStart: ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth +}); +// Also checks for lines starting with %, as parsing the output as YAML 1.1 will +// presume that's starting a new document. +const containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); +function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === '\n') { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; +} +function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : ''); + let str = ''; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === ' ' && json[i + 1] === '\\' && json[i + 2] === 'n') { + // space before newline needs to be escaped to not be folded + str += json.slice(start, i) + '\\ '; + i += 1; + start = i; + ch = '\\'; + } + if (ch === '\\') + switch (json[i + 1]) { + case 'u': + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case '0000': + str += '\\0'; + break; + case '0007': + str += '\\a'; + break; + case '000b': + str += '\\v'; + break; + case '001b': + str += '\\e'; + break; + case '0085': + str += '\\N'; + break; + case '00a0': + str += '\\_'; + break; + case '2028': + str += '\\L'; + break; + case '2029': + str += '\\P'; + break; + default: + if (code.substr(0, 2) === '00') + str += '\\x' + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case 'n': + if (implicitKey || + json[i + 2] === '"' || + json.length < minMultiLineLength) { + i += 1; + } + else { + // folding will eat first newline + str += json.slice(start, i) + '\n\n'; + while (json[i + 2] === '\\' && + json[i + 3] === 'n' && + json[i + 4] !== '"') { + str += '\n'; + i += 2; + } + str += indent; + // space after newline needs to be escaped to not be folded + if (json[i + 2] === ' ') + str += '\\'; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey + ? str + : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)); +} +function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || + (ctx.implicitKey && value.includes('\n')) || + /[ \t]\n|\n[ \t]/.test(value) // single quoted string can't have leading or trailing whitespace around newline + ) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : ''); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$&\n${indent}`) + "'"; + return ctx.implicitKey + ? res + : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); +} +function blockString({ comment, type, value }, ctx, onComment, onChompKeep) { + const { blockQuote, commentString, lineWidth } = ctx.options; + // 1. Block can't end in whitespace unless the last line is non-empty. + // 2. Strings consisting of only whitespace are best rendered explicitly. + if (!blockQuote || /\n[\t ]+$/.test(value) || /^\s*$/.test(value)) { + return quotedString(value, ctx); + } + const indent = ctx.indent || + (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : ''); + const literal = blockQuote === 'literal' + ? true + : blockQuote === 'folded' || type === Scalar.BLOCK_FOLDED + ? false + : type === Scalar.BLOCK_LITERAL + ? true + : !lineLengthOverLimit(value, lineWidth, indent.length); + if (!value) + return literal ? '|\n' : '>\n'; + // determine chomping from whitespace at value end + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== '\n' && ch !== '\t' && ch !== ' ') + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf('\n'); + if (endNlPos === -1) { + chomp = '-'; // strip + } + else if (value === end || endNlPos !== end.length - 1) { + chomp = '+'; // keep + if (onChompKeep) + onChompKeep(); + } + else { + chomp = ''; // clip + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === '\n') + end = end.slice(0, -1); + end = end.replace(/\n+(?!\n|$)/g, `$&${indent}`); + } + // determine indent indicator from whitespace at value start + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === ' ') + startWithSpace = true; + else if (ch === '\n') + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? '2' : '1'; // root is at -1 + let header = (literal ? '|' : '>') + (startWithSpace ? indentSize : '') + chomp; + if (comment) { + header += ' ' + commentString(comment.replace(/ ?[\r\n]+/g, ' ')); + if (onComment) + onComment(); + } + if (literal) { + value = value.replace(/\n+/g, `$&${indent}`); + return `${header}\n${indent}${start}${value}${end}`; + } + value = value + .replace(/\n+/g, '\n$&') + .replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, '$1$2') // more-indented lines aren't folded + // ^ more-ind. ^ empty ^ capture next empty lines only at end of indent + .replace(/\n+/g, `$&${indent}`); + const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx)); + return `${header}\n${indent}${body}`; +} +function plainString(item, ctx, onComment, onChompKeep) { + const { type, value } = item; + const { actualString, implicitKey, indent, inFlow } = ctx; + if ((implicitKey && /[\n[\]{},]/.test(value)) || + (inFlow && /[[\]{},]/.test(value))) { + return quotedString(value, ctx); + } + if (!value || + /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + // not allowed: + // - empty string, '-' or '?' + // - start with an indicator character (except [?:-]) or /[?-] / + // - '\n ', ': ' or ' \n' anywhere + // - '#' not preceded by a non-space char + // - end with ' ' or ':' + return implicitKey || inFlow || value.indexOf('\n') === -1 + ? quotedString(value, ctx) + : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && + !inFlow && + type !== Scalar.PLAIN && + value.indexOf('\n') !== -1) { + // Where allowed & type not set explicitly, prefer block style for multiline strings + return blockString(item, ctx, onComment, onChompKeep); + } + if (indent === '' && containsDocumentMarker(value)) { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } + const str = value.replace(/\n+/g, `$&\n${indent}`); + // Verify that output will be parsed as a string, as e.g. plain numbers and + // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'), + // and others in v1.1. + if (actualString) { + const test = (tag) => { var _a; return tag.default && tag.tag !== 'tag:yaml.org,2002:str' && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(str)); }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat === null || compat === void 0 ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey + ? str + : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === 'string' + ? item + : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.QUOTE_DOUBLE) { + // force double quotes on control characters & unpaired surrogates + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.BLOCK_FOLDED: + case Scalar.BLOCK_LITERAL: + return implicitKey || inFlow + ? quotedString(ss.value, ctx) // blocks are not valid inside flow containers + : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = (implicitKey && defaultKeyType) || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; +} + +function createStringifyContext(doc, options) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment, + defaultKeyType: null, + defaultStringType: 'PLAIN', + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: 'false', + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: 'null', + simpleKeys: false, + singleQuote: null, + trueStr: 'true', + verifyAliasOrder: true + }, doc.schema.toStringOptions, options); + let inFlow; + switch (opt.collectionStyle) { + case 'block': + inFlow = false; + break; + case 'flow': + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: new Set(), + doc, + indent: '', + indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ', + inFlow, + options: opt + }; +} +function getTagObject(tags, item) { + if (item.tag) { + const match = tags.filter(t => t.tag === item.tag); + if (match.length > 0) + return match.find(t => t.format === item.format) || match[0]; + } + let tagObj = undefined; + let obj; + if (isScalar(item)) { + obj = item.value; + const match = tags.filter(t => t.identify && t.identify(obj)); + tagObj = + match.find(t => t.format === item.format) || match.find(t => !t.format); + } + else { + obj = item; + tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + // @ts-ignore + const name = obj && obj.constructor ? obj.constructor.name : typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; +} +// needs to be called before value stringifier to allow for circular anchor refs +function stringifyProps(node, tagObj, { anchors, doc }) { + if (!doc.directives) + return ''; + const props = []; + const anchor = (isScalar(node) || isCollection(node)) && node.anchor; + if (anchor && anchorIsValid(anchor)) { + anchors.add(anchor); + props.push(`&${anchor}`); + } + const tag = node.tag || (tagObj.default ? null : tagObj.tag); + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(' '); +} +function stringify$1(item, ctx, onComment, onChompKeep) { + var _a; + if (isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) === null || _a === void 0 ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } + else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = undefined; + const node = isNode(item) + ? item + : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node); + const props = stringifyProps(node, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart || 0) + props.length + 1; + const str = typeof tagObj.stringify === 'function' + ? tagObj.stringify(node, ctx, onComment, onChompKeep) + : isScalar(node) + ? stringifyString(node, ctx, onComment, onChompKeep) + : node.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return isScalar(node) || str[0] === '{' || str[0] === '[' + ? `${props} ${str}` + : `${props}\n${ctx.indent}${str}`; +} + +function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = (isNode(key) && key.comment) || null; + if (simpleKeys) { + if (keyComment) { + throw new Error('With simple keys, key nodes cannot have comments'); + } + if (isCollection(key)) { + const msg = 'With simple keys, collection cannot be used as a key value'; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && + (!key || + (keyComment && value == null && !ctx.inFlow) || + isCollection(key) || + (isScalar(key) + ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL + : typeof key === 'object')); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify$1(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true)); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error('With simple keys, single line scalar must not span more than 1024 characters'); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return explicitKey ? `? ${str}` : str; + } + } + else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str}\n${indent}:`; + } + else { + str = `${str}:`; + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + let vcb = ''; + let valueComment = null; + if (isNode(value)) { + if (value.spaceBefore) + vcb = '\n'; + if (value.commentBefore) { + const cs = commentString(value.commentBefore); + vcb += `\n${indentComment(cs, ctx.indent)}`; + } + valueComment = value.comment; + } + else if (value && typeof value === 'object') { + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && isScalar(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && + indentStep.length >= 2 && + !ctx.inFlow && + !explicitKey && + isSeq(value) && + !value.flow && + !value.tag && + !value.anchor) { + // If indentSeq === false, consider '- ' as part of indentation where possible + ctx.indent = ctx.indent.substr(2); + } + let valueCommentDone = false; + const valueStr = stringify$1(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true)); + let ws = ' '; + if (vcb || keyComment) { + ws = valueStr === '' && !ctx.inFlow ? vcb : `${vcb}\n${ctx.indent}`; + } + else if (!explicitKey && isCollection(value)) { + const flow = valueStr[0] === '[' || valueStr[0] === '{'; + if (!flow || valueStr.includes('\n')) + ws = `\n${ctx.indent}`; + } + else if (valueStr === '' || valueStr[0] === '\n') + ws = ''; + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } + else if (valueComment && !valueCommentDone) { + str += lineComment(str, ctx.indent, commentString(valueComment)); + } + else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; +} + +function warn(logLevel, warning) { + if (logLevel === 'debug' || logLevel === 'warn') { + if (typeof process !== 'undefined' && process.emitWarning) + process.emitWarning(warning); + else + console.warn(warning); + } +} + +const MERGE_KEY = '<<'; +function addPairToJSMap(ctx, map, { key, value }) { + if (ctx && ctx.doc.schema.merge && isMergeKey(key)) { + value = isAlias(value) ? value.resolve(ctx.doc) : value; + if (isSeq(value)) + for (const it of value.items) + mergeToJSMap(ctx, map, it); + else if (Array.isArray(value)) + for (const it of value) + mergeToJSMap(ctx, map, it); + else + mergeToJSMap(ctx, map, value); + } + else { + const jsKey = toJS(key, '', ctx); + if (map instanceof Map) { + map.set(jsKey, toJS(value, jsKey, ctx)); + } + else if (map instanceof Set) { + map.add(jsKey); + } + else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS(value, stringKey, ctx); + if (stringKey in map) + Object.defineProperty(map, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map[stringKey] = jsValue; + } + } + return map; +} +const isMergeKey = (key) => key === MERGE_KEY || + (isScalar(key) && + key.value === MERGE_KEY && + (!key.type || key.type === Scalar.PLAIN)); +// If the value associated with a merge key is a single mapping node, each of +// its key/value pairs is inserted into the current mapping, unless the key +// already exists in it. If the value associated with the merge key is a +// sequence, then this sequence is expected to contain mapping nodes and each +// of these nodes is merged in turn according to its order in the sequence. +// Keys in mapping nodes earlier in the sequence override keys specified in +// later mapping nodes. -- http://yaml.org/type/merge.html +function mergeToJSMap(ctx, map, value) { + const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (!isMap(source)) + throw new Error('Merge sources must be maps or map aliases'); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value] of srcMap) { + if (map instanceof Map) { + if (!map.has(key)) + map.set(key, value); + } + else if (map instanceof Set) { + map.add(key); + } + else if (!Object.prototype.hasOwnProperty.call(map, key)) { + Object.defineProperty(map, key, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map; +} +function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ''; + if (typeof jsKey !== 'object') + return String(jsKey); + if (isNode(key) && ctx && ctx.doc) { + const strCtx = createStringifyContext(ctx.doc, {}); + strCtx.anchors = new Set(); + for (const node of ctx.anchors.keys()) + strCtx.anchors.add(node.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); +} + +function createPair(key, value, ctx) { + const k = createNode(key, undefined, ctx); + const v = createNode(value, undefined, ctx); + return new Pair(k, v); +} +class Pair { + constructor(key, value = null) { + Object.defineProperty(this, NODE_TYPE, { value: PAIR }); + this.key = key; + this.value = value; + } + clone(schema) { + let { key, value } = this; + if (isNode(key)) + key = key.clone(schema); + if (isNode(value)) + value = value.clone(schema); + return new Pair(key, value); + } + toJSON(_, ctx) { + const pair = ctx && ctx.mapAsMap ? new Map() : {}; + return addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return ctx && ctx.doc + ? stringifyPair(this, ctx, onComment, onChompKeep) + : JSON.stringify(this); + } +} + +/** + * `yaml` defines document-specific options in three places: as an argument of + * parse, create and stringify calls, in the values of `YAML.defaultOptions`, + * and in the version-dependent `YAML.Document.defaults` object. Values set in + * `YAML.defaultOptions` override version-dependent defaults, and argument + * options override both. + */ +const defaultOptions = { + intAsBigInt: false, + keepSourceTokens: false, + logLevel: 'warn', + prettyErrors: true, + strict: true, + uniqueKeys: true, + version: '1.2' +}; + +function stringifyCollection(collection, ctx, options) { + var _a; + const flow = (_a = ctx.inFlow) !== null && _a !== void 0 ? _a : collection.flow; + const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify(collection, ctx, options); +} +function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; // flag for the preceding node's status + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment = null; + if (isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(''); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment = item.comment; + } + else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(''); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str = stringify$1(item, itemCtx, () => (comment = null), () => (chompKeep = true)); + if (comment) + str += lineComment(str, itemIndent, commentString(comment)); + if (chompKeep && comment) + chompKeep = false; + lines.push(blockItemPrefix + str); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } + else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? `\n${indent}${line}` : '\n'; + } + } + if (comment) { + str += '\n' + indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } + else if (chompKeep && onChompKeep) + onChompKeep(); + return str; +} +function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) { + const { indent, indentStep, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment = null; + if (isNode(item)) { + if (item.spaceBefore) + lines.push(''); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment = item.comment; + } + else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(''); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } + else if (item.value == null && ik && ik.comment) { + comment = ik.comment; + } + } + if (comment) + reqNewline = true; + let str = stringify$1(item, itemCtx, () => (comment = null)); + if (i < items.length - 1) + str += ','; + if (comment) + str += lineComment(str, itemIndent, commentString(comment)); + if (!reqNewline && (lines.length > linesAtValue || str.includes('\n'))) + reqNewline = true; + lines.push(str); + linesAtValue = lines.length; + } + let str; + const { start, end } = flowChars; + if (lines.length === 0) { + str = start + end; + } + else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = len > Collection.maxFlowStringSingleLineLength; + } + if (reqNewline) { + str = start; + for (const line of lines) + str += line ? `\n${indentStep}${indent}${line}` : '\n'; + str += `\n${indent}${end}`; + } + else { + str = `${start} ${lines.join(' ')} ${end}`; + } + } + if (comment) { + str += lineComment(str, commentString(comment), indent); + if (onComment) + onComment(); + } + return str; +} +function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ''); + if (comment) { + const ic = indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); // Avoid double indent on first line + } +} + +function findPair(items, key) { + const k = isScalar(key) ? key.value : key; + for (const it of items) { + if (isPair(it)) { + if (it.key === key || it.key === k) + return it; + if (isScalar(it.key) && it.key.value === k) + return it; + } + } + return undefined; +} +class YAMLMap extends Collection { + constructor(schema) { + super(MAP, schema); + this.items = []; + } + static get tagName() { + return 'tag:yaml.org,2002:map'; + } + /** + * Adds a value to the collection. + * + * @param overwrite - If not set `true`, using a key that is already in the + * collection will throw. Otherwise, overwrites the previous value. + */ + add(pair, overwrite) { + let _pair; + if (isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== 'object' || !('key' in pair)) { + // In TypeScript, this never happens. + _pair = new Pair(pair, pair.value); + } + else + _pair = new Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = this.schema && this.schema.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + // For scalars, keep the old node & its comments and anchors + if (isScalar(prev.value) && isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } + else if (sortEntries) { + const i = this.items.findIndex(item => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } + else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + const it = findPair(this.items, key); + const node = it && it.value; + return !keepScalar && isScalar(node) ? node.value : node; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value) { + this.add(new Pair(key, value), true); + } + /** + * @param ctx - Conversion context, originally set in Document#toJS() + * @param {Class} Type - If set, forces the returned collection type + * @returns Instance of Type, Map, or Object + */ + toJSON(_, ctx, Type) { + const map = Type ? new Type() : ctx && ctx.mapAsMap ? new Map() : {}; + if (ctx && ctx.onCreate) + ctx.onCreate(map); + for (const item of this.items) + addPairToJSMap(ctx, map, item); + return map; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection(this, ctx, { + blockItemPrefix: '', + flowChars: { start: '{', end: '}' }, + itemIndent: ctx.indent || '', + onChompKeep, + onComment + }); + } +} + +function createMap(schema, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map = new YAMLMap(schema); + const add = (key, value) => { + if (typeof replacer === 'function') + value = replacer.call(obj, key, value); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value !== undefined || keepUndefined) + map.items.push(createPair(key, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value] of obj) + add(key, value); + } + else if (obj && typeof obj === 'object') { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema.sortMapEntries === 'function') { + map.items.sort(schema.sortMapEntries); + } + return map; +} +const map = { + collection: 'map', + createNode: createMap, + default: true, + nodeClass: YAMLMap, + tag: 'tag:yaml.org,2002:map', + resolve(map, onError) { + if (!isMap(map)) + onError('Expected a mapping for this tag'); + return map; + } +}; + +class YAMLSeq extends Collection { + constructor(schema) { + super(SEQ, schema); + this.items = []; + } + static get tagName() { + return 'tag:yaml.org,2002:seq'; + } + add(value) { + this.items.push(value); + } + /** + * Removes a value from the collection. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + * + * @returns `true` if the item was found and removed. + */ + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== 'number') + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + */ + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== 'number') + return undefined; + const it = this.items[idx]; + return !keepScalar && isScalar(it) ? it.value : it; + } + /** + * Checks if the collection includes a value with the key `key`. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + */ + has(key) { + const idx = asItemIndex(key); + return typeof idx === 'number' && idx < this.items.length; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + * + * If `key` does not contain a representation of an integer, this will throw. + * It may be wrapped in a `Scalar`. + */ + set(key, value) { + const idx = asItemIndex(key); + if (typeof idx !== 'number') + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (isScalar(prev) && isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_, ctx) { + const seq = []; + if (ctx && ctx.onCreate) + ctx.onCreate(seq); + let i = 0; + for (const item of this.items) + seq.push(toJS(item, String(i++), ctx)); + return seq; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection(this, ctx, { + blockItemPrefix: '- ', + flowChars: { start: '[', end: ']' }, + itemIndent: (ctx.indent || '') + ' ', + onChompKeep, + onComment + }); + } +} +function asItemIndex(key) { + let idx = isScalar(key) ? key.value : key; + if (idx && typeof idx === 'string') + idx = Number(idx); + return typeof idx === 'number' && Number.isInteger(idx) && idx >= 0 + ? idx + : null; +} + +function createSeq(schema, obj, ctx) { + const { replacer } = ctx; + const seq = new YAMLSeq(schema); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === 'function') { + const key = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key, it); + } + seq.items.push(createNode(it, undefined, ctx)); + } + } + return seq; +} +const seq = { + collection: 'seq', + createNode: createSeq, + default: true, + nodeClass: YAMLSeq, + tag: 'tag:yaml.org,2002:seq', + resolve(seq, onError) { + if (!isSeq(seq)) + onError('Expected a sequence for this tag'); + return seq; + } +}; + +const string = { + identify: value => typeof value === 'string', + default: true, + tag: 'tag:yaml.org,2002:str', + resolve: str => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString(item, ctx, onComment, onChompKeep); + } +}; + +const nullTag = { + identify: value => value == null, + createNode: () => new Scalar(null), + default: true, + tag: 'tag:yaml.org,2002:null', + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar(null), + stringify: ({ source }, ctx) => source && nullTag.test.test(source) ? source : ctx.options.nullStr +}; + +const boolTag = { + identify: value => typeof value === 'boolean', + default: true, + tag: 'tag:yaml.org,2002:bool', + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: str => new Scalar(str[0] === 't' || str[0] === 'T'), + stringify({ source, value }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === 't' || source[0] === 'T'; + if (value === sv) + return source; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } +}; + +function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === 'bigint') + return String(value); + const num = typeof value === 'number' ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf'; + let n = JSON.stringify(value); + if (!format && + minFractionDigits && + (!tag || tag === 'tag:yaml.org,2002:float') && + /^\d/.test(n)) { + let i = n.indexOf('.'); + if (i < 0) { + i = n.length; + n += '.'; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += '0'; + } + return n; +} + +const floatNaN$1 = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + test: /^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/, + resolve: str => str.slice(-3).toLowerCase() === 'nan' + ? NaN + : str[0] === '-' + ? Number.NEGATIVE_INFINITY + : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp$1 = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + format: 'EXP', + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: str => parseFloat(str), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +const float$1 = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node = new Scalar(parseFloat(str)); + const dot = str.indexOf('.'); + if (dot !== -1 && str[str.length - 1] === '0') + node.minFractionDigits = str.length - dot - 1; + return node; + }, + stringify: stringifyNumber +}; + +const intIdentify$2 = (value) => typeof value === 'bigint' || Number.isInteger(value); +const intResolve$1 = (str, offset, radix, { intAsBigInt }) => (intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix)); +function intStringify$1(node, radix, prefix) { + const { value } = node; + if (intIdentify$2(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber(node); +} +const intOct$1 = { + identify: value => intIdentify$2(value) && value >= 0, + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'OCT', + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 8, opt), + stringify: node => intStringify$1(node, 8, '0o') +}; +const int$1 = { + identify: intIdentify$2, + default: true, + tag: 'tag:yaml.org,2002:int', + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex$1 = { + identify: value => intIdentify$2(value) && value >= 0, + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'HEX', + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 16, opt), + stringify: node => intStringify$1(node, 16, '0x') +}; + +const schema$2 = [ + map, + seq, + string, + nullTag, + boolTag, + intOct$1, + int$1, + intHex$1, + floatNaN$1, + floatExp$1, + float$1 +]; + +function intIdentify$1(value) { + return typeof value === 'bigint' || Number.isInteger(value); +} +const stringifyJSON = ({ value }) => JSON.stringify(value); +const jsonScalars = [ + { + identify: value => typeof value === 'string', + default: true, + tag: 'tag:yaml.org,2002:str', + resolve: str => str, + stringify: stringifyJSON + }, + { + identify: value => value == null, + createNode: () => new Scalar(null), + default: true, + tag: 'tag:yaml.org,2002:null', + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: value => typeof value === 'boolean', + default: true, + tag: 'tag:yaml.org,2002:bool', + test: /^true|false$/, + resolve: str => str === 'true', + stringify: stringifyJSON + }, + { + identify: intIdentify$1, + default: true, + tag: 'tag:yaml.org,2002:int', + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify$1(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: str => parseFloat(str), + stringify: stringifyJSON + } +]; +const jsonError = { + default: true, + tag: '', + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } +}; +const schema$1 = [map, seq].concat(jsonScalars, jsonError); + +const binary = { + identify: value => value instanceof Uint8Array, + default: false, + tag: 'tag:yaml.org,2002:binary', + /** + * Returns a Buffer in node and an Uint8Array in browsers + * + * To use the resulting buffer as an image, you'll want to do something like: + * + * const blob = new Blob([buffer], { type: 'image/jpeg' }) + * document.querySelector('#photo').src = URL.createObjectURL(blob) + */ + resolve(src, onError) { + if (typeof Buffer === 'function') { + return Buffer.from(src, 'base64'); + } + else if (typeof atob === 'function') { + // On IE 11, atob() can't handle newlines + const str = atob(src.replace(/[\n\r]/g, '')); + const buffer = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer[i] = str.charCodeAt(i); + return buffer; + } + else { + onError('This environment does not support reading binary tags; either Buffer or atob is required'); + return src; + } + }, + stringify({ comment, type, value }, ctx, onComment, onChompKeep) { + const buf = value; // checked earlier by binary.identify() + let str; + if (typeof Buffer === 'function') { + str = + buf instanceof Buffer + ? buf.toString('base64') + : Buffer.from(buf.buffer).toString('base64'); + } + else if (typeof btoa === 'function') { + let s = ''; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } + else { + throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required'); + } + if (!type) + type = Scalar.BLOCK_LITERAL; + if (type !== Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type === Scalar.BLOCK_LITERAL ? '\n' : ' '); + } + return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } +}; + +function resolvePairs(seq, onError) { + if (isSeq(seq)) { + for (let i = 0; i < seq.items.length; ++i) { + let item = seq.items[i]; + if (isPair(item)) + continue; + else if (isMap(item)) { + if (item.items.length > 1) + onError('Each pair must have its own sequence indicator'); + const pair = item.items[0] || new Pair(new Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore + ? `${item.commentBefore}\n${pair.key.commentBefore}` + : item.commentBefore; + if (item.comment) { + const cn = pair.value || pair.key; + cn.comment = cn.comment + ? `${item.comment}\n${cn.comment}` + : item.comment; + } + item = pair; + } + seq.items[i] = isPair(item) ? item : new Pair(item); + } + } + else + onError('Expected a sequence for this tag'); + return seq; +} +function createPairs(schema, iterable, ctx) { + const { replacer } = ctx; + const pairs = new YAMLSeq(schema); + pairs.tag = 'tag:yaml.org,2002:pairs'; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === 'function') + it = replacer.call(iterable, String(i++), it); + let key, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value = it[1]; + } + else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } + else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value = it[key]; + } + else + throw new TypeError(`Expected { key: value } tuple: ${it}`); + } + else { + key = it; + } + pairs.items.push(createPair(key, value, ctx)); + } + return pairs; +} +const pairs = { + collection: 'seq', + default: false, + tag: 'tag:yaml.org,2002:pairs', + resolve: resolvePairs, + createNode: createPairs +}; + +class YAMLOMap extends YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + /** + * If `ctx` is given, the return type is actually `Map`, + * but TypeScript won't allow widening the signature of a child method. + */ + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map = new Map(); + if (ctx && ctx.onCreate) + ctx.onCreate(map); + for (const pair of this.items) { + let key, value; + if (isPair(pair)) { + key = toJS(pair.key, '', ctx); + value = toJS(pair.value, key, ctx); + } + else { + key = toJS(pair, '', ctx); + } + if (map.has(key)) + throw new Error('Ordered maps must not include duplicate keys'); + map.set(key, value); + } + return map; + } +} +YAMLOMap.tag = 'tag:yaml.org,2002:omap'; +const omap = { + collection: 'seq', + identify: value => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: 'tag:yaml.org,2002:omap', + resolve(seq, onError) { + const pairs = resolvePairs(seq, onError); + const seenKeys = []; + for (const { key } of pairs.items) { + if (isScalar(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } + else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs); + }, + createNode(schema, iterable, ctx) { + const pairs = createPairs(schema, iterable, ctx); + const omap = new YAMLOMap(); + omap.items = pairs.items; + return omap; + } +}; + +function boolStringify({ value, source }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value ? ctx.options.trueStr : ctx.options.falseStr; +} +const trueTag = { + identify: value => value === true, + default: true, + tag: 'tag:yaml.org,2002:bool', + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar(true), + stringify: boolStringify +}; +const falseTag = { + identify: value => value === false, + default: true, + tag: 'tag:yaml.org,2002:bool', + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i, + resolve: () => new Scalar(false), + stringify: boolStringify +}; + +const floatNaN = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + test: /^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === 'nan' + ? NaN + : str[0] === '-' + ? Number.NEGATIVE_INFINITY + : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + format: 'EXP', + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, '')), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +const float = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node = new Scalar(parseFloat(str.replace(/_/g, ''))); + const dot = str.indexOf('.'); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ''); + if (f[f.length - 1] === '0') + node.minFractionDigits = f.length; + } + return node; + }, + stringify: stringifyNumber +}; + +const intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value); +function intResolve(str, offset, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === '-' || sign === '+') + offset += 1; + str = str.substring(offset).replace(/_/g, ''); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n = BigInt(str); + return sign === '-' ? BigInt(-1) * n : n; + } + const n = parseInt(str, radix); + return sign === '-' ? -1 * n : n; +} +function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value)) { + const str = value.toString(radix); + return value < 0 ? '-' + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber(node); +} +const intBin = { + identify: intIdentify, + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'BIN', + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: node => intStringify(node, 2, '0b') +}; +const intOct = { + identify: intIdentify, + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'OCT', + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: node => intStringify(node, 8, '0') +}; +const int = { + identify: intIdentify, + default: true, + tag: 'tag:yaml.org,2002:int', + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex = { + identify: intIdentify, + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'HEX', + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: node => intStringify(node, 16, '0x') +}; + +class YAMLSet extends YAMLMap { + constructor(schema) { + super(schema); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (isPair(key)) + pair = key; + else if (typeof key === 'object' && + 'key' in key && + 'value' in key && + key.value === null) + pair = new Pair(key.key, null); + else + pair = new Pair(key, null); + const prev = findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + get(key, keepPair) { + const pair = findPair(this.items, key); + return !keepPair && isPair(pair) + ? isScalar(pair.key) + ? pair.key.value + : pair.key + : pair; + } + set(key, value) { + if (typeof value !== 'boolean') + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = findPair(this.items, key); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } + else if (!prev && value) { + this.items.push(new Pair(key)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error('Set items must all have null values'); + } +} +YAMLSet.tag = 'tag:yaml.org,2002:set'; +const set = { + collection: 'map', + identify: value => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: 'tag:yaml.org,2002:set', + resolve(map, onError) { + if (isMap(map)) { + if (map.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map); + else + onError('Set items must all have null values'); + } + else + onError('Expected a mapping for this tag'); + return map; + }, + createNode(schema, iterable, ctx) { + const { replacer } = ctx; + const set = new YAMLSet(schema); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === 'function') + value = replacer.call(iterable, value, value); + set.items.push(createPair(value, null, ctx)); + } + return set; + } +}; + +/** Internal types handle bigint as number, because TS can't figure it out. */ +function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === '-' || sign === '+' ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts + .replace(/_/g, '') + .split(':') + .reduce((res, p) => res * num(60) + num(p), num(0)); + return (sign === '-' ? num(-1) * res : res); +} +/** + * hhhh:mm:ss.sss + * + * Internal types handle bigint as number, because TS can't figure it out. + */ +function stringifySexagesimal(node) { + let { value } = node; + let num = (n) => n; + if (typeof value === 'bigint') + num = n => BigInt(n); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber(node); + let sign = ''; + if (value < 0) { + sign = '-'; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; // seconds, including ms + if (value < 60) { + parts.unshift(0); // at least one : is required + } + else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); // minutes + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); // hours + } + } + return (sign + + parts + .map(n => (n < 10 ? '0' + String(n) : String(n))) + .join(':') + .replace(/000000\d*$/, '') // % 60 may introduce error + ); +} +const intTime = { + identify: value => typeof value === 'bigint' || Number.isInteger(value), + default: true, + tag: 'tag:yaml.org,2002:int', + format: 'TIME', + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal +}; +const floatTime = { + identify: value => typeof value === 'number', + default: true, + tag: 'tag:yaml.org,2002:float', + format: 'TIME', + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: str => parseSexagesimal(str, false), + stringify: stringifySexagesimal +}; +const timestamp = { + identify: value => value instanceof Date, + default: true, + tag: 'tag:yaml.org,2002:timestamp', + // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part + // may be omitted altogether, resulting in a date format. In such a case, the time part is + // assumed to be 00:00:00Z (start of day, UTC). + test: RegExp('^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd + '(?:' + // time is optional + '(?:t|T|[ \\t]+)' + // t | T | whitespace + '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)? + '(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30 + ')?$'), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error('!!timestamp expects a date, starting with yyyy-mm-dd'); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + '00').substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== 'Z') { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 60000 * d; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, '') +}; + +const schema = [ + map, + seq, + string, + nullTag, + trueTag, + falseTag, + intBin, + intOct, + int, + intHex, + floatNaN, + floatExp, + float, + binary, + omap, + pairs, + set, + intTime, + floatTime, + timestamp +]; + +const schemas = new Map([ + ['core', schema$2], + ['failsafe', [map, seq, string]], + ['json', schema$1], + ['yaml11', schema], + ['yaml-1.1', schema] +]); +const tagsByName = { + binary, + bool: boolTag, + float: float$1, + floatExp: floatExp$1, + floatNaN: floatNaN$1, + floatTime, + int: int$1, + intHex: intHex$1, + intOct: intOct$1, + intTime, + map, + null: nullTag, + omap, + pairs, + seq, + set, + timestamp +}; +const coreKnownTags = { + 'tag:yaml.org,2002:binary': binary, + 'tag:yaml.org,2002:omap': omap, + 'tag:yaml.org,2002:pairs': pairs, + 'tag:yaml.org,2002:set': set, + 'tag:yaml.org,2002:timestamp': timestamp +}; +function getTags(customTags, schemaName) { + let tags = schemas.get(schemaName); + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()) + .filter(key => key !== 'yaml11') + .map(key => JSON.stringify(key)) + .join(', '); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } + else if (typeof customTags === 'function') { + tags = customTags(tags.slice()); + } + return tags.map(tag => { + if (typeof tag !== 'string') + return tag; + const tagObj = tagsByName[tag]; + if (tagObj) + return tagObj; + const keys = Object.keys(tagsByName) + .map(key => JSON.stringify(key)) + .join(', '); + throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`); + }); +} + +const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; +class Schema { + constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) + ? getTags(compat, 'compat') + : compat + ? getTags(null, compat) + : null; + this.merge = !!merge; + this.name = (typeof schema === 'string' && schema) || 'core'; + this.knownTags = resolveKnownTags ? coreKnownTags : {}; + this.tags = getTags(customTags, this.name); + this.toStringOptions = toStringDefaults || null; + Object.defineProperty(this, MAP, { value: map }); + Object.defineProperty(this, SCALAR$1, { value: string }); + Object.defineProperty(this, SEQ, { value: seq }); + // Used by createMap() + this.sortMapEntries = + sortMapEntries === true ? sortMapEntriesByKey : sortMapEntries || null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } +} + +function stringifyDocument(doc, options) { + const lines = []; + let hasDirectives = options.directives === true; + if (options.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } + else if (doc.directives.marker) + hasDirectives = true; + } + if (hasDirectives) + lines.push('---'); + const ctx = createStringifyContext(doc, options); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(''); + const cs = commentString(doc.commentBefore); + lines.unshift(indentComment(cs, '')); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(''); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(indentComment(cs, '')); + } + // top-level block scalars need to be indented if followed by a comment + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? undefined : () => (chompKeep = true); + let body = stringify$1(doc.contents, ctx, () => (contentComment = null), onChompKeep); + if (contentComment) + body += lineComment(body, '', commentString(contentComment)); + if ((body[0] === '|' || body[0] === '>') && + lines[lines.length - 1] === '---') { + // Top-level block scalars with a preceding doc marker ought to use the + // same line for their header. + lines[lines.length - 1] = `--- ${body}`; + } + else + lines.push(body); + } + else { + lines.push(stringify$1(doc.contents, ctx)); + } + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ''); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '') + lines.push(''); + lines.push(indentComment(commentString(dc), '')); + } + return lines.join('\n') + '\n'; +} + +/** + * Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec, + * in section 24.5.1.1 "Runtime Semantics: InternalizeJSONProperty" of the + * 2021 edition: https://tc39.es/ecma262/#sec-json.parse + * + * Includes extensions for handling Map and Set objects. + */ +function applyReviver(reviver, obj, key, val) { + if (val && typeof val === 'object') { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === undefined) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } + else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === undefined) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } + else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === undefined) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } + else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === undefined) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key, val); +} + +class Document { + constructor(value, replacer, options) { + /** A comment before this Document */ + this.commentBefore = null; + /** A comment immediately after this Document */ + this.comment = null; + /** Errors encountered during parsing. */ + this.errors = []; + /** Warnings encountered during parsing. */ + this.warnings = []; + Object.defineProperty(this, NODE_TYPE, { value: DOC }); + let _replacer = null; + if (typeof replacer === 'function' || Array.isArray(replacer)) { + _replacer = replacer; + } + else if (options === undefined && replacer) { + options = replacer; + replacer = undefined; + } + const opt = Object.assign({}, defaultOptions, options); + this.options = opt; + let { version } = opt; + if (options === null || options === void 0 ? void 0 : options.directives) { + this.directives = options.directives.atDocument(); + if (this.directives.yaml.explicit) + version = this.directives.yaml.version; + } + else + this.directives = new Directives({ version }); + this.setSchema(version, options); + if (value === undefined) + this.contents = null; + else { + this.contents = this.createNode(value, _replacer, options); + } + } + /** + * Create a deep copy of this Document and its contents. + * + * Custom Node values that inherit from `Object` still refer to their original instances. + */ + clone() { + const copy = Object.create(Document.prototype, { + [NODE_TYPE]: { value: DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = isNode(this.contents) + ? this.contents.clone(copy.schema) + : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** Adds a value to the document. */ + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + /** Adds a value to the document. */ + addIn(path, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path, value); + } + /** + * Create a new `Alias` node, ensuring that the target `node` has the required anchor. + * + * If `node` already has an anchor, `name` is ignored. + * Otherwise, the `node.anchor` value will be set to `name`, + * or if an anchor with that name is already present in the document, + * `name` will be used as a prefix for a new unique anchor. + * If `name` is undefined, the generated anchor will use 'a' as a prefix. + */ + createAlias(node, name) { + if (!node.anchor) { + const prev = anchorNames(this); + node.anchor = + !name || prev.has(name) ? findNewAnchor(name || 'a', prev) : name; + } + return new Alias(node.anchor); + } + createNode(value, replacer, options) { + let _replacer = undefined; + if (typeof replacer === 'function') { + value = replacer.call({ '': value }, '', value); + _replacer = replacer; + } + else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === 'number' || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } + else if (options === undefined && replacer) { + options = replacer; + replacer = undefined; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options || {}; + const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors(this, anchorPrefix || 'a'); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects !== null && aliasDuplicateObjects !== void 0 ? aliasDuplicateObjects : true, + keepUndefined: keepUndefined !== null && keepUndefined !== void 0 ? keepUndefined : false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node = createNode(value, tag, ctx); + if (flow && isCollection(node)) + node.flow = true; + setAnchors(); + return node; + } + /** + * Convert a key and a value into a `Pair` using the current schema, + * recursively wrapping all values as `Scalar` or `Collection` nodes. + */ + createPair(key, value, options = {}) { + const k = this.createNode(key, null, options); + const v = this.createNode(value, null, options); + return new Pair(k, v); + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + deleteIn(path) { + if (isEmptyPath(path)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) + ? this.contents.deleteIn(path) + : false; + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + get(key, keepScalar) { + return isCollection(this.contents) + ? this.contents.get(key, keepScalar) + : undefined; + } + /** + * Returns item at `path`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path, keepScalar) { + if (isEmptyPath(path)) + return !keepScalar && isScalar(this.contents) + ? this.contents.value + : this.contents; + return isCollection(this.contents) + ? this.contents.getIn(path, keepScalar) + : undefined; + } + /** + * Checks if the document includes a value with the key `key`. + */ + has(key) { + return isCollection(this.contents) ? this.contents.has(key) : false; + } + /** + * Checks if the document includes a value at `path`. + */ + hasIn(path) { + if (isEmptyPath(path)) + return this.contents !== undefined; + return isCollection(this.contents) ? this.contents.hasIn(path) : false; + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + set(key, value) { + if (this.contents == null) { + this.contents = collectionFromPath(this.schema, [key], value); + } + else if (assertCollection(this.contents)) { + this.contents.set(key, value); + } + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path, value) { + if (isEmptyPath(path)) + this.contents = value; + else if (this.contents == null) { + this.contents = collectionFromPath(this.schema, Array.from(path), value); + } + else if (assertCollection(this.contents)) { + this.contents.setIn(path, value); + } + } + /** + * Change the YAML version and schema used by the document. + * A `null` version disables support for directives, explicit tags, anchors, and aliases. + * It also requires the `schema` option to be given as a `Schema` instance value. + * + * Overrides all previously set schema options. + */ + setSchema(version, options = {}) { + if (typeof version === 'number') + version = String(version); + let opt; + switch (version) { + case '1.1': + if (this.directives) + this.directives.yaml.version = '1.1'; + else + this.directives = new Directives({ version: '1.1' }); + opt = { merge: true, resolveKnownTags: false, schema: 'yaml-1.1' }; + break; + case '1.2': + if (this.directives) + this.directives.yaml.version = '1.2'; + else + this.directives = new Directives({ version: '1.2' }); + opt = { merge: false, resolveKnownTags: true, schema: 'core' }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + // Not using `instanceof Schema` to allow for duck typing + if (options.schema instanceof Object) + this.schema = options.schema; + else if (opt) + this.schema = new Schema(Object.assign(opt, options)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + // json & jsonArg are only used from toJSON() + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100, + stringify: stringify$1 + }; + const res = toJS(this.contents, jsonArg || '', ctx); + if (typeof onAnchor === 'function') + for (const { count, res } of ctx.anchors.values()) + onAnchor(res, count); + return typeof reviver === 'function' + ? applyReviver(reviver, { '': res }, '', res) + : res; + } + /** + * A JSON representation of the document `contents`. + * + * @param jsonArg Used by `JSON.stringify` to indicate the array index or + * property name. + */ + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + /** A YAML representation of the document. */ + toString(options = {}) { + if (this.errors.length > 0) + throw new Error('Document with errors cannot be stringified'); + if ('indent' in options && + (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { + const s = JSON.stringify(options.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument(this, options); + } +} +function assertCollection(contents) { + if (isCollection(contents)) + return true; + throw new Error('Expected a YAML collection as document contents'); +} + +class YAMLError extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } +} +class YAMLParseError extends YAMLError { + constructor(pos, code, message) { + super('YAMLParseError', pos, code, message); + } +} +class YAMLWarning extends YAMLError { + constructor(pos, code, message) { + super('YAMLWarning', pos, code, message); + } +} +const prettifyError = (src, lc) => (error) => { + if (error.pos[0] === -1) + return; + error.linePos = error.pos.map(pos => lc.linePos(pos)); + const { line, col } = error.linePos[0]; + error.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src + .substring(lc.lineStarts[line - 1], lc.lineStarts[line]) + .replace(/[\n\r]+$/, ''); + // Trim to max 80 chars, keeping col position near the middle + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = '…' + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + '…'; + // Include previous line in context if pointing at line start + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + // Regexp won't match if start is trimmed + let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + '…\n'; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.min(end.col - col, 80 - ci); + } + const pointer = ' '.repeat(ci) + '^'.repeat(count); + error.message += `:\n\n${lineStr}\n${pointer}\n`; + } +}; + +function resolveProps(tokens, { flow, indicator, next, offset, onError, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ''; + let commentSep = ''; + let hasNewline = false; + let reqSpace = false; + let anchor = null; + let tag = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== 'space' && + token.type !== 'newline' && + token.type !== 'comma') + onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space'); + reqSpace = false; + } + switch (token.type) { + case 'space': + // At the doc level, tabs at line start may be parsed + // as leading white space rather than indentation. + // In a flow collection, only the parser handles indent. + if (!flow && + atNewline && + indicator !== 'doc-start' && + token.source[0] === '\t') + onError(token, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation'); + hasSpace = true; + break; + case 'comment': { + if (!hasSpace) + onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters'); + const cb = token.source.substring(1) || ' '; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ''; + atNewline = false; + break; + } + case 'newline': + if (atNewline) { + if (comment) + comment += token.source; + else + spaceBefore = true; + } + else + commentSep += token.source; + atNewline = true; + hasNewline = true; + hasSpace = true; + break; + case 'anchor': + if (anchor) + onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor'); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case 'tag': { + if (tag) + onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag'); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + // Could here handle preceding comments differently + if (anchor || tag) + onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow || 'collection'}`); + found = token; + atNewline = false; + hasSpace = false; + break; + case 'comma': + if (flow) { + if (comma) + onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + // else fallthrough + default: + onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset; + if (reqSpace && + next && + next.type !== 'space' && + next.type !== 'newline' && + next.type !== 'comma' && + (next.type !== 'scalar' || next.source !== '')) + onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space'); + return { + comma, + found, + spaceBefore, + comment, + hasNewline, + anchor, + tag, + end, + start: start !== null && start !== void 0 ? start : end + }; +} + +function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case 'alias': + case 'scalar': + case 'double-quoted-scalar': + case 'single-quoted-scalar': + if (key.source.includes('\n')) + return true; + if (key.end) + for (const st of key.end) + if (st.type === 'newline') + return true; + return false; + case 'flow-collection': + for (const it of key.items) { + for (const st of it.start) + if (st.type === 'newline') + return true; + if (it.sep) + for (const st of it.sep) + if (st.type === 'newline') + return true; + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } +} + +function flowIndentCheck(indent, fc, onError) { + if ((fc === null || fc === void 0 ? void 0 : fc.type) === 'flow-collection') { + const end = fc.end[0]; + if (end.indent === indent && + (end.source === ']' || end.source === '}') && + containsNewline(fc)) { + const msg = 'Flow end indicator should be more indented than parent'; + onError(end, 'BAD_INDENT', msg, true); + } + } +} + +function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === 'function' + ? uniqueKeys + : (a, b) => a === b || + (isScalar(a) && + isScalar(b) && + a.value === b.value && + !(a.value === '<<' && ctx.schema.merge)); + return items.some(pair => isEqual(pair.key, search)); +} + +const startColMsg = 'All mapping items must start at the same column'; +function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) { + var _a; + const map = new YAMLMap(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bm.offset; + for (const collItem of bm.items) { + const { start, key, sep, value } = collItem; + // key properties + const keyProps = resolveProps(start, { + indicator: 'explicit-key-ind', + next: key || (sep === null || sep === void 0 ? void 0 : sep[0]), + offset, + onError, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === 'block-seq') + onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key'); + else if ('indent' in key && key.indent !== bm.indent) + onError(offset, 'BAD_INDENT', startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep) { + // TODO: assert being at last item? + if (keyProps.comment) { + if (map.comment) + map.comment += '\n' + keyProps.comment; + else + map.comment = keyProps.comment; + } + continue; + } + } + else if (((_a = keyProps.found) === null || _a === void 0 ? void 0 : _a.indent) !== bm.indent) + onError(offset, 'BAD_INDENT', startColMsg); + if (implicitKey && containsNewline(key)) + onError(key, // checked by containsNewline() + 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line'); + // key value + const keyStart = keyProps.end; + const keyNode = key + ? composeNode(ctx, key, keyProps, onError) + : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, key, onError); + if (mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique'); + // value properties + const valueProps = resolveProps(sep || [], { + indicator: 'map-value-ind', + next: value, + offset: keyNode.range[2], + onError, + startOnNewline: !key || key.type === 'block-scalar' + }); + offset = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value === null || value === void 0 ? void 0 : value.type) === 'block-map' && !valueProps.hasNewline) + onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings'); + if (ctx.options.strict && + keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key'); + } + // value value + const valueNode = value + ? composeNode(ctx, value, valueProps, onError) + : composeEmptyNode(ctx, offset, sep, null, valueProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, value, onError); + offset = valueNode.range[2]; + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } + else { + // key with no value + if (implicitKey) + onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values'); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += '\n' + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } + } + map.range = [bm.offset, offset, offset]; + return map; +} + +function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) { + const seq = new YAMLSeq(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bs.offset; + for (const { start, value } of bs.items) { + const props = resolveProps(start, { + indicator: 'seq-item-ind', + next: value, + offset, + onError, + startOnNewline: true + }); + offset = props.end; + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === 'block-seq') + onError(offset, 'BAD_INDENT', 'All sequence items must start at the same column'); + else + onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator'); + } + else { + // TODO: assert being at last item? + if (props.comment) + seq.comment = props.comment; + continue; + } + } + const node = value + ? composeNode(ctx, value, props, onError) + : composeEmptyNode(ctx, offset, start, null, props, onError); + if (ctx.schema.compat) + flowIndentCheck(bs.indent, value, onError); + offset = node.range[2]; + seq.items.push(node); + } + seq.range = [bs.offset, offset, offset]; + return seq; +} + +function resolveEnd(end, offset, reqSpace, onError) { + let comment = ''; + if (end) { + let hasSpace = false; + let sep = ''; + for (const token of end) { + const { source, type } = token; + switch (type) { + case 'space': + hasSpace = true; + break; + case 'comment': { + if (reqSpace && !hasSpace) + onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters'); + const cb = source.substring(1) || ' '; + if (!comment) + comment = cb; + else + comment += sep + cb; + sep = ''; + break; + } + case 'newline': + if (comment) + sep += source; + hasSpace = true; + break; + default: + onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`); + } + offset += source.length; + } + } + return { comment, offset }; +} + +const blockMsg = 'Block collections are not allowed within flow collections'; +const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq'); +function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError) { + const isMap = fc.start.source === '{'; + const fcName = isMap ? 'flow map' : 'flow sequence'; + const coll = isMap + ? new YAMLMap(ctx.schema) + : new YAMLSeq(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + let offset = fc.offset + fc.start.source.length; + for (let i = 0; i < fc.items.length; ++i) { + const collItem = fc.items[i]; + const { start, key, sep, value } = collItem; + const props = resolveProps(start, { + flow: fcName, + indicator: 'explicit-key-ind', + next: key || (sep === null || sep === void 0 ? void 0 : sep[0]), + offset, + onError, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep && !value) { + if (i === 0 && props.comma) + onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += '\n' + props.comment; + else + coll.comment = props.comment; + } + offset = props.end; + continue; + } + if (!isMap && ctx.options.strict && containsNewline(key)) + onError(key, // checked by containsNewline() + 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line'); + } + if (i === 0) { + if (props.comma) + onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`); + } + else { + if (!props.comma) + onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ''; + loop: for (const st of start) { + switch (st.type) { + case 'comma': + case 'space': + break; + case 'comment': + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (isPair(prev)) + prev = prev.value || prev.key; + if (prev.comment) + prev.comment += '\n' + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap && !sep && !props.found) { + // item is a value in a seq + // → key & sep are empty, start does not include ? or : + const valueNode = value + ? composeNode(ctx, value, props, onError) + : composeEmptyNode(ctx, props.end, sep, null, props, onError); + coll.items.push(valueNode); + offset = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg); + } + else { + // item is a key+value pair + // key value + const keyStart = props.end; + const keyNode = key + ? composeNode(ctx, key, props, onError) + : composeEmptyNode(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg); + // value properties + const valueProps = resolveProps(sep || [], { + flow: fcName, + indicator: 'map-value-ind', + next: value, + offset: keyNode.range[2], + onError, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap && !props.found && ctx.options.strict) { + if (sep) + for (const st of sep) { + if (st === valueProps.found) + break; + if (st.type === 'newline') { + onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line'); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key'); + } + } + else if (value) { + if ('source' in value && value.source && value.source[0] === ':') + onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`); + else + onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`); + } + // value value + const valueNode = value + ? composeNode(ctx, value, valueProps, onError) + : valueProps.found + ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError) + : null; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg); + } + else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += '\n' + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap) { + const map = coll; + if (mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique'); + map.items.push(pair); + } + else { + const map = new YAMLMap(ctx.schema); + map.flow = true; + map.items.push(pair); + coll.items.push(map); + } + offset = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap ? '}' : ']'; + const [ce, ...ee] = fc.end; + let cePos = offset; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot + ? `${name} must end with a ${expectedEnd}` + : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += '\n' + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } + else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; +} + +function composeCollection(CN, ctx, token, tagToken, onError) { + let coll; + switch (token.type) { + case 'block-map': { + coll = resolveBlockMap(CN, ctx, token, onError); + break; + } + case 'block-seq': { + coll = resolveBlockSeq(CN, ctx, token, onError); + break; + } + case 'flow-collection': { + coll = resolveFlowCollection(CN, ctx, token, onError); + break; + } + } + if (!tagToken) + return coll; + const tagName = ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg)); + if (!tagName) + return coll; + // Cast needed due to: https://github.com/Microsoft/TypeScript/issues/3841 + const Coll = coll.constructor; + if (tagName === '!' || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + const expType = isMap(coll) ? 'map' : 'seq'; + let tag = ctx.schema.tags.find(t => t.collection === expType && t.tag === tagName); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } + else { + onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true); + coll.tag = tagName; + return coll; + } + } + const res = tag.resolve(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options); + const node = isNode(res) + ? res + : new Scalar(res); + node.range = coll.range; + node.tag = tagName; + if (tag === null || tag === void 0 ? void 0 : tag.format) + node.format = tag.format; + return node; +} + +function resolveBlockScalar(scalar, strict, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, strict, onError); + if (!header) + return { value: '', type: null, comment: '', range: [start, start, start] }; + const type = header.mode === '>' ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + // determine the end of content & start of chomping + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === '' || content === '\r') + chompStart = i; + else + break; + } + // shortcut for empty contents + if (!scalar.source || chompStart === 0) { + const value = header.chomp === '+' ? '\n'.repeat(Math.max(0, lines.length - 1)) : ''; + let end = start + header.length; + if (scalar.source) + end += scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; + } + // find the indentation level to trim from start + let trimIndent = scalar.indent + header.indent; + let offset = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === '' || content === '\r') { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } + else { + if (indent.length < trimIndent) { + const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator'; + onError(offset + indent.length, 'MISSING_CHAR', message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + break; + } + offset += indent.length + content.length + 1; + } + let value = ''; + let sep = ''; + let prevMoreIndented = false; + // leading whitespace is kept intact + for (let i = 0; i < contentStart; ++i) + value += lines[i][0].slice(trimIndent) + '\n'; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset += indent.length + content.length + 1; + const crlf = content[content.length - 1] === '\r'; + if (crlf) + content = content.slice(0, -1); + /* istanbul ignore if already caught in lexer */ + if (content && indent.length < trimIndent) { + const src = header.indent + ? 'explicit indentation indicator' + : 'first line'; + const message = `Block scalar lines must not be less indented than their ${src}`; + onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message); + indent = ''; + } + if (type === Scalar.BLOCK_LITERAL) { + value += sep + indent.slice(trimIndent) + content; + sep = '\n'; + } + else if (indent.length > trimIndent || content[0] === '\t') { + // more-indented content within a folded block + if (sep === ' ') + sep = '\n'; + else if (!prevMoreIndented && sep === '\n') + sep = '\n\n'; + value += sep + indent.slice(trimIndent) + content; + sep = '\n'; + prevMoreIndented = true; + } + else if (content === '') { + // empty line + if (sep === '\n') + value += '\n'; + else + sep = '\n'; + } + else { + value += sep + content; + sep = ' '; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case '-': + break; + case '+': + for (let i = chompStart; i < lines.length; ++i) + value += '\n' + lines[i][0].slice(trimIndent); + if (value[value.length - 1] !== '\n') + value += '\n'; + break; + default: + value += '\n'; + } + const end = start + header.length + scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; +} +function parseBlockScalarHeader({ offset, props }, strict, onError) { + /* istanbul ignore if should not happen */ + if (props[0].type !== 'block-scalar-header') { + onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found'); + return null; + } + const { source } = props[0]; + const mode = source[0]; + let indent = 0; + let chomp = ''; + let error = -1; + for (let i = 1; i < source.length; ++i) { + const ch = source[i]; + if (!chomp && (ch === '-' || ch === '+')) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error === -1) + error = offset + i; + } + } + if (error !== -1) + onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ''; + let length = source.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case 'space': + hasSpace = true; + // fallthrough + case 'newline': + length += token.source.length; + break; + case 'comment': + if (strict && !hasSpace) { + const message = 'Comments must be separated from other tokens by white space characters'; + onError(token, 'MISSING_CHAR', message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case 'error': + onError(token, 'UNEXPECTED_TOKEN', token.message); + length += token.source.length; + break; + /* istanbul ignore next should not happen */ + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, 'UNEXPECTED_TOKEN', message); + const ts = token.source; + if (ts && typeof ts === 'string') + length += ts.length; + } + } + } + return { mode, indent, chomp, comment, length }; +} +/** @returns Array of lines split up as `[indent, content]` */ +function splitLines(source) { + const split = source.split(/\n( *)/); + const first = split[0]; + const m = first.match(/^( *)/); + const line0 = m && m[1] ? [m[1], first.slice(m[1].length)] : ['', first]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; +} + +function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case 'scalar': + _type = Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case 'single-quoted-scalar': + _type = Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case 'double-quoted-scalar': + _type = Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + /* istanbul ignore next should not happen */ + default: + onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`); + return { + value: '', + type: null, + comment: '', + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; +} +function plainValue(source, onError) { + let badChar = ''; + switch (source[0]) { + /* istanbul ignore next should not happen */ + case '\t': + badChar = 'a tab character'; + break; + case ',': + badChar = 'flow indicator character ,'; + break; + case '%': + badChar = 'directive indicator character %'; + break; + case '|': + case '>': { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case '@': + case '`': { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`); + return foldLines(source); +} +function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, 'MISSING_CHAR', "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source) { + /** + * The negative lookbehind here and in the `re` RegExp is to + * prevent causing a polynomial search time in certain cases. + * + * The try-catch is for Safari, which doesn't support this yet: + * https://caniuse.com/js-regexp-lookbehind + */ + let first, line; + try { + first = new RegExp('(.*?)(? wsStart ? source.slice(wsStart, i + 1) : ch; + } + else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, 'MISSING_CHAR', 'Missing closing "quote'); + return res; +} +/** + * Fold a single newline into a space, multiple newlines to N - 1 newlines. + * Presumes `source[offset] === '\n'` + */ +function foldNewline(source, offset) { + let fold = ''; + let ch = source[offset + 1]; + while (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') { + if (ch === '\r' && source[offset + 2] !== '\n') + break; + if (ch === '\n') + fold += '\n'; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = ' '; + return { fold, offset }; +} +const escapeCodes = { + '0': '\0', + a: '\x07', + b: '\b', + e: '\x1b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\v', + N: '\u0085', + _: '\u00a0', + L: '\u2028', + P: '\u2029', + ' ': ' ', + '"': '"', + '/': '/', + '\\': '\\', + '\t': '\t' +}; +function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} + +function composeScalar(ctx, token, tagToken, onError) { + const { value, type, comment, range } = token.type === 'block-scalar' + ? resolveBlockScalar(token, ctx.options.strict, onError) + : resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken + ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg)) + : null; + const tag = tagToken && tagName + ? findScalarTagByName(ctx.schema, value, tagName, tagToken, onError) + : token.type === 'scalar' + ? findScalarTagByTest(ctx, value, token, onError) + : ctx.schema[SCALAR$1]; + let scalar; + try { + const res = tag.resolve(value, msg => onError(tagToken || token, 'TAG_RESOLVE_FAILED', msg), ctx.options); + scalar = isScalar(res) ? res : new Scalar(res); + } + catch (error) { + const msg = error instanceof Error ? error.message : String(error); + onError(tagToken || token, 'TAG_RESOLVE_FAILED', msg); + scalar = new Scalar(value); + } + scalar.range = range; + scalar.source = value; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; +} +function findScalarTagByName(schema, value, tagName, tagToken, onError) { + var _a; + if (tagName === '!') + return schema[SCALAR$1]; // non-specific tag + const matchWithTest = []; + for (const tag of schema.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)) + return tag; + const kt = schema.knownTags[tagName]; + if (kt && !kt.collection) { + // Ensure that the known tag is available for stringifying, + // but does not get used by default. + schema.tags.push(Object.assign({}, kt, { default: false, test: undefined })); + return kt; + } + onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str'); + return schema[SCALAR$1]; +} +function findScalarTagByTest({ directives, schema }, value, token, onError) { + const tag = schema.tags.find(tag => { var _a; return tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)); }) || schema[SCALAR$1]; + if (schema.compat) { + const compat = schema.compat.find(tag => { var _a; return tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)); }) || + schema[SCALAR$1]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, 'TAG_RESOLVE_FAILED', msg, true); + } + } + return tag; +} + +function emptyScalarPosition(offset, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case 'space': + case 'comment': + case 'newline': + offset -= st.source.length; + continue; + } + // Technically, an empty scalar is immediately after the last non-empty + // node, but it's more useful to place it after any whitespace. + st = before[++i]; + while ((st === null || st === void 0 ? void 0 : st.type) === 'space') { + offset += st.source.length; + st = before[++i]; + } + break; + } + } + return offset; +} + +const CN = { composeNode, composeEmptyNode }; +function composeNode(ctx, token, props, onError) { + const { spaceBefore, comment, anchor, tag } = props; + let node; + switch (token.type) { + case 'alias': + node = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties'); + break; + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': + case 'block-scalar': + node = composeScalar(ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + case 'block-map': + case 'block-seq': + case 'flow-collection': + node = composeCollection(CN, ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + default: + console.log(token); + throw new Error(`Unsupporten token type: ${token.type}`); + } + if (anchor && node.anchor === '') + onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string'); + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + if (token.type === 'scalar' && token.source === '') + node.comment = comment; + else + node.commentBefore = comment; + } + if (ctx.options.keepSourceTokens) + node.srcToken = token; + return node; +} +function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag }, onError) { + const token = { + type: 'scalar', + offset: emptyScalarPosition(offset, before, pos), + indent: -1, + source: '' + }; + const node = composeScalar(ctx, token, tag, onError); + if (anchor) { + node.anchor = anchor.source.substring(1); + if (node.anchor === '') + onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string'); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) + node.comment = comment; + return node; +} +function composeAlias({ options }, { offset, source, end }, onError) { + const alias = new Alias(source.substring(1)); + if (alias.source === '') + onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string'); + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, options.strict, onError); + alias.range = [offset, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; +} + +function composeDoc(options, directives, { offset, start, value, end }, onError) { + const opts = Object.assign({ directives }, options); + const doc = new Document(undefined, opts); + const ctx = { + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps(start, { + indicator: 'doc-start', + next: value || (end === null || end === void 0 ? void 0 : end[0]), + offset, + onError, + startOnNewline: true + }); + if (props.found) { + doc.directives.marker = true; + if (value && + (value.type === 'block-map' || value.type === 'block-seq') && + !props.hasNewline) + onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker'); + } + doc.contents = value + ? composeNode(ctx, value, props, onError) + : composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset, contentEnd, re.offset]; + return doc; +} + +function getErrorPos(src) { + if (typeof src === 'number') + return [src, src + 1]; + if (Array.isArray(src)) + return src.length === 2 ? src : [src[0], src[1]]; + const { offset, source } = src; + return [offset, offset + (typeof source === 'string' ? source.length : 1)]; +} +function parsePrelude(prelude) { + var _a; + let comment = ''; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source = prelude[i]; + switch (source[0]) { + case '#': + comment += + (comment === '' ? '' : afterEmptyLine ? '\n\n' : '\n') + + (source.substring(1) || ' '); + atComment = true; + afterEmptyLine = false; + break; + case '%': + if (((_a = prelude[i + 1]) === null || _a === void 0 ? void 0 : _a[0]) !== '#') + i += 1; + atComment = false; + break; + default: + // This may be wrong after doc-end, but in that case it doesn't matter + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; +} +/** + * Compose a stream of CST nodes into a stream of YAML Documents. + * + * ```ts + * import { Composer, Parser } from 'yaml' + * + * const src: string = ... + * const tokens = new Parser().parse(src) + * const docs = new Composer().compose(tokens) + * ``` + */ +class Composer { + constructor(options = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new YAMLWarning(pos, code, message)); + else + this.errors.push(new YAMLParseError(pos, code, message)); + }; + this.directives = new Directives({ + version: options.version || defaultOptions.version + }); + this.options = options; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + //console.log({ dc: doc.comment, prelude, comment }) + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment}\n${comment}` : comment; + } + else if (afterEmptyLine || doc.directives.marker || !dc) { + doc.commentBefore = comment; + } + else if (isCollection(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment}\n${cb}` : comment; + } + else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment}\n${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } + else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + /** + * Current stream status information. + * + * Mostly useful at the end of input for an empty stream. + */ + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + /** + * Compose tokens into documents. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + /** Advance the composer by one CST token. */ + *next(token) { + switch (token.type) { + case 'directive': + this.directives.add(token.source, (offset, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset; + this.onError(pos, 'BAD_DIRECTIVE', message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case 'document': { + const doc = composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.marker) + this.onError(token, 'MISSING_CHAR', 'Missing directives-end indicator line'); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case 'byte-order-mark': + case 'space': + break; + case 'comment': + case 'newline': + this.prelude.push(token.source); + break; + case 'error': { + const msg = token.source + ? `${token.message}: ${JSON.stringify(token.source)}` + : token.message; + const error = new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg); + if (this.atDirectives || !this.doc) + this.errors.push(error); + else + this.doc.errors.push(error); + break; + } + case 'doc-end': { + if (!this.doc) { + const msg = 'Unexpected doc-end without preceding document'; + this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg)); + break; + } + const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc}\n${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`)); + } + } + /** + * Call at end of input to yield any remaining document. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } + else if (forceDoc) { + const opts = Object.assign({ directives: this.directives }, this.options); + const doc = new Document(undefined, opts); + if (this.atDirectives) + this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line'); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } +} + +/** + * Set the value of `token` to the given string `value`, overwriting any previous contents and type that it may have. + * + * Best efforts are made to retain any comments previously associated with the `token`, + * though all contents within a collection's `items` will be overwritten. + * + * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`, + * as this function does not support any schema operations and won't check for such conflicts. + * + * @param token Any token. If it does not include an `indent` value, the value will be stringified as if it were an implicit key. + * @param value The string representation of the value, which will have its content properly indented. + * @param context.afterKey In most cases, values after a key should have an additional level of indentation. + * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value. + * @param context.inFlow Being within a flow collection may affect the resolved type of the token's value. + * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`. + */ +function setScalarValue(token, value, context = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type } = context; + let indent = 'indent' in token ? token.indent : null; + if (afterKey && typeof indent === 'number') + indent += 2; + if (!type) + switch (token.type) { + case 'single-quoted-scalar': + type = 'QUOTE_SINGLE'; + break; + case 'double-quoted-scalar': + type = 'QUOTE_DOUBLE'; + break; + case 'block-scalar': { + const header = token.props[0]; + if (header.type !== 'block-scalar-header') + throw new Error('Invalid block scalar header'); + type = header.source[0] === '>' ? 'BLOCK_FOLDED' : 'BLOCK_LITERAL'; + break; + } + default: + type = 'PLAIN'; + } + const source = stringifyString({ type, value }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? ' '.repeat(indent) : '', + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source[0]) { + case '|': + case '>': + setBlockScalarValue(token, source); + break; + case '"': + setFlowScalarValue(token, source, 'double-quoted-scalar'); + break; + case "'": + setFlowScalarValue(token, source, 'single-quoted-scalar'); + break; + default: + setFlowScalarValue(token, source, 'scalar'); + } +} +function setBlockScalarValue(token, source) { + const he = source.indexOf('\n'); + const head = source.substring(0, he); + const body = source.substring(he + 1) + '\n'; + if (token.type === 'block-scalar') { + const header = token.props[0]; + if (header.type !== 'block-scalar-header') + throw new Error('Invalid block scalar header'); + header.source = head; + token.source = body; + } + else { + const { offset } = token; + const indent = 'indent' in token ? token.indent : -1; + const props = [ + { type: 'block-scalar-header', offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, 'end' in token ? token.end : undefined)) + props.push({ type: 'newline', offset: -1, indent, source: '\n' }); + for (const key of Object.keys(token)) + if (key !== 'type' && key !== 'offset') + delete token[key]; + Object.assign(token, { type: 'block-scalar', indent, props, source: body }); + } +} +/** @returns `true` if last token is a newline */ +function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case 'space': + case 'comment': + props.push(st); + break; + case 'newline': + props.push(st); + return true; + } + return false; +} +function setFlowScalarValue(token, source, type) { + switch (token.type) { + case 'scalar': + case 'double-quoted-scalar': + case 'single-quoted-scalar': + token.type = type; + token.source = source; + break; + case 'block-scalar': { + const end = token.props.slice(1); + let oa = source.length; + if (token.props[0].type === 'block-scalar-header') + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type, source, end }); + break; + } + case 'block-map': + case 'block-seq': { + const offset = token.offset + source.length; + const nl = { type: 'newline', offset, indent: token.indent, source: '\n' }; + delete token.items; + Object.assign(token, { type, source, end: [nl] }); + break; + } + default: { + const indent = 'indent' in token ? token.indent : -1; + const end = 'end' in token && Array.isArray(token.end) + ? token.end.filter(st => st.type === 'space' || + st.type === 'comment' || + st.type === 'newline') + : []; + for (const key of Object.keys(token)) + if (key !== 'type' && key !== 'offset') + delete token[key]; + Object.assign(token, { type, indent, source, end }); + } + } +} + +/** + * Stringify a CST document, token, or collection item + * + * Fair warning: This applies no validation whatsoever, and + * simply concatenates the sources in their logical order. + */ +const stringify = (cst) => 'type' in cst ? stringifyToken(cst) : stringifyItem(cst); +function stringifyToken(token) { + switch (token.type) { + case 'block-scalar': { + let res = ''; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case 'block-map': + case 'block-seq': { + let res = ''; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case 'flow-collection': { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case 'document': { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ('end' in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } +} +function stringifyItem({ start, key, sep, value }) { + let res = ''; + for (const st of start) + res += st.source; + if (key) + res += stringifyToken(key); + if (sep) + for (const st of sep) + res += st.source; + if (value) + res += stringifyToken(value); + return res; +} + +/** The byte order mark */ +const BOM = '\u{FEFF}'; +/** Start of doc-mode */ +const DOCUMENT = '\x02'; // C0: Start of Text +/** Unexpected end of flow-mode */ +const FLOW_END = '\x18'; // C0: Cancel +/** Next token is a scalar value */ +const SCALAR = '\x1f'; // C0: Unit Separator +/** Identify the type of a lexer token. May return `null` for unknown tokens. */ +function tokenType(source) { + switch (source) { + case BOM: + return 'byte-order-mark'; + case DOCUMENT: + return 'doc-mode'; + case FLOW_END: + return 'flow-error-end'; + case SCALAR: + return 'scalar'; + case '---': + return 'doc-start'; + case '...': + return 'doc-end'; + case '': + case '\n': + case '\r\n': + return 'newline'; + case '-': + return 'seq-item-ind'; + case '?': + return 'explicit-key-ind'; + case ':': + return 'map-value-ind'; + case '{': + return 'flow-map-start'; + case '}': + return 'flow-map-end'; + case '[': + return 'flow-seq-start'; + case ']': + return 'flow-seq-end'; + case ',': + return 'comma'; + } + switch (source[0]) { + case ' ': + case '\t': + return 'space'; + case '#': + return 'comment'; + case '%': + return 'directive-line'; + case '*': + return 'alias'; + case '&': + return 'anchor'; + case '!': + return 'tag'; + case "'": + return 'single-quoted-scalar'; + case '"': + return 'double-quoted-scalar'; + case '|': + case '>': + return 'block-scalar-header'; + } + return null; +} + +/* +START -> stream + +stream + directive -> line-end -> stream + indent + line-end -> stream + [else] -> line-start + +line-end + comment -> line-end + newline -> . + input-end -> END + +line-start + doc-start -> doc + doc-end -> stream + [else] -> indent -> block-start + +block-start + seq-item-start -> block-start + explicit-key-start -> block-start + map-value-start -> block-start + [else] -> doc + +doc + line-end -> line-start + spaces -> doc + anchor -> doc + tag -> doc + flow-start -> flow -> doc + flow-end -> error -> doc + seq-item-start -> error -> doc + explicit-key-start -> error -> doc + map-value-start -> doc + alias -> doc + quote-start -> quoted-scalar -> doc + block-scalar-header -> line-end -> block-scalar(min) -> line-start + [else] -> plain-scalar(false, min) -> doc + +flow + line-end -> flow + spaces -> flow + anchor -> flow + tag -> flow + flow-start -> flow -> flow + flow-end -> . + seq-item-start -> error -> flow + explicit-key-start -> flow + map-value-start -> flow + alias -> flow + quote-start -> quoted-scalar -> flow + comma -> flow + [else] -> plain-scalar(true, 0) -> flow + +quoted-scalar + quote-end -> . + [else] -> quoted-scalar + +block-scalar(min) + newline + peek(indent < min) -> . + [else] -> block-scalar(min) + +plain-scalar(is-flow, min) + scalar-end(is-flow) -> . + peek(newline + (indent < min)) -> . + [else] -> plain-scalar(min) +*/ +function isEmpty(ch) { + switch (ch) { + case undefined: + case ' ': + case '\n': + case '\r': + case '\t': + return true; + default: + return false; + } +} +const hexDigits = '0123456789ABCDEFabcdef'.split(''); +const tagChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(''); +const invalidFlowScalarChars = ',[]{}'.split(''); +const invalidAnchorChars = ' ,[]{}\n\r\t'.split(''); +const isNotAnchorChar = (ch) => !ch || invalidAnchorChars.includes(ch); +/** + * Splits an input string into lexical tokens, i.e. smaller strings that are + * easily identifiable by `tokens.tokenType()`. + * + * Lexing starts always in a "stream" context. Incomplete input may be buffered + * until a complete token can be emitted. + * + * In addition to slices of the original input, the following control characters + * may also be emitted: + * + * - `\x02` (Start of Text): A document starts with the next token + * - `\x18` (Cancel): Unexpected end of flow-mode (indicates an error) + * - `\x1f` (Unit Separator): Next token is a scalar value + * - `\u{FEFF}` (Byte order mark): Emitted separately outside documents + */ +class Lexer { + constructor() { + /** + * Flag indicating whether the end of the current buffer marks the end of + * all input + */ + this.atEnd = false; + /** + * Explicit indent set in block scalar header, as an offset from the current + * minimum indent, so e.g. set to 1 from a header `|2+`. Set to -1 if not + * explicitly set. + */ + this.blockScalarIndent = -1; + /** + * Block scalars that include a + (keep) chomping indicator in their header + * include trailing empty lines, which are otherwise excluded from the + * scalar's contents. + */ + this.blockScalarKeep = false; + /** Current input */ + this.buffer = ''; + /** + * Flag noting whether the map value indicator : can immediately follow this + * node within a flow context. + */ + this.flowKey = false; + /** Count of surrounding flow collection levels. */ + this.flowLevel = 0; + /** + * Minimum level of indentation required for next lines to be parsed as a + * part of the current scalar value. + */ + this.indentNext = 0; + /** Indentation level of the current line. */ + this.indentValue = 0; + /** Position of the next \n character. */ + this.lineEndPos = null; + /** Stores the state of the lexer if reaching the end of incpomplete input */ + this.next = null; + /** A pointer to `buffer`; the current position of the lexer. */ + this.pos = 0; + } + /** + * Generate YAML tokens from the `source` string. If `incomplete`, + * a part of the last line may be left as a buffer for the next call. + * + * @returns A generator of lexical tokens + */ + *lex(source, incomplete = false) { + if (source) { + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next || 'stream'; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === ' ' || ch === '\t') + ch = this.buffer[++i]; + if (!ch || ch === '#' || ch === '\n') + return true; + if (ch === '\r') + return this.buffer[i + 1] === '\n'; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset) { + let ch = this.buffer[offset]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === ' ') + ch = this.buffer[++indent + offset]; + if (ch === '\r') { + const next = this.buffer[indent + offset + 1]; + if (next === '\n' || (!next && !this.atEnd)) + return offset + indent + 1; + } + return ch === '\n' || indent >= this.indentNext || (!ch && !this.atEnd) + ? offset + indent + : -1; + } + if (ch === '-' || ch === '.') { + const dt = this.buffer.substr(offset, 3); + if ((dt === '---' || dt === '...') && isEmpty(this.buffer[offset + 3])) + return -1; + } + return offset; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== 'number' || (end !== -1 && end < this.pos)) { + end = this.buffer.indexOf('\n', this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === '\r') + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case 'stream': + return yield* this.parseStream(); + case 'line-start': + return yield* this.parseLineStart(); + case 'block-start': + return yield* this.parseBlockStart(); + case 'doc': + return yield* this.parseDocument(); + case 'flow': + return yield* this.parseFlowCollection(); + case 'quoted-scalar': + return yield* this.parseQuotedScalar(); + case 'block-scalar': + return yield* this.parseBlockScalar(); + case 'plain-scalar': + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext('stream'); + if (line[0] === BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === '%') { + let dirEnd = line.length; + const cs = line.indexOf('#'); + if (cs !== -1) { + const ch = line[cs - 1]; + if (ch === ' ' || ch === '\t') + dirEnd = cs - 1; + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === ' ' || ch === '\t') + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); // possible comment + this.pushNewline(); + return 'stream'; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return 'stream'; + } + yield DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext('line-start'); + if (ch === '-' || ch === '.') { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext('line-start'); + const s = this.peek(3); + if (s === '---' && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return 'doc'; + } + else if (s === '...' && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + return 'stream'; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext('block-start'); + if ((ch0 === '-' || ch0 === '?' || ch0 === ':') && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return 'doc'; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext('doc'); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case '#': + yield* this.pushCount(line.length - n); + // fallthrough + case undefined: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case '{': + case '[': + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return 'flow'; + case '}': + case ']': + // this is an error + yield* this.pushCount(1); + return 'doc'; + case '*': + yield* this.pushUntil(isNotAnchorChar); + return 'doc'; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case '|': + case '>': + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + sp = yield* this.pushSpaces(true); + if (nl > 0) + this.indentValue = indent = sp; + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext('flow'); + if ((indent !== -1 && indent < this.indentNext && line[0] !== '#') || + (indent === 0 && + (line.startsWith('---') || line.startsWith('...')) && + isEmpty(line[3]))) { + // Allowing for the terminal ] or } at the same (rather than greater) + // indent level as the initial [ or { is technically invalid, but + // failing here would be surprising to users. + const atFlowEndMarker = indent === this.indentNext - 1 && + this.flowLevel === 1 && + (line[0] === ']' || line[0] === '}'); + if (!atFlowEndMarker) { + // this is an error + this.flowLevel = 0; + yield FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ',') { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case undefined: + return 'flow'; + case '#': + yield* this.pushCount(line.length - n); + return 'flow'; + case '{': + case '[': + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return 'flow'; + case '}': + case ']': + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? 'flow' : 'doc'; + case '*': + yield* this.pushUntil(isNotAnchorChar); + return 'flow'; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ':': { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ',') { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return 'flow'; + } + } + // fallthrough + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } + else { + // double-quote + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === '\\') + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + // Only looking for newlines within the quotes + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf('\n', this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf('\n', cs); + } + if (nl !== -1) { + // this is an error caused by an unexpected unindent + end = nl - (qb[nl - 1] === '\r' ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext('quoted-scalar'); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? 'flow' : 'doc'; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === '+') + this.blockScalarKeep = true; + else if (ch > '0' && ch <= '9') + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== '-') + break; + } + return yield* this.pushUntil(ch => isEmpty(ch) || ch === '#'); + } + *parseBlockScalar() { + let nl = this.pos - 1; // may be -1 if this.pos === 0 + let indent = 0; + let ch; + loop: for (let i = this.pos; (ch = this.buffer[i]); ++i) { + switch (ch) { + case ' ': + indent += 1; + break; + case '\n': + nl = i; + indent = 0; + break; + case '\r': { + const next = this.buffer[i + 1]; + if (!next && !this.atEnd) + return this.setNext('block-scalar'); + if (next === '\n') + break; + } // fallthrough + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext('block-scalar'); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else + this.indentNext += this.blockScalarIndent; + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf('\n', cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext('block-scalar'); + nl = this.buffer.length; + } + } + if (!this.blockScalarKeep) { + do { + let i = nl - 1; + let ch = this.buffer[i]; + if (ch === '\r') + ch = this.buffer[--i]; + while (ch === ' ' || ch === '\t') + ch = this.buffer[--i]; + if (ch === '\n' && i >= this.pos) + nl = i; + else + break; + } while (true); + } + yield SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while ((ch = this.buffer[++i])) { + if (ch === ':') { + const next = this.buffer[i + 1]; + if (isEmpty(next) || (inFlow && next === ',')) + break; + end = i; + } + else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === '\r') { + if (next === '\n') { + i += 1; + ch = '\n'; + next = this.buffer[i + 1]; + } + else + end = i; + } + if (next === '#' || (inFlow && invalidFlowScalarChars.includes(next))) + break; + if (ch === '\n') { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); // to advance, but still account for ' #' + } + } + else { + if (inFlow && invalidFlowScalarChars.includes(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext('plain-scalar'); + yield SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? 'flow' : 'doc'; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } + else if (allowEmpty) + yield ''; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case '!': + return ((yield* this.pushTag()) + + (yield* this.pushSpaces(true)) + + (yield* this.pushIndicators())); + case '&': + return ((yield* this.pushUntil(isNotAnchorChar)) + + (yield* this.pushSpaces(true)) + + (yield* this.pushIndicators())); + case ':': + case '?': // this is an error outside flow collections + case '-': // this is an error + if (isEmpty(this.charAt(1))) { + if (this.flowLevel === 0) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return ((yield* this.pushCount(1)) + + (yield* this.pushSpaces(true)) + + (yield* this.pushIndicators())); + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === '<') { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== '>') + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === '>' ? i + 1 : i, false); + } + else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.includes(ch)) + ch = this.buffer[++i]; + else if (ch === '%' && + hexDigits.includes(this.buffer[i + 1]) && + hexDigits.includes(this.buffer[i + 2])) { + ch = this.buffer[(i += 3)]; + } + else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === '\n') + return yield* this.pushCount(1); + else if (ch === '\r' && this.charAt(1) === '\n') + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === ' ' || (allowTabs && ch === '\t')); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } +} + +/** + * Tracks newlines during parsing in order to provide an efficient API for + * determining the one-indexed `{ line, col }` position for any offset + * within the input. + */ +class LineCounter { + constructor() { + this.lineStarts = []; + /** + * Should be called in ascending order. Otherwise, call + * `lineCounter.lineStarts.sort()` before calling `linePos()`. + */ + this.addNewLine = (offset) => this.lineStarts.push(offset); + /** + * Performs a binary search and returns the 1-indexed { line, col } + * position of `offset`. If `line === 0`, `addNewLine` has never been + * called or `offset` is before the first known newline. + */ + this.linePos = (offset) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = (low + high) >> 1; // Math.floor((low + high) / 2) + if (this.lineStarts[mid] < offset) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset - start + 1 }; + }; + } +} + +function includesToken(list, type) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type) + return true; + return false; +} +function includesNonEmpty(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case 'space': + case 'comment': + case 'newline': + break; + default: + return true; + } + } + return false; +} +function isFlowToken(token) { + switch (token === null || token === void 0 ? void 0 : token.type) { + case 'alias': + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': + case 'flow-collection': + return true; + default: + return false; + } +} +function getPrevProps(parent) { + switch (parent.type) { + case 'document': + return parent.start; + case 'block-map': { + const it = parent.items[parent.items.length - 1]; + return it.sep || it.start; + } + case 'block-seq': + return parent.items[parent.items.length - 1].start; + /* istanbul ignore next should not happen */ + default: + return []; + } +} +/** Note: May modify input array */ +function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i = prev.length; + loop: while (--i >= 0) { + switch (prev[i].type) { + case 'doc-start': + case 'explicit-key-ind': + case 'map-value-ind': + case 'seq-item-ind': + case 'newline': + break loop; + } + } + while (((_a = prev[++i]) === null || _a === void 0 ? void 0 : _a.type) === 'space') { + /* loop */ + } + return prev.splice(i, prev.length); +} +function fixFlowSeqItems(fc) { + if (fc.start.type === 'flow-seq-start') { + for (const it of fc.items) { + if (it.sep && + !it.value && + !includesToken(it.start, 'explicit-key-ind') && + !includesToken(it.sep, 'map-value-ind')) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } + else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } +} +/** + * A YAML concrete syntax tree (CST) parser + * + * ```ts + * const src: string = ... + * for (const token of new Parser().parse(src)) { + * // token: Token + * } + * ``` + * + * To use the parser with a user-provided lexer: + * + * ```ts + * function* parse(source: string, lexer: Lexer) { + * const parser = new Parser() + * for (const lexeme of lexer.lex(source)) + * yield* parser.next(lexeme) + * yield* parser.end() + * } + * + * const src: string = ... + * const lexer = new Lexer() + * for (const token of parse(src, lexer)) { + * // token: Token + * } + * ``` + */ +class Parser { + /** + * @param onNewLine - If defined, called separately with the start position of + * each new line (in `parse()`, including the start of input). + */ + constructor(onNewLine) { + /** If true, space and sequence indicators count as indentation */ + this.atNewLine = true; + /** If true, next token is a scalar value */ + this.atScalar = false; + /** Current indentation level */ + this.indent = 0; + /** Current offset since the start of parsing */ + this.offset = 0; + /** On the same line with a block map key */ + this.onKeyLine = false; + /** Top indicates the node that's currently being built */ + this.stack = []; + /** The source of the current token, set in parse() */ + this.source = ''; + /** The type of the current token, set in parse() */ + this.type = ''; + // Must be defined after `next()` + this.lexer = new Lexer(); + this.onNewLine = onNewLine; + } + /** + * Parse `source` as a YAML stream. + * If `incomplete`, a part of the last line may be left as a buffer for the next call. + * + * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens. + * + * @returns A generator of tokens representing each directive, document, and other structure. + */ + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + /** + * Advance the parser by the `source` of one lexical token. + */ + *next(source) { + this.source = source; + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: 'error', offset: this.offset, message, source }); + this.offset += source.length; + } + else if (type === 'scalar') { + this.atNewLine = false; + this.atScalar = true; + this.type = 'scalar'; + } + else { + this.type = type; + yield* this.step(); + switch (type) { + case 'newline': + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case 'space': + if (this.atNewLine && source[0] === ' ') + this.indent += source.length; + break; + case 'explicit-key-ind': + case 'map-value-ind': + case 'seq-item-ind': + if (this.atNewLine) + this.indent += source.length; + break; + case 'doc-mode': + case 'flow-error-end': + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + /** Call at end of input to push out any remaining constructions */ + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === 'doc-end' && (!top || top.type !== 'doc-end')) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: 'doc-end', + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case 'document': + return yield* this.document(top); + case 'alias': + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': + return yield* this.scalar(top); + case 'block-scalar': + return yield* this.blockScalar(top); + case 'block-map': + return yield* this.blockMap(top); + case 'block-seq': + return yield* this.blockSequence(top); + case 'flow-collection': + return yield* this.flowCollection(top); + case 'doc-end': + return yield* this.documentEnd(top); + } + /* istanbul ignore next should not happen */ + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error) { + const token = error || this.stack.pop(); + /* istanbul ignore if should not happen */ + if (!token) { + const message = 'Tried to pop an empty stack'; + yield { type: 'error', offset: this.offset, source: '', message }; + } + else if (this.stack.length === 0) { + yield token; + } + else { + const top = this.peek(1); + if (token.type === 'block-scalar') { + // Block scalars use their parent rather than header indent + token.indent = 'indent' in top ? top.indent : 0; + } + else if (token.type === 'flow-collection' && top.type === 'document') { + // Ignore all indent for top-level flow collections + token.indent = 0; + } + if (token.type === 'flow-collection') + fixFlowSeqItems(token); + switch (top.type) { + case 'document': + top.value = token; + break; + case 'block-scalar': + top.props.push(token); // error + break; + case 'block-map': { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } + else if (it.sep) { + it.value = token; + } + else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !includesToken(it.start, 'explicit-key-ind'); + return; + } + break; + } + case 'block-seq': { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case 'flow-collection': { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === 'document' || + top.type === 'block-map' || + top.type === 'block-seq') && + (token.type === 'block-map' || token.type === 'block-seq')) { + const last = token.items[token.items.length - 1]; + if (last && + !last.sep && + !last.value && + last.start.length > 0 && + !includesNonEmpty(last.start) && + (token.indent === 0 || + last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) { + if (top.type === 'document') + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case 'directive-line': + yield { type: 'directive', offset: this.offset, source: this.source }; + return; + case 'byte-order-mark': + case 'space': + case 'comment': + case 'newline': + yield this.sourceToken; + return; + case 'doc-mode': + case 'doc-start': { + const doc = { + type: 'document', + offset: this.offset, + start: [] + }; + if (this.type === 'doc-start') + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: 'error', + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case 'doc-start': { + if (includesNonEmpty(doc.start)) { + yield* this.pop(); + yield* this.step(); + } + else + doc.start.push(this.sourceToken); + return; + } + case 'anchor': + case 'tag': + case 'space': + case 'comment': + case 'newline': + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: 'error', + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === 'map-value-ind') { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep; + if (scalar.end) { + sep = scalar.end; + sep.push(this.sourceToken); + delete scalar.end; + } + else + sep = [this.sourceToken]; + const map = { + type: 'block-map', + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } + else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case 'space': + case 'comment': + case 'newline': + scalar.props.push(this.sourceToken); + return; + case 'scalar': + scalar.source = this.source; + // block-scalar source includes trailing newline + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf('\n') + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf('\n', nl) + 1; + } + } + yield* this.pop(); + break; + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map) { + var _a; + const it = map.items[map.items.length - 1]; + // it.sep is true-ish if pair already has key or : separator + switch (this.type) { + case 'newline': + this.onKeyLine = false; + if (it.value) { + const end = 'end' in it.value ? it.value.end : undefined; + const last = Array.isArray(end) ? end[end.length - 1] : undefined; + if ((last === null || last === void 0 ? void 0 : last.type) === 'comment') + end === null || end === void 0 ? void 0 : end.push(this.sourceToken); + else + map.items.push({ start: [this.sourceToken] }); + } + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case 'space': + case 'comment': + if (it.value) + map.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else { + if (this.atIndentedComment(it.start, map.indent)) { + const prev = map.items[map.items.length - 2]; + const end = (_a = prev === null || prev === void 0 ? void 0 : prev.value) === null || _a === void 0 ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map.indent) { + const atNextItem = !this.onKeyLine && + this.indent === map.indent && + (it.sep || includesNonEmpty(it.start)); + switch (this.type) { + case 'anchor': + case 'tag': + if (atNextItem || it.value) { + map.items.push({ start: [this.sourceToken] }); + this.onKeyLine = true; + } + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case 'explicit-key-ind': + if (!it.sep && !includesToken(it.start, 'explicit-key-ind')) + it.start.push(this.sourceToken); + else if (atNextItem || it.value) + map.items.push({ start: [this.sourceToken] }); + else + this.stack.push({ + type: 'block-map', + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }); + this.onKeyLine = true; + return; + case 'map-value-ind': + if (!it.sep) + Object.assign(it, { key: null, sep: [this.sourceToken] }); + else if (it.value || + (atNextItem && !includesToken(it.start, 'explicit-key-ind'))) + map.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (includesToken(it.sep, 'map-value-ind')) + this.stack.push({ + type: 'block-map', + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + else if (includesToken(it.start, 'explicit-key-ind') && + isFlowToken(it.key) && + !includesToken(it.sep, 'newline')) { + const start = getFirstKeyStartProps(it.start); + const key = it.key; + const sep = it.sep; + sep.push(this.sourceToken); + // @ts-ignore type guard is wrong here + delete it.key, delete it.sep; + this.stack.push({ + type: 'block-map', + offset: this.offset, + indent: this.indent, + items: [{ start, key, sep }] + }); + } + else + it.sep.push(this.sourceToken); + this.onKeyLine = true; + return; + case 'alias': + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': { + const fs = this.flowScalar(this.type); + if (atNextItem || it.value) { + map.items.push({ start: [], key: fs, sep: [] }); + this.onKeyLine = true; + } + else if (it.sep) { + this.stack.push(fs); + } + else { + Object.assign(it, { key: fs, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map); + if (bv) { + if (atNextItem && + bv.type !== 'block-seq' && + includesToken(it.start, 'explicit-key-ind')) + map.items.push({ start: [] }); + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq) { + var _a; + const it = seq.items[seq.items.length - 1]; + switch (this.type) { + case 'newline': + if (it.value) { + const end = 'end' in it.value ? it.value.end : undefined; + const last = Array.isArray(end) ? end[end.length - 1] : undefined; + if ((last === null || last === void 0 ? void 0 : last.type) === 'comment') + end === null || end === void 0 ? void 0 : end.push(this.sourceToken); + else + seq.items.push({ start: [this.sourceToken] }); + } + else + it.start.push(this.sourceToken); + return; + case 'space': + case 'comment': + if (it.value) + seq.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq.indent)) { + const prev = seq.items[seq.items.length - 2]; + const end = (_a = prev === null || prev === void 0 ? void 0 : prev.value) === null || _a === void 0 ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case 'anchor': + case 'tag': + if (it.value || this.indent <= seq.indent) + break; + it.start.push(this.sourceToken); + return; + case 'seq-item-ind': + if (this.indent !== seq.indent) + break; + if (it.value || includesToken(it.start, 'seq-item-ind')) + seq.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq.indent) { + const bv = this.startBlockValue(seq); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === 'flow-error-end') { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === 'flow-collection'); + } + else if (fc.end.length === 0) { + switch (this.type) { + case 'comma': + case 'explicit-key-ind': + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case 'map-value-ind': + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case 'space': + case 'comment': + case 'newline': + case 'anchor': + case 'tag': + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case 'alias': + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': { + const fs = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs, sep: [] }); + else if (it.sep) + this.stack.push(fs); + else + Object.assign(it, { key: fs, sep: [] }); + return; + } + case 'flow-map-end': + case 'flow-seq-end': + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + /* istanbul ignore else should not happen */ + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } + else { + const parent = this.peek(2); + if (parent.type === 'block-map' && + (this.type === 'map-value-ind' || + (this.type === 'newline' && + !parent.items[parent.items.length - 1].sep))) { + yield* this.pop(); + yield* this.step(); + } + else if (this.type === 'map-value-ind' && + parent.type !== 'flow-collection') { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep = fc.end.splice(1, fc.end.length); + sep.push(this.sourceToken); + const map = { + type: 'block-map', + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } + else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf('\n') + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf('\n', nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case 'alias': + case 'scalar': + case 'single-quoted-scalar': + case 'double-quoted-scalar': + return this.flowScalar(this.type); + case 'block-scalar-header': + return { + type: 'block-scalar', + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: '' + }; + case 'flow-map-start': + case 'flow-seq-start': + return { + type: 'flow-collection', + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case 'seq-item-ind': + return { + type: 'block-seq', + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case 'explicit-key-ind': { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: 'block-map', + offset: this.offset, + indent: this.indent, + items: [{ start }] + }; + } + case 'map-value-ind': { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: 'block-map', + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== 'comment') + return false; + if (this.indent <= indent) + return false; + return start.every(st => st.type === 'newline' || st.type === 'space'); + } + *documentEnd(docEnd) { + if (this.type !== 'doc-mode') { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === 'newline') + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case 'comma': + case 'doc-start': + case 'doc-end': + case 'flow-seq-end': + case 'flow-map-end': + case 'map-value-ind': + yield* this.pop(); + yield* this.step(); + break; + case 'newline': + this.onKeyLine = false; + // fallthrough + case 'space': + case 'comment': + default: + // all other values are errors + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === 'newline') + yield* this.pop(); + } + } +} + +function parseOptions(options) { + const prettyErrors = options.prettyErrors !== false; + const lineCounter = options.lineCounter || (prettyErrors && new LineCounter()) || null; + return { lineCounter, prettyErrors }; +} +/** Parse an input string into a single YAML.Document */ +function parseDocument(source, options = {}) { + const { lineCounter, prettyErrors } = parseOptions(options); + const parser = new Parser(lineCounter === null || lineCounter === void 0 ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options); + // `doc` is always set by compose.end(true) at the very latest + let doc = null; + for (const _doc of composer.compose(parser.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== 'silent') { + doc.errors.push(new YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()')); + break; + } + } + if (prettyErrors && lineCounter) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + return doc; +} + +class File { + + constructor(app, filename, tagPositions, hasFrontMatter) { + this.app = app; + this.filename = filename; + this.basename = filename.split("/").pop(); + this.tagPositions = tagPositions; + this.hasFrontMatter = !!hasFrontMatter; + } + + /** @param {Replacement} replace */ + async renamed(replace) { + const file = this.app.vault.getAbstractFileByPath(this.filename); + const original = await this.app.vault.read(file); + let text = original; + + for (const { position: { start, end }, tag } of this.tagPositions) { + if (text.slice(start.offset, end.offset) !== tag) { + const msg = `File ${this.filename} has changed; skipping`; + new obsidian.Notice(msg); + console.error(msg); + console.debug(text.slice(start.offset, end.offset), tag); + return; + } + text = replace.inString(text, start.offset); + } + + if (this.hasFrontMatter) + text = this.replaceInFrontMatter(text, replace); + + if (text !== original) { + await this.app.vault.modify(file, text); + return true; + } + } + + /** @param {Replacement} replace */ + replaceInFrontMatter(text, replace) { + const [empty, frontMatter] = text.split(/^---\r?$\n?/m, 2); + + // Check for valid, non-empty, properly terminated front matter + if (empty.trim() !== "" || !frontMatter.trim() || !frontMatter.endsWith("\n")) + return text; + + const parsed = parseDocument(frontMatter, {keepSourceTokens: true}); + if (parsed.errors.length) { + const error = `YAML issue with ${this.filename}: ${parsed.errors[0]}`; + console.error(error); new obsidian.Notice(error + "; skipping frontmatter"); + return; + } + + let changed = false, json = parsed.toJSON(); + + function setInNode(node, value, afterKey=false) { + setScalarValue(node.srcToken, value, {afterKey}); + changed = true; + node.value = value; + } + + function processField(prop, isAlias) { + const node = parsed.get(prop, true); + if (!node) return; + const field = json[prop]; + if (!field || !field.length) return; + if (typeof field === "string") { + const parts = field.split(isAlias ? /(^\s+|\s*,\s*|\s+$)/ : /([\s,]+)/); + const after = replace.inArray(parts, true, isAlias).join(""); + if (field != after) setInNode(node, after, true); + } else if (Array.isArray(field)) { + replace.inArray(field, false, isAlias).forEach((v, i) => { + if (field[i] !== v) setInNode(node.get(i, true), v); + }); + } + } + + for (const {key: {value:prop}} of parsed.contents.items) { + if (/^tags?$/i.test(prop)) { + processField(prop, false); + } else if (/^alias(es)?$/i.test(prop)) { + processField(prop, true); + } + } + return changed ? text.replace(frontMatter, stringify(parsed.contents.srcToken)) : text; + } +} + +async function renameTag(app, tagName) { + const newName = await promptForNewName(tagName); + if (newName === false) return; // aborted + + if (!newName || newName === tagName) { + return new obsidian.Notice("Unchanged or empty tag: No changes made."); + } + + const + oldTag = new Tag(tagName), + newTag = new Tag(newName), + replace = new Replacement(oldTag, newTag), + clashing = replace.willMergeTags( + allTags(app).reverse() // find longest clash first + ), + shouldAbort = clashing && + await shouldAbortDueToClash(clashing, oldTag, newTag) + ; + + if (shouldAbort) return; + + const targets = await findTargets(app, oldTag); + if (!targets) return; + + const progress = new Progress(`Renaming to #${newName}/*`, "Processing files..."); + let renamed = 0; + await progress.forEach(targets, async (target) => { + progress.message = "Processing " + target.basename; + if (await target.renamed(replace)) renamed++; + }); + + return new obsidian.Notice(`Operation ${progress.aborted ? "cancelled" : "complete"}: ${renamed} file(s) updated`); +} + +function allTags(app) { + return Object.keys(app.metadataCache.getTags()); +} + +async function findTargets(app, tag) { + const targets = []; + const progress = new Progress(`Searching for ${tag}/*`, "Matching files..."); + await progress.forEach( + app.metadataCache.getCachedFiles(), + filename => { + let { frontmatter, tags } = app.metadataCache.getCache(filename) || {}; + tags = (tags || []).filter(t => t.tag && tag.matches(t.tag)).reverse(); // last positions first + const fmtags = (obsidian.parseFrontMatterTags(frontmatter) || []).filter(tag.matches); + const aliasTags = (obsidian.parseFrontMatterAliases(frontmatter) || []).filter(Tag.isTag).filter(tag.matches); + if (tags.length || fmtags.length || aliasTags.length) + targets.push(new File(app, filename, tags, fmtags.length + aliasTags.length)); + } + ); + if (!progress.aborted) + return targets; +} + +async function promptForNewName(tagName) { + try { + return await validatedInput( + `Renaming #${tagName} (and any sub-tags)`, "Enter new name (must be a valid Obsidian tag):\n", + tagName, + "[^\u2000-\u206F\u2E00-\u2E7F'!\"#$%&()*+,.:;<=>?@^`{|}~\\[\\]\\\\\\s]+", + "Obsidian tag name" + ); + } catch(e) { + return false; // user cancelled + } +} + +async function shouldAbortDueToClash([origin, clash], oldTag, newTag) { + try { + await confirm( + "WARNING: No Undo!", + `Renaming ${oldTag} to ${newTag} will merge ${ + (origin.canonical === oldTag.canonical) ? + `these tags` : `multiple tags + into existing tags (such as ${origin} + merging with ${clash})` + }. + + This cannot be undone. Do you wish to proceed?` + ); + } catch(e) { + return true; + } +} + +function around(obj, factories) { + const removers = Object.keys(factories).map(key => around1(obj, key, factories[key])); + return removers.length === 1 ? removers[0] : function () { removers.forEach(r => r()); }; +} +function around1(obj, method, createWrapper) { + const original = obj[method], hadOwn = obj.hasOwnProperty(method); + let current = createWrapper(original); + // Let our wrapper inherit static props from the wrapping method, + // and the wrapping method, props from the original method + if (original) + Object.setPrototypeOf(current, original); + Object.setPrototypeOf(wrapper, current); + obj[method] = wrapper; + // Return a callback to allow safe removal + return remove; + function wrapper(...args) { + // If we have been deactivated and are no longer wrapped, remove ourselves + if (current === original && obj[method] === wrapper) + remove(); + return current.apply(this, args); + } + function remove() { + // If no other patches, just do a direct removal + if (obj[method] === wrapper) { + if (hadOwn) + obj[method] = original; + else + delete obj[method]; + } + if (current === original) + return; + // Else pass future calls through, and remove wrapper from the prototype chain + current = original; + Object.setPrototypeOf(wrapper, original || Function); + } +} + +const tagHoverMain = "tag-wrangler:tag-pane"; + +function onElement(el, event, selector, callback, options) { + el.on(event, selector, callback, options); + return () => el.off(event, selector, callback, options); +} + +class TagWrangler extends obsidian.Plugin { + pageAliases = new Map(); + tagPages = new Map(); + + tagPage(tag) { + return Array.from(this.tagPages.get(Tag.canonical(tag)) || "")[0] + } + + openTagPage(file, isNew, newLeaf) { + const openState = { + eState: isNew ? {rename: "all"} : {focus: true}, // Rename new page, focus existing + ...(isNew ? {state: {mode: "source"}} : {}) // and set source mode for new page + }; + return this.app.workspace.getLeaf(newLeaf).openFile(file, openState); + } + + async createTagPage(tagName, newLeaf) { + const baseName = new Tag(tagName).name.split("/").join(" "); + const folder = this.app.fileManager.getNewFileParent(this.app.workspace.getActiveFile()?.path || ""); + const path = this.app.vault.getAvailablePath(folder.getParentPrefix()+baseName, "md"); + this.openTagPage(await this.app.vault.create(path, [ + "---", + `Aliases: [ ${JSON.stringify(Tag.toTag(tagName))} ]`, + "---", + "" + ].join("\n")), true, newLeaf); + } + + async onload(){ + this.register( + onElement(document, "contextmenu", ".tag-pane-tag", this.onMenu.bind(this), {capture: true}) + ); + + this.app.workspace.registerHoverLinkSource(tagHoverMain, {display: 'Tag pane', defaultMod: true}); + + this.addChild( + // Tags in the tag pane + new TagPageUIHandler(this, { + hoverSource: tagHoverMain, selector: ".tag-pane-tag", container: ".tag-container", + toTag(el) { return el.find(".tag-pane-tag-text")?.textContent; } + }) + ); + + this.addChild( + // Reading mode / tag links + new TagPageUIHandler(this, { + hoverSource: "preview", selector: 'a.tag[href^="#"]', + container: ".markdown-preview-view, .markdown-embed, .workspace-leaf-content", + toTag(el) { return el.getAttribute("href"); } + }) + ); + + this.addChild( + // Edit mode + new TagPageUIHandler(this, { + hoverSource: "editor", selector: "span.cm-hashtag", + container: ".markdown-source-view", + toTag(el) { + // Multiple cm-hashtag elements can be side by side: join them all together: + let tagName = el.textContent; + for (let t=el.previousElementSibling; t?.matches("span.cm-hashtag"); t = t.previousElementSibling) { + tagName = t.textContent + tagName; + } + for (let t=el.nextElementSibling; t?.matches("span.cm-hashtag"); t = t.nextElementSibling) { + tagName += t.textContent; + } + return tagName; + } + }) + ); + + // Track Tag Pages + const metaCache = this.app.metadataCache; + const plugin = this; + + this.register(around(metaCache, { + getTags(old) { + return function getTags() { + const tags = old.call(this); + const names = new Set(Object.keys(tags).map(t => t.toLowerCase())); + for (const t of plugin.tagPages.keys()) { + if (!names.has(t)) tags[plugin.tagPages.get(t).tag] = 0; + } + return tags; + } + } + })); + + this.app.workspace.onLayoutReady(() => { + metaCache.getCachedFiles().forEach(filename => { + const fm = metaCache.getCache(filename)?.frontmatter; + if (fm && obsidian.parseFrontMatterAliases(fm)?.filter(Tag.isTag)) this.updatePage( + this.app.vault.getAbstractFileByPath(filename), fm + ); + }); + this.registerEvent(metaCache.on("changed", (file, data, cache) => this.updatePage(file, cache?.frontmatter))); + this.registerEvent(this.app.vault.on("delete", file => this.updatePage(file))); + app.workspace.getLeavesOfType("tag").forEach(leaf => {leaf?.view?.requestUpdateTags?.();}); + }); + } + + updatePage(file, frontmatter) { + const tags = obsidian.parseFrontMatterAliases(frontmatter)?.filter(Tag.isTag) || []; + if (this.pageAliases.has(file)) { + const oldTags = new Set(tags || []); + for (const tag of this.pageAliases.get(file)) { + if (oldTags.has(tag)) continue; // don't bother deleting what we'll just put back + const key = Tag.canonical(tag); + const tp = this.tagPages.get(key); + if (tp) { + tp.delete(file); + if (!tp.size) this.tagPages.delete(key); + } + } + if (!tags.length) this.pageAliases.delete(file); + } + if (tags.length) { + this.pageAliases.set(file, tags); + for (const tag of tags) { + const key = Tag.canonical(tag); + if (this.tagPages.has(key)) this.tagPages.get(key).add(file); + else { + const tagSet = new Set([file]); + tagSet.tag = Tag.toTag(tag); + this.tagPages.set(key, tagSet); + } + } + } + } + + onMenu(e, tagEl) { + if (!e.obsidian_contextmenu) { + e.obsidian_contextmenu = new obsidian.Menu(this.app); + setImmediate(() => menu.showAtPosition({x: e.pageX, y: e.pageY})); + } + + const + tagName = tagEl.find(".tag-pane-tag-text").textContent, + tagPage = this.tagPage(tagName), + isHierarchy = tagEl.parentElement.parentElement.find(".collapse-icon"), + searchPlugin = this.app.internalPlugins.getPluginById("global-search"), + search = searchPlugin && searchPlugin.instance, + query = search && search.getGlobalSearchQuery(), + random = this.app.plugins.plugins["smart-random-note"], + menu = e.obsidian_contextmenu.addItem(item("pencil", "Rename #"+tagName, () => this.rename(tagName))); + + menu.register( + onElement(document, "keydown", "*", e => { + if (e.key==="Escape") { + e.preventDefault(); + e.stopPropagation(); + menu.hide(); + } + }, {capture: true}) + ); + + menu.addSeparator(); + if (tagPage) { + menu.addItem( + item("popup-open", "Open tag page", (e) => this.openTagPage(tagPage, false, obsidian.Keymap.isModEvent(e))) + ); + } else { + menu.addItem( + item("create-new", "Create tag page", (e) => this.createTagPage(tagName, obsidian.Keymap.isModEvent(e))) + ); + } + + if (search) { + menu.addSeparator().addItem( + item("magnifying-glass", "New search for #"+tagName, () => search.openGlobalSearch("tag:" + tagName)) + ); + if (query) { + menu.addItem( + item("sheets-in-box", "Require #"+tagName+" in search" , () => search.openGlobalSearch(query+" tag:" + tagName)) + ); + } + menu.addItem( + item("crossed-star" , "Exclude #"+tagName+" from search", () => search.openGlobalSearch(query+" -tag:" + tagName)) + ); + } + + if (random) { + menu.addSeparator().addItem( + item("dice", "Open random note", async () => { + const targets = await findTargets(this.app, new Tag(tagName)); + random.openRandomNote(targets.map(f=> this.app.vault.getAbstractFileByPath(f.filename))); + }) + ); + } + + this.app.workspace.trigger("tag-wrangler:contextmenu", menu, tagName, {search, query, isHierarchy, tagPage}); + + if (isHierarchy) { + const + tagParent = tagName.split("/").slice(0, -1).join("/"), + tagView = this.leafView(tagEl.matchParent(".workspace-leaf")), + tagContainer = tagParent ? tagView.tagDoms["#" + tagParent.toLowerCase()]: tagView.root + ; + function toggle(collapse) { + for(const tag of tagContainer.children) tag.setCollapsed(collapse); + } + menu.addSeparator() + .addItem(item("vertical-three-dots", "Collapse tags at this level", () => toggle(true ))) + .addItem(item("expand-vertically" , "Expand tags at this level" , () => toggle(false))); + } + } + + leafView(containerEl) { + let view; + this.app.workspace.iterateAllLeaves((leaf) => { + if (leaf.containerEl === containerEl) { view = leaf.view; return true; } + }); + return view; + } + + + async rename(tagName) { + const scope = new obsidian.Scope; + this.app.keymap.pushScope(scope); + try { await renameTag(this.app, tagName); } + catch (e) { console.error(e); new obsidian.Notice("error: " + e); } + this.app.keymap.popScope(scope); + } + +} + +function item(icon, title, click) { + return i => i.setIcon(icon).setTitle(title).onClick(click); +} + + +class TagPageUIHandler extends obsidian.Component { + // Handle hovering and clicks-to-open for tag pages + + constructor(plugin, opts) { + super(); + this.opts = opts; + this.plugin = plugin; + } + + onload() { + const {selector, container, hoverSource, toTag} = this.opts; + this.register( + // Show tag page on hover + onElement(document, "mouseover", selector, (event, targetEl) => { + const tagName = toTag(targetEl), tp = tagName && this.plugin.tagPage(tagName); + if (tp) this.plugin.app.workspace.trigger('hover-link', { + event, source: hoverSource, targetEl, linktext: tp.path, + hoverParent: targetEl.matchParent(container) + }); + }, {capture: false}) + ); + this.register( + // Open tag page w/alt click (current pane) or ctrl/cmd/middle click (new pane) + onElement(document, "click", selector, (event, targetEl) => { + const {altKey} = event; + if (!obsidian.Keymap.isModEvent(event) && !altKey) return; + const tagName = toTag(targetEl), tp = tagName && this.plugin.tagPage(tagName); + if (tp) { + this.plugin.openTagPage(tp, false, !altKey); + event.preventDefault(); + event.stopPropagation(); + return false; + } + }, {capture: true}) + ); + } +} + +module.exports = TagWrangler; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzLy5wbnBtL2N1cnJpZnlANC4wLjAvbm9kZV9tb2R1bGVzL2N1cnJpZnkvbGliL2N1cnJpZnkuanMiLCJub2RlX21vZHVsZXMvLnBucG0vZnVsbHN0b3JlQDMuMC4wL25vZGVfbW9kdWxlcy9mdWxsc3RvcmUvbGliL2Z1bGxzdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS9AY2xvdWRjbWQrY3JlYXRlLWVsZW1lbnRAMi4wLjIvbm9kZV9tb2R1bGVzL0BjbG91ZGNtZC9jcmVhdGUtZWxlbWVudC9saWIvY3JlYXRlLWVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvLnBucG0vc21hbGx0YWxrQDQuMC43L25vZGVfbW9kdWxlcy9zbWFsbHRhbGsvbGliL3NtYWxsdGFsay5qcyIsInNyYy9wcm9ncmVzcy5qcyIsInNyYy92YWxpZGF0aW9uLmpzIiwic3JjL1RhZy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9Ob2RlLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3Zpc2l0LmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9kaXJlY3RpdmVzLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9hbmNob3JzLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0FsaWFzLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL3RvSlMuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvU2NhbGFyLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9jcmVhdGVOb2RlLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0NvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeUNvbW1lbnQuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L2ZvbGRGbG93TGluZXMuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2xvZy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9hZGRQYWlyVG9KU01hcC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9QYWlyLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L29wdGlvbnMuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeUNvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvWUFNTE1hcC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL21hcC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9ZQU1MU2VxLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vc2VxLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9ib29sLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvZmxvYXQuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvaW50LmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL3NjaGVtYS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvanNvbi9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2JpbmFyeS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL29tYXAuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9pbnQuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NldC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvdGltZXN0YW1wLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3RhZ3MuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL1NjaGVtYS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5RG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FwcGx5UmV2aXZlci5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvRG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZXJyb3JzLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1wcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtZmxvdy1pbmRlbnQtY2hlY2suanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLW1hcC1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtYmxvY2stbWFwLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zZXEuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWVuZC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zY2FsYXIuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1zY2FsYXIuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2Utbm9kZS5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2UtZG9jLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZXIuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvY3N0LXNjYWxhci5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3Qtc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9sZXhlci5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS95YW1sQDIuMC4wLTEwL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9saW5lLWNvdW50ZXIuanMiLCJub2RlX21vZHVsZXMvLnBucG0veWFtbEAyLjAuMC0xMC9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvcGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzLy5wbnBtL3lhbWxAMi4wLjAtMTAvbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3B1YmxpYy1hcGkuanMiLCJzcmMvRmlsZS5qcyIsInNyYy9yZW5hbWluZy5qcyIsIm5vZGVfbW9kdWxlcy8ucG5wbS9tb25rZXktYXJvdW5kQDIuMy4wL25vZGVfbW9kdWxlcy9tb25rZXktYXJvdW5kL21qcy9pbmRleC5qcyIsInNyYy9wbHVnaW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmID0gKGZuKSA9PiBbXG4gICAgLyplc2xpbnQgbm8tdW51c2VkLXZhcnM6IDAqL1xuICAgIGZ1bmN0aW9uIChhKSB7cmV0dXJuIGZuKC4uLmFyZ3VtZW50cyk7fSxcbiAgICBmdW5jdGlvbiAoYSwgYikge3JldHVybiBmbiguLi5hcmd1bWVudHMpO30sXG4gICAgZnVuY3Rpb24gKGEsIGIsIGMpIHtyZXR1cm4gZm4oLi4uYXJndW1lbnRzKTt9LFxuICAgIGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7cmV0dXJuIGZuKC4uLmFyZ3VtZW50cyk7fSxcbiAgICBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSkge3JldHVybiBmbiguLi5hcmd1bWVudHMpO30sXG5dO1xuXG5jb25zdCBjdXJyaWZ5ID0gKGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgY2hlY2soZm4pO1xuICAgIFxuICAgIGlmIChhcmdzLmxlbmd0aCA+PSBmbi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICBcbiAgICBjb25zdCBhZ2FpbiA9ICguLi5hcmdzMikgPT4ge1xuICAgICAgICByZXR1cm4gY3VycmlmeShmbiwgLi4uWy4uLmFyZ3MsIC4uLmFyZ3MyXSk7XG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBjb3VudCA9IGZuLmxlbmd0aCAtIGFyZ3MubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBmdW5jID0gZihhZ2FpbilbY291bnRdO1xuICAgIFxuICAgIHJldHVybiBmdW5jIHx8IGFnYWluO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjdXJyaWZ5O1xuXG5mdW5jdGlvbiBjaGVjayhmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IEVycm9yKCdmbiBzaG91bGQgYmUgZnVuY3Rpb24hJyk7XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAodmFsdWUpID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gYXJncztcbiAgICAgICAgXG4gICAgICAgIGlmICghYXJncy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIGRhdGEudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjdXJyaWZ5ID0gcmVxdWlyZSgnY3VycmlmeScpO1xuY29uc3QgcXVlcnkgPSAoYSkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbmFtZT1cIiR7YX1cIl1gKTtcblxuY29uc3Qgc2V0QXR0cmlidXRlID0gY3VycmlmeSgoZWwsIG9iaiwgbmFtZSkgPT4gZWwuc2V0QXR0cmlidXRlKG5hbWUsIG9ialtuYW1lXSkpO1xuY29uc3Qgc2V0ID0gY3VycmlmeSgoZWwsIG9iaiwgbmFtZSkgPT4gZWxbbmFtZV0gPSBvYmpbbmFtZV0pO1xuY29uc3Qgbm90ID0gY3VycmlmeSgoZiwgYSkgPT4gIWYoYSkpO1xuY29uc3QgaXNDYW1lbENhc2UgPSAoYSkgPT4gYSAhPSBhLnRvTG93ZXJDYXNlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YU5hbWUsXG4gICAgICAgIG5vdEFwcGVuZCxcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQuYm9keSxcbiAgICAgICAgdW5pcSA9IHRydWUsXG4gICAgICAgIC4uLnJlc3RPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgXG4gICAgY29uc3QgZWxGb3VuZCA9IGlzRWxlbWVudFByZXNlbnQoZGF0YU5hbWUpO1xuICAgIFxuICAgIGlmICh1bmlxICYmIGVsRm91bmQpXG4gICAgICAgIHJldHVybiBlbEZvdW5kO1xuICAgIFxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbiAgICBcbiAgICBpZiAoZGF0YU5hbWUpXG4gICAgICAgIGVsLmRhdGFzZXQubmFtZSA9IGRhdGFOYW1lO1xuICAgIFxuICAgIE9iamVjdC5rZXlzKHJlc3RPcHRpb25zKVxuICAgICAgICAuZmlsdGVyKGlzQ2FtZWxDYXNlKVxuICAgICAgICAubWFwKHNldChlbCwgb3B0aW9ucykpO1xuICAgIFxuICAgIE9iamVjdC5rZXlzKHJlc3RPcHRpb25zKVxuICAgICAgICAuZmlsdGVyKG5vdChpc0NhbWVsQ2FzZSkpXG4gICAgICAgIC5tYXAoc2V0QXR0cmlidXRlKGVsLCBvcHRpb25zKSk7XG4gICAgXG4gICAgaWYgKCFub3RBcHBlbmQpXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgXG4gICAgcmV0dXJuIGVsO1xufTtcblxubW9kdWxlLmV4cG9ydHMuaXNFbGVtZW50UHJlc2VudCA9IGlzRWxlbWVudFByZXNlbnQ7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFByZXNlbnQoZGF0YU5hbWUpIHtcbiAgICBpZiAoIWRhdGFOYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgXG4gICAgcmV0dXJuIHF1ZXJ5KGRhdGFOYW1lKTtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCcuLi9jc3Mvc21hbGx0YWxrLmNzcycpO1xuXG5jb25zdCBjdXJyaWZ5ID0gcmVxdWlyZSgnY3VycmlmeScpO1xuY29uc3Qgc3RvcmUgPSByZXF1aXJlKCdmdWxsc3RvcmUnKTtcbmNvbnN0IGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCdAY2xvdWRjbWQvY3JlYXRlLWVsZW1lbnQnKTtcblxuY29uc3Qga2V5RG93biA9IGN1cnJpZnkoa2V5RG93bl8pO1xuXG5jb25zdCBCVVRUT05fT0sgPSB7XG4gICAgb2s6ICdPSycsXG59O1xuXG5jb25zdCBCVVRUT05fT0tfQ0FOQ0VMID0ge1xuICAgIG9rOiAnT0snLFxuICAgIGNhbmNlbDogJ0NhbmNlbCcsXG59O1xuXG5jb25zdCB6SW5kZXggPSBzdG9yZSgxMDApO1xuXG5leHBvcnRzLmFsZXJ0ID0gKHRpdGxlLCBtc2csIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBidXR0b25zID0gZ2V0QnV0dG9ucyhvcHRpb25zKSB8fCBCVVRUT05fT0s7XG4gICAgcmV0dXJuIHNob3dEaWFsb2codGl0bGUsIG1zZywgJycsIGJ1dHRvbnMsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0cy5wcm9tcHQgPSAodGl0bGUsIG1zZywgdmFsdWUgPSAnJywgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9wdGlvbnMpO1xuICAgIGNvbnN0IHZhbCA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgICBcbiAgICBjb25zdCB2YWx1ZVN0ciA9IGA8aW5wdXQgdHlwZT1cIiR7IHR5cGUgfVwiIHZhbHVlPVwiJHsgdmFsIH1cIiBkYXRhLW5hbWU9XCJqcy1pbnB1dFwiPmA7XG4gICAgY29uc3QgYnV0dG9ucyA9IGdldEJ1dHRvbnMob3B0aW9ucykgfHwgQlVUVE9OX09LX0NBTkNFTDtcbiAgICBcbiAgICByZXR1cm4gc2hvd0RpYWxvZyh0aXRsZSwgbXNnLCB2YWx1ZVN0ciwgYnV0dG9ucywgb3B0aW9ucyk7XG59O1xuXG5leHBvcnRzLmNvbmZpcm0gPSAodGl0bGUsIG1zZywgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBnZXRCdXR0b25zKG9wdGlvbnMpIHx8IEJVVFRPTl9PS19DQU5DRUw7XG4gICAgXG4gICAgcmV0dXJuIHNob3dEaWFsb2codGl0bGUsIG1zZywgJycsIGJ1dHRvbnMsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0cy5wcm9ncmVzcyA9ICh0aXRsZSwgbWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHZhbHVlU3RyID0gYFxuICAgICAgICA8cHJvZ3Jlc3MgdmFsdWU9XCIwXCIgZGF0YS1uYW1lPVwianMtcHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzXCIgbWF4PVwiMTAwXCI+PC9wcm9ncmVzcz5cbiAgICAgICAgPHNwYW4gZGF0YS1uYW1lPVwianMtY291bnRlclwiPjAlPC9zcGFuPlxuICAgIGA7XG4gICAgXG4gICAgY29uc3QgYnV0dG9ucyA9IHtcbiAgICAgICAgY2FuY2VsOiAnQWJvcnQnLFxuICAgIH07XG4gICAgXG4gICAgY29uc3QgcHJvbWlzZSA9IHNob3dEaWFsb2codGl0bGUsIG1lc3NhZ2UsIHZhbHVlU3RyLCBidXR0b25zLCBvcHRpb25zKTtcbiAgICBjb25zdCB7b2ssIGRpYWxvZ30gPSBwcm9taXNlO1xuICAgIGNvbnN0IHJlc29sdmUgPSBvaygpO1xuICAgIFxuICAgIGZpbmQoZGlhbG9nLCBbJ2NhbmNlbCddKS5tYXAoKGVsKSA9PiB7XG4gICAgICAgIGVsLmZvY3VzKCk7XG4gICAgfSk7XG4gICAgXG4gICAgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgICAgIHNldFByb2dyZXNzKGNvdW50KSB7XG4gICAgICAgICAgICBjb25zdCBbZWxQcm9ncmVzc10gPSBmaW5kKGRpYWxvZywgWydwcm9ncmVzcyddKTtcbiAgICAgICAgICAgIGNvbnN0IFtlbENvdW50ZXJdID0gZmluZChkaWFsb2csIFsnY291bnRlciddKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZWxQcm9ncmVzcy52YWx1ZSA9IGNvdW50O1xuICAgICAgICAgICAgZWxDb3VudGVyLnRleHRDb250ZW50ID0gYCR7Y291bnR9JWA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlKGRpYWxvZyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgcmVtb3ZlKCkge1xuICAgICAgICAgICAgcmVtb3ZlKGRpYWxvZyk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5mdW5jdGlvbiBnZXRCdXR0b25zKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtidXR0b25zfSA9IG9wdGlvbnM7XG4gICAgXG4gICAgaWYgKCFidXR0b25zKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBcbiAgICByZXR1cm4gYnV0dG9ucztcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7dHlwZX0gPSBvcHRpb25zO1xuICAgIFxuICAgIGlmICh0eXBlID09PSAncGFzc3dvcmQnKVxuICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkJztcbiAgICBcbiAgICByZXR1cm4gJ3RleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSh0aXRsZSwgbXNnLCB2YWx1ZSwgYnV0dG9ucykge1xuICAgIGNvbnN0IGVuY29kZWRNc2cgPSBtc2cucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gICAgXG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwicGFnZVwiPlxuICAgICAgICA8ZGl2IGRhdGEtbmFtZT1cImpzLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idXR0b25cIj48L2Rpdj5cbiAgICAgICAgPGhlYWRlcj4keyB0aXRsZSB9PC9oZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWFyZWFcIj4keyBlbmNvZGVkTXNnIH0keyB2YWx1ZSB9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYXJlYVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1zdHJpcFwiPlxuICAgICAgICAgICAgICAgICR7cGFyc2VCdXR0b25zKGJ1dHRvbnMpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnV0dG9ucyhidXR0b25zKSB7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhidXR0b25zKTtcbiAgICBjb25zdCBwYXJzZSA9IGN1cnJpZnkoKGJ1dHRvbnMsIG5hbWUsIGkpID0+IGA8YnV0dG9uXG4gICAgICAgICAgICB0YWJpbmRleD0ke2l9XG4gICAgICAgICAgICBkYXRhLW5hbWU9XCJqcy0ke25hbWUudG9Mb3dlckNhc2UoKX1cIj5cbiAgICAgICAgICAgICR7YnV0dG9uc1tuYW1lXX1cbiAgICAgICAgPC9idXR0b24+YCk7XG4gICAgXG4gICAgcmV0dXJuIG5hbWVzXG4gICAgICAgIC5tYXAocGFyc2UoYnV0dG9ucykpXG4gICAgICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gc2hvd0RpYWxvZyh0aXRsZSwgbXNnLCB2YWx1ZSwgYnV0dG9ucywgb3B0aW9ucykge1xuICAgIGNvbnN0IG9rID0gc3RvcmUoKTtcbiAgICBjb25zdCBjYW5jZWwgPSBzdG9yZSgpO1xuICAgIFxuICAgIGNvbnN0IGNsb3NlQnV0dG9ucyA9IFtcbiAgICAgICAgJ2NhbmNlbCcsXG4gICAgICAgICdjbG9zZScsXG4gICAgICAgICdvaycsXG4gICAgXTtcbiAgICBcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBub0NhbmNlbCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jYW5jZWwgPT09IGZhbHNlO1xuICAgICAgICBjb25zdCBlbXB0eSA9ICgpID0+IHt9O1xuICAgICAgICBjb25zdCByZWplY3RFcnJvciA9ICgpID0+IHJlamVjdChFcnJvcigpKTtcbiAgICAgICAgXG4gICAgICAgIG9rKHJlc29sdmUpO1xuICAgICAgICBjYW5jZWwobm9DYW5jZWwgPyBlbXB0eSA6IHJlamVjdEVycm9yKTtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCBpbm5lckhUTUwgPSBnZXRUZW1wbGF0ZSh0aXRsZSwgbXNnLCB2YWx1ZSwgYnV0dG9ucyk7XG4gICAgXG4gICAgY29uc3QgZGlhbG9nID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgICBpbm5lckhUTUwsXG4gICAgICAgIGNsYXNzTmFtZTogJ3NtYWxsdGFsaycsXG4gICAgICAgIHN0eWxlOiBgei1pbmRleDogJHt6SW5kZXgoekluZGV4KCkgKyAxKX1gLFxuICAgIH0pO1xuICAgIFxuICAgIGZvciAoY29uc3QgZWwgb2YgZmluZChkaWFsb2csIFsnb2snLCAnaW5wdXQnXSkpXG4gICAgICAgIGVsLmZvY3VzKCk7XG4gICAgXG4gICAgZm9yIChjb25zdCBlbCBvZiBmaW5kKGRpYWxvZywgWydpbnB1dCddKSkge1xuICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB2YWx1ZS5sZW5ndGgpO1xuICAgIH1cbiAgICBcbiAgICBhZGRMaXN0ZW5lckFsbCgnY2xpY2snLCBkaWFsb2csIGNsb3NlQnV0dG9ucywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNsb3NlRGlhbG9nKGV2ZW50LnRhcmdldCwgZGlhbG9nLCBvaygpLCBjYW5jZWwoKSk7XG4gICAgfSk7XG4gICAgXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51J10pXG4gICAgICAgIGRpYWxvZy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZmluZChkaWFsb2csIFsnb2snLCAnaW5wdXQnXSkpXG4gICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgXG4gICAgZGlhbG9nLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlEb3duKGRpYWxvZywgb2soKSwgY2FuY2VsKCkpKTtcbiAgICBcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgICAgIGRpYWxvZyxcbiAgICAgICAgb2ssXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGtleURvd25fKGRpYWxvZywgb2ssIGNhbmNlbCwgZXZlbnQpIHtcbiAgICBjb25zdCBLRVkgPSB7XG4gICAgICAgIEVOVEVSIDogMTMsXG4gICAgICAgIEVTQyAgIDogMjcsXG4gICAgICAgIFRBQiAgIDogOSxcbiAgICAgICAgTEVGVCAgOiAzNyxcbiAgICAgICAgVVAgICAgOiAzOCxcbiAgICAgICAgUklHSFQgOiAzOSxcbiAgICAgICAgRE9XTiAgOiA0MCxcbiAgICB9O1xuICAgIFxuICAgIGNvbnN0IHtrZXlDb2RlfSA9IGV2ZW50O1xuICAgIGNvbnN0IGVsID0gZXZlbnQudGFyZ2V0O1xuICAgIFxuICAgIGNvbnN0IG5hbWVzQWxsID0gWydvaycsICdjYW5jZWwnLCAnaW5wdXQnXTtcbiAgICBjb25zdCBuYW1lcyA9IGZpbmQoZGlhbG9nLCBuYW1lc0FsbClcbiAgICAgICAgLm1hcChnZXREYXRhTmFtZSk7XG4gICAgXG4gICAgc3dpdGNoKGtleUNvZGUpIHtcbiAgICBjYXNlIEtFWS5FTlRFUjpcbiAgICAgICAgY2xvc2VEaWFsb2coZWwsIGRpYWxvZywgb2ssIGNhbmNlbCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgS0VZLkVTQzpcbiAgICAgICAgcmVtb3ZlKGRpYWxvZyk7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgICBicmVhaztcbiAgICBcbiAgICBjYXNlIEtFWS5UQUI6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgICAgICAgIHRhYihkaWFsb2csIG5hbWVzKTtcbiAgICAgICAgXG4gICAgICAgIHRhYihkaWFsb2csIG5hbWVzKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgXG4gICAgZGVmYXVsdDpcbiAgICAgICAgWydsZWZ0JywgJ3JpZ2h0JywgJ3VwJywgJ2Rvd24nXS5maWx0ZXIoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBrZXlDb2RlID09PSBLRVlbbmFtZS50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgfSkuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBjaGFuZ2VCdXR0b25Gb2N1cyhkaWFsb2csIG5hbWVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFOYW1lKGVsKSB7XG4gICAgcmV0dXJuIGVsXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpXG4gICAgICAgIC5yZXBsYWNlKCdqcy0nLCAnJyk7XG59XG5cbmNvbnN0IGdldE5hbWUgPSAoYWN0aXZlTmFtZSkgPT4ge1xuICAgIGlmIChhY3RpdmVOYW1lID09PSAnY2FuY2VsJylcbiAgICAgICAgcmV0dXJuICdvayc7XG4gICAgXG4gICAgcmV0dXJuICdjYW5jZWwnO1xufTtcblxuZnVuY3Rpb24gY2hhbmdlQnV0dG9uRm9jdXMoZGlhbG9nLCBuYW1lcykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYWN0aXZlTmFtZSA9IGdldERhdGFOYW1lKGFjdGl2ZSk7XG4gICAgY29uc3QgaXNCdXR0b24gPSAvb2t8Y2FuY2VsLy50ZXN0KGFjdGl2ZU5hbWUpO1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMubGVuZ3RoIC0gMTtcbiAgICBcbiAgICBpZiAoYWN0aXZlTmFtZSA9PT0gJ2lucHV0JyB8fCAhY291bnQgfHwgIWlzQnV0dG9uKVxuICAgICAgICByZXR1cm47XG4gICAgXG4gICAgY29uc3QgbmFtZSA9IGdldE5hbWUoYWN0aXZlTmFtZSk7XG4gICAgXG4gICAgZm9yIChjb25zdCBlbCBvZiBmaW5kKGRpYWxvZywgW25hbWVdKSkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgIH1cbn1cblxuY29uc3QgZ2V0SW5kZXggPSAoY291bnQsIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSBjb3VudClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgXG4gICAgcmV0dXJuIGluZGV4ICsgMTtcbn07XG5cbmZ1bmN0aW9uIHRhYihkaWFsb2csIG5hbWVzKSB7XG4gICAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhY3RpdmVOYW1lID0gZ2V0RGF0YU5hbWUoYWN0aXZlKTtcbiAgICBjb25zdCBjb3VudCA9IG5hbWVzLmxlbmd0aCAtIDE7XG4gICAgXG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBuYW1lcy5pbmRleE9mKGFjdGl2ZU5hbWUpO1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0SW5kZXgoY291bnQsIGFjdGl2ZUluZGV4KTtcbiAgICBcbiAgICBjb25zdCBuYW1lID0gbmFtZXNbaW5kZXhdO1xuICAgIFxuICAgIGZvciAoY29uc3QgZWwgb2YgZmluZChkaWFsb2csIFtuYW1lXSkpXG4gICAgICAgIGVsLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlRGlhbG9nKGVsLCBkaWFsb2csIG9rLCBjYW5jZWwpIHtcbiAgICBjb25zdCBuYW1lID0gZWxcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJylcbiAgICAgICAgLnJlcGxhY2UoJ2pzLScsICcnKTtcbiAgICBcbiAgICBpZiAoL2Nsb3NlfGNhbmNlbC8udGVzdChuYW1lKSkge1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmVtb3ZlKGRpYWxvZyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFsdWUgPSBmaW5kKGRpYWxvZywgWydpbnB1dCddKVxuICAgICAgICAucmVkdWNlKCh2YWx1ZSwgZWwpID0+IGVsLnZhbHVlLCBudWxsKTtcbiAgICBcbiAgICBvayh2YWx1ZSk7XG4gICAgcmVtb3ZlKGRpYWxvZyk7XG59XG5cbmNvbnN0IHF1ZXJ5ID0gY3VycmlmeSgoZWxlbWVudCwgbmFtZSkgPT4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1uYW1lPVwianMtJHsgbmFtZSB9XCJdYCkpO1xuXG5mdW5jdGlvbiBmaW5kKGVsZW1lbnQsIG5hbWVzKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBuYW1lc1xuICAgICAgICAubWFwKHF1ZXJ5KGVsZW1lbnQpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIFxuICAgIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gYWRkTGlzdGVuZXJBbGwoZXZlbnQsIHBhcmVudCwgZWxlbWVudHMsIGZuKSB7XG4gICAgZm9yIChjb25zdCBlbCBvZiBmaW5kKHBhcmVudCwgZWxlbWVudHMpKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZShkaWFsb2cpIHtcbiAgICBjb25zdCB7cGFyZW50RWxlbWVudH0gPSBkaWFsb2c7XG4gICAgXG4gICAgaWYgKHBhcmVudEVsZW1lbnQpXG4gICAgICAgIHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZGlhbG9nKTtcbn1cblxuIiwiaW1wb3J0IHsgcHJvZ3Jlc3MgfSBmcm9tIFwic21hbGx0YWxrXCI7XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzcyB7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aXRsZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3ModGl0bGUsIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnByb2dyZXNzLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChlICYmIChlLmNvbnN0cnVjdG9yICE9PSBFcnJvciB8fCBlLm1lc3NhZ2UgIT09IFwiXCIpKSBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2cgPSB0aGlzLnByb2dyZXNzLmRpYWxvZztcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzZWQgPSAwLCByYW5nZSA9IGNvbGxlY3Rpb24ubGVuZ3RoLCBhY2N1bSA9IDAsIHBjdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZ1bmMoaXRlbSwgcHJvY2Vzc2VkKyssIGNvbGxlY3Rpb24sIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBhY2N1bSArPSAxMDA7XG4gICAgICAgICAgICAgICAgaWYgKGFjY3VtID4gcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluZGVyID0gYWNjdW0gJSByYW5nZSwgc3RlcCA9IChhY2N1bSAtIHJlbWFpbmRlcikgLyByYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5zZXRQcm9ncmVzcyhwY3QgKz0gc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtID0gcmVtYWluZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwY3QgPCAxMDApXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5zZXRQcm9ncmVzcygxMDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IHRpdGxlKHRleHQpIHsgdGhpcy5kaWFsb2cucXVlcnlTZWxlY3RvcihcImhlYWRlclwiKS50ZXh0Q29udGVudCA9IHRleHQ7IH1cbiAgICBnZXQgdGl0bGUoKSB7IHJldHVybiB0aGlzLmRpYWxvZy5xdWVyeVNlbGVjdG9yKFwiaGVhZGVyXCIpLnRleHRDb250ZW50OyB9XG5cbiAgICBzZXQgbWVzc2FnZSh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmRpYWxvZy5xdWVyeVNlbGVjdG9yKFwiLmNvbnRlbnQtYXJlYVwiKS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoXCIuY29udGVudC1hcmVhXCIpLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBwcm9tcHQgfSBmcm9tIFwic21hbGx0YWxrXCI7XG5cbmltcG9ydCBcIi4vdmFsaWRhdGlvbi5zY3NzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZWRJbnB1dCh0aXRsZSwgbWVzc2FnZSwgdmFsdWUgPSBcIlwiLCByZWdleCA9IFwiLipcIiwgd2hhdCA9IFwiZW50cnlcIikge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcHJvbXB0KHRpdGxlLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlucHV0RmllbGQgPSBpbnB1dC5kaWFsb2cuZmluZChcImlucHV0XCIpO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gKHQpID0+IG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKS50ZXN0KHQpO1xuXG4gICAgICAgIGlucHV0RmllbGQuc2V0U2VsZWN0aW9uUmFuZ2UodmFsdWUubGVuZ3RoLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICBpbnB1dEZpZWxkLnBhdHRlcm4gPSByZWdleDtcbiAgICAgICAgaW5wdXRGaWVsZC5vbmlucHV0ID0gKCkgPT4gaW5wdXRGaWVsZC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWludmFsaWRcIiwgIWlzVmFsaWQoaW5wdXRGaWVsZC52YWx1ZSkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGlucHV0O1xuICAgICAgICBpZiAoaXNWYWxpZChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIG5ldyBOb3RpY2UoYFwiJHtyZXN1bHR9XCIgaXMgbm90IGEgdmFsaWQgJHt3aGF0fWApO1xuICAgIH1cbn1cbiIsImNvbnN0IHRhZ0JvZHkgPSAvXiNbXlxcdTIwMDAtXFx1MjA2RlxcdTJFMDAtXFx1MkU3RichXCIjJCUmKCkqKywuOjs8PT4/QF5ge3x9flxcW1xcXVxcXFxcXHNdKyQvO1xuXG5leHBvcnQgY2xhc3MgVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBoYXNoZWQgPSB0aGlzLnRhZyA9IFRhZy50b1RhZyhuYW1lKSxcbiAgICAgICAgICAgIGNhbm9uaWNhbCA9IHRoaXMuY2Fub25pY2FsID0gaGFzaGVkLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBjYW5vbmljYWxfcHJlZml4ID0gdGhpcy5jYW5vbmljYWxfcHJlZml4ID0gY2Fub25pY2FsICsgXCIvXCI7XG4gICAgICAgIHRoaXMubmFtZSA9IGhhc2hlZC5zbGljZSgxKTtcbiAgICAgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGV4dCA9PSBjYW5vbmljYWwgfHwgdGV4dC5zdGFydHNXaXRoKGNhbm9uaWNhbF9wcmVmaXgpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMudGFnOyB9XG5cbiAgICBzdGF0aWMgaXNUYWcocykgeyByZXR1cm4gdGFnQm9keS50ZXN0KHMpOyB9XG5cbiAgICBzdGF0aWMgdG9UYWcobmFtZSkge1xuICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKFwiIyNcIikpIG5hbWUgPSBuYW1lLnNsaWNlKDEpO1xuICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiI1wiKSA/IG5hbWUgOiBcIiNcIituYW1lO1xuICAgIH1cblxuICAgIHN0YXRpYyBjYW5vbmljYWwobmFtZSkge1xuICAgICAgICByZXR1cm4gVGFnLnRvVGFnKG5hbWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVwbGFjZW1lbnQge1xuXG4gICAgY29uc3RydWN0b3IoZnJvbVRhZywgdG9UYWcpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAgICAgICAgICAgICBbZnJvbVRhZy50YWddOiAgdG9UYWcudGFnLFxuICAgICAgICAgICAgICAgIFtmcm9tVGFnLm5hbWVdOiB0b1RhZy5uYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuaW5TdHJpbmcgPSBmdW5jdGlvbih0ZXh0LCBwb3MgPSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZSgwLCBwb3MpICsgdG9UYWcudGFnICsgdGV4dC5zbGljZShwb3MgKyBmcm9tVGFnLnRhZy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbkFycmF5ID0gKHRhZ3MsIHNraXBPZGQsIGlzQWxpYXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YWdzLm1hcCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChza2lwT2RkICYmIChpICYgMSkpIHJldHVybiB0OyAgIC8vIGxlYXZlIG9kZCBlbnRyaWVzIChzZXBhcmF0b3JzKSBhbG9uZVxuICAgICAgICAgICAgICAgIC8vIE9ic2lkaWFuIGFsbG93cyBzcGFjZXMgYXMgc2VwYXJhdG9ycyB3aXRoaW4gYXJyYXkgZWxlbWVudHNcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIC8vIFNraXAgbm9uLXRhZyBwYXJ0c1xuICAgICAgICAgICAgICAgIGlmIChpc0FsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdC5zdGFydHNXaXRoKFwiI1wiKSB8fCAhVGFnLmlzVGFnKHQpKSByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9bICxcXG5dLy50ZXN0KHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluQXJyYXkodC5zcGxpdCgvKFssIFxcbl0rKS8pLCB0cnVlKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVbdF0pIHJldHVybiBjYWNoZVt0XTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYyA9IHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVbbGNdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVt0XSA9IGNhY2hlW2xjXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxjLnN0YXJ0c1dpdGgoZnJvbVRhZy5jYW5vbmljYWxfcHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVbdF0gPSBjYWNoZVtsY10gPSB0aGlzLmluU3RyaW5nKHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKFwiI1wiICsgbGMpLnN0YXJ0c1dpdGgoZnJvbVRhZy5jYW5vbmljYWxfcHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVbdF0gPSBjYWNoZVtsY10gPSB0aGlzLmluU3RyaW5nKFwiI1wiICsgdCkuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVt0XSA9IGNhY2hlW2xjXSA9IHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLndpbGxNZXJnZVRhZ3MgPSBmdW5jdGlvbiAodGFnTmFtZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbmFtaW5nIHRvIGNoYW5nZSBjYXNlIGRvZXNuJ3QgbG9zZSBpbmZvLCBzbyBpZ25vcmUgaXRcbiAgICAgICAgICAgIGlmIChmcm9tVGFnLmNhbm9uaWNhbCA9PT0gdG9UYWcuY2Fub25pY2FsKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3IFNldCh0YWdOYW1lcy5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0YWdOYW1lIG9mIHRhZ05hbWVzLmZpbHRlcihmcm9tVGFnLm1hdGNoZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuaW5TdHJpbmcodGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmhhcyhjaGFuZ2VkLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBUYWcodGFnTmFtZSksIG5ldyBUYWcoY2hhbmdlZCldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuIiwiY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSID0gU3ltYm9sLmZvcigneWFtbC5zY2FsYXInKTtcbmNvbnN0IFNFUSA9IFN5bWJvbC5mb3IoJ3lhbWwuc2VxJyk7XG5jb25zdCBOT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCd5YW1sLm5vZGUudHlwZScpO1xuY29uc3QgaXNBbGlhcyA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gQUxJQVM7XG5jb25zdCBpc0RvY3VtZW50ID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBET0M7XG5jb25zdCBpc01hcCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gTUFQO1xuY29uc3QgaXNQYWlyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBQQUlSO1xuY29uc3QgaXNTY2FsYXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFNDQUxBUjtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgTUFQOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgQUxJQVM6XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgISFub2RlLmFuY2hvcjtcbmNsYXNzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZS4gICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQUxJQVMsIERPQywgTUFQLCBOT0RFX1RZUEUsIE5vZGVCYXNlLCBQQUlSLCBTQ0FMQVIsIFNFUSwgaGFzQW5jaG9yLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH07XG4iLCJpbXBvcnQgeyBpc0RvY3VtZW50LCBpc01hcCwgaXNTZXEsIGlzUGFpciwgaXNTY2FsYXIsIGlzQWxpYXMsIGlzTm9kZSwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi9ub2Rlcy9Ob2RlLmpzJztcblxuY29uc3QgQlJFQUsgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQID0gU3ltYm9sKCdza2lwIGNoaWxkcmVuJyk7XG5jb25zdCBSRU1PVkUgPSBTeW1ib2woJ3JlbW92ZSBub2RlJyk7XG4vKipcbiAqIEFwcGx5IGEgdmlzaXRvciB0byBhbiBBU1Qgbm9kZSBvciBkb2N1bWVudC5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSBgbm9kZWAsIGNhbGxpbmcgYVxuICogYHZpc2l0b3JgIGZ1bmN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogICAtIGBrZXlgOiBGb3Igc2VxdWVuY2UgdmFsdWVzIGFuZCBtYXAgYFBhaXJgLCB0aGUgbm9kZSdzIGluZGV4IGluIHRoZVxuICogICAgIGNvbGxlY3Rpb24uIFdpdGhpbiBhIGBQYWlyYCwgYCdrZXknYCBvciBgJ3ZhbHVlJ2AsIGNvcnJlc3BvbmRpbmdseS5cbiAqICAgICBgbnVsbGAgZm9yIHRoZSByb290IG5vZGUuXG4gKiAgIC0gYG5vZGVgOiBUaGUgY3VycmVudCBub2RlLlxuICogICAtIGBwYXRoYDogVGhlIGFuY2VzdHJ5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvciBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSB0cmF2ZXJzYWw6XG4gKiAgIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBEbyBub3RoaW5nIGFuZCBjb250aW51ZVxuICogICAtIGB2aXNpdC5TS0lQYDogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGNvbnRpbnVlIHdpdGggbmV4dFxuICogICAgIHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgTm9kZWA6IFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSBieSB2aXNpdGluZyBpdFxuICogICAtIGBudW1iZXJgOiBXaGlsZSBpdGVyYXRpbmcgdGhlIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwLCBzZXQgdGhlIGluZGV4XG4gKiAgICAgb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRcbiAqICAgICBub2RlIGhhcyBjaGFuZ2VkLlxuICpcbiAqIElmIGB2aXNpdG9yYCBpcyBhIHNpbmdsZSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdmFsdWVzXG4gKiBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIGUuZy4gYG51bGxgIHZhbHVlcy4gQWx0ZXJuYXRpdmVseSxcbiAqIHNlcGFyYXRlIHZpc2l0b3IgZnVuY3Rpb25zIG1heSBiZSBkZWZpbmVkIGZvciBlYWNoIGBNYXBgLCBgUGFpcmAsIGBTZXFgLFxuICogYEFsaWFzYCBhbmQgYFNjYWxhcmAgbm9kZS4gVG8gZGVmaW5lIHRoZSBzYW1lIHZpc2l0b3IgZnVuY3Rpb24gZm9yIG1vcmUgdGhhblxuICogb25lIG5vZGUgdHlwZSwgdXNlIHRoZSBgQ29sbGVjdGlvbmAgKG1hcCBhbmQgc2VxKSwgYFZhbHVlYCAobWFwLCBzZXEgJiBzY2FsYXIpXG4gKiBhbmQgYE5vZGVgIChhbGlhcywgbWFwLCBzZXEgJiBzY2FsYXIpIHRhcmdldHMuIE9mIGFsbCB0aGVzZSwgb25seSB0aGUgbW9zdFxuICogc3BlY2lmaWMgZGVmaW5lZCBvbmUgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KG5vZGUsIHZpc2l0b3IpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdvYmplY3QnICYmXG4gICAgICAgICh2aXNpdG9yLkNvbGxlY3Rpb24gfHwgdmlzaXRvci5Ob2RlIHx8IHZpc2l0b3IuVmFsdWUpKSB7XG4gICAgICAgIHZpc2l0b3IgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIEFsaWFzOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLk5vZGVcbiAgICAgICAgfSwgdmlzaXRvci5WYWx1ZSAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuVmFsdWVcbiAgICAgICAgfSwgdmlzaXRvci5Db2xsZWN0aW9uICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Db2xsZWN0aW9uLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLkNvbGxlY3Rpb25cbiAgICAgICAgfSwgdmlzaXRvcik7XG4gICAgfVxuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gX3Zpc2l0KG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3IsIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgX3Zpc2l0KG51bGwsIG5vZGUsIHZpc2l0b3IsIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXQuQlJFQUsgPSBCUkVBSztcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlNLSVAgPSBTS0lQO1xuLyoqIFJlbW92ZSB0aGUgY3VycmVudCBub2RlICovXG52aXNpdC5SRU1PVkUgPSBSRU1PVkU7XG5mdW5jdGlvbiBfdmlzaXQoa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgbGV0IGN0cmwgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBjdHJsID0gdmlzaXRvcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGVsc2UgaWYgKGlzTWFwKG5vZGUpKSB7XG4gICAgICAgIGlmICh2aXNpdG9yLk1hcClcbiAgICAgICAgICAgIGN0cmwgPSB2aXNpdG9yLk1hcChrZXksIG5vZGUsIHBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NlcShub2RlKSkge1xuICAgICAgICBpZiAodmlzaXRvci5TZXEpXG4gICAgICAgICAgICBjdHJsID0gdmlzaXRvci5TZXEoa2V5LCBub2RlLCBwYXRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgIGlmICh2aXNpdG9yLlBhaXIpXG4gICAgICAgICAgICBjdHJsID0gdmlzaXRvci5QYWlyKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU2NhbGFyKG5vZGUpKSB7XG4gICAgICAgIGlmICh2aXNpdG9yLlNjYWxhcilcbiAgICAgICAgICAgIGN0cmwgPSB2aXNpdG9yLlNjYWxhcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FsaWFzKG5vZGUpKSB7XG4gICAgICAgIGlmICh2aXNpdG9yLkFsaWFzKVxuICAgICAgICAgICAgY3RybCA9IHZpc2l0b3IuQWxpYXMoa2V5LCBub2RlLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKGlzTm9kZShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHBhcmVudC5pdGVtc1trZXldID0gY3RybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIocGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgcGFyZW50LmtleSA9IGN0cmw7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFyZW50LnZhbHVlID0gY3RybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RvY3VtZW50KHBhcmVudCkpIHtcbiAgICAgICAgICAgIHBhcmVudC5jb250ZW50cyA9IGN0cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwdCA9IGlzQWxpYXMocGFyZW50KSA/ICdhbGlhcycgOiAnc2NhbGFyJztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlcGxhY2Ugbm9kZSB3aXRoICR7cHR9IHBhcmVudGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdmlzaXQoa2V5LCBjdHJsLCB2aXNpdG9yLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdHJsICE9PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IF92aXNpdChpLCBub2RlLml0ZW1zW2ldLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgY29uc3QgY2sgPSBfdmlzaXQoJ2tleScsIG5vZGUua2V5LCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjayA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2sgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLmtleSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjdiA9IF92aXNpdCgndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3YgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cblxuZXhwb3J0IHsgdmlzaXQgfTtcbiIsImltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5cbmNvbnN0IGVzY2FwZUNoYXJzID0ge1xuICAgICchJzogJyUyMScsXG4gICAgJywnOiAnJTJDJyxcbiAgICAnWyc6ICclNUInLFxuICAgICddJzogJyU1RCcsXG4gICAgJ3snOiAnJTdCJyxcbiAgICAnfSc6ICclN0QnXG59O1xuY29uc3QgZXNjYXBlVGFnTmFtZSA9ICh0bikgPT4gdG4ucmVwbGFjZSgvWyEsW1xcXXt9XS9nLCBjaCA9PiBlc2NhcGVDaGFyc1tjaF0pO1xuY2xhc3MgRGlyZWN0aXZlcyB7XG4gICAgY29uc3RydWN0b3IoeWFtbCwgdGFncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpcmVjdGl2ZXMtZW5kL2RvYy1zdGFydCBtYXJrZXIgYC0tLWAuIElmIGBudWxsYCwgYSBtYXJrZXIgbWF5IHN0aWxsIGJlXG4gICAgICAgICAqIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudCdzIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnlhbWwgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLCB5YW1sKTtcbiAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncywgdGFncyk7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gbmV3IERpcmVjdGl2ZXModGhpcy55YW1sLCB0aGlzLnRhZ3MpO1xuICAgICAgICBjb3B5Lm1hcmtlciA9IHRoaXMubWFya2VyO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHVyaW5nIHBhcnNpbmcsIGdldCBhIERpcmVjdGl2ZXMgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZFxuICAgICAqIHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uJ3Mgc3BlYy5cbiAgICAgKi9cbiAgICBhdERvY3VtZW50KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy55YW1sLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgLSBNYXkgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzXG4gICAgICovXG4gICAgYWRkKGxpbmUsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuYXROZXh0RG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMueWFtbCA9IHsgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsIHZlcnNpb246ICcxLjEnIH07XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9bIFxcdF0rLyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJyVUQUcnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclVEFHIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IHR3byBwYXJ0cycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhbmRsZSwgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc1toYW5kbGVdID0gcHJlZml4O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJVlBTUwnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sLmV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclWUFNTCBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgcGFydCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IFt2ZXJzaW9uXSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09PSAnMS4xJyB8fCB2ZXJzaW9uID09PSAnMS4yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcig2LCBgVW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uICR7dmVyc2lvbn1gLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb25FcnJvcigwLCBgVW5rbm93biBkaXJlY3RpdmUgJHtuYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIHRhZywgbWF0Y2hpbmcgaGFuZGxlcyB0byB0aG9zZSBkZWZpbmVkIGluICVUQUcgZGlyZWN0aXZlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVkIHRhZywgd2hpY2ggbWF5IGFsc28gYmUgdGhlIG5vbi1zcGVjaWZpYyB0YWcgYCchJ2Agb3IgYVxuICAgICAqICAgYCchbG9jYWwnYCB0YWcsIG9yIGBudWxsYCBpZiB1bnJlc29sdmFibGUuXG4gICAgICovXG4gICAgdGFnTmFtZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJyEnKVxuICAgICAgICAgICAgcmV0dXJuICchJzsgLy8gbm9uLXNwZWNpZmljIHRhZ1xuICAgICAgICBpZiAoc291cmNlWzBdICE9PSAnIScpIHtcbiAgICAgICAgICAgIG9uRXJyb3IoYE5vdCBhIHZhbGlkIHRhZzogJHtzb3VyY2V9YCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlWzFdID09PSAnPCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmJhdGltID0gc291cmNlLnNsaWNlKDIsIC0xKTtcbiAgICAgICAgICAgIGlmICh2ZXJiYXRpbSA9PT0gJyEnIHx8IHZlcmJhdGltID09PSAnISEnKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihgVmVyYmF0aW0gdGFncyBhcmVuJ3QgcmVzb2x2ZWQsIHNvICR7c291cmNlfSBpcyBpbnZhbGlkLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09ICc+JylcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdWZXJiYXRpbSB0YWdzIG11c3QgZW5kIHdpdGggYSA+Jyk7XG4gICAgICAgICAgICByZXR1cm4gdmVyYmF0aW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgWywgaGFuZGxlLCBzdWZmaXhdID0gc291cmNlLm1hdGNoKC9eKC4qISkoW14hXSopJC8pO1xuICAgICAgICBpZiAoIXN1ZmZpeClcbiAgICAgICAgICAgIG9uRXJyb3IoYFRoZSAke3NvdXJjZX0gdGFnIGhhcyBubyBzdWZmaXhgKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy50YWdzW2hhbmRsZV07XG4gICAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIHZpc2l0KGRvYy5jb250ZW50cywgKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuZXhwb3J0IHsgRGlyZWN0aXZlcyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgdGhlIGlucHV0IHN0cmluZyBpcyBhIHZhbGlkIGFuY2hvci5cbiAqXG4gKiBXaWxsIHRocm93IG9uIGVycm9ycy5cbiAqL1xuZnVuY3Rpb24gYW5jaG9ySXNWYWxpZChhbmNob3IpIHtcbiAgICBpZiAoL1tcXHgwMC1cXHgxOVxccyxbXFxde31dLy50ZXN0KGFuY2hvcikpIHtcbiAgICAgICAgY29uc3Qgc2EgPSBKU09OLnN0cmluZ2lmeShhbmNob3IpO1xuICAgICAgICBjb25zdCBtc2cgPSBgQW5jaG9yIG11c3Qgbm90IGNvbnRhaW4gd2hpdGVzcGFjZSBvciBjb250cm9sIGNoYXJhY3RlcnM6ICR7c2F9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYW5jaG9yTmFtZXMocm9vdCkge1xuICAgIGNvbnN0IGFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgdmlzaXQocm9vdCwge1xuICAgICAgICBWYWx1ZShfa2V5LCBub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5hbmNob3IpXG4gICAgICAgICAgICAgICAgYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFuY2hvcnM7XG59XG4vKiogRmluZCBhIG5ldyBhbmNob3IgbmFtZSB3aXRoIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYSBvbmUtaW5kZXhlZCBzdWZmaXguICovXG5mdW5jdGlvbiBmaW5kTmV3QW5jaG9yKHByZWZpeCwgZXhjbHVkZSkge1xuICAgIGZvciAobGV0IGkgPSAxOyB0cnVlOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGAke3ByZWZpeH0ke2l9YDtcbiAgICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVBbmNob3JzKGRvYywgcHJlZml4KSB7XG4gICAgY29uc3QgYWxpYXNPYmplY3RzID0gW107XG4gICAgY29uc3Qgc291cmNlT2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgcHJldkFuY2hvcnMgPSBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIG9uQW5jaG9yKHNvdXJjZSkge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGlmICghcHJldkFuY2hvcnMpXG4gICAgICAgICAgICAgICAgcHJldkFuY2hvcnMgPSBhbmNob3JOYW1lcyhkb2MpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzKCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgYWxpYXNPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmID0gc291cmNlT2JqZWN0cy5nZXQoc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmLmFuY2hvciAmJlxuICAgICAgICAgICAgICAgICAgICAoaXNTY2FsYXIocmVmLm5vZGUpIHx8IGlzQ29sbGVjdGlvbihyZWYubm9kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5ub2RlLmFuY2hvciA9IHJlZi5hbmNob3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgcmVwZWF0ZWQgb2JqZWN0ICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlT2JqZWN0c1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFuY2hvcklzVmFsaWQsIGFuY2hvck5hbWVzLCBjcmVhdGVOb2RlQW5jaG9ycywgZmluZE5ld0FuY2hvciB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHsgTm9kZUJhc2UsIEFMSUFTLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzUGFpciB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmNsYXNzIEFsaWFzIGV4dGVuZHMgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihBTElBUyk7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RhZycsIHtcbiAgICAgICAgICAgIHNldCgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsaWFzIG5vZGVzIGNhbm5vdCBoYXZlIHRhZ3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHZhbHVlIG9mIHRoaXMgYWxpYXMgd2l0aGluIGBkb2NgLCBmaW5kaW5nIHRoZSBsYXN0XG4gICAgICogaW5zdGFuY2Ugb2YgdGhlIGBzb3VyY2VgIGFuY2hvciBiZWZvcmUgdGhpcyBub2RlLlxuICAgICAqL1xuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmlzaXQoZG9jLCB7XG4gICAgICAgICAgICBOb2RlOiAoX2tleSwgbm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB0aGlzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXQuQlJFQUs7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICB0b0pTT04oX2FyZywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICBjb25zdCB7IGFuY2hvcnMsIGRvYywgbWF4QWxpYXNDb3VudCB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmUoZG9jKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICghZGF0YSB8fCBkYXRhLnJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnVGhpcyBzaG91bGQgbm90IGhhcHBlbjogQWxpYXMgYW5jaG9yIHdhcyBub3QgcmVzb2x2ZWQ/JztcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhBbGlhc0NvdW50ID49IDApIHtcbiAgICAgICAgICAgIGRhdGEuY291bnQgKz0gMTtcbiAgICAgICAgICAgIGlmIChkYXRhLmFsaWFzQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgZGF0YS5hbGlhc0NvdW50ID0gZ2V0QWxpYXNDb3VudChkb2MsIHNvdXJjZSwgYW5jaG9ycyk7XG4gICAgICAgICAgICBpZiAoZGF0YS5jb3VudCAqIGRhdGEuYWxpYXNDb3VudCA+IG1heEFsaWFzQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YS5yZXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgX29uQ29tbWVudCwgX29uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IGAqJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICBhbmNob3JJc1ZhbGlkKHRoaXMuc291cmNlKTtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy52ZXJpZnlBbGlhc09yZGVyICYmICFjdHguYW5jaG9ycy5oYXModGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdHguaW1wbGljaXRLZXkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3NyY30gYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3JjO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEFsaWFzQ291bnQoZG9jLCBub2RlLCBhbmNob3JzKSB7XG4gICAgaWYgKGlzQWxpYXMobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gbm9kZS5yZXNvbHZlKGRvYyk7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGFuY2hvcnMgJiYgc291cmNlICYmIGFuY2hvcnMuZ2V0KHNvdXJjZSk7XG4gICAgICAgIHJldHVybiBhbmNob3IgPyBhbmNob3IuY291bnQgKiBhbmNob3IuYWxpYXNDb3VudCA6IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygbm9kZS5pdGVtcykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGdldEFsaWFzQ291bnQoZG9jLCBpdGVtLCBhbmNob3JzKTtcbiAgICAgICAgICAgIGlmIChjID4gY291bnQpXG4gICAgICAgICAgICAgICAgY291bnQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGtjID0gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUua2V5LCBhbmNob3JzKTtcbiAgICAgICAgY29uc3QgdmMgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS52YWx1ZSwgYW5jaG9ycyk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChrYywgdmMpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbn1cblxuZXhwb3J0IHsgQWxpYXMgfTtcbiIsImltcG9ydCB7IGhhc0FuY2hvciB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY29udmVydCBhbnkgbm9kZSBvciBpdHMgY29udGVudHMgdG8gbmF0aXZlIEphdmFTY3JpcHRcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5wdXQgdmFsdWVcbiAqIEBwYXJhbSBhcmcgLSBJZiBgdmFsdWVgIGRlZmluZXMgYSBgdG9KU09OKClgIG1ldGhvZCwgdXNlIHRoaXNcbiAqICAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0gY3R4IC0gQ29udmVyc2lvbiBjb250ZXh0LCBvcmlnaW5hbGx5IHNldCBpbiBEb2N1bWVudCN0b0pTKCkuIElmXG4gKiAgIGB7IGtlZXA6IHRydWUgfWAgaXMgbm90IHNldCwgb3V0cHV0IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgSlNPTlxuICogICBzdHJpbmdpZmljYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRvSlModmFsdWUsIGFyZywgY3R4KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4gdmFsdWUubWFwKCh2LCBpKSA9PiB0b0pTKHYsIFN0cmluZyhpKSwgY3R4KSk7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKCFjdHggfHwgIWhhc0FuY2hvcih2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9KU09OKGFyZywgY3R4KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHsgYWxpYXNDb3VudDogMCwgY291bnQ6IDEsIHJlczogdW5kZWZpbmVkIH07XG4gICAgICAgIGN0eC5hbmNob3JzLnNldCh2YWx1ZSwgZGF0YSk7XG4gICAgICAgIGN0eC5vbkNyZWF0ZSA9IHJlcyA9PiB7XG4gICAgICAgICAgICBkYXRhLnJlcyA9IHJlcztcbiAgICAgICAgICAgIGRlbGV0ZSBjdHgub25DcmVhdGU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGlmIChjdHgub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUocmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgJiYgIShjdHggJiYgY3R4LmtlZXApKVxuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCB7IHRvSlMgfTtcbiIsImltcG9ydCB7IE5vZGVCYXNlLCBTQ0FMQVIgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4vdG9KUy5qcyc7XG5cbmNvbnN0IGlzU2NhbGFyVmFsdWUgPSAodmFsdWUpID0+ICF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpO1xuY2xhc3MgU2NhbGFyIGV4dGVuZHMgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFNDQUxBUik7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdG9KU09OKGFyZywgY3R4KSB7XG4gICAgICAgIHJldHVybiBjdHggJiYgY3R4LmtlZXAgPyB0aGlzLnZhbHVlIDogdG9KUyh0aGlzLnZhbHVlLCBhcmcsIGN0eCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH1cbn1cblNjYWxhci5CTE9DS19GT0xERUQgPSAnQkxPQ0tfRk9MREVEJztcblNjYWxhci5CTE9DS19MSVRFUkFMID0gJ0JMT0NLX0xJVEVSQUwnO1xuU2NhbGFyLlBMQUlOID0gJ1BMQUlOJztcblNjYWxhci5RVU9URV9ET1VCTEUgPSAnUVVPVEVfRE9VQkxFJztcblNjYWxhci5RVU9URV9TSU5HTEUgPSAnUVVPVEVfU0lOR0xFJztcblxuZXhwb3J0IHsgU2NhbGFyLCBpc1NjYWxhclZhbHVlIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyLCBNQVAsIFNFUSwgaXNEb2N1bWVudCB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgZGVmYXVsdFRhZ1ByZWZpeCA9ICd0YWc6eWFtbC5vcmcsMjAwMjonO1xuZnVuY3Rpb24gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgdGFncykge1xuICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpIHx8IG1hdGNoWzBdO1xuICAgICAgICBpZiAoIXRhZ09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnICR7dGFnTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmZpbmQodCA9PiB0LmlkZW50aWZ5ICYmIHQuaWRlbnRpZnkodmFsdWUpICYmICF0LmZvcm1hdCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlLCB0YWdOYW1lLCBjdHgpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGlmIChpc0RvY3VtZW50KHZhbHVlKSlcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb250ZW50cztcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChpc1BhaXIodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IChfYiA9IChfYSA9IGN0eC5zY2hlbWFbTUFQXSkuY3JlYXRlTm9kZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludCkgLy8gbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlXG4gICAgKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2VyaWFsaXplanNvbnByb3BlcnR5XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgICBjb25zdCB7IGFsaWFzRHVwbGljYXRlT2JqZWN0cywgb25BbmNob3IsIG9uVGFnT2JqLCBzY2hlbWEsIHNvdXJjZU9iamVjdHMgfSA9IGN0eDtcbiAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0ICYgdXNlIEFsaWFzIG5vZGVzIGZvciBhbGxcbiAgICAvLyBhZnRlciBmaXJzdC4gVGhlIGByZWZgIHdyYXBwZXIgYWxsb3dzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIHRvIHJlc29sdmUuXG4gICAgbGV0IHJlZiA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYWxpYXNEdXBsaWNhdGVPYmplY3RzICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVmID0gc291cmNlT2JqZWN0cy5nZXQodmFsdWUpO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBpZiAoIXJlZi5hbmNob3IpXG4gICAgICAgICAgICAgICAgcmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWxpYXMocmVmLmFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWYgPSB7IGFuY2hvcjogbnVsbCwgbm9kZTogbnVsbCB9O1xuICAgICAgICAgICAgc291cmNlT2JqZWN0cy5zZXQodmFsdWUsIHJlZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZ05hbWUgJiYgdGFnTmFtZS5zdGFydHNXaXRoKCchIScpKVxuICAgICAgICB0YWdOYW1lID0gZGVmYXVsdFRhZ1ByZWZpeCArIHRhZ05hbWUuc2xpY2UoMik7XG4gICAgbGV0IHRhZ09iaiA9IGZpbmRUYWdPYmplY3QodmFsdWUsIHRhZ05hbWUsIHNjaGVtYS50YWdzKTtcbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9KU09OKCk7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICByZWYubm9kZSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBNYXBcbiAgICAgICAgICAgICAgICA/IHNjaGVtYVtNQVBdXG4gICAgICAgICAgICAgICAgOiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHNjaGVtYVtTRVFdXG4gICAgICAgICAgICAgICAgICAgIDogc2NoZW1hW01BUF07XG4gICAgfVxuICAgIGlmIChvblRhZ09iaikge1xuICAgICAgICBvblRhZ09iaih0YWdPYmopO1xuICAgICAgICBkZWxldGUgY3R4Lm9uVGFnT2JqO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gKHRhZ09iaiA9PT0gbnVsbCB8fCB0YWdPYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhZ09iai5jcmVhdGVOb2RlKVxuICAgICAgICA/IHRhZ09iai5jcmVhdGVOb2RlKGN0eC5zY2hlbWEsIHZhbHVlLCBjdHgpXG4gICAgICAgIDogbmV3IFNjYWxhcih2YWx1ZSk7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIG5vZGUudGFnID0gdGFnTmFtZTtcbiAgICBpZiAocmVmKVxuICAgICAgICByZWYubm9kZSA9IG5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZU5vZGUgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSwgaXNOb2RlLCBpc1BhaXIsIGlzQ29sbGVjdGlvbiwgaXNTY2FsYXIgfSBmcm9tICcuL05vZGUuanMnO1xuXG5mdW5jdGlvbiBjb2xsZWN0aW9uRnJvbVBhdGgoc2NoZW1hLCBwYXRoLCB2YWx1ZSkge1xuICAgIGxldCB2ID0gdmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcihrKSAmJiBrID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBbXTtcbiAgICAgICAgICAgIGFba10gPSB2O1xuICAgICAgICAgICAgdiA9IGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ID0gbmV3IE1hcChbW2ssIHZdXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGUodiwgdW5kZWZpbmVkLCB7XG4gICAgICAgIGFsaWFzRHVwbGljYXRlT2JqZWN0czogZmFsc2UsXG4gICAgICAgIGtlZXBVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgICBvbkFuY2hvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBwbGVhc2UgcmVwb3J0IGEgYnVnLicpO1xuICAgICAgICB9LFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHNvdXJjZU9iamVjdHM6IG5ldyBNYXAoKVxuICAgIH0pO1xufVxuLy8gbnVsbCwgdW5kZWZpbmVkLCBvciBhbiBlbXB0eSBub24tc3RyaW5nIGl0ZXJhYmxlIChlLmcuIFtdKVxuY29uc3QgaXNFbXB0eVBhdGggPSAocGF0aCkgPT4gcGF0aCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiAhIXBhdGhbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lKTtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHR5cGUpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NjaGVtYScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWEgLSBJZiBkZWZpbmVkLCBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCdzIHNjaGVtYVxuICAgICAqL1xuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHNjaGVtYSlcbiAgICAgICAgICAgIGNvcHkuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICBjb3B5Lml0ZW1zID0gY29weS5pdGVtcy5tYXAoaXQgPT4gaXNOb2RlKGl0KSB8fCBpc1BhaXIoaXQpID8gaXQuY2xvbmUoc2NoZW1hKSA6IGl0KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLiBGb3IgYCEhbWFwYCBhbmQgYCEhb21hcGAgdGhlIHZhbHVlIG11c3RcbiAgICAgKiBiZSBhIFBhaXIgaW5zdGFuY2Ugb3IgYSBgeyBrZXksIHZhbHVlIH1gIG9iamVjdCwgd2hpY2ggbWF5IG5vdCBoYXZlIGEga2V5XG4gICAgICogdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBub2RlLmRlbGV0ZUluKHJlc3QpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyKG4pICYmXG4gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50QmVmb3JlICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4udGFnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuaGFzSW4ocmVzdCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNvbGxlY3Rpb24ubWF4Rmxvd1N0cmluZ1NpbmdsZUxpbmVMZW5ndGggPSA2MDtcblxuZXhwb3J0IHsgQ29sbGVjdGlvbiwgY29sbGVjdGlvbkZyb21QYXRoLCBpc0VtcHR5UGF0aCB9O1xuIiwiLyoqXG4gKiBTdHJpbmdpZmllcyBhIGNvbW1lbnQuXG4gKlxuICogRW1wdHkgY29tbWVudCBsaW5lcyBhcmUgbGVmdCBlbXB0eSxcbiAqIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgc3BhY2UgYXJlIHJlcGxhY2VkIGJ5IGAjYCxcbiAqIGFuZCBhbGwgb3RoZXIgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggYSBgI2AuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeUNvbW1lbnQgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXig/ISQpKD86ICQpPy9nbSwgJyMnKTtcbmZ1bmN0aW9uIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KSB7XG4gICAgaWYgKC9eXFxuKyQvLnRlc3QoY29tbWVudCkpXG4gICAgICAgIHJldHVybiBjb21tZW50LnN1YnN0cmluZygxKTtcbiAgICByZXR1cm4gaW5kZW50ID8gY29tbWVudC5yZXBsYWNlKC9eKD8hICokKS9nbSwgaW5kZW50KSA6IGNvbW1lbnQ7XG59XG5jb25zdCBsaW5lQ29tbWVudCA9IChzdHIsIGluZGVudCwgY29tbWVudCkgPT4gY29tbWVudC5pbmNsdWRlcygnXFxuJylcbiAgICA/ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgOiAoc3RyLmVuZHNXaXRoKCcgJykgPyAnJyA6ICcgJykgKyBjb21tZW50O1xuXG5leHBvcnQgeyBpbmRlbnRDb21tZW50LCBsaW5lQ29tbWVudCwgc3RyaW5naWZ5Q29tbWVudCB9O1xuIiwiY29uc3QgRk9MRF9GTE9XID0gJ2Zsb3cnO1xuY29uc3QgRk9MRF9CTE9DSyA9ICdibG9jayc7XG5jb25zdCBGT0xEX1FVT1RFRCA9ICdxdW90ZWQnO1xuLyoqXG4gKiBUcmllcyB0byBrZWVwIGlucHV0IGF0IHVwIHRvIGBsaW5lV2lkdGhgIGNoYXJhY3RlcnMsIHNwbGl0dGluZyBvbmx5IG9uIHNwYWNlc1xuICogbm90IGZvbGxvd2VkIGJ5IG5ld2xpbmVzIG9yIHNwYWNlcyB1bmxlc3MgYG1vZGVgIGlzIGAncXVvdGVkJ2AuIExpbmVzIGFyZVxuICogdGVybWluYXRlZCB3aXRoIGBcXG5gIGFuZCBzdGFydGVkIHdpdGggYGluZGVudGAuXG4gKi9cbmZ1bmN0aW9uIGZvbGRGbG93TGluZXModGV4dCwgaW5kZW50LCBtb2RlID0gJ2Zsb3cnLCB7IGluZGVudEF0U3RhcnQsIGxpbmVXaWR0aCA9IDgwLCBtaW5Db250ZW50V2lkdGggPSAyMCwgb25Gb2xkLCBvbk92ZXJmbG93IH0gPSB7fSkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpO1xuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnICYmXG4gICAgICAgICAgICAgICAgcHJldiAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXG4nICYmXG4gICAgICAgICAgICAgICAgcHJldiAhPT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBzdXJyb3VuZGVkIGJ5IG5vbi1zcGFjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBuZXdsaW5lICsgaW5kZW50XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRleHRbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09ICcgJyAmJiBuZXh0ICE9PSAnXFxuJyAmJiBuZXh0ICE9PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goc3BsaXQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzcGxpdCArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZSBjb2xsZWN0ZWQgYXQgZW5kIG1heSBzdHJldGNoIHBhc3QgbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2ID09PSAnICcgfHwgcHJldiA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gdGV4dFsoaSArPSAxKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgbmV3bGluZSBlc2NhcGUsIGJ1dCBkb24ndCBicmVhayBwcmVjZWRpbmcgZXNjYXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpID4gZXNjRW5kICsgMSA/IGkgLSAyIDogZXNjU3RhcnQgLSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiBsaW5lV2lkdGggJiBtaW5Db250ZW50V2lkdGggYXJlIHNob3J0ZXIgdGhhbiBhbiBlc2NhcGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkRm9sZHNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgZm9sZHMucHVzaChqKTtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEZvbGRzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaiArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gY2g7XG4gICAgfVxuICAgIGlmIChvdmVyZmxvdyAmJiBvbk92ZXJmbG93KVxuICAgICAgICBvbk92ZXJmbG93KCk7XG4gICAgaWYgKGZvbGRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgaWYgKG9uRm9sZClcbiAgICAgICAgb25Gb2xkKCk7XG4gICAgbGV0IHJlcyA9IHRleHQuc2xpY2UoMCwgZm9sZHNbMF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgZm9sZCA9IGZvbGRzW2ldO1xuICAgICAgICBjb25zdCBlbmQgPSBmb2xkc1tpICsgMV0gfHwgdGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChmb2xkID09PSAwKVxuICAgICAgICAgICAgcmVzID0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZSgwLCBlbmQpfWA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGVzY2FwZWRGb2xkc1tmb2xkXSlcbiAgICAgICAgICAgICAgICByZXMgKz0gYCR7dGV4dFtmb2xkXX1cXFxcYDtcbiAgICAgICAgICAgIHJlcyArPSBgXFxuJHtpbmRlbnR9JHt0ZXh0LnNsaWNlKGZvbGQgKyAxLCBlbmQpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogUHJlc3VtZXMgYGkgKyAxYCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lXG4gKiBAcmV0dXJucyBpbmRleCBvZiBsYXN0IG5ld2xpbmUgaW4gbW9yZS1pbmRlbnRlZCBibG9ja1xuICovXG5mdW5jdGlvbiBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSkge1xuICAgIGxldCBjaCA9IHRleHRbaSArIDFdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICB9IHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicpO1xuICAgICAgICBjaCA9IHRleHRbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cblxuZXhwb3J0IHsgRk9MRF9CTE9DSywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgZm9sZEZsb3dMaW5lcyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IGZvbGRGbG93TGluZXMsIEZPTERfUVVPVEVELCBGT0xEX0ZMT1csIEZPTERfQkxPQ0sgfSBmcm9tICcuL2ZvbGRGbG93TGluZXMuanMnO1xuXG5jb25zdCBnZXRGb2xkT3B0aW9ucyA9IChjdHgpID0+ICh7XG4gICAgaW5kZW50QXRTdGFydDogY3R4LmluZGVudEF0U3RhcnQsXG4gICAgbGluZVdpZHRoOiBjdHgub3B0aW9ucy5saW5lV2lkdGgsXG4gICAgbWluQ29udGVudFdpZHRoOiBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGhcbn0pO1xuLy8gQWxzbyBjaGVja3MgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggJSwgYXMgcGFyc2luZyB0aGUgb3V0cHV0IGFzIFlBTUwgMS4xIHdpbGxcbi8vIHByZXN1bWUgdGhhdCdzIHN0YXJ0aW5nIGEgbmV3IGRvY3VtZW50LlxuY29uc3QgY29udGFpbnNEb2N1bWVudE1hcmtlciA9IChzdHIpID0+IC9eKCV8LS0tfFxcLlxcLlxcLikvbS50ZXN0KHN0cik7XG5mdW5jdGlvbiBsaW5lTGVuZ3RoT3ZlckxpbWl0KHN0ciwgbGluZVdpZHRoLCBpbmRlbnRMZW5ndGgpIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbGltaXQgPSBsaW5lV2lkdGggLSBpbmRlbnRMZW5ndGg7XG4gICAgY29uc3Qgc3RyTGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAoc3RyTGVuIDw9IGxpbWl0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0ID0gMDsgaSA8IHN0ckxlbjsgKytpKSB7XG4gICAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgaWYgKHN0ckxlbiAtIHN0YXJ0IDw9IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkQXNKU09OKVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5IH0gPSBjdHg7XG4gICAgY29uc3QgbWluTXVsdGlMaW5lTGVuZ3RoID0gY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoO1xuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgY2ggPSBqc29uW2ldOyBjaDsgY2ggPSBqc29uWysraV0pIHtcbiAgICAgICAgaWYgKGNoID09PSAnICcgJiYganNvbltpICsgMV0gPT09ICdcXFxcJyAmJiBqc29uW2kgKyAyXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBiZWZvcmUgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXFxcICc7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBzdGFydCA9IGk7XG4gICAgICAgICAgICBjaCA9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXFxcJylcbiAgICAgICAgICAgIHN3aXRjaCAoanNvbltpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGpzb24uc3Vic3RyKGkgKyAyLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwNyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDBiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDA4NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXE4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMGEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjgnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxMJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXFAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5zdWJzdHIoMCwgMikgPT09ICcwMCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx4JyArIGNvZGUuc3Vic3RyKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zdWJzdHIoaSwgNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDJdID09PSAnXCInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uLmxlbmd0aCA8IG1pbk11bHRpTGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGluZyB3aWxsIGVhdCBmaXJzdCBuZXdsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqc29uW2kgKyAyXSA9PT0gJ1xcXFwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgM10gPT09ICduJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDRdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBpbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBhZnRlciBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25baSArIDJdID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSBzdGFydCA/IHN0ciArIGpzb24uc2xpY2Uoc3RhcnQpIDoganNvbjtcbiAgICByZXR1cm4gaW1wbGljaXRLZXlcbiAgICAgICAgPyBzdHJcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX1FVT1RFRCwgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG59XG5mdW5jdGlvbiBzaW5nbGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGlmIChjdHgub3B0aW9ucy5zaW5nbGVRdW90ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgKGN0eC5pbXBsaWNpdEtleSAmJiB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHx8XG4gICAgICAgIC9bIFxcdF1cXG58XFxuWyBcXHRdLy50ZXN0KHZhbHVlKSAvLyBzaW5nbGUgcXVvdGVkIHN0cmluZyBjYW4ndCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcm91bmQgbmV3bGluZVxuICAgIClcbiAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8IChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgcmVzID0gXCInXCIgKyB2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIikucmVwbGFjZSgvXFxuKy9nLCBgJCZcXG4ke2luZGVudH1gKSArIFwiJ1wiO1xuICAgIHJldHVybiBjdHguaW1wbGljaXRLZXlcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHJlcywgaW5kZW50LCBGT0xEX0ZMT1csIGdldEZvbGRPcHRpb25zKGN0eCkpO1xufVxuZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCB7IHNpbmdsZVF1b3RlIH0gPSBjdHgub3B0aW9ucztcbiAgICBsZXQgcXM7XG4gICAgaWYgKHNpbmdsZVF1b3RlID09PSBmYWxzZSlcbiAgICAgICAgcXMgPSBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGhhc0RvdWJsZSA9IHZhbHVlLmluY2x1ZGVzKCdcIicpO1xuICAgICAgICBjb25zdCBoYXNTaW5nbGUgPSB2YWx1ZS5pbmNsdWRlcyhcIidcIik7XG4gICAgICAgIGlmIChoYXNEb3VibGUgJiYgIWhhc1NpbmdsZSlcbiAgICAgICAgICAgIHFzID0gc2luZ2xlUXVvdGVkU3RyaW5nO1xuICAgICAgICBlbHNlIGlmIChoYXNTaW5nbGUgJiYgIWhhc0RvdWJsZSlcbiAgICAgICAgICAgIHFzID0gZG91YmxlUXVvdGVkU3RyaW5nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBxcyA9IHNpbmdsZVF1b3RlID8gc2luZ2xlUXVvdGVkU3RyaW5nIDogZG91YmxlUXVvdGVkU3RyaW5nO1xuICAgIH1cbiAgICByZXR1cm4gcXModmFsdWUsIGN0eCk7XG59XG5mdW5jdGlvbiBibG9ja1N0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYmxvY2tRdW90ZSwgY29tbWVudFN0cmluZywgbGluZVdpZHRoIH0gPSBjdHgub3B0aW9ucztcbiAgICAvLyAxLiBCbG9jayBjYW4ndCBlbmQgaW4gd2hpdGVzcGFjZSB1bmxlc3MgdGhlIGxhc3QgbGluZSBpcyBub24tZW1wdHkuXG4gICAgLy8gMi4gU3RyaW5ncyBjb25zaXN0aW5nIG9mIG9ubHkgd2hpdGVzcGFjZSBhcmUgYmVzdCByZW5kZXJlZCBleHBsaWNpdGx5LlxuICAgIGlmICghYmxvY2tRdW90ZSB8fCAvXFxuW1xcdCBdKyQvLnRlc3QodmFsdWUpIHx8IC9eXFxzKiQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHxcbiAgICAgICAgKGN0eC5mb3JjZUJsb2NrSW5kZW50IHx8IGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBjb25zdCBsaXRlcmFsID0gYmxvY2tRdW90ZSA9PT0gJ2xpdGVyYWwnXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGJsb2NrUXVvdGUgPT09ICdmb2xkZWQnIHx8IHR5cGUgPT09IFNjYWxhci5CTE9DS19GT0xERURcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogdHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6ICFsaW5lTGVuZ3RoT3ZlckxpbWl0KHZhbHVlLCBsaW5lV2lkdGgsIGluZGVudC5sZW5ndGgpO1xuICAgIGlmICghdmFsdWUpXG4gICAgICAgIHJldHVybiBsaXRlcmFsID8gJ3xcXG4nIDogJz5cXG4nO1xuICAgIC8vIGRldGVybWluZSBjaG9tcGluZyBmcm9tIHdoaXRlc3BhY2UgYXQgdmFsdWUgZW5kXG4gICAgbGV0IGNob21wO1xuICAgIGxldCBlbmRTdGFydDtcbiAgICBmb3IgKGVuZFN0YXJ0ID0gdmFsdWUubGVuZ3RoOyBlbmRTdGFydCA+IDA7IC0tZW5kU3RhcnQpIHtcbiAgICAgICAgY29uc3QgY2ggPSB2YWx1ZVtlbmRTdGFydCAtIDFdO1xuICAgICAgICBpZiAoY2ggIT09ICdcXG4nICYmIGNoICE9PSAnXFx0JyAmJiBjaCAhPT0gJyAnKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBlbmQgPSB2YWx1ZS5zdWJzdHJpbmcoZW5kU3RhcnQpO1xuICAgIGNvbnN0IGVuZE5sUG9zID0gZW5kLmluZGV4T2YoJ1xcbicpO1xuICAgIGlmIChlbmRObFBvcyA9PT0gLTEpIHtcbiAgICAgICAgY2hvbXAgPSAnLSc7IC8vIHN0cmlwXG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlID09PSBlbmQgfHwgZW5kTmxQb3MgIT09IGVuZC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNob21wID0gJysnOyAvLyBrZWVwXG4gICAgICAgIGlmIChvbkNob21wS2VlcClcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaG9tcCA9ICcnOyAvLyBjbGlwXG4gICAgfVxuICAgIGlmIChlbmQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtZW5kLmxlbmd0aCk7XG4gICAgICAgIGlmIChlbmRbZW5kLmxlbmd0aCAtIDFdID09PSAnXFxuJylcbiAgICAgICAgICAgIGVuZCA9IGVuZC5zbGljZSgwLCAtMSk7XG4gICAgICAgIGVuZCA9IGVuZC5yZXBsYWNlKC9cXG4rKD8hXFxufCQpL2csIGAkJiR7aW5kZW50fWApO1xuICAgIH1cbiAgICAvLyBkZXRlcm1pbmUgaW5kZW50IGluZGljYXRvciBmcm9tIHdoaXRlc3BhY2UgYXQgdmFsdWUgc3RhcnRcbiAgICBsZXQgc3RhcnRXaXRoU3BhY2UgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRFbmQ7XG4gICAgbGV0IHN0YXJ0TmxQb3MgPSAtMTtcbiAgICBmb3IgKHN0YXJ0RW5kID0gMDsgc3RhcnRFbmQgPCB2YWx1ZS5sZW5ndGg7ICsrc3RhcnRFbmQpIHtcbiAgICAgICAgY29uc3QgY2ggPSB2YWx1ZVtzdGFydEVuZF07XG4gICAgICAgIGlmIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgc3RhcnRXaXRoU3BhY2UgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICBzdGFydE5sUG9zID0gc3RhcnRFbmQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRObFBvcyA8IHN0YXJ0RW5kID8gc3RhcnRObFBvcyArIDEgOiBzdGFydEVuZCk7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHN0YXJ0Lmxlbmd0aCk7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQucmVwbGFjZSgvXFxuKy9nLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZW50U2l6ZSA9IGluZGVudCA/ICcyJyA6ICcxJzsgLy8gcm9vdCBpcyBhdCAtMVxuICAgIGxldCBoZWFkZXIgPSAobGl0ZXJhbCA/ICd8JyA6ICc+JykgKyAoc3RhcnRXaXRoU3BhY2UgPyBpbmRlbnRTaXplIDogJycpICsgY2hvbXA7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgaGVhZGVyICs9ICcgJyArIGNvbW1lbnRTdHJpbmcoY29tbWVudC5yZXBsYWNlKC8gP1tcXHJcXG5dKy9nLCAnICcpKTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBpZiAobGl0ZXJhbCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgICAgIHJldHVybiBgJHtoZWFkZXJ9XFxuJHtpbmRlbnR9JHtzdGFydH0ke3ZhbHVlfSR7ZW5kfWA7XG4gICAgfVxuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgJ1xcbiQmJylcbiAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxuKShbXFx0IF0uKikoPzooW1xcblxcdCBdKilcXG4oPyFbXFxuXFx0IF0pKT8vZywgJyQxJDInKSAvLyBtb3JlLWluZGVudGVkIGxpbmVzIGFyZW4ndCBmb2xkZWRcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgXiBtb3JlLWluZC4gXiBlbXB0eSAgICAgXiBjYXB0dXJlIG5leHQgZW1wdHkgbGluZXMgb25seSBhdCBlbmQgb2YgaW5kZW50XG4gICAgICAgIC5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgIGNvbnN0IGJvZHkgPSBmb2xkRmxvd0xpbmVzKGAke3N0YXJ0fSR7dmFsdWV9JHtlbmR9YCwgaW5kZW50LCBGT0xEX0JMT0NLLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbiAgICByZXR1cm4gYCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7Ym9keX1gO1xufVxuZnVuY3Rpb24gcGxhaW5TdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGFjdHVhbFN0cmluZywgaW1wbGljaXRLZXksIGluZGVudCwgaW5GbG93IH0gPSBjdHg7XG4gICAgaWYgKChpbXBsaWNpdEtleSAmJiAvW1xcbltcXF17fSxdLy50ZXN0KHZhbHVlKSkgfHxcbiAgICAgICAgKGluRmxvdyAmJiAvW1tcXF17fSxdLy50ZXN0KHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZSB8fFxuICAgICAgICAvXltcXG5cXHQgLFtcXF17fSMmKiF8PidcIiVAYF18Xls/LV0kfF5bPy1dWyBcXHRdfFtcXG46XVsgXFx0XXxbIFxcdF1cXG58W1xcblxcdCBdI3xbXFxuXFx0IDpdJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gbm90IGFsbG93ZWQ6XG4gICAgICAgIC8vIC0gZW1wdHkgc3RyaW5nLCAnLScgb3IgJz8nXG4gICAgICAgIC8vIC0gc3RhcnQgd2l0aCBhbiBpbmRpY2F0b3IgY2hhcmFjdGVyIChleGNlcHQgWz86LV0pIG9yIC9bPy1dIC9cbiAgICAgICAgLy8gLSAnXFxuICcsICc6ICcgb3IgJyBcXG4nIGFueXdoZXJlXG4gICAgICAgIC8vIC0gJyMnIG5vdCBwcmVjZWRlZCBieSBhIG5vbi1zcGFjZSBjaGFyXG4gICAgICAgIC8vIC0gZW5kIHdpdGggJyAnIG9yICc6J1xuICAgICAgICByZXR1cm4gaW1wbGljaXRLZXkgfHwgaW5GbG93IHx8IHZhbHVlLmluZGV4T2YoJ1xcbicpID09PSAtMVxuICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eClcbiAgICAgICAgICAgIDogYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG4gICAgaWYgKCFpbXBsaWNpdEtleSAmJlxuICAgICAgICAhaW5GbG93ICYmXG4gICAgICAgIHR5cGUgIT09IFNjYWxhci5QTEFJTiAmJlxuICAgICAgICB2YWx1ZS5pbmRleE9mKCdcXG4nKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2hlcmUgYWxsb3dlZCAmIHR5cGUgbm90IHNldCBleHBsaWNpdGx5LCBwcmVmZXIgYmxvY2sgc3R5bGUgZm9yIG11bHRpbGluZSBzdHJpbmdzXG4gICAgICAgIHJldHVybiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoaW5kZW50ID09PSAnJyAmJiBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSkge1xuICAgICAgICBjdHguZm9yY2VCbG9ja0luZGVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJlxcbiR7aW5kZW50fWApO1xuICAgIC8vIFZlcmlmeSB0aGF0IG91dHB1dCB3aWxsIGJlIHBhcnNlZCBhcyBhIHN0cmluZywgYXMgZS5nLiBwbGFpbiBudW1iZXJzIGFuZFxuICAgIC8vIGJvb2xlYW5zIGdldCBwYXJzZWQgd2l0aCB0aG9zZSB0eXBlcyBpbiB2MS4yIChlLmcuICc0MicsICd0cnVlJyAmICcwLjllLTMnKSxcbiAgICAvLyBhbmQgb3RoZXJzIGluIHYxLjEuXG4gICAgaWYgKGFjdHVhbFN0cmluZykge1xuICAgICAgICBjb25zdCB0ZXN0ID0gKHRhZykgPT4geyB2YXIgX2E7IHJldHVybiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiAoKF9hID0gdGFnLnRlc3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50ZXN0KHN0cikpOyB9O1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgKGNvbXBhdCA9PT0gbnVsbCB8fCBjb21wYXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhdC5zb21lKHRlc3QpKSlcbiAgICAgICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBpbXBsaWNpdEtleVxuICAgICAgICA/IHN0clxuICAgICAgICA6IGZvbGRGbG93TGluZXMoc3RyLCBpbmRlbnQsIEZPTERfRkxPVywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSwgaW5GbG93IH0gPSBjdHg7XG4gICAgY29uc3Qgc3MgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgeyB2YWx1ZTogU3RyaW5nKGl0ZW0udmFsdWUpIH0pO1xuICAgIGxldCB7IHR5cGUgfSA9IGl0ZW07XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnMgJiB1bnBhaXJlZCBzdXJyb2dhdGVzXG4gICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5ZlxcdXtEODAwfS1cXHV7REZGRn1dL3UudGVzdChzcy52YWx1ZSkpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICB9XG4gICAgY29uc3QgX3N0cmluZ2lmeSA9IChfdHlwZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19GT0xERUQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19MSVRFUkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3dcbiAgICAgICAgICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCkgLy8gYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICA6IGJsb2NrU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUVVPVEVfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9TSU5HTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlBMQUlOOlxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblN0cmluZyhzcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0S2V5VHlwZSwgZGVmYXVsdFN0cmluZ1R5cGUgfSA9IGN0eC5vcHRpb25zO1xuICAgICAgICBjb25zdCB0ID0gKGltcGxpY2l0S2V5ICYmIGRlZmF1bHRLZXlUeXBlKSB8fCBkZWZhdWx0U3RyaW5nVHlwZTtcbiAgICAgICAgcmVzID0gX3N0cmluZ2lmeSh0KTtcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3R9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNBbGlhcywgaXNOb2RlLCBpc1NjYWxhciwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4vc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgYmxvY2tRdW90ZTogdHJ1ZSxcbiAgICAgICAgY29tbWVudFN0cmluZzogc3RyaW5naWZ5Q29tbWVudCxcbiAgICAgICAgZGVmYXVsdEtleVR5cGU6IG51bGwsXG4gICAgICAgIGRlZmF1bHRTdHJpbmdUeXBlOiAnUExBSU4nLFxuICAgICAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgICAgICBkb3VibGVRdW90ZWRBc0pTT046IGZhbHNlLFxuICAgICAgICBkb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg6IDQwLFxuICAgICAgICBmYWxzZVN0cjogJ2ZhbHNlJyxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJ1ZVN0cjogJ3RydWUnLFxuICAgICAgICB2ZXJpZnlBbGlhc09yZGVyOiB0cnVlXG4gICAgfSwgZG9jLnNjaGVtYS50b1N0cmluZ09wdGlvbnMsIG9wdGlvbnMpO1xuICAgIGxldCBpbkZsb3c7XG4gICAgc3dpdGNoIChvcHQuY29sbGVjdGlvblN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgICAgIGluRmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaW5GbG93ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYW5jaG9yczogbmV3IFNldCgpLFxuICAgICAgICBkb2MsXG4gICAgICAgIGluZGVudDogJycsXG4gICAgICAgIGluZGVudFN0ZXA6IHR5cGVvZiBvcHQuaW5kZW50ID09PSAnbnVtYmVyJyA/ICcgJy5yZXBlYXQob3B0LmluZGVudCkgOiAnICAnLFxuICAgICAgICBpbkZsb3csXG4gICAgICAgIG9wdGlvbnM6IG9wdFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRUYWdPYmplY3QodGFncywgaXRlbSkge1xuICAgIGlmIChpdGVtLnRhZykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC50YWcgPT09IGl0ZW0udGFnKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guZmluZCh0ID0+IHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdCkgfHwgbWF0Y2hbMF07XG4gICAgfVxuICAgIGxldCB0YWdPYmogPSB1bmRlZmluZWQ7XG4gICAgbGV0IG9iajtcbiAgICBpZiAoaXNTY2FsYXIoaXRlbSkpIHtcbiAgICAgICAgb2JqID0gaXRlbS52YWx1ZTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQuaWRlbnRpZnkgJiYgdC5pZGVudGlmeShvYmopKTtcbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpIHx8IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqID0gaXRlbTtcbiAgICAgICAgdGFnT2JqID0gdGFncy5maW5kKHQgPT4gdC5ub2RlQ2xhc3MgJiYgb2JqIGluc3RhbmNlb2YgdC5ub2RlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IG5hbWUgPSBvYmogJiYgb2JqLmNvbnN0cnVjdG9yID8gb2JqLmNvbnN0cnVjdG9yLm5hbWUgOiB0eXBlb2Ygb2JqO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhZyBub3QgcmVzb2x2ZWQgZm9yICR7bmFtZX0gdmFsdWVgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ09iajtcbn1cbi8vIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdmFsdWUgc3RyaW5naWZpZXIgdG8gYWxsb3cgZm9yIGNpcmN1bGFyIGFuY2hvciByZWZzXG5mdW5jdGlvbiBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIHsgYW5jaG9ycywgZG9jIH0pIHtcbiAgICBpZiAoIWRvYy5kaXJlY3RpdmVzKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgY29uc3QgcHJvcHMgPSBbXTtcbiAgICBjb25zdCBhbmNob3IgPSAoaXNTY2FsYXIobm9kZSkgfHwgaXNDb2xsZWN0aW9uKG5vZGUpKSAmJiBub2RlLmFuY2hvcjtcbiAgICBpZiAoYW5jaG9yICYmIGFuY2hvcklzVmFsaWQoYW5jaG9yKSkge1xuICAgICAgICBhbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICBwcm9wcy5wdXNoKGAmJHthbmNob3J9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IG5vZGUudGFnIHx8ICh0YWdPYmouZGVmYXVsdCA/IG51bGwgOiB0YWdPYmoudGFnKTtcbiAgICBpZiAodGFnKVxuICAgICAgICBwcm9wcy5wdXNoKGRvYy5kaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcpKTtcbiAgICByZXR1cm4gcHJvcHMuam9pbignICcpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoaXNQYWlyKGl0ZW0pKVxuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIGlmIChpc0FsaWFzKGl0ZW0pKSB7XG4gICAgICAgIGlmIChjdHguZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgpO1xuICAgICAgICBpZiAoKF9hID0gY3R4LnJlc29sdmVkQWxpYXNlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHN0cmluZ2lmeSBjaXJjdWxhciBzdHJ1Y3R1cmUgd2l0aG91dCBhbGlhcyBub2Rlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcyA9IG5ldyBTZXQoW2l0ZW1dKTtcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlc29sdmUoY3R4LmRvYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKGl0ZW0pXG4gICAgICAgID8gaXRlbVxuICAgICAgICA6IGN0eC5kb2MuY3JlYXRlTm9kZShpdGVtLCB7IG9uVGFnT2JqOiBvID0+ICh0YWdPYmogPSBvKSB9KTtcbiAgICBpZiAoIXRhZ09iailcbiAgICAgICAgdGFnT2JqID0gZ2V0VGFnT2JqZWN0KGN0eC5kb2Muc2NoZW1hLnRhZ3MsIG5vZGUpO1xuICAgIGNvbnN0IHByb3BzID0gc3RyaW5naWZ5UHJvcHMobm9kZSwgdGFnT2JqLCBjdHgpO1xuICAgIGlmIChwcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IChjdHguaW5kZW50QXRTdGFydCB8fCAwKSArIHByb3BzLmxlbmd0aCArIDE7XG4gICAgY29uc3Qgc3RyID0gdHlwZW9mIHRhZ09iai5zdHJpbmdpZnkgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB0YWdPYmouc3RyaW5naWZ5KG5vZGUsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgOiBpc1NjYWxhcihub2RlKVxuICAgICAgICAgICAgPyBzdHJpbmdpZnlTdHJpbmcobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgOiBub2RlLnRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgaWYgKCFwcm9wcylcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gaXNTY2FsYXIobm9kZSkgfHwgc3RyWzBdID09PSAneycgfHwgc3RyWzBdID09PSAnWydcbiAgICAgICAgPyBgJHtwcm9wc30gJHtzdHJ9YFxuICAgICAgICA6IGAke3Byb3BzfVxcbiR7Y3R4LmluZGVudH0ke3N0cn1gO1xufVxuXG5leHBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0LCBzdHJpbmdpZnkgfTtcbiIsImltcG9ydCB7IGlzQ29sbGVjdGlvbiwgaXNOb2RlLCBpc1NjYWxhciwgaXNTZXEgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVBhaXIoeyBrZXksIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYWxsTnVsbFZhbHVlcywgZG9jLCBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZywgaW5kZW50U2VxLCBzaW1wbGVLZXlzIH0gfSA9IGN0eDtcbiAgICBsZXQga2V5Q29tbWVudCA9IChpc05vZGUoa2V5KSAmJiBrZXkuY29tbWVudCkgfHwgbnVsbDtcbiAgICBpZiAoc2ltcGxlS2V5cykge1xuICAgICAgICBpZiAoa2V5Q29tbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBrZXkgbm9kZXMgY2Fubm90IGhhdmUgY29tbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdXaXRoIHNpbXBsZSBrZXlzLCBjb2xsZWN0aW9uIGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5IHZhbHVlJztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBleHBsaWNpdEtleSA9ICFzaW1wbGVLZXlzICYmXG4gICAgICAgICgha2V5IHx8XG4gICAgICAgICAgICAoa2V5Q29tbWVudCAmJiB2YWx1ZSA9PSBudWxsICYmICFjdHguaW5GbG93KSB8fFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uKGtleSkgfHxcbiAgICAgICAgICAgIChpc1NjYWxhcihrZXkpXG4gICAgICAgICAgICAgICAgPyBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0ZPTERFRCB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSk7XG4gICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7XG4gICAgICAgIGFsbE51bGxWYWx1ZXM6IGZhbHNlLFxuICAgICAgICBpbXBsaWNpdEtleTogIWV4cGxpY2l0S2V5ICYmIChzaW1wbGVLZXlzIHx8ICFhbGxOdWxsVmFsdWVzKSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgKyBpbmRlbnRTdGVwXG4gICAgfSk7XG4gICAgbGV0IGtleUNvbW1lbnREb25lID0gZmFsc2U7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoa2V5LCBjdHgsICgpID0+IChrZXlDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWN0eC5pbkZsb3cgJiYgc3RyLmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgICAgaWYgKHNpbXBsZUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIHNpbmdsZSBsaW5lIHNjYWxhciBtdXN0IG5vdCBzcGFuIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMnKTtcbiAgICAgICAgZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAoYWxsTnVsbFZhbHVlcyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5Q29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIGV4cGxpY2l0S2V5ID8gYD8gJHtzdHJ9YCA6IHN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgoYWxsTnVsbFZhbHVlcyAmJiAhc2ltcGxlS2V5cykgfHwgKHZhbHVlID09IG51bGwgJiYgZXhwbGljaXRLZXkpKSB7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfWA7XG4gICAgICAgIGlmIChrZXlDb21tZW50ICYmICFrZXlDb21tZW50RG9uZSkge1xuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgaWYgKGtleUNvbW1lbnREb25lKVxuICAgICAgICBrZXlDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZXhwbGljaXRLZXkpIHtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICAgICAgc3RyID0gYD8gJHtzdHJ9XFxuJHtpbmRlbnR9OmA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHIgPSBgJHtzdHJ9OmA7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgfVxuICAgIGxldCB2Y2IgPSAnJztcbiAgICBsZXQgdmFsdWVDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICB2Y2IgPSAnXFxuJztcbiAgICAgICAgaWYgKHZhbHVlLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyh2YWx1ZS5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgIHZjYiArPSBgXFxuJHtpbmRlbnRDb21tZW50KGNzLCBjdHguaW5kZW50KX1gO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IHZhbHVlLmNvbW1lbnQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWUgPSBkb2MuY3JlYXRlTm9kZSh2YWx1ZSk7XG4gICAgfVxuICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWtleUNvbW1lbnQgJiYgaXNTY2FsYXIodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cigyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgY3R4LCAoKSA9PiAodmFsdWVDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGxldCB3cyA9ICcgJztcbiAgICBpZiAodmNiIHx8IGtleUNvbW1lbnQpIHtcbiAgICAgICAgd3MgPSB2YWx1ZVN0ciA9PT0gJycgJiYgIWN0eC5pbkZsb3cgPyB2Y2IgOiBgJHt2Y2J9XFxuJHtjdHguaW5kZW50fWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFleHBsaWNpdEtleSAmJiBpc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGZsb3cgPSB2YWx1ZVN0clswXSA9PT0gJ1snIHx8IHZhbHVlU3RyWzBdID09PSAneyc7XG4gICAgICAgIGlmICghZmxvdyB8fCB2YWx1ZVN0ci5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICB3cyA9IGBcXG4ke2N0eC5pbmRlbnR9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVTdHIgPT09ICcnIHx8IHZhbHVlU3RyWzBdID09PSAnXFxuJylcbiAgICAgICAgd3MgPSAnJztcbiAgICBzdHIgKz0gd3MgKyB2YWx1ZVN0cjtcbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAodmFsdWVDb21tZW50RG9uZSAmJiBvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVDb21tZW50ICYmICF2YWx1ZUNvbW1lbnREb25lKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcodmFsdWVDb21tZW50KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcCkge1xuICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlQYWlyIH07XG4iLCJmdW5jdGlvbiBkZWJ1Zyhsb2dMZXZlbCwgLi4ubWVzc2FnZXMpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycpXG4gICAgICAgIGNvbnNvbGUubG9nKC4uLm1lc3NhZ2VzKTtcbn1cbmZ1bmN0aW9uIHdhcm4obG9nTGV2ZWwsIHdhcm5pbmcpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycgfHwgbG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW1pdFdhcm5pbmcpXG4gICAgICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBkZWJ1Zywgd2FybiB9O1xuIiwiaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBpc0FsaWFzLCBpc1NlcSwgaXNTY2FsYXIsIGlzTWFwLCBpc05vZGUgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4vdG9KUy5qcyc7XG5cbmNvbnN0IE1FUkdFX0tFWSA9ICc8PCc7XG5mdW5jdGlvbiBhZGRQYWlyVG9KU01hcChjdHgsIG1hcCwgeyBrZXksIHZhbHVlIH0pIHtcbiAgICBpZiAoY3R4ICYmIGN0eC5kb2Muc2NoZW1hLm1lcmdlICYmIGlzTWVyZ2VLZXkoa2V5KSkge1xuICAgICAgICB2YWx1ZSA9IGlzQWxpYXModmFsdWUpID8gdmFsdWUucmVzb2x2ZShjdHguZG9jKSA6IHZhbHVlO1xuICAgICAgICBpZiAoaXNTZXEodmFsdWUpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdCBvZiB2YWx1ZS5pdGVtcylcbiAgICAgICAgICAgICAgICBtZXJnZVRvSlNNYXAoY3R4LCBtYXAsIGl0KTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgaXQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtZXJnZVRvSlNNYXAoY3R4LCBtYXAsIHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGpzS2V5ID0gdG9KUyhrZXksICcnLCBjdHgpO1xuICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBtYXAuc2V0KGpzS2V5LCB0b0pTKHZhbHVlLCBqc0tleSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGpzS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0tleSA9IHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpO1xuICAgICAgICAgICAgY29uc3QganNWYWx1ZSA9IHRvSlModmFsdWUsIHN0cmluZ0tleSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdLZXkgaW4gbWFwKVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIHN0cmluZ0tleSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZToganNWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1hcFtzdHJpbmdLZXldID0ganNWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuY29uc3QgaXNNZXJnZUtleSA9IChrZXkpID0+IGtleSA9PT0gTUVSR0VfS0VZIHx8XG4gICAgKGlzU2NhbGFyKGtleSkgJiZcbiAgICAgICAga2V5LnZhbHVlID09PSBNRVJHRV9LRVkgJiZcbiAgICAgICAgKCFrZXkudHlwZSB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLlBMQUlOKSk7XG4vLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuLy8gaXRzIGtleS92YWx1ZSBwYWlycyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjdXJyZW50IG1hcHBpbmcsIHVubGVzcyB0aGUga2V5XG4vLyBhbHJlYWR5IGV4aXN0cyBpbiBpdC4gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyZ2Uga2V5IGlzIGFcbi8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4vLyBvZiB0aGVzZSBub2RlcyBpcyBtZXJnZWQgaW4gdHVybiBhY2NvcmRpbmcgdG8gaXRzIG9yZGVyIGluIHRoZSBzZXF1ZW5jZS5cbi8vIEtleXMgaW4gbWFwcGluZyBub2RlcyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBvdmVycmlkZSBrZXlzIHNwZWNpZmllZCBpblxuLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuZnVuY3Rpb24gbWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGN0eCAmJiBpc0FsaWFzKHZhbHVlKSA/IHZhbHVlLnJlc29sdmUoY3R4LmRvYykgOiB2YWx1ZTtcbiAgICBpZiAoIWlzTWFwKHNvdXJjZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWVyZ2Ugc291cmNlcyBtdXN0IGJlIG1hcHMgb3IgbWFwIGFsaWFzZXMnKTtcbiAgICBjb25zdCBzcmNNYXAgPSBzb3VyY2UudG9KU09OKG51bGwsIGN0eCwgTWFwKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzcmNNYXApIHtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXAgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIG1hcC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwga2V5KSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1hcCwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KSB7XG4gICAgaWYgKGpzS2V5ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiBqc0tleSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICAgIGlmIChpc05vZGUoa2V5KSAmJiBjdHggJiYgY3R4LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZXhwb3J0IHsgYWRkUGFpclRvSlNNYXAgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlQYWlyIH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMnO1xuaW1wb3J0IHsgYWRkUGFpclRvSlNNYXAgfSBmcm9tICcuL2FkZFBhaXJUb0pTTWFwLmpzJztcbmltcG9ydCB7IE5PREVfVFlQRSwgUEFJUiwgaXNOb2RlIH0gZnJvbSAnLi9Ob2RlLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCBrID0gY3JlYXRlTm9kZShrZXksIHVuZGVmaW5lZCwgY3R4KTtcbiAgICBjb25zdCB2ID0gY3JlYXRlTm9kZSh2YWx1ZSwgdW5kZWZpbmVkLCBjdHgpO1xuICAgIHJldHVybiBuZXcgUGFpcihrLCB2KTtcbn1cbmNsYXNzIFBhaXIge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUgPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IFBBSVIgfSk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBsZXQgeyBrZXksIHZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoaXNOb2RlKGtleSkpXG4gICAgICAgICAgICBrZXkgPSBrZXkuY2xvbmUoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNsb25lKHNjaGVtYSk7XG4gICAgICAgIHJldHVybiBuZXcgUGFpcihrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBjb25zdCBwYWlyID0gY3R4ICYmIGN0eC5tYXBBc01hcCA/IG5ldyBNYXAoKSA6IHt9O1xuICAgICAgICByZXR1cm4gYWRkUGFpclRvSlNNYXAoY3R4LCBwYWlyLCB0aGlzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIHJldHVybiBjdHggJiYgY3R4LmRvY1xuICAgICAgICAgICAgPyBzdHJpbmdpZnlQYWlyKHRoaXMsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBQYWlyLCBjcmVhdGVQYWlyIH07XG4iLCIvKipcbiAqIGB5YW1sYCBkZWZpbmVzIGRvY3VtZW50LXNwZWNpZmljIG9wdGlvbnMgaW4gdGhyZWUgcGxhY2VzOiBhcyBhbiBhcmd1bWVudCBvZlxuICogcGFyc2UsIGNyZWF0ZSBhbmQgc3RyaW5naWZ5IGNhbGxzLCBpbiB0aGUgdmFsdWVzIG9mIGBZQU1MLmRlZmF1bHRPcHRpb25zYCxcbiAqIGFuZCBpbiB0aGUgdmVyc2lvbi1kZXBlbmRlbnQgYFlBTUwuRG9jdW1lbnQuZGVmYXVsdHNgIG9iamVjdC4gVmFsdWVzIHNldCBpblxuICogYFlBTUwuZGVmYXVsdE9wdGlvbnNgIG92ZXJyaWRlIHZlcnNpb24tZGVwZW5kZW50IGRlZmF1bHRzLCBhbmQgYXJndW1lbnRcbiAqIG9wdGlvbnMgb3ZlcnJpZGUgYm90aC5cbiAqL1xuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgaW50QXNCaWdJbnQ6IGZhbHNlLFxuICAgIGtlZXBTb3VyY2VUb2tlbnM6IGZhbHNlLFxuICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgcHJldHR5RXJyb3JzOiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICB1bmlxdWVLZXlzOiB0cnVlLFxuICAgIHZlcnNpb246ICcxLjInXG59O1xuXG5leHBvcnQgeyBkZWZhdWx0T3B0aW9ucyB9O1xuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGxpbmVDb21tZW50LCBpbmRlbnRDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjdHgsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgZmxvdyA9IChfYSA9IGN0eC5pbkZsb3cpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbGxlY3Rpb24uZmxvdztcbiAgICBjb25zdCBzdHJpbmdpZnkgPSBmbG93ID8gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24gOiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb247XG4gICAgcmV0dXJuIHN0cmluZ2lmeShjb2xsZWN0aW9uLCBjdHgsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5QmxvY2tDb2xsZWN0aW9uKHsgY29tbWVudCwgaXRlbXMgfSwgY3R4LCB7IGJsb2NrSXRlbVByZWZpeCwgZmxvd0NoYXJzLCBpdGVtSW5kZW50LCBvbkNob21wS2VlcCwgb25Db21tZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSA9IGN0eDtcbiAgICBjb25zdCBpdGVtQ3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGluZGVudDogaXRlbUluZGVudCwgdHlwZTogbnVsbCB9KTtcbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7IC8vIGZsYWcgZm9yIHRoZSBwcmVjZWRpbmcgbm9kZSdzIHN0YXR1c1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKCFjaG9tcEtlZXAgJiYgaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUoaXRlbS5rZXkpID8gaXRlbS5rZXkgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGlrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaG9tcEtlZXAgJiYgaWsuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaWsuY29tbWVudEJlZm9yZSwgY2hvbXBLZWVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0ciA9IHN0cmluZ2lmeShpdGVtLCBpdGVtQ3R4LCAoKSA9PiAoY29tbWVudCA9IG51bGwpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGl0ZW1JbmRlbnQsIGNvbW1lbnRTdHJpbmcoY29tbWVudCkpO1xuICAgICAgICBpZiAoY2hvbXBLZWVwICYmIGNvbW1lbnQpXG4gICAgICAgICAgICBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgICAgbGluZXMucHVzaChibG9ja0l0ZW1QcmVmaXggKyBzdHIpO1xuICAgIH1cbiAgICBsZXQgc3RyO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RyID0gZmxvd0NoYXJzLnN0YXJ0ICsgZmxvd0NoYXJzLmVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0ciA9IGxpbmVzWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudH0ke2xpbmV9YCA6ICdcXG4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIHN0ciArPSAnXFxuJyArIGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApXG4gICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUZsb3dDb2xsZWN0aW9uKHsgY29tbWVudCwgaXRlbXMgfSwgY3R4LCB7IGZsb3dDaGFycywgaXRlbUluZGVudCwgb25Db21tZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgaW5kZW50U3RlcCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSA9IGN0eDtcbiAgICBpdGVtSW5kZW50ICs9IGluZGVudFN0ZXA7XG4gICAgY29uc3QgaXRlbUN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwge1xuICAgICAgICBpbmRlbnQ6IGl0ZW1JbmRlbnQsXG4gICAgICAgIGluRmxvdzogdHJ1ZSxcbiAgICAgICAgdHlwZTogbnVsbFxuICAgIH0pO1xuICAgIGxldCByZXFOZXdsaW5lID0gZmFsc2U7XG4gICAgbGV0IGxpbmVzQXRWYWx1ZSA9IDA7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoaWsuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaWsuY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChpay5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl2ID0gaXNOb2RlKGl0ZW0udmFsdWUpID8gaXRlbS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXYuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGl2LmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS52YWx1ZSA9PSBudWxsICYmIGlrICYmIGlrLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaWsuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCkpO1xuICAgICAgICBpZiAoaSA8IGl0ZW1zLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGl0ZW1JbmRlbnQsIGNvbW1lbnRTdHJpbmcoY29tbWVudCkpO1xuICAgICAgICBpZiAoIXJlcU5ld2xpbmUgJiYgKGxpbmVzLmxlbmd0aCA+IGxpbmVzQXRWYWx1ZSB8fCBzdHIuaW5jbHVkZXMoJ1xcbicpKSlcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgICAgIGxpbmVzQXRWYWx1ZSA9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IHN0cjtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0YXJ0ICsgZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKTtcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSBsZW4gPiBDb2xsZWN0aW9uLm1heEZsb3dTdHJpbmdTaW5nbGVMaW5lTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHN0ciArPSBgXFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGAke3N0YXJ0fSAke2xpbmVzLmpvaW4oJyAnKX0gJHtlbmR9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhZGRDb21tZW50QmVmb3JlKHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9LCBsaW5lcywgY29tbWVudCwgY2hvbXBLZWVwKSB7XG4gICAgaWYgKGNvbW1lbnQgJiYgY2hvbXBLZWVwKVxuICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBjb25zdCBpYyA9IGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgbGluZXMucHVzaChpYy50cmltU3RhcnQoKSk7IC8vIEF2b2lkIGRvdWJsZSBpbmRlbnQgb24gZmlyc3QgbGluZVxuICAgIH1cbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGFkZFBhaXJUb0pTTWFwIH0gZnJvbSAnLi9hZGRQYWlyVG9KU01hcC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNTY2FsYXIsIE1BUCB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi9QYWlyLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyVmFsdWUgfSBmcm9tICcuL1NjYWxhci5qcyc7XG5cbmZ1bmN0aW9uIGZpbmRQYWlyKGl0ZW1zLCBrZXkpIHtcbiAgICBjb25zdCBrID0gaXNTY2FsYXIoa2V5KSA/IGtleS52YWx1ZSA6IGtleTtcbiAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChpc1BhaXIoaXQpKSB7XG4gICAgICAgICAgICBpZiAoaXQua2V5ID09PSBrZXkgfHwgaXQua2V5ID09PSBrKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihpdC5rZXkpICYmIGl0LmtleS52YWx1ZSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmNsYXNzIFlBTUxNYXAgZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpci52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgX3BhaXIgPSBuZXcgUGFpcihwYWlyLmtleSwgcGFpci52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBfcGFpci5rZXkpO1xuICAgICAgICBjb25zdCBzb3J0RW50cmllcyA9IHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnNvcnRNYXBFbnRyaWVzO1xuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgaWYgKCFvdmVyd3JpdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHtfcGFpci5rZXl9IGFscmVhZHkgc2V0YCk7XG4gICAgICAgICAgICAvLyBGb3Igc2NhbGFycywga2VlcCB0aGUgb2xkIG5vZGUgJiBpdHMgY29tbWVudHMgYW5kIGFuY2hvcnNcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihwcmV2LnZhbHVlKSAmJiBpc1NjYWxhclZhbHVlKF9wYWlyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlLnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcHJldi52YWx1ZSA9IF9wYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNvcnRFbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBzb3J0RW50cmllcyhfcGFpciwgaXRlbSkgPCAwKTtcbiAgICAgICAgICAgIGlmIChpID09PSAtMSlcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goX3BhaXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGksIDAsIF9wYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGlmICghaXQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRlbCA9IHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihpdCksIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gaXQgJiYgaXQudmFsdWU7XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihub2RlKSA/IG5vZGUudmFsdWUgOiBub2RlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBQYWlyKGtleSwgdmFsdWUpLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpXG4gICAgICogQHBhcmFtIHtDbGFzc30gVHlwZSAtIElmIHNldCwgZm9yY2VzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHR5cGVcbiAgICAgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgICAgY29uc3QgbWFwID0gVHlwZSA/IG5ldyBUeXBlKCkgOiBjdHggJiYgY3R4Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIGlmIChjdHggJiYgY3R4Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShpdGVtKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4LmFsbE51bGxWYWx1ZXMgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKGZhbHNlKSlcbiAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJycsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICd7JywgZW5kOiAnfScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJycsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH07XG4iLCJpbXBvcnQgeyBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxNYXAuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVNYXAoc2NoZW1hLCBvYmosIGN0eCkge1xuICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCwgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBtYXAgPSBuZXcgWUFNTE1hcChzY2hlbWEpO1xuICAgIGNvbnN0IGFkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VyLmNhbGwob2JqLCBrZXksIHZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlcikgJiYgIXJlcGxhY2VyLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChjcmVhdGVQYWlyKGtleSwgdmFsdWUsIGN0eCkpO1xuICAgIH07XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopXG4gICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKVxuICAgICAgICAgICAgYWRkKGtleSwgb2JqW2tleV0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5zb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtYXAuaXRlbXMuc29ydChzY2hlbWEuc29ydE1hcEVudHJpZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuY29uc3QgbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZU1hcCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIG5vZGVDbGFzczogWUFNTE1hcCxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLFxuICAgIHJlc29sdmUobWFwLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICghaXNNYXAobWFwKSlcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWcnKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBtYXAgfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IFNFUSwgaXNTY2FsYXIgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKFNFUSwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJztcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGl0ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIoaXQpID8gaXQudmFsdWUgOiBpdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjb2xsZWN0aW9uIGluY2x1ZGVzIGEgdmFsdWUgd2l0aCB0aGUga2V5IGBrZXlgLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICovXG4gICAgaGFzKGtleSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlkeCA9PT0gJ251bWJlcicgJiYgaWR4IDwgdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGNvbGxlY3Rpb24uIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqXG4gICAgICogSWYgYGtleWAgZG9lcyBub3QgY29udGFpbiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIsIHRoaXMgd2lsbCB0aHJvdy5cbiAgICAgKiBJdCBtYXkgYmUgd3JhcHBlZCBpbiBhIGBTY2FsYXJgLlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSB2YWxpZCBpbmRleCwgbm90ICR7a2V5fS5gKTtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuaXRlbXNbaWR4XTtcbiAgICAgICAgaWYgKGlzU2NhbGFyKHByZXYpICYmIGlzU2NhbGFyVmFsdWUodmFsdWUpKVxuICAgICAgICAgICAgcHJldi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLml0ZW1zW2lkeF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBjb25zdCBzZXEgPSBbXTtcbiAgICAgICAgaWYgKGN0eCAmJiBjdHgub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUoc2VxKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcylcbiAgICAgICAgICAgIHNlcS5wdXNoKHRvSlMoaXRlbSwgU3RyaW5nKGkrKyksIGN0eCkpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlDb2xsZWN0aW9uKHRoaXMsIGN0eCwge1xuICAgICAgICAgICAgYmxvY2tJdGVtUHJlZml4OiAnLSAnLFxuICAgICAgICAgICAgZmxvd0NoYXJzOiB7IHN0YXJ0OiAnWycsIGVuZDogJ10nIH0sXG4gICAgICAgICAgICBpdGVtSW5kZW50OiAoY3R4LmluZGVudCB8fCAnJykgKyAnICAnLFxuICAgICAgICAgICAgb25DaG9tcEtlZXAsXG4gICAgICAgICAgICBvbkNvbW1lbnRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gICAgbGV0IGlkeCA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgaWYgKGlkeCAmJiB0eXBlb2YgaWR4ID09PSAnc3RyaW5nJylcbiAgICAgICAgaWR4ID0gTnVtYmVyKGlkeCk7XG4gICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaWR4KSAmJiBpZHggPj0gMFxuICAgICAgICA/IGlkeFxuICAgICAgICA6IG51bGw7XG59XG5cbmV4cG9ydCB7IFlBTUxTZXEgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi8uLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBpc1NlcSB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVTZXEoc2NoZW1hLCBvYmosIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBzZXEgPSBuZXcgWUFNTFNlcShzY2hlbWEpO1xuICAgIGlmIChvYmogJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChvYmopKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChsZXQgaXQgb2Ygb2JqKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gb2JqIGluc3RhbmNlb2YgU2V0ID8gaXQgOiBTdHJpbmcoaSsrKTtcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwob2JqLCBrZXksIGl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKGNyZWF0ZU5vZGUoaXQsIHVuZGVmaW5lZCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcTtcbn1cbmNvbnN0IHNlcSA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBjcmVhdGVOb2RlOiBjcmVhdGVTZXEsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXEsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzU2VxKHNlcSkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IHNlcSB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5U3RyaW5nIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmNvbnN0IHN0cmluZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gICAgcmVzb2x2ZTogc3RyID0+IHN0cixcbiAgICBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oeyBhY3R1YWxTdHJpbmc6IHRydWUgfSwgY3R4KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IHN0cmluZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgbnVsbFRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT0gbnVsbCxcbiAgICBjcmVhdGVOb2RlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsXG4gICAgdGVzdDogL14oPzp+fFtObl11bGx8TlVMTCk/JC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICBzdHJpbmdpZnk6ICh7IHNvdXJjZSB9LCBjdHgpID0+IHNvdXJjZSAmJiBudWxsVGFnLnRlc3QudGVzdChzb3VyY2UpID8gc291cmNlIDogY3R4Lm9wdGlvbnMubnVsbFN0clxufTtcblxuZXhwb3J0IHsgbnVsbFRhZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgYm9vbFRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/OltUdF1ydWV8VFJVRXxbRmZdYWxzZXxGQUxTRSkkLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gbmV3IFNjYWxhcihzdHJbMF0gPT09ICd0JyB8fCBzdHJbMF0gPT09ICdUJyksXG4gICAgc3RyaW5naWZ5KHsgc291cmNlLCB2YWx1ZSB9LCBjdHgpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBib29sVGFnLnRlc3QudGVzdChzb3VyY2UpKSB7XG4gICAgICAgICAgICBjb25zdCBzdiA9IHNvdXJjZVswXSA9PT0gJ3QnIHx8IHNvdXJjZVswXSA9PT0gJ1QnO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBzdilcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IGN0eC5vcHRpb25zLnRydWVTdHIgOiBjdHgub3B0aW9ucy5mYWxzZVN0cjtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBib29sVGFnIH07XG4iLCJmdW5jdGlvbiBzdHJpbmdpZnlOdW1iZXIoeyBmb3JtYXQsIG1pbkZyYWN0aW9uRGlnaXRzLCB0YWcsIHZhbHVlIH0pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKG51bSkpXG4gICAgICAgIHJldHVybiBpc05hTihudW0pID8gJy5uYW4nIDogbnVtIDwgMCA/ICctLmluZicgOiAnLmluZic7XG4gICAgbGV0IG4gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKCFmb3JtYXQgJiZcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgJiZcbiAgICAgICAgKCF0YWcgfHwgdGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnKSAmJlxuICAgICAgICAvXlxcZC8udGVzdChuKSkge1xuICAgICAgICBsZXQgaSA9IG4uaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIGkgPSBuLmxlbmd0aDtcbiAgICAgICAgICAgIG4gKz0gJy4nO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkID0gbWluRnJhY3Rpb25EaWdpdHMgLSAobi5sZW5ndGggLSBpIC0gMSk7XG4gICAgICAgIHdoaWxlIChkLS0gPiAwKVxuICAgICAgICAgICAgbiArPSAnMCc7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgZmxvYXROYU4gPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL14oPzpbLStdP1xcLig/OmluZnxJbmZ8SU5GfG5hbnxOYU58TkFOKSkkLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gc3RyLnNsaWNlKC0zKS50b0xvd2VyQ2FzZSgpID09PSAnbmFuJ1xuICAgICAgICA/IE5hTlxuICAgICAgICA6IHN0clswXSA9PT0gJy0nXG4gICAgICAgICAgICA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBmbG9hdEV4cCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdFWFAnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpcXC5bMC05XSt8WzAtOV0rKD86XFwuWzAtOV0qKT8pW2VFXVstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlRmxvYXQoc3RyKSxcbiAgICBzdHJpbmdpZnkobm9kZSkge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIobm9kZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShudW0pID8gbnVtLnRvRXhwb25lbnRpYWwoKSA6IHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICB9XG59O1xuY29uc3QgZmxvYXQgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XStcXC5bMC05XSopJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEgJiYgc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IHN0ci5sZW5ndGggLSBkb3QgLSAxO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5leHBvcnQgeyBmbG9hdCwgZmxvYXRFeHAsIGZsb2F0TmFOIH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgaW50SWRlbnRpZnkgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG5jb25zdCBpbnRSZXNvbHZlID0gKHN0ciwgb2Zmc2V0LCByYWRpeCwgeyBpbnRBc0JpZ0ludCB9KSA9PiAoaW50QXNCaWdJbnQgPyBCaWdJbnQoc3RyKSA6IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcob2Zmc2V0KSwgcmFkaXgpKTtcbmZ1bmN0aW9uIGludFN0cmluZ2lmeShub2RlLCByYWRpeCwgcHJlZml4KSB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICBpZiAoaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDApXG4gICAgICAgIHJldHVybiBwcmVmaXggKyB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbn1cbmNvbnN0IGludE9jdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDAsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ09DVCcsXG4gICAgdGVzdDogL14wb1swLTddKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCA4LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgOCwgJzBvJylcbn07XG5jb25zdCBpbnQgPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDAsIDEwLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgaW50SGV4ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnSEVYJyxcbiAgICB0ZXN0OiAvXjB4WzAtOWEtZkEtRl0rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDE2LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgMTYsICcweCcpXG59O1xuXG5leHBvcnQgeyBpbnQsIGludEhleCwgaW50T2N0IH07XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICcuLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IG51bGxUYWcgfSBmcm9tICcuLi9jb21tb24vbnVsbC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgYm9vbFRhZyB9IGZyb20gJy4vYm9vbC5qcyc7XG5pbXBvcnQgeyBmbG9hdE5hTiwgZmxvYXRFeHAsIGZsb2F0IH0gZnJvbSAnLi9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRPY3QsIGludCwgaW50SGV4IH0gZnJvbSAnLi9pbnQuanMnO1xuXG5jb25zdCBzY2hlbWEgPSBbXG4gICAgbWFwLFxuICAgIHNlcSxcbiAgICBzdHJpbmcsXG4gICAgbnVsbFRhZyxcbiAgICBib29sVGFnLFxuICAgIGludE9jdCxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0XG5dO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuXG5mdW5jdGlvbiBpbnRJZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuY29uc3Qgc3RyaW5naWZ5SlNPTiA9ICh7IHZhbHVlIH0pID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbmNvbnN0IGpzb25TY2FsYXJzID0gW1xuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT0gbnVsbCxcbiAgICAgICAgY3JlYXRlTm9kZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsXG4gICAgICAgIHRlc3Q6IC9ebnVsbCQvLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiBudWxsLFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICAgICAgdGVzdDogL150cnVlfGZhbHNlJC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIgPT09ICd0cnVlJyxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICAgICAgdGVzdDogL14tPyg/OjB8WzEtOV1bMC05XSopJC8sXG4gICAgICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IGludEFzQmlnSW50ID8gQmlnSW50KHN0cikgOiBwYXJzZUludChzdHIsIDEwKSxcbiAgICAgICAgc3RyaW5naWZ5OiAoeyB2YWx1ZSB9KSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZygpIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSg/OlxcLlswLTldKik/KD86W2VFXVstK10/WzAtOV0rKT8kLyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlRmxvYXQoc3RyKSxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfVxuXTtcbmNvbnN0IGpzb25FcnJvciA9IHtcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJycsXG4gICAgdGVzdDogL14vLFxuICAgIHJlc29sdmUoc3RyLCBvbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoYFVucmVzb2x2ZWQgcGxhaW4gc2NhbGFyICR7SlNPTi5zdHJpbmdpZnkoc3RyKX1gKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59O1xuY29uc3Qgc2NoZW1hID0gW21hcCwgc2VxXS5jb25jYXQoanNvblNjYWxhcnMsIGpzb25FcnJvcik7XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMnO1xuXG5jb25zdCBiaW5hcnkgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCdWZmZXIgaW4gbm9kZSBhbmQgYW4gVWludDhBcnJheSBpbiBicm93c2Vyc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGFuIGltYWdlLCB5b3UnbGwgd2FudCB0byBkbyBzb21ldGhpbmcgbGlrZTpcbiAgICAgKlxuICAgICAqICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KVxuICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bob3RvJykuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAqL1xuICAgIHJlc29sdmUoc3JjLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oc3JjLCAnYmFzZTY0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIE9uIElFIDExLCBhdG9iKCkgY2FuJ3QgaGFuZGxlIG5ld2xpbmVzXG4gICAgICAgICAgICBjb25zdCBzdHIgPSBhdG9iKHNyYy5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnJykpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvbkVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBiaW5hcnkgdGFnczsgZWl0aGVyIEJ1ZmZlciBvciBhdG9iIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICByZXR1cm4gc3JjO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzdHJpbmdpZnkoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgY29uc3QgYnVmID0gdmFsdWU7IC8vIGNoZWNrZWQgZWFybGllciBieSBiaW5hcnkuaWRlbnRpZnkoKVxuICAgICAgICBsZXQgc3RyO1xuICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RyID1cbiAgICAgICAgICAgICAgICBidWYgaW5zdGFuY2VvZiBCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgPyBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgICAgICAgICAgICAgIDogQnVmZmVyLmZyb20oYnVmLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsZXQgcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gICAgICAgICAgICBzdHIgPSBidG9hKHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyBiaW5hcnkgdGFnczsgZWl0aGVyIEJ1ZmZlciBvciBidG9hIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdHlwZSA9IFNjYWxhci5CTE9DS19MSVRFUkFMO1xuICAgICAgICBpZiAodHlwZSAhPT0gU2NhbGFyLlFVT1RFX0RPVUJMRSkge1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoY3R4Lm9wdGlvbnMubGluZVdpZHRoIC0gY3R4LmluZGVudC5sZW5ndGgsIGN0eC5vcHRpb25zLm1pbkNvbnRlbnRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBuID0gTWF0aC5jZWlsKHN0ci5sZW5ndGggLyBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXkobik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbyA9IDA7IGkgPCBuOyArK2ksIG8gKz0gbGluZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGluZXNbaV0gPSBzdHIuc3Vic3RyKG8sIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHIgPSBsaW5lcy5qb2luKHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMID8gJ1xcbicgOiAnICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZTogc3RyIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgYmluYXJ5IH07XG4iLCJpbXBvcnQgeyBpc1NlcSwgaXNQYWlyLCBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcikge1xuICAgIGlmIChpc1NlcShzZXEpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlcS5pdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc01hcChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gaXRlbS5pdGVtc1swXSB8fCBuZXcgUGFpcihuZXcgU2NhbGFyKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyLmtleS5jb21tZW50QmVmb3JlID0gcGFpci5rZXkuY29tbWVudEJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnRCZWZvcmV9XFxuJHtwYWlyLmtleS5jb21tZW50QmVmb3JlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY24gPSBwYWlyLnZhbHVlIHx8IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjbi5jb21tZW50ID0gY24uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnR9XFxuJHtjbi5jb21tZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtc1tpXSA9IGlzUGFpcihpdGVtKSA/IGl0ZW0gOiBuZXcgUGFpcihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBwYWlycyA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgcGFpcnMudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJztcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICBmb3IgKGxldCBpdCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIFN0cmluZyhpKyspLCBpdCk7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke2l0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgeyBrZXk6IHZhbHVlIH0gdHVwbGU6ICR7aXR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhaXJzLml0ZW1zLnB1c2goY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBwYWlycztcbn1cbmNvbnN0IHBhaXJzID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJyxcbiAgICByZXNvbHZlOiByZXNvbHZlUGFpcnMsXG4gICAgY3JlYXRlTm9kZTogY3JlYXRlUGFpcnNcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVBhaXJzLCBwYWlycywgcmVzb2x2ZVBhaXJzIH07XG4iLCJpbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi4vLi4vbm9kZXMvdG9KUy5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhciwgaXNQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGFpcnMsIGNyZWF0ZVBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5cbmNsYXNzIFlBTUxPTWFwIGV4dGVuZHMgWUFNTFNlcSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYWRkID0gWUFNTE1hcC5wcm90b3R5cGUuYWRkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVsZXRlID0gWUFNTE1hcC5wcm90b3R5cGUuZGVsZXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZ2V0ID0gWUFNTE1hcC5wcm90b3R5cGUuZ2V0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFzID0gWUFNTE1hcC5wcm90b3R5cGUuaGFzLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0ID0gWUFNTE1hcC5wcm90b3R5cGUuc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudGFnID0gWUFNTE9NYXAudGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBgY3R4YCBpcyBnaXZlbiwgdGhlIHJldHVybiB0eXBlIGlzIGFjdHVhbGx5IGBNYXA8dW5rbm93biwgdW5rbm93bj5gLFxuICAgICAqIGJ1dCBUeXBlU2NyaXB0IHdvbid0IGFsbG93IHdpZGVuaW5nIHRoZSBzaWduYXR1cmUgb2YgYSBjaGlsZCBtZXRob2QuXG4gICAgICovXG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50b0pTT04oXyk7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKGN0eCAmJiBjdHgub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUobWFwKTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGxldCBrZXksIHZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzUGFpcihwYWlyKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpci5rZXksICcnLCBjdHgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9KUyhwYWlyLnZhbHVlLCBrZXksIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0b0pTKHBhaXIsICcnLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hcC5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzJyk7XG4gICAgICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufVxuWUFNTE9NYXAudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnO1xuY29uc3Qgb21hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBNYXAsXG4gICAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBjb25zdCBwYWlycyA9IHJlc29sdmVQYWlycyhzZXEsIG9uRXJyb3IpO1xuICAgICAgICBjb25zdCBzZWVuS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5IH0gb2YgcGFpcnMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5LZXlzLmluY2x1ZGVzKGtleS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihgT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXM6ICR7a2V5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlbktleXMucHVzaChrZXkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTE9NYXAoKSwgcGFpcnMpO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpcnMgPSBjcmVhdGVQYWlycyhzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpO1xuICAgICAgICBjb25zdCBvbWFwID0gbmV3IFlBTUxPTWFwKCk7XG4gICAgICAgIG9tYXAuaXRlbXMgPSBwYWlycy5pdGVtcztcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTE9NYXAsIG9tYXAgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmZ1bmN0aW9uIGJvb2xTdHJpbmdpZnkoeyB2YWx1ZSwgc291cmNlIH0sIGN0eCkge1xuICAgIGNvbnN0IGJvb2xPYmogPSB2YWx1ZSA/IHRydWVUYWcgOiBmYWxzZVRhZztcbiAgICBpZiAoc291cmNlICYmIGJvb2xPYmoudGVzdC50ZXN0KHNvdXJjZSkpXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgcmV0dXJuIHZhbHVlID8gY3R4Lm9wdGlvbnMudHJ1ZVN0ciA6IGN0eC5vcHRpb25zLmZhbHNlU3RyO1xufVxuY29uc3QgdHJ1ZVRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT09IHRydWUsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/Oll8eXxbWXldZXN8WUVTfFtUdF1ydWV8VFJVRXxbT29dbnxPTikkLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKHRydWUpLFxuICAgIHN0cmluZ2lmeTogYm9vbFN0cmluZ2lmeVxufTtcbmNvbnN0IGZhbHNlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gZmFsc2UsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/Ok58bnxbTm5db3xOT3xbRmZdYWxzZXxGQUxTRXxbT29dZmZ8T0ZGKSQvaSxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKGZhbHNlKSxcbiAgICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn07XG5cbmV4cG9ydCB7IGZhbHNlVGFnLCB0cnVlVGFnIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT9cXC4oPzppbmZ8SW5mfElORnxuYW58TmFOfE5BTikkLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlswLTldWzAtOV9dKik/KD86XFwuWzAtOV9dKik/W2VFXVstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogKHN0cikgPT4gcGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT9cXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSBzdHIuc3Vic3RyaW5nKGRvdCArIDEpLnJlcGxhY2UoL18vZywgJycpO1xuICAgICAgICAgICAgaWYgKGZbZi5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgICAgIG5vZGUubWluRnJhY3Rpb25EaWdpdHMgPSBmLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5leHBvcnQgeyBmbG9hdCwgZmxvYXRFeHAsIGZsb2F0TmFOIH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuY29uc3QgaW50SWRlbnRpZnkgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG5mdW5jdGlvbiBpbnRSZXNvbHZlKHN0ciwgb2Zmc2V0LCByYWRpeCwgeyBpbnRBc0JpZ0ludCB9KSB7XG4gICAgY29uc3Qgc2lnbiA9IHN0clswXTtcbiAgICBpZiAoc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJylcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgc3RyID0gc3RyLnN1YnN0cmluZyhvZmZzZXQpLnJlcGxhY2UoL18vZywgJycpO1xuICAgIGlmIChpbnRBc0JpZ0ludCkge1xuICAgICAgICBzd2l0Y2ggKHJhZGl4KSB7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgc3RyID0gYDBiJHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMG8ke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMHgke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSBCaWdJbnQoc3RyKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IEJpZ0ludCgtMSkgKiBuIDogbjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KHN0ciwgcmFkaXgpO1xuICAgIHJldHVybiBzaWduID09PSAnLScgPyAtMSAqIG4gOiBuO1xufVxuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdmFsdWUudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gJy0nICsgcHJlZml4ICsgc3RyLnN1YnN0cigxKSA6IHByZWZpeCArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbn1cbmNvbnN0IGludEJpbiA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0JJTicsXG4gICAgdGVzdDogL15bLStdPzBiWzAtMV9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAyLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgMiwgJzBiJylcbn07XG5jb25zdCBpbnRPY3QgPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdPQ1QnLFxuICAgIHRlc3Q6IC9eWy0rXT8wWzAtN19dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAxLCA4LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgOCwgJzAnKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSokLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eWy0rXT8weFswLTlhLWZBLUZfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50QmluLCBpbnRIZXgsIGludE9jdCB9O1xuIiwiaW1wb3J0IHsgaXNNYXAsIGlzUGFpciwgaXNTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVBhaXIsIFBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5cbmNsYXNzIFlBTUxTZXQgZXh0ZW5kcyBZQU1MTWFwIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoc2NoZW1hKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MU2V0LnRhZztcbiAgICB9XG4gICAgYWRkKGtleSkge1xuICAgICAgICBsZXQgcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihrZXkpKVxuICAgICAgICAgICAgcGFpciA9IGtleTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICdrZXknIGluIGtleSAmJlxuICAgICAgICAgICAgJ3ZhbHVlJyBpbiBrZXkgJiZcbiAgICAgICAgICAgIGtleS52YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHBhaXIgPSBuZXcgUGFpcihrZXkua2V5LCBudWxsKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleSwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBwYWlyLmtleSk7XG4gICAgICAgIGlmICghcHJldilcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChwYWlyKTtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFBhaXIpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIHJldHVybiAha2VlcFBhaXIgJiYgaXNQYWlyKHBhaXIpXG4gICAgICAgICAgICA/IGlzU2NhbGFyKHBhaXIua2V5KVxuICAgICAgICAgICAgICAgID8gcGFpci5rZXkudmFsdWVcbiAgICAgICAgICAgICAgICA6IHBhaXIua2V5XG4gICAgICAgICAgICA6IHBhaXI7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYm9vbGVhbiB2YWx1ZSBmb3Igc2V0KGtleSwgdmFsdWUpIGluIGEgWUFNTCBzZXQsIG5vdCAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGlmIChwcmV2ICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKHByZXYpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcHJldiAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKG5ldyBQYWlyKGtleSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTihfLCBjdHgsIFNldCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQWxsTnVsbFZhbHVlcyh0cnVlKSlcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZyhPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgYWxsTnVsbFZhbHVlczogdHJ1ZSB9KSwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMnKTtcbiAgICB9XG59XG5ZQU1MU2V0LnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnO1xuY29uc3Qgc2V0ID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFNldCxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXQsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2V0JyxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoaXNNYXAobWFwKSkge1xuICAgICAgICAgICAgaWYgKG1hcC5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MU2V0KCksIG1hcCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb25FcnJvcignU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSxcbiAgICBjcmVhdGVOb2RlKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBZQU1MU2V0KHNjaGVtYSk7XG4gICAgICAgIGlmIChpdGVyYWJsZSAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXJhYmxlKSlcbiAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKGl0ZXJhYmxlLCB2YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHNldC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIodmFsdWUsIG51bGwsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IFlBTUxTZXQsIHNldCB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbi8qKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LiAqL1xuZnVuY3Rpb24gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGFzQmlnSW50KSB7XG4gICAgY29uc3Qgc2lnbiA9IHN0clswXTtcbiAgICBjb25zdCBwYXJ0cyA9IHNpZ24gPT09ICctJyB8fCBzaWduID09PSAnKycgPyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xuICAgIGNvbnN0IG51bSA9IChuKSA9PiBhc0JpZ0ludCA/IEJpZ0ludChuKSA6IE51bWJlcihuKTtcbiAgICBjb25zdCByZXMgPSBwYXJ0c1xuICAgICAgICAucmVwbGFjZSgvXy9nLCAnJylcbiAgICAgICAgLnNwbGl0KCc6JylcbiAgICAgICAgLnJlZHVjZSgocmVzLCBwKSA9PiByZXMgKiBudW0oNjApICsgbnVtKHApLCBudW0oMCkpO1xuICAgIHJldHVybiAoc2lnbiA9PT0gJy0nID8gbnVtKC0xKSAqIHJlcyA6IHJlcyk7XG59XG4vKipcbiAqIGhoaGg6bW06c3Muc3NzXG4gKlxuICogSW50ZXJuYWwgdHlwZXMgaGFuZGxlIGJpZ2ludCBhcyBudW1iZXIsIGJlY2F1c2UgVFMgY2FuJ3QgZmlndXJlIGl0IG91dC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2V4YWdlc2ltYWwobm9kZSkge1xuICAgIGxldCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGxldCBudW0gPSAobikgPT4gbjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JylcbiAgICAgICAgbnVtID0gbiA9PiBCaWdJbnQobik7XG4gICAgZWxzZSBpZiAoaXNOYU4odmFsdWUpIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgbGV0IHNpZ24gPSAnJztcbiAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgIHZhbHVlICo9IG51bSgtMSk7XG4gICAgfVxuICAgIGNvbnN0IF82MCA9IG51bSg2MCk7XG4gICAgY29uc3QgcGFydHMgPSBbdmFsdWUgJSBfNjBdOyAvLyBzZWNvbmRzLCBpbmNsdWRpbmcgbXNcbiAgICBpZiAodmFsdWUgPCA2MCkge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KDApOyAvLyBhdCBsZWFzdCBvbmUgOiBpcyByZXF1aXJlZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSBwYXJ0c1swXSkgLyBfNjA7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUgJSBfNjApOyAvLyBtaW51dGVzXG4gICAgICAgIGlmICh2YWx1ZSA+PSA2MCkge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgLSBwYXJ0c1swXSkgLyBfNjA7XG4gICAgICAgICAgICBwYXJ0cy51bnNoaWZ0KHZhbHVlKTsgLy8gaG91cnNcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKHNpZ24gK1xuICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLm1hcChuID0+IChuIDwgMTAgPyAnMCcgKyBTdHJpbmcobikgOiBTdHJpbmcobikpKVxuICAgICAgICAgICAgLmpvaW4oJzonKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzAwMDAwMFxcZCokLywgJycpIC8vICUgNjAgbWF5IGludHJvZHVjZSBlcnJvclxuICAgICk7XG59XG5jb25zdCBpbnRUaW1lID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgaW50QXNCaWdJbnQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5U2V4YWdlc2ltYWxcbn07XG5jb25zdCBmbG9hdFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnVElNRScsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFwuWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgZmFsc2UpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5U2V4YWdlc2ltYWxcbn07XG5jb25zdCB0aW1lc3RhbXAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsXG4gICAgLy8gSWYgdGhlIHRpbWUgem9uZSBpcyBvbWl0dGVkLCB0aGUgdGltZXN0YW1wIGlzIGFzc3VtZWQgdG8gYmUgc3BlY2lmaWVkIGluIFVUQy4gVGhlIHRpbWUgcGFydFxuICAgIC8vIG1heSBiZSBvbWl0dGVkIGFsdG9nZXRoZXIsIHJlc3VsdGluZyBpbiBhIGRhdGUgZm9ybWF0LiBJbiBzdWNoIGEgY2FzZSwgdGhlIHRpbWUgcGFydCBpc1xuICAgIC8vIGFzc3VtZWQgdG8gYmUgMDA6MDA6MDBaIChzdGFydCBvZiBkYXksIFVUQykuXG4gICAgdGVzdDogUmVnRXhwKCdeKFswLTldezR9KS0oWzAtOV17MSwyfSktKFswLTldezEsMn0pJyArIC8vIFlZWVktTW0tRGRcbiAgICAgICAgJyg/OicgKyAvLyB0aW1lIGlzIG9wdGlvbmFsXG4gICAgICAgICcoPzp0fFR8WyBcXFxcdF0rKScgKyAvLyB0IHwgVCB8IHdoaXRlc3BhY2VcbiAgICAgICAgJyhbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0oXFxcXC5bMC05XSspPyknICsgLy8gSGg6TW06U3MoLnNzKT9cbiAgICAgICAgJyg/OlsgXFxcXHRdKihafFstK11bMDEyXT9bMC05XSg/OjpbMC05XXsyfSk/KSk/JyArIC8vIFogfCArNSB8IC0wMzozMFxuICAgICAgICAnKT8kJyksXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2godGltZXN0YW1wLnRlc3QpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCchIXRpbWVzdGFtcCBleHBlY3RzIGEgZGF0ZSwgc3RhcnRpbmcgd2l0aCB5eXl5LW1tLWRkJyk7XG4gICAgICAgIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoLm1hcChOdW1iZXIpO1xuICAgICAgICBjb25zdCBtaWxsaXNlYyA9IG1hdGNoWzddID8gTnVtYmVyKChtYXRjaFs3XSArICcwMCcpLnN1YnN0cigxLCAzKSkgOiAwO1xuICAgICAgICBsZXQgZGF0ZSA9IERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyIHx8IDAsIG1pbnV0ZSB8fCAwLCBzZWNvbmQgfHwgMCwgbWlsbGlzZWMpO1xuICAgICAgICBjb25zdCB0eiA9IG1hdGNoWzhdO1xuICAgICAgICBpZiAodHogJiYgdHogIT09ICdaJykge1xuICAgICAgICAgICAgbGV0IGQgPSBwYXJzZVNleGFnZXNpbWFsKHR6LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZCkgPCAzMClcbiAgICAgICAgICAgICAgICBkICo9IDYwO1xuICAgICAgICAgICAgZGF0ZSAtPSA2MDAwMCAqIGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiAoeyB2YWx1ZSB9KSA9PiB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoLygoVDAwOjAwKT86MDApP1xcLjAwMFokLywgJycpXG59O1xuXG5leHBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9O1xuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5LmpzJztcbmltcG9ydCB7IHRydWVUYWcsIGZhbHNlVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludEJpbiwgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vc2V0LmpzJztcbmltcG9ydCB7IGludFRpbWUsIGZsb2F0VGltZSwgdGltZXN0YW1wIH0gZnJvbSAnLi90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWEgPSBbXG4gICAgbWFwLFxuICAgIHNlcSxcbiAgICBzdHJpbmcsXG4gICAgbnVsbFRhZyxcbiAgICB0cnVlVGFnLFxuICAgIGZhbHNlVGFnLFxuICAgIGludEJpbixcbiAgICBpbnRPY3QsXG4gICAgaW50LFxuICAgIGludEhleCxcbiAgICBmbG9hdE5hTixcbiAgICBmbG9hdEV4cCxcbiAgICBmbG9hdCxcbiAgICBiaW5hcnksXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXQsXG4gICAgaW50VGltZSxcbiAgICBmbG9hdFRpbWUsXG4gICAgdGltZXN0YW1wXG5dO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJy4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi9jb21tb24vbnVsbC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJvb2xUYWcgfSBmcm9tICcuL2NvcmUvYm9vbC5qcyc7XG5pbXBvcnQgeyBmbG9hdCwgZmxvYXRFeHAsIGZsb2F0TmFOIH0gZnJvbSAnLi9jb3JlL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludCwgaW50SGV4LCBpbnRPY3QgfSBmcm9tICcuL2NvcmUvaW50LmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vY29yZS9zY2hlbWEuanMnO1xuaW1wb3J0IHsgc2NoZW1hIGFzIHNjaGVtYSQxIH0gZnJvbSAnLi9qc29uL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBiaW5hcnkgfSBmcm9tICcuL3lhbWwtMS4xL2JpbmFyeS5qcyc7XG5pbXBvcnQgeyBvbWFwIH0gZnJvbSAnLi95YW1sLTEuMS9vbWFwLmpzJztcbmltcG9ydCB7IHBhaXJzIH0gZnJvbSAnLi95YW1sLTEuMS9wYWlycy5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgYXMgc2NoZW1hJDIgfSBmcm9tICcuL3lhbWwtMS4xL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3lhbWwtMS4xL3NldC5qcyc7XG5pbXBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9IGZyb20gJy4veWFtbC0xLjEvdGltZXN0YW1wLmpzJztcblxuY29uc3Qgc2NoZW1hcyA9IG5ldyBNYXAoW1xuICAgIFsnY29yZScsIHNjaGVtYV0sXG4gICAgWydmYWlsc2FmZScsIFttYXAsIHNlcSwgc3RyaW5nXV0sXG4gICAgWydqc29uJywgc2NoZW1hJDFdLFxuICAgIFsneWFtbDExJywgc2NoZW1hJDJdLFxuICAgIFsneWFtbC0xLjEnLCBzY2hlbWEkMl1cbl0pO1xuY29uc3QgdGFnc0J5TmFtZSA9IHtcbiAgICBiaW5hcnksXG4gICAgYm9vbDogYm9vbFRhZyxcbiAgICBmbG9hdCxcbiAgICBmbG9hdEV4cCxcbiAgICBmbG9hdE5hTixcbiAgICBmbG9hdFRpbWUsXG4gICAgaW50LFxuICAgIGludEhleCxcbiAgICBpbnRPY3QsXG4gICAgaW50VGltZSxcbiAgICBtYXAsXG4gICAgbnVsbDogbnVsbFRhZyxcbiAgICBvbWFwLFxuICAgIHBhaXJzLFxuICAgIHNlcSxcbiAgICBzZXQsXG4gICAgdGltZXN0YW1wXG59O1xuY29uc3QgY29yZUtub3duVGFncyA9IHtcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5JzogYmluYXJ5LFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJzogb21hcCxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnOiBwYWlycyxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6c2V0Jzogc2V0LFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnOiB0aW1lc3RhbXBcbn07XG5mdW5jdGlvbiBnZXRUYWdzKGN1c3RvbVRhZ3MsIHNjaGVtYU5hbWUpIHtcbiAgICBsZXQgdGFncyA9IHNjaGVtYXMuZ2V0KHNjaGVtYU5hbWUpO1xuICAgIGlmICghdGFncykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXN0b21UYWdzKSlcbiAgICAgICAgICAgIHRhZ3MgPSBbXTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShzY2hlbWFzLmtleXMoKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGtleSA9PiBrZXkgIT09ICd5YW1sMTEnKVxuICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IEpTT04uc3RyaW5naWZ5KGtleSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc2NoZW1hIFwiJHtzY2hlbWFOYW1lfVwiOyB1c2Ugb25lIG9mICR7a2V5c30gb3IgZGVmaW5lIGN1c3RvbVRhZ3MgYXJyYXlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXN0b21UYWdzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBjdXN0b21UYWdzKVxuICAgICAgICAgICAgdGFncyA9IHRhZ3MuY29uY2F0KHRhZyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBjdXN0b21UYWdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRhZ3MgPSBjdXN0b21UYWdzKHRhZ3Muc2xpY2UoKSk7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLm1hcCh0YWcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRhZyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICBjb25zdCB0YWdPYmogPSB0YWdzQnlOYW1lW3RhZ107XG4gICAgICAgIGlmICh0YWdPYmopXG4gICAgICAgICAgICByZXR1cm4gdGFnT2JqO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFnc0J5TmFtZSlcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IEpTT04uc3RyaW5naWZ5KGtleSkpXG4gICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGN1c3RvbSB0YWcgXCIke3RhZ31cIjsgdXNlIG9uZSBvZiAke2tleXN9YCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB7IGNvcmVLbm93blRhZ3MsIGdldFRhZ3MgfTtcbiIsImltcG9ydCB7IE1BUCwgU0NBTEFSLCBTRVEgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGdldFRhZ3MsIGNvcmVLbm93blRhZ3MgfSBmcm9tICcuL3RhZ3MuanMnO1xuXG5jb25zdCBzb3J0TWFwRW50cmllc0J5S2V5ID0gKGEsIGIpID0+IGEua2V5IDwgYi5rZXkgPyAtMSA6IGEua2V5ID4gYi5rZXkgPyAxIDogMDtcbmNsYXNzIFNjaGVtYSB7XG4gICAgY29uc3RydWN0b3IoeyBjb21wYXQsIGN1c3RvbVRhZ3MsIG1lcmdlLCByZXNvbHZlS25vd25UYWdzLCBzY2hlbWEsIHNvcnRNYXBFbnRyaWVzLCB0b1N0cmluZ0RlZmF1bHRzIH0pIHtcbiAgICAgICAgdGhpcy5jb21wYXQgPSBBcnJheS5pc0FycmF5KGNvbXBhdClcbiAgICAgICAgICAgID8gZ2V0VGFncyhjb21wYXQsICdjb21wYXQnKVxuICAgICAgICAgICAgOiBjb21wYXRcbiAgICAgICAgICAgICAgICA/IGdldFRhZ3MobnVsbCwgY29tcGF0KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5tZXJnZSA9ICEhbWVyZ2U7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEpIHx8ICdjb3JlJztcbiAgICAgICAgdGhpcy5rbm93blRhZ3MgPSByZXNvbHZlS25vd25UYWdzID8gY29yZUtub3duVGFncyA6IHt9O1xuICAgICAgICB0aGlzLnRhZ3MgPSBnZXRUYWdzKGN1c3RvbVRhZ3MsIHRoaXMubmFtZSk7XG4gICAgICAgIHRoaXMudG9TdHJpbmdPcHRpb25zID0gdG9TdHJpbmdEZWZhdWx0cyB8fCBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTUFQLCB7IHZhbHVlOiBtYXAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTQ0FMQVIsIHsgdmFsdWU6IHN0cmluZyB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNFUSwgeyB2YWx1ZTogc2VxIH0pO1xuICAgICAgICAvLyBVc2VkIGJ5IGNyZWF0ZU1hcCgpXG4gICAgICAgIHRoaXMuc29ydE1hcEVudHJpZXMgPVxuICAgICAgICAgICAgc29ydE1hcEVudHJpZXMgPT09IHRydWUgPyBzb3J0TWFwRW50cmllc0J5S2V5IDogc29ydE1hcEVudHJpZXMgfHwgbnVsbDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKFNjaGVtYS5wcm90b3R5cGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgY29weS50YWdzID0gdGhpcy50YWdzLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU2NoZW1hIH07XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5RG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgaGFzRGlyZWN0aXZlcyA9IG9wdGlvbnMuZGlyZWN0aXZlcyA9PT0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5kaXJlY3RpdmVzICE9PSBmYWxzZSAmJiBkb2MuZGlyZWN0aXZlcykge1xuICAgICAgICBjb25zdCBkaXIgPSBkb2MuZGlyZWN0aXZlcy50b1N0cmluZyhkb2MpO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGRpcik7XG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuZGlyZWN0aXZlcy5tYXJrZXIpXG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGhhc0RpcmVjdGl2ZXMpXG4gICAgICAgIGxpbmVzLnB1c2goJy0tLScpO1xuICAgIGNvbnN0IGN0eCA9IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKTtcbiAgICBjb25zdCB7IGNvbW1lbnRTdHJpbmcgfSA9IGN0eC5vcHRpb25zO1xuICAgIGlmIChkb2MuY29tbWVudEJlZm9yZSkge1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgbGluZXMudW5zaGlmdCgnJyk7XG4gICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29tbWVudEJlZm9yZSk7XG4gICAgICAgIGxpbmVzLnVuc2hpZnQoaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICB9XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBjb250ZW50Q29tbWVudCA9IG51bGw7XG4gICAgaWYgKGRvYy5jb250ZW50cykge1xuICAgICAgICBpZiAoaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuc3BhY2VCZWZvcmUgJiYgaGFzRGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdG9wLWxldmVsIGJsb2NrIHNjYWxhcnMgbmVlZCB0byBiZSBpbmRlbnRlZCBpZiBmb2xsb3dlZCBieSBhIGNvbW1lbnRcbiAgICAgICAgICAgIGN0eC5mb3JjZUJsb2NrSW5kZW50ID0gISFkb2MuY29tbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnRDb21tZW50ID0gZG9jLmNvbnRlbnRzLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb25DaG9tcEtlZXAgPSBjb250ZW50Q29tbWVudCA/IHVuZGVmaW5lZCA6ICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKTtcbiAgICAgICAgbGV0IGJvZHkgPSBzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgsICgpID0+IChjb250ZW50Q29tbWVudCA9IG51bGwpLCBvbkNob21wS2VlcCk7XG4gICAgICAgIGlmIChjb250ZW50Q29tbWVudClcbiAgICAgICAgICAgIGJvZHkgKz0gbGluZUNvbW1lbnQoYm9keSwgJycsIGNvbW1lbnRTdHJpbmcoY29udGVudENvbW1lbnQpKTtcbiAgICAgICAgaWYgKChib2R5WzBdID09PSAnfCcgfHwgYm9keVswXSA9PT0gJz4nKSAmJlxuICAgICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICctLS0nKSB7XG4gICAgICAgICAgICAvLyBUb3AtbGV2ZWwgYmxvY2sgc2NhbGFycyB3aXRoIGEgcHJlY2VkaW5nIGRvYyBtYXJrZXIgb3VnaHQgdG8gdXNlIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBsaW5lIGZvciB0aGVpciBoZWFkZXIuXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGAtLS0gJHtib2R5fWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGluZXMucHVzaChib2R5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyaW5naWZ5KGRvYy5jb250ZW50cywgY3R4KSk7XG4gICAgfVxuICAgIGxldCBkYyA9IGRvYy5jb21tZW50O1xuICAgIGlmIChkYyAmJiBjaG9tcEtlZXApXG4gICAgICAgIGRjID0gZGMucmVwbGFjZSgvXlxcbisvLCAnJyk7XG4gICAgaWYgKGRjKSB7XG4gICAgICAgIGlmICgoIWNob21wS2VlcCB8fCBjb250ZW50Q29tbWVudCkgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gIT09ICcnKVxuICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGRjKSwgJycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeURvY3VtZW50IH07XG4iLCIvKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh2YWwua2V5cygpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gdmFsLmdldChrKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbC5zZXQoaywgdjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2MCBvZiBBcnJheS5mcm9tKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIHYwLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKHYwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmFkZCh2MSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdjBdIG9mIE9iamVjdC5lbnRyaWVzKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbFtrXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbFtrXSA9IHYxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZpdmVyLmNhbGwob2JqLCBrZXksIHZhbCk7XG59XG5cbmV4cG9ydCB7IGFwcGx5UmV2aXZlciB9O1xuIiwiaW1wb3J0IHsgQWxpYXMgfSBmcm9tICcuLi9ub2Rlcy9BbGlhcy5qcyc7XG5pbXBvcnQgeyBpc0VtcHR5UGF0aCwgY29sbGVjdGlvbkZyb21QYXRoIH0gZnJvbSAnLi4vbm9kZXMvQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIERPQywgaXNOb2RlLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi4vbm9kZXMvdG9KUy5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0T3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hL1NjaGVtYS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeURvY3VtZW50IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeURvY3VtZW50LmpzJztcbmltcG9ydCB7IGFuY2hvck5hbWVzLCBmaW5kTmV3QW5jaG9yLCBjcmVhdGVOb2RlQW5jaG9ycyB9IGZyb20gJy4vYW5jaG9ycy5qcyc7XG5pbXBvcnQgeyBhcHBseVJldml2ZXIgfSBmcm9tICcuL2FwcGx5UmV2aXZlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IERpcmVjdGl2ZXMgfSBmcm9tICcuL2RpcmVjdGl2ZXMuanMnO1xuXG5jbGFzcyBEb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qKiBBIGNvbW1lbnQgYmVmb3JlIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50QmVmb3JlID0gbnVsbDtcbiAgICAgICAgLyoqIEEgY29tbWVudCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIERvY3VtZW50ICovXG4gICAgICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG4gICAgICAgIC8qKiBFcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuICovXG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIC8qKiBXYXJuaW5ncyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBET0MgfSk7XG4gICAgICAgIGxldCBfcmVwbGFjZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICAgICAgICAgIHJlcGxhY2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdCA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0O1xuICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSBvcHQ7XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlyZWN0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gb3B0aW9ucy5kaXJlY3RpdmVzLmF0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMueWFtbC5leHBsaWNpdClcbiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgIHRoaXMuc2V0U2NoZW1hKHZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB0aGlzLmNyZWF0ZU5vZGUodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoaXMgRG9jdW1lbnQgYW5kIGl0cyBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIEN1c3RvbSBOb2RlIHZhbHVlcyB0aGF0IGluaGVyaXQgZnJvbSBgT2JqZWN0YCBzdGlsbCByZWZlciB0byB0aGVpciBvcmlnaW5hbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKERvY3VtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW05PREVfVFlQRV06IHsgdmFsdWU6IERPQyB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb3B5LmNvbW1lbnRCZWZvcmUgPSB0aGlzLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIGNvcHkuY29tbWVudCA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgY29weS5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgpO1xuICAgICAgICBjb3B5Lndhcm5pbmdzID0gdGhpcy53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgICBjb3B5Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgY29weS5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLmNsb25lKCk7XG4gICAgICAgIGNvcHkuc2NoZW1hID0gdGhpcy5zY2hlbWEuY2xvbmUoKTtcbiAgICAgICAgY29weS5jb250ZW50cyA9IGlzTm9kZSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmNsb25lKGNvcHkuc2NoZW1hKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGRJbihwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgQWxpYXNgIG5vZGUsIGVuc3VyaW5nIHRoYXQgdGhlIHRhcmdldCBgbm9kZWAgaGFzIHRoZSByZXF1aXJlZCBhbmNob3IuXG4gICAgICpcbiAgICAgKiBJZiBgbm9kZWAgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBgbmFtZWAgaXMgaWdub3JlZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoZSBgbm9kZS5hbmNob3JgIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGBuYW1lYCxcbiAgICAgKiBvciBpZiBhbiBhbmNob3Igd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkb2N1bWVudCxcbiAgICAgKiBgbmFtZWAgd2lsbCBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhIG5ldyB1bmlxdWUgYW5jaG9yLlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHdpbGwgdXNlICdhJyBhcyBhIHByZWZpeC5cbiAgICAgKi9cbiAgICBjcmVhdGVBbGlhcyhub2RlLCBuYW1lKSB7XG4gICAgICAgIGlmICghbm9kZS5hbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBhbmNob3JOYW1lcyh0aGlzKTtcbiAgICAgICAgICAgIG5vZGUuYW5jaG9yID1cbiAgICAgICAgICAgICAgICAhbmFtZSB8fCBwcmV2LmhhcyhuYW1lKSA/IGZpbmROZXdBbmNob3IobmFtZSB8fCAnYScsIHByZXYpIDogbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsaWFzKG5vZGUuYW5jaG9yKTtcbiAgICB9XG4gICAgY3JlYXRlTm9kZSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKHsgJyc6IHZhbHVlIH0sICcnLCB2YWx1ZSk7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5VG9TdHIgPSAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIE51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGFzU3RyID0gcmVwbGFjZXIuZmlsdGVyKGtleVRvU3RyKS5tYXAoU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChhc1N0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0gcmVwbGFjZXIuY29uY2F0KGFzU3RyKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIGFuY2hvclByZWZpeCwgZmxvdywga2VlcFVuZGVmaW5lZCwgb25UYWdPYmosIHRhZyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBvbkFuY2hvciwgc2V0QW5jaG9ycywgc291cmNlT2JqZWN0cyB9ID0gY3JlYXRlTm9kZUFuY2hvcnModGhpcywgYW5jaG9yUHJlZml4IHx8ICdhJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFsaWFzRHVwbGljYXRlT2JqZWN0czogYWxpYXNEdXBsaWNhdGVPYmplY3RzICE9PSBudWxsICYmIGFsaWFzRHVwbGljYXRlT2JqZWN0cyAhPT0gdm9pZCAwID8gYWxpYXNEdXBsaWNhdGVPYmplY3RzIDogdHJ1ZSxcbiAgICAgICAgICAgIGtlZXBVbmRlZmluZWQ6IGtlZXBVbmRlZmluZWQgIT09IG51bGwgJiYga2VlcFVuZGVmaW5lZCAhPT0gdm9pZCAwID8ga2VlcFVuZGVmaW5lZCA6IGZhbHNlLFxuICAgICAgICAgICAgb25BbmNob3IsXG4gICAgICAgICAgICBvblRhZ09iaixcbiAgICAgICAgICAgIHJlcGxhY2VyOiBfcmVwbGFjZXIsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICAgICAgc291cmNlT2JqZWN0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBub2RlID0gY3JlYXRlTm9kZSh2YWx1ZSwgdGFnLCBjdHgpO1xuICAgICAgICBpZiAoZmxvdyAmJiBpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICBub2RlLmZsb3cgPSB0cnVlO1xuICAgICAgICBzZXRBbmNob3JzKCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEga2V5IGFuZCBhIHZhbHVlIGludG8gYSBgUGFpcmAgdXNpbmcgdGhlIGN1cnJlbnQgc2NoZW1hLFxuICAgICAqIHJlY3Vyc2l2ZWx5IHdyYXBwaW5nIGFsbCB2YWx1ZXMgYXMgYFNjYWxhcmAgb3IgYENvbGxlY3Rpb25gIG5vZGVzLlxuICAgICAqL1xuICAgIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmNyZWF0ZU5vZGUoa2V5LCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgbnVsbCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBuZXcgUGFpcihrLCB2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuZGVsZXRlKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmRlbGV0ZUluKHBhdGgpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGl0ZW0gYXQgYGtleWAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmdldChrZXksIGtlZXBTY2FsYXIpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBwYXRoYCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29udGVudHMudmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuY29udGVudHM7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXRJbihwYXRoLCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZG9jdW1lbnQgaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5oYXMoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgYXQgYHBhdGhgLlxuICAgICAqL1xuICAgIGhhc0luKHBhdGgpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzSW4ocGF0aCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIFtrZXldLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB2YWx1ZTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCBBcnJheS5mcm9tKHBhdGgpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXRJbihwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBZQU1MIHZlcnNpb24gYW5kIHNjaGVtYSB1c2VkIGJ5IHRoZSBkb2N1bWVudC5cbiAgICAgKiBBIGBudWxsYCB2ZXJzaW9uIGRpc2FibGVzIHN1cHBvcnQgZm9yIGRpcmVjdGl2ZXMsIGV4cGxpY2l0IHRhZ3MsIGFuY2hvcnMsIGFuZCBhbGlhc2VzLlxuICAgICAqIEl0IGFsc28gcmVxdWlyZXMgdGhlIGBzY2hlbWFgIG9wdGlvbiB0byBiZSBnaXZlbiBhcyBhIGBTY2hlbWFgIGluc3RhbmNlIHZhbHVlLlxuICAgICAqXG4gICAgICogT3ZlcnJpZGVzIGFsbCBwcmV2aW91c2x5IHNldCBzY2hlbWEgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBzZXRTY2hlbWEodmVyc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pO1xuICAgICAgICBsZXQgb3B0O1xuICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9ICcxLjEnO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uOiAnMS4xJyB9KTtcbiAgICAgICAgICAgICAgICBvcHQgPSB7IG1lcmdlOiB0cnVlLCByZXNvbHZlS25vd25UYWdzOiBmYWxzZSwgc2NoZW1hOiAneWFtbC0xLjEnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24gPSAnMS4yJztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG5ldyBEaXJlY3RpdmVzKHsgdmVyc2lvbjogJzEuMicgfSk7XG4gICAgICAgICAgICAgICAgb3B0ID0geyBtZXJnZTogZmFsc2UsIHJlc29sdmVLbm93blRhZ3M6IHRydWUsIHNjaGVtYTogJ2NvcmUnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGlyZWN0aXZlcztcbiAgICAgICAgICAgICAgICBvcHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gSlNPTi5zdHJpbmdpZnkodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnMS4xJywgJzEuMicgb3IgbnVsbCBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGZvdW5kOiAke3N2fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCB1c2luZyBgaW5zdGFuY2VvZiBTY2hlbWFgIHRvIGFsbG93IGZvciBkdWNrIHR5cGluZ1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnMuc2NoZW1hO1xuICAgICAgICBlbHNlIGlmIChvcHQpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG5ldyBTY2hlbWEoT2JqZWN0LmFzc2lnbihvcHQsIG9wdGlvbnMpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRoIGEgbnVsbCBZQU1MIHZlcnNpb24sIHRoZSB7IHNjaGVtYTogU2NoZW1hIH0gb3B0aW9uIGlzIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIC8vIGpzb24gJiBqc29uQXJnIGFyZSBvbmx5IHVzZWQgZnJvbSB0b0pTT04oKVxuICAgIHRvSlMoeyBqc29uLCBqc29uQXJnLCBtYXBBc01hcCwgbWF4QWxpYXNDb3VudCwgb25BbmNob3IsIHJldml2ZXIgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFuY2hvcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIGRvYzogdGhpcyxcbiAgICAgICAgICAgIGtlZXA6ICFqc29uLFxuICAgICAgICAgICAgbWFwQXNNYXA6IG1hcEFzTWFwID09PSB0cnVlLFxuICAgICAgICAgICAgbWFwS2V5V2FybmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG1heEFsaWFzQ291bnQ6IHR5cGVvZiBtYXhBbGlhc0NvdW50ID09PSAnbnVtYmVyJyA/IG1heEFsaWFzQ291bnQgOiAxMDAsXG4gICAgICAgICAgICBzdHJpbmdpZnlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gdG9KUyh0aGlzLmNvbnRlbnRzLCBqc29uQXJnIHx8ICcnLCBjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQW5jaG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGNvdW50LCByZXMgfSBvZiBjdHguYW5jaG9ycy52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICBvbkFuY2hvcihyZXMsIGNvdW50KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB7ICcnOiByZXMgfSwgJycsIHJlcylcbiAgICAgICAgICAgIDogcmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50IGBjb250ZW50c2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ganNvbkFyZyBVc2VkIGJ5IGBKU09OLnN0cmluZ2lmeWAgdG8gaW5kaWNhdGUgdGhlIGFycmF5IGluZGV4IG9yXG4gICAgICogICBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHRvSlNPTihqc29uQXJnLCBvbkFuY2hvcikge1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKHsganNvbjogdHJ1ZSwganNvbkFyZywgbWFwQXNNYXA6IGZhbHNlLCBvbkFuY2hvciB9KTtcbiAgICB9XG4gICAgLyoqIEEgWUFNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQuICovXG4gICAgdG9TdHJpbmcob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2N1bWVudCB3aXRoIGVycm9ycyBjYW5ub3QgYmUgc3RyaW5naWZpZWQnKTtcbiAgICAgICAgaWYgKCdpbmRlbnQnIGluIG9wdGlvbnMgJiZcbiAgICAgICAgICAgICghTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmluZGVudCkgfHwgTnVtYmVyKG9wdGlvbnMuaW5kZW50KSA8PSAwKSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuaW5kZW50KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJpbmRlbnRcIiBvcHRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIG5vdCAke3N9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeURvY3VtZW50KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydENvbGxlY3Rpb24oY29udGVudHMpIHtcbiAgICBpZiAoaXNDb2xsZWN0aW9uKGNvbnRlbnRzKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIFlBTUwgY29sbGVjdGlvbiBhcyBkb2N1bWVudCBjb250ZW50cycpO1xufVxuXG5leHBvcnQgeyBEb2N1bWVudCB9O1xuIiwiY2xhc3MgWUFNTEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBvcywgY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICB9XG59XG5jbGFzcyBZQU1MUGFyc2VFcnJvciBleHRlbmRzIFlBTUxFcnJvciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCdZQU1MUGFyc2VFcnJvcicsIHBvcywgY29kZSwgbWVzc2FnZSk7XG4gICAgfVxufVxuY2xhc3MgWUFNTFdhcm5pbmcgZXh0ZW5kcyBZQU1MRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBvcywgY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcignWUFNTFdhcm5pbmcnLCBwb3MsIGNvZGUsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmNvbnN0IHByZXR0aWZ5RXJyb3IgPSAoc3JjLCBsYykgPT4gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLnBvc1swXSA9PT0gLTEpXG4gICAgICAgIHJldHVybjtcbiAgICBlcnJvci5saW5lUG9zID0gZXJyb3IucG9zLm1hcChwb3MgPT4gbGMubGluZVBvcyhwb3MpKTtcbiAgICBjb25zdCB7IGxpbmUsIGNvbCB9ID0gZXJyb3IubGluZVBvc1swXTtcbiAgICBlcnJvci5tZXNzYWdlICs9IGAgYXQgbGluZSAke2xpbmV9LCBjb2x1bW4gJHtjb2x9YDtcbiAgICBsZXQgY2kgPSBjb2wgLSAxO1xuICAgIGxldCBsaW5lU3RyID0gc3JjXG4gICAgICAgIC5zdWJzdHJpbmcobGMubGluZVN0YXJ0c1tsaW5lIC0gMV0sIGxjLmxpbmVTdGFydHNbbGluZV0pXG4gICAgICAgIC5yZXBsYWNlKC9bXFxuXFxyXSskLywgJycpO1xuICAgIC8vIFRyaW0gdG8gbWF4IDgwIGNoYXJzLCBrZWVwaW5nIGNvbCBwb3NpdGlvbiBuZWFyIHRoZSBtaWRkbGVcbiAgICBpZiAoY2kgPj0gNjAgJiYgbGluZVN0ci5sZW5ndGggPiA4MCkge1xuICAgICAgICBjb25zdCB0cmltU3RhcnQgPSBNYXRoLm1pbihjaSAtIDM5LCBsaW5lU3RyLmxlbmd0aCAtIDc5KTtcbiAgICAgICAgbGluZVN0ciA9ICfigKYnICsgbGluZVN0ci5zdWJzdHJpbmcodHJpbVN0YXJ0KTtcbiAgICAgICAgY2kgLT0gdHJpbVN0YXJ0IC0gMTtcbiAgICB9XG4gICAgaWYgKGxpbmVTdHIubGVuZ3RoID4gODApXG4gICAgICAgIGxpbmVTdHIgPSBsaW5lU3RyLnN1YnN0cmluZygwLCA3OSkgKyAn4oCmJztcbiAgICAvLyBJbmNsdWRlIHByZXZpb3VzIGxpbmUgaW4gY29udGV4dCBpZiBwb2ludGluZyBhdCBsaW5lIHN0YXJ0XG4gICAgaWYgKGxpbmUgPiAxICYmIC9eICokLy50ZXN0KGxpbmVTdHIuc3Vic3RyaW5nKDAsIGNpKSkpIHtcbiAgICAgICAgLy8gUmVnZXhwIHdvbid0IG1hdGNoIGlmIHN0YXJ0IGlzIHRyaW1tZWRcbiAgICAgICAgbGV0IHByZXYgPSBzcmMuc3Vic3RyaW5nKGxjLmxpbmVTdGFydHNbbGluZSAtIDJdLCBsYy5saW5lU3RhcnRzW2xpbmUgLSAxXSk7XG4gICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDgwKVxuICAgICAgICAgICAgcHJldiA9IHByZXYuc3Vic3RyaW5nKDAsIDc5KSArICfigKZcXG4nO1xuICAgICAgICBsaW5lU3RyID0gcHJldiArIGxpbmVTdHI7XG4gICAgfVxuICAgIGlmICgvW14gXS8udGVzdChsaW5lU3RyKSkge1xuICAgICAgICBsZXQgY291bnQgPSAxO1xuICAgICAgICBjb25zdCBlbmQgPSBlcnJvci5saW5lUG9zWzFdO1xuICAgICAgICBpZiAoZW5kICYmIGVuZC5saW5lID09PSBsaW5lICYmIGVuZC5jb2wgPiBjb2wpIHtcbiAgICAgICAgICAgIGNvdW50ID0gTWF0aC5taW4oZW5kLmNvbCAtIGNvbCwgODAgLSBjaSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlciA9ICcgJy5yZXBlYXQoY2kpICsgJ14nLnJlcGVhdChjb3VudCk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYDpcXG5cXG4ke2xpbmVTdHJ9XFxuJHtwb2ludGVyfVxcbmA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTEVycm9yLCBZQU1MUGFyc2VFcnJvciwgWUFNTFdhcm5pbmcsIHByZXR0aWZ5RXJyb3IgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVQcm9wcyh0b2tlbnMsIHsgZmxvdywgaW5kaWNhdG9yLCBuZXh0LCBvZmZzZXQsIG9uRXJyb3IsIHN0YXJ0T25OZXdsaW5lIH0pIHtcbiAgICBsZXQgc3BhY2VCZWZvcmUgPSBmYWxzZTtcbiAgICBsZXQgYXROZXdsaW5lID0gc3RhcnRPbk5ld2xpbmU7XG4gICAgbGV0IGhhc1NwYWNlID0gc3RhcnRPbk5ld2xpbmU7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBsZXQgY29tbWVudFNlcCA9ICcnO1xuICAgIGxldCBoYXNOZXdsaW5lID0gZmFsc2U7XG4gICAgbGV0IHJlcVNwYWNlID0gZmFsc2U7XG4gICAgbGV0IGFuY2hvciA9IG51bGw7XG4gICAgbGV0IHRhZyA9IG51bGw7XG4gICAgbGV0IGNvbW1hID0gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgaWYgKHJlcVNwYWNlKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICdjb21tYScpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgICAgICAgICByZXFTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBkb2MgbGV2ZWwsIHRhYnMgYXQgbGluZSBzdGFydCBtYXkgYmUgcGFyc2VkXG4gICAgICAgICAgICAgICAgLy8gYXMgbGVhZGluZyB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBpbmRlbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBJbiBhIGZsb3cgY29sbGVjdGlvbiwgb25seSB0aGUgcGFyc2VyIGhhbmRsZXMgaW5kZW50LlxuICAgICAgICAgICAgICAgIGlmICghZmxvdyAmJlxuICAgICAgICAgICAgICAgICAgICBhdE5ld2xpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yICE9PSAnZG9jLXN0YXJ0JyAmJlxuICAgICAgICAgICAgICAgICAgICB0b2tlbi5zb3VyY2VbMF0gPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVEFCX0FTX0lOREVOVCcsICdUYWJzIGFyZSBub3QgYWxsb3dlZCBhcyBpbmRlbnRhdGlvbicpO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gY29tbWVudFNlcCArIGNiO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgPSAnJztcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChhdE5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgKz0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaGFzTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYW5jaG9yJzpcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfQU5DSE9SUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgYW5jaG9yJyk7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRva2VuLm9mZnNldDtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfVEFHUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJyk7XG4gICAgICAgICAgICAgICAgdGFnID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRva2VuLm9mZnNldDtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgaW5kaWNhdG9yOlxuICAgICAgICAgICAgICAgIC8vIENvdWxkIGhlcmUgaGFuZGxlIHByZWNlZGluZyBjb21tZW50cyBkaWZmZXJlbnRseVxuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnQkFEX1BST1BfT1JERVInLCBgQW5jaG9ycyBhbmQgdGFncyBtdXN0IGJlIGFmdGVyIHRoZSAke3Rva2VuLnNvdXJjZX0gaW5kaWNhdG9yYCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4uc291cmNlfSBpbiAke2Zsb3cgfHwgJ2NvbGxlY3Rpb24nfWApO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdG9rZW47XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoZmxvdykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICwgaW4gJHtmbG93fWApO1xuICAgICAgICAgICAgICAgICAgICBjb21tYSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4udHlwZX0gdG9rZW5gKTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGVuZCA9IGxhc3QgPyBsYXN0Lm9mZnNldCArIGxhc3Quc291cmNlLmxlbmd0aCA6IG9mZnNldDtcbiAgICBpZiAocmVxU3BhY2UgJiZcbiAgICAgICAgbmV4dCAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICdzcGFjZScgJiZcbiAgICAgICAgbmV4dC50eXBlICE9PSAnbmV3bGluZScgJiZcbiAgICAgICAgbmV4dC50eXBlICE9PSAnY29tbWEnICYmXG4gICAgICAgIChuZXh0LnR5cGUgIT09ICdzY2FsYXInIHx8IG5leHQuc291cmNlICE9PSAnJykpXG4gICAgICAgIG9uRXJyb3IobmV4dC5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWEsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBzcGFjZUJlZm9yZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgaGFzTmV3bGluZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ICE9PSBudWxsICYmIHN0YXJ0ICE9PSB2b2lkIDAgPyBzdGFydCA6IGVuZFxuICAgIH07XG59XG5cbmV4cG9ydCB7IHJlc29sdmVQcm9wcyB9O1xuIiwiZnVuY3Rpb24gY29udGFpbnNOZXdsaW5lKGtleSkge1xuICAgIGlmICgha2V5KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBpZiAoa2V5LnNvdXJjZS5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoa2V5LmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGtleS5lbmQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2Yga2V5Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBpdC5zdGFydClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNOZXdsaW5lKGl0LmtleSkgfHwgY29udGFpbnNOZXdsaW5lKGl0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IGNvbnRhaW5zTmV3bGluZSB9O1xuIiwiaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuXG5mdW5jdGlvbiBmbG93SW5kZW50Q2hlY2soaW5kZW50LCBmYywgb25FcnJvcikge1xuICAgIGlmICgoZmMgPT09IG51bGwgfHwgZmMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZjLnR5cGUpID09PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICBjb25zdCBlbmQgPSBmYy5lbmRbMF07XG4gICAgICAgIGlmIChlbmQuaW5kZW50ID09PSBpbmRlbnQgJiZcbiAgICAgICAgICAgIChlbmQuc291cmNlID09PSAnXScgfHwgZW5kLnNvdXJjZSA9PT0gJ30nKSAmJlxuICAgICAgICAgICAgY29udGFpbnNOZXdsaW5lKGZjKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ0Zsb3cgZW5kIGluZGljYXRvciBzaG91bGQgYmUgbW9yZSBpbmRlbnRlZCB0aGFuIHBhcmVudCc7XG4gICAgICAgICAgICBvbkVycm9yKGVuZCwgJ0JBRF9JTkRFTlQnLCBtc2csIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBmbG93SW5kZW50Q2hlY2sgfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIG1hcEluY2x1ZGVzKGN0eCwgaXRlbXMsIHNlYXJjaCkge1xuICAgIGNvbnN0IHsgdW5pcXVlS2V5cyB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgaWYgKHVuaXF1ZUtleXMgPT09IGZhbHNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaXNFcXVhbCA9IHR5cGVvZiB1bmlxdWVLZXlzID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdW5pcXVlS2V5c1xuICAgICAgICA6IChhLCBiKSA9PiBhID09PSBiIHx8XG4gICAgICAgICAgICAoaXNTY2FsYXIoYSkgJiZcbiAgICAgICAgICAgICAgICBpc1NjYWxhcihiKSAmJlxuICAgICAgICAgICAgICAgIGEudmFsdWUgPT09IGIudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhKGEudmFsdWUgPT09ICc8PCcgJiYgY3R4LnNjaGVtYS5tZXJnZSkpO1xuICAgIHJldHVybiBpdGVtcy5zb21lKHBhaXIgPT4gaXNFcXVhbChwYWlyLmtleSwgc2VhcmNoKSk7XG59XG5cbmV4cG9ydCB7IG1hcEluY2x1ZGVzIH07XG4iLCJpbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgZmxvd0luZGVudENoZWNrIH0gZnJvbSAnLi91dGlsLWZsb3ctaW5kZW50LWNoZWNrLmpzJztcbmltcG9ydCB7IG1hcEluY2x1ZGVzIH0gZnJvbSAnLi91dGlsLW1hcC1pbmNsdWRlcy5qcyc7XG5cbmNvbnN0IHN0YXJ0Q29sTXNnID0gJ0FsbCBtYXBwaW5nIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJztcbmZ1bmN0aW9uIHJlc29sdmVCbG9ja01hcCh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYm0sIG9uRXJyb3IpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbWFwID0gbmV3IFlBTUxNYXAoY3R4LnNjaGVtYSk7XG4gICAgaWYgKGN0eC5hdFJvb3QpXG4gICAgICAgIGN0eC5hdFJvb3QgPSBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gYm0ub2Zmc2V0O1xuICAgIGZvciAoY29uc3QgY29sbEl0ZW0gb2YgYm0uaXRlbXMpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgLy8ga2V5IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3Qga2V5UHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5IHx8IChzZXAgPT09IG51bGwgfHwgc2VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXBbMF0pLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbXBsaWNpdEtleSA9ICFrZXlQcm9wcy5mb3VuZDtcbiAgICAgICAgaWYgKGltcGxpY2l0S2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS50eXBlID09PSAnYmxvY2stc2VxJylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCTE9DS19BU19JTVBMSUNJVF9LRVknLCAnQSBibG9jayBzZXF1ZW5jZSBtYXkgbm90IGJlIHVzZWQgYXMgYW4gaW1wbGljaXQgbWFwIGtleScpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdpbmRlbnQnIGluIGtleSAmJiBrZXkuaW5kZW50ICE9PSBibS5pbmRlbnQpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0lOREVOVCcsIHN0YXJ0Q29sTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgha2V5UHJvcHMuYW5jaG9yICYmICFrZXlQcm9wcy50YWcgJiYgIXNlcCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFzc2VydCBiZWluZyBhdCBsYXN0IGl0ZW0/XG4gICAgICAgICAgICAgICAgaWYgKGtleVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmNvbW1lbnQgKz0gJ1xcbicgKyBrZXlQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29tbWVudCA9IGtleVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgoX2EgPSBrZXlQcm9wcy5mb3VuZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluZGVudCkgIT09IGJtLmluZGVudClcbiAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0lOREVOVCcsIHN0YXJ0Q29sTXNnKTtcbiAgICAgICAgaWYgKGltcGxpY2l0S2V5ICYmIGNvbnRhaW5zTmV3bGluZShrZXkpKVxuICAgICAgICAgICAgb25FcnJvcihrZXksIC8vIGNoZWNrZWQgYnkgY29udGFpbnNOZXdsaW5lKClcbiAgICAgICAgICAgICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgbmVlZCB0byBiZSBvbiBhIHNpbmdsZSBsaW5lJyk7XG4gICAgICAgIC8vIGtleSB2YWx1ZVxuICAgICAgICBjb25zdCBrZXlTdGFydCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwga2V5UHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIGtleVByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwga2V5LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKG1hcEluY2x1ZGVzKGN0eCwgbWFwLml0ZW1zLCBrZXlOb2RlKSlcbiAgICAgICAgICAgIG9uRXJyb3Ioa2V5U3RhcnQsICdEVVBMSUNBVEVfS0VZJywgJ01hcCBrZXlzIG11c3QgYmUgdW5pcXVlJyk7XG4gICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgY29uc3QgdmFsdWVQcm9wcyA9IHJlc29sdmVQcm9wcyhzZXAgfHwgW10sIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICBvZmZzZXQ6IGtleU5vZGUucmFuZ2VbMl0sXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6ICFrZXkgfHwga2V5LnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgaWYgKHZhbHVlUHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLnR5cGUpID09PSAnYmxvY2stbWFwJyAmJiAhdmFsdWVQcm9wcy5oYXNOZXdsaW5lKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdOZXN0ZWQgbWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBhY3QgbWFwcGluZ3MnKTtcbiAgICAgICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMuc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgICAgIGtleVByb3BzLnN0YXJ0IDwgdmFsdWVQcm9wcy5mb3VuZC5vZmZzZXQgLSAxMDI0KVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGtleU5vZGUucmFuZ2UsICdLRVlfT1ZFUl8xMDI0X0NIQVJTJywgJ1RoZSA6IGluZGljYXRvciBtdXN0IGJlIGF0IG1vc3QgMTAyNCBjaGFycyBhZnRlciB0aGUgc3RhcnQgb2YgYW4gaW1wbGljaXQgYmxvY2sgbWFwcGluZyBrZXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZhbHVlIHZhbHVlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBvZmZzZXQsIHNlcCwgbnVsbCwgdmFsdWVQcm9wcywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwgdmFsdWUsIG9uRXJyb3IpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IG5ldyBQYWlyKGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGtleSB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkpXG4gICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnTUlTU0lOR19DSEFSJywgJ0ltcGxpY2l0IG1hcCBrZXlzIG5lZWQgdG8gYmUgZm9sbG93ZWQgYnkgbWFwIHZhbHVlcycpO1xuICAgICAgICAgICAgaWYgKHZhbHVlUHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlOb2RlLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCArPSAnXFxuJyArIHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCA9IHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlKTtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zKVxuICAgICAgICAgICAgICAgIHBhaXIuc3JjVG9rZW4gPSBjb2xsSXRlbTtcbiAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1hcC5yYW5nZSA9IFtibS5vZmZzZXQsIG9mZnNldCwgb2Zmc2V0XTtcbiAgICByZXR1cm4gbWFwO1xufVxuXG5leHBvcnQgeyByZXNvbHZlQmxvY2tNYXAgfTtcbiIsImltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gJy4vcmVzb2x2ZS1wcm9wcy5qcyc7XG5pbXBvcnQgeyBmbG93SW5kZW50Q2hlY2sgfSBmcm9tICcuL3V0aWwtZmxvdy1pbmRlbnQtY2hlY2suanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlQmxvY2tTZXEoeyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9LCBjdHgsIGJzLCBvbkVycm9yKSB7XG4gICAgY29uc3Qgc2VxID0gbmV3IFlBTUxTZXEoY3R4LnNjaGVtYSk7XG4gICAgaWYgKGN0eC5hdFJvb3QpXG4gICAgICAgIGN0eC5hdFJvb3QgPSBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gYnMub2Zmc2V0O1xuICAgIGZvciAoY29uc3QgeyBzdGFydCwgdmFsdWUgfSBvZiBicy5pdGVtcykge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnc2VxLWl0ZW0taW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSBwcm9wcy5lbmQ7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChwcm9wcy5hbmNob3IgfHwgcHJvcHMudGFnIHx8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCAnQWxsIHNlcXVlbmNlIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJyk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ01JU1NJTkdfQ0hBUicsICdTZXF1ZW5jZSBpdGVtIHdpdGhvdXQgLSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFzc2VydCBiZWluZyBhdCBsYXN0IGl0ZW0/XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHNlcS5jb21tZW50ID0gcHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlID0gdmFsdWVcbiAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBvZmZzZXQsIHN0YXJ0LCBudWxsLCBwcm9wcywgb25FcnJvcik7XG4gICAgICAgIGlmIChjdHguc2NoZW1hLmNvbXBhdClcbiAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhicy5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5yYW5nZVsyXTtcbiAgICAgICAgc2VxLml0ZW1zLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIHNlcS5yYW5nZSA9IFticy5vZmZzZXQsIG9mZnNldCwgb2Zmc2V0XTtcbiAgICByZXR1cm4gc2VxO1xufVxuXG5leHBvcnQgeyByZXNvbHZlQmxvY2tTZXEgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBvZmZzZXQsIHJlcVNwYWNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2VwID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB7IHNvdXJjZSwgdHlwZSB9ID0gdG9rZW47XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcVNwYWNlICYmICFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYiA9IHNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY2I7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gc2VwICsgY2I7XG4gICAgICAgICAgICAgICAgICAgIHNlcCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwICs9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dHlwZX0gYXQgbm9kZSBlbmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvbW1lbnQsIG9mZnNldCB9O1xufVxuXG5leHBvcnQgeyByZXNvbHZlRW5kIH07XG4iLCJpbXBvcnQgeyBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gJy4vcmVzb2x2ZS1wcm9wcy5qcyc7XG5pbXBvcnQgeyBjb250YWluc05ld2xpbmUgfSBmcm9tICcuL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyc7XG5pbXBvcnQgeyBtYXBJbmNsdWRlcyB9IGZyb20gJy4vdXRpbC1tYXAtaW5jbHVkZXMuanMnO1xuXG5jb25zdCBibG9ja01zZyA9ICdCbG9jayBjb2xsZWN0aW9ucyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIGZsb3cgY29sbGVjdGlvbnMnO1xuY29uc3QgaXNCbG9jayA9ICh0b2tlbikgPT4gdG9rZW4gJiYgKHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnKTtcbmZ1bmN0aW9uIHJlc29sdmVGbG93Q29sbGVjdGlvbih7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgZmMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBpc01hcCA9IGZjLnN0YXJ0LnNvdXJjZSA9PT0gJ3snO1xuICAgIGNvbnN0IGZjTmFtZSA9IGlzTWFwID8gJ2Zsb3cgbWFwJyA6ICdmbG93IHNlcXVlbmNlJztcbiAgICBjb25zdCBjb2xsID0gaXNNYXBcbiAgICAgICAgPyBuZXcgWUFNTE1hcChjdHguc2NoZW1hKVxuICAgICAgICA6IG5ldyBZQU1MU2VxKGN0eC5zY2hlbWEpO1xuICAgIGNvbGwuZmxvdyA9IHRydWU7XG4gICAgY29uc3QgYXRSb290ID0gY3R4LmF0Um9vdDtcbiAgICBpZiAoYXRSb290KVxuICAgICAgICBjdHguYXRSb290ID0gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9IGZjLm9mZnNldCArIGZjLnN0YXJ0LnNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYy5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb2xsSXRlbSA9IGZjLml0ZW1zW2ldO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBrZXksIHNlcCwgdmFsdWUgfSA9IGNvbGxJdGVtO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgaW5kaWNhdG9yOiAnZXhwbGljaXQta2V5LWluZCcsXG4gICAgICAgICAgICBuZXh0OiBrZXkgfHwgKHNlcCA9PT0gbnVsbCB8fCBzZXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlcFswXSksXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BzLmFuY2hvciAmJiAhcHJvcHMudGFnICYmICFzZXAgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgZmMuaXRlbXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCBlbXB0eSBpdGVtIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgKz0gJ1xcbicgKyBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTWFwICYmIGN0eC5vcHRpb25zLnN0cmljdCAmJiBjb250YWluc05ld2xpbmUoa2V5KSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKGtleSwgLy8gY2hlY2tlZCBieSBjb250YWluc05ld2xpbmUoKVxuICAgICAgICAgICAgICAgICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1hKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nICwgYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZJdGVtQ29tbWVudCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvb3A6IGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbUNvbW1lbnQgPSBzdC5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IGNvbGwuaXRlbXNbY29sbC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFpcihwcmV2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnZhbHVlIHx8IHByZXYua2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jb21tZW50ICs9ICdcXG4nICsgcHJldkl0ZW1Db21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgPSBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50LnN1YnN0cmluZyhwcmV2SXRlbUNvbW1lbnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNNYXAgJiYgIXNlcCAmJiAhcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSB2YWx1ZSBpbiBhIHNlcVxuICAgICAgICAgICAgLy8g4oaSIGtleSAmIHNlcCBhcmUgZW1wdHksIHN0YXJ0IGRvZXMgbm90IGluY2x1ZGUgPyBvciA6XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzZXAsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGNvbGwuaXRlbXMucHVzaCh2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgaWYgKGlzQmxvY2sodmFsdWUpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSBrZXkrdmFsdWUgcGFpclxuICAgICAgICAgICAgLy8ga2V5IHZhbHVlXG4gICAgICAgICAgICBjb25zdCBrZXlTdGFydCA9IHByb3BzLmVuZDtcbiAgICAgICAgICAgIGNvbnN0IGtleU5vZGUgPSBrZXlcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwga2V5LCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChpc0Jsb2NrKGtleSkpXG4gICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwIHx8IFtdLCB7XG4gICAgICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDoga2V5Tm9kZS5yYW5nZVsyXSxcbiAgICAgICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVQcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNNYXAgJiYgIXByb3BzLmZvdW5kICYmIGN0eC5vcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPT09IHZhbHVlUHJvcHMuZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihzdCwgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVQcm9wcy5mb3VuZCwgJ0tFWV9PVkVSXzEwMjRfQ0hBUlMnLCAnVGhlIDogaW5kaWNhdG9yIG11c3QgYmUgYXQgbW9zdCAxMDI0IGNoYXJzIGFmdGVyIHRoZSBzdGFydCBvZiBhbiBpbXBsaWNpdCBmbG93IHNlcXVlbmNlIGtleScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCdzb3VyY2UnIGluIHZhbHVlICYmIHZhbHVlLnNvdXJjZSAmJiB2YWx1ZS5zb3VyY2VbMF0gPT09ICc6JylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZSwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nIHNwYWNlIGFmdGVyIDogaW4gJHtmY05hbWV9YCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHZhbHVlUHJvcHMuc3RhcnQsICdNSVNTSU5HX0NIQVInLCBgTWlzc2luZyAsIG9yIDogYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZhbHVlIHZhbHVlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IHZhbHVlUHJvcHMuZm91bmRcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wb3NlRW1wdHlOb2RlKGN0eCwgdmFsdWVQcm9wcy5lbmQsIHNlcCwgbnVsbCwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHZhbHVlTm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jsb2NrKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZU5vZGUucmFuZ2UsICdCTE9DS19JTl9GTE9XJywgYmxvY2tNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWVQcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleU5vZGUuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAga2V5Tm9kZS5jb21tZW50ICs9ICdcXG4nICsgdmFsdWVQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAga2V5Tm9kZS5jb21tZW50ID0gdmFsdWVQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFpciA9IG5ldyBQYWlyKGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBpZiAoaXNNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb2xsO1xuICAgICAgICAgICAgICAgIGlmIChtYXBJbmNsdWRlcyhjdHgsIG1hcC5pdGVtcywga2V5Tm9kZSkpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5U3RhcnQsICdEVVBMSUNBVEVfS0VZJywgJ01hcCBrZXlzIG11c3QgYmUgdW5pcXVlJyk7XG4gICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgWUFNTE1hcChjdHguc2NoZW1hKTtcbiAgICAgICAgICAgICAgICBtYXAuZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgICAgICAgICAgY29sbC5pdGVtcy5wdXNoKG1hcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSB2YWx1ZU5vZGUgPyB2YWx1ZU5vZGUucmFuZ2VbMl0gOiB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBleHBlY3RlZEVuZCA9IGlzTWFwID8gJ30nIDogJ10nO1xuICAgIGNvbnN0IFtjZSwgLi4uZWVdID0gZmMuZW5kO1xuICAgIGxldCBjZVBvcyA9IG9mZnNldDtcbiAgICBpZiAoY2UgJiYgY2Uuc291cmNlID09PSBleHBlY3RlZEVuZClcbiAgICAgICAgY2VQb3MgPSBjZS5vZmZzZXQgKyBjZS5zb3VyY2UubGVuZ3RoO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lID0gZmNOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBmY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBtc2cgPSBhdFJvb3RcbiAgICAgICAgICAgID8gYCR7bmFtZX0gbXVzdCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YFxuICAgICAgICAgICAgOiBgJHtuYW1lfSBpbiBibG9jayBjb2xsZWN0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGluZGVudGVkIGFuZCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YDtcbiAgICAgICAgb25FcnJvcihvZmZzZXQsIGF0Um9vdCA/ICdNSVNTSU5HX0NIQVInIDogJ0JBRF9JTkRFTlQnLCBtc2cpO1xuICAgICAgICBpZiAoY2UgJiYgY2Uuc291cmNlLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGVlLnVuc2hpZnQoY2UpO1xuICAgIH1cbiAgICBpZiAoZWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbmQgPSByZXNvbHZlRW5kKGVlLCBjZVBvcywgY3R4Lm9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGVuZC5jb21tZW50KSB7XG4gICAgICAgICAgICBpZiAoY29sbC5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIGVuZC5jb21tZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IGVuZC5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgZW5kLm9mZnNldF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xsLnJhbmdlID0gW2ZjLm9mZnNldCwgY2VQb3MsIGNlUG9zXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGw7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVGbG93Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlLCBpc01hcCB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVCbG9ja01hcCB9IGZyb20gJy4vcmVzb2x2ZS1ibG9jay1tYXAuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2VxIH0gZnJvbSAnLi9yZXNvbHZlLWJsb2NrLXNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd0NvbGxlY3Rpb24gfSBmcm9tICcuL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzJztcblxuZnVuY3Rpb24gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLW1hcCc6IHtcbiAgICAgICAgICAgIGNvbGwgPSByZXNvbHZlQmxvY2tNYXAoQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29sbCA9IHJlc29sdmVCbG9ja1NlcShDTiwgY3R4LCB0b2tlbiwgb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBjb2xsID0gcmVzb2x2ZUZsb3dDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdGFnVG9rZW4pXG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIGNvbnN0IHRhZ05hbWUgPSBjdHguZGlyZWN0aXZlcy50YWdOYW1lKHRhZ1Rva2VuLnNvdXJjZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpKTtcbiAgICBpZiAoIXRhZ05hbWUpXG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIC8vIENhc3QgbmVlZGVkIGR1ZSB0bzogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zODQxXG4gICAgY29uc3QgQ29sbCA9IGNvbGwuY29uc3RydWN0b3I7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJyB8fCB0YWdOYW1lID09PSBDb2xsLnRhZ05hbWUpIHtcbiAgICAgICAgY29sbC50YWcgPSBDb2xsLnRhZ05hbWU7XG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIH1cbiAgICBjb25zdCBleHBUeXBlID0gaXNNYXAoY29sbCkgPyAnbWFwJyA6ICdzZXEnO1xuICAgIGxldCB0YWcgPSBjdHguc2NoZW1hLnRhZ3MuZmluZCh0ID0+IHQuY29sbGVjdGlvbiA9PT0gZXhwVHlwZSAmJiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgICAgY29uc3Qga3QgPSBjdHguc2NoZW1hLmtub3duVGFnc1t0YWdOYW1lXTtcbiAgICAgICAgaWYgKGt0ICYmIGt0LmNvbGxlY3Rpb24gPT09IGV4cFR5cGUpIHtcbiAgICAgICAgICAgIGN0eC5zY2hlbWEudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGt0LCB7IGRlZmF1bHQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgIHRhZyA9IGt0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIGBVbnJlc29sdmVkIHRhZzogJHt0YWdOYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgY29sbC50YWcgPSB0YWdOYW1lO1xuICAgICAgICAgICAgcmV0dXJuIGNvbGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gdGFnLnJlc29sdmUoY29sbCwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgY29uc3Qgbm9kZSA9IGlzTm9kZShyZXMpXG4gICAgICAgID8gcmVzXG4gICAgICAgIDogbmV3IFNjYWxhcihyZXMpO1xuICAgIG5vZGUucmFuZ2UgPSBjb2xsLnJhbmdlO1xuICAgIG5vZGUudGFnID0gdGFnTmFtZTtcbiAgICBpZiAodGFnID09PSBudWxsIHx8IHRhZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFnLmZvcm1hdClcbiAgICAgICAgbm9kZS5mb3JtYXQgPSB0YWcuZm9ybWF0O1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjb21wb3NlQ29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2NhbGFyKHNjYWxhciwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzY2FsYXIub2Zmc2V0O1xuICAgIGNvbnN0IGhlYWRlciA9IHBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoc2NhbGFyLCBzdHJpY3QsIG9uRXJyb3IpO1xuICAgIGlmICghaGVhZGVyKVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogJycsIHR5cGU6IG51bGwsIGNvbW1lbnQ6ICcnLCByYW5nZTogW3N0YXJ0LCBzdGFydCwgc3RhcnRdIH07XG4gICAgY29uc3QgdHlwZSA9IGhlYWRlci5tb2RlID09PSAnPicgPyBTY2FsYXIuQkxPQ0tfRk9MREVEIDogU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgY29uc3QgbGluZXMgPSBzY2FsYXIuc291cmNlID8gc3BsaXRMaW5lcyhzY2FsYXIuc291cmNlKSA6IFtdO1xuICAgIC8vIGRldGVybWluZSB0aGUgZW5kIG9mIGNvbnRlbnQgJiBzdGFydCBvZiBjaG9tcGluZ1xuICAgIGxldCBjaG9tcFN0YXJ0ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbGluZXNbaV1bMV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJylcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gc2hvcnRjdXQgZm9yIGVtcHR5IGNvbnRlbnRzXG4gICAgaWYgKCFzY2FsYXIuc291cmNlIHx8IGNob21wU3RhcnQgPT09IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuY2hvbXAgPT09ICcrJyA/ICdcXG4nLnJlcGVhdChNYXRoLm1heCgwLCBsaW5lcy5sZW5ndGggLSAxKSkgOiAnJztcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKHNjYWxhci5zb3VyY2UpXG4gICAgICAgICAgICBlbmQgKz0gc2NhbGFyLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCB0eXBlLCBjb21tZW50OiBoZWFkZXIuY29tbWVudCwgcmFuZ2U6IFtzdGFydCwgZW5kLCBlbmRdIH07XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIGluZGVudGF0aW9uIGxldmVsIHRvIHRyaW0gZnJvbSBzdGFydFxuICAgIGxldCB0cmltSW5kZW50ID0gc2NhbGFyLmluZGVudCArIGhlYWRlci5pbmRlbnQ7XG4gICAgbGV0IG9mZnNldCA9IHNjYWxhci5vZmZzZXQgKyBoZWFkZXIubGVuZ3RoO1xuICAgIGxldCBjb250ZW50U3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGNvbnN0IFtpbmRlbnQsIGNvbnRlbnRdID0gbGluZXNbaV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJykge1xuICAgICAgICAgICAgaWYgKGhlYWRlci5pbmRlbnQgPT09IDAgJiYgaW5kZW50Lmxlbmd0aCA+IHRyaW1JbmRlbnQpXG4gICAgICAgICAgICAgICAgdHJpbUluZGVudCA9IGluZGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Jsb2NrIHNjYWxhcnMgd2l0aCBtb3JlLWluZGVudGVkIGxlYWRpbmcgZW1wdHkgbGluZXMgbXVzdCB1c2UgYW4gZXhwbGljaXQgaW5kZW50YXRpb24gaW5kaWNhdG9yJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCArIGluZGVudC5sZW5ndGgsICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwKVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgY29udGVudFN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSAnJztcbiAgICBsZXQgc2VwID0gJyc7XG4gICAgbGV0IHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UgaXMga2VwdCBpbnRhY3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRTdGFydDsgKytpKVxuICAgICAgICB2YWx1ZSArPSBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KSArICdcXG4nO1xuICAgIGZvciAobGV0IGkgPSBjb250ZW50U3RhcnQ7IGkgPCBjaG9tcFN0YXJ0OyArK2kpIHtcbiAgICAgICAgbGV0IFtpbmRlbnQsIGNvbnRlbnRdID0gbGluZXNbaV07XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgICAgICBjb25zdCBjcmxmID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdID09PSAnXFxyJztcbiAgICAgICAgaWYgKGNybGYpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCAtMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiBhbHJlYWR5IGNhdWdodCBpbiBsZXhlciAqL1xuICAgICAgICBpZiAoY29udGVudCAmJiBpbmRlbnQubGVuZ3RoIDwgdHJpbUluZGVudCkge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gaGVhZGVyLmluZGVudFxuICAgICAgICAgICAgICAgID8gJ2V4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcidcbiAgICAgICAgICAgICAgICA6ICdmaXJzdCBsaW5lJztcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQmxvY2sgc2NhbGFyIGxpbmVzIG11c3Qgbm90IGJlIGxlc3MgaW5kZW50ZWQgdGhhbiB0aGVpciAke3NyY31gO1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQgLSBjb250ZW50Lmxlbmd0aCAtIChjcmxmID8gMiA6IDEpLCAnQkFEX0lOREVOVCcsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgaW5kZW50ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBpbmRlbnQuc2xpY2UodHJpbUluZGVudCkgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZW50Lmxlbmd0aCA+IHRyaW1JbmRlbnQgfHwgY29udGVudFswXSA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIG1vcmUtaW5kZW50ZWQgY29udGVudCB3aXRoaW4gYSBmb2xkZWQgYmxvY2tcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICcgJylcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgICAgIGVsc2UgaWYgKCFwcmV2TW9yZUluZGVudGVkICYmIHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcblxcbic7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBpbmRlbnQuc2xpY2UodHJpbUluZGVudCkgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBwcmV2TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250ZW50ID09PSAnJykge1xuICAgICAgICAgICAgLy8gZW1wdHkgbGluZVxuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJyAnO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoaGVhZGVyLmNob21wKSB7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNob21wU3RhcnQ7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnXFxuJyArIGxpbmVzW2ldWzBdLnNsaWNlKHRyaW1JbmRlbnQpO1xuICAgICAgICAgICAgaWYgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICE9PSAnXFxuJylcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnXFxuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgfVxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgaGVhZGVyLmxlbmd0aCArIHNjYWxhci5zb3VyY2UubGVuZ3RoO1xuICAgIHJldHVybiB7IHZhbHVlLCB0eXBlLCBjb21tZW50OiBoZWFkZXIuY29tbWVudCwgcmFuZ2U6IFtzdGFydCwgZW5kLCBlbmRdIH07XG59XG5mdW5jdGlvbiBwYXJzZUJsb2NrU2NhbGFySGVhZGVyKHsgb2Zmc2V0LCBwcm9wcyB9LCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICBpZiAocHJvcHNbMF0udHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKSB7XG4gICAgICAgIG9uRXJyb3IocHJvcHNbMF0sICdJTVBPU1NJQkxFJywgJ0Jsb2NrIHNjYWxhciBoZWFkZXIgbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHNvdXJjZSB9ID0gcHJvcHNbMF07XG4gICAgY29uc3QgbW9kZSA9IHNvdXJjZVswXTtcbiAgICBsZXQgaW5kZW50ID0gMDtcbiAgICBsZXQgY2hvbXAgPSAnJztcbiAgICBsZXQgZXJyb3IgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjaCA9IHNvdXJjZVtpXTtcbiAgICAgICAgaWYgKCFjaG9tcCAmJiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSlcbiAgICAgICAgICAgIGNob21wID0gY2g7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbiA9IE51bWJlcihjaCk7XG4gICAgICAgICAgICBpZiAoIWluZGVudCAmJiBuKVxuICAgICAgICAgICAgICAgIGluZGVudCA9IG47XG4gICAgICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gLTEpXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBvZmZzZXQgKyBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvciAhPT0gLTEpXG4gICAgICAgIG9uRXJyb3IoZXJyb3IsICdVTkVYUEVDVEVEX1RPS0VOJywgYEJsb2NrIHNjYWxhciBoZWFkZXIgaW5jbHVkZXMgZXh0cmEgY2hhcmFjdGVyczogJHtzb3VyY2V9YCk7XG4gICAgbGV0IGhhc1NwYWNlID0gZmFsc2U7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBsZXQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvcHNbaV07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBsZW5ndGggKz0gdG9rZW4uc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIWhhc1NwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyc7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHRva2VuLnNvdXJjZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1VORVhQRUNURURfVE9LRU4nLCB0b2tlbi5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsZW5ndGggKz0gdG9rZW4uc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBVbmV4cGVjdGVkIHRva2VuIGluIGJsb2NrIHNjYWxhciBoZWFkZXI6ICR7dG9rZW4udHlwZX1gO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHMgPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKHRzICYmIHR5cGVvZiB0cyA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0cy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZSwgaW5kZW50LCBjaG9tcCwgY29tbWVudCwgbGVuZ3RoIH07XG59XG4vKiogQHJldHVybnMgQXJyYXkgb2YgbGluZXMgc3BsaXQgdXAgYXMgYFtpbmRlbnQsIGNvbnRlbnRdYCAqL1xuZnVuY3Rpb24gc3BsaXRMaW5lcyhzb3VyY2UpIHtcbiAgICBjb25zdCBzcGxpdCA9IHNvdXJjZS5zcGxpdCgvXFxuKCAqKS8pO1xuICAgIGNvbnN0IGZpcnN0ID0gc3BsaXRbMF07XG4gICAgY29uc3QgbSA9IGZpcnN0Lm1hdGNoKC9eKCAqKS8pO1xuICAgIGNvbnN0IGxpbmUwID0gbSAmJiBtWzFdID8gW21bMV0sIGZpcnN0LnNsaWNlKG1bMV0ubGVuZ3RoKV0gOiBbJycsIGZpcnN0XTtcbiAgICBjb25zdCBsaW5lcyA9IFtsaW5lMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgbGluZXMucHVzaChbc3BsaXRbaV0sIHNwbGl0W2kgKyAxXV0pO1xuICAgIHJldHVybiBsaW5lcztcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlRmxvd1NjYWxhcihzY2FsYXIsIHN0cmljdCwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgb2Zmc2V0LCB0eXBlLCBzb3VyY2UsIGVuZCB9ID0gc2NhbGFyO1xuICAgIGxldCBfdHlwZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgY29uc3QgX29uRXJyb3IgPSAocmVsLCBjb2RlLCBtc2cpID0+IG9uRXJyb3Iob2Zmc2V0ICsgcmVsLCBjb2RlLCBtc2cpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUExBSU47XG4gICAgICAgICAgICB2YWx1ZSA9IHBsYWluVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUVVPVEVfU0lOR0xFO1xuICAgICAgICAgICAgdmFsdWUgPSBzaW5nbGVRdW90ZWRWYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBfdHlwZSA9IFNjYWxhci5RVU9URV9ET1VCTEU7XG4gICAgICAgICAgICB2YWx1ZSA9IGRvdWJsZVF1b3RlZFZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBvbkVycm9yKHNjYWxhciwgJ1VORVhQRUNURURfVE9LRU4nLCBgRXhwZWN0ZWQgYSBmbG93IHNjYWxhciB2YWx1ZSwgYnV0IGZvdW5kOiAke3R5cGV9YCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQ6ICcnLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBbb2Zmc2V0LCBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoLCBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoXVxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBzdHJpY3QsIG9uRXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiBfdHlwZSxcbiAgICAgICAgY29tbWVudDogcmUuY29tbWVudCxcbiAgICAgICAgcmFuZ2U6IFtvZmZzZXQsIHZhbHVlRW5kLCByZS5vZmZzZXRdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBsYWluVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGJhZENoYXIgPSAnJztcbiAgICBzd2l0Y2ggKHNvdXJjZVswXSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdhIHRhYiBjaGFyYWN0ZXInO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdmbG93IGluZGljYXRvciBjaGFyYWN0ZXIgLCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICBiYWRDaGFyID0gJ2RpcmVjdGl2ZSBpbmRpY2F0b3IgY2hhcmFjdGVyICUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+Jzoge1xuICAgICAgICAgICAgYmFkQ2hhciA9IGBibG9jayBzY2FsYXIgaW5kaWNhdG9yICR7c291cmNlWzBdfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAJzpcbiAgICAgICAgY2FzZSAnYCc6IHtcbiAgICAgICAgICAgIGJhZENoYXIgPSBgcmVzZXJ2ZWQgY2hhcmFjdGVyICR7c291cmNlWzBdfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFkQ2hhcilcbiAgICAgICAgb25FcnJvcigwLCAnQkFEX1NDQUxBUl9TVEFSVCcsIGBQbGFpbiB2YWx1ZSBjYW5ub3Qgc3RhcnQgd2l0aCAke2JhZENoYXJ9YCk7XG4gICAgcmV0dXJuIGZvbGRMaW5lcyhzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09IFwiJ1wiIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKTtcbiAgICByZXR1cm4gZm9sZExpbmVzKHNvdXJjZS5zbGljZSgxLCAtMSkpLnJlcGxhY2UoLycnL2csIFwiJ1wiKTtcbn1cbmZ1bmN0aW9uIGZvbGRMaW5lcyhzb3VyY2UpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmVnYXRpdmUgbG9va2JlaGluZCBoZXJlIGFuZCBpbiB0aGUgYHJlYCBSZWdFeHAgaXMgdG9cbiAgICAgKiBwcmV2ZW50IGNhdXNpbmcgYSBwb2x5bm9taWFsIHNlYXJjaCB0aW1lIGluIGNlcnRhaW4gY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdHJ5LWNhdGNoIGlzIGZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldDpcbiAgICAgKiBodHRwczovL2Nhbml1c2UuY29tL2pzLXJlZ2V4cC1sb29rYmVoaW5kXG4gICAgICovXG4gICAgbGV0IGZpcnN0LCBsaW5lO1xuICAgIHRyeSB7XG4gICAgICAgIGZpcnN0ID0gbmV3IFJlZ0V4cCgnKC4qPykoPzwhWyBcXHRdKVsgXFx0XSpcXHI/XFxuJywgJ3N5Jyk7XG4gICAgICAgIGxpbmUgPSBuZXcgUmVnRXhwKCdbIFxcdF0qKC4qPykoPzooPzwhWyBcXHRdKVsgXFx0XSopP1xccj9cXG4nLCAnc3knKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgZmlyc3QgPSAvKC4qPylbIFxcdF0qXFxyP1xcbi9zeTtcbiAgICAgICAgbGluZSA9IC9bIFxcdF0qKC4qPylbIFxcdF0qXFxyP1xcbi9zeTtcbiAgICB9XG4gICAgbGV0IG1hdGNoID0gZmlyc3QuZXhlYyhzb3VyY2UpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgbGV0IHJlcyA9IG1hdGNoWzFdO1xuICAgIGxldCBzZXAgPSAnICc7XG4gICAgbGV0IHBvcyA9IGZpcnN0Lmxhc3RJbmRleDtcbiAgICBsaW5lLmxhc3RJbmRleCA9IHBvcztcbiAgICB3aGlsZSAoKG1hdGNoID0gbGluZS5leGVjKHNvdXJjZSkpKSB7XG4gICAgICAgIGlmIChtYXRjaFsxXSA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzZXA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXMgKz0gc2VwICsgbWF0Y2hbMV07XG4gICAgICAgICAgICBzZXAgPSAnICc7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gbGluZS5sYXN0SW5kZXg7XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSAvWyBcXHRdKiguKikvc3k7XG4gICAgbGFzdC5sYXN0SW5kZXggPSBwb3M7XG4gICAgbWF0Y2ggPSBsYXN0LmV4ZWMoc291cmNlKTtcbiAgICByZXR1cm4gcmVzICsgc2VwICsgKChtYXRjaCAmJiBtYXRjaFsxXSkgfHwgJycpO1xufVxuZnVuY3Rpb24gZG91YmxlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc291cmNlLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBjb25zdCBjaCA9IHNvdXJjZVtpXTtcbiAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDFdID09PSAnXFxuJylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb25zdCB7IGZvbGQsIG9mZnNldCB9ID0gZm9sZE5ld2xpbmUoc291cmNlLCBpKTtcbiAgICAgICAgICAgIHJlcyArPSBmb2xkO1xuICAgICAgICAgICAgaSA9IG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVsrK2ldO1xuICAgICAgICAgICAgY29uc3QgY2MgPSBlc2NhcGVDb2Rlc1tuZXh0XTtcbiAgICAgICAgICAgIGlmIChjYylcbiAgICAgICAgICAgICAgICByZXMgKz0gY2M7XG4gICAgICAgICAgICBlbHNlIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgZXNjYXBlZCBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgPT09ICcgJyB8fCBuZXh0ID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIENSTEYgbmV3bGluZXMsIGJ1dCBzdGlsbCB0cmltIHRoZSBmb2xsb3dpbmcgbGluZVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgPT09ICcgJyB8fCBuZXh0ID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICd4JyB8fCBuZXh0ID09PSAndScgfHwgbmV4dCA9PT0gJ1UnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0geyB4OiAyLCB1OiA0LCBVOiA4IH1bbmV4dF07XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhcnNlQ2hhckNvZGUoc291cmNlLCBpICsgMSwgbGVuZ3RoLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoaSAtIDEsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICAgICAgICAgIHJlcyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgY29uc3Qgd3NTdGFydCA9IGk7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicgJiYgIShuZXh0ID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDJdID09PSAnXFxuJykpXG4gICAgICAgICAgICAgICAgcmVzICs9IGkgPiB3c1N0YXJ0ID8gc291cmNlLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnXCInIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEZvbGQgYSBzaW5nbGUgbmV3bGluZSBpbnRvIGEgc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzLlxuICogUHJlc3VtZXMgYHNvdXJjZVtvZmZzZXRdID09PSAnXFxuJ2BcbiAqL1xuZnVuY3Rpb24gZm9sZE5ld2xpbmUoc291cmNlLCBvZmZzZXQpIHtcbiAgICBsZXQgZm9sZCA9ICcnO1xuICAgIGxldCBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFxyJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtvZmZzZXQgKyAyXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIGZvbGQgKz0gJ1xcbic7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB9XG4gICAgaWYgKCFmb2xkKVxuICAgICAgICBmb2xkID0gJyAnO1xuICAgIHJldHVybiB7IGZvbGQsIG9mZnNldCB9O1xufVxuY29uc3QgZXNjYXBlQ29kZXMgPSB7XG4gICAgJzAnOiAnXFwwJyxcbiAgICBhOiAnXFx4MDcnLFxuICAgIGI6ICdcXGInLFxuICAgIGU6ICdcXHgxYicsXG4gICAgZjogJ1xcZicsXG4gICAgbjogJ1xcbicsXG4gICAgcjogJ1xccicsXG4gICAgdDogJ1xcdCcsXG4gICAgdjogJ1xcdicsXG4gICAgTjogJ1xcdTAwODUnLFxuICAgIF86ICdcXHUwMGEwJyxcbiAgICBMOiAnXFx1MjAyOCcsXG4gICAgUDogJ1xcdTIwMjknLFxuICAgICcgJzogJyAnLFxuICAgICdcIic6ICdcIicsXG4gICAgJy8nOiAnLycsXG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgJ1xcdCc6ICdcXHQnXG59O1xuZnVuY3Rpb24gcGFyc2VDaGFyQ29kZShzb3VyY2UsIG9mZnNldCwgbGVuZ3RoLCBvbkVycm9yKSB7XG4gICAgY29uc3QgY2MgPSBzb3VyY2Uuc3Vic3RyKG9mZnNldCwgbGVuZ3RoKTtcbiAgICBjb25zdCBvayA9IGNjLmxlbmd0aCA9PT0gbGVuZ3RoICYmIC9eWzAtOWEtZkEtRl0rJC8udGVzdChjYyk7XG4gICAgY29uc3QgY29kZSA9IG9rID8gcGFyc2VJbnQoY2MsIDE2KSA6IE5hTjtcbiAgICBpZiAoaXNOYU4oY29kZSkpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gc291cmNlLnN1YnN0cihvZmZzZXQgLSAyLCBsZW5ndGggKyAyKTtcbiAgICAgICAgb25FcnJvcihvZmZzZXQgLSAyLCAnQkFEX0RRX0VTQ0FQRScsIGBJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSAke3Jhd31gKTtcbiAgICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xufVxuXG5leHBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgU0NBTEFSLCBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVCbG9ja1NjYWxhciB9IGZyb20gJy4vcmVzb2x2ZS1ibG9jay1zY2FsYXIuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUZsb3dTY2FsYXIgfSBmcm9tICcuL3Jlc29sdmUtZmxvdy1zY2FsYXIuanMnO1xuXG5mdW5jdGlvbiBjb21wb3NlU2NhbGFyKGN0eCwgdG9rZW4sIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgdHlwZSwgY29tbWVudCwgcmFuZ2UgfSA9IHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgID8gcmVzb2x2ZUJsb2NrU2NhbGFyKHRva2VuLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpXG4gICAgICAgIDogcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIGN0eC5vcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgY29uc3QgdGFnTmFtZSA9IHRhZ1Rva2VuXG4gICAgICAgID8gY3R4LmRpcmVjdGl2ZXMudGFnTmFtZSh0YWdUb2tlbi5zb3VyY2UsIG1zZyA9PiBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgbXNnKSlcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHRhZyA9IHRhZ1Rva2VuICYmIHRhZ05hbWVcbiAgICAgICAgPyBmaW5kU2NhbGFyVGFnQnlOYW1lKGN0eC5zY2hlbWEsIHZhbHVlLCB0YWdOYW1lLCB0YWdUb2tlbiwgb25FcnJvcilcbiAgICAgICAgOiB0b2tlbi50eXBlID09PSAnc2NhbGFyJ1xuICAgICAgICAgICAgPyBmaW5kU2NhbGFyVGFnQnlUZXN0KGN0eCwgdmFsdWUsIHRva2VuLCBvbkVycm9yKVxuICAgICAgICAgICAgOiBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgbGV0IHNjYWxhcjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSB0YWcucmVzb2x2ZSh2YWx1ZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4gfHwgdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgICAgIHNjYWxhciA9IGlzU2NhbGFyKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gfHwgdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0YWdOYW1lID09PSAnIScpXG4gICAgICAgIHJldHVybiBzY2hlbWFbU0NBTEFSXTsgLy8gbm9uLXNwZWNpZmljIHRhZ1xuICAgIGNvbnN0IG1hdGNoV2l0aFRlc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBzY2hlbWEudGFncykge1xuICAgICAgICBpZiAoIXRhZy5jb2xsZWN0aW9uICYmIHRhZy50YWcgPT09IHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGlmICh0YWcuZGVmYXVsdCAmJiB0YWcudGVzdClcbiAgICAgICAgICAgICAgICBtYXRjaFdpdGhUZXN0LnB1c2godGFnKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFnIG9mIG1hdGNoV2l0aFRlc3QpXG4gICAgICAgIGlmICgoX2EgPSB0YWcudGVzdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICBjb25zdCBrdCA9IHNjaGVtYS5rbm93blRhZ3NbdGFnTmFtZV07XG4gICAgaWYgKGt0ICYmICFrdC5jb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBrbm93biB0YWcgaXMgYXZhaWxhYmxlIGZvciBzdHJpbmdpZnlpbmcsXG4gICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBnZXQgdXNlZCBieSBkZWZhdWx0LlxuICAgICAgICBzY2hlbWEudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGt0LCB7IGRlZmF1bHQ6IGZhbHNlLCB0ZXN0OiB1bmRlZmluZWQgfSkpO1xuICAgICAgICByZXR1cm4ga3Q7XG4gICAgfVxuICAgIG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBgVW5yZXNvbHZlZCB0YWc6ICR7dGFnTmFtZX1gLCB0YWdOYW1lICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyk7XG4gICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVJdO1xufVxuZnVuY3Rpb24gZmluZFNjYWxhclRhZ0J5VGVzdCh7IGRpcmVjdGl2ZXMsIHNjaGVtYSB9LCB2YWx1ZSwgdG9rZW4sIG9uRXJyb3IpIHtcbiAgICBjb25zdCB0YWcgPSBzY2hlbWEudGFncy5maW5kKHRhZyA9PiB7IHZhciBfYTsgcmV0dXJuIHRhZy5kZWZhdWx0ICYmICgoX2EgPSB0YWcudGVzdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRlc3QodmFsdWUpKTsgfSkgfHwgc2NoZW1hW1NDQUxBUl07XG4gICAgaWYgKHNjaGVtYS5jb21wYXQpIHtcbiAgICAgICAgY29uc3QgY29tcGF0ID0gc2NoZW1hLmNvbXBhdC5maW5kKHRhZyA9PiB7IHZhciBfYTsgcmV0dXJuIHRhZy5kZWZhdWx0ICYmICgoX2EgPSB0YWcudGVzdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRlc3QodmFsdWUpKTsgfSkgfHxcbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVJdO1xuICAgICAgICBpZiAodGFnLnRhZyAhPT0gY29tcGF0LnRhZykge1xuICAgICAgICAgICAgY29uc3QgdHMgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZGlyZWN0aXZlcy50YWdTdHJpbmcoY29tcGF0LnRhZyk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVmFsdWUgbWF5IGJlIHBhcnNlZCBhcyBlaXRoZXIgJHt0c30gb3IgJHtjc31gO1xuICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cblxuZXhwb3J0IHsgY29tcG9zZVNjYWxhciB9O1xuIiwiZnVuY3Rpb24gZW1wdHlTY2FsYXJQb3NpdGlvbihvZmZzZXQsIGJlZm9yZSwgcG9zKSB7XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBpZiAocG9zID09PSBudWxsKVxuICAgICAgICAgICAgcG9zID0gYmVmb3JlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcyAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBsZXQgc3QgPSBiZWZvcmVbaV07XG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBhbiBlbXB0eSBzY2FsYXIgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3Qgbm9uLWVtcHR5XG4gICAgICAgICAgICAvLyBub2RlLCBidXQgaXQncyBtb3JlIHVzZWZ1bCB0byBwbGFjZSBpdCBhZnRlciBhbnkgd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB3aGlsZSAoKHN0ID09PSBudWxsIHx8IHN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdC50eXBlKSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGNvbXBvc2VDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb21wb3NlLWNvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgY29tcG9zZVNjYWxhciB9IGZyb20gJy4vY29tcG9zZS1zY2FsYXIuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuaW1wb3J0IHsgZW1wdHlTY2FsYXJQb3NpdGlvbiB9IGZyb20gJy4vdXRpbC1lbXB0eS1zY2FsYXItcG9zaXRpb24uanMnO1xuXG5jb25zdCBDTiA9IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfTtcbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKSB7XG4gICAgY29uc3QgeyBzcGFjZUJlZm9yZSwgY29tbWVudCwgYW5jaG9yLCB0YWcgfSA9IHByb3BzO1xuICAgIGxldCBub2RlO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBub2RlID0gY29tcG9zZUFsaWFzKGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ0FMSUFTX1BST1BTJywgJ0FuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOlxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvcilcbiAgICAgICAgICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0b2tlbik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVuIHRva2VuIHR5cGU6ICR7dG9rZW4udHlwZX1gKTtcbiAgICB9XG4gICAgaWYgKGFuY2hvciAmJiBub2RlLmFuY2hvciA9PT0gJycpXG4gICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgJiYgdG9rZW4uc291cmNlID09PSAnJylcbiAgICAgICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnQ7XG4gICAgfVxuICAgIGlmIChjdHgub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zKVxuICAgICAgICBub2RlLnNyY1Rva2VuID0gdG9rZW47XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBiZWZvcmUsIHBvcywgeyBzcGFjZUJlZm9yZSwgY29tbWVudCwgYW5jaG9yLCB0YWcgfSwgb25FcnJvcikge1xuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICB0eXBlOiAnc2NhbGFyJyxcbiAgICAgICAgb2Zmc2V0OiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpLFxuICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICBzb3VyY2U6ICcnXG4gICAgfTtcbiAgICBjb25zdCBub2RlID0gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpXG4gICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlQWxpYXMoeyBvcHRpb25zIH0sIHsgb2Zmc2V0LCBzb3VyY2UsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgYWxpYXMgPSBuZXcgQWxpYXMoc291cmNlLnN1YnN0cmluZygxKSk7XG4gICAgaWYgKGFsaWFzLnNvdXJjZSA9PT0gJycpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0FMSUFTJywgJ0FsaWFzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBjb25zdCB2YWx1ZUVuZCA9IG9mZnNldCArIHNvdXJjZS5sZW5ndGg7XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgdmFsdWVFbmQsIG9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICBhbGlhcy5yYW5nZSA9IFtvZmZzZXQsIHZhbHVlRW5kLCByZS5vZmZzZXRdO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBhbGlhcy5jb21tZW50ID0gcmUuY29tbWVudDtcbiAgICByZXR1cm4gYWxpYXM7XG59XG5cbmV4cG9ydCB7IGNvbXBvc2VFbXB0eU5vZGUsIGNvbXBvc2VOb2RlIH07XG4iLCJpbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4uL2RvYy9Eb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9IGZyb20gJy4vY29tcG9zZS1ub2RlLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gJy4vcmVzb2x2ZS1wcm9wcy5qcyc7XG5cbmZ1bmN0aW9uIGNvbXBvc2VEb2Mob3B0aW9ucywgZGlyZWN0aXZlcywgeyBvZmZzZXQsIHN0YXJ0LCB2YWx1ZSwgZW5kIH0sIG9uRXJyb3IpIHtcbiAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7IGRpcmVjdGl2ZXMgfSwgb3B0aW9ucyk7XG4gICAgY29uc3QgZG9jID0gbmV3IERvY3VtZW50KHVuZGVmaW5lZCwgb3B0cyk7XG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgICBhdFJvb3Q6IHRydWUsXG4gICAgICAgIGRpcmVjdGl2ZXM6IGRvYy5kaXJlY3RpdmVzLFxuICAgICAgICBvcHRpb25zOiBkb2Mub3B0aW9ucyxcbiAgICAgICAgc2NoZW1hOiBkb2Muc2NoZW1hXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICBpbmRpY2F0b3I6ICdkb2Mtc3RhcnQnLFxuICAgICAgICBuZXh0OiB2YWx1ZSB8fCAoZW5kID09PSBudWxsIHx8IGVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW5kWzBdKSxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvbkVycm9yLFxuICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5mb3VuZCkge1xuICAgICAgICBkb2MuZGlyZWN0aXZlcy5tYXJrZXIgPSB0cnVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgICh2YWx1ZS50eXBlID09PSAnYmxvY2stbWFwJyB8fCB2YWx1ZS50eXBlID09PSAnYmxvY2stc2VxJykgJiZcbiAgICAgICAgICAgICFwcm9wcy5oYXNOZXdsaW5lKVxuICAgICAgICAgICAgb25FcnJvcihwcm9wcy5lbmQsICdNSVNTSU5HX0NIQVInLCAnQmxvY2sgY29sbGVjdGlvbiBjYW5ub3Qgc3RhcnQgb24gc2FtZSBsaW5lIHdpdGggZGlyZWN0aXZlcy1lbmQgbWFya2VyJyk7XG4gICAgfVxuICAgIGRvYy5jb250ZW50cyA9IHZhbHVlXG4gICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgIDogY29tcG9zZUVtcHR5Tm9kZShjdHgsIHByb3BzLmVuZCwgc3RhcnQsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICBjb25zdCBjb250ZW50RW5kID0gZG9jLmNvbnRlbnRzLnJhbmdlWzJdO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIGNvbnRlbnRFbmQsIGZhbHNlLCBvbkVycm9yKTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgZG9jLmNvbW1lbnQgPSByZS5jb21tZW50O1xuICAgIGRvYy5yYW5nZSA9IFtvZmZzZXQsIGNvbnRlbnRFbmQsIHJlLm9mZnNldF07XG4gICAgcmV0dXJuIGRvYztcbn1cblxuZXhwb3J0IHsgY29tcG9zZURvYyB9O1xuIiwiaW1wb3J0IHsgRGlyZWN0aXZlcyB9IGZyb20gJy4uL2RvYy9kaXJlY3RpdmVzLmpzJztcbmltcG9ydCB7IERvY3VtZW50IH0gZnJvbSAnLi4vZG9jL0RvY3VtZW50LmpzJztcbmltcG9ydCB7IFlBTUxXYXJuaW5nLCBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBpc0NvbGxlY3Rpb24sIGlzUGFpciB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgZGVmYXVsdE9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGNvbXBvc2VEb2MgfSBmcm9tICcuL2NvbXBvc2UtZG9jLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcblxuZnVuY3Rpb24gZ2V0RXJyb3JQb3Moc3JjKSB7XG4gICAgaWYgKHR5cGVvZiBzcmMgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gW3NyYywgc3JjICsgMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgcmV0dXJuIHNyYy5sZW5ndGggPT09IDIgPyBzcmMgOiBbc3JjWzBdLCBzcmNbMV1dO1xuICAgIGNvbnN0IHsgb2Zmc2V0LCBzb3VyY2UgfSA9IHNyYztcbiAgICByZXR1cm4gW29mZnNldCwgb2Zmc2V0ICsgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnID8gc291cmNlLmxlbmd0aCA6IDEpXTtcbn1cbmZ1bmN0aW9uIHBhcnNlUHJlbHVkZShwcmVsdWRlKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGF0Q29tbWVudCA9IGZhbHNlO1xuICAgIGxldCBhZnRlckVtcHR5TGluZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlbHVkZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBwcmVsdWRlW2ldO1xuICAgICAgICBzd2l0Y2ggKHNvdXJjZVswXSkge1xuICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgY29tbWVudCArPVxuICAgICAgICAgICAgICAgICAgICAoY29tbWVudCA9PT0gJycgPyAnJyA6IGFmdGVyRW1wdHlMaW5lID8gJ1xcblxcbicgOiAnXFxuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnKTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGFmdGVyRW1wdHlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IHByZWx1ZGVbaSArIDFdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMF0pICE9PSAnIycpXG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgd3JvbmcgYWZ0ZXIgZG9jLWVuZCwgYnV0IGluIHRoYXQgY2FzZSBpdCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgICAgICAgIGlmICghYXRDb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29tbWVudCwgYWZ0ZXJFbXB0eUxpbmUgfTtcbn1cbi8qKlxuICogQ29tcG9zZSBhIHN0cmVhbSBvZiBDU1Qgbm9kZXMgaW50byBhIHN0cmVhbSBvZiBZQU1MIERvY3VtZW50cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQ29tcG9zZXIsIFBhcnNlciB9IGZyb20gJ3lhbWwnXG4gKlxuICogY29uc3Qgc3JjOiBzdHJpbmcgPSAuLi5cbiAqIGNvbnN0IHRva2VucyA9IG5ldyBQYXJzZXIoKS5wYXJzZShzcmMpXG4gKiBjb25zdCBkb2NzID0gbmV3IENvbXBvc2VyKCkuY29tcG9zZSh0b2tlbnMpXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29tcG9zZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRvYyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXREaXJlY3RpdmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJlbHVkZSA9IFtdO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIHRoaXMub25FcnJvciA9IChzb3VyY2UsIGNvZGUsIG1lc3NhZ2UsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGdldEVycm9yUG9zKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAod2FybmluZylcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2gobmV3IFlBTUxXYXJuaW5nKHBvcywgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKHBvcywgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7XG4gICAgICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gfHwgZGVmYXVsdE9wdGlvbnMudmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZGVjb3JhdGUoZG9jLCBhZnRlckRvYykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIGFmdGVyRW1wdHlMaW5lIH0gPSBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh7IGRjOiBkb2MuY29tbWVudCwgcHJlbHVkZSwgY29tbWVudCB9KVxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBkb2MuY29udGVudHM7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MuY29tbWVudCA9IGRvYy5jb21tZW50ID8gYCR7ZG9jLmNvbW1lbnR9XFxuJHtjb21tZW50fWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXJFbXB0eUxpbmUgfHwgZG9jLmRpcmVjdGl2ZXMubWFya2VyIHx8ICFkYykge1xuICAgICAgICAgICAgICAgIGRvYy5jb21tZW50QmVmb3JlID0gY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQ29sbGVjdGlvbihkYykgJiYgIWRjLmZsb3cgJiYgZGMuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpdCA9IGRjLml0ZW1zWzBdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BhaXIoaXQpKVxuICAgICAgICAgICAgICAgICAgICBpdCA9IGl0LmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGl0LmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgaXQuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBkYy5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGRjLmNvbW1lbnRCZWZvcmUgPSBjYiA/IGAke2NvbW1lbnR9XFxuJHtjYn1gIDogY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRvYy5lcnJvcnMsIHRoaXMuZXJyb3JzKTtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRvYy53YXJuaW5ncywgdGhpcy53YXJuaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb2MuZXJyb3JzID0gdGhpcy5lcnJvcnM7XG4gICAgICAgICAgICBkb2Mud2FybmluZ3MgPSB0aGlzLndhcm5pbmdzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlbHVkZSA9IFtdO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgc3RyZWFtIHN0YXR1cyBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIE1vc3RseSB1c2VmdWwgYXQgdGhlIGVuZCBvZiBpbnB1dCBmb3IgYW4gZW1wdHkgc3RyZWFtLlxuICAgICAqL1xuICAgIHN0cmVhbUluZm8oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21tZW50OiBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKS5jb21tZW50LFxuICAgICAgICAgICAgZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzLFxuICAgICAgICAgICAgZXJyb3JzOiB0aGlzLmVycm9ycyxcbiAgICAgICAgICAgIHdhcm5pbmdzOiB0aGlzLndhcm5pbmdzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBvc2UgdG9rZW5zIGludG8gZG9jdW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRG9jIC0gSWYgdGhlIHN0cmVhbSBjb250YWlucyBubyBkb2N1bWVudCwgc3RpbGwgZW1pdCBhIGZpbmFsIGRvY3VtZW50IGluY2x1ZGluZyBhbnkgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIGEgc3Vic2VxdWVudCBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gZW5kT2Zmc2V0IC0gU2hvdWxkIGJlIHNldCBpZiBgZm9yY2VEb2NgIGlzIGFsc28gc2V0LCB0byBzZXQgdGhlIGRvY3VtZW50IHJhbmdlIGVuZCBhbmQgdG8gaW5kaWNhdGUgZXJyb3JzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICAqY29tcG9zZSh0b2tlbnMsIGZvcmNlRG9jID0gZmFsc2UsIGVuZE9mZnNldCA9IC0xKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMubmV4dCh0b2tlbik7XG4gICAgICAgIHlpZWxkKiB0aGlzLmVuZChmb3JjZURvYywgZW5kT2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIEFkdmFuY2UgdGhlIGNvbXBvc2VyIGJ5IG9uZSBDU1QgdG9rZW4uICovXG4gICAgKm5leHQodG9rZW4pIHtcbiAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy5hZGQodG9rZW4uc291cmNlLCAob2Zmc2V0LCBtZXNzYWdlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IGdldEVycm9yUG9zKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zWzBdICs9IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKHBvcywgJ0JBRF9ESVJFQ1RJVkUnLCBtZXNzYWdlLCB3YXJuaW5nKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWx1ZGUucHVzaCh0b2tlbi5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXREaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGNvbXBvc2VEb2ModGhpcy5vcHRpb25zLCB0aGlzLmRpcmVjdGl2ZXMsIHRva2VuLCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcyAmJiAhZG9jLmRpcmVjdGl2ZXMubWFya2VyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnTWlzc2luZyBkaXJlY3RpdmVzLWVuZCBpbmRpY2F0b3IgbGluZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUoZG9jLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9jKVxuICAgICAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLmRvYztcbiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgICAgICAgICB0aGlzLmF0RGlyZWN0aXZlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYnl0ZS1vcmRlci1tYXJrJzpcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsdWRlLnB1c2godG9rZW4uc291cmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IHRva2VuLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICA/IGAke3Rva2VuLm1lc3NhZ2V9OiAke0pTT04uc3RyaW5naWZ5KHRva2VuLnNvdXJjZSl9YFxuICAgICAgICAgICAgICAgICAgICA6IHRva2VuLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWUFNTFBhcnNlRXJyb3IoZ2V0RXJyb3JQb3ModG9rZW4pLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1zZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXREaXJlY3RpdmVzIHx8ICF0aGlzLmRvYylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ1VuZXhwZWN0ZWQgZG9jLWVuZCB3aXRob3V0IHByZWNlZGluZyBkb2N1bWVudCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBtc2cpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHJlc29sdmVFbmQodG9rZW4uZW5kLCB0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoLCB0aGlzLmRvYy5vcHRpb25zLnN0cmljdCwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKHRoaXMuZG9jLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGMgPSB0aGlzLmRvYy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jb21tZW50ID0gZGMgPyBgJHtkY31cXG4ke2VuZC5jb21tZW50fWAgOiBlbmQuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MucmFuZ2VbMl0gPSBlbmQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuc3VwcG9ydGVkIHRva2VuICR7dG9rZW4udHlwZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8geWllbGQgYW55IHJlbWFpbmluZyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmVuZChmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBpZiAodGhpcy5kb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICB0aGlzLmRvYyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2VEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHsgZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZW5kT2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgIGRvYy5yYW5nZSA9IFswLCBlbmRPZmZzZXQsIGVuZE9mZnNldF07XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgeWllbGQgZG9jO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NlciB9O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH0gZnJvbSAnLi4vY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9IGZyb20gJy4uL2NvbXBvc2UvcmVzb2x2ZS1mbG93LXNjYWxhci5qcyc7XG5pbXBvcnQgeyBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHRva2VuLCBzdHJpY3QsIF9vbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHNjYWxhciB0b2tlbiB3aXRoIGB2YWx1ZWBcbiAqXG4gKiBWYWx1ZXMgdGhhdCByZXByZXNlbnQgYW4gYWN0dWFsIHN0cmluZyBidXQgbWF5IGJlIHBhcnNlZCBhcyBhIGRpZmZlcmVudCB0eXBlIHNob3VsZCB1c2UgYSBgdHlwZWAgb3RoZXIgdGhhbiBgJ1BMQUlOJ2AsXG4gKiBhcyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYW55IHNjaGVtYSBvcGVyYXRpb25zIGFuZCB3b24ndCBjaGVjayBmb3Igc3VjaCBjb25mbGljdHMuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5lbmQgQ29tbWVudHMgYW5kIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdmFsdWUsIG9yIGFmdGVyIHRoZSBibG9jayBzY2FsYXIgaGVhZGVyLiBJZiB1bmRlZmluZWQsIGEgbmV3bGluZSB3aWxsIGJlIGFkZGVkLlxuICogQHBhcmFtIGNvbnRleHQuaW1wbGljaXRLZXkgQmVpbmcgd2l0aGluIGFuIGltcGxpY2l0IGtleSBtYXkgYWZmZWN0IHRoZSByZXNvbHZlZCB0eXBlIG9mIHRoZSB0b2tlbidzIHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQuaW5kZW50IFRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIHRva2VuLlxuICogQHBhcmFtIGNvbnRleHQuaW5GbG93IElzIHRoaXMgc2NhbGFyIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbj8gVGhpcyBtYXkgYWZmZWN0IHRoZSByZXNvbHZlZCB0eXBlIG9mIHRoZSB0b2tlbidzIHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQub2Zmc2V0IFRoZSBvZmZzZXQgcG9zaXRpb24gb2YgdGhlIHRva2VuLlxuICogQHBhcmFtIGNvbnRleHQudHlwZSBUaGUgcHJlZmVycmVkIHR5cGUgb2YgdGhlIHNjYWxhciB0b2tlbi4gSWYgdW5kZWZpbmVkLCB0aGUgcHJldmlvdXMgdHlwZSBvZiB0aGUgYHRva2VuYCB3aWxsIGJlIHVzZWQsIGRlZmF1bHRpbmcgdG8gYCdQTEFJTidgLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTY2FsYXJUb2tlbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5ID0gZmFsc2UsIGluZGVudCwgaW5GbG93ID0gZmFsc2UsIG9mZnNldCA9IC0xLCB0eXBlID0gJ1BMQUlOJyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5LFxuICAgICAgICBpbmRlbnQ6IGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIGNvbnN0IGVuZCA9IChfYSA9IGNvbnRleHQuZW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXG4gICAgICAgIHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfVxuICAgIF07XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBjb25zdCBoZSA9IHNvdXJjZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSlcbiAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYmxvY2stc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHByb3BzLCBzb3VyY2U6IGJvZHkgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZG91YmxlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzaW5nbGUtcXVvdGVkLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdG9rZW5gIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHZhbHVlYCwgb3ZlcndyaXRpbmcgYW55IHByZXZpb3VzIGNvbnRlbnRzIGFuZCB0eXBlIHRoYXQgaXQgbWF5IGhhdmUuXG4gKlxuICogQmVzdCBlZmZvcnRzIGFyZSBtYWRlIHRvIHJldGFpbiBhbnkgY29tbWVudHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGB0b2tlbmAsXG4gKiB0aG91Z2ggYWxsIGNvbnRlbnRzIHdpdGhpbiBhIGNvbGxlY3Rpb24ncyBgaXRlbXNgIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogVmFsdWVzIHRoYXQgcmVwcmVzZW50IGFuIGFjdHVhbCBzdHJpbmcgYnV0IG1heSBiZSBwYXJzZWQgYXMgYSBkaWZmZXJlbnQgdHlwZSBzaG91bGQgdXNlIGEgYHR5cGVgIG90aGVyIHRoYW4gYCdQTEFJTidgLFxuICogYXMgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFueSBzY2hlbWEgb3BlcmF0aW9ucyBhbmQgd29uJ3QgY2hlY2sgZm9yIHN1Y2ggY29uZmxpY3RzLlxuICpcbiAqIEBwYXJhbSB0b2tlbiBBbnkgdG9rZW4uIElmIGl0IGRvZXMgbm90IGluY2x1ZGUgYW4gYGluZGVudGAgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIGlmIGl0IHdlcmUgYW4gaW1wbGljaXQga2V5LlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5hZnRlcktleSBJbiBtb3N0IGNhc2VzLCB2YWx1ZXMgYWZ0ZXIgYSBrZXkgc2hvdWxkIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0LmltcGxpY2l0S2V5IEJlaW5nIHdpdGhpbiBhbiBpbXBsaWNpdCBrZXkgbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LmluRmxvdyBCZWluZyB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24gbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LnR5cGUgVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBzY2FsYXIgdG9rZW4uIElmIHVuZGVmaW5lZCwgdGhlIHByZXZpb3VzIHR5cGUgb2YgdGhlIGB0b2tlbmAgd2lsbCBiZSB1c2VkLCBkZWZhdWx0aW5nIHRvIGAnUExBSU4nYC5cbiAqL1xuZnVuY3Rpb24gc2V0U2NhbGFyVmFsdWUodG9rZW4sIHZhbHVlLCBjb250ZXh0ID0ge30pIHtcbiAgICBsZXQgeyBhZnRlcktleSA9IGZhbHNlLCBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbkZsb3cgPSBmYWxzZSwgdHlwZSB9ID0gY29udGV4dDtcbiAgICBsZXQgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiBudWxsO1xuICAgIGlmIChhZnRlcktleSAmJiB0eXBlb2YgaW5kZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgaW5kZW50ICs9IDI7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0eXBlID0gJ1FVT1RFX1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9ET1VCTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlcicpO1xuICAgICAgICAgICAgICAgIHR5cGUgPSBoZWFkZXIuc291cmNlWzBdID09PSAnPicgPyAnQkxPQ0tfRk9MREVEJyA6ICdCTE9DS19MSVRFUkFMJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdQTEFJTic7XG4gICAgICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5OiBpbXBsaWNpdEtleSB8fCBpbmRlbnQgPT09IG51bGwsXG4gICAgICAgIGluZGVudDogaW5kZW50ICE9PSBudWxsICYmIGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdkb3VibGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnc2NhbGFyJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0QmxvY2tTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlKSB7XG4gICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgY29uc3QgaGVhZCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaGUpO1xuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdG9rZW4ucHJvcHNbMF07XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgaGVhZGVyLnNvdXJjZSA9IGhlYWQ7XG4gICAgICAgIHRva2VuLnNvdXJjZSA9IGJvZHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gdG9rZW47XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogLTE7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiAnYmxvY2stc2NhbGFyLWhlYWRlcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2U6IGhlYWQgfVxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgJ2VuZCcgaW4gdG9rZW4gPyB0b2tlbi5lbmQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0b2tlbikpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlOiAnYmxvY2stc2NhbGFyJywgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH0pO1xuICAgIH1cbn1cbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbGFzdCB0b2tlbiBpcyBhIG5ld2xpbmUgKi9cbmZ1bmN0aW9uIGFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSB7XG4gICAgaWYgKGVuZClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBlbmQpXG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdG9rZW4ucHJvcHMuc2xpY2UoMSk7XG4gICAgICAgICAgICBsZXQgb2EgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRva2VuLnByb3BzWzBdLnR5cGUgPT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICBvYSAtPSB0b2tlbi5wcm9wc1swXS5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2sgb2YgZW5kKVxuICAgICAgICAgICAgICAgIHRvay5vZmZzZXQgKz0gb2E7XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4ucHJvcHM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5sID0geyB0eXBlOiAnbmV3bGluZScsIG9mZnNldCwgaW5kZW50OiB0b2tlbi5pbmRlbnQsIHNvdXJjZTogJ1xcbicgfTtcbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5pdGVtcztcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgc291cmNlLCBlbmQ6IFtubF0gfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gdG9rZW4gJiYgQXJyYXkuaXNBcnJheSh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5lbmQuZmlsdGVyKHN0ID0+IHN0LnR5cGUgPT09ICdzcGFjZScgfHxcbiAgICAgICAgICAgICAgICAgICAgc3QudHlwZSA9PT0gJ2NvbW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiBrZXkgIT09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgaW5kZW50LCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgY3JlYXRlU2NhbGFyVG9rZW4sIHJlc29sdmVBc1NjYWxhciwgc2V0U2NhbGFyVmFsdWUgfTtcbiIsIi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKGNzdCkgPT4gJ3R5cGUnIGluIGNzdCA/IHN0cmluZ2lmeVRva2VuKGNzdCkgOiBzdHJpbmdpZnlJdGVtKGNzdCk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbi5wcm9wcylcbiAgICAgICAgICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odG9rKTtcbiAgICAgICAgICAgIHJldHVybiByZXMgKyB0b2tlbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc3RhcnQuc291cmNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gc3RyaW5naWZ5SXRlbSh0b2tlbik7XG4gICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgaWYgKCdlbmQnIGluIHRva2VuICYmIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtKHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpXG4gICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKGtleSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKGtleSk7XG4gICAgaWYgKHNlcClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApXG4gICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgIGlmICh2YWx1ZSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnkgfTtcbiIsImV4cG9ydCB7IGNyZWF0ZVNjYWxhclRva2VuLCByZXNvbHZlQXNTY2FsYXIsIHNldFNjYWxhclZhbHVlIH0gZnJvbSAnLi9jc3Qtc2NhbGFyLmpzJztcbmV4cG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vY3N0LXN0cmluZ2lmeS5qcyc7XG5leHBvcnQgeyB2aXNpdCB9IGZyb20gJy4vY3N0LXZpc2l0LmpzJztcblxuLyoqIFRoZSBieXRlIG9yZGVyIG1hcmsgKi9cbmNvbnN0IEJPTSA9ICdcXHV7RkVGRn0nO1xuLyoqIFN0YXJ0IG9mIGRvYy1tb2RlICovXG5jb25zdCBET0NVTUVOVCA9ICdcXHgwMic7IC8vIEMwOiBTdGFydCBvZiBUZXh0XG4vKiogVW5leHBlY3RlZCBlbmQgb2YgZmxvdy1tb2RlICovXG5jb25zdCBGTE9XX0VORCA9ICdcXHgxOCc7IC8vIEMwOiBDYW5jZWxcbi8qKiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlICovXG5jb25zdCBTQ0FMQVIgPSAnXFx4MWYnOyAvLyBDMDogVW5pdCBTZXBhcmF0b3Jcbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYHRva2VuYCBpcyBhIGZsb3cgb3IgYmxvY2sgY29sbGVjdGlvbiAqL1xuY29uc3QgaXNDb2xsZWN0aW9uID0gKHRva2VuKSA9PiAhIXRva2VuICYmICdpdGVtcycgaW4gdG9rZW47XG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIHNjYWxhcjsgbm90IGFuIGFsaWFzICovXG5jb25zdCBpc1NjYWxhciA9ICh0b2tlbikgPT4gISF0b2tlbiAmJlxuICAgICh0b2tlbi50eXBlID09PSAnc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdkb3VibGUtcXVvdGVkLXNjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBHZXQgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBsZXhlciB0b2tlbiAqL1xuZnVuY3Rpb24gcHJldHR5VG9rZW4odG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICc8Qk9NPic7XG4gICAgICAgIGNhc2UgRE9DVU1FTlQ6XG4gICAgICAgICAgICByZXR1cm4gJzxET0M+JztcbiAgICAgICAgY2FzZSBGTE9XX0VORDpcbiAgICAgICAgICAgIHJldHVybiAnPEZMT1dfRU5EPic7XG4gICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgcmV0dXJuICc8U0NBTEFSPic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodG9rZW4pO1xuICAgIH1cbn1cbi8qKiBJZGVudGlmeSB0aGUgdHlwZSBvZiBhIGxleGVyIHRva2VuLiBNYXkgcmV0dXJuIGBudWxsYCBmb3IgdW5rbm93biB0b2tlbnMuICovXG5mdW5jdGlvbiB0b2tlblR5cGUoc291cmNlKSB7XG4gICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSBCT006XG4gICAgICAgICAgICByZXR1cm4gJ2J5dGUtb3JkZXItbWFyayc7XG4gICAgICAgIGNhc2UgRE9DVU1FTlQ6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1tb2RlJztcbiAgICAgICAgY2FzZSBGTE9XX0VORDpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1lcnJvci1lbmQnO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnc2NhbGFyJztcbiAgICAgICAgY2FzZSAnLS0tJzpcbiAgICAgICAgICAgIHJldHVybiAnZG9jLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnLi4uJzpcbiAgICAgICAgICAgIHJldHVybiAnZG9jLWVuZCc7XG4gICAgICAgIGNhc2UgJyc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xcclxcbic6XG4gICAgICAgICAgICByZXR1cm4gJ25ld2xpbmUnO1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIHJldHVybiAnc2VxLWl0ZW0taW5kJztcbiAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgICByZXR1cm4gJ2V4cGxpY2l0LWtleS1pbmQnO1xuICAgICAgICBjYXNlICc6JzpcbiAgICAgICAgICAgIHJldHVybiAnbWFwLXZhbHVlLWluZCc7XG4gICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgcmV0dXJuICdmbG93LW1hcC1zdGFydCc7XG4gICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgcmV0dXJuICdmbG93LW1hcC1lbmQnO1xuICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1zZXEtc3RhcnQnO1xuICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1zZXEtZW5kJztcbiAgICAgICAgY2FzZSAnLCc6XG4gICAgICAgICAgICByZXR1cm4gJ2NvbW1hJztcbiAgICB9XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gJ3NwYWNlJztcbiAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnO1xuICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIHJldHVybiAnZGlyZWN0aXZlLWxpbmUnO1xuICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgIHJldHVybiAnYWxpYXMnO1xuICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgIHJldHVybiAnYW5jaG9yJztcbiAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICByZXR1cm4gJ3RhZyc7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICByZXR1cm4gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgcmV0dXJuICdkb3VibGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHJldHVybiAnYmxvY2stc2NhbGFyLWhlYWRlcic7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgeyBCT00sIERPQ1VNRU5ULCBGTE9XX0VORCwgU0NBTEFSLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyLCBwcmV0dHlUb2tlbiwgdG9rZW5UeXBlIH07XG4iLCJpbXBvcnQgeyBCT00sIERPQ1VNRU5ULCBGTE9XX0VORCwgU0NBTEFSIH0gZnJvbSAnLi9jc3QuanMnO1xuXG4vKlxuU1RBUlQgLT4gc3RyZWFtXG5cbnN0cmVhbVxuICBkaXJlY3RpdmUgLT4gbGluZS1lbmQgLT4gc3RyZWFtXG4gIGluZGVudCArIGxpbmUtZW5kIC0+IHN0cmVhbVxuICBbZWxzZV0gLT4gbGluZS1zdGFydFxuXG5saW5lLWVuZFxuICBjb21tZW50IC0+IGxpbmUtZW5kXG4gIG5ld2xpbmUgLT4gLlxuICBpbnB1dC1lbmQgLT4gRU5EXG5cbmxpbmUtc3RhcnRcbiAgZG9jLXN0YXJ0IC0+IGRvY1xuICBkb2MtZW5kIC0+IHN0cmVhbVxuICBbZWxzZV0gLT4gaW5kZW50IC0+IGJsb2NrLXN0YXJ0XG5cbmJsb2NrLXN0YXJ0XG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBibG9jay1zdGFydFxuICBtYXAtdmFsdWUtc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgW2Vsc2VdIC0+IGRvY1xuXG5kb2NcbiAgbGluZS1lbmQgLT4gbGluZS1zdGFydFxuICBzcGFjZXMgLT4gZG9jXG4gIGFuY2hvciAtPiBkb2NcbiAgdGFnIC0+IGRvY1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZG9jXG4gIGZsb3ctZW5kIC0+IGVycm9yIC0+IGRvY1xuICBzZXEtaXRlbS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGVycm9yIC0+IGRvY1xuICBtYXAtdmFsdWUtc3RhcnQgLT4gZG9jXG4gIGFsaWFzIC0+IGRvY1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGRvY1xuICBibG9jay1zY2FsYXItaGVhZGVyIC0+IGxpbmUtZW5kIC0+IGJsb2NrLXNjYWxhcihtaW4pIC0+IGxpbmUtc3RhcnRcbiAgW2Vsc2VdIC0+IHBsYWluLXNjYWxhcihmYWxzZSwgbWluKSAtPiBkb2NcblxuZmxvd1xuICBsaW5lLWVuZCAtPiBmbG93XG4gIHNwYWNlcyAtPiBmbG93XG4gIGFuY2hvciAtPiBmbG93XG4gIHRhZyAtPiBmbG93XG4gIGZsb3ctc3RhcnQgLT4gZmxvdyAtPiBmbG93XG4gIGZsb3ctZW5kIC0+IC5cbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZmxvd1xuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gZmxvd1xuICBtYXAtdmFsdWUtc3RhcnQgLT4gZmxvd1xuICBhbGlhcyAtPiBmbG93XG4gIHF1b3RlLXN0YXJ0IC0+IHF1b3RlZC1zY2FsYXIgLT4gZmxvd1xuICBjb21tYSAtPiBmbG93XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIodHJ1ZSwgMCkgLT4gZmxvd1xuXG5xdW90ZWQtc2NhbGFyXG4gIHF1b3RlLWVuZCAtPiAuXG4gIFtlbHNlXSAtPiBxdW90ZWQtc2NhbGFyXG5cbmJsb2NrLXNjYWxhcihtaW4pXG4gIG5ld2xpbmUgKyBwZWVrKGluZGVudCA8IG1pbikgLT4gLlxuICBbZWxzZV0gLT4gYmxvY2stc2NhbGFyKG1pbilcblxucGxhaW4tc2NhbGFyKGlzLWZsb3csIG1pbilcbiAgc2NhbGFyLWVuZChpcy1mbG93KSAtPiAuXG4gIHBlZWsobmV3bGluZSArIChpbmRlbnQgPCBtaW4pKSAtPiAuXG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIobWluKVxuKi9cbmZ1bmN0aW9uIGlzRW1wdHkoY2gpIHtcbiAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgY2FzZSAnXFxyJzpcbiAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmNvbnN0IGhleERpZ2l0cyA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJy5zcGxpdCgnJyk7XG5jb25zdCB0YWdDaGFycyA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotIzsvPzpAJj0rJF8uIX4qJygpXCIuc3BsaXQoJycpO1xuY29uc3QgaW52YWxpZEZsb3dTY2FsYXJDaGFycyA9ICcsW117fScuc3BsaXQoJycpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gJyAsW117fVxcblxcclxcdCcuc3BsaXQoJycpO1xuY29uc3QgaXNOb3RBbmNob3JDaGFyID0gKGNoKSA9PiAhY2ggfHwgaW52YWxpZEFuY2hvckNoYXJzLmluY2x1ZGVzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0IHx8ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gbGluZS5pbmRleE9mKCcjJyk7XG4gICAgICAgICAgICBpZiAoY3MgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2NzIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtkaXJFbmQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIGRpckVuZCAtPSAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudChkaXJFbmQpKSArICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pOyAvLyBwb3NzaWJsZSBjb21tZW50XG4gICAgICAgICAgICB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmVhbSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXRMaW5lRW5kKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwID0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIHNwKTtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmVhbSc7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgRE9DVU1FTlQ7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VMaW5lU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5jaGFyQXQoMCk7XG4gICAgICAgIGlmICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdsaW5lLXN0YXJ0Jyk7XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdEVuZCAmJiAhdGhpcy5oYXNDaGFycyg0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdsaW5lLXN0YXJ0Jyk7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy5wZWVrKDMpO1xuICAgICAgICAgICAgaWYgKHMgPT09ICctLS0nICYmIGlzRW1wdHkodGhpcy5jaGFyQXQoMykpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkb2MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocyA9PT0gJy4uLicgJiYgaXNFbXB0eSh0aGlzLmNoYXJBdCgzKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TmV4dCA+IHRoaXMuaW5kZW50VmFsdWUgJiYgIWlzRW1wdHkodGhpcy5jaGFyQXQoMSkpKVxuICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1N0YXJ0KCkge1xuICAgICAgICBjb25zdCBbY2gwLCBjaDFdID0gdGhpcy5wZWVrKDIpO1xuICAgICAgICBpZiAoIWNoMSAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXN0YXJ0Jyk7XG4gICAgICAgIGlmICgoY2gwID09PSAnLScgfHwgY2gwID09PSAnPycgfHwgY2gwID09PSAnOicpICYmIGlzRW1wdHkoY2gxKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9ICh5aWVsZCogdGhpcy5wdXNoQ291bnQoMSkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZSArIDE7XG4gICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlICs9IG47XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdkb2MnO1xuICAgIH1cbiAgICAqcGFyc2VEb2N1bWVudCgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2RvYycpO1xuICAgICAgICBsZXQgbiA9IHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCk7XG4gICAgICAgIHN3aXRjaCAobGluZVtuXSkge1xuICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hVbnRpbChpc05vdEFuY2hvckNoYXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlUXVvdGVkU2NhbGFyKCk7XG4gICAgICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhckhlYWRlcigpO1xuICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU2NhbGFyKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVBsYWluU2NhbGFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKnBhcnNlRmxvd0NvbGxlY3Rpb24oKSB7XG4gICAgICAgIGxldCBubCwgc3A7XG4gICAgICAgIGxldCBpbmRlbnQgPSAtMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbmwgPSB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgc3AgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgaWYgKG5sID4gMClcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gaW5kZW50ID0gc3A7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCArPSB0aGlzLmJsb2NrU2NhbGFySW5kZW50O1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihubCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIuaW5kZXhPZignXFxuJywgY3MpO1xuICAgICAgICAgICAgfSB3aGlsZSAobmwgIT09IC0xKTtcbiAgICAgICAgICAgIGlmIChubCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ibG9ja1NjYWxhcktlZXApIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG5sIC0gMTtcbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWy0taV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWy0taV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJyAmJiBpID49IHRoaXMucG9zKVxuICAgICAgICAgICAgICAgICAgICBubCA9IGk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgobmwgKyAxLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZVBsYWluU2NhbGFyKCkge1xuICAgICAgICBjb25zdCBpbkZsb3cgPSB0aGlzLmZsb3dMZXZlbCA+IDA7XG4gICAgICAgIGxldCBlbmQgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgY2g7XG4gICAgICAgIHdoaWxlICgoY2ggPSB0aGlzLmJ1ZmZlclsrK2ldKSkge1xuICAgICAgICAgICAgaWYgKGNoID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KG5leHQpIHx8IChpbkZsb3cgJiYgbmV4dCA9PT0gJywnKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRW1wdHkoY2gpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnIycgfHwgKGluRmxvdyAmJiBpbnZhbGlkRmxvd1NjYWxhckNoYXJzLmluY2x1ZGVzKG5leHQpKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBNYXRoLm1heChpLCBjcyAtIDIpOyAvLyB0byBhZHZhbmNlLCBidXQgc3RpbGwgYWNjb3VudCBmb3IgJyAjJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbkZsb3cgJiYgaW52YWxpZEZsb3dTY2FsYXJDaGFycy5pbmNsdWRlcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ3BsYWluLXNjYWxhcicpO1xuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIHRydWUpO1xuICAgICAgICByZXR1cm4gaW5GbG93ID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwdXNoQ291bnQobikge1xuICAgICAgICBpZiAobiA+IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcywgbik7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoVG9JbmRleChpLCBhbGxvd0VtcHR5KSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvcywgaSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB5aWVsZCBzO1xuICAgICAgICAgICAgdGhpcy5wb3MgKz0gcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxsb3dFbXB0eSlcbiAgICAgICAgICAgIHlpZWxkICcnO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hJbmRpY2F0b3JzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCh5aWVsZCogdGhpcy5wdXNoVGFnKCkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKHlpZWxkKiB0aGlzLnB1c2hVbnRpbChpc05vdEFuY2hvckNoYXIpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpKSk7XG4gICAgICAgICAgICBjYXNlICc6JzpcbiAgICAgICAgICAgIGNhc2UgJz8nOiAvLyB0aGlzIGlzIGFuIGVycm9yIG91dHNpZGUgZmxvdyBjb2xsZWN0aW9uc1xuICAgICAgICAgICAgY2FzZSAnLSc6IC8vIHRoaXMgaXMgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmNoYXJBdCgxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxvd0xldmVsID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gdGhpcy5pbmRlbnRWYWx1ZSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZmxvd0tleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh5aWVsZCogdGhpcy5wdXNoQ291bnQoMSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaEluZGljYXRvcnMoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmluY2x1ZGVzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJScgJiZcbiAgICAgICAgICAgICAgICAgICAgaGV4RGlnaXRzLmluY2x1ZGVzKHRoaXMuYnVmZmVyW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaGV4RGlnaXRzLmluY2x1ZGVzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwiLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaW5lQ291bnRlciB9O1xuIiwiaW1wb3J0IHsgdG9rZW5UeXBlIH0gZnJvbSAnLi9jc3QuanMnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICcuL2xleGVyLmpzJztcblxuZnVuY3Rpb24gaW5jbHVkZXNUb2tlbihsaXN0LCB0eXBlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKVxuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09PSB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25FbXB0eShsaXN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHN3aXRjaCAobGlzdFtpXS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0Zsb3dUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFByZXZQcm9wcyhwYXJlbnQpIHtcbiAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc3RhcnQ7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLW1hcCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ID0gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdC5zZXAgfHwgaXQuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuaXRlbXNbcGFyZW50Lml0ZW1zLmxlbmd0aCAtIDFdLnN0YXJ0O1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbi8qKiBOb3RlOiBNYXkgbW9kaWZ5IGlucHV0IGFycmF5ICovXG5mdW5jdGlvbiBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldikge1xuICAgIHZhciBfYTtcbiAgICBpZiAocHJldi5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgaSA9IHByZXYubGVuZ3RoO1xuICAgIGxvb3A6IHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICBzd2l0Y2ggKHByZXZbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoKChfYSA9IHByZXZbKytpXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGUpID09PSAnc3BhY2UnKSB7XG4gICAgICAgIC8qIGxvb3AgKi9cbiAgICB9XG4gICAgcmV0dXJuIHByZXYuc3BsaWNlKGksIHByZXYubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGZpeEZsb3dTZXFJdGVtcyhmYykge1xuICAgIGlmIChmYy5zdGFydC50eXBlID09PSAnZmxvdy1zZXEtc3RhcnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZmMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAhaXQudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5rZXkpXG4gICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvd1Rva2VuKGl0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUuZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaXQudmFsdWUuZW5kLCBpdC5zZXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZS5lbmQgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaXQuc3RhcnQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LnNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBZQU1MIGNvbmNyZXRlIHN5bnRheCB0cmVlIChDU1QpIHBhcnNlclxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogZm9yIChjb25zdCB0b2tlbiBvZiBuZXcgUGFyc2VyKCkucGFyc2Uoc3JjKSkge1xuICogICAvLyB0b2tlbjogVG9rZW5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRvIHVzZSB0aGUgcGFyc2VyIHdpdGggYSB1c2VyLXByb3ZpZGVkIGxleGVyOlxuICpcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiogcGFyc2Uoc291cmNlOiBzdHJpbmcsIGxleGVyOiBMZXhlcikge1xuICogICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAqICAgZm9yIChjb25zdCBsZXhlbWUgb2YgbGV4ZXIubGV4KHNvdXJjZSkpXG4gKiAgICAgeWllbGQqIHBhcnNlci5uZXh0KGxleGVtZSlcbiAqICAgeWllbGQqIHBhcnNlci5lbmQoKVxuICogfVxuICpcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBjb25zdCBsZXhlciA9IG5ldyBMZXhlcigpXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIHBhcnNlKHNyYywgbGV4ZXIpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uTmV3TGluZSAtIElmIGRlZmluZWQsIGNhbGxlZCBzZXBhcmF0ZWx5IHdpdGggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mXG4gICAgICogICBlYWNoIG5ldyBsaW5lIChpbiBgcGFyc2UoKWAsIGluY2x1ZGluZyB0aGUgc3RhcnQgb2YgaW5wdXQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9uTmV3TGluZSkge1xuICAgICAgICAvKiogSWYgdHJ1ZSwgc3BhY2UgYW5kIHNlcXVlbmNlIGluZGljYXRvcnMgY291bnQgYXMgaW5kZW50YXRpb24gKi9cbiAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAvKiogSWYgdHJ1ZSwgbmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovXG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHNpbmNlIHRoZSBzdGFydCBvZiBwYXJzaW5nICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqIE9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIGJsb2NrIG1hcCBrZXkgKi9cbiAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgLyoqIFRvcCBpbmRpY2F0ZXMgdGhlIG5vZGUgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBidWlsdCAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKiBUaGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHRva2VuLCBzZXQgaW4gcGFyc2UoKSAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9ICcnO1xuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICAvLyBNdXN0IGJlIGRlZmluZWQgYWZ0ZXIgYG5leHQoKWBcbiAgICAgICAgdGhpcy5sZXhlciA9IG5ldyBMZXhlcigpO1xuICAgICAgICB0aGlzLm9uTmV3TGluZSA9IG9uTmV3TGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYHNvdXJjZWAgYXMgYSBZQU1MIHN0cmVhbS5cbiAgICAgKiBJZiBgaW5jb21wbGV0ZWAsIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duLCBidXQgeWllbGRlZCBhcyBgeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlIH1gIHRva2Vucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG9mIHRva2VucyByZXByZXNlbnRpbmcgZWFjaCBkaXJlY3RpdmUsIGRvY3VtZW50LCBhbmQgb3RoZXIgc3RydWN0dXJlLlxuICAgICAqL1xuICAgICpwYXJzZShzb3VyY2UsIGluY29tcGxldGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUgJiYgdGhpcy5vZmZzZXQgPT09IDApXG4gICAgICAgICAgICB0aGlzLm9uTmV3TGluZSgwKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXhlbWUgb2YgdGhpcy5sZXhlci5sZXgoc291cmNlLCBpbmNvbXBsZXRlKSlcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQobGV4ZW1lKTtcbiAgICAgICAgaWYgKCFpbmNvbXBsZXRlKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMuZW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkdmFuY2UgdGhlIHBhcnNlciBieSB0aGUgYHNvdXJjZWAgb2Ygb25lIGxleGljYWwgdG9rZW4uXG4gICAgICovXG4gICAgKm5leHQoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5hdFNjYWxhcikge1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdG9rZW5UeXBlKHNvdXJjZSk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBOb3QgYSBZQU1MIHRva2VuOiAke3NvdXJjZX1gO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHsgdHlwZTogJ2Vycm9yJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgbWVzc2FnZSwgc291cmNlIH0pO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc2NhbGFyJykge1xuICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXRTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gJ3NjYWxhcic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSAmJiBzb3VyY2VbMF0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWVycm9yLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8gcHVzaCBvdXQgYW55IHJlbWFpbmluZyBjb25zdHJ1Y3Rpb25zICovXG4gICAgKmVuZCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMClcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBnZXQgc291cmNlVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHN0ID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdDtcbiAgICB9XG4gICAgKnN0ZXAoKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1lbmQnICYmICghdG9wIHx8IHRvcC50eXBlICE9PSAnZG9jLWVuZCcpKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9jLWVuZCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcClcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zdHJlYW0oKTtcbiAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuc2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja1NjYWxhcih0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tNYXAodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2VxdWVuY2UodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmZsb3dDb2xsZWN0aW9uKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZG9jdW1lbnRFbmQodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbl07XG4gICAgfVxuICAgICpwb3AoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBlcnJvciB8fCB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2snO1xuICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBzb3VyY2U6ICcnLCBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2sgc2NhbGFycyB1c2UgdGhlaXIgcGFyZW50IHJhdGhlciB0aGFuIGhlYWRlciBpbmRlbnRcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAnaW5kZW50JyBpbiB0b3AgPyB0b3AuaW5kZW50IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nICYmIHRvcC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBpbmRlbnQgZm9yIHRvcC1sZXZlbCBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJylcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXModG9rZW4pO1xuICAgICAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wcm9wcy5wdXNoKHRva2VuKTsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCB2YWx1ZTogdG9rZW4gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gdG9wLml0ZW1zW3RvcC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodG9wLnR5cGUgPT09ICdkb2N1bWVudCcgfHxcbiAgICAgICAgICAgICAgICB0b3AudHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHxcbiAgICAgICAgICAgICAgICB0b3AudHlwZSA9PT0gJ2Jsb2NrLXNlcScpICYmXG4gICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSB0b2tlbi5pdGVtc1t0b2tlbi5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAmJlxuICAgICAgICAgICAgICAgICAgICAhbGFzdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAgICAgIWxhc3QudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgbGFzdC5zdGFydC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICFpbmNsdWRlc05vbkVtcHR5KGxhc3Quc3RhcnQpICYmXG4gICAgICAgICAgICAgICAgICAgICh0b2tlbi5pbmRlbnQgPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSAhPT0gJ2NvbW1lbnQnIHx8IHN0LmluZGVudCA8IHRva2VuLmluZGVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3AudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5lbmQgPSBsYXN0LnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBsYXN0LnN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5pdGVtcy5zcGxpY2UoLTEsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqc3RyZWFtKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlLWxpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHsgdHlwZTogJ2RpcmVjdGl2ZScsIG9mZnNldDogdGhpcy5vZmZzZXQsIHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdieXRlLW9yZGVyLW1hcmsnOlxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNvdXJjZVRva2VuO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1zdGFydCcpXG4gICAgICAgICAgICAgICAgICAgIGRvYy5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChkb2MpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIHN0cmVhbWAsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgfVxuICAgICpkb2N1bWVudChkb2MpIHtcbiAgICAgICAgaWYgKGRvYy52YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5saW5lRW5kKGRvYyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzTm9uRW1wdHkoZG9jLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvYy5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBkb2Muc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShkb2MpO1xuICAgICAgICBpZiAoYnYpXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgZG9jdW1lbnRgLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgKnNjYWxhcihzY2FsYXIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21hcC12YWx1ZS1pbmQnKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHRoaXMucGVlaygyKSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgIGxldCBzZXA7XG4gICAgICAgICAgICBpZiAoc2NhbGFyLmVuZCkge1xuICAgICAgICAgICAgICAgIHNlcCA9IHNjYWxhci5lbmQ7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHNjYWxhci5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VwID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogc2NhbGFyLm9mZnNldCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IHNjYWxhci5pbmRlbnQsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IHNjYWxhciwgc2VwIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdID0gbWFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoc2NhbGFyKTtcbiAgICB9XG4gICAgKmJsb2NrU2NhbGFyKHNjYWxhcikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBzY2FsYXIucHJvcHMucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgICAgIHNjYWxhci5zb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAvLyBibG9jay1zY2FsYXIgc291cmNlIGluY2x1ZGVzIHRyYWlsaW5nIG5ld2xpbmVcbiAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uTmV3TGluZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5ld0xpbmUodGhpcy5vZmZzZXQgKyBubCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicsIG5sKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKmJsb2NrTWFwKG1hcCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGl0ID0gbWFwLml0ZW1zW21hcC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy8gaXQuc2VwIGlzIHRydWUtaXNoIGlmIHBhaXIgYWxyZWFkeSBoYXMga2V5IG9yIDogc2VwYXJhdG9yXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgobGFzdCA9PT0gbnVsbCB8fCBsYXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXN0LnR5cGUpID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT09IG51bGwgfHwgZW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgbWFwLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9hID0gcHJldiA9PT0gbnVsbCB8fCBwcmV2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmV2LnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW5kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGVuZCwgaXQuc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZGVudCA+PSBtYXAuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBhdE5leHRJdGVtID0gIXRoaXMub25LZXlMaW5lICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQgJiZcbiAgICAgICAgICAgICAgICAoaXQuc2VwIHx8IGluY2x1ZGVzTm9uRW1wdHkoaXQuc3RhcnQpKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYW5jaG9yJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnZXhwbGljaXQta2V5LWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQuc2VwICYmICFpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoYXROZXh0SXRlbSAmJiAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zZXAsICdtYXAtdmFsdWUtaW5kJykpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFtdLCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNGbG93VG9rZW4oaXQua2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWluY2x1ZGVzVG9rZW4oaXQuc2VwLCAnbmV3bGluZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXAgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZSBndWFyZCBpcyB3cm9uZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQua2V5LCBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXksIHNlcCB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnMgPSB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShtYXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnYudHlwZSAhPT0gJ2Jsb2NrLXNlcScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqYmxvY2tTZXF1ZW5jZShzZXEpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBpdCA9IHNlcS5pdGVtc1tzZXEuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gaXQudmFsdWUgPyBpdC52YWx1ZS5lbmQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBBcnJheS5pc0FycmF5KGVuZCkgPyBlbmRbZW5kLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFzdC50eXBlKSA9PT0gJ2NvbW1lbnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID09PSBudWxsIHx8IGVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9hID0gcHJldiA9PT0gbnVsbCB8fCBwcmV2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmV2LnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW5kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGVuZCwgaXQuc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnYW5jaG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlIHx8IHRoaXMuaW5kZW50IDw9IHNlcS5pbmRlbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc2VxLWl0ZW0taW5kJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRlbnQgIT09IHNlcS5pbmRlbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCBpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnc2VxLWl0ZW0taW5kJykpXG4gICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZGVudCA+IHNlcS5pbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUoc2VxKTtcbiAgICAgICAgICAgIGlmIChidikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgfVxuICAgICpmbG93Q29sbGVjdGlvbihmYykge1xuICAgICAgICBjb25zdCBpdCA9IGZjLml0ZW1zW2ZjLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZmxvdy1lcnJvci1lbmQnKSB7XG4gICAgICAgICAgICBsZXQgdG9wO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHRvcCAmJiB0b3AudHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZjLmVuZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnMgPSB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmcyk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LW1hcC1lbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIGZjLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKGZjKTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICBpZiAoYnYpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGVlaygyKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiZcbiAgICAgICAgICAgICAgICAodGhpcy50eXBlID09PSAnbWFwLXZhbHVlLWluZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXS5zZXApKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ21hcC12YWx1ZS1pbmQnICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LnR5cGUgIT09ICdmbG93LWNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpO1xuICAgICAgICAgICAgICAgIGZpeEZsb3dTZXFJdGVtcyhmYyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VwID0gZmMuZW5kLnNwbGljZSgxLCBmYy5lbmQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGZjLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiBmYy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBmYywgc2VwIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdID0gbWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMubGluZUVuZChmYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmxvd1NjYWxhcih0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLm9uTmV3TGluZSkge1xuICAgICAgICAgICAgbGV0IG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJykgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKG5sICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk5ld0xpbmUodGhpcy5vZmZzZXQgKyBubCk7XG4gICAgICAgICAgICAgICAgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBubCkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXJ0QmxvY2tWYWx1ZShwYXJlbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyLWhlYWRlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLXNjYWxhcicsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbdGhpcy5zb3VyY2VUb2tlbl0sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1zZXEtc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmbG93LWNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5zb3VyY2VUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLXNlcScsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBzdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQgfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhdEluZGVudGVkQ29tbWVudChzdGFydCwgaW5kZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdjb21tZW50JylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50IDw9IGluZGVudClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0LmV2ZXJ5KHN0ID0+IHN0LnR5cGUgPT09ICduZXdsaW5lJyB8fCBzdC50eXBlID09PSAnc3BhY2UnKTtcbiAgICB9XG4gICAgKmRvY3VtZW50RW5kKGRvY0VuZCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAnZG9jLW1vZGUnKSB7XG4gICAgICAgICAgICBpZiAoZG9jRW5kLmVuZClcbiAgICAgICAgICAgICAgICBkb2NFbmQuZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZG9jRW5kLmVuZCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqbGluZUVuZCh0b2tlbikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1zZXEtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgdmFsdWVzIGFyZSBlcnJvcnNcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICB0b2tlbi5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmVuZCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBQYXJzZXIgfTtcbiIsImltcG9ydCB7IENvbXBvc2VyIH0gZnJvbSAnLi9jb21wb3NlL2NvbXBvc2VyLmpzJztcbmltcG9ydCB7IERvY3VtZW50IH0gZnJvbSAnLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgWUFNTFBhcnNlRXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi9sb2cuanMnO1xuaW1wb3J0IHsgTGluZUNvdW50ZXIgfSBmcm9tICcuL3BhcnNlL2xpbmUtY291bnRlci5qcyc7XG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICcuL3BhcnNlL3BhcnNlci5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgcHJldHR5RXJyb3JzID0gb3B0aW9ucy5wcmV0dHlFcnJvcnMgIT09IGZhbHNlO1xuICAgIGNvbnN0IGxpbmVDb3VudGVyID0gb3B0aW9ucy5saW5lQ291bnRlciB8fCAocHJldHR5RXJyb3JzICYmIG5ldyBMaW5lQ291bnRlcigpKSB8fCBudWxsO1xuICAgIHJldHVybiB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfTtcbn1cbi8qKlxuICogUGFyc2UgdGhlIGlucHV0IGFzIGEgc3RyZWFtIG9mIFlBTUwgZG9jdW1lbnRzLlxuICpcbiAqIERvY3VtZW50cyBzaG91bGQgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSBgLi4uYCBvciBgLS0tYCBtYXJrZXIgbGluZXMuXG4gKlxuICogQHJldHVybnMgSWYgYW4gZW1wdHkgYGRvY3NgIGFycmF5IGlzIHJldHVybmVkLCBpdCB3aWxsIGJlIG9mIHR5cGVcbiAqICAgRW1wdHlTdHJlYW0gYW5kIGNvbnRhaW4gYWRkaXRpb25hbCBzdHJlYW0gaW5mb3JtYXRpb24uIEluXG4gKiAgIFR5cGVTY3JpcHQsIHlvdSBzaG91bGQgdXNlIGAnZW1wdHknIGluIGRvY3NgIGFzIGEgdHlwZSBndWFyZCBmb3IgaXQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWxsRG9jdW1lbnRzKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBsaW5lQ291bnRlciwgcHJldHR5RXJyb3JzIH0gPSBwYXJzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihsaW5lQ291bnRlciA9PT0gbnVsbCB8fCBsaW5lQ291bnRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGluZUNvdW50ZXIuYWRkTmV3TGluZSk7XG4gICAgY29uc3QgY29tcG9zZXIgPSBuZXcgQ29tcG9zZXIob3B0aW9ucyk7XG4gICAgY29uc3QgZG9jcyA9IEFycmF5LmZyb20oY29tcG9zZXIuY29tcG9zZShwYXJzZXIucGFyc2Uoc291cmNlKSkpO1xuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpXG4gICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICAgICAgICAgIGRvYy53YXJuaW5ncy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICB9XG4gICAgaWYgKGRvY3MubGVuZ3RoID4gMClcbiAgICAgICAgcmV0dXJuIGRvY3M7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oW10sIHsgZW1wdHk6IHRydWUgfSwgY29tcG9zZXIuc3RyZWFtSW5mbygpKTtcbn1cbi8qKiBQYXJzZSBhbiBpbnB1dCBzdHJpbmcgaW50byBhIHNpbmdsZSBZQU1MLkRvY3VtZW50ICovXG5mdW5jdGlvbiBwYXJzZURvY3VtZW50KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBsaW5lQ291bnRlciwgcHJldHR5RXJyb3JzIH0gPSBwYXJzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihsaW5lQ291bnRlciA9PT0gbnVsbCB8fCBsaW5lQ291bnRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGluZUNvdW50ZXIuYWRkTmV3TGluZSk7XG4gICAgY29uc3QgY29tcG9zZXIgPSBuZXcgQ29tcG9zZXIob3B0aW9ucyk7XG4gICAgLy8gYGRvY2AgaXMgYWx3YXlzIHNldCBieSBjb21wb3NlLmVuZCh0cnVlKSBhdCB0aGUgdmVyeSBsYXRlc3RcbiAgICBsZXQgZG9jID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IF9kb2Mgb2YgY29tcG9zZXIuY29tcG9zZShwYXJzZXIucGFyc2Uoc291cmNlKSwgdHJ1ZSwgc291cmNlLmxlbmd0aCkpIHtcbiAgICAgICAgaWYgKCFkb2MpXG4gICAgICAgICAgICBkb2MgPSBfZG9jO1xuICAgICAgICBlbHNlIGlmIChkb2Mub3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3NpbGVudCcpIHtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IoX2RvYy5yYW5nZS5zbGljZSgwLCAyKSwgJ01VTFRJUExFX0RPQ1MnLCAnU291cmNlIGNvbnRhaW5zIG11bHRpcGxlIGRvY3VtZW50czsgcGxlYXNlIHVzZSBZQU1MLnBhcnNlQWxsRG9jdW1lbnRzKCknKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJldHR5RXJyb3JzICYmIGxpbmVDb3VudGVyKSB7XG4gICAgICAgIGRvYy5lcnJvcnMuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgfVxuICAgIHJldHVybiBkb2M7XG59XG5mdW5jdGlvbiBwYXJzZShzcmMsIHJldml2ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3Jldml2ZXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9yZXZpdmVyID0gcmV2aXZlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJldml2ZXIgJiYgdHlwZW9mIHJldml2ZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSByZXZpdmVyO1xuICAgIH1cbiAgICBjb25zdCBkb2MgPSBwYXJzZURvY3VtZW50KHNyYywgb3B0aW9ucyk7XG4gICAgaWYgKCFkb2MpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGRvYy53YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4gd2Fybihkb2Mub3B0aW9ucy5sb2dMZXZlbCwgd2FybmluZykpO1xuICAgIGlmIChkb2MuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50JylcbiAgICAgICAgICAgIHRocm93IGRvYy5lcnJvcnNbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvYy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYy50b0pTKE9iamVjdC5hc3NpZ24oeyByZXZpdmVyOiBfcmV2aXZlciB9LCBvcHRpb25zKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJlcGxhY2VyKSB7XG4gICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJylcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5yb3VuZChvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucyA9IGluZGVudCA8IDEgPyB1bmRlZmluZWQgOiBpbmRlbnQgPiA4ID8geyBpbmRlbnQ6IDggfSA6IHsgaW5kZW50IH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCB9ID0gb3B0aW9ucyB8fCByZXBsYWNlciB8fCB7fTtcbiAgICAgICAgaWYgKCFrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb2N1bWVudCh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKS50b1N0cmluZyhvcHRpb25zKTtcbn1cblxuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfTtcbiIsImltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgQ1NULCBwYXJzZURvY3VtZW50IH0gZnJvbSBcInlhbWxcIjtcbmltcG9ydCB7IFJlcGxhY2VtZW50IH0gZnJvbSBcIi4vVGFnXCI7XG5cbmV4cG9ydCBjbGFzcyBGaWxlIHtcblxuICAgIGNvbnN0cnVjdG9yKGFwcCwgZmlsZW5hbWUsIHRhZ1Bvc2l0aW9ucywgaGFzRnJvbnRNYXR0ZXIpIHtcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgdGhpcy5iYXNlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgdGhpcy50YWdQb3NpdGlvbnMgPSB0YWdQb3NpdGlvbnM7XG4gICAgICAgIHRoaXMuaGFzRnJvbnRNYXR0ZXIgPSAhIWhhc0Zyb250TWF0dGVyO1xuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge1JlcGxhY2VtZW50fSByZXBsYWNlICovXG4gICAgYXN5bmMgcmVuYW1lZChyZXBsYWNlKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgodGhpcy5maWxlbmFtZSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgbGV0IHRleHQgPSBvcmlnaW5hbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcG9zaXRpb246IHsgc3RhcnQsIGVuZCB9LCB0YWcgfSBvZiB0aGlzLnRhZ1Bvc2l0aW9ucykge1xuICAgICAgICAgICAgaWYgKHRleHQuc2xpY2Uoc3RhcnQub2Zmc2V0LCBlbmQub2Zmc2V0KSAhPT0gdGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYEZpbGUgJHt0aGlzLmZpbGVuYW1lfSBoYXMgY2hhbmdlZDsgc2tpcHBpbmdgO1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UobXNnKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyh0ZXh0LnNsaWNlKHN0YXJ0Lm9mZnNldCwgZW5kLm9mZnNldCksIHRhZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dCA9IHJlcGxhY2UuaW5TdHJpbmcodGV4dCwgc3RhcnQub2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0Zyb250TWF0dGVyKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMucmVwbGFjZUluRnJvbnRNYXR0ZXIodGV4dCwgcmVwbGFjZSk7XG5cbiAgICAgICAgaWYgKHRleHQgIT09IG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgdGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge1JlcGxhY2VtZW50fSByZXBsYWNlICovXG4gICAgcmVwbGFjZUluRnJvbnRNYXR0ZXIodGV4dCwgcmVwbGFjZSkge1xuICAgICAgICBjb25zdCBbZW1wdHksIGZyb250TWF0dGVyXSA9IHRleHQuc3BsaXQoL14tLS1cXHI/JFxcbj8vbSwgMik7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkLCBub24tZW1wdHksIHByb3Blcmx5IHRlcm1pbmF0ZWQgZnJvbnQgbWF0dGVyXG4gICAgICAgIGlmIChlbXB0eS50cmltKCkgIT09IFwiXCIgfHwgIWZyb250TWF0dGVyLnRyaW0oKSB8fCAhZnJvbnRNYXR0ZXIuZW5kc1dpdGgoXCJcXG5cIikpXG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURvY3VtZW50KGZyb250TWF0dGVyLCB7a2VlcFNvdXJjZVRva2VuczogdHJ1ZX0pO1xuICAgICAgICBpZiAocGFyc2VkLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYFlBTUwgaXNzdWUgd2l0aCAke3RoaXMuZmlsZW5hbWV9OiAke3BhcnNlZC5lcnJvcnNbMF19YDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOyBuZXcgTm90aWNlKGVycm9yICsgXCI7IHNraXBwaW5nIGZyb250bWF0dGVyXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZSwganNvbiA9IHBhcnNlZC50b0pTT04oKTtcblxuICAgICAgICBmdW5jdGlvbiBzZXRJbk5vZGUobm9kZSwgdmFsdWUsIGFmdGVyS2V5PWZhbHNlKSB7XG4gICAgICAgICAgICBDU1Quc2V0U2NhbGFyVmFsdWUobm9kZS5zcmNUb2tlbiwgdmFsdWUsIHthZnRlcktleX0pO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBub2RlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzRmllbGQocHJvcCwgaXNBbGlhcykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHBhcnNlZC5nZXQocHJvcCwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0ganNvbltwcm9wXTtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgIWZpZWxkLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZmllbGQuc3BsaXQoaXNBbGlhcyA/IC8oXlxccyt8XFxzKixcXHMqfFxccyskKS8gOiAvKFtcXHMsXSspLyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSByZXBsYWNlLmluQXJyYXkocGFydHMsIHRydWUsIGlzQWxpYXMpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGFmdGVyKSBzZXRJbk5vZGUobm9kZSwgYWZ0ZXIsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2UuaW5BcnJheShmaWVsZCwgZmFsc2UsIGlzQWxpYXMpLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkW2ldICE9PSB2KSBzZXRJbk5vZGUobm9kZS5nZXQoaSwgdHJ1ZSksIHYpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHtrZXk6IHt2YWx1ZTpwcm9wfX0gb2YgcGFyc2VkLmNvbnRlbnRzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoL150YWdzPyQvaS50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkKHByb3AsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15hbGlhcyhlcyk/JC9pLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmllbGQocHJvcCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQgPyB0ZXh0LnJlcGxhY2UoZnJvbnRNYXR0ZXIsIENTVC5zdHJpbmdpZnkocGFyc2VkLmNvbnRlbnRzLnNyY1Rva2VuKSkgOiB0ZXh0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7Y29uZmlybX0gZnJvbSBcInNtYWxsdGFsa1wiO1xuaW1wb3J0IHtQcm9ncmVzc30gZnJvbSBcIi4vcHJvZ3Jlc3NcIjtcbmltcG9ydCB7dmFsaWRhdGVkSW5wdXR9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7Tm90aWNlLCBwYXJzZUZyb250TWF0dGVyQWxpYXNlcywgcGFyc2VGcm9udE1hdHRlclRhZ3N9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHtUYWcsIFJlcGxhY2VtZW50fSBmcm9tIFwiLi9UYWdcIjtcbmltcG9ydCB7RmlsZX0gZnJvbSBcIi4vRmlsZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuYW1lVGFnKGFwcCwgdGFnTmFtZSkge1xuICAgIGNvbnN0IG5ld05hbWUgPSBhd2FpdCBwcm9tcHRGb3JOZXdOYW1lKHRhZ05hbWUpO1xuICAgIGlmIChuZXdOYW1lID09PSBmYWxzZSkgcmV0dXJuOyAgLy8gYWJvcnRlZFxuXG4gICAgaWYgKCFuZXdOYW1lIHx8IG5ld05hbWUgPT09IHRhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RpY2UoXCJVbmNoYW5nZWQgb3IgZW1wdHkgdGFnOiBObyBjaGFuZ2VzIG1hZGUuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0XG4gICAgICAgIG9sZFRhZyAgPSBuZXcgVGFnKHRhZ05hbWUpLFxuICAgICAgICBuZXdUYWcgID0gbmV3IFRhZyhuZXdOYW1lKSxcbiAgICAgICAgcmVwbGFjZSA9IG5ldyBSZXBsYWNlbWVudChvbGRUYWcsIG5ld1RhZyksXG4gICAgICAgIGNsYXNoaW5nID0gcmVwbGFjZS53aWxsTWVyZ2VUYWdzKFxuICAgICAgICAgICAgYWxsVGFncyhhcHApLnJldmVyc2UoKSAgIC8vIGZpbmQgbG9uZ2VzdCBjbGFzaCBmaXJzdFxuICAgICAgICApLFxuICAgICAgICBzaG91bGRBYm9ydCA9IGNsYXNoaW5nICYmXG4gICAgICAgICAgICBhd2FpdCBzaG91bGRBYm9ydER1ZVRvQ2xhc2goY2xhc2hpbmcsIG9sZFRhZywgbmV3VGFnKVxuICAgICAgICA7XG5cbiAgICBpZiAoc2hvdWxkQWJvcnQpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCBmaW5kVGFyZ2V0cyhhcHAsIG9sZFRhZyk7XG4gICAgaWYgKCF0YXJnZXRzKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9ncmVzcyA9IG5ldyBQcm9ncmVzcyhgUmVuYW1pbmcgdG8gIyR7bmV3TmFtZX0vKmAsIFwiUHJvY2Vzc2luZyBmaWxlcy4uLlwiKTtcbiAgICBsZXQgcmVuYW1lZCA9IDA7XG4gICAgYXdhaXQgcHJvZ3Jlc3MuZm9yRWFjaCh0YXJnZXRzLCBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIHByb2dyZXNzLm1lc3NhZ2UgPSBcIlByb2Nlc3NpbmcgXCIgKyB0YXJnZXQuYmFzZW5hbWU7XG4gICAgICAgIGlmIChhd2FpdCB0YXJnZXQucmVuYW1lZChyZXBsYWNlKSkgcmVuYW1lZCsrO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBOb3RpY2UoYE9wZXJhdGlvbiAke3Byb2dyZXNzLmFib3J0ZWQgPyBcImNhbmNlbGxlZFwiIDogXCJjb21wbGV0ZVwifTogJHtyZW5hbWVkfSBmaWxlKHMpIHVwZGF0ZWRgKTtcbn1cblxuZnVuY3Rpb24gYWxsVGFncyhhcHApIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0VGFncygpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRUYXJnZXRzKGFwcCwgdGFnKSB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IFtdO1xuICAgIGNvbnN0IHByb2dyZXNzID0gbmV3IFByb2dyZXNzKGBTZWFyY2hpbmcgZm9yICR7dGFnfS8qYCwgXCJNYXRjaGluZyBmaWxlcy4uLlwiKTtcbiAgICBhd2FpdCBwcm9ncmVzcy5mb3JFYWNoKFxuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZWRGaWxlcygpLFxuICAgICAgICBmaWxlbmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBmcm9udG1hdHRlciwgdGFncyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUoZmlsZW5hbWUpIHx8IHt9O1xuICAgICAgICAgICAgdGFncyA9ICh0YWdzIHx8IFtdKS5maWx0ZXIodCA9PiB0LnRhZyAmJiB0YWcubWF0Y2hlcyh0LnRhZykpLnJldmVyc2UoKTsgLy8gbGFzdCBwb3NpdGlvbnMgZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGZtdGFncyA9IChwYXJzZUZyb250TWF0dGVyVGFncyhmcm9udG1hdHRlcikgfHwgW10pLmZpbHRlcih0YWcubWF0Y2hlcyk7XG4gICAgICAgICAgICBjb25zdCBhbGlhc1RhZ3MgPSAocGFyc2VGcm9udE1hdHRlckFsaWFzZXMoZnJvbnRtYXR0ZXIpIHx8IFtdKS5maWx0ZXIoVGFnLmlzVGFnKS5maWx0ZXIodGFnLm1hdGNoZXMpO1xuICAgICAgICAgICAgaWYgKHRhZ3MubGVuZ3RoIHx8IGZtdGFncy5sZW5ndGggfHwgYWxpYXNUYWdzLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0YXJnZXRzLnB1c2gobmV3IEZpbGUoYXBwLCBmaWxlbmFtZSwgdGFncywgZm10YWdzLmxlbmd0aCArIGFsaWFzVGFncy5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICk7XG4gICAgaWYgKCFwcm9ncmVzcy5hYm9ydGVkKVxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0Rm9yTmV3TmFtZSh0YWdOYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHZhbGlkYXRlZElucHV0KFxuICAgICAgICAgICAgYFJlbmFtaW5nICMke3RhZ05hbWV9IChhbmQgYW55IHN1Yi10YWdzKWAsIFwiRW50ZXIgbmV3IG5hbWUgKG11c3QgYmUgYSB2YWxpZCBPYnNpZGlhbiB0YWcpOlxcblwiLFxuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIFwiW15cXHUyMDAwLVxcdTIwNkZcXHUyRTAwLVxcdTJFN0YnIVxcXCIjJCUmKCkqKywuOjs8PT4/QF5ge3x9flxcXFxbXFxcXF1cXFxcXFxcXFxcXFxzXStcIixcbiAgICAgICAgICAgIFwiT2JzaWRpYW4gdGFnIG5hbWVcIlxuICAgICAgICApO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyB1c2VyIGNhbmNlbGxlZFxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2hvdWxkQWJvcnREdWVUb0NsYXNoKFtvcmlnaW4sIGNsYXNoXSwgb2xkVGFnLCBuZXdUYWcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25maXJtKFxuICAgICAgICAgICAgXCJXQVJOSU5HOiBObyBVbmRvIVwiLFxuICAgICAgICAgICAgYFJlbmFtaW5nIDxjb2RlPiR7b2xkVGFnfTwvY29kZT4gdG8gPGNvZGU+JHtuZXdUYWd9PC9jb2RlPiB3aWxsIG1lcmdlICR7XG4gICAgICAgICAgICAgICAgKG9yaWdpbi5jYW5vbmljYWwgPT09IG9sZFRhZy5jYW5vbmljYWwpID9cbiAgICAgICAgICAgICAgICAgICAgYHRoZXNlIHRhZ3NgIDogYG11bHRpcGxlIHRhZ3NcbiAgICAgICAgICAgICAgICAgICAgaW50byBleGlzdGluZyB0YWdzIChzdWNoIGFzIDxjb2RlPiR7b3JpZ2lufTwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgbWVyZ2luZyB3aXRoIDxjb2RlPiR7Y2xhc2h9PC9jb2RlPilgXG4gICAgICAgICAgICB9LlxuXG4gICAgICAgICAgICBUaGlzIDxiPmNhbm5vdDwvYj4gYmUgdW5kb25lLiAgRG8geW91IHdpc2ggdG8gcHJvY2VlZD9gXG4gICAgICAgICk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBhcm91bmQob2JqLCBmYWN0b3JpZXMpIHtcbiAgICBjb25zdCByZW1vdmVycyA9IE9iamVjdC5rZXlzKGZhY3RvcmllcykubWFwKGtleSA9PiBhcm91bmQxKG9iaiwga2V5LCBmYWN0b3JpZXNba2V5XSkpO1xuICAgIHJldHVybiByZW1vdmVycy5sZW5ndGggPT09IDEgPyByZW1vdmVyc1swXSA6IGZ1bmN0aW9uICgpIHsgcmVtb3ZlcnMuZm9yRWFjaChyID0+IHIoKSk7IH07XG59XG5mdW5jdGlvbiBhcm91bmQxKG9iaiwgbWV0aG9kLCBjcmVhdGVXcmFwcGVyKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBvYmpbbWV0aG9kXSwgaGFkT3duID0gb2JqLmhhc093blByb3BlcnR5KG1ldGhvZCk7XG4gICAgbGV0IGN1cnJlbnQgPSBjcmVhdGVXcmFwcGVyKG9yaWdpbmFsKTtcbiAgICAvLyBMZXQgb3VyIHdyYXBwZXIgaW5oZXJpdCBzdGF0aWMgcHJvcHMgZnJvbSB0aGUgd3JhcHBpbmcgbWV0aG9kLFxuICAgIC8vIGFuZCB0aGUgd3JhcHBpbmcgbWV0aG9kLCBwcm9wcyBmcm9tIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICBpZiAob3JpZ2luYWwpXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjdXJyZW50LCBvcmlnaW5hbCk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGN1cnJlbnQpO1xuICAgIG9ialttZXRob2RdID0gd3JhcHBlcjtcbiAgICAvLyBSZXR1cm4gYSBjYWxsYmFjayB0byBhbGxvdyBzYWZlIHJlbW92YWxcbiAgICByZXR1cm4gcmVtb3ZlO1xuICAgIGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGJlZW4gZGVhY3RpdmF0ZWQgYW5kIGFyZSBubyBsb25nZXIgd3JhcHBlZCwgcmVtb3ZlIG91cnNlbHZlc1xuICAgICAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwgJiYgb2JqW21ldGhvZF0gPT09IHdyYXBwZXIpXG4gICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgcGF0Y2hlcywganVzdCBkbyBhIGRpcmVjdCByZW1vdmFsXG4gICAgICAgIGlmIChvYmpbbWV0aG9kXSA9PT0gd3JhcHBlcikge1xuICAgICAgICAgICAgaWYgKGhhZE93bilcbiAgICAgICAgICAgICAgICBvYmpbbWV0aG9kXSA9IG9yaWdpbmFsO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbbWV0aG9kXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIEVsc2UgcGFzcyBmdXR1cmUgY2FsbHMgdGhyb3VnaCwgYW5kIHJlbW92ZSB3cmFwcGVyIGZyb20gdGhlIHByb3RvdHlwZSBjaGFpblxuICAgICAgICBjdXJyZW50ID0gb3JpZ2luYWw7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBvcmlnaW5hbCB8fCBGdW5jdGlvbik7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZHVwZShrZXksIG9sZEZuLCBuZXdGbikge1xuICAgIGNoZWNrW2tleV0gPSBrZXk7XG4gICAgcmV0dXJuIGNoZWNrO1xuICAgIGZ1bmN0aW9uIGNoZWNrKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIChvbGRGbltrZXldID09PSBrZXkgPyBvbGRGbiA6IG5ld0ZuKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIocHJvbWlzZSwgY2IpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGNiLCBjYik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGFzeW5jRnVuY3Rpb24pIHtcbiAgICBsZXQgbGFzdFJ1biA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgYWZ0ZXIobGFzdFJ1biwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFzeW5jRnVuY3Rpb24uYXBwbHkodGhpcywgYXJncykudGhlbihyZXMsIHJlaik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdyYXBwZXIuYWZ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7IGFmdGVyKGxhc3RSdW4sIHJlcyk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHdyYXBwZXI7XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgS2V5bWFwLCBNZW51LCBOb3RpY2UsIHBhcnNlRnJvbnRNYXR0ZXJBbGlhc2VzLCBQbHVnaW4sIFNjb3BlfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7cmVuYW1lVGFnLCBmaW5kVGFyZ2V0c30gZnJvbSBcIi4vcmVuYW1pbmdcIjtcbmltcG9ydCB7VGFnfSBmcm9tIFwiLi9UYWdcIjtcbmltcG9ydCB7YXJvdW5kfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuXG5jb25zdCB0YWdIb3Zlck1haW4gPSBcInRhZy13cmFuZ2xlcjp0YWctcGFuZVwiO1xuXG5mdW5jdGlvbiBvbkVsZW1lbnQoZWwsIGV2ZW50LCBzZWxlY3RvciwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBlbC5vbihldmVudCwgc2VsZWN0b3IsIGNhbGxiYWNrLCBvcHRpb25zKVxuICAgIHJldHVybiAoKSA9PiBlbC5vZmYoZXZlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaywgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhZ1dyYW5nbGVyIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBwYWdlQWxpYXNlcyA9IG5ldyBNYXAoKTtcbiAgICB0YWdQYWdlcyA9IG5ldyBNYXAoKTtcblxuICAgIHRhZ1BhZ2UodGFnKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGFnUGFnZXMuZ2V0KFRhZy5jYW5vbmljYWwodGFnKSkgfHwgXCJcIilbMF1cbiAgICB9XG5cbiAgICBvcGVuVGFnUGFnZShmaWxlLCBpc05ldywgbmV3TGVhZikge1xuICAgICAgICBjb25zdCBvcGVuU3RhdGUgPSB7XG4gICAgICAgICAgICBlU3RhdGU6IGlzTmV3ID8ge3JlbmFtZTogXCJhbGxcIn0gOiB7Zm9jdXM6IHRydWV9LCAgLy8gUmVuYW1lIG5ldyBwYWdlLCBmb2N1cyBleGlzdGluZ1xuICAgICAgICAgICAgLi4uKGlzTmV3ID8ge3N0YXRlOiB7bW9kZTogXCJzb3VyY2VcIn19IDoge30pICAgICAgIC8vIGFuZCBzZXQgc291cmNlIG1vZGUgZm9yIG5ldyBwYWdlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKG5ld0xlYWYpLm9wZW5GaWxlKGZpbGUsIG9wZW5TdGF0ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlVGFnUGFnZSh0YWdOYW1lLCBuZXdMZWFmKSB7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gbmV3IFRhZyh0YWdOYW1lKS5uYW1lLnNwbGl0KFwiL1wiKS5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3QgZm9sZGVyID0gdGhpcy5hcHAuZmlsZU1hbmFnZXIuZ2V0TmV3RmlsZVBhcmVudCh0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpPy5wYXRoIHx8IFwiXCIpO1xuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChmb2xkZXIuZ2V0UGFyZW50UHJlZml4KCkrYmFzZU5hbWUsIFwibWRcIik7XG4gICAgICAgIHRoaXMub3BlblRhZ1BhZ2UoYXdhaXQgdGhpcy5hcHAudmF1bHQuY3JlYXRlKHBhdGgsIFtcbiAgICAgICAgICAgIFwiLS0tXCIsXG4gICAgICAgICAgICBgQWxpYXNlczogWyAke0pTT04uc3RyaW5naWZ5KFRhZy50b1RhZyh0YWdOYW1lKSl9IF1gLFxuICAgICAgICAgICAgXCItLS1cIixcbiAgICAgICAgICAgIFwiXCJcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpKSwgdHJ1ZSwgbmV3TGVhZik7XG4gICAgfVxuXG4gICAgYXN5bmMgb25sb2FkKCl7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoXG4gICAgICAgICAgICBvbkVsZW1lbnQoZG9jdW1lbnQsIFwiY29udGV4dG1lbnVcIiwgXCIudGFnLXBhbmUtdGFnXCIsIHRoaXMub25NZW51LmJpbmQodGhpcyksIHtjYXB0dXJlOiB0cnVlfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmVnaXN0ZXJIb3ZlckxpbmtTb3VyY2UodGFnSG92ZXJNYWluLCB7ZGlzcGxheTogJ1RhZyBwYW5lJywgZGVmYXVsdE1vZDogdHJ1ZX0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICAgICAgICAvLyBUYWdzIGluIHRoZSB0YWcgcGFuZVxuICAgICAgICAgICAgbmV3IFRhZ1BhZ2VVSUhhbmRsZXIodGhpcywge1xuICAgICAgICAgICAgICAgIGhvdmVyU291cmNlOiB0YWdIb3Zlck1haW4sIHNlbGVjdG9yOiBcIi50YWctcGFuZS10YWdcIiwgY29udGFpbmVyOiBcIi50YWctY29udGFpbmVyXCIsXG4gICAgICAgICAgICAgICAgdG9UYWcoZWwpIHsgcmV0dXJuIGVsLmZpbmQoXCIudGFnLXBhbmUtdGFnLXRleHRcIik/LnRleHRDb250ZW50OyB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICAgICAgICAvLyBSZWFkaW5nIG1vZGUgLyB0YWcgbGlua3NcbiAgICAgICAgICAgIG5ldyBUYWdQYWdlVUlIYW5kbGVyKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBob3ZlclNvdXJjZTogXCJwcmV2aWV3XCIsIHNlbGVjdG9yOiAnYS50YWdbaHJlZl49XCIjXCJdJyxcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IFwiLm1hcmtkb3duLXByZXZpZXctdmlldywgLm1hcmtkb3duLWVtYmVkLCAud29ya3NwYWNlLWxlYWYtY29udGVudFwiLFxuICAgICAgICAgICAgICAgIHRvVGFnKGVsKSB7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpOyB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICAgICAgICAvLyBFZGl0IG1vZGVcbiAgICAgICAgICAgIG5ldyBUYWdQYWdlVUlIYW5kbGVyKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBob3ZlclNvdXJjZTogXCJlZGl0b3JcIiwgc2VsZWN0b3I6IFwic3Bhbi5jbS1oYXNodGFnXCIsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcIi5tYXJrZG93bi1zb3VyY2Utdmlld1wiLFxuICAgICAgICAgICAgICAgIHRvVGFnKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNtLWhhc2h0YWcgZWxlbWVudHMgY2FuIGJlIHNpZGUgYnkgc2lkZTogam9pbiB0aGVtIGFsbCB0b2dldGhlcjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSBlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdD1lbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyB0Py5tYXRjaGVzKFwic3Bhbi5jbS1oYXNodGFnXCIpOyB0ID0gdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdOYW1lID0gdC50ZXh0Q29udGVudCArIHRhZ05hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdD1lbC5uZXh0RWxlbWVudFNpYmxpbmc7IHQ/Lm1hdGNoZXMoXCJzcGFuLmNtLWhhc2h0YWdcIik7IHQgPSB0Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSArPSB0LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWdOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVHJhY2sgVGFnIFBhZ2VzXG4gICAgICAgIGNvbnN0IG1ldGFDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGU7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5yZWdpc3Rlcihhcm91bmQobWV0YUNhY2hlLCB7XG4gICAgICAgICAgICBnZXRUYWdzKG9sZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBnZXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gb2xkLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gbmV3IFNldChPYmplY3Qua2V5cyh0YWdzKS5tYXAodCA9PiB0LnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBsdWdpbi50YWdQYWdlcy5rZXlzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZXMuaGFzKHQpKSB0YWdzW3BsdWdpbi50YWdQYWdlcy5nZXQodCkudGFnXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZ3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgbWV0YUNhY2hlLmdldENhY2hlZEZpbGVzKCkuZm9yRWFjaChmaWxlbmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm0gPSBtZXRhQ2FjaGUuZ2V0Q2FjaGUoZmlsZW5hbWUpPy5mcm9udG1hdHRlcjtcbiAgICAgICAgICAgICAgICBpZiAoZm0gJiYgcGFyc2VGcm9udE1hdHRlckFsaWFzZXMoZm0pPy5maWx0ZXIoVGFnLmlzVGFnKSkgdGhpcy51cGRhdGVQYWdlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZW5hbWUpLCBmbVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChtZXRhQ2FjaGUub24oXCJjaGFuZ2VkXCIsIChmaWxlLCBkYXRhLCBjYWNoZSkgPT4gdGhpcy51cGRhdGVQYWdlKGZpbGUsIGNhY2hlPy5mcm9udG1hdHRlcikpKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbihcImRlbGV0ZVwiLCBmaWxlID0+IHRoaXMudXBkYXRlUGFnZShmaWxlKSkpO1xuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJ0YWdcIikuZm9yRWFjaChsZWFmID0+IHtsZWFmPy52aWV3Py5yZXF1ZXN0VXBkYXRlVGFncz8uKCl9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFnZShmaWxlLCBmcm9udG1hdHRlcikge1xuICAgICAgICBjb25zdCB0YWdzID0gcGFyc2VGcm9udE1hdHRlckFsaWFzZXMoZnJvbnRtYXR0ZXIpPy5maWx0ZXIoVGFnLmlzVGFnKSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMucGFnZUFsaWFzZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRUYWdzID0gbmV3IFNldCh0YWdzIHx8IFtdKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRoaXMucGFnZUFsaWFzZXMuZ2V0KGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFRhZ3MuaGFzKHRhZykpIGNvbnRpbnVlOyAgLy8gZG9uJ3QgYm90aGVyIGRlbGV0aW5nIHdoYXQgd2UnbGwganVzdCBwdXQgYmFja1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IFRhZy5jYW5vbmljYWwodGFnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0cCA9IHRoaXMudGFnUGFnZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHRwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRwLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0cC5zaXplKSB0aGlzLnRhZ1BhZ2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGFncy5sZW5ndGgpIHRoaXMucGFnZUFsaWFzZXMuZGVsZXRlKGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wYWdlQWxpYXNlcy5zZXQoZmlsZSwgdGFncyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gVGFnLmNhbm9uaWNhbCh0YWcpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ1BhZ2VzLmhhcyhrZXkpKSB0aGlzLnRhZ1BhZ2VzLmdldChrZXkpLmFkZChmaWxlKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnU2V0ID0gbmV3IFNldChbZmlsZV0pO1xuICAgICAgICAgICAgICAgICAgICB0YWdTZXQudGFnID0gVGFnLnRvVGFnKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnUGFnZXMuc2V0KGtleSwgdGFnU2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lbnUoZSwgdGFnRWwpIHtcbiAgICAgICAgaWYgKCFlLm9ic2lkaWFuX2NvbnRleHRtZW51KSB7XG4gICAgICAgICAgICBlLm9ic2lkaWFuX2NvbnRleHRtZW51ID0gbmV3IE1lbnUodGhpcy5hcHApO1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IG1lbnUuc2hvd0F0UG9zaXRpb24oe3g6IGUucGFnZVgsIHk6IGUucGFnZVl9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdFxuICAgICAgICAgICAgdGFnTmFtZSA9IHRhZ0VsLmZpbmQoXCIudGFnLXBhbmUtdGFnLXRleHRcIikudGV4dENvbnRlbnQsXG4gICAgICAgICAgICB0YWdQYWdlID0gdGhpcy50YWdQYWdlKHRhZ05hbWUpLFxuICAgICAgICAgICAgaXNIaWVyYXJjaHkgPSB0YWdFbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmluZChcIi5jb2xsYXBzZS1pY29uXCIpLFxuICAgICAgICAgICAgc2VhcmNoUGx1Z2luID0gdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldFBsdWdpbkJ5SWQoXCJnbG9iYWwtc2VhcmNoXCIpLFxuICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoUGx1Z2luICYmIHNlYXJjaFBsdWdpbi5pbnN0YW5jZSxcbiAgICAgICAgICAgIHF1ZXJ5ID0gc2VhcmNoICYmIHNlYXJjaC5nZXRHbG9iYWxTZWFyY2hRdWVyeSgpLFxuICAgICAgICAgICAgcmFuZG9tID0gdGhpcy5hcHAucGx1Z2lucy5wbHVnaW5zW1wic21hcnQtcmFuZG9tLW5vdGVcIl0sXG4gICAgICAgICAgICBtZW51ID0gZS5vYnNpZGlhbl9jb250ZXh0bWVudS5hZGRJdGVtKGl0ZW0oXCJwZW5jaWxcIiwgXCJSZW5hbWUgI1wiK3RhZ05hbWUsICgpID0+IHRoaXMucmVuYW1lKHRhZ05hbWUpKSk7XG5cbiAgICAgICAgbWVudS5yZWdpc3RlcihcbiAgICAgICAgICAgIG9uRWxlbWVudChkb2N1bWVudCwgXCJrZXlkb3duXCIsIFwiKlwiLCBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXk9PT1cIkVzY2FwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgbWVudS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge2NhcHR1cmU6IHRydWV9KVxuICAgICAgICApO1xuXG4gICAgICAgIG1lbnUuYWRkU2VwYXJhdG9yKCk7XG4gICAgICAgIGlmICh0YWdQYWdlKSB7XG4gICAgICAgICAgICBtZW51LmFkZEl0ZW0oXG4gICAgICAgICAgICAgICAgaXRlbShcInBvcHVwLW9wZW5cIiwgXCJPcGVuIHRhZyBwYWdlXCIsIChlKSA9PiB0aGlzLm9wZW5UYWdQYWdlKHRhZ1BhZ2UsIGZhbHNlLCBLZXltYXAuaXNNb2RFdmVudChlKSkpXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZW51LmFkZEl0ZW0oXG4gICAgICAgICAgICAgICAgaXRlbShcImNyZWF0ZS1uZXdcIiwgXCJDcmVhdGUgdGFnIHBhZ2VcIiwgKGUpID0+IHRoaXMuY3JlYXRlVGFnUGFnZSh0YWdOYW1lLCBLZXltYXAuaXNNb2RFdmVudChlKSkpXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgICBtZW51LmFkZFNlcGFyYXRvcigpLmFkZEl0ZW0oXG4gICAgICAgICAgICAgICAgaXRlbShcIm1hZ25pZnlpbmctZ2xhc3NcIiwgXCJOZXcgc2VhcmNoIGZvciAjXCIrdGFnTmFtZSwgKCkgPT4gc2VhcmNoLm9wZW5HbG9iYWxTZWFyY2goXCJ0YWc6XCIgKyB0YWdOYW1lKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgICAgICAgICBtZW51LmFkZEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0oXCJzaGVldHMtaW4tYm94XCIsIFwiUmVxdWlyZSAjXCIrdGFnTmFtZStcIiBpbiBzZWFyY2hcIiAgLCAoKSA9PiBzZWFyY2gub3Blbkdsb2JhbFNlYXJjaChxdWVyeStcIiB0YWc6XCIgICsgdGFnTmFtZSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lbnUuYWRkSXRlbShcbiAgICAgICAgICAgICAgICBpdGVtKFwiY3Jvc3NlZC1zdGFyXCIgLCBcIkV4Y2x1ZGUgI1wiK3RhZ05hbWUrXCIgZnJvbSBzZWFyY2hcIiwgKCkgPT4gc2VhcmNoLm9wZW5HbG9iYWxTZWFyY2gocXVlcnkrXCIgLXRhZzpcIiArIHRhZ05hbWUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5kb20pIHtcbiAgICAgICAgICAgIG1lbnUuYWRkU2VwYXJhdG9yKCkuYWRkSXRlbShcbiAgICAgICAgICAgICAgICBpdGVtKFwiZGljZVwiLCBcIk9wZW4gcmFuZG9tIG5vdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgZmluZFRhcmdldHModGhpcy5hcHAsIG5ldyBUYWcodGFnTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICByYW5kb20ub3BlblJhbmRvbU5vdGUodGFyZ2V0cy5tYXAoZj0+IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmLmZpbGVuYW1lKSkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnRyaWdnZXIoXCJ0YWctd3JhbmdsZXI6Y29udGV4dG1lbnVcIiwgbWVudSwgdGFnTmFtZSwge3NlYXJjaCwgcXVlcnksIGlzSGllcmFyY2h5LCB0YWdQYWdlfSk7XG5cbiAgICAgICAgaWYgKGlzSGllcmFyY2h5KSB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIHRhZ1BhcmVudCA9IHRhZ05hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKSxcbiAgICAgICAgICAgICAgICB0YWdWaWV3ID0gdGhpcy5sZWFmVmlldyh0YWdFbC5tYXRjaFBhcmVudChcIi53b3Jrc3BhY2UtbGVhZlwiKSksXG4gICAgICAgICAgICAgICAgdGFnQ29udGFpbmVyID0gdGFnUGFyZW50ID8gdGFnVmlldy50YWdEb21zW1wiI1wiICsgdGFnUGFyZW50LnRvTG93ZXJDYXNlKCldOiB0YWdWaWV3LnJvb3RcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHRvZ2dsZShjb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCB0YWcgb2YgdGFnQ29udGFpbmVyLmNoaWxkcmVuKSB0YWcuc2V0Q29sbGFwc2VkKGNvbGxhcHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lbnUuYWRkU2VwYXJhdG9yKClcbiAgICAgICAgICAgIC5hZGRJdGVtKGl0ZW0oXCJ2ZXJ0aWNhbC10aHJlZS1kb3RzXCIsIFwiQ29sbGFwc2UgdGFncyBhdCB0aGlzIGxldmVsXCIsICgpID0+IHRvZ2dsZSh0cnVlICkpKVxuICAgICAgICAgICAgLmFkZEl0ZW0oaXRlbShcImV4cGFuZC12ZXJ0aWNhbGx5XCIgICwgXCJFeHBhbmQgdGFncyBhdCB0aGlzIGxldmVsXCIgICwgKCkgPT4gdG9nZ2xlKGZhbHNlKSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZWFmVmlldyhjb250YWluZXJFbCkge1xuICAgICAgICBsZXQgdmlldztcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgIGlmIChsZWFmLmNvbnRhaW5lckVsID09PSBjb250YWluZXJFbCkgeyB2aWV3ID0gbGVhZi52aWV3OyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cblxuICAgIGFzeW5jIHJlbmFtZSh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlO1xuICAgICAgICB0aGlzLmFwcC5rZXltYXAucHVzaFNjb3BlKHNjb3BlKTtcbiAgICAgICAgdHJ5IHsgYXdhaXQgcmVuYW1lVGFnKHRoaXMuYXBwLCB0YWdOYW1lKTsgfVxuICAgICAgICBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKGUpOyBuZXcgTm90aWNlKFwiZXJyb3I6IFwiICsgZSk7IH1cbiAgICAgICAgdGhpcy5hcHAua2V5bWFwLnBvcFNjb3BlKHNjb3BlKTtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gaXRlbShpY29uLCB0aXRsZSwgY2xpY2spIHtcbiAgICByZXR1cm4gaSA9PiBpLnNldEljb24oaWNvbikuc2V0VGl0bGUodGl0bGUpLm9uQ2xpY2soY2xpY2spO1xufVxuXG5cbmNsYXNzIFRhZ1BhZ2VVSUhhbmRsZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIC8vIEhhbmRsZSBob3ZlcmluZyBhbmQgY2xpY2tzLXRvLW9wZW4gZm9yIHRhZyBwYWdlc1xuXG4gICAgY29uc3RydWN0b3IocGx1Z2luLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHNcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgb25sb2FkKCkge1xuICAgICAgICBjb25zdCB7c2VsZWN0b3IsIGNvbnRhaW5lciwgaG92ZXJTb3VyY2UsIHRvVGFnfSA9IHRoaXMub3B0cztcbiAgICAgICAgdGhpcy5yZWdpc3RlcihcbiAgICAgICAgICAgIC8vIFNob3cgdGFnIHBhZ2Ugb24gaG92ZXJcbiAgICAgICAgICAgIG9uRWxlbWVudChkb2N1bWVudCwgXCJtb3VzZW92ZXJcIiwgc2VsZWN0b3IsIChldmVudCwgdGFyZ2V0RWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdG9UYWcodGFyZ2V0RWwpLCB0cCA9IHRhZ05hbWUgJiYgdGhpcy5wbHVnaW4udGFnUGFnZSh0YWdOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodHApIHRoaXMucGx1Z2luLmFwcC53b3Jrc3BhY2UudHJpZ2dlcignaG92ZXItbGluaycsIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsIHNvdXJjZTogaG92ZXJTb3VyY2UsIHRhcmdldEVsLCBsaW5rdGV4dDogdHAucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaG92ZXJQYXJlbnQ6IHRhcmdldEVsLm1hdGNoUGFyZW50KGNvbnRhaW5lcilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIHtjYXB0dXJlOiBmYWxzZX0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoXG4gICAgICAgICAgICAvLyBPcGVuIHRhZyBwYWdlIHcvYWx0IGNsaWNrIChjdXJyZW50IHBhbmUpIG9yIGN0cmwvY21kL21pZGRsZSBjbGljayAobmV3IHBhbmUpXG4gICAgICAgICAgICBvbkVsZW1lbnQoZG9jdW1lbnQsIFwiY2xpY2tcIiwgc2VsZWN0b3IsIChldmVudCwgdGFyZ2V0RWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7YWx0S2V5fSA9IGV2ZW50O1xuICAgICAgICAgICAgICAgIGlmICghS2V5bWFwLmlzTW9kRXZlbnQoZXZlbnQpICYmICFhbHRLZXkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdG9UYWcodGFyZ2V0RWwpLCB0cCA9IHRhZ05hbWUgJiYgdGhpcy5wbHVnaW4udGFnUGFnZSh0YWdOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodHApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ub3BlblRhZ1BhZ2UodHAsIGZhbHNlLCAhYWx0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7Y2FwdHVyZTogdHJ1ZX0pXG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbInF1ZXJ5IiwiY3VycmlmeSIsInNldCIsInN0b3JlIiwiTm90aWNlIiwiU0NBTEFSIiwic3RyaW5naWZ5IiwiZmxvYXROYU4iLCJmbG9hdEV4cCIsImZsb2F0IiwiaW50SWRlbnRpZnkiLCJpbnRSZXNvbHZlIiwiaW50U3RyaW5naWZ5IiwiaW50T2N0IiwiaW50IiwiaW50SGV4Iiwic2NoZW1hIiwic2NoZW1hJDIiLCJDU1Quc2V0U2NhbGFyVmFsdWUiLCJDU1Quc3RyaW5naWZ5IiwicGFyc2VGcm9udE1hdHRlclRhZ3MiLCJwYXJzZUZyb250TWF0dGVyQWxpYXNlcyIsIlBsdWdpbiIsIk1lbnUiLCJLZXltYXAiLCJTY29wZSIsIkNvbXBvbmVudCJdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0FBQ2xCO0FBQ0EsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMzQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5QyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDakQsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwRCxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxLQUFLO0FBQ2pDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FB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QUM7QUFDcEMsSUFBSSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6QyxJQUFJLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqRCxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7QUFDdkMsUUFBUSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHFCQUFxQjtBQUNqRCxZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUMzRCxRQUFRLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQVEsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDNUIsS0FBSztBQUNMLFNBQVM7QUFDVCxRQUFRLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDakMsUUFBUSxNQUFNLE1BQU0sR0FBRyxRQUFRLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsUUFBUSxNQUFNLEtBQUssR0FBRztBQUN0QixZQUFZLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUN6RSxTQUFTLENBQUM7QUFDVixRQUFRLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUM5RSxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUks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 diff --git a/notes/.obsidian/plugins/tag-wrangler/manifest.json b/notes/.obsidian/plugins/tag-wrangler/manifest.json new file mode 100644 index 0000000..be09575 --- /dev/null +++ b/notes/.obsidian/plugins/tag-wrangler/manifest.json @@ -0,0 +1,8 @@ +{ + "id": "tag-wrangler", + "name": "Tag Wrangler", + "version": "0.5.3", + "minAppVersion": "0.13.19", + "description": "Rename, merge, toggle, and search tags from the tag pane", + "isDesktopOnly": true +} diff --git a/notes/.obsidian/plugins/tag-wrangler/styles.css b/notes/.obsidian/plugins/tag-wrangler/styles.css new file mode 100644 index 0000000..76584da --- /dev/null +++ b/notes/.obsidian/plugins/tag-wrangler/styles.css @@ -0,0 +1,168 @@ +.smalltalk { + display: flex; + + align-items: center; + flex-direction: column; + justify-content: center; + + transition: 200ms opacity; + + bottom: 0; + left: 0; + overflow: auto; + padding: 20px; + position: fixed; + right: 0; + top: 0; + + z-index: 100; +} + +.smalltalk + .smalltalk { + transition: ease 1s; +} + +.smalltalk .page { + border-radius: 3px; + background: white; + box-shadow: 0 4px 23px 5px rgba(0, 0, 0, .2), 0 2px 6px rgba(0, 0, 0, .15); + color: #333; + min-width: 400px; + padding: 0; + position: relative; + z-index: 0; +} + +@media only screen and (max-width: 500px) { + .smalltalk .page { + min-width: 0; + } +} + +.smalltalk .page > .close-button { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAUklEQVR4XqXPYQrAIAhAYW/gXd8NJxTopVqsGEhtf+L9/ERU2k/HSMFQpKcYJeNFI9Be0LCMij8cYyjj5EHIivGBkwLfrbX3IF8PqumVmnDpEG+eDsKibPG2JwAAAABJRU5ErkJggg==); + background-position: center; + background-repeat: no-repeat; + height: 14px; + position: absolute; + right: 7px; + top: 7px; + width: 14px; + z-index: 1; +} + +.smalltalk .page > .close-button:hover { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAnUlEQVR4XoWQQQ6CQAxFewjkJkMCyXgJPMk7AiYczyBeZEAX6AKctGIaN+bt+trk9wtGQc/IkhnoKGxqqiWxOSZalapWFZ6VrIUDExsN0a5JRBq9LoVOR0eEQMoEhKizXhhsn0p1sCWVo7CwOf1RytPL8CPvwuBUoHL6ugeK30CVD1TqK7V/hdpe+VNChhOzV8xWny/+xosHF8578W/Hmc1OOC3wmwAAAABJRU5ErkJggg==); +} + +.smalltalk .progress { + display: block; + width: 100%; +} + +.smalltalk .page header { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 500px; + + user-select: none; + color: #333; + font-size: 120%; + font-weight: bold; + margin: 0; + padding: 14px 17px; + text-shadow: white 0 1px 2px; +} + +.smalltalk .page .content-area { + overflow: hidden; + text-overflow: ellipsis; + + padding: 6px 17px; + position: relative; +} + +.smalltalk .page .action-area { + padding: 14px 17px; +} + +.smalltalk button, .smalltalk .smalltalk { + min-height: 2em; + min-width: 4em; +} + +.smalltalk button { + appearance: none; + user-select: none; + background-image: linear-gradient(#ededed, #ededed 38%, #dedede); + + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 2px; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75); + color: #444; + font: inherit; + margin: 0 1px 0 0; + text-shadow: 0 1px 0 rgb(240, 240, 240); +} + +.smalltalk button::-moz-focus-inner { + border: 0; +} + +.smalltalk button:enabled:active { + background-image: linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7); + box-shadow: none; + text-shadow: none; +} + +.smalltalk .page .button-strip { + display: flex; + + flex-direction: row; + justify-content: flex-end; +} + +.smalltalk .page .button-strip > button { + margin-left: 10px; +} + +.smalltalk input { + width: 100%; + border: 1px solid #bfbfbf; + border-radius: 2px; + box-sizing: border-box; + color: #444; + font: inherit; + margin: 0; + min-height: 2em; + padding: 3px; + outline: none; +} + +.smalltalk button:enabled:focus, .smalltalk input:enabled:focus { + transition: border-color 200ms; + border-color: rgb(77, 144, 254); + outline: none; +} + + +.smalltalk input[pattern]:invalid, .smalltalk input[pattern]:invalid:enabled:focus, .smalltalk input[pattern][aria-invalid='true'], .smalltalk input[pattern][aria-invalid='true']:enabled:focus { + border-color: var(--text-error); + background-color: var(--background-modifier-error); } + +.smalltalk .page, .smalltalk .page header, .smalltalk input, .smalltalk button { + color: var(--text-normal); + text-shadow: none; } + +.smalltalk .page { + background: var(--background-primary); } + +.smalltalk button[data-name="js-ok"] { + background: var(--background-modifier-error); } + +.smalltalk button[data-name="js-cancel"] { + background: var(--background-secondary-alt); } + +.smalltalk button { + box-shadow: none; }